두 벡터의 성분끼리 곱해 더한 수가 내적이다. 이 수는 “두 화살표가 얼마나 같은 쪽을 향하는가”를 재며, 같은 방향이면 크고, 수직이면 0, 반대면 음수다. 자기 자신과의 내적은 길이의 제곱이라, 길이·각도·수직을 모두 이것 하나로 계산한다. 추천 시스템의 유사도, 뉴런의 가중합이 모두 내적이다. 다만 내적은 길이에도 비례하므로, 방향만 비교하려면 길이로 나눈 코사인 유사도를 써야 한다.
예시로 보기
상품 세 개(A, B, C)에 대한 평점 벡터를 본다. 나는 \(\mathbf{u} = (5, 1, 0)\), 친구1은 \(\mathbf{v} = (4, 2, 0)\), 친구2는 \(\mathbf{w} = (0, 1, 5)\).
- \(\mathbf{u} \cdot \mathbf{v} = 5 \cdot 4 + 1 \cdot 2 + 0 \cdot 0 = 22\). 둘 다 A를 좋아해 곱이 크다.
- \(\mathbf{u} \cdot \mathbf{w} = 0 + 1 + 0 = 1\). 좋아하는 상품이 겹치지 않아 거의 0이다.
길이는 \(\Vert \mathbf{u}\Vert = \sqrt{25 + 1} = \sqrt{26}\), \(\Vert \mathbf{v}\Vert = \sqrt{20}\)이고, \(\cos\theta = \frac{22}{\sqrt{26}\sqrt{20}} \approx 0.965\)라 사잇각은 약 15°다. 거의 같은 방향이다. 평점 벡터가 아래 정의의 \(\mathbf{u}\), \(\mathbf{v}\), 22가 \(\mathbf{u} \cdot \mathbf{v}\)다.
정의
\(\mathbf{u}, \mathbf{v} \in \mathbb{R}^n\)(\(\in\)은 “~에 속한다”)에 대해
- 내적: \(\mathbf{u} \cdot \mathbf{v} = \sum_{i=1}^{n} u_i v_i = \mathbf{u}^\top\mathbf{v}\)(\(\sum\)은 차례로 모두 더한다는 기호).
- 노름(길이): \(\Vert \mathbf{v}\Vert = \sqrt{\mathbf{v} \cdot \mathbf{v}}\). 길이가 1이면 단위벡터이고, \(\mathbf{v} \ne \mathbf{0}\)이면 \(\frac{\mathbf{v}}{\Vert \mathbf{v}\Vert }\)가 같은 방향의 단위벡터다.
- 사잇각: \(\mathbf{u}, \mathbf{v} \ne \mathbf{0}\)이면 \(\cos\theta = \frac{\mathbf{u}\cdot\mathbf{v}}{\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert }\)(\(0 \le \theta \le \pi\)). \(\mathbf{u}\cdot\mathbf{v} = 0\)이면 직교(수직)한다고 한다1.
내적은 순서를 바꿔도 같고(\(\mathbf{u}\cdot\mathbf{v} = \mathbf{v}\cdot\mathbf{u}\)), 한쪽에 대해 선형이며(\((a\mathbf{u} + b\mathbf{w})\cdot\mathbf{v} = a\,\mathbf{u}\cdot\mathbf{v} + b\,\mathbf{w}\cdot\mathbf{v}\)), \(\mathbf{v}\cdot\mathbf{v} \ge 0\)이고 0은 \(\mathbf{v} = \mathbf{0}\)일 때뿐이다.
동치인 다른 정의. 평면과 공간에서 \(\mathbf{u}\cdot\mathbf{v} = \Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert \cos\theta\)이다(아래 증명). 성분으로 계산하는 대수적 정의와 길이·각으로 읽는 기하적 정의가 같은 수다. \(n\)차원에서는 이 식으로 각을 정의한다. 이때 \(\frac{\mathbf{u}\cdot\mathbf{v}}{\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert }\)가 \(-1\)과 1 사이에 들어 코사인 값이 될 수 있음을 보증하는 것이 코시–슈바르츠 부등식이다.
\(\vert \mathbf{u}\cdot\mathbf{v}\vert \le \Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert\)(등호는 한쪽이 다른 쪽의 스칼라배일 때). 그래서 \(\Vert \mathbf{u} + \mathbf{v}\Vert \le \Vert \mathbf{u}\Vert + \Vert \mathbf{v}\Vert\).
설계 이유. 성분 곱의 합은 피타고라스 정리의 일반화다. \(\mathbf{v}\cdot\mathbf{v} = v_1^2 + \cdots + v_n^2\)가 길이의 제곱이 되도록 고른 것이고, 선형성 덕분에 식을 전개하듯 계산할 수 있다.
해당하는 예: \((1, 2)\cdot(-2, 1) = 0\)(수직), \((1, 1)\cdot(2, 2) = 4 = \sqrt2 \cdot 2\sqrt2\)(같은 방향, \(\cos\theta = 1\)), \((1, 0)\cdot(-3, 0) = -3\)(반대 방향). 해당하지 않는 예: 성분별 곱 \((u_1v_1, u_2v_2)\)(하다마르 곱)는 수가 아니라 벡터라 내적이 아니다. \(\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert\)만 곱한 것은 방향 정보가 없어 내적이 아니다.
증명
기하적 정의는 코사인 법칙과 내적의 전개를 맞대어 얻고, 코시–슈바르츠는 음이 아닌 이차식의 판별식으로 얻는다.
증명 펼치기
기하적 정의.
- 코사인 법칙: \(\mathbf{u}\), \(\mathbf{v}\), \(\mathbf{u} - \mathbf{v}\)가 이루는 삼각형에서 코사인 법칙으로 \(\Vert \mathbf{u} - \mathbf{v}\Vert ^2 = \Vert \mathbf{u}\Vert ^2 + \Vert \mathbf{v}\Vert ^2 - 2\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert \cos\theta\).
- 내적으로 전개: 선형성으로 \(\Vert \mathbf{u} - \mathbf{v}\Vert ^2 = (\mathbf{u} - \mathbf{v})\cdot(\mathbf{u} - \mathbf{v}) = \Vert \mathbf{u}\Vert ^2 - 2\,\mathbf{u}\cdot\mathbf{v} + \Vert \mathbf{v}\Vert ^2\).
- 비교: 두 식의 좌변이 같으므로 \(\mathbf{u}\cdot\mathbf{v} = \Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert \cos\theta\).
코시–슈바르츠. \(\mathbf{v} \ne \mathbf{0}\)이라 하자(아니면 양변이 0).
- 음이 아닌 이차식: 모든 실수 \(t\)에서 \(0 \le \Vert \mathbf{u} + t\mathbf{v}\Vert ^2 = \Vert \mathbf{v}\Vert ^2 t^2 + 2(\mathbf{u}\cdot\mathbf{v})t + \Vert \mathbf{u}\Vert ^2\).
- 판별식: 늘 0 이상인 이차식은 판별식이 0 이하다. \(4(\mathbf{u}\cdot\mathbf{v})^2 - 4\Vert \mathbf{u}\Vert ^2\Vert \mathbf{v}\Vert ^2 \le 0\).
- 삼각부등식: \(\Vert \mathbf{u} + \mathbf{v}\Vert ^2 = \Vert \mathbf{u}\Vert ^2 + 2\,\mathbf{u}\cdot\mathbf{v} + \Vert \mathbf{v}\Vert ^2 \le \Vert \mathbf{u}\Vert ^2 + 2\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert + \Vert \mathbf{v}\Vert ^2 = (\Vert \mathbf{u}\Vert + \Vert \mathbf{v}\Vert )^2\). ∎
스스로 설명해 보기
1. 2단계에서 \((\mathbf{u} - \mathbf{v})\cdot(\mathbf{u} - \mathbf{v})\)를 전개할 때 쓰는 성질은?
선형성과 대칭성이다. \(\mathbf{u}\cdot\mathbf{u} - \mathbf{u}\cdot\mathbf{v} - \mathbf{v}\cdot\mathbf{u} + \mathbf{v}\cdot\mathbf{v}\)에서 대칭성으로 가운데 두 항이 같아 \(-2\,\mathbf{u}\cdot\mathbf{v}\)가 된다.
2. 5단계의 “늘 0 이상이면 판별식 ≤ 0”은 왜 맞는가?
판별식이 양수면 서로 다른 두 실근이 있고, 최고차 계수 \(\Vert \mathbf{v}\Vert ^2 > 0\)인 포물선은 두 근 사이에서 음수가 된다. 늘 0 이상이라는 가정에 어긋난다.
이 증명들의 핵심 아이디어는?
길이의 제곱을 내적으로 쓰고 전개한다. 기하의 사실(코사인 법칙)이나 부등식(0 이상)을 내적의 식으로 옮기면 필요한 관계가 한 줄로 나온다.
같은 방법을 쓸 수 있는 다른 상황은?
확률의 \(\vert \operatorname{Cov}(X, Y)\vert \le \sigma_X\sigma_Y\)(상관계수가 \(-1\)과 1 사이)도 \(\operatorname{Var}(X + tY) \ge 0\)의 판별식으로 같은 방식으로 증명한다(공분산과 상관계수).
예제
\(\mathbf{a} = (1, 1, 0)\)과 \(\mathbf{b} = (1, 0, 1)\)의 사잇각.
- 내적: \(1 + 0 + 0 = 1\).
- 길이: \(\Vert \mathbf{a}\Vert = \Vert \mathbf{b}\Vert = \sqrt2\).
- 각: \(\cos\theta = \frac{1}{2}\)이라 \(\theta = 60°\). 정육면체의 두 면 대각선 사이의 각이다.
활용
- 유사도 검색. 문서·이미지·사용자를 벡터로 만든 뒤 코사인 유사도 \(\frac{\mathbf{u}\cdot\mathbf{v}}{\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert }\)가 큰 것을 찾는다. 벡터를 미리 단위벡터로 바꿔 두면 내적만 계산하면 된다.
- 뉴런의 가중합. 퍼셉트론의 \(\mathbf{w}^\top\mathbf{x} + b\)는 입력과 가중치의 내적에 치우침을 더한 것이다. 내적이 \(-b\)보다 크냐 작으냐로 입력 공간을 초평면 \(\mathbf{w}^\top\mathbf{x} + b = 0\)의 양쪽으로 가른다.
- 그래픽스. 면의 법선과 빛 방향의 내적으로 밝기를 정한다(램버트 조명). 법선과 시선의 내적 부호로 뒤쪽 면을 건너뛴다2.
- 고차원의 성질. 1000차원에서 무작위로 뽑은 두 벡터의 코사인은 거의 0이다(대부분 거의 수직). 그래서 고차원 임베딩에서는 코사인 0.3도 꽤 비슷한 편이다2.
무작위로 뽑은 두 벡터의 코사인을 차원마다 2만 번 잰 분포다. 2차원에서는 \(-1\)부터 1까지 넓게 퍼지고 오히려 양 끝에 많다. 1000차원에서는 거의 모두 0 근처에 모인다3.
연결
- 선수: 벡터, 코사인 법칙
- 이어지는 개념: 행렬-벡터 곱(각 행과의 내적), 직교 사영과 최소제곱
- 다른 과목: 퍼셉트론의 가중합 \(\mathbf{w}^\top\mathbf{x} + b\)
자주 하는 오해
틀렸다. 내적이 방향이 같을 때 커지니 유사도처럼 쓰고 싶어진다. 하지만 내적은 길이에도 비례한다. \(\mathbf{q} = (1, 0)\)과 같은 방향인 \((1, 0)\)의 내적은 1인데, 방향이 약 5.7° 다른 \((10, 1)\)과의 내적은 10이다. 평점을 많이 매긴 사용자나 긴 문서가 무조건 “비슷한 것”으로 뽑힌다. 방향만 비교하려면 길이로 나눈 코사인 유사도를 쓴다. \((1, 0)\)과는 1, \((10, 1)\)과는 약 0.995다.
과목별 관점
데이터 과학 (3-2학기). 문서를 “단어마다 몇 번 나왔는가”를 적은 긴 벡터(단어 빈도 벡터)로 바꾸고, 두 문서의 비슷함을 코사인 유사도로 잰다. 이 벡터는 길고 대부분이 0이다(희소). 예를 들어 두 문서 \(\mathbf x = (5, 0, 3, 0, 2, 0, 0, 2, 0, 0)\), \(\mathbf y = (3, 0, 2, 0, 1, 1, 0, 1, 0, 1)\)은 내적 25, 길이 \(\sqrt{42}\), \(\sqrt{17}\)이라 코사인 유사도가 약 0.94다.
코사인 유사도가 늘 알맞은 척도는 아니다. 두 언어 모델의 LayerNorm 가중치 코사인 유사도가 96.8%를 넘는다는 이유로 “베꼈다”는 주장이 나온 적이 있다. 하지만 서로 무관한 모델들도 그 가중치의 방향이 비슷해 높은 코사인을 보였고, 평균을 빼고 잰 피어슨 상관계수는 약 −0.01이었다. 코사인은 모든 성분이 공통으로 큰 값을 가지면(평균이 0에서 멀면) 그것만으로 1에 가까워진다. 피어슨 상관계수는 각 벡터에서 평균을 뺀 뒤 잰 코사인이라 그 공통 부분을 지운다4.
자료와 정보 (2-1학기). 코사인 유사도를 여러 거리·유사도 척도 가운데 하나로 놓고, 언제 쓰고 값이 어디까지 나오는지를 정리한다.
\[\cos(\mathbf x, \mathbf y) = \frac{\mathbf x \cdot \mathbf y}{\Vert \mathbf x\Vert \,\Vert \mathbf y\Vert }\]- 숫자 자료(실수든 정수든)와 0·1로 된 이진 자료에 알맞다. 글을 숫자 벡터로 바꾼 뒤 비교할 때 많이 쓴다.
- 값은 \(-1\)부터 1까지이고, 1일 때 가장 닮았다.
- 1에서 뺀 \(1 - \cos(\mathbf x, \mathbf y)\)를 코사인 거리라 한다. 모든 성분이 0 이상이면 코사인이 0~1이라 코사인 거리도 0~1이다.
코사인 거리는 이름과 달리 거리의 조건을 다 지키지 못한다. 방향이 같은 두 벡터는 달라도 0이고, 삼각부등식도 깨진다: 거리와 유사도.
두 글을 낱말의 집합 \(r\), \(s\)로 보면 코사인 유사도는 \(\frac{\vert r \cap s\vert }{\sqrt{\vert r\vert \cdot \vert s\vert }}\)가 된다. 낱말마다 “있으면 1, 없으면 0”을 적은 벡터에서 내적은 함께 든 낱말 수, 길이는 낱말 수의 제곱근이기 때문이다5. 자세한 것은 문자열 유사도.
확인 문제
C1 내적, 노름, 사잇각의 정의를 쓰라.
답: \(\mathbf{u}\cdot\mathbf{v} = \sum u_iv_i\), \(\Vert \mathbf{v}\Vert = \sqrt{\mathbf{v}\cdot\mathbf{v}}\), \(\cos\theta = \frac{\mathbf{u}\cdot\mathbf{v}}{\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert }\)(\(\mathbf{u}, \mathbf{v} \ne \mathbf{0}\)).
C2 \((1, 1, 0)\)과 \((1, 0, 1)\)의 사잇각을 구하라.
답: 내적 1, 길이 모두 \(\sqrt2\)라 \(\cos\theta = \frac12\), \(\theta = 60°\).
C3 코사인 법칙으로 \(\mathbf{u}\cdot\mathbf{v} = \Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert \cos\theta\)를 끌어내는 과정에서, 비교하는 두 식은 각각 어디서 나오는가?
답: 하나는 삼각형의 코사인 법칙 \(\Vert \mathbf{u} - \mathbf{v}\Vert ^2 = \Vert \mathbf{u}\Vert ^2 + \Vert \mathbf{v}\Vert ^2 - 2\Vert \mathbf{u}\Vert \Vert \mathbf{v}\Vert \cos\theta\). 다른 하나는 내적의 선형성과 대칭성으로 전개한 \(\Vert \mathbf{u} - \mathbf{v}\Vert ^2 = \Vert \mathbf{u}\Vert ^2 - 2\,\mathbf{u}\cdot\mathbf{v} + \Vert \mathbf{v}\Vert ^2\).
C4 질의 벡터 \(\mathbf{q}\)와의 내적은 \(\mathbf{a}\)가 더 큰데, 코사인 유사도는 \(\mathbf{b}\)가 더 큰 예를 들라.
답: \(\mathbf{q} = (1, 0)\), \(\mathbf{a} = (10, 1)\), \(\mathbf{b} = (1, 0)\). 내적은 10 대 1, 코사인은 약 0.995 대 1이다.
C5 \(\mathbf u = (1, 2, 3)\), \(\mathbf v = (3, 2, 1)\)의 모든 성분에 100을 더했다. 코사인 유사도와 피어슨 상관계수는 각각 어떻게 되는가? 두 모델의 가중치가 “비슷한가”를 판정할 때 무엇을 써야 하나?
답: 코사인은 \(\frac{10}{14} \approx 0.71\)에서 0.9999로 치솟고, 상관계수는 −1 그대로다. 공통으로 더해진 큰 값이 방향을 거의 같게 만들기 때문이다. 공통 부분이 아니라 값의 오르내림이 닮았는지를 보려면 평균을 빼는 상관계수를 쓴다4.
C6 두 집합 \(r = \{a, b, c, d\}\), \(s = \{c, d, e\}\)를 원소 \(a\)~\(e\)의 0/1 벡터로 적고, 벡터의 코사인 유사도가 \(\frac{\vert r \cap s\vert }{\sqrt{\vert r\vert \cdot \vert s\vert }}\)와 같음을 확인하라.
답: \(\mathbf r = (1, 1, 1, 1, 0)\), \(\mathbf s = (0, 0, 1, 1, 1)\). 내적 2, 길이 \(\sqrt4\)와 \(\sqrt3\). 코사인 \(\frac{2}{\sqrt{12}} \approx 0.577\). 집합 식으로도 \(\frac{2}{\sqrt{4 \cdot 3}}\)이다.
이유: 0/1 벡터의 내적은 둘 다 1인 자리의 수, 곧 교집합의 크기다. 자기 자신과의 내적은 1의 개수라 길이가 원소 수의 제곱근이다5.
-
Strang, Introduction to Linear Algebra 5판, 1.2절 “Lengths and Dot Products”(내적, 길이, 단위벡터, 코사인 공식, 코시–슈바르츠와 삼각부등식). ↩
-
램버트 조명과 뒷면 제거는 컴퓨터 그래픽스 교재의 표준 내용이다. 고차원 무작위 벡터의 코사인이 0 근처에 모이는 것(1000차원에서 표준편차 약 \(1/\sqrt{1000} \approx 0.03\))은 02_dot-product_verify.py에서 실험으로 확인했다. ↩ ↩2
-
02_dot-product_plot.py로 그렸고, 코사인의 표준편차가 약 \(1/\sqrt{n}\)(\(n\)은 차원, 2차원 0.71, 10차원 0.32, 1000차원 0.032)인 것을 같은 코드로 확인했다. ↩
-
10_string-similarity_verify.py로 확인했다. ↩ ↩2