곡면 위에서 속도를 말하려면

여접벡터: 화살표를 받아 숫자를 내는 눈금자

성분 vθv^\theta는 화살표 vv에서 숫자 하나를 뽑아낸 것이다. 학습에서도 같은 일을 늘 한다. 매개변수를 어느 방향으로 움직일지 정하면, 그 방향으로 손실이 얼마나 빨리 변하는지를 숫자 하나로 잰다. 화살표를 넣고 숫자를 받는 일이 이렇게 거듭된다면, “화살표를 넣으면 숫자가 나오는 장치” 자체를 하나의 대상으로 다룰 수는 없을까?

구면 위 개미를 다시 보자. 적도 위 점 (θ,ϕ)=(π/2,0)(\theta, \phi) = (\pi/2, 0)에서 개미의 속도는 v=−∂θ+∂ϕv = -\partial_\theta + \partial_\phi, 바깥에서 보면 (0,1,1)(0, 1, 1)이었다. 이 화살표를 받아 "이 방향으로 가면 높이 z=cos⁡θz = \cos\theta가 얼마나 빨리 변하는가"를 돌려주는 장치를 생각하자. 이 장치를 dzdz라 적고 눈금자라 부른다(dzdz는 dd와 zz의 곱이 아니라 한 덩어리 이름이다. dd는 미분(differential)의 머리글자로, "zz가 변하는 빠르기를 재는 눈금자"라고 읽는다). 개미의 화살표를 넣으면 1이 나온다. 바깥에서 본 화살표의 높이 성분이 1이니 맞는 값이다. 개미의 좌표로도 확인할 수 있다. z=cos⁡θz = \cos\theta는 θ\theta가 1 늘 때 −sin⁡θ-\sin\theta, 적도에서는 −1-1만큼 변하고, 개미의 θ\theta 성분이 −1-1이니 (−1)×(−1)=1(-1) \times (-1) = 1이다.

눈금자는 화살표를 넣으면 숫자 하나가 나오고, 화살표를 두 배로 하면 숫자도 두 배가 된다. 가장 단순한 눈금자는 성분을 그대로 읽는 것이다. dθd\theta는 화살표의 θ\theta 성분을 읽어 개미의 화살표에서 −1-1을 내고, dϕd\phi는 ϕ\phi 성분을 읽어 1을 낸다. 일반 좌표 (x1,…,xn)(x^1, \ldots, x^n)에서도 눈금자 dxidx^i는 ii번째 성분을 읽는다. 그러니 기저 화살표 ∂j\partial_j를 넣으면 i=ji = j일 때만 1이 나온다.

dxi(∂j)=δji={1i=j0i≠j \textcolor{#a100c1}{dx^i}\left(\textcolor{#1f77b4}{\partial_j}\right) = \delta^i_j = \begin{cases} 1 & i = j \\ 0 & i \neq j \end{cases}
∂j좌표 기저벡터 ∂/∂xj: xj 만 늘리는 방향dxi좌표 1-형식: 벡터를 받아 그 xi 성분을 읽어 내는 눈금자δji크로네커 델타 \begin{array}{ll} \textcolor{#1f77b4}{\partial_j} & \text{좌표 기저벡터 } \partial/\partial \textcolor{#1b9e77}{x^j} \text{: } \textcolor{#1b9e77}{x^j} \text{ 만 늘리는 방향} \\ \textcolor{#a100c1}{dx^i} & \text{좌표 1-형식: 벡터를 받아 그 } \textcolor{#1b9e77}{x^i} \text{ 성분을 읽어 내는 눈금자} \\ \delta^i_j & \text{크로네커 델타} \end{array}

이런 눈금자 하나하나에 이름을 붙인다.

눈금자를 그림으로 그리면 등고선 묶음이다. 화살표를 대어 몇 줄을 가로지르는지 센 것이 눈금자가 내는 숫자다. 등고선을 두 배로 촘촘하게 그리면 같은 화살표가 두 배로 많은 줄을 넘는다.

눈금자는 등고선 묶음 — (가) 등고선 값이 1씩 커지는 눈금자 df에 화살표 v를 대면 두 줄을 넘어 2가 나온다. (나) 등고선이 두 배로 촘촘한 눈금자 2df에는 같은 v가 네 줄을 넘어 4가 나온다
눈금자는 등고선 묶음 — (가) 등고선 값이 1씩 커지는 눈금자 df에 화살표 v를 대면 두 줄을 넘어 2가 나온다. (나) 등고선이 두 배로 촘촘한 눈금자 2df에는 같은 v가 네 줄을 넘어 4가 나온다

점마다 눈금자를 하나씩 매끄럽게 배정한 것은 1-형식이라 부른다(눈금자의 지도). 위의 dz\textcolor{#a100c1}{dz}처럼 함수 하나의 변화율을 재는 df\textcolor{#a100c1}{df}가 가장 흔한 예다.

ML에서: 그래디언트는 화살표가 아니라 눈금자

그래디언트(gradient)는 흔히 가장 가파른 방향의 벡터로 배운다. 그런데 손실 L\textcolor{#6b6b6b}{L}의 미분 dL\textcolor{#a100c1}{dL}은 방향 v\textcolor{#1f77b4}{v}를 받아 "그 방향으로 가면 손실이 얼마나 변하는가"를 돌려주는 눈금자다: dL(v)=∂L∂θivi\textcolor{#a100c1}{dL}(\textcolor{#1f77b4}{v}) = \frac{\partial \textcolor{#6b6b6b}{L}}{\partial \textcolor{#1b9e77}{\theta^i}} \textcolor{#1f77b4}{v^i}. PyTorch가 .grad에 담아 주는 숫자 묶음 ∂L/∂θi\partial \textcolor{#6b6b6b}{L}/\partial\textcolor{#1b9e77}{\theta^i}는 이 눈금자의 성분 dL(∂i)\textcolor{#a100c1}{dL}(\textcolor{#1f77b4}{\partial_i})이다.

눈금자의 성분은 화살표의 성분과 반대로 변한다. 표준편차 σ\textcolor{#1b9e77}{\sigma} 대신 s=log⁡σs = \log\textcolor{#1b9e77}{\sigma}로 좌표를 바꾸면 ∂L/∂s=σ ∂L/∂σ\partial \textcolor{#6b6b6b}{L}/\partial s = \textcolor{#1b9e77}{\sigma}\,\partial \textcolor{#6b6b6b}{L}/\partial\textcolor{#1b9e77}{\sigma}라서, σ=0.01\textcolor{#1b9e77}{\sigma} = 0.01에서 그래디언트 성분은 100분의 1로 줄어든다. 같은 자리에서 화살표 성분은 s˙=σ˙/σ\dot s = \dot{\textcolor{#1b9e77}{\sigma}}/\textcolor{#1b9e77}{\sigma}라 100배 커진다. 그런데 경사하강법의 한 걸음 θ←θ−η ∂L/∂θ\textcolor{#1b9e77}{\theta} \leftarrow \textcolor{#1b9e77}{\theta} - \eta\,\partial \textcolor{#6b6b6b}{L}/\partial\textcolor{#1b9e77}{\theta}(η\eta는 에타, 걸음 크기를 정하는 학습률)는 그래디언트라는 눈금자의 성분을 걸음이라는 화살표의 성분에 그대로 더한다. 성분이 서로 반대로 변하는 둘을 이렇게 섞으면 무슨 일이 생길까? 아래 문제 12에서 직접 걸어 보자.

문제 10 — 오르막 안내판

확인 등산로 안내판에 「이 구간은 1 km 갈 때마다 50 m 오른다」고 적혀 있다. (가) 0.2 km를 걸으면 몇 m 오르는가? (나) 거리를 m로 적으면, 걸음을 나타내는 숫자와 「거리 한 단위마다 오르는 높이」를 나타내는 숫자는 각각 얼마가 되는가? (다) 두 숫자는 각각 몇 배가 됐는가?

같이 풀기 세션 10

김민준 M01
김민준

(가)는 0.2×50=100.2 \times 50 = 10 m요. (나)는 km를 m로 바꾸면 숫자에 1000을 곱하니까 걸음은 200, 오르는 높이도 50×1000=50,00050 \times 1000 = 50{,}000이요.

선생님 T01
선생님

그 두 숫자로 (가)를 다시 계산하면요?

김민준 M07
김민준

200×50,000200 \times 50{,}000이면 1,000만 m… 에베레스트보다 천 배 넘게 높네요. 오르는 높이 쪽은 1000으로 나눠야 해요. 1 m마다 0.05 m, 그러면 200×0.05=10200 \times 0.05 = 10 m로 맞아요.

이서연 S01
이서연

걸음 숫자는 1000배, 「한 단위마다 오르는 높이」는 1000분의 1. 둘을 곱한 오르는 높이만 그대로야. 재는 단위가 작아지면 걸음 숫자는 커지고, 한 단위마다 재는 숫자는 작아져.

문제 11 — 눈금자 dθ를 동쪽 화살표에 대면

계산 평면의 점 (x,y)=(1,1)(\textcolor{#1b9e77}{x}, \textcolor{#1b9e77}{y}) = (1, 1)에서 극좌표 (r,θ)(\textcolor{#1b9e77}{r}, \textcolor{#1b9e77}{\theta})의 눈금자 dr\textcolor{#a100c1}{dr}, dθ\textcolor{#a100c1}{d\theta}를 dx\textcolor{#a100c1}{dx}, dy\textcolor{#a100c1}{dy}로 적어라(dθ=a dx+b dy\textcolor{#a100c1}{d\theta} = a\,\textcolor{#a100c1}{dx} + b\,\textcolor{#a100c1}{dy} 꼴). 그리고 동쪽을 가리키는 화살표 ∂x\textcolor{#1f77b4}{\partial_x}를 넣어 dr(∂x)\textcolor{#a100c1}{dr}(\textcolor{#1f77b4}{\partial_x}), dθ(∂x)\textcolor{#a100c1}{d\theta}(\textcolor{#1f77b4}{\partial_x})를 구하라.

같이 풀기 세션 11

이서연 S01
이서연

계산할 것도 없지 않아? 눈금자 dθ\textcolor{#a100c1}{d\theta}는 θ\textcolor{#1b9e77}{\theta} 성분만 읽고 ∂x\textcolor{#1f77b4}{\partial_x}는 x\textcolor{#1b9e77}{x} 방향이니까 dθ(∂x)=0\textcolor{#a100c1}{d\theta}(\textcolor{#1f77b4}{\partial_x}) = 0이야. 위 식에서 i≠ji \neq j면 0이었잖아.

김민준 M01
김민준

나는 식으로 해 볼게. x=rcos⁡θ\textcolor{#1b9e77}{x} = \textcolor{#1b9e77}{r}\cos\textcolor{#1b9e77}{\theta}, y=rsin⁡θ\textcolor{#1b9e77}{y} = \textcolor{#1b9e77}{r}\sin\textcolor{#1b9e77}{\theta}에서 dθ=∂x∂θdx+∂y∂θdy=−rsin⁡θ dx+rcos⁡θ dy\textcolor{#a100c1}{d\theta} = \frac{\partial \textcolor{#1b9e77}{x}}{\partial \textcolor{#1b9e77}{\theta}}\textcolor{#a100c1}{dx} + \frac{\partial \textcolor{#1b9e77}{y}}{\partial \textcolor{#1b9e77}{\theta}}\textcolor{#a100c1}{dy} = -\textcolor{#1b9e77}{r}\sin\textcolor{#1b9e77}{\theta}\,\textcolor{#a100c1}{dx} + \textcolor{#1b9e77}{r}\cos\textcolor{#1b9e77}{\theta}\,\textcolor{#a100c1}{dy}, 이 점에서 −dx+dy-\textcolor{#a100c1}{dx} + \textcolor{#a100c1}{dy}야. ∂x\textcolor{#1f77b4}{\partial_x}를 넣으면 −1-1이지.

선생님 T01
선생님

답이 0과 −1-1로 갈렸네요. 눈금자 dθ\textcolor{#a100c1}{d\theta}에 θ\textcolor{#1b9e77}{\theta} 방향 화살표 ∂θ\textcolor{#1f77b4}{\partial_\theta}를 넣으면 무엇이 나와야 하죠? 이 점에서 ∂θ\textcolor{#1f77b4}{\partial_\theta}는 (−1,1)(-1, 1)이에요.

김민준 M06
김민준

1이 나와야죠. 제 식에 넣으면 −(−1)+1=2-(-1) + 1 = 2… 틀렸네요. 옛 좌표를 새 좌표로 미분한 걸 썼어요. θ\textcolor{#1b9e77}{\theta}를 x\textcolor{#1b9e77}{x}, y\textcolor{#1b9e77}{y}로 미분해야 하니까 dθ=−yr2dx+xr2dy=−12dx+12dy\textcolor{#a100c1}{d\theta} = -\frac{\textcolor{#1b9e77}{y}}{\textcolor{#1b9e77}{r}^2}\textcolor{#a100c1}{dx} + \frac{\textcolor{#1b9e77}{x}}{\textcolor{#1b9e77}{r}^2}\textcolor{#a100c1}{dy} = -\tfrac12\textcolor{#a100c1}{dx} + \tfrac12\textcolor{#a100c1}{dy}. 이러면 ∂θ\textcolor{#1f77b4}{\partial_\theta}를 넣어 12+12=1\tfrac12 + \tfrac12 = 1이 맞고, ∂x\textcolor{#1f77b4}{\partial_x}를 넣으면 −12-\tfrac12예요.

이서연 S06
이서연

0이 아니네요. 제가 쓴 δji\delta^i_j는 같은 좌표계의 눈금자와 화살표끼리의 약속이었어요. ∂x\textcolor{#1f77b4}{\partial_x}는 (x,y)(\textcolor{#1b9e77}{x}, \textcolor{#1b9e77}{y}) 좌표계의 화살표라, dθ\textcolor{#a100c1}{d\theta}가 읽으면 0이 아니에요. dr=xrdx+yrdy=12(dx+dy)\textcolor{#a100c1}{dr} = \frac{\textcolor{#1b9e77}{x}}{\textcolor{#1b9e77}{r}}\textcolor{#a100c1}{dx} + \frac{\textcolor{#1b9e77}{y}}{\textcolor{#1b9e77}{r}}\textcolor{#a100c1}{dy} = \tfrac{1}{\sqrt2}(\textcolor{#a100c1}{dx} + \textcolor{#a100c1}{dy})라서 dr(∂x)=1/2\textcolor{#a100c1}{dr}(\textcolor{#1f77b4}{\partial_x}) = 1/\sqrt2고요.

선생님 T01
선생님

두 숫자 1/21/\sqrt2와 −12-\tfrac12, 어디서 본 것 같지 않아요? 같은 점 (1,1)(1, 1)의 동쪽 화살표를 극좌표 기저로 나누면 v=12∂r−12∂θ\textcolor{#1f77b4}{v} = \tfrac{1}{\sqrt2}\textcolor{#1f77b4}{\partial_r} - \tfrac12\textcolor{#1f77b4}{\partial_\theta}였어요.

김민준 M01
김민준

성분이 곧 눈금자가 읽은 값이었네요. 화살표에서 θ\textcolor{#1b9e77}{\theta} 성분을 뽑아내는 장치가 dθ\textcolor{#a100c1}{d\theta}였어요. 제 실수는 동쪽 화살표 문제에서 서연이가 야코비 행렬을 거꾸로 썼던 거랑 모양만 다르지 같은 실수고요.

이서연 S01
이서연

선형대수에서 쌍대 기저가 좌표를 읽어 내는 함수였던 거랑 같아. 기저를 바꾸면 쌍대 기저도 같이 바꿔야 해.

문제 12 — 같은 학습률, 다른 좌표

킬러 손실 L(σ)=(σ−0.5)2\textcolor{#6b6b6b}{L}(\textcolor{#1b9e77}{\sigma}) = (\textcolor{#1b9e77}{\sigma} - 0.5)^2을 표준편차 σ=0.1\textcolor{#1b9e77}{\sigma} = 0.1에서 줄이려 한다. 학습률 0.1로 경사하강 한 걸음을 (가) σ\textcolor{#1b9e77}{\sigma} 좌표에서 (나) s=log⁡σs = \log\textcolor{#1b9e77}{\sigma} 좌표에서 내디딘다. 각 걸음 뒤 σ\textcolor{#1b9e77}{\sigma}는 얼마인가? 두 걸음이 σ\textcolor{#1b9e77}{\sigma}를 움직인 크기의 비는?

같이 풀기 세션 12

김민준 M01
김민준

같은 손실에 같은 학습률이니까 같은 곳에 가겠죠. 코드로 확인해 볼게요… σ\textcolor{#1b9e77}{\sigma} 좌표에서는 0.18로 가는데, ss 좌표에서는 0.1008이에요. 백 배 가까이 차이 나요.

선생님 T01
선생님

두 좌표에서 그래디언트 성분부터 견줘 볼까요? ∂L/∂σ\partial\textcolor{#6b6b6b}{L}/\partial\textcolor{#1b9e77}{\sigma}는요?

김민준 M01
김민준

2(0.1−0.5)=−0.82(0.1 - 0.5) = -0.8이라, σ\textcolor{#1b9e77}{\sigma} 좌표에서는 σ\textcolor{#1b9e77}{\sigma}가 0.1×0.8=0.080.1 \times 0.8 = 0.08 커져요.

이서연 S01
이서연

ss 좌표에서는 ∂L/∂s=σ ∂L/∂σ=−0.08\partial\textcolor{#6b6b6b}{L}/\partial s = \textcolor{#1b9e77}{\sigma}\,\partial\textcolor{#6b6b6b}{L}/\partial\textcolor{#1b9e77}{\sigma} = -0.08이야. 눈금자 성분이라 σ\textcolor{#1b9e77}{\sigma}배로 작아졌어. 그래서 ss 걸음은 0.008.

선생님 T01
선생님

ss로 0.008 가면 σ\textcolor{#1b9e77}{\sigma}로는 얼마를 간 걸까요?

이서연 S06
이서연

화살표 성분은 거꾸로 σ\textcolor{#1b9e77}{\sigma}를 곱해 돌아오니까 0.1×0.008=0.00080.1 \times 0.008 = 0.0008이에요. 눈금자라서 한 번 σ\textcolor{#1b9e77}{\sigma}배, 화살표라서 또 한 번 σ\textcolor{#1b9e77}{\sigma}배, 합쳐 σ2=0.01\textcolor{#1b9e77}{\sigma}^2 = 0.01배요. 코드의 0.1008도 0.1에서 0.0008 간 거고요.

김민준 M07
김민준

아까 오르막 문제에서 제가 한 실수랑 같네요. 「한 단위마다 오르는 높이」는 단위를 바꾸면 거꾸로 변해야 하는데 걸음처럼 다뤘어요. 경사하강법은 그래디언트라는 눈금자 성분을 화살표 성분처럼 그대로 더하니까, 좌표를 바꾸면 걸음이 달라지는 거였어요.

선생님 T01
선생님

그래요. 눈금자를 화살표로 바꾸는 규칙을 따로 정해 두지 않았으니, 어느 좌표를 골랐느냐가 그 규칙 노릇을 대신한 셈이에요.