코사인 유사도(Cosine Similarity)

•
2026년 11월 01일 발행•2026년 11월 01일 수정
요약

두 벡터 사이 각도의 코사인 값으로 방향의 유사성을 측정하는 지표

초급
벡터의 내적과 노름 등 기초 선형대수 개념에 대한 이해가 필요하다.

#개념

코사인 유사도(Cosine Similarity)는 두 벡터가 이루는 각도의 코사인 값으로 두 벡터의 방향이 얼마나 비슷한지를 측정하는 지표이다. 벡터의 크기와 무관하게 방향만 비교하므로 문서, 임베딩, 사용자 취향처럼 고차원 벡터로 표현된 대상의 유사도를 계산하는 데 널리 쓰인다.
두 벡터 $\mathbf{a}, \mathbf{b} \in \mathbb{R}^n$의 코사인 유사도는 내적을 두 벡터의 노름 곱으로 나눈 값으로, $\cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} = \frac{\sum_{i=1}^{n} a_i b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \sqrt{\sum_{i=1}^{n} b_i^2}}$로 정의한다. 분모가 0이 되는 영벡터에서는 정의되지 않으므로 라이브러리마다 0을 반환하는 등 별도의 처리 규칙을 둔다.
기하학적으로 코사인 유사도는 두 벡터를 단위 구 위로 사영한 뒤 그 사이의 각도 $\theta$를 보는 것과 같다. 각 벡터를 자신의 노름으로 나누면 길이가 1인 단위 벡터가 되고, 두 단위 벡터의 내적이 곧 사잇각의 코사인이다. 따라서 한 벡터에 양의 상수를 곱해도 값이 변하지 않는 크기 불변성(Scale Invariance)을 가진다.
코사인 유사도는 -1에서 1 사이의 값을 가지며, 1에 가까울수록 두 벡터의 방향이 비슷하다. 같은 값이라도 벡터가 음수 성분을 가질 수 있는지에 따라 해석이 달라지므로 데이터의 표현 방식을 함께 고려해야 한다. 값의 구간과 벡터의 성질에 따라 다음과 같이 해석한다.
값의 범위와 해석
  • 1: 두 벡터의 방향이 완전히 같다. 크기가 달라도 한 벡터가 다른 벡터의 양의 상수배이면 1이 된다.
  • 0: 두 벡터가 직교한다. 단어 빈도 벡터에서는 두 문서에 공통 단어가 하나도 없는 경우에 해당한다.
  • -1: 두 벡터의 방향이 정반대이다. 음수 성분을 가질 수 있는 임베딩 같은 벡터에서만 나타난다.
  • 음수가 없는 벡터: TF-IDF나 단어 빈도처럼 모든 성분이 0 이상이면 값은 0에서 1 사이로 제한된다.
유사도를 거리처럼 쓰기 위해 코사인 거리(Cosine Distance) $1 - \cos(\theta)$를 정의하기도 한다. 코사인 거리는 0에서 2 사이의 값을 가지지만 삼각 부등식을 만족하지 않아 엄밀한 의미의 거리 함수(Metric)가 아니다. 거리 공리를 만족하는 척도가 필요하면 사잇각 자체를 정규화한 각 거리(Angular Distance) $\theta / \pi$를 사용한다.
정규화된 벡터에서는 코사인 유사도, 내적, 유클리드 거리가 서로 단조 관계로 연결된다. 두 단위 벡터 $\mathbf{a}, \mathbf{b}$에 대해 $\|\mathbf{a} - \mathbf{b}\|^2 = \|\mathbf{a}\|^2 + \|\mathbf{b}\|^2 - 2\,\mathbf{a} \cdot \mathbf{b} = 2 - 2\cos(\theta)$가 성립한다. 따라서 정규화된 벡터 집합에서는 유클리드 거리가 가장 가까운 이웃, 내적이 가장 큰 이웃, 코사인 유사도가 가장 큰 이웃이 모두 같다.
피어슨 상관 계수(Pearson Correlation Coefficient)는 각 벡터에서 성분 평균을 뺀 뒤 계산한 코사인 유사도와 같다. 즉 $r = \cos(\mathbf{a} - \bar{a}\mathbf{1}, \mathbf{b} - \bar{b}\mathbf{1})$이며, 평균 중심화로 전체 수준의 차이를 제거하고 변동 패턴만 비교한다. 협업 필터링에서 사용자마다 다른 평점 기준을 보정하려고 사용자 평균을 뺀 조정 코사인 유사도(Adjusted Cosine Similarity)를 쓰는 것도 같은 맥락이다.
코사인 유사도는 정보 검색에서 출발해 현재는 임베딩 기반 시스템 전반에서 기본 유사도 척도로 쓰인다. 계산이 단순하고 문서 길이나 벡터 크기의 영향을 받지 않는다는 성질 덕분에 텍스트, 이미지, 사용자 행동처럼 성격이 다른 데이터에서 공통으로 활용된다. 주요 활용 분야는 다음과 같다.
주요 활용 분야
  • 텍스트 검색: Salton 등(1975)의 벡터 공간 모델 이후 TF-IDF 벡터로 표현한 질의와 문서의 관련도를 계산하는 표준 척도로 쓰였다. 문서 길이가 달라도 단어 분포가 비슷하면 높은 점수를 준다.
  • 임베딩 검색: 문장·이미지 임베딩을 비교하는 의미 검색과 검색 증강 생성(Retrieval-Augmented Generation, RAG)의 문서 검색 단계에서 질의와 문서의 유사도로 사용한다.
  • 추천 시스템: 아이템 기반 협업 필터링에서 평점 벡터의 코사인 유사도로 아이템 간 유사도를 계산하고, 상품 임베딩 간 유사도로 연관 상품을 찾는다.
  • 표현 학습: CLIP 같은 대조 학습 모델은 정규화된 임베딩의 코사인 유사도에 온도 계수를 적용한 값을 로짓으로 사용해 학습한다.
고차원 공간에서 코사인 유사도는 특유의 성질을 보인다. 평균이 0이고 서로 독립인 성분을 가진 무작위 벡터 두 개의 코사인 유사도는 차원 $d$가 커질수록 0 근처로 모이며, 표준편차는 대략 $1/\sqrt{d}$ 수준으로 줄어든다. 즉 고차원에서 무작위 벡터끼리는 거의 직교하므로, 유사도 임곗값은 절대적인 기준을 두기보다 모델과 데이터마다 분포를 확인해 정해야 한다.
대규모 시스템에서는 코사인 유사도를 매번 노름으로 나누어 계산하지 않는다. 벡터를 저장할 때 L2 정규화를 한 번 수행해 두면 이후에는 내적만으로 코사인 유사도를 얻을 수 있고, 행렬 곱으로 여러 쌍을 한꺼번에 계산할 수 있어 GPU와 BLAS 연산의 이점을 그대로 활용한다. scikit-learn 문서도 L2 정규화된 TF-IDF 벡터에서는 코사인 유사도가 선형 커널과 같은 결과를 낸다고 설명한다.
수백만 개 이상의 벡터에서 가장 비슷한 항목을 찾을 때는 근사 최근접 이웃(Approximate Nearest Neighbor, ANN) 인덱스를 사용한다. Faiss는 내적 지표(METRIC_INNER_PRODUCT)로 인덱스를 만들고 벡터를 추가하기 전과 검색하기 전에 정규화하면 코사인 유사도 검색이 된다고 안내하며, 정규화된 벡터에서는 L2 지표를 써도 같은 결과를 얻는다. 벡터 데이터베이스(Vector Database)도 대부분 코사인, 내적, L2 지표를 선택할 수 있게 제공한다.
코사인 유사도는 단순하고 해석하기 쉽지만 모든 상황에서 의미 있는 유사도를 보장하지는 않는다. 특히 학습된 임베딩에 적용할 때는 임베딩 공간의 기하학적 성질과 모델의 학습 방식에 따라 같은 값이라도 의미가 크게 달라질 수 있다. 대표적인 한계는 다음과 같다.
코사인 유사도의 한계
  • 크기 정보 손실: 벡터의 크기를 무시하므로 크기에 담긴 정보가 사라진다. 예를 들어 임베딩의 노름이 인기도나 확신도를 반영하는 경우 코사인 유사도는 이를 구분하지 못한다.
  • 이방성 임베딩: 임베딩이 공간의 좁은 영역에 몰려 있으면 관련 없는 쌍의 유사도도 높게 나와 점수의 변별력이 떨어진다.
  • 학습 방식 의존성: 학습된 임베딩의 코사인 유사도는 학습 목적 함수와 정칙화 방식에 따라 임의적인 값이 될 수 있다.
  • 희소 벡터의 한계: 단어 빈도 벡터에서는 공통 단어가 없으면 의미가 비슷한 문서라도 유사도가 0이 된다.
Ethayarajh(2019)는 BERT, ELMo, GPT-2의 문맥 임베딩이 어느 층에서도 등방적이지 않다는 사실을 보였다. 이처럼 이방성(Anisotropy)이 강한 공간에서는 무작위 단어 쌍의 코사인 유사도도 높게 나타나므로, 유사도의 절댓값보다 상대적 순위를 보거나 공간을 보정해야 한다. Su 등(2021)은 문장 임베딩의 평균을 빼고 공분산을 단위 행렬로 만드는 화이트닝(Whitening)으로 등방성을 높이고, 차원 축소를 함께 적용해 검색 속도도 개선할 수 있음을 보였다.
Steck 등(2024)은 정칙화된 선형 모델로 학습한 임베딩에서 코사인 유사도가 정칙화 방식에 따라 임의적이거나 유일하지 않은 값이 될 수 있음을 해석적으로 보였다. 이는 임베딩 학습에 쓴 목적 함수와 서비스에서 쓰는 유사도 척도가 어긋나면 결과를 신뢰하기 어렵다는 점을 시사한다. 따라서 내적으로 학습한 모델은 내적으로, 코사인 기반 손실로 학습한 모델은 코사인으로 비교하는 것처럼 학습 지표와 사용 지표를 맞추는 것이 바람직하다.
실무에서는 벡터를 사전에 L2 정규화해 저장하고, 모델이 학습된 유사도 지표와 검색 인덱스의 지표를 일치시키며, 오프라인 평가로 유사도 임곗값을 검증하는 것이 기본 원칙이다. 코사인 유사도는 계산이 가볍고 크기 불변성이라는 직관적인 성질을 가져 텍스트 검색부터 추천과 의미 검색까지 가장 널리 쓰이는 유사도 척도로 자리 잡았다.

#관련 용어

내적
두 벡터의 대응 성분을 곱해 모두 더한 값
L2 정규화
벡터를 자신의 유클리드 노름으로 나누어 길이를 1로 만드는 연산
임베딩
단어·문장·아이템 같은 대상을 의미를 담은 연속 벡터로 표현한 것
피어슨 상관 계수
평균을 뺀 두 벡터의 코사인 유사도와 같은 선형 상관 척도
근사 최근접 이웃(ANN)
정확도를 일부 양보하고 대규모 벡터에서 가장 가까운 항목을 빠르게 찾는 검색 기법
이방성
임베딩 벡터가 공간의 특정 방향이나 좁은 영역에 몰려 분포하는 성질

#직무 연관도

DA
Data Analyst
보통
문서·상품 간 유사도를 계산해 군집과 연관 관계를 분석
DS
Data Scientist
밀접
임베딩 모델의 학습 목표와 유사도 척도를 설계하고 임베딩 공간의 성질을 분석
DE
Data Engineer
밀접
벡터 정규화와 ANN 인덱스 지표를 설정해 대규모 유사도 검색 시스템을 구현

#사용 사례

전자상거래인터넷 서비스미디어금융법률
개요
코사인 유사도는 문서 검색, 의미 기반 검색, 중복 탐지, 추천 시스템의 아이템 유사도 계산 등에 폭넓게 쓰인다. 전자상거래의 연관 상품 추천, 미디어의 콘텐츠 추천, 법률·금융 문서의 유사 문서 검색, 검색 증강 생성의 문서 검색 단계가 대표적인 활용 사례이다.
사례
전자상거래에서 상품 이미지·텍스트 임베딩을 L2 정규화해 ANN 인덱스에 저장하고, 사용자가 본 상품과 코사인 유사도가 높은 상품을 연관 상품으로 추천한다.

#참고 자료

#추천 포스트

© 2024 diki All rights reserved.