모멘텀: 무거운 공과 네스테로프 가속

자주 하는 실수와 요약

자주 하는 실수

실수 나온 문제 바로잡는 법
모멘텀이 모든 방향의 속도를 똑같이 1/(1 − β)배 키운다고 봄 1, 2 부호가 늘 같은 방향은 1/(1 − β)배로 쌓이고, 번갈아 바뀌는 방향은 1/(1 + β)배로 깎인다
모멘텀 0.9는 학습률을 열 배 키운 경사하강과 같다고 봄 2 학습률 0.1의 경사하강은 조건수 100 그릇에서 터지지만, η = 0.01, β = 0.9의 무거운 공은 126스텝에 닿는다. 오가는 방향에서는 오히려 스텝이 준다
Adam의 1차 모멘트를 SGD 모멘텀 버퍼와 같은 크기로 봄 3 Adam은 (1 − β₁)을 곱한 가중 평균, SGD 버퍼는 합이라 1/(1 − β)배 크다. Adam은 1 − β₁ᵏ로 나눠 처음의 편향을 고친다
모멘텀 계수는 클수록 빠르다고 봄 4 근이 실수에서 복소수로 넘어가는 경계 (1 − √(ηλ))²가 가장 빠르다. 그보다 크면 근의 크기 √β 가 커져 출렁이며 느려진다
조건수를 작게 짐작해도 크게 짐작한 것과 같다고 봄 5 작게 짐작하면 완만한 방향이 복소수 범위 밖으로 나가 가속을 잃는다. 크게 짐작하면 가속은 남고 √(짐작한 κ)만큼 걷는다
모멘텀을 켜면 학습률의 벼랑이 당겨진다고 봄 6 무거운 공의 벼랑은 ηL < 2(1 + β)로 넓어진다. 계수를 바꾸면 학습률 찾기를 다시 한다
미리 보든 안 보든 결과가 같다고 봄 7 앞질러 본 자리에는 지금 속도가 들어 있어, 넘어갈 곳의 그래디언트가 미리 브레이크를 건다
네스테로프가 무거운 공보다 늘 안전하다고 봄 8 실제 모멘텀 β(1 − ηλ)는 ηλ > 1이면 음수가 된다. 벼랑은 ηL < 2(1 + β)/(1 + 2β)로 무거운 공보다 앞에 있다
파이토치 nesterov=True 의 숫자가 논문 식과 다르면 버그라고 봄 9 파이토치는 앞질러 본 자리를 파라미터로 들고 다닌다. 같은 수열을 밀려서 적은 것이다

요약

경사하강의 지그재그는 두 가지 스텝이 섞인 것이었다. 가파른 방향의 스텝은 부호를 바꿔 가며 벽 사이를 오가고, 완만한 방향의 스텝은 늘 같은 쪽이지만 아주 작다. 모멘텀(무거운 공 방법)은 지금 그래디언트에 지난 스텝들을 β배씩 흐리게 기억해 더한다. 오가는 스텝은 서로 지워지고 같은 쪽 스텝은 쌓여서, 같은 학습률에서도 스텝 수가 여러 배 준다. 버퍼 하나를 더 들고 다닐 뿐 그래디언트를 재는 비용은 그대로다. 1964년 폴랴크가 이 방법의 수렴 속도를 계산했고, 파이토치의 momentum=0.9 한 칸이 이것이다.

무거운 공 방법이 왜 빠른지는 한 방향의 두 근을 보면 알 수 있다. 곡률 λ인 방향에서 스텝마다 곱해지는 배율 r은 r² − (1 + β − ηλ)r + β = 0을 풀고, 근이 복소수이면 크기가 곡률과 상관없이 √β다. 가장 작은 곡률 μ부터 가장 큰 곡률 L까지가 모두 복소수 범위에 들게 η = 4/(√L + √μ)², √β = (√κ − 1)/(√κ + 1)로 고르면 모든 방향이 같은 배율로 줄고, 스텝 수가 κ 대신 √κ에 비례한다. 방향마다의 곡률을 계산하지 않고 두 끝의 곡률만으로 곡률을 고르게 한 효과를 흉내 낸 것이다. 네미롭스키와 유딘의 하한이 말하듯 그래디언트만 쓰는 방법에게 √κ는 넘을 수 없는 하한이다. 모멘텀 계수가 바뀌면 학습률의 벼랑도 2(1 + β)/L로 옮겨 간다.

폴랴크의 값은 2차 함수에서 셈한 것이라, 조각마다 곡률이 다른 볼록 함수에서는 무거운 공이 손실의 바닥 둘레를 맴돌 수 있다. 1983년 네스테로프는 기세대로 앞질러 본 자리에서 그래디언트를 재는 방법으로, 그래디언트가 립시츠 연속인 모든 볼록 함수에서 손실이 1/k² 로 줄어드는 수렴 속도를 보장했다. 앞질러 보기는 방향마다 모멘텀을 β(1 − ηλ)로 줄여 가파른 방향의 출렁임을 미리 꺾지만, 학습률이 1/λ 을 넘는 방향에서는 모멘텀을 거꾸로 걸어 벼랑을 앞당긴다. 2013년 서츠케버와 동료들이 이 방법을 모멘텀의 꼴로 다시 적고 깊은 신경망에서 그 힘을 보였으며, 파이토치의 nesterov=True 는 앞질러 본 자리를 파라미터로 들고 다니는 같은 업데이트다.

막힌 곳

이 장의 가속은 모든 방향에 하나의 학습률과 하나의 모멘텀 계수를 썼다. 그래서 가장 큰 곡률과 가장 작은 곡률을 알아야 했고, 그 둘의 비 κ의 제곱근만큼은 여전히 걸어야 했다. 신경망에서 그 두 숫자는 미리 알 수 없고, 학습하는 동안 바뀌기도 한다. 파라미터마다 그 방향의 그래디언트가 얼마나 크게 흔들려 왔는지를 따로 기억해 두면, 학습률을 파라미터마다 다르게 맞출 수 있지 않을까? 그렇게 하면 헤시안 없이도 그릇을 조금 더 둥글게 만들 수 있을까?

그리고 이 장의 계산은 그래디언트를 정확히 안다고 놓았다. 미니배치의 노이즈가 섞인 그래디언트에서는 지난 스텝을 기억하는 일이 노이즈까지 쌓는 일이 되지 않을까?