이번 글에서 다룰 내용
이 글에서는 내적(inner product)과 코사인 유사도(cosine similarity)를 다룹니다.
- 내적이 단순 곱셈의 합이 아니라 방향 관계를 담는 값이라는 점을 설명합니다.
- 코사인 유사도가 왜 임베딩 검색과 추천 시스템에서 자주 쓰이는지 정리합니다.
- 거리(distance)와 방향 유사도는 어떤 점이 다른지도 비교합니다.
- 내적이 이후 직교(orthogonality), 정사영(projection)으로 이어지는 이유를 미리 잡아 둡니다.
이번 글에서 새로 나오는 용어
- 내적 (dot product): 두 벡터의 방향 관계와 성분 기여를 함께 담는 연산입니다.
- 노름 (norm): 내적과 함께 길이를 정의할 때 쓰는 규칙입니다.
- 정사영 (projection): 내적이 실제로 어디로 이어지는지 보여 주는 다음 단계 개념입니다.
핵심 아이디어
두 벡터가 얼마나 비슷한지를 재고 싶을 때, 길이와 거리만으로는 부족한 경우가 많습니다. 어떤 문제에서는 절대 크기보다 방향이 얼마나 비슷한가가 더 중요합니다. 이때 등장하는 개념이 내적 (inner product)입니다.
이 글에서 다루는 것은 가장 익숙한 유클리드 내적(Euclidean dot product) 입니다. 벡터 u = (u1, u2, ..., un)와 v = (v1, v2, ..., vn)의 내적은 다음처럼 씁니다.
u · v = u1v1 + u2v2 + ... + unvn
즉 내적은 각 성분끼리 곱해서 모두 더한 값입니다. 계산만 보면 단순하지만, 이 값은 두 벡터의 길이와 각도 정보를 동시에 담고 있습니다.
- 같은 방향이면 내적이 커집니다.
- 서로 직교(orthogonal)하면 내적이 0입니다.
- 반대 방향이면 내적이 음수가 될 수 있습니다.
- 길이가 큰 벡터는 방향이 같을 때 내적도 더 크게 만들 수 있습니다.
이 의미는 다음 식으로 더 분명해집니다.
u · v = ||u|| ||v|| cos(theta)
여기서 theta는 두 벡터 사이의 각도(angle)입니다. 즉 내적은 방향만 담는 값이 아니라 길이와 방향을 함께 담는 값입니다.
정사영(projection)으로 보면 더 잘 보인다
벡터 v를 u 방향으로 얼마나 투영할 수 있는지 생각해 보면 내적의 기하적 의미가 더 잘 보입니다. u가 단위벡터(unit vector)라면 u · v는 v가 u 방향으로 얼마나 뻗어 있는지를 나타냅니다.
즉 내적은 단순 계산이 아니라, "이 벡터가 저 방향으로 얼마나 기여하는가"를 읽는 연산입니다. 그래서 나중에 정사영과 최소제곱(least squares)로 이어질 때 자연스럽게 연결됩니다.
왜 코사인 유사도가 필요한가
내적은 유용하지만 벡터 길이의 영향도 함께 받습니다. 예를 들어 방향은 거의 같아도 한 벡터가 훨씬 길면 내적 값이 크게 나올 수 있습니다. 그래서 길이 영향을 제거하고 방향만 비교하고 싶을 때 코사인 유사도(cosine similarity)를 사용합니다.
cos(u, v) = (u · v) / (||u|| ||v||)
이 값은 보통 -1에서 1 사이에 있고,
1이면 같은 방향0이면 직교-1이면 반대 방향
을 뜻합니다.
다만 중요한 주의점이 하나 있습니다. u나 v가 영벡터(zero vector)면 분모가 0이 되어 코사인 유사도는 정의되지 않습니다.
검색 시스템, 추천 시스템, 임베딩 비교에서 코사인 유사도가 자주 쓰이는 이유는 "얼마나 큰 벡터인가"보다 "어느 방향을 가리키는가"가 더 중요할 때가 많기 때문입니다.
단계별 예시
예시 1) 단순 내적 계산
벡터 u = (1, 2)와 v = (3, 4)가 있을 때 내적은 다음과 같습니다.
u · v = 1*3 + 2*4 = 11
여기서 중요한 것은 숫자 11 자체보다, 두 벡터가 꽤 비슷한 방향을 가지고 있다는 해석입니다. 만약 두 벡터가 서로 엇갈리는 방향 성분이 크면 이 값은 더 작아질 수 있습니다.
예시 2) 직교인 경우
벡터 u = (1, 0)와 v = (0, 1)의 내적은
u · v = 0
입니다. 이는 두 벡터가 서로 수직이라는 뜻입니다. 지금은 2차원 그림으로 이해하기 쉽지만, 고차원에서도 내적이 0이면 직교라고 말합니다. 이 개념은 뒤에서 정사영과 최소제곱(least squares)을 이해하는 핵심이 됩니다.
예시 3) 내적이 크다고 항상 가깝지는 않다
다음 두 경우를 비교해 봅시다.
a = (100, 0)
b = (100, 1)
이때 내적은
a · b = 10000
으로 매우 큽니다. 하지만 두 벡터의 차이는 (0, 1)이라서 유클리드 거리(Euclidean distance)는 1입니다.
반대로
c = (1, 0)
d = (0.8, 0.6)
는 내적이 0.8이라 첫 번째 경우보다 훨씬 작지만, 방향 비교 관점에서는 꽤 비슷합니다. 즉 내적 값의 크기만 보고 가까움이나 유사함을 단정하면 안 됩니다.
예시 4) 문장 임베딩 검색
검색 시스템에서 사용자의 질문을 벡터 q로, 문서를 벡터 d1, d2, d3로 바꾼다고 합시다. 이때 q와 각 문서 벡터의 코사인 유사도를 계산해 가장 큰 값을 가진 문서를 상위 결과로 올릴 수 있습니다.
이 방식이 자주 쓰이는 이유는, 문서 벡터의 절대 크기보다 질문과 얼마나 같은 방향의 의미를 가지는지가 중요하기 때문입니다. 그래서 임베딩 검색에서는 거리보다 코사인 유사도가 더 자연스러운 기준이 되는 경우가 많습니다.
예시 5) 추천 시스템 점수
사용자 취향 벡터 u와 아이템 특성 벡터 i의 내적을 선호 점수(score)처럼 쓰는 경우도 많습니다.
score = u · i
이때 각 특성 축에서 사용자의 선호와 아이템의 강도가 얼마나 잘 맞는지가 합쳐져 하나의 점수로 나옵니다. 즉 내적은 단순 유사도 지표이기도 하고, 여러 축 기여도를 모아 최종 점수를 만드는 연산이기도 합니다.
다만 실제 시스템에서는 벡터를 미리 정규화(normalization)해 코사인 유사도처럼 쓰기도 하고, 정규화하지 않은 채 크기 정보까지 점수에 반영하기도 합니다. 어느 쪽이 더 좋은지는 문제에 따라 다릅니다.
수학 주석
- 내적(inner product)은 길이와 각도를 함께 연결해 주는 개념입니다.
u · v = 0이라는 조건 하나로 직교(orthogonality)를 정의할 수 있다는 점이 매우 중요합니다.- 유클리드 노름(Euclidean norm)은 사실
||v|| = sqrt(v · v)처럼 내적으로부터 만들 수 있습니다. - 코사인 유사도(cosine similarity)는 유사도(similarity)이지 거리(metric)는 아닙니다. 삼각부등식 같은 거리의 조건을 바로 만족하는 것은 아닙니다.
즉 내적은 덧셈, 길이, 각도, 직교를 하나의 틀 안에서 묶어 주는 중심 개념입니다. 이 연결 고리를 잡으면 뒤에서 나오는 정사영, 최소제곱(least squares), 직교기저(orthogonal basis)가 훨씬 덜 뜬금없게 느껴집니다.
고차원 임베딩에서는 각도가 서로 비슷해 보이는 현상(angle concentration)이 나타날 수 있고, 벡터 크기 자체가 중요 정보를 담는 경우도 있습니다. 그래서 임베딩을 무조건 정규화해야 한다고 단정할 수는 없습니다.
자주 하는 오해
내적이 크면 항상 두 벡터가 가깝다고 생각하기
그렇지 않습니다. 길이가 큰 벡터끼리는 방향이 비슷하지 않아도 내적이 커질 수 있습니다. 방향 유사성만 보고 싶다면 코사인 유사도를 함께 봐야 합니다.
코사인 유사도만 보면 충분하다고 생각하기
문제에 따라서는 절대 크기 자체가 중요할 수 있습니다. 예를 들어 사용자 활동량이나 신호 세기처럼 크기 정보가 핵심인 경우에는 코사인 유사도만 보면 중요한 차이를 놓칠 수 있습니다.
코사인 유사도를 거리처럼 생각하기
코사인 유사도는 방향 유사도를 재는 값이지, 거리(metric) 자체는 아닙니다. 그래서 "코사인 거리"라는 표현을 쓸 때도 정확히 어떤 변환을 쓰는지 구분해야 합니다.
직교를 2차원 직각 그림으로만 이해하기
고차원에서는 그림으로 볼 수 없어도 내적이 0이면 직교입니다. 그래서 직교는 도형 그림보다 내적 조건으로 이해하는 편이 더 강력합니다.
연습 또는 확장
다음 계산을 직접 해 보세요.
u = (2, 1),v = (1, 2)의 내적u = (1, 1),v = (1, -1)의 내적- 두 벡터의 길이를 먼저 구한 뒤 코사인 유사도를 계산해 보기
- 영벡터에 대해 코사인 유사도가 왜 정의되지 않는지 설명하기
그리고 아래 질문도 생각해 보세요.
- 왜 내적은 "각 성분 곱의 합"으로 정의되는데 방향 정보를 담을 수 있을까?
- 검색 문제에서는 왜 거리보다 코사인 유사도가 더 자주 쓰일까?
- 어떤 문제에서는 정규화(normalization)가 오히려 정보를 버리게 될까?
원한다면 더 나아가 중심화된 코사인(centered cosine)이 피어슨 상관계수(Pearson correlation)와 연결된다는 사실도 찾아볼 수 있습니다.
마무리
이번 글에서는 내적 (inner product)과 코사인 유사도(cosine similarity)를 정리했습니다.
- 내적은 각 축의 기여도를 합치는 계산이면서 방향 관계를 담는 값입니다.
- 코사인 유사도는 길이 영향을 제거하고 방향 유사도만 비교합니다.
- 검색, 추천, 임베딩 비교에서 특히 자주 쓰입니다.
- 다만 코사인 유사도는 영벡터에서 정의되지 않고, 거리(metric)와도 다릅니다.
- 이 개념은 뒤에서 직교(orthogonality)와 정사영으로 이어집니다.
다음 글에서는 행렬 (matrix)을 단순한 숫자 표가 아니라 벡터를 다른 벡터로 보내는 변환으로 읽어 보겠습니다.
💬 댓글
이 글에 대한 의견을 남겨주세요