1. 코사인 유사도(Cosine Similarity)란?
코사인 유사도는 두 벡터 간의 방향 유사도를 측정하는 지표로, 주로 텍스트 유사도 분석, 문장 임베딩 비교, 이미지 임베딩 비교 등에서 활용됩니다. 벡터의 크기보다는 방향성에 초점을 맞추는 것이 특징입니다.
공식:
cos_sim(A, B) = (A · B) / (||A|| * ||B||)
A와 B는 각각의 벡터이며, ·는 내적(dot product), ||A||는 A의 놈(norm, 길이)입니다. 값의 범위는 -1 ~ 1입니다. 1에 가까울수록 방향이 유사하고 반대로 -1에 가까울 수록 두 벡터의 방향이 서로 다름을 의미합니다.
2. 코사인 거리(Cosine Distance)란?
코사인 거리란 코사인 유사도를 거리 개념으로 변환한 것으로, 다음과 같이 정의됩니다:
cos_dist(A, B) = 1 - cos_sim(A, B)
값의 범위는 0 ~ 2이며, 0에 가까울수록 두 벡터가 유사하다는 것을 의미합니다.
3. 딥러닝/머신러닝에서의 활용 사례
- 자연어 처리(NLP): 문장 임베딩 간 유사도 비교 (예: 문장 검색, FAQ 매칭)
- 컴퓨터 비전: 이미지 임베딩 간 유사도 분석 (예: 이미지 검색, 클러스터링)
- 추천 시스템: 사용자-아이템 간 유사도 계산
- 클러스터링: 클러스터 간 거리 척도로 활용
4. 파이썬 순수 구현 (from scratch)
import math
def cosine_similarity(a, b):
dot_product = sum(x*y for x, y in zip(a, b))
norm_a = math.sqrt(sum(x*x for x in a))
norm_b = math.sqrt(sum(x*x for x in b))
return dot_product / (norm_a * norm_b)
def cosine_distance(a, b):
return 1 - cosine_similarity(a, b)
# 예시
vec1 = [1, 2, 3]
vec2 = [4, 5, 6]
sim = cosine_similarity(vec1, vec2)
dist = cosine_distance(vec1, vec2)
print(f"코사인 유사도: {sim:.4f}")
print(f"코사인 거리: {dist:.4f}")
출력결과:
코사인 유사도: 0.9746
코사인 거리: 0.0254
5. PyTorch 기반 구현 예제
import torch
import torch.nn.functional as F
def cosine_similarity_torch(x, y):
x = F.normalize(x, dim=-1)
y = F.normalize(y, dim=-1)
return torch.sum(x * y, dim=-1)
def cosine_distance_torch(x, y):
return 1 - cosine_similarity_torch(x, y)
# 예시
vec1 = torch.tensor([1.0, 2.0, 3.0])
vec2 = torch.tensor([4.0, 5.0, 6.0])
sim = cosine_similarity_torch(vec1, vec2)
dist = cosine_distance_torch(vec1, vec2)
print("PyTorch 코사인 유사도:", sim.item())
print("PyTorch 코사인 거리:", dist.item())
출력결과:
PyTorch 코사인 유사도: 0.9746317863464355
PyTorch 코사인 거리: 0.025368213653564453
6. 정리 및 요약 (Summary)
- 코사인 유사도는 벡터 간의 방향성 유사도를 나타내며, -1에서 1 사이 값을 가집니다.
- 코사인 거리는 1에서 코사인 유사도를 뺀 값으로, 거리 기반 모델에서 사용됩니다.
- PyTorch, Scikit-learn, NumPy 등에서 간단하게 구현 가능합니다.
- 텍스트 임베딩, 이미지 검색, 클러스터링, 추천 시스템 등 다양한 딥러닝/머신러닝 작업에 활용됩니다.
'Algorithm' 카테고리의 다른 글
DFS(깊이 우선 탐색) 알고리즘: 동작 원리와 Python 코드 구현 (0) | 2025.04.29 |
---|---|
BFS(너비 우선 탐색) 알고리즘: 동작 원리와 Python 코드 구현 (0) | 2025.04.29 |
A* 탐색 알고리즘 - Python 예제와 함께 자세한 설명 (1) | 2025.04.29 |
검색 알고리즘: 상세 설명과 Python 구현 (0) | 2025.04.28 |
SIMD와 MIMD 차이점 쉽게 설명 (0) | 2025.04.23 |