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

여접벡터: 화살표를 받아 숫자를 내는 함수

성분 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의 변화율을 재는 장치"라고 읽는다). 화살표 vv를 dzdz에 넣으면 1이 나오는데, 바깥에서 본 화살표의 높이 성분이 1이니 맞는 값이다. 구면좌표 (θ,ϕ)(\theta, \phi)로도 확인할 수 있다. z=cos⁡θz = \cos\theta는 θ\theta가 1 늘 때 −sin⁡θ-\sin\theta, 적도에서는 −1-1만큼 변하고, vv의 θ\theta 성분이 −1-1이니 (−1)×(−1)=1(-1) \times (-1) = 1이다.

dzdz 같은 장치는 화살표를 넣으면 숫자 하나가 나오고, 화살표를 두 배로 하면 숫자도 두 배가 된다. 가장 단순한 것은 성분을 그대로 읽는 장치다. dθd\theta는 화살표의 θ\theta 성분을 읽어 vv에서 −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\textcolor{#a100c1}{dL}의 성분 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의 그림. 「1 km 갈 때마다 50 m 오른다」는 안내판과 그 구간의 오르막, 물음의 자리 0.2 km
문제 10의 그림. 「1 km 갈 때마다 50 m 오른다」는 안내판과 그 구간의 오르막, 물음의 자리 0.2 km

같이 풀기 세션 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})의 여접벡터(1-형식) 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의 그림. 평면의 점 (1, 1)에서 동쪽을 가리키는 화살표 와, 그 둘레의  등고선(원)과  등고선(원점에서 뻗는 반직선)
문제 11의 그림. 평면의 점 (1, 1)에서 동쪽을 가리키는 화살표 ∂x\textcolor{#1f77b4}{\partial_x}와, 그 둘레의 r\textcolor{#1b9e77}{r} 등고선(원)과 θ\textcolor{#1b9e77}{\theta} 등고선(원점에서 뻗는 반직선)

같이 풀기 세션 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이야. dxi(∂j)=δji\textcolor{#a100c1}{dx^i}(\textcolor{#1f77b4}{\partial_j}) = \delta^i_j 식에서 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이 아니에요.

선생님 T01
선생님

그럼 dr\textcolor{#a100c1}{dr}은요? 민준 학생이 고친 방법대로 해 볼래요?

이서연 S01
이서연

r\textcolor{#1b9e77}{r}을 x\textcolor{#1b9e77}{x}, y\textcolor{#1b9e77}{y}로 미분하면 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}였어요. 제 실수는 문제 8(동쪽 화살표를 극좌표로)에서 서연이가 자코비안을 거꾸로 썼던 거랑 모양만 다르지 같은 실수고요.

이서연 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의 그림. 손실 과 출발점 . 아래 줄에는 같은 자리를 로 읽은 눈금을 함께 그렸다
문제 12의 그림. 손실 L(σ)=(σ−0.5)2\textcolor{#6b6b6b}{L}(\textcolor{#1b9e77}{\sigma}) = (\textcolor{#1b9e77}{\sigma} - 0.5)^2과 출발점 σ=0.1\textcolor{#1b9e77}{\sigma} = 0.1. 아래 줄에는 같은 자리를 s=log⁡σs = \log\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 좌표에서는 연쇄법칙부터 써 볼게. σ=es\textcolor{#1b9e77}{\sigma} = e^s니까 dσ/dsd\textcolor{#1b9e77}{\sigma}/ds는 σ\textcolor{#1b9e77}{\sigma} 자신이야. 그러면 ∂L/∂s=σ ∂L/∂σ=−0.08\partial\textcolor{#6b6b6b}{L}/\partial s = \textcolor{#1b9e77}{\sigma}\,\partial\textcolor{#6b6b6b}{L}/\partial\textcolor{#1b9e77}{\sigma} = -0.08.

김민준 M01
김민준

같은 손실인데 그래디언트가 열 배 작아졌네?

이서연 S01
이서연

그래디언트는 여접벡터 성분이라 σ\textcolor{#1b9e77}{\sigma}배로 작아진 거야. 그래서 ss 좌표의 스텝은 0.008.

선생님 T01
선생님

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

이서연 S01
이서연

ss가 조금 움직이면 σ\textcolor{#1b9e77}{\sigma}는 그 σ\textcolor{#1b9e77}{\sigma}배만큼 움직이니까, 화살표 성분은 σ\textcolor{#1b9e77}{\sigma}를 곱해 돌아와요. 0.1×0.008=0.00080.1 \times 0.008 = 0.0008이에요.

김민준 M01
김민준

그럼 σ\textcolor{#1b9e77}{\sigma}가 두 번 곱해진 거야?

이서연 S06
이서연

응. 그래디언트가 여접벡터라서 한 번 σ\textcolor{#1b9e77}{\sigma}배, 스텝이 접선벡터라서 또 한 번 σ\textcolor{#1b9e77}{\sigma}배, 합쳐 σ2=0.01\textcolor{#1b9e77}{\sigma}^2 = 0.01배요. 코드의 0.1008도 0.1에서 0.0008 간 거고요.

김민준 M07
김민준

문제 10 오르막 안내판에서 제가 한 실수랑 같네요. 「한 단위마다 오르는 높이」는 단위를 바꾸면 거꾸로 변해야 하는데 걸은 거리처럼 다뤘어요. 경사하강법은 여접벡터인 그래디언트의 성분을 접선벡터 성분처럼 그대로 더하니까, 좌표를 바꾸면 스텝이 달라지는 거였어요.

선생님 T01
선생님

그래요. 여접벡터를 접선벡터로 바꾸는 규칙을 따로 정해 두지 않았으니, 어느 좌표를 골랐느냐가 그 규칙 노릇을 대신한 거예요.