/ DEEPLEARNING

Deep Learning - Momentum

Momentum

Momentum은 학습을 가속하기 위해 고안된 것으로, 특히 높은 곡률이나 작지만 일관된 기울기들, 잡음 섞인 기울기들이 있는 상황에서 학습을 빠르게 해준다. 운동량 알고리즘은 이전 단계 기울기들의 지수적으로 감소하는 이동 평균을 누적해서, 그 기울기들의 방향으로 계속 이동한다.

운동량 알고리즘은 속도 역할을 하는 변수 $v$를 사용한다. 이 속도 변수는 매개변수들이 매개변수 공간에서 움직이는 방향과 빠르기를 결정한다. 매 반복에서 알고리즘은 이 속도를 음의 기울기의 지수 감소 평균으로 설정한다. 초매개변수 $\alpha \in [0,1)$은 이전 단계 기울기들의 기여가 지수적으로 얼마나 빠르게 감소하는지를 결정한다.

$v \leftarrow\alpha v - \epsilon \nabla_{\theta}(\frac{1}{m} \sum_{i=1}^{m} L(f(x^{(i)};\theta), y^{(i)}))$

$\theta \leftarrow \theta + v$

이를 통해 속도 $v$는 기울기 성분 $\nabla_{\theta}(\frac{1}{m} \sum_{i=1}^{m} L(f(x^{(i)};\theta), y^{(i)}))$들을 누적한다. $\alpha$가 $\epsilon$에 비해 클수록 이전 기울기들이 현재 방향에 더 큰 영향을 미친다.

Nesterov Momentum

$v \leftarrow\alpha v - \epsilon \nabla_{\theta}(\frac{1}{m} \sum_{i=1}^{m} L(f(x^{(i)};\theta + \alpha v), y^{(i)}))$

$\theta \leftarrow \theta + v$

네스테로프 운동량은 현재 속도를 적용한 후에 기울기를 갱신한다. 따라서, 표준 운동량 방법에 하나의 보저인자를 더한 것으로 생각할 수 있다.

$f(x) = x_{1}^{2} + 2x_{2}^{2}$

위 식에 대한 Gradient Descent를 수행하면 다음과 같다.

eta = 0.4

def f_2d(x1, x2):
    return 0.1 * x1 ** 2 + 2 * x2 ** 2

def gd_2d(x1, x2, s1, s2):
    return (x1 - eta * 0.2 * x1, x2 - eta * 4 * x2, 0, 0)
d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
epoch 20, x1: -0.943467, x2: -0.000073

svg

eta = 0.6
d2l.show_trace_2d(f_2d, d2l.train_2d(gd_2d))
epoch 20, x1: -0.387814, x2: -1673.365109

svg

Momentum은 $x_{1}$ 방향에서는 단계마다 거리가 증가하며, $x_{2}$ 방향으로는 서로를 상쇄하는 진동으로 인해 스텝 크기가 줄어들며 학습한다.
$v_{t} \leftarrow \beta v_{t-1} + g_{t,t-1}$
$x_{t} \leftarrow x_{t-1} - \eta_{t} v_{t}$

def momentum_2d(x1, x2, v1, v2):
    v1 = beta * v1 + 0.2 * x1
    v2 = beta * v2 + 4 * x2
    return x1 - eta * v1, x2 - eta * v2, v1, v2

eta, beta = 0.6, 0.5
d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))
epoch 20, x1: 0.007188, x2: 0.002553

svg

만약 $\beta$값을 줄이면 궤적이 거의 수렴되지 않는다.

eta, beta = 0.6, 0.25
d2l.show_trace_2d(f_2d, d2l.train_2d(momentum_2d))
epoch 20, x1: -0.126340, x2: -0.186632

svg

참고 : 이안 굿펠로, 요수아 벤지오, 에런 쿠빌, 심층학습, Jpub(2018), p323-332