본문 바로가기
Algorithm

코사인 유사도와 코사인 거리 개념 및 딥러닝에서의 활용 | PyTorch 예제 포함

by markbyun 2025. 4. 30.

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 등에서 간단하게 구현 가능합니다.
  • 텍스트 임베딩, 이미지 검색, 클러스터링, 추천 시스템 등 다양한 딥러닝/머신러닝 작업에 활용됩니다.