접선공간이 벡터공간이라는 것은 알았다. 하지만 출발 문제의 개미(구면 밖으로 나가지 않고 구면 위만 기어가는 관찰자)가 "내 속도는 이것"이라고 말하려면 숫자로 적어야 한다. 구면 안에서만 사는 개미는 x,y,z를 모르고 자기 좌표만 아는데, 좌표만 가지고 화살표에 이름을 붙일 수 있을까?
구면의 좌표는 둘이다. 북극에서 잰 각 θ(여위도)와 경도 ϕ. 지리의 위도는 적도에서 재지만, 수학의 구면좌표는 위도선의 반지름이 sinθ 하나로 적혀 식이 간단해지도록 북극에서 잰다. 북위 60도는 θ=30°이고, 이름만 다를 뿐 같은 자리다. 경도 ϕ만 0.01 늘리고 θ는 그대로 두면 점은 동쪽으로 조금 움직이는데, 적도에서는 거의 정확히 0.01만큼, 북극에서 30도 떨어진 곳(θ=30°)에서는 0.005만큼 움직인다. 같은 "경도 0.01"이라도 위도에 따라 실제 거리가 sinθ배로 줄어든다. 이렇게 좌표 하나만 조금 늘릴 때 점이 움직이는 화살표를 그 좌표의 기저 화살표라 부른다. 경도의 기저 화살표 ∂ϕ는 길이가 sinθ다. 좌표마다 하나씩 이런 화살표가 있고, 두 극을 뺀 점에서는 그 점의 어떤 속도든 "θ 화살표 몇 개와 ϕ 화살표 몇 개"로 적을 수 있다.
구면의 좌표 기저 화살표. 남쪽을 가리키는 ∂θ(주황)는 어디서나 길이 1이고, 동쪽을 가리키는 ∂φ(파랑)는 적도에서 길이 1, 북극에서 30° 떨어진 곳(θ = 30°)에서 길이 0.5다. 같은 경도 한 칸이 극에 가까울수록 짧은 거리가 된다
좌표가 여럿일 때 쓰는 표기 세 가지를 먼저 풀어 둔다. 좌표는 x1,x2,…처럼 번호를 위에 붙여 xi라 적는데, 이 위첨자는 거듭제곱이 아니라 몇 번째 좌표인지 알려 주는 번호다. 좌표 xi의 기저 화살표는 ∂i라 적는다. 곱셈이 아니라 한 덩어리 이름이고, 그 방향으로 함수가 변하는 비율을 재는 일이 곧 편미분 ∂/∂xi라서 미분 기호를 빌려 쓴다. 그리고 vi∂i처럼 같은 첨자가 위와 아래에 한 번씩 나오면 그 첨자에 대해 모두 더한다고 약속한다(아인슈타인 합 규약).
좌표 기저 (좌표 한 칸 화살표 / Coordinate Basis): 좌표 xi 하나만 늘리고 나머지 좌표는 그대로 둘 때 점이 움직이는 방향의 접선벡터 ∂i=∂/∂xi들의 모임. 길이가 1이라는 보장은 없다.
접선벡터를 성분으로 적은 식 v=vi∂i처럼 합 기호 ∑ 없이 더하기를 뜻하는 약속은 1916년 알베르트 아인슈타인이 일반 상대성 이론을 다루며 들여왔다. 시공간의 좌표 넷에 첨자가 둘 셋씩 붙은 양을 다루다 보니, 그의 식에는 같은 첨자를 좌표 넷에 걸쳐 더하는 항이 가득했다. 그는 뒤에 친구에게 「수학에서 큰 발견을 했다. 두 번 나오는 첨자에 대해 더해야 할 때마다 합 기호를 지워 버렸다」고 농담했다고 전해진다. 이 책도 그 약속을 따라, 같은 첨자가 위와 아래에 한 번씩 나오면 합 기호가 없어도 더한다.
좌표를 바꾸면 성분이 바뀐다
경도 한 칸은 위도에 따라 길이가 달랐는데, 그렇다면 같은 화살표를 다른 좌표로 읽으면 성분은 어떻게 바뀔까? 좌표가 하나뿐인 가장 단순한 경우부터 보자. 로그 좌표를 고른 것은, ML에서 표준편차처럼 양수여야 하는 값을 적을 때 흔히 쓰는 좌표이기 때문이다.
양수 하나를 적는 좌표 x와, 그 로그를 적는 좌표 x~=logx가 있다고 하자. 같은 점을 가리키는 두 좌표다. x=2에서 x를 0.01 늘리면 x~는 log2.01−log2≈0.00499, 거의 0.005 늘어난다. x=2인 점에서는 x~가 x의 1/x=1/2배만큼 움직이므로, x 좌표로 성분이 1인 화살표는 x~ 좌표로는 성분이 1/2이다. 이 "1/2배"를 적어 둔 것이 자코비안(이 책의 비유로는 번역표)이다. 좌표가 여럿이면 자코비안은 "이 좌표를 조금 늘리면 저 좌표가 얼마나 변하는가"를 칸마다 적은 행렬이 되고, 성분은 이 행렬을 한 번 곱해 옮긴다.
앞에서 경도를 0.01 늘려 확인한 대로 ∂ϕ의 길이는 sinθ이므로, 기저벡터는 "좌표 1칸"이지 "길이 1"이 아니다.
이제 구면 위를 움직이는 점이 적도 위의 점 (θ,ϕ)=(π/2,0)을 지나며 곡선 γ(t)=(π/2−t,t)를 따라 북동쪽으로 간다고 하자. 좌표를 시간으로 미분하면 성분이 바로 나온다: θ˙=−1, ϕ˙=1. 그러므로 속도는 γ′(0)=−∂θ+∂ϕ이고, 이 점에서 ∂θ=(0,0,−1), ∂ϕ=(0,1,0)이므로 3차원 화살표로는 (0,1,1)이다.
검산해 보자. 곡선을 3차원 위치로 쓰면 (cos2t,costsint,sint)이고, 이것을 t=0에서 미분하면 정확히 (0,1,1)이 나온다. 성분 (−1,1)은 구면 안의 관찰자가 자기 좌표 (θ,ϕ)로 적은 속도이고, (0,1,1)은 바깥에서 본 같은 속도다.
구면 위의 한 점에 접선공간을 붙이고, 그 점을 지나는 곡선의 속도를 좌표 기저 ∂θ, ∂ϕ로 나누어 보는 위젯이다. 점을 북극 쪽으로 옮기면서 같은 성분 (vθ,vϕ)가 실제로 얼마나 빠른 속도가 되는지, 기저벡터 ∂ϕ가 어떻게 줄어드는지 지켜보자. 구면은 끌어서 돌려 볼 수 있다.
하늘을 올려다본 카메라와 짐벌 잠금
1인칭 3D 게임에서 고개를 끝까지 들어 하늘을 똑바로 올려다본 채 마우스를 좌우로 밀어 본 적이 있다면, 시선은 거의 그대로이고 화면만 제자리에서 빙글 도는 장면을 보았을 것이다. 그래서 많은 게임이 올려본 각을 90°까지 허락하지 않는다. 3D 그래픽 입문 자료 LearnOpenGL의 카메라 예제도 올려본 각을 −89°에서 89° 사이로 묶어 둔다. 이 막힘 뒤에도 방금 본 경도의 기저 화살표 ∂ϕ, 길이가 sinθ인 그 화살표가 있다.
카메라의 시선 방향은 길이 1인 화살표이니, 반지름 1인 구면 위의 점 하나로 볼 수 있다. 게임은 이 점을 마우스 가로 움직임이 바꾸는 좌우각과 세로 움직임이 바꾸는 올려본 각, 두 좌표로 적는다. 좌우각은 경도, 올려본 각은 위도와 같은 좌표인데, 올려본 각만큼 올라간 위도선은 반지름이 cos(올려본 각)인 원이라 좌우각의 좌표 기저 화살표도 길이가 cos(올려본 각)이 된다. 북극에서 잰 여위도 θ는 90° − (올려본 각)이므로, 좌우각의 기저 화살표 길이 cos(올려본 각)은 앞에서 본 경도의 기저 화살표 길이 sinθ와 같은 값이다. 마우스로 좌우각을 30° 돌리면 수평을 볼 때는 시선이 30° 움직이지만, 60°를 올려볼 때는 15°, 89°를 올려볼 때는 0.52°만 움직인다. 90°에서는 좌우각의 기저 화살표 길이가 0이 되어, 좌우각을 아무리 돌려도 시선은 꼼짝하지 않고 화면만 시선을 축으로 돈다. 구면의 북극에서 경도가 정해지지 않는 것과 같은 점이고, 게임은 시선이 그 점에 닿지 않도록 89°에서 멈춘다.
기저 화살표의 길이가 0이 되는 좌표는 실제 항법 장치에서 더 큰 골칫거리였다. 아폴로 우주선은 고리(짐벌) 세 개 안에 매단 관성 측정 장치가 잰 세 각도로 몸체의 자세를 읽었다. 세 고리의 각은 자세를 적는 좌표 세 개이고, 고리 하나만 조금 돌릴 때 몸체가 도는 축이 그 좌표의 기저 화살표다. 가운데 고리의 각이 0°이면 바깥 고리와 안쪽 고리의 축은 직각인데, 가운데 각이 커지면 두 축 사이의 각이 90° − (가운데 각)으로 좁아진다. 60°에서 30°, 85°에서 5°, 90°에서는 0°가 되어 두 축이 한 직선 위에 놓인다. 그러면 세 고리가 낼 수 있는 회전 방향이 둘뿐이라, 몸체가 남은 셋째 방향으로 돌면 고리가 따라갈 수 없다. 가운데 고리가 90°에 이르러 회전 방향 하나를 잃는 일을 짐벌 잠금(gimbal lock)이라 부른다.
90° 바로 앞에서도 탈이 난다. 몸체가 그 셋째 방향으로 초당 1°만 돌아도, 따라가려면 안쪽 고리가 초당 1/cos(가운데 각)도로 돌아야 한다. 가운데 각이 70°이면 초당 2.92°, 85°이면 11.47°, 89°이면 57.3°다. 기저 화살표 둘이 거의 겹쳐서, 셋째 방향을 만들려면 바깥 고리와 안쪽 고리를 엄청나게 크게 돌려 두 회전이 서로 거의 지워지게 해야 하는 것이다. 영어 위키백과가 옮긴 폴 피엘드(Paul Fjeld)의 설명에 따르면, 아폴로의 유도 컴퓨터는 가운데 고리가 70°에 이르면 「gimbal lock」 경고를 띄우고 85°에서는 장치를 얼렸다. 기술자들은 넷째 고리를 다는 대신 이 경고를 골랐고, 아폴로 11호의 마이클 콜린스는 달 착륙선이 내린 뒤 사령선에서 「크리스마스 선물로 넷째 짐벌을 보내 주면 어때요?」라고 농담했다.
왼쪽: 카메라의 시선 방향을 구면 위의 점으로 그리고, 마우스로 좌우각을 30° 돌렸을 때 시선이 움직인 호(파랑)를 올려본 각 0°, 60°, 89°에서 그렸다. 움직인 각은 30°, 15°, 0.52°로, 좌우각의 기저 화살표 길이 cos(올려본 각)을 따라 줄어든다. 오른쪽: 고리 세 개로 자세를 읽을 때, 몸체가 초당 1° 도는 것을 따라가려고 안쪽 고리가 돌아야 하는 회전 속도(°/초). 가운데 고리의 각이 90°에 다가가면 1/cos(가운데 각)으로 치솟는다. 70°와 85°는 아폴로의 컴퓨터가 경고를 띄우고 장치를 얼린 각이다
두 장면 모두 탈이 난 것은 좌표이지 공간이 아니다. 하늘 꼭대기도 시선 구면 위의 평범한 점이고, 우주선은 어느 자세로든 돌 수 있다. 좌표 기저 화살표가 길이 0이 되거나 서로 겹치는 점에서는 그 좌표로 속도를 적을 수 없을 뿐이다. 그래서 영어 위키백과의 짐벌 잠금 문서는 게임과 3D 프로그램이 자세를 각도 세 개 대신 회전 행렬이나 사원수(회전을 숫자 네 개로 적는 방법)로 저장해 두 고리 축이 겹치는 자세를 피한다고 적는다.
ML에서: σ로 적을까 logσ로 적을까
정규분포의 표준편차 σ를 학습할 때는 흔히 σ 대신 s=logσ를 파라미터로 둔다. 같은 분포 모임에 좌표가 두 벌 생기는 셈이고, 같은 변화(접선벡터)도 두 좌표에서 성분이 다르다. 앞의 로그 좌표 x~=logx와 똑같이 자코비안은 ds/dσ=1/σ 한 칸뿐이라 s˙=σ˙/σ이므로, σ=1에서는 두 성분이 같지만 σ=0.01에서는 σ˙=1이 s˙=100이 된다. 움직이는 것은 모델 분포의 파라미터이고, 화살표는 하나인데 두 좌표에서 적은 성분만 100배 차이 난다.
문제 7: 지폐가 작아지면 장수는
확인 지갑에 3만 원이 있다. (가) 만원권으로 세면 몇 장인가? (나) 같은 돈을 5천원권으로 세면 몇 장인가? (다) 지폐 한 장의 값이 절반이 되면 장수는 몇 배가 되는가?
문제 7의 그림. 지갑에 든 3만 원과, 그 돈을 셀 만원권 한 장과 5천원권 한 장
같이 풀기 세션 7
김민준
만원권 3장이요. 5천원권은 만원권의 절반이니까 장수도 절반, 1.5장… 반 장이요?
선생님
5천원권 1.5장이면 얼마죠?
김민준
7,500원이네요. 거꾸로예요. 지폐가 절반이면 장수는 두 배, 6장이에요.
이서연
돈은 그대로고 「지폐 한 장의 값 × 장수」만 맞으면 되니까, 지폐가 몇 배로 커지면 장수는 그만큼 나눠져. 둘은 반대로 움직여.
문제 8: 동쪽 화살표를 극좌표로 부르면
계산 평면의 점 (x,y)=(1,1)에서 동쪽을 가리키는 벡터 v=∂x를 극좌표 기저 ∂r, ∂θ로 나타내라. 즉 성분 (vr,vθ)를 구하라.
문제 8의 그림. 점 (1, 1)에서 동쪽을 가리키는 화살표 v와, 그 점을 지나는 극좌표의 두 좌표선(원점에서 뻗는 반직선, 반지름 √2인 원)
같이 풀기 세션 8
김민준
이건 그림으로 보여요. 점 (1,1)에서 동쪽은 바깥쪽 단위벡터 r^와 45도, 반시계 방향 단위벡터 θ^의 반대쪽과도 45도로 벌어져 있으니까, 21r^−21θ^예요. 그러니까 (vr,vθ)=(1/2,−1/2)요.
이서연
난 변환 규칙으로 했어. 자코비안을 곱하면 되니까 vr=∂x/∂r=cosθ=1/2, vθ=∂x/∂θ=−rsinθ=−1. 둘째 성분이 민준이랑 다르네.
선생님
두 답이 다르니 검산해 봅시다. 성분을 기저에 곱해서 다시 더하면 (1,0)이 나와야 해요. 서연 학생, 평면에서 ∂θ는 어떤 화살표예요?
이서연
위치 (rcosθ,rsinθ)를 θ로 미분하면 (−rsinθ,rcosθ)니까, 이 점에서 (−1,1)이에요. ∂r은 (1/2,1/2)고요. 그러면 제 답은 21(1/2,1/2)−1⋅(−1,1)=(3/2,−1/2)이 돼요.
이서연
어, (1,0)이 안 나와요. 제가 행렬을 거꾸로 썼네요. 새 성분은 새 좌표를 옛 좌표로 미분한 ∂r/∂x, ∂θ/∂x로 만들어야 하는데, 옛 좌표를 새 좌표로 미분한 걸 썼어요.
선생님
그래요. ∂r/∂x=x/r=1/2, ∂θ/∂x=−y/r2=−1/2예요. 그럼 민준 학생 답은 어디서 틀렸을까요?
김민준
저는 방향은 맞게 봤는데… 아, ∂θ는 길이가 r=2라서 θ^랑 달라요. 같은 화살표를 만들려면 계수를 2로 나눠야 하니까 −1/2÷2=−1/2. 서연이 고친 답이랑 같아요.
문제 7의 지폐랑 같네요. ∂θ는 θ^보다 2배 큰 지폐라서 장수가 2배 적어야 했어요. 조교님이 과제에서 "단위 붙여서 쓰세요"라고 빨간 펜으로 쓰셨던 것도 같은 얘기고요. 성분만 보고 기저가 뭔지 안 적으면 아무도 못 알아본다는 거였는데.
이서연
선형대수 시간에 기저 변환 행렬 P랑 P−1을 헷갈려서 좌표가 거꾸로 나왔던 거랑 똑같은 실수다. 벡터 성분은 기저와 반대로 변한다는 게 이 얘기였네.
김민준
그런데 원점에서는 ∂θ의 길이가 r=0이잖아요. 그럼 원점의 동쪽 화살표는 극좌표로 못 적어요?
선생님
못 적어요. 각도 θ를 아무리 돌려도 원점은 꼼짝하지 않으니까요. 하늘을 똑바로 올려다본 게임 카메라에서 좌우각의 기저 화살표가 길이 0이 된 것, 아폴로의 고리 두 개가 한 축으로 겹친 짐벌 잠금과 같은 자리예요. 원점도 평면의 평범한 점이라 (x,y) 좌표로는 아무 문제가 없고요.
이서연
그래서 게임이 89°에서 멈추는 거군요. 89°에서도 좌우각의 기저 화살표 길이가 0.0175밖에 안 되니까, 극좌표로 치면 원점 바로 옆 r=0.0175인 곳에 서 있는 거네요.
문제 9: 로그 분산으로 적은 화살표
계산 VAE(변분 오토인코더. 이미지를 작은 잠재 변수로 줄였다가 되살리도록 학습하는 생성 모델)의 인코더는 흔히 표준편차 σ 대신 로그 분산 ℓ=logσ2을 내놓는다(PyTorch 예제 코드의 logvar). σ=0.1인 점에서 (가) σ의 변화율이 0.05인 화살표(σ˙=0.05)는 ℓ 좌표에서 성분이 얼마인가? (나) 거꾸로 ℓ 성분이 1인 화살표는 σ 좌표에서 성분이 얼마인가?
문제 9의 그림. 표준편차 σ와 로그 분산 ℓ=logσ2의 관계 곡선, 물음의 자리 σ=0.1과 (가)·(나)에서 성분을 옮길 두 화살표
같이 풀기 세션 9
김민준
자코비안은 dℓ/dσ 한 칸인데, ℓ=2logσ니까 σ/2를 곱하면 되겠죠. 0.05×0.05=0.0025요.
선생님
σ를 0.1에서 0.1005로 조금만 키우면 ℓ은 실제로 얼마나 변하는지 계산해 볼래요?
김민준
−4.6052에서 −4.5952로, 0.00998쯤 변하네요. σ가 0.0005 변할 때 ℓ은 그 20배가 변해요. 제가 곱한 σ/2는 거꾸로 가는 dσ/dℓ이었어요. (가)는 0.05×20=1.0이에요.
이서연
log를 미분하면 1/σ이니까 dℓ/dσ=2/σ, σ=0.1에서 20이야. (나)는 거꾸로 가는 dσ/dℓ=σ/2=0.05를 곱해서 1×0.05=0.05. 민준이 처음 곱한 수는 (나)에 쓸 dσ/dℓ였네.
김민준
문제 7의 지폐랑 같네요. σ=0.1에서는 σ 한 칸이 ℓ 20칸이라, ℓ로 세면 장수가 20배가 돼요.