수학 개념 지도
데이터와 학습(Data and learning)

코사인 유사도(Cosine similarity)

두 벡터⁠(vector)⁠ 사이 각의 코사인⁠(cosine)⁠. 길이는 무시하고 방향만 비교하므로, 문서·추천·임베딩⁠(embedding)⁠처럼 '얼마나 많이'보다 '무엇에 관한 것인가'가 중요한 곳에서 쓴다.

cos⁡θ=a⃗⋅b⃗∥a⃗∥ ∥b⃗∥,∥a^−b^∥2=2−2cos⁡θ\cos\theta = \frac{\vec a\cdot\vec b}{\lVert\vec a\rVert\,\lVert\vec b\rVert}, \qquad \lVert \hat a - \hat b \rVert^2 = 2 - 2\cos\theta
먼저 보면 좋은 개념내적사인과 코사인벡터

두 벡터가 얼마나 같은 쪽을 가리키는지는 사이각 θ가 알려 줍니다. 각을 직접 재기보다 그 코사인을 쓰는 까닭은 계산이 쉽기 때문입니다. 내적⁠(dot product)⁠을 두 길이로 나누기만 하면 됩니다. 노랑 a와 파랑 b의 끝을 끌어 보세요. 지금 θ = °, 코사인 유사도는 입니다.

흐린 원은 단위원⁠(unit circle)⁠이고, 작은 점은 두 벡터를 길이 1로 줄인 끝입니다. 청록 선분은 b를 a 방향에 정사영⁠(orthogonal projection)⁠한 그림자, 주황 점선은 단위원 위 두 점 사이의 현입니다.

같은 방향이면 1, 직각이면 0, 정반대면 −1입니다. 이제 b의 길이만 배로 바꿔 보세요. 내적 a⃗⋅b⃗=\vec a\cdot\vec b = 따라 변하지만 코사인은 그대로입니다. 내적은 a의 길이 에 b를 a 방향으로 정사영한 그림자의 길이를 곱한 것이라 길이와 방향이 섞여 있고, 코사인 유사도는 두 벡터를 먼저 길이 1로 줄여 단위원 위에 올린 다음 내적한 것입니다.

그래서 거리와도 이어집니다. 단위원 위 두 점을 잇는 현의 길이를 제곱하면 코사인 법칙⁠(law of cosines)⁠에 따라 2−2cos⁡θ2 - 2\cos\theta입니다(지금 ). 벡터를 미리 길이 1로 맞춰 두면 코사인 유사도가 큰 순서와 유클리드 거리⁠(Euclidean distance)⁠가 가까운 순서가 똑같아지고, 대규모 벡터 검색이 이 성질을 씁니다. 다만 흔히 '코사인 거리'라 부르는 1−cos⁡θ1-\cos\theta는 삼각부등식(곧장 가는 거리가 중간을 거쳐 가는 거리보다 길 수 없다는 규칙)을 어겨서 진짜 거리 함수⁠(metric)⁠가 아닙니다. 0°, 60°, 120° 방향의 세 벡터에서 양 끝은 1.5만큼 떨어졌는데 가운데를 거치면 0.5 + 0.5 = 1이면 됩니다. 각 θ 자체, 곧 구면 위 측지선⁠(geodesic)⁠의 길이는 진짜 거리입니다.

길이를 무시하는 것이 왜 좋을까요? 문서를 단어마다 나온 횟수를 적은 벡터로 바꿔 봅시다. A는 고양이에 관한 짧은 글, B는 고양이에 관한 다른 글을 번 이어 붙인 긴 글, C는 '고양이'가 한 번 나오는 경제 기사입니다.

단어 다섯 개의 등장 횟수. 노랑 A, 파랑 B, 분홍 C.

코사인 유사도로는 A와 B가 , A와 C가 로 B가 훨씬 가깝고, B를 몇 번 이어 붙여도 변하지 않습니다. 그러나 횟수 벡터 사이의 유클리드 거리로는 A–B가 , A–C가 라서, B가 세 배쯤 길어지면 경제 기사가 오히려 더 '가까워'집니다. 글의 길이라는, 내용과 상관없는 차이를 거리가 재 버린 것입니다. 실제 검색에서는 횟수를 그대로 쓰지 않고 TF-IDF 가중치⁠(weight)⁠를 곱한 뒤 코사인을 잽니다. 한 문서 안에서 단어가 나온 횟수(TF)에, 그 단어가 전체 문서 가운데 얼마나 드문 문서에만 나오는지(IDF)를 곱한 값이라서, '그리고'처럼 어디에나 나오는 단어의 무게는 거의 0이 됩니다. 오늘날에는 신경망⁠(neural network)⁠이 문장이나 그림을 뜻이 비슷할수록 가까운 수백 차원의 벡터(임베딩 벡터)로 바꾼 뒤 역시 코사인으로 비교합니다. 추천 시스템이 두 사람의 평점 벡터를 비교할 때도 같습니다.

이어지는 곳. 두 벡터에서 각각 평균⁠(mean)⁠을 빼고 코사인을 재면 상관계수⁠(correlation coefficient)⁠가 됩니다. 0과 1로만 된 벡터(무엇을 가졌는가)라면 코사인은 ∣A∩B∣/∣A∣∣B∣|A\cap B|/\sqrt{|A||B|}로, 자카드 지수⁠(Jaccard index)⁠나 쇠렌센–다이스 계수⁠(Sørensen–Dice coefficient)⁠와 분모만 다른 사촌입니다. 차원이 아주 높으면, 성분을 평균 0인 분포에서 서로 독립⁠(independence)⁠으로 뽑은 두 벡터는 거의 언제나 직각에 가까워서(코사인 ≈ 0, 차이는 대략 1/d1/\sqrt d 크기), 이것이 차원의 저주⁠(curse of dimensionality)⁠의 또 다른 얼굴입니다. 함수⁠(function)⁠도 적분⁠(integral)⁠으로 내적을 정하면 사이각을 잴 수 있는데, 푸리에 급수⁠(Fourier series)⁠의 계수는 함수와 사인⁠(sine)⁠·코사인 사이의 그런 내적입니다. 트랜스포머⁠(transformer)⁠의 어텐션⁠(attention)⁠도 쿼리⁠(query)⁠와 키가 얼마나 닮았는지를 내적으로 재지만, 길이로 나누지 않고 차원의 제곱근 d\sqrt d로만 나눈 뒤 소프트맥스⁠(softmax)⁠에 넣습니다. 그래서 쿼리와 방향이 같은 두 키 가운데서는 더 긴 쪽이 더 큰 가중치를 받습니다.

단어를 수백 차원의 벡터로 나타내는 단어 임베딩⁠(word embedding)⁠에서 두 단어가 얼마나 비슷한지는 대개 이 코사인으로 잽니다. 질문과 문서를 같은 공간의 벡터로 바꾼 뒤 코사인이 큰 문서를 찾아 언어 모델⁠(language model)⁠의 문맥에 넣어 주는 검색 증강 생성⁠(retrieval-augmented generation)⁠도 이 계산 위에 서 있습니다.

이 개념이 나오는 큰 생각표현 바꾸기

이 개념이 나오는 긴 글

통계와 인과 담배와 폐암 상관관계는 인과관계가 아니라고들 한다. 그렇다면 담배가 폐암을 일으킨다는 것은 어떻게 알게 되었을까? 거리와 유사도 까마귀와 택시 까마귀는 곧장 날고 택시는 블록을 돌아간다. '얼마나 먼가'에는 답이 하나가 아니고, 어떤 거리를 고르느냐가 통계와 기계 학습의 답을 바꾼다. 계산언어학 말을 세는 기계 문법은 규칙일까, 확률일까? 파니니의 문법에서 촘스키의 위계, 섀넌의 영어 엔트로피, 오늘날의 언어 모델까지. 언어 모델 다음 단어를 맞히는 기계 다음 낱말을 짐작하는 일만으로 어디까지 갈 수 있을까? 마르코프의 글자 세기에서 섀넌의 추측 게임, 트랜스포머와 규모의 법칙, 사람의 선호까지. 밑바닥에는 확률의 곱셈 규칙과 로그 하나가 있고, 그 수학은 모델이 왜 그럴듯하게 틀리는지도 말해 준다.

이 개념 위에 세워진 것

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념