22개정 인공지능 수학 · Unit 2 · 언어를 수로 바꾸는 방법
벡터의 각도로 문서 유사도 측정하기
두 문서가 같은 주제를 다루는지 비교할 때 단어 수만 보면 긴 문서가 유리해질 수 있습니다. 코사인 유사도는 벡터를 단위 길이로 맞춘 뒤 방향을 비교하여 이 문제를 줄입니다.
이번 강의의 목표
내적, 벡터의 크기와 각도의 관계를 설명하고 두 문서의 코사인 유사도를 단계별로 계산합니다.
코사인 유사도
두 영벡터가 아닌 문서 벡터의 내적을 두 벡터의 크기 곱으로 나누면 길이 효과를 제거한 방향의 유사도를 얻습니다.
값 해석
성분이 음수가 아닌 빈도·TF-IDF 벡터에서는 값이 1에 가까울수록 단어 구성 비율이 비슷하고 0이면 양의 가중치를 가진 공통 특징이 없습니다.
비교 기준 선택
유클리드 거리는 끝점 사이의 절대 차이에, 내적은 방향과 길이에, 코사인 유사도는 방향에 초점을 둡니다.
왜 ‘각도’로 문서를 비교할까?
어휘 순서가 (수학, 데이터, 모델, 학습)일 때 짧은 문서와 그 내용을 두 번 반복한 문서를 생각해 봅시다.
수학 데이터
\(\mathbf{x}=(1,1,0,0)\)수학 데이터 수학 데이터
\(\mathbf{y}=(2,2,0,0)=2\mathbf{x}\)두 벡터의 끝점은 다르지만 원점에서 같은 방향을 가리킵니다. 반복 횟수보다 단어의 구성 비율에 관심이 있다면 두 문서를 가장 비슷하다고 판단하는 것이 자연스럽습니다.
공식은 어디에서 오는가?
벡터의 내적은 성분별 곱의 합으로 계산할 수도 있고, 두 벡터의 크기와 사이각으로 나타낼 수도 있습니다.
두 벡터가 영벡터가 아니라면 양변을 크기의 곱으로 나눌 수 있습니다.
즉 코사인 유사도는 새로운 임의의 공식이 아니라, 내적에서 두 벡터의 길이를 분리해 낸 값입니다.
그림은 개념을 보여 주기 위한 2차원 예입니다. 실제 문서 벡터는 어휘 수만큼 차원을 가지지만 내적과 크기를 이용하면 같은 방식으로 각도의 코사인을 계산할 수 있습니다.
계산 예제 · 앞 강의의 세 문서 비교
앞 강의에서 만든 벡터 \(\mathbf{d}_1=(1,1,1,0)\), \(\mathbf{d}_2=(0,1,1,1)\), \(\mathbf{d}_3=(1,0,1,1)\)을 그대로 사용합니다.
- 내적: \(\mathbf{d}_1\cdot\mathbf{d}_2=1\times0+1\times1+1\times1+0\times1=2\)
- 각 벡터의 크기: \(\lVert\mathbf{d}_1\rVert_2=\lVert\mathbf{d}_2\rVert_2=\sqrt{3}\)
- 크기의 곱: \(\sqrt{3}\times\sqrt{3}=3\)
- 나누기: \(\operatorname{cosSim}(\mathbf{d}_1,\mathbf{d}_2)=2/3\approx0.667\)
두 문서는 ‘데이터’와 ‘모델’이라는 두 좌표를 공유합니다. 같은 방식으로 계산하면 세 쌍의 유사도는 모두 \(2/3\)입니다. 공통 토큰 수와 각 벡터의 크기가 모두 같기 때문입니다.
단위 벡터로 보면 더 간단하다
L2 정규화는 벡터를 자신의 크기로 나누어 길이를 1로 만드는 과정입니다.
정규화된 두 벡터에서는 크기의 곱이 1이므로 코사인 유사도가 곧 내적입니다.
세 가지 비교 방법은 무엇을 다르게 보는가?
| 측도 | 계산 | 길이의 영향 | 값의 해석 |
|---|---|---|---|
| 유클리드 거리 | \(\lVert\mathbf{x}-\mathbf{y}\rVert_2\) | 받음 | 작을수록 가까움 |
| 내적 | \(\mathbf{x}\cdot\mathbf{y}\) | 받음 | 대체로 클수록 유사 |
| 코사인 유사도 | \(\frac{\mathbf{x}\cdot\mathbf{y}}{\lVert\mathbf{x}\rVert_2\lVert\mathbf{y}\rVert_2}\) | 배율에는 불변 | 클수록 방향이 가까움 |
예를 들어 \(\mathbf{y}=c\mathbf{x}\)이고 \(c>0\)이면 코사인 유사도는 항상 1입니다. 따라서 문서 길이 자체가 중요한 과제라면 코사인 값만 사용하지 말고 총 토큰 수 같은 특징을 따로 보존해야 합니다.
범위는 언제 -1부터 1인가?
일반적인 실수 벡터의 코사인 유사도 범위는 \([-1,1]\)입니다. 같은 방향은 1, 직교하면 0, 반대 방향은 -1입니다.
하지만 출현 횟수나 일반적인 TF-IDF처럼 모든 성분이 음수가 아니면 내적도 음수가 될 수 없어 보통 \([0,1]\) 범위에 놓입니다. 음수 가중치가 가능한 다른 표현에서는 음수 유사도도 나올 수 있습니다.
영벡터는 계산할 수 없다
전처리 후 알려진 토큰이 하나도 남지 않으면 \(\mathbf{0}\)이 됩니다. 크기가 0이므로 공식의 분모가 0이 되어 코사인 유사도는 정의되지 않습니다.
프로그램에서는 계산 전에 영벡터를 검사하고 ‘비교 불가’로 처리할지, 별도의 규칙으로 0을 반환할지 명시해야 합니다. 0을 반환하더라도 그것은 수학적 값이 아니라 구현상의 약속입니다.
여러 문서를 한 번에 비교하기
행마다 L2 정규화한 문서 벡터를 쌓아 행렬 \(\widehat{X}\)를 만들면 모든 문서 쌍의 유사도를 행렬곱으로 계산할 수 있습니다.
| 문서 | \(d_1\) | \(d_2\) | \(d_3\) |
|---|---|---|---|
| \(d_1\) | 1.000 | 0.667 | 0.667 |
| \(d_2\) | 0.667 | 1.000 | 0.667 |
| \(d_3\) | 0.667 | 0.667 | 1.000 |
대각 원소는 문서와 자기 자신의 유사도이므로 1이고, \(S_{ij}=S_{ji}\)이므로 행렬은 대칭입니다. 검색에서는 질의 벡터와 각 문서의 유사도를 구해 큰 값부터 정렬할 수 있지만, 기준값은 과제와 검증 자료로 정해야 합니다.
표현이 바뀌면 유사도도 바뀐다
‘수학은’과 ‘수학을’을 다른 좌표로 두면 실제보다 덜 비슷하게 계산될 수 있습니다.
모든 문서에 흔한 단어의 가중치를 낮추면 구별되는 핵심 단어가 비교에 더 크게 작용할 수 있습니다.
단어 주머니 벡터는 같은 빈도만 가지면 어순이 달라도 유사도 1이 될 수 있습니다.
‘0.8 이상이면 같은 주제’ 같은 기준은 보편 법칙이 아닙니다. 언어·문서 길이·사용 집단별 오류를 검증해야 합니다.
코사인 유사도는 벡터에 들어 있는 정보만 비교합니다. 높은 값이 두 문장의 의미가 반드시 같다는 증명도 아니고, 낮은 값이 관련성이 전혀 없다는 증명도 아닙니다.
활동 1 · 손으로 계산하기
\(\mathbf{a}=(2,1,0)\), \(\mathbf{b}=(1,2,0)\), \(\mathbf{c}=(0,0,3)\)일 때 \(\operatorname{cosSim}(\mathbf{a},\mathbf{b})\)와 \(\operatorname{cosSim}(\mathbf{a},\mathbf{c})\)를 구하세요.
정답과 해설 보기
\(\mathbf{a}\cdot\mathbf{b}=4\), 두 크기는 모두 \(\sqrt5\)이므로 첫 값은 \(4/5=0.8\)입니다. \(\mathbf{a}\cdot\mathbf{c}=0\)이므로 두 번째 값은 0입니다.
활동 2 · 가장 가까운 문서 찾기
질의 \(\mathbf{q}=(1,1,0)\)와 후보 \(\mathbf{p}_1=(3,3,0)\), \(\mathbf{p}_2=(1,1,1)\), \(\mathbf{p}_3=(0,0,2)\)가 있습니다. 코사인 유사도가 가장 큰 후보를 찾고 이유를 설명하세요.
정답과 해설 보기
\(\mathbf{p}_1=3\mathbf{q}\)이므로 유사도는 1입니다. \(\mathbf{p}_2\)와는 \(2/\sqrt6\approx0.816\), \(\mathbf{p}_3\)와는 0이므로 가장 가까운 후보는 \(\mathbf{p}_1\)입니다. 절대 빈도는 다르지만 방향이 같습니다.
공개 자료 참고 및 저작권 안내
개념의 정확성과 구현상의 주의점을 확인하기 위해 다음 공개 자료를 참고했습니다.
- Google for Developers · Measuring similarity from embeddings — 유클리드 거리, 내적, 코사인 유사도의 차이와 단위 정규화 관계 확인. 별도 표시가 없는 본문은 CC BY 4.0, 코드는 Apache 2.0으로 안내됩니다.
- scikit-learn · cosine_similarity와 Pairwise metrics user guide — 정규화된 내적, 희소 행렬과 TF-IDF 문서 비교의 구현 개념 확인.
- scikit-learn BSD 3-Clause License — 참고한 오픈소스 구현의 라이선스 확인.
외부 자료의 문장, 코드, 예제, 표 또는 그림을 복제하지 않았습니다. 한국어 문서, 모든 계산값, 활동, 비교표와 SVG 벡터 그림은 이 강의를 위해 독립적으로 작성했습니다. 링크 자료를 직접 재사용할 때에는 최신 라이선스와 출처 표시 조건을 다시 확인하세요.
학습 원칙
계산 결과만 제시하지 않고 사용한 데이터, 수학적 가정, 평가 기준과 적용 한계를 함께 설명합니다. 개인정보와 편향 가능성을 확인하고 인공지능의 출력을 확정된 사실로 해석하지 않습니다.
교육과정 구성 근거
국가교육과정정보센터의 2022 개정 교육과정, 한국과학창의재단 수학과 교육과정 개발 연구, 부산광역시교육청 고교학점제 과목 안내를 과목 성격과 내용 범위 확인에 참고했습니다. 단원 구성, 강의명, 설명과 예시는 이 사이트의 학습 흐름에 맞게 독립적으로 작성했습니다.
어휘 순서가 (수학, 데이터, 모델)일 때 문서 A=(2,1,1), B=(4,2,2), C=(0,1,1)의 코사인 유사도 A-B와 A-C를 각각 계산하세요. 이어서 A-B의 유클리드 거리가 0이 아닌데도 코사인 유사도가 1인 이유와, 영벡터 문서를 처리할 규칙을 설명하세요.