본문 바로가기
C.W.K.
Stream
Lesson 03 of 06 · published

Cosine, Euclidean, Dot Product

~22 min · math, metrics

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

벡터 사이의 가까움을 재는 세 가지 방법

텍스트를 벡터로 바꾸면 "뜻이 얼마나 비슷하지?"라는 질문은 "두 점의 거리를 어떻게 잴까?"로 바뀌어. 실전에서 주로 쓰는 답은 세 가지야. 모델과 저장소의 성질을 모르고 고르면 검색 품질이 조용히 떨어질 수 있어.

Cosine similarity: 텍스트의 기본 선택

두 벡터가 이루는 각도를 재. 같은 방향은 1, 반대 방향은 -1, 직각은 0이야. 벡터의 크기는 무시하므로 문서 길이가 유사도에 영향을 주면 안 될 때 잘 맞아.

Euclidean distance (L2)

고차원 공간에서 두 점 사이의 직선 거리를 재. 값이 작을수록 가까워. 단어 빈도로 가중한 벡터나 정규화하지 않은 이미지 임베딩처럼 벡터 크기 자체에도 뜻이 있을 때 유용해.

Dot product: 내적

방향과 크기를 한 숫자에 함께 담아. 단위 벡터에서는 cosine과 같고 별도의 정규화 계산이 없어 GPU에서 빠르기도 해. 추천 시스템에서는 벡터 크기에 인기도나 중요도를 일부러 담아 dot product를 쓰기도 하지.

대부분의 텍스트 임베딩은 이미 단위 벡터야

OpenAI, Voyage, Cohere, BGE와 대부분의 sentence-transformers 모델은 L2 정규화된 벡터를 내놔. 이 경우 cosine과 dot product가 같고, Euclidean 거리는 cosine에 따라 한 방향으로 변하므로 셋이 같은 검색 순위를 만들어. 벡터 저장소가 가장 효율적으로 처리하는 척도를 고르면 돼. 다만 넘겨짚지 말고 모델 카드를 먼저 확인해.

Code

NumPy 로 세 메트릭·python
import numpy as np

def cosine(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

def euclidean(a, b):
    return np.linalg.norm(a - b)

def dot(a, b):
    return np.dot(a, b)

a = np.array([1.0, 0.0, 0.0])
b = np.array([0.9, 0.4, 0.0])
print('cosine    ', cosine(a, b))     # ~0.913
print('euclidean ', euclidean(a, b))  # 0.412
print('dot       ', dot(a, b))        # 0.9
본인 모델이 단위 벡터 내는지 확인·python
norms = np.linalg.norm(vecs, axis=1)
assert np.allclose(norms, 1.0, atol=1e-3), '임베딩이 L2 정규화 안 돼있음'

External links

Exercise

문장 쌍 5개를 골라. 서로 관련된 쌍 3개와 무관한 쌍 2개면 돼. 원본 벡터와 L2 정규화 벡터 각각에서 cosine, Euclidean, dot product를 계산하고, 단위 벡터일 때 세 척도의 순위가 같은지 표로 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.