💡 핵심 인사이트 코사인 유사도(Cosine Similarity)는 "두 벡터 간의 각도를 이용해 유사도를 측정하는 방법으로, 벡터의 방향(방향성)만을 비교하여 -1에서 1 사이의 값을 반환하는" 기법입니다. 벡터의 크기(Magnitude)나 길이에 영향을 받지 않고, "의미적 유사성"에만 집중합니다. 예를 들어 "'강아지'와 '개'"는 (긴 문장과 짧은 단어)처럼 벡터의 크기는 다르지만 (방향(의미))은 (매우 가깝습니다). 이러한 특성으로 **텍스트/문서 임베딩의 유사도 측정**에 가장 널리 사용됩니다.
Ⅰ. 코사인 유사도의 정의: 방향만을 비교하는測度
코사인 유사도는 두 벡터의 **내적(Dot Product)**을 각 벡터의 크기(Norm)로 나눈 값입니다.
[코사인 유사도 공식]
Cosine(A, B) = (A · B) / (||A|| × ||B||)
여기서:
- A · B = Σ(Aᵢ × Bᵢ) (내적)
- ||A|| = √(ΣAᵢ²) (L2 노름)
결과 범위:
- 1.0: 두 벡터가 동일한 방향 (완전 일치)
- 0.0: 두 벡터가 직교 (관련 없음)
- -1.0: 두 벡터가 반대 방향 (완전 다름)
직관적 이해:
[2차원 벡터로 이해하기]
벡터 A = [1, 0] (x축 방향)
벡터 B = [1, 0] (x축 방향, A와 동일)
벡터 C = [0, 1] (y축 방향, A와 수직)
벡터 D = [-1, 0] (x축 반대 방향)
cos(A, B) = 1.0 ← 같은 방향
cos(A, C) = 0.0 ← 90도 직교
cos(A, D) = -1.0 ← 반대 방향
Ⅱ. 텍스트 유사도에 코사인이 적합한 이유
텍스트 임베딩에서 코사인 유사도가 선호되는 이유를 살펴보겠습니다.
[문장 길이의 영향: 코사인 vs 유클리디안]
문장 A: "강아지가 짖는다" → 벡터 A = [0.8, 0.3, 0.5]
문장 B: "강아지가 짖는다 강아지가 짖는다" → 벡터 B = [1.6, 0.6, 1.0] (A의 2배)
문장 C: "고양이가 운다" → 벡터 C = [0.1, -0.7, 0.2]
유클리디안 거리(A, B) = √((0.8-1.6)² + (0.3-0.6)² + (0.5-1.0)²)
= √(0.64 + 0.09 + 0.25)
= 0.99 ← 멀다!
코사인 유사도(A, B) = (0.8×1.6 + 0.3×0.6 + 0.5×1.0) / (√(0.8²+0.3²+0.5²) × √(1.6²+0.6²+1.0²))
= (1.28 + 0.18 + 0.5) / (0.99 × 1.97)
= 1.96 / 1.95
= 1.0 ← 완전 일치!
핵심 포인트:
- 유클리디안: 문장 A와 B가 다르다고 판단 (길이가 다르므로)
- 코사인: 문장 A와 B가 동일하다고 판단 (방향이 같으므로)
코사인은 "중복된 문장이 있는가"가 아니라, "의미가 같은가"를 판단합니다.
Ⅲ. 코사인 유사도의 계산 예시
[실제 계산 예시]
벡터 A: [1, 2, 3]
벡터 B: [4, 5, 6]
Step 1: 내적 계산
A · B = (1×4) + (2×5) + (3×6) = 4 + 10 + 18 = 32
Step 2: 각 벡터의 L2 노름 계산
||A|| = √(1² + 2² + 3²) = √(1 + 4 + 9) = √14 ≈ 3.74
||B|| = √(4² + 5² + 6²) = √(16 + 25 + 36) = √77 ≈ 8.77
Step 3: 코사인 유사도 계산
Cosine(A, B) = 32 / (3.74 × 8.77) = 32 / 32.8 ≈ 0.975
→ 0.975로 매우 높은 유사도
Ⅳ. 코사인 유사도와 다른測度の比較
[유사도 측정 방식 비교]
┌────────────────┬──────────────┬──────────────────────────────┐
│ 측정 방식 │ 범위 │ 특성 │
├────────────────┼──────────────┼──────────────────────────────┤
│ 코사인 유사도 │ [-1, 1] │ 방향만 비교, 텍스트에最適 │
│ 유클리디안 거리 │ [0, ∞) │ 절대 거리, 이미지/형태 인식에 적합 │
│ 맨해튼 거리 │ [0, ∞) │ 절대 차이의 합, 고차원 텍스트용 │
│ 내적 (Dot Prod) │ [-∞, ∞) │ 벡터 크기 영향, 이미 정규화 필요 │
└────────────────┴──────────────┴──────────────────────────────┘
[각 방식의 적합한用例]
텍스트/문서 검색 → 코사인 유사도
- "의미적으로 비슷한 문서를 찾아라"
- 문장 길이에 영향받지 않음
이미지 인식 → 유클리디안 거리
- "픽셀 값의 절대적 차이가 적은 이미지를 찾아라"
- 형태의 절대적 거리가 중요
권장 시스템 → 내적 (정규화 후 코사인과 동일)
- 점수 기반 랭킹 (예: PageRank)
- 이미 정규화된 벡터에서 사용
Ⅴ. 코사인 유사도의 실제 적용과 📢 비유
문서 추천 시스템에서의 활용:
[문서 유사도 계산 파이프라인]
1. 문서 임베딩
doc1 = "인공지능은 미래 기술의 핵심이다"
doc2 = "머신러닝은 AI의 한 분야입니다"
doc3 = "오늘 날씨가非常好습니다"
embeddings = embed_model.encode([doc1, doc2, doc3])
# doc1: [0.12, -0.34, 0.56, ...]
# doc2: [0.15, -0.31, 0.52, ...] ← doc1과 방향이似
# doc3: [-0.78, 0.23, -0.45, ...] ← doc1과 방향이 다름
2. 코사인 유사도 계산
sim(doc1, doc2) = 0.94 ← 높은 유사도 (의미가似)
sim(doc1, doc3) = 0.12 ← 낮은 유사도 (관련 없음)
3. 추천 결과
사용자가 doc1을 읽으면 → doc2 추천
벡터 DB에서의 사용:
# Pinecone/Milvus에서 코사인 유사도 검색
index.query(
vector=query_embedding,
top_k=10,
metric="cosine" # 코사인 유사도 사용
)
# 반환: (id, score) 쌍, score가 1에 가까울수록 유사
📢 섹션 요약 비유: 코사인 유사도는 **"항상 같은 곳을 바라보는 두 사람의 시선 방향을 비교하는 것에 비유"**할 수 있습니다. (사람 A가) (북쪽을) (보고,사람 B가) (북쪽을) (보고) (있으면) (두 사람의) (시선 방향) (방향) (코사인) (= 1.0,완전 일치)입니다. (사람 A가) (북쪽을) (보고,사람 B가) (동쪽을) (보고) (있으면) (코사인) (= 0.0) (직교)이며, (한 사람이) (남쪽을) (보면) (-1.0) (반대)입니다. (두 사람이) (얼마나) (멀리) (있든,_ (아무리) (키가) (크고) (작든) (시선) (방향) (만) (비교하는) 것이므로 (키/거리) (크기) (에) (의해) (영향) (받지) (않습니다) (→) (문장) (길이) (에) (의해) (좌우) (되지) (않는) (코사인) (유사도) (특성) (과) (동일) (합니다) ())_。