[선형대수 시리즈 5편] 내적과 코사인 유사도

English version

이번 글에서 다룰 내용

이 글에서는 내적(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)으로 보면 더 잘 보인다

벡터 vu 방향으로 얼마나 투영할 수 있는지 생각해 보면 내적의 기하적 의미가 더 잘 보입니다. u가 단위벡터(unit vector)라면 u · vvu 방향으로 얼마나 뻗어 있는지를 나타냅니다.

즉 내적은 단순 계산이 아니라, "이 벡터가 저 방향으로 얼마나 기여하는가"를 읽는 연산입니다. 그래서 나중에 정사영과 최소제곱(least squares)로 이어질 때 자연스럽게 연결됩니다.

왜 코사인 유사도가 필요한가

내적은 유용하지만 벡터 길이의 영향도 함께 받습니다. 예를 들어 방향은 거의 같아도 한 벡터가 훨씬 길면 내적 값이 크게 나올 수 있습니다. 그래서 길이 영향을 제거하고 방향만 비교하고 싶을 때 코사인 유사도(cosine similarity)를 사용합니다.

cos(u, v) = (u · v) / (||u|| ||v||)

이 값은 보통 -1에서 1 사이에 있고,

  • 1이면 같은 방향
  • 0이면 직교
  • -1이면 반대 방향

을 뜻합니다.

다만 중요한 주의점이 하나 있습니다. uv가 영벡터(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이면 직교입니다. 그래서 직교는 도형 그림보다 내적 조건으로 이해하는 편이 더 강력합니다.

연습 또는 확장

다음 계산을 직접 해 보세요.

  1. u = (2, 1), v = (1, 2)의 내적
  2. u = (1, 1), v = (1, -1)의 내적
  3. 두 벡터의 길이를 먼저 구한 뒤 코사인 유사도를 계산해 보기
  4. 영벡터에 대해 코사인 유사도가 왜 정의되지 않는지 설명하기

그리고 아래 질문도 생각해 보세요.

  • 왜 내적은 "각 성분 곱의 합"으로 정의되는데 방향 정보를 담을 수 있을까?
  • 검색 문제에서는 왜 거리보다 코사인 유사도가 더 자주 쓰일까?
  • 어떤 문제에서는 정규화(normalization)가 오히려 정보를 버리게 될까?

원한다면 더 나아가 중심화된 코사인(centered cosine)이 피어슨 상관계수(Pearson correlation)와 연결된다는 사실도 찾아볼 수 있습니다.

마무리

이번 글에서는 내적 (inner product)과 코사인 유사도(cosine similarity)를 정리했습니다.

  • 내적은 각 축의 기여도를 합치는 계산이면서 방향 관계를 담는 값입니다.
  • 코사인 유사도는 길이 영향을 제거하고 방향 유사도만 비교합니다.
  • 검색, 추천, 임베딩 비교에서 특히 자주 쓰입니다.
  • 다만 코사인 유사도는 영벡터에서 정의되지 않고, 거리(metric)와도 다릅니다.
  • 이 개념은 뒤에서 직교(orthogonality)와 정사영으로 이어집니다.

다음 글에서는 행렬 (matrix)을 단순한 숫자 표가 아니라 벡터를 다른 벡터로 보내는 변환으로 읽어 보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요