1장에서 단어를 벡터(화살표)로 바꿨다. 이제 진짜 궁금한 건 이것이다 — 컴퓨터는 눈이 없는데, 숫자만 보고 "이 두 화살표가 같은 방향인가, 반대인가"를 어떻게 알아낼까? 이 질문을 따라가면 내적(dot product)에 도착한다.
1 뺄셈은 방향이 아니라 거리를 잰다
첫 시도: 두 화살표의 좌표를 빼본다. A=(3,8), B=(2,7)이면 (1,1)로 차이가 작다 → "비슷하다". 그럴듯하다. 하지만 함정이 있다.
A와 D는 방향이 완전히 같다(D가 10배 길 뿐). 그런데 끝점 사이 거리는 멀다. 뺄셈은 "끝점이 가까운가(거리)"를 잴 뿐, "방향이 같은가"를 못 잡는다. 즉 벡터를 점으로 본 것이다.
RAG에서 같은 의미인데 강조 정도만 다른 문장들은 딱 이 A·D 관계다 — 방향은 같고 길이만 다르다. 그래서 거리(뺄셈)로 보면 "다르다"고 잘못 판단한다. 우리가 원하는 건 거리가 아니라 방향이다.
2 기울기도 답이 아니다
두 번째 시도: 기울기(y/x)를 본다. A=(3,8)은 8/3, D=(30,80)도 80/30=8/3 → 같다. 방향이 같으면 기울기도 같으니 그럴듯하다. 하지만 두 가지가 막는다.
기울기의 한계 ① — 정반대를 구분 못 한다. A=(3,8)의 기울기 8/3, 정반대인 C=(-3,-8)의 기울기도 (-8)/(-3)=8/3. 같은 의미와 반대 의미가 똑같이 나와버린다. 기울기의 한계 ② — 차원이 늘면 정의가 안 된다. 기울기는 숫자 2개일 때만 "하나의 비율"이 된다. 1536차원에서 "기울기"는 무엇인가? 정의 불가. (1장의 약속 "차원이 늘어도 같은 규칙"을 못 지킨다.)
3 내적 — 자리수끼리 곱해서 더한다
세 번째 시도가 정답이다. 빼지도, 나누지도 말고 — 같은 자리수끼리 곱해서, 그 결과를 전부 더한다.
A · B = 3×2 + 8×7 = 6 + 56 = 62 (양수)
A · C = 3×(−3) + 8×(−8) = −9 + (−64) = −73 (음수)
이것이 내적(dot product)이다. 그리고 기울기가 못 하던 일을 단번에 해낸다 — 같은 방향이면 양수, 반대 방향이면 음수. 부호 하나로 같은 의미와 반대 의미가 갈린다.
규칙이 한 글자도 안 바뀐다. 곱해서 더하는 쌍의 개수만 늘 뿐. "차원이 늘어도 계산 규칙은 똑같다. 안 보일 뿐이다."
4 왜 하필 "곱해서 더하기"가 방향을 잡을까
여기서 멈추면 안 된다. 우리가 원한 건 "방향"인데, 한 일은 그냥 "곱해서 더하기"라는 산수다. 이 무미건조한 계산이 왜 방향을 잡아낼까? 우연이 아니다. 답은 그림자(정사영, projection)에 있다.
가장 단순한 경우부터. 순수하게 오른쪽인 화살표 (1,0)과 순수하게 위쪽인 (0,1). 둘은 직각이다. 내적하면 1×0 + 0×1 = 0. 왜? "오른쪽" 화살표 안에는 "위쪽" 성분이 0만큼밖에 없기 때문이다. 공유하는 방향이 전혀 없으니 0.
B 위에서 똑바로 빛을 비추면 기준 화살표 A 위에 그림자가 생긴다. 그 그림자 길이 = "B 안에 A 방향 성분이 얼마나 들어있나". 내적은 사실 이 그림자 길이(×A의 길이)를 재는 것이다. "곱해서 더하기"는 이 그림자를 구하는 지름길일 뿐이다.
이제 부호 세 가지가 전부 풀린다
+
양수 — 비슷한 방향 B가 A와 비슷한 쪽을 보면 그림자가 A가 가리키는 방향으로 드리운다. 공유하는 방향이 많다 = 비슷한 의미.
0
0 — 직각, 무관 B가 A와 직각이면 A 방향으로 누른 그림자가 점으로 찌부러진다. 길이 0. (1,0)·(0,1)=0이 이것. 공유하는 방향이 없다 = 무관한 의미.
−
음수 — 반대 방향 B가 A와 반대쪽을 보면 그림자가 A가 가리키는 방향의 반대편으로 드리운다. A·C=−73이 이것. 정반대로 공유한다 = 반대 의미.
직각의 진짜 기준
내적이 0이면 직각이다. 좌표에 0이 들어있느냐와는 무관하다 — 예) (2,1)·(−1,2)=−2+2=0, 좌표에 0이 없어도 직각.
2·3차원에서 "내적 0"과 "눈에 보이는 90도"가 항상 일치함을 확인했으므로, 그릴 수 없는 1536차원에서는 "내적이 0인 상태"를 직각의 정의로 삼는다. 보이는 데서 검증한 규칙을 안 보이는 데로 확장하는 것.
영준님의 통찰 — "한쪽 컬럼이 0이면, 아무리 다른 쪽이 커도 그 자리는 상관이 없어진다." 정확하다. 곱할 때 ×0=0이라 그 의미 축은 닮음 판정에 기여하지 못한다. 각 자리(컬럼)마다 "이 의미 축에서 둘이 같은 쪽인가"를 따져 전부 합산한 것이 내적이다.
5 코사인 유사도 — 길이를 빼고 방향만
내적값에는 사실 두 가지가 섞여 있다. ① 방향이 얼마나 같은가, ② 두 화살표가 얼마나 긴가. A=(3,8)과 D=(30,80)은 방향이 같은데 D가 길어서 내적값이 10배 커진다. 값이 큰 게 방향 때문인지 길이 때문인지 헷갈린다.
코사인 유사도는 여기서 딱 한 가지만 더 한다 — 각 화살표의 길이로 나눠서 길이라는 잡음을 제거하고, 순수하게 방향(각도)만 남긴다. 그래서 결과가 항상 −1 ~ +1 사이로 깔끔하게 떨어진다.
RAG와 연결
−1 (정반대) ··· 0 (직각·무관) ··· +1 (완전히 같은 방향). 영준님이 RAG에서 보는 "유사도 0.87"은 "길이 빼고 순수하게 방향만 봤을 때 87%쯤 같은 쪽을 본다"는 뜻이다. 길이가 3이든 3000이든 방향만 같으면 +1.
내적 = 방향+길이가 섞인 그림자. 코사인 유사도 = 거기서 길이를 빼고 방향(각도)만 남긴 것.
— 2장 한 줄 요약 (영준님 정리 그대로)
이번 장 한눈에 정리
뺄셈은 거리를 잰다 — 방향이 아니다. 같은 방향이라도 길이가 다르면 끝점이 멀어져 "다르다"고 잘못 본다.
기울기도 안 된다. 정반대를 구분 못 하고(8/3 = 8/3), 고차원에서 정의가 안 된다.
내적 = 같은 자리수끼리 곱해서 전부 더하기. 양수=같은 방향, 0=직각/무관, 음수=반대 방향. 차원이 몇 개든 같은 규칙.
내적이 0이면 직각. 좌표에 0이 있냐와 무관하게 내적값만 본다. 고차원에선 "내적 0"이 직각의 정의 그 자체.
내적의 정체는 그림자(정사영). "B를 A 방향으로 눌렀을 때 A 쪽으로 얼마나 뻗어있나". 곱해서 더하기는 그 그림자를 구하는 지름길.
코사인 유사도 = 내적에서 길이 영향을 제거한 것. 순수 방향만 남겨 −1 ~ +1로 정규화. RAG 유사도 점수의 정체.
다음 장 예고
지금까지 벡터 하나, 벡터 둘 사이의 관계(내적)를 봤다. 다음은 여러 벡터를 한꺼번에 변형하는 장치 — 행렬(matrix)로 간다. 임베딩을 만들고, 어텐션에서 Q·K·V를 뽑아내는 그 연산의 정체다. (행렬은 중학교에서 맛보므로 다음 장은 눈높이를 살짝 낮춰 시작한다.)