logo

경사하강법에서 모멘텀 기법 📂머신러닝

경사하강법에서 모멘텀 기법

개요1 2

경사하강법에서 모멘텀 기법이란, 파라매터를 업데이트할 때 이전의 그래디언트도 모두 사용하는 것이다. 이것이 본질이며 이것만이 설명의 끝이다. 그런데 이상한 업데이트 수식과 물리학의 운동량이 동기가 됐다느니, 질량을 $1$로 두고 초기 속도를 $0$으로 둔다느니하는 설명들은 이해를 어렵게만 할 뿐이다. 본 글에서는 모멘텀 기법을 최대한 담백하게 설명한다.

빌드업

파라매터를 $\boldsymbol{\theta}$, 손실함수를 $L$이라할 때, 표준적인 경사하강법은 다음과 같이 반복적으로 파라매터를 업데이트하는 방법을 말한다.

$$ \boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_{i} - \alpha \nabla L_{i} $$

여기서 $L_{i} = L(\boldsymbol{\theta}_{i})$는 $i$번째 반복에서 계산된 손실함수를 말한다. 모멘텀 기법이란 여기에 그저 이전 반복에서 계산된 손실함수의 그래디언트인 $\nabla L_{i-1}$들을 더해주는 것에 지나지 않는다.

$$ \boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_{i} - \alpha \nabla L_{i} - \alpha \nabla L_{i-1} - \cdots - \alpha \nabla L_{0} $$

여기에서 반복이 진행될 수록 그래디언트가 주는 영향력을 줄이고, 그래디언트들의 합이 발산하는 것을 막기위해 계수 $\beta \in (0,1)$를 추가하면 다음과 같다.

$$ \begin{align} \boldsymbol{\theta}_{i+1} &= \boldsymbol{\theta}_{i} - \alpha \nabla L_{i} - \beta \alpha \nabla L_{i-1} - \cdots - \beta^{i}\alpha \nabla L_{0} \nonumber \\ &= \boldsymbol{\theta}_{i} - \alpha\sum_{j=0}^{i} \beta^{j} \nabla L_{i-j} \end{align} $$

정의

$(1)$과 같이 파라매터를 업데이트하는 것을 모멘텀 기법momentum method이라 부르고, 더해지는 항 $\alpha\sum\limits_{j=0}^{i} \beta^{j} \nabla L_{i-j}$을 모멘텀momentum이라 부른다.

설명

위의 정의에 따르면 모멘텀 기법은 일반화된 경사하강법이며, 오히려 경사하강법이 모멘텀 기법에서 $\beta = 0$인 특별한 케이스에 지나지 않는다고 볼 수 있다. $\beta$가 $1$에 가까울수록 이전의 그래디언트들을 많이 반영하고, $0$에 가까울수록 적게 반영한다.

경사하강법은 지금 당장의 기울기가 가장 큰 방향으로 파라매터를 업데이트하기 때문에 그리디 알고리즘이다. 모멘텀 기법은 경사하강법의 탐욕적인greedy 부분을 조금 덜어주어 지금 당장 최선의 선택은 아니지만 장기적으로는 더 도움이 되는 선택을 할 수 있게 도와줄 수 있다. 또한 그래디언트의 방향이 갑자기 너무 많이 바뀌는 것을 방지할 수 있다.

당연하게도 파라매터를 업데이트하는 그래디언트의 크기가 경사하강법에 비해 크므로, 경사하강법보다 수렴속도가 빠르다는 장점이 있다. 또한 경험적으로 로컬 미니마local minima를 비교적 잘 벗어난다고 알려져있는데, 언덕을 내려가는 공의 속도가 충분히 빠르면 내려가는 중간에 만나는 작은 언덕 정도는 넘고 지나갈 수 있는 것과 같다고 설명한다.

여기에서 중요한 사실은 적응적 학습률 기법을 포함한 이러한 옵티마이저들 사이에 절대적 우위는 없다는 것이다. 분야마다, 작업마다 최적의 옵티마이저가 다르므로, "무엇이 제일 좋은지"에 대한 판단이나 질문은 좋지 않다. 본인이 속한 필드에서 주로 사용하는 것이 무엇인지를 알아보는 것이 도움이 되며, 그런게 없거나 잘 모르겠다면 SGD+모멘텀 혹은 Adam을 써보는 것이 무난하다.

네스테로프 모멘텀

모멘텀 기법을 다시 정리하면, 다음 파라매터 $\boldsymbol{\theta}_{i+1}$를 얻기위해 현재의 파라매터 $\boldsymbol{\theta}_{i}$에 현재의 파라매터로 계산한 그래디언트 $\alpha \nabla L(\boldsymbol{\theta}_{i})$를 누적시켜가며 더한다.

네스테로프 모멘텀Nesterov momentum 혹은 네스테로프 가속 그래디언트Nesterov accerlerated gradient, NAG라 불리는 기법은, "현재의 파라매터에 이전의 그래디언트를 더한 값"으로 그래디언트를 구해 이를 현재의 파라매터에 더하여 다음 파라매터를 구한다. 말로는 좀 복잡한데, 모멘텀 기법을 이해했다면 아래의 알고리즘을 보는 것이 네스테로프 모멘텀의 이해가 더 쉬울 수 있다.

알고리즘

모멘텀항을 $\mathbf{p}$로 표기한다.

알고리즘: 모멘텀 기법
In학습률 $\alpha$, 모멘텀 파라매터 $\beta$, 에포크 $N$
1.파라매터 $\boldsymbol{\theta}$를 임의의 값으로 초기화한다.
2.모멘텀을 $\mathbf{p} = \mathbf{0}$로 초기화한다.
3.for $k = 1, \cdots, N$ do
4.   $\mathbf{p} \leftarrow \beta \mathbf{p} - \alpha \nabla L(\boldsymbol{\theta})$# 그래디언트를 계산하여 모멘텀 업데이트
5.   $\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \mathbf{p}$# 파라매터 업데이트
6.end for
알고리즘: 네스테로프 모멘텀
In학습률 $\alpha$, 모멘텀 파라매터 $\beta$, 에포크 $N$
1.파라매터 $\boldsymbol{\theta}$를 임의의 값으로 초기화한다.
2.모멘텀을 $\mathbf{p} = \mathbf{0}$로 초기화한다.
3.for $k = 1, \cdots, N$ do
4.   $\mathbf{p} \leftarrow \beta \mathbf{p} - \alpha \nabla L(\boldsymbol{\theta} + \beta \mathbf{p})$# 그래디언트를 계산하여 모멘텀 업데이트
5.   $\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \mathbf{p}$# 파라매터 업데이트
6.end for

두 방법에 대해서 처음 몇 번의 계산을 살펴보면 다음과 같다. 간단히 $\mathbf{p}_{i} = \alpha \nabla L_{i}$, 그리고 $\mathbf{p}^{i} = \alpha \nabla L(\boldsymbol{\theta}_{i} - \beta^{1}\mathbf{p}^{i-1} - \beta^{2}\mathbf{p}^{i-2} - \cdots - \beta^{i}\mathbf{p}^{0})$ (이때 $\mathbf{p}^{0} = \mathbf{p}_{0}$)이라 표기하면,

모멘텀네스테로프 모멘텀
$\boldsymbol{\theta}_{0} =$ 초기값$\boldsymbol{\theta}_{0} =$ 초기값
$\boldsymbol{\theta}_{1} = \boldsymbol{\theta}_{0} - \alpha \nabla L_{0} \\ \quad\ = \boldsymbol{\theta}_{0} - \mathbf{p}_{0}$$\boldsymbol{\theta}_{1} = \boldsymbol{\theta}_{0} - \alpha \nabla L_{0} \\ \quad\ = \boldsymbol{\theta}_{0} - \mathbf{p}^{0}$
$\boldsymbol{\theta}_{2} = \boldsymbol{\theta}_{1} - \alpha\nabla L_{1} - \beta \mathbf{p}_{0} \\ \quad\ = \boldsymbol{\theta}_{1} - \mathbf{p}_{1} - \beta \mathbf{p}_{0}$$\boldsymbol{\theta}_{2} = \boldsymbol{\theta}_{1} - \alpha \nabla L(\boldsymbol{\theta}_{1} - \beta \mathbf{p}^{0}) - \beta \mathbf{p}^{0} \\ \quad\ = \boldsymbol{\theta}_{1} - \mathbf{p}^{1} - \beta \mathbf{p}^{0}$
$\boldsymbol{\theta}_{3} = \boldsymbol{\theta}_{2} - \mathbf{p}_{2} - \beta \mathbf{p}_{1} - \beta^{2} \mathbf{p}_{0} \\ \quad\ = \boldsymbol{\theta}_{2} - \sum\limits_{j=0}^{2}\beta^{j}\mathbf{p}_{2-j}$$\boldsymbol{\theta}_{3} = \boldsymbol{\theta}_{2} - \alpha \nabla L(\boldsymbol{\theta}_{2} - \beta \mathbf{p}^{1} - \beta^{2}\mathbf{p}^{0}) - \beta \mathbf{p}^{1} - \beta^{2}\mathbf{p}^{0} \\ \quad\ = \boldsymbol{\theta}_{2} - \mathbf{p}^{2} - \beta \mathbf{p}^{1} - \beta^{2} \mathbf{p}^{0}$
$$\vdots$$$$\vdots$$
$\boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_{i} - \sum\limits_{j=0}^{i}\beta^{j}\mathbf{p}_{i-j}$$\boldsymbol{\theta}_{i+1} = \boldsymbol{\theta}_{i} - \sum\limits_{j=0}^{i}\beta^{j}\mathbf{p}^{i-j}$

  1. Ian Goodfellow, Deep Learning, Ch 8.3.2 Momentum, 8.3.3 Nesterov Momentum ↩︎

  2. 오일석, 기계 학습(MACHINE LEARNING) (2017), Ch 5.3 모멘텀 ↩︎