거리와 유사도 — 노름과 내적이 재는 것

2026-04-22

1편에서 데이터를 벡터로 놓았습니다. 그리고 슬쩍 "두 점이 얼마나 다른가는 차 벡터의 노름으로 잰다", "두 벡터가 얼마나 닮았나는 내적으로 잰다"고 하고 넘어갔죠. 그런데 여기엔 아직 안 물은 질문이 있습니다 — '가깝다'와 '닮았다'를 재는 자는 정말 하나뿐일까?

아닙니다. 자는 여럿이고, 어떤 자를 고르느냐가 모델의 성격을 바꿉니다.

규칙 — '가깝다·닮았다'를 재는 방법은 하나가 아니다. 어떤 자(노름·유사도)를 고르느냐가 곧 모델의 성격을 정한다.

이 편에서 그 자들을 밑바닥부터 세우고, 왜 선택이 결과를 가르는지를 유도합니다.

노름의 여러 얼굴

1편의 노름은 성분을 제곱해 더하고 뿌리를 씌운 것이었습니다. 하지만 그건 한 가족의 한 명일 뿐이에요. 일반화하면 pp-노름이 됩니다.

xp=(i=1nxip)1/p,p1\|\mathbf{x}\|_p = \left( \sum_{i=1}^{n} |x_i|^p \right)^{1/p}, \qquad p \ge 1

pp를 갈아 끼우면 자가 바뀝니다.

  • p=2p = 2: 유클리드 노름(L2L_2). 우리가 아는 직선 거리죠. x2=xi2\|\mathbf{x}\|_2 = \sqrt{\sum x_i^2}.
  • p=1p = 1: 맨해튼 노름(L1L_1). 성분의 절댓값을 그냥 더합니다. x1=xi\|\mathbf{x}\|_1 = \sum |x_i|. 격자로 된 도시에서 대각선으로 못 가고 블록을 따라 걷는 거리라 '맨해튼'입니다.
  • pp \to \infty: 체비쇼프 노름(LL_\infty). 가장 큰 성분 하나가 지배합니다. x=maxixi\|\mathbf{x}\|_\infty = \max_i |x_i|.

같은 벡터 (3,4)(3, 4)를 재도 자에 따라 값이 다릅니다 — L2L_2로는 55, L1L_1으로는 77, LL_\infty로는 44죠. 하나의 벡터에 하나의 크기가 아니라, 자마다 다른 크기인 겁니다.

단위원의 모양이 성격을 정한다

노름들의 차이를 한눈에 보는 방법이 있습니다 — 단위원, 즉 "크기가 정확히 1인 점들의 모임" {x:x=1}\{\mathbf{x} : \|\mathbf{x}\| = 1\}의 모양을 보는 거예요. R2\mathbb{R}^2에서 이렇게 갈립니다.

  • L2L_2의 단위원은 우리가 아는 동그란 원입니다.
  • L1L_1의 단위원은 축을 꼭짓점으로 하는 마름모(45도 돌린 정사각형)입니다.
  • LL_\infty의 단위원은 축에 평행한 정사각형입니다.

이 모양 차이가 왜 중요할까요. 뒤에서 다룰 **정규화(regularization)**의 핵심이 바로 여기 있기 때문입니다. 학습에서 "노름을 작게 유지하라"는 제약을 걸면, 해는 그 단위원(정확히는 노름이 일정한 경계) 위에서 찾아집니다. 그런데 L1L_1의 마름모는 꼭짓점이 축 위에 뾰족하게 서 있어요. 그래서 해가 그 꼭짓점에서 걸리기 쉽고, 꼭짓점은 "한 좌표만 0이 아니고 나머지는 0"인 점입니다 — 즉 L1L_1희소한(sparse) 해, 특징을 골라내는 해를 만듭니다. 반면 L2L_2의 매끈한 원은 특정 축을 편애하지 않아 값을 고루 줄이죠.

지금은 직관만 심어 둡니다("마름모의 뾰족한 코너가 축 위에 있어 희소성을 낳는다"). 왜 그 코너에서 해가 만나는지는 최적화 편에서 등고선과 함께 제대로 유도하겠습니다. 붙잡을 것은 하나 — 자의 기하학적 모양이 곧 학습이 선호하는 해의 성격이라는 것.

규칙 회수 — 노름은 하나가 아니라 pp로 이어진 가족이고, 각 노름의 단위원 모양(L1L_1 마름모·L2L_2 원·LL_\infty 정사각형)이 학습이 선호하는 해의 성격(희소 대 고른)을 가른다.

거리가 '자'가 되려면 — 거리 공리

노름으로 거리를 정의했지만(d(x,y)=xyd(\mathbf{x}, \mathbf{y}) = \|\mathbf{x} - \mathbf{y}\|), 아무 함수나 '거리'라 부를 순 없습니다. 자격이 있어요. 함수 dd가 **거리(metric)**가 되려면 네 조건을 만족해야 합니다.

(1)d(x,y)0(비음수)(2)d(x,y)=0    x=y(동일성)(3)d(x,y)=d(y,x)(대칭)(4)d(x,z)d(x,y)+d(y,z)(삼각부등식)\begin{aligned} &\text{(1)}\quad d(\mathbf{x}, \mathbf{y}) \ge 0 &&(\text{비음수}) \\ &\text{(2)}\quad d(\mathbf{x}, \mathbf{y}) = 0 \iff \mathbf{x} = \mathbf{y} &&(\text{동일성}) \\ &\text{(3)}\quad d(\mathbf{x}, \mathbf{y}) = d(\mathbf{y}, \mathbf{x}) &&(\text{대칭}) \\ &\text{(4)}\quad d(\mathbf{x}, \mathbf{z}) \le d(\mathbf{x}, \mathbf{y}) + d(\mathbf{y}, \mathbf{z}) &&(\text{삼각부등식}) \end{aligned}

앞의 셋은 당연해 보이지만, 진짜 일하는 건 넷째 삼각부등식입니다 — "질러가는 게 돌아가는 것보다 멀지 않다". 이게 있어야 거리가 우리 직관대로 행동하고, 최근접 이웃 탐색 같은 알고리즘이 가지치기로 빨라질 수 있어요(직접 안 재도 삼각부등식으로 하한을 알 수 있으니까요). L1,L2,LL_1, L_2, L_\infty는 모두 이 넷을 만족하는 진짜 거리입니다. 이 자격 조건을 기억해 두면, 뒤에서 "이건 유사도지 거리가 아니다"라는 구분이 왜 중요한지 보입니다.

코시-슈바르츠 — 코사인이 -1과 1 사이인 이유

이제 '닮음' 쪽으로 갑니다. 1편에서 코사인 유사도를

cosθ=x,yxy\cos\theta = \frac{\langle \mathbf{x}, \mathbf{y} \rangle}{\|\mathbf{x}\|\,\|\mathbf{y}\|}

로 정의했는데, 여기서 한 가지를 그냥 넘어갔습니다 — 왜 이 값이 진짜 코사인처럼 [1,1][-1, 1] 안에 있는가? 그걸 보장하는 것이 선형대수의 아름다운 부등식, 코시-슈바르츠 부등식입니다.

x,yxy|\langle \mathbf{x}, \mathbf{y} \rangle| \le \|\mathbf{x}\|\,\|\mathbf{y}\|

즉 내적의 절댓값은 두 노름의 곱을 결코 넘지 못합니다. 양변을 xy\|\mathbf{x}\|\|\mathbf{y}\|로 나누면 곧바로

1x,yxy1-1 \le \frac{\langle \mathbf{x}, \mathbf{y} \rangle}{\|\mathbf{x}\|\,\|\mathbf{y}\|} \le 1

이 나오죠. 그래서 이 값을 안심하고 '코사인'이라 부를 수 있는 겁니다. 그리고 등호는 두 벡터가 평행할 때만 성립해요 — 방향이 완전히 같으면 +1+1, 정반대면 1-1. 코사인 유사도가 "방향이 얼마나 일치하는가"를 [1,1][-1, 1]로 깔끔히 말해 주는 근거가 바로 이 부등식입니다. 학술적으로 보면, 코사인 유사도는 임의로 정한 편법이 아니라 코시-슈바르츠가 뒷받침하는 잘 정의된 양인 셈이죠.

규칙 회수 — 코시-슈바르츠 부등식 x,yxy|\langle \mathbf{x}, \mathbf{y}\rangle| \le \|\mathbf{x}\|\|\mathbf{y}\|이 코사인 유사도를 [1,1][-1,1]에 가둔다. 코사인은 편법이 아니라 부등식이 보장하는 양이다.

내적의 기하 — 투영

내적이 유사도만 재는 건 아닙니다. 더 근본적으로, 내적은 **투영(projection)**을 정의합니다 — 한 벡터를 다른 벡터의 방향 위로 '내리는' 것이죠. 벡터 v\mathbf{v}u\mathbf{u} 방향 위에 투영한 결과는

projuv=u,vu,uu\text{proj}_{\mathbf{u}} \mathbf{v} = \frac{\langle \mathbf{u}, \mathbf{v} \rangle}{\langle \mathbf{u}, \mathbf{u} \rangle}\, \mathbf{u}

입니다. 직관은 이렇습니다 — v\mathbf{v}에 햇빛을 수직으로 비출 때 u\mathbf{u}라는 바닥에 지는 그림자. 이 그림자의 길이(부호 있는 스칼라 투영)는 u,vu\frac{\langle \mathbf{u}, \mathbf{v}\rangle}{\|\mathbf{u}\|}이고요.

투영이 왜 AI에서 중요할까요. 한 벡터를 여러 방향의 성분으로 분해하는 것이 여기서 나오기 때문입니다. 데이터를 몇 개의 축 방향 성분으로 쪼개 표현하고(주성분 분석), 관측을 모델이 설명할 수 있는 공간 위로 내려 오차를 최소화하고(최소제곱 회귀 — 이게 5편 선형회귀의 기하학적 핵심이 됩니다), 에이전트 시리즈에서 스친 어텐션이 값(value) 벡터들을 관련도로 가중해 합치는 것도 — 전부 투영과 내적의 언어로 쓰입니다. 내적 하나가 '얼마나 닮았나'를 넘어 '어떻게 분해되나'까지 말하는 거죠.

방향과 위치를 잇다 — 단위 벡터에서의 관계

여기서 이 편의 작은 정리를 하나 증명합니다. 유사도를 재는 두 방식 — **코사인(방향)**과 유클리드 거리(위치) — 은 따로 노는 것처럼 보이지만, 벡터를 단위 길이로 맞추면 하나로 이어집니다.

u,v\mathbf{u}, \mathbf{v}가 단위 벡터라 합시다(u=v=1\|\mathbf{u}\| = \|\mathbf{v}\| = 1). 유클리드 거리의 제곱을 내적으로 풀어 보면,

uv2=uv, uv=u,u2u,v+v,v=12u,v+1=2(1cosθ)\begin{aligned} \|\mathbf{u} - \mathbf{v}\|^2 &= \langle \mathbf{u} - \mathbf{v},\ \mathbf{u} - \mathbf{v} \rangle \\ &= \langle \mathbf{u}, \mathbf{u} \rangle - 2\langle \mathbf{u}, \mathbf{v} \rangle + \langle \mathbf{v}, \mathbf{v} \rangle \\ &= 1 - 2\langle \mathbf{u}, \mathbf{v} \rangle + 1 \\ &= 2\,\bigl(1 - \cos\theta\bigr) \end{aligned}

깔끔한 결과입니다 — 단위 벡터에서 **유클리드 거리의 제곱은 정확히 2(1cosθ)2(1 - \cos\theta)**예요. 코사인 유사도가 클수록(cosθ1\cos\theta \to 1) 거리는 0으로, 작을수록 거리는 멀어집니다. 둘은 단조롭게 이어져 있죠. 이것이 실무에서 중요한 이유가 있습니다 — 임베딩 벡터를 단위 길이로 정규화해 두면, "코사인으로 가장 닮은 것 찾기"와 "유클리드로 가장 가까운 것 찾기"가 같은 순위를 준다는 뜻이거든요. 벡터 검색 엔진들이 정규화 후 둘을 바꿔 쓰는 근거가 이 한 줄 유도에 있습니다.

규칙 회수 — 단위 벡터에서 uv2=2(1cosθ)\|\mathbf{u}-\mathbf{v}\|^2 = 2(1-\cos\theta). 방향(코사인)과 위치(유클리드)는 정규화하면 단조롭게 같은 순위를 매긴다.

정직하게 — 거리는 생각보다 미묘하다

자를 손에 넣었지만, 그 자를 대는 데는 함정이 많습니다.

  • 거리는 단위·스케일에 휘둘린다. 1편의 집 벡터 (84,3,12)(84, 3, 12)를 떠올려 보세요. 면적을 m2\text{m}^2가 아니라 cm2\text{cm}^2로 재면 그 성분만 만 배로 커져, 유클리드 거리를 거의 면적 혼자 결정해 버립니다. 그래서 실무에선 특징마다 평균을 빼고 표준편차로 나누는 **표준화(standardization)**가 거의 필수예요. "무엇이 가까운가"는 "어떤 단위로 쟀는가"에 달려 있습니다.
  • 고차원에서는 거리가 서로 비슷해진다. 1편에서 예고한 '고차원의 저주'의 한 얼굴입니다 — 차원이 커지면 가장 가까운 점과 가장 먼 점의 거리 차이가 상대적으로 줄어, 모든 점이 엇비슷하게 멀어 보이는 거리 집중(distance concentration) 현상이 생깁니다. 그러면 "가장 가까운 이웃"이라는 개념 자체가 흐릿해져요. 고차원에서 유클리드 거리보다 코사인이 자주 쓰이는 데는 이런 배경도 있습니다.
  • 코사인은 크기를 버린다 — 득이자 실. 코사인은 방향만 보고 크기를 무시합니다. 문서의 길이나 단어 빈도의 절대량이 유사도를 흔들지 않게 해 주는 장점이 있지만(그래서 텍스트 검색에 즐겨 쓰이죠), 크기 자체가 정보일 때는 그걸 버리는 손실이기도 합니다. 무엇을 재고 싶은지에 따라 골라야 해요.
  • 내적은 유사도지 거리가 아니다. 위에서 거리 공리를 세운 이유가 여기 있습니다. 내적(과 코사인 유사도)은 클수록 닮은 것이라 방향이 거리와 반대이고, 삼각부등식 같은 공리를 만족하지도 않습니다. '유사도'와 '거리'를 뭉뚱그리면 알고리즘이 조용히 틀리니, 지금 무엇을 손에 들었는지 늘 분명히 해야 합니다.

이 넷을 알고 대면, 거리와 유사도는 데이터의 기하를 읽는 정밀한 도구가 됩니다.

정리 — 무엇으로 재느냐가 무엇을 보느냐다

  • 노름의 가족: pp-노름 하나로 L1L_1(맨해튼)·L2L_2(유클리드)·LL_\infty(체비쇼프)가 나온다. 하나의 벡터에 자마다 다른 크기.
  • 단위원의 모양: L1L_1 마름모·L2L_2 원·LL_\infty 정사각형. 그 모양이 학습이 선호하는 해의 성격(희소 대 고른)을 가른다.
  • 거리 공리: 비음수·동일성·대칭·삼각부등식. 넷째가 거리를 직관대로 행동하게 하고 알고리즘을 빠르게 한다.
  • 코시-슈바르츠: x,yxy|\langle \mathbf{x},\mathbf{y}\rangle| \le \|\mathbf{x}\|\|\mathbf{y}\|이 코사인을 [1,1][-1,1]에 가둔다.
  • 투영: 내적은 유사도를 넘어 한 벡터를 다른 방향으로 분해한다. 최소제곱·주성분·어텐션의 씨앗.
  • 방향과 위치: 단위 벡터에서 uv2=2(1cosθ)\|\mathbf{u}-\mathbf{v}\|^2 = 2(1-\cos\theta) — 정규화하면 코사인과 유클리드가 같은 순위.
  • 정직하게: 거리는 스케일에 휘둘려 표준화가 필요하고, 고차원에선 거리가 집중되며, 코사인은 크기를 버리고, 내적은 유사도지 거리가 아니다.

다음 편에서는 자리를 옮겨 확률로 갑니다 — 데이터에 깃든 불확실성을 다루는 언어로, 분포·기댓값·베이즈 정리를 밑바닥부터 세웁니다. 벡터가 '무엇을 아는가'의 언어였다면, 확률은 '무엇을 모르는가'의 언어입니다.

핵심 한 줄 — 무엇으로 재느냐가 무엇을 보느냐를 정한다. 노름은 하나가 아니라 가족이고 그 모양이 해의 성격을 가르며, 코사인은 코시-슈바르츠가 보장하는 방향의 유사도이고, 단위 벡터에서 방향과 위치는 하나로 이어진다 — 단, 유사도와 거리를 뭉뚱그리지 마라.