본문 바로가기
Python/Deep Learning

딥러닝 유사도 측정

by 좌우지간에 2025. 2. 17.

딥러닝 유사도 측정: 코사인 유사도 vs. 유클리드 거리

딥러닝 모델을 통해 데이터를 벡터 형태로 표현하고, 이를 효율적으로 관리하는 벡터 데이터베이스(Vector DB)는 현대 AI 시스템의 핵심 요소로 자리 잡았습니다. 특히, 벡터 DB의 핵심 기능인 유사도 검색(Similarity Search) 은 추천 시스템, 정보 검색, 이상 탐지 등 다양한 분야에서 활용되고 있습니다. 유사도 검색의 성능은 어떤 유사도 측정 방식을 사용하느냐에 따라 크게 달라지므로, 데이터의 특성과 문제의 목적에 맞는 적절한 방식을 선택하는 것이 중요합니다.

 

이번 글에서는 대표적인 유사도 측정 방식인 코사인 유사도유클리드 거리를 집중적으로 분석하고, 각 방식이 딥러닝에서 어떻게 활용되는지, 그리고 어떤 상황에서 유리한지 실제 활용 사례와 함께 자세히 살펴보겠습니다.

 

 

 

1. 코사인 유사도(Cosine Similarity): 방향을 읽어내는 섬세한 눈

  • 정의: 코사인 유사도는 두 벡터 사이의 각도의 코사인 값을 측정하여 유사도를 판단합니다. 값은 -1부터 1 사이로 표현되며, 1에 가까울수록 두 벡터의 방향이 유사하고, -1에 가까울수록 방향이 반대임을 나타냅니다.
  • 계산:
    • A · B: 벡터 A와 B의 내적 (Dot Product)
    • ||A||, ||B||: 벡터 A와 B의 크기 (L2 Norm, Euclidean Norm)
  • Cosine Similarity(A, B) = (A · B) / (||A|| * ||B||)
  • 핵심 특징: 크기는 무시, 방향에 집중 코사인 유사도의 가장 큰 특징은 벡터의 크기를 고려하지 않고, 오직 방향에만 집중한다는 점입니다. 이는 데이터의 절대적인 값보다는 패턴의 유사성이 중요한 경우에 매우 유리하게 작용합니다.
  • 활용 분야 및 상세 분석:
    • 추천 시스템: 사용자 A와 사용자 B가 좋아하는 영화의 종류는 비슷하지만, 사용자 A는 100편을 보고 사용자 B는 10편만 봤다고 가정해봅시다. 유클리드 거리로는 두 사용자의 거리가 멀어질 수 있지만, 코사인 유사도는 선호하는 영화의 종류라는 패턴이 유사하므로 높은 유사도를 나타냅니다. 따라서 사용자의 선호도 패턴 분석이나 사용자 간 유사도 측정에 효과적입니다.
    • 문서 검색/분류: 문서의 길이가 다르더라도 단어 사용 패턴이 비슷한 문서들을 효과적으로 찾아낼 수 있습니다. 긴 문서와 짧은 문서의 벡터 크기가 다르더라도, 코사인 유사도는 문서의 내용(단어 분포)을 기반으로 주제를 분류하거나 유사한 문서를 검색하는 데 유용합니다.
    • 얼굴 인식: 조명 변화, 얼굴 각도 등에 따라 얼굴 이미지의 특징 벡터 크기가 달라지더라도, 코사인 유사도는 얼굴의 특징 패턴을 비교하여 얼굴을 식별하는 데 효과적입니다.

 

 

 

2. 유클리드 거리(Euclidean Distance): 꼼꼼하게 거리를 재는 자

  • 정의: 유클리드 거리는 두 벡터 사이의 직선 거리를 측정하는 방식으로, 작을수록 벡터가 유사하고 클수록 유사도가 낮습니다.
  • 계산:
    • Ai, Bi: 벡터 A와 B의 i번째 요소
    • n: 벡터의 차원
  • Euclidean Distance(A, B) = sqrt(Σ(Ai - Bi)²) (i = 1부터 n까지)
  • 핵심 특징: 크기와 방향 모두 고려 유클리드 거리는 벡터의 크기와 방향을 모두 고려합니다. 따라서 데이터의 절대적인 값이 중요한 경우에 적합합니다.
  • 활용 분야 및 상세 분석:
    • 이상 탐지: 센서 데이터에서 특정 센서의 값이 다른 센서에 비해 월등히 높다면, 이는 이상 징후를 나타낼 수 있습니다. 유클리드 거리는 이러한 값의 차이를 효과적으로 감지하여 비정상적인 데이터 포인트를 찾아내는 데 유용합니다.
    • 군집화: 데이터 포인트들을 그룹으로 묶을 때, 유클리드 거리를 사용하여 서로 가까운 데이터들을 같은 그룹으로 묶을 수 있습니다. 예를 들어, 비슷한 구매 패턴을 가진 사용자들을 그룹화하여 사용자 그룹 형성에 활용할 수 있습니다.
    • 이미지 품질 평가: 원본 이미지와 압축된 이미지 간의 유클리드 거리를 계산하여 이미지 손실 정도를 측정할 수 있습니다. 이미지의 세부적인 변화나 손실 정도를 파악하는 데 유용합니다.

 

 

 

3. 코사인 유사도 vs. 유클리드 거리: 선택은 결국 데이터에 달렸다

특징 코사인 유사도 유클리드 거리
측정 기준 벡터의 방향 벡터의 크기와 방향
크기 영향 크기에 둔감 (크기가 달라도 방향이 같으면 높은 유사도를 가짐) 크기에 민감 (크기가 다르면 거리가 멀어짐)
정규화 필요성 데이터 정규화(Normalization)가 필수는 아님 (방향만 비교하므로) 데이터 정규화가 필요할 수 있음 (크기에 영향을 받으므로)
활용 분야 추천 시스템 (선호도 패턴 분석), 문서 검색 (주제 분류), 얼굴 인식 (특징 패턴 비교) 이상 탐지 (비정상 데이터 감지), 군집화 (유사 사용자 그룹 형성), 이미지 품질 평가 (손실 정도 측정)
적합한 상황 데이터의 크기보다 패턴의 유사성이 중요한 경우, 데이터의 스케일 차이가 큰 경우 데이터의 절대적인 값이 의미 있는 경우, 데이터의 분포가 비교적 균일한 경우

 

 

 

4. 코드 예제 (Python)

import numpy as np
from numpy.linalg import norm

def cosine_similarity(a, b):
  """코사인 유사도 계산"""
  return np.dot(a, b) / (norm(a) * norm(b))

def euclidean_distance(a, b):
  """유클리드 거리 계산"""
  return np.sqrt(np.sum((a - b)**2))

# 예시 벡터
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([10, 20, 30]) # a와 방향은 같지만 크기가 다른 벡터

# 코사인 유사도 계산
cos_sim_ab = cosine_similarity(a, b)
cos_sim_ac = cosine_similarity(a, c)

# 유클리드 거리 계산
euc_dist_ab = euclidean_distance(a, b)
euc_dist_ac = euclidean_distance(a, c)

print("코사인 유사도 (a, b):", cos_sim_ab)  # 0.997
print("코사인 유사도 (a, c):", cos_sim_ac)  # 0.997 (방향이 같으므로 유사도가 높음)

print("유클리드 거리 (a, b):", euc_dist_ab)  # 5.196
print("유클리드 거리 (a, c):", euc_dist_ac)  # 43.589 (크기 차이 때문에 거리가 멀어짐)

 

 

 

결론

코사인 유사도와 유클리드 거리는 각각 데이터의 특성을 파악하고, 숨겨진 관계를 밝혀내는 강력한 도구입니다. 딥러닝 모델을 구축할 때, 데이터의 특성과 해결하려는 문제의 목적을 명확히 이해하고, 적절한 유사도 측정 방식을 선택해야 합니다. 때로는 두 가지 방식을 융합하여 사용하는 것이 더욱 효과적인 결과를 가져올 수도 있습니다. 데이터 중심적인 사고를 바탕으로 다양한 시도를 통해 최적의 유사도 측정 방식을 찾아내는 것이 성공적인 딥러닝 모델 개발의 핵심입니다.