본문 바로가기
지능형시스템/머신러닝

[머신 러닝/딥 러닝] 인공 신경망을 위한 확률적 경사 하강법

by CHML 2018. 12. 24.

기존의 경사 하강법 (Gradient descent method)에서 특정 데이터만을 샘플링하여 학습하는 확률적 경사 하강법 (SGD)은 deep neural network를 학습시키기 위해 주로 이용되고 있는 최적화 기법이다. 미니 배치 단위로 정의되는 loss function을 $L$이라 할 때, SGD를 통한 neural network의 $i$번째 뉴런의 $j$번째 weight $w_{ij}$는 다음과 같이 update된다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - \eta \frac{\partial L}{\partial w_{ij}^{(t)}}, \tag{1}$$

이 때 $\eta$는 learning rate라고 하는 hyperparameter이고, $\frac{\partial L}{\partial w_{ij}^{(t)}}$은 gradient라고 하는 요소로써 weight를 어느 방향으로 update할지를 결정한다. 따라서, SGD는 learning rate와 gradient라는 두 가지 요소로 구성된다는 것을 볼 수 있다.

최근에는 deep neural network를 더욱 효율적으로 학습시키기 위해 SGD의 변형들이 제안되었다. SGD의 변형들은 크게 두 가지 분류로 나눌 수 있는데, 첫 번째는 momentum이라는 개념을 이용하여 gradient를 수정하는 알고리즘이고, 두 번째는 자동으로 learning rate를 조절하는 알고리즘이다. 아래의 그림 1은 이러한 분류에 따라 AdaGrad, Adam 등 최근에 제안된 SGD의 변형들을 분류한 것이다.


그림 1. SGD 기반의 알고리즘 분류도


1. Momentum

기존의 SGD는 식 (1)과 같이 현재 시간의 gradient를 이용해서만 weight를 update한다. 이와 반대로 momentum 기반의 SGD는 이전 시간의 gradient 까지도 고려하여 다음과 같이 weight를 update한다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - v_{ij}^{(t)}, \tag{2}$$

이 때 momentum을 나타내는 $v_{ij}^{(t)}$는 다음과 같이 계산된다.

$$v_{ij}^{(t)} = \beta v_{ij}^{(t-1)} + \eta \frac{\partial L}{\partial w_{ij}^{(t)}} \tag{3}$$

이 식에서 $\beta \in [0, 1]$는 일반적으로 0.9로 설정되는 hyperparameter로써 이전 gradient와 현재 gradient 간의 영향력을 조절한다. Momentum 기반 SGD의 이러한 update rule은 momentum이 갖는 사전적 의미를 식으로 표현한 것인데, 이전 시간에 A라는 방향으로 움직이고 있었던 물체를 B라는 방향으로 움직이도록 변경하여도 일정 부분은 A라는 방향으로 계속 움직이려고 하는 힘이 작용하는 것을 나타낸 것이다.

Weight $w_{ij}$의 update 방향을 결정하는 $v_{ij}^{(t)}$는 현재 시간까지의 모든 gradient를 통해 다음과 같이 표현될 수 있다.

$$v_{ij}^{(t)} = \eta \frac{\partial L}{\partial w_{ij}^{(t)}} + \beta v_{ij}^{(t-1)} = \eta \frac{\partial L}{\partial w_{ij}^{(t)}} + \beta \eta \frac{\partial L}{\partial w_{ij}^{(t-1)}} + \beta^2 v_{ij}^{(t-2)} = \; \cdots \tag{4}$$

따라서 momentum은 현재 시간의 gradient인 $\frac{\partial L}{\partial w_{ij}^{(t)}}$에는 가장 높은 중요도를, 그 이전 시간의 gradient인 $\frac{\partial L}{\partial w_{ij}^{(t-1)}}$에는 두 번째로 높은 중요도를 가지는 방식으로 이전 시간의 모든 gradient를 고려하여 방향을 설정하도록 만든다. 아래의 그림 2와 3은 최적화 과정에서 momentum이 어떠한 역할을 하는지를 보여준다.


그림 2. 기본적인 SGD를 통한 최적화


그림 2는 기본적인 SGD를 통한 최적화 과정을 나타낸다. 경사 하강법은 기본적으로 learning rate의 크기만큼 gradient의 방향으로 이동하기 때문에 많은 경우에 SGD는 최적점의 방향으로 곧장 이동하는 것이 아니라, 그림 2와 같이 진동하며 이동한다. Momentum을 이용하는 경우에는 이러한 비효율적인 이동을 최소화 할 수 있다.


그림 3. SGD와 momentum을 결합한 최적화 


그림 3은 momentum의 개념을 이용하는 SGD의 최적화 과정을 보여준다. 최적화 과정을 보면 알 수 있는 것이 진동을 하면서도 모든 진동 방향에는 optimum으로 이동하고자 하는 직선 방향의 이동이 존재한다는 것이다. Momentum은 식 (4)처럼 이전 시간의 이동 방향을 저장하기 때문에 momentum에는 직선 방향으로 이동하려는 성질 또한 강하게 저장된다. 이러한 momentum의 작용에 의해 그림 3의 momentum을 이용하는 SGD는 그림 2의 기본적인 SGD 보다 더 빠르게 optimum으로 찾아갈 수 있는 것이다.

Momentum을 통해 기대할 수 있는 다른 이점은 local optimum을 회피할 수도 있다는 것이다. Local optimum에 빠지면, 알고리즘은 local optimum 주위를 계속해서 반복하는 현상이 발생한다. 이 때 momentum을 이용한다면, momentum이 일종의 관성처럼 작용하여 local optimum 주변을 빠져나갈 수 있게 되는 것이다. 그러나 momentum을 이용한다고 해서 global optimum을 찾을 수 있는 것은 아니다. 실제로 머신 러닝 연구를 할 때는 momentum을 통해 local optimum을 회피하겠다는 기대는 하지 않는 것이 좋을 것이다.


2. Nesterov accelerated gradient (NAG)

기본적인 momentum 방식은 이동을 중지해야 하는 지점에 도달해도 momentum에 의해 해당 지점을 지나칠 수 있다는 문제가 있다. Nesterov accelerated gradient (NAG)는 이러한 문제점을 해결하기 위해 제안되었다. NAG에서는 momentum 계산 시에 momentum에 의해 발생하는 변화를 미리 보고 momentum을 결정한다. 이를 식으로 나타내면 다음과 같다.

$$v_{ij}^{(t)} = \beta v_{ij}^{(t-1)} + \eta \frac{\partial L}{\partial \widehat{w}_{ij}^{(t)}} \tag{5}$$

이 때 $\widehat{w}_{ij}^{(t)}$는 다음과 같이 계산된다.

$$\widehat{w}_{ij}^{(t)} = w_{ij}^{(t)} - \beta v_{ij}^{(t-1)} \tag{6}$$

그 다음, 기본적인 momentum 방식과 같이 weight를 다음과 같이 update한다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - v_{ij}^{(t)} \tag{7}$$

아래의 그림 4는 weight를 update하는 방향을 설정하는데 있어 기본적인 momentum 방식과 NAG의 차이를 보여준다.


그림 4. 기본적인 momentum 방식과 NAG momentum 방식의 차이


기본적인 momentum 방식은 이전의 시간의 momentum과 독립적으로 gradient를 계산하여 momentum과 gradient를 더함으로써 update의 방향을 결정한다. 반면에 NAG에서는 먼저 momentum 만큼 update를 했다고 가정한 뒤에 gradient를 계산하고, 이를 기반으로 update의 방향을 결정한다. 기본적인 momentum 방식은 현재의 가속도를 고려하지 않고 속도를 설정한다면, NAG는 현재의 가속도를 어느정도 고려하여 속도를 설정한다고 생각할 수 있다. 이러한 update 방식을 통해 NAG는 momentum을 이용한 빠른 이동이라는 장점을 유지하면서도 momentum에 의해 과하게 이동하는 단점을 완화했다.


3. Adaptive Gradient (AdaGrad)

AdaGrad는 2011년에 제안된 SGD 기반의 알고리즘으로써, 최적화 과정을 효율적으로 만들기 위해 고정된 learning rate가 아니라 각각의 변수마다 적합한 learning rate를 자동으로 설정한다. AdaGrad의 전략은 지금까지 변화가 많았던 변수들은 optimum의 근처에 있을 확률이 높기 때문에 learning rate를 작게 함으로써 더욱 세밀하게 update가 되도록 만들고, 변화가 적었던 변수들은 optimum에서 멀리 벗어나 있을 확률이 높기 때문에 learning rate를 크게 함으로써 더욱 빠르게 optimum으로 수렴하도록 만드는 것이다.

경사 하강법에서 gradient의 크기는 변수가 얼마나 많이 변경되었는지를 나타낸다. AdaGrad는 이러한 점을 이용하여 $i$번째 뉴런의 $j$번째 weight인 $w_{ij}$가 얼마나 많이 변경되었는지를 다음과 같이 gradient 제곱의 합인 $g_{ij}$로 나타낸다.

$$g_{ij}^{(t)} = g_{ij}^{(t-1)} + \left( \frac{\partial L}{\partial w_{ij}^{(t)}} \right)^2 \tag{8}$$

식 (8)을 통해 현재 시간에서 각 변수가 얼마나 변화해왔는지를 계산한 다음에는 아래의 식 (9)와 같이 $w_{ij}$를 update한다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - \frac{\eta}{\sqrt{g_{ij}^{(t)}} + \epsilon} \frac{\partial L}{\partial w_{ij}^{(t)}} \tag{9}$$

이 때 $\epsilon$은 일반적으로 $10^{-8}$와 같은 매우 작은 수로 설정되는 상수로써, 0으로 나누는 것을 방지하기 위해 추가되었다. 식 (9)를 보면 weight가 현재 시간까지 얼마나 많이 변화했었는지를 의미하는 $g_{ij}^{(t)}$가 클 수록 전체 learning rate인 $\frac{\eta}{\sqrt{g_{ij}^{(t)}} + \epsilon}$가 작아지는 것을 볼 수 있다.

AdaGrad는 learning rate decay와 같은 방법들을 이용하여 learning rate를 직접적으로 조절하지 않아도 된다는 장점이 있다. 또한, 모든 변수에 일괄적으로 동일한 learning rate를 적용하는 기존의 SGD 기반 알고리즘과는 다르게 AdaGrad는 각 변수들마다 적합한 learning rate를 자동으로 설정한다는 이점도 존재한다. 그러나 AdaGrad는 학습이 오래 진행될 경우에는 변수의 update가 이루어지지 않는다는 문제점이 존재한다. AdaGrad에서 learning rate를 조절하는 $g_{ij}$는 어떠한 값을 제곱한 것이 계속 더해지기 때문에 시간이 지날 수록 증가하고, 이에 따라 learning rate 또한 시간에 따라 감소하여 시간이 어느 정도 지난 뒤에는 learning rate가 매우 작아져 update가 이루어지지 않는다. 이러한 문제점을 해결하기 위해 제안된 알고리즘이 AdaDelta와 RMSProp이다.


4. Root Mean Square Propagation (RMSProp)

RMSProp은 학습이 진행될 수록 learning rate가 극단적으로 감소하는 AdaGrad의 문제점을 해결하기 위해 제안되었다. AdaGrad에서는 변수가 얼마나 많이 변화했는지를 gradient 제곱의 합인 $g_i$로 나타냈다. 그러나 RMSProp에서는 $g_{ij}$를 gradient 제곱의 합이 아니라, gradient 제곱의 지수 이동 평균으로 다음과 같이 정의한다.

$$g_{ij}^{(t)} = \beta g_{ij}^{(t-1)} + (1 - \beta) \left( \frac{\partial L}{\partial w_{ij}^{(t)}} \right)^2 \tag{10}$$

그 다음, AdaGrad처럼 식 (11)과 같이 weight를 update한다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - \frac{\eta}{\sqrt{g_{ij}^{(i)}} + \epsilon} \frac{\partial L}{\partial w_{ij}^{(t)}} \tag{11}$$

이 식에서 $\epsilon$은 $10^{-8}$과 같은 매우 작은 수로 설정된다.

AdaGrad에서의 $g_{ij}$는 현재 시간까지의 변화량의 합으로 정의되기 때문에 시간이 지날수록 증가하고, 이에 따라 learning rate는 감소한다. 그러나 RMSProp에서의 $g_{ij}$는 이전의 변화량과 현재의 변화량의 어떠한 평균으로 정의되기 때문에 learning rate가 급격하게 감소하는 현상을 방지할 수 있는 것이다.

RMSProp에서 $g_{ij}$가 갖는 또 다른 특징은 최근의 변화량에 더 높은 가중치를 준다는 것이다. 예를 들어 $\beta$가 0.9인 경우, $g_{ij}^{(t)}$는 다음과 같이 계산된다.

$$g_{ij}^{(t)} = 0.9g_{ij}^{(t-1)} + 0.1\left( \frac{\partial L}{\partial w_{ij}^{(t)}} \right)^2 = 0.81g_{ij}^{(t-2)} + 0.09\left( \frac{\partial L}{\partial w_{ij}^{(t-1)}} \right)^2 + 0.1\left( \frac{\partial L}{\partial w_{ij}^{(t)}} \right)^2 \tag{12}$$

위의 식 (12)를 보면 현재 시간에 대한 $g_{ij}^{(t)}$는 0.1의 가중치를 갖는 현재 시간의 변화량 $(\partial L/\partial w_{ij}^{(t)})^2$과 그보다 작은 0.09의 가중치를 갖는 이전 시간의 변화량 $(\partial L/\partial w_{ij}^{(t-1)})^2$, 그리고 $g_{ij}^{(t-2)}$로 구성되는 것을 볼 수 있다.


5. Adaptive Momentum Estimation (Adam)

아마도 Adam은 현재 deep neural network의 학습에 가장 광범위하게 이용되고 있는 알고리즘일 것이다. 딥 러닝 실험을 하며 여러 데이터셋에 대해 deep neural network를 학습시켜본 경험에 비추어 볼 때, 일반적으로 Adam이 가장 좋은 학습 성능을 보여주었다.

Adam을 간단히 말하자면, momentum과 RMSProp를 합친 것 같은 알고리즘이다. 즉 momentum의 개념을 이용하지만, $w_{ij}$에 대한 momentum인 $v_{ij}^{(t)}$과 learning rate를 조절하는 $g_{ij}^{(t)}$는 다음과 같이 지수 이동 평균으로 계산된다.

$$v_{ij}^{(t)} = \beta_1 v_{ij}^{(t-1)} + (1 - \beta_1) \frac{\partial L}{\partial w_{ij}^{(t)}} \tag{13}$$

$$g_{ij}^{(t)} = \beta_2 g_{ij}^{(t-1)} + (1 - \beta_2) \left( \frac{\partial L}{\partial w_{ij}^{(t)}} \right)^2 \tag{14}$$

이 때, $\beta_1, \beta_2 \in [0, 1)$는 일반적으로 각각 0.9와 0.999로 설정된다. 

Adam의 논문에서는 $v_{ij}^{(t)}$와 $g_{ij}^{(t)}$를 그대로 이용하는 것이 아니라, unbiased expectation의 형태로 이용하기 위해 다음과 같이 변형한다.

$$\widehat{v}_{ij}^{(t)} = \frac{v_{ij}^{(t)}}{1 - \beta_1^t} \tag{15}$$

$$\widehat{g}_{ij}^{(t)} = \frac{g_{ij}^{(t)}}{1 - \beta_2^t} \tag{16}$$

이 식에서 $\beta_1^t$와 $\beta_2^t$는 각각 $\beta_1$과 $\beta_2$를 $t$번 곱한 것이다. Unbiased expectation의 형태로 $v_{ij}^{(t)}$와 $g_{ij}^{(t)}$를 이용하는 것과 unbiased expectation이 식 (15, 16)과 같이 계산되는 이유는 Adam 논문에 자세히 서술되어 있다. 최종적으로 $w_{ij}$에 대한 update는 식 (17)과 같이 이루어진다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - \frac{\eta}{\sqrt{\widehat{g}_{ij}^{(t)}} + \epsilon} \widehat{v}_{ij}^{(t)} \tag{17}$$


6. AdaMax

AdaMax는 Adam 논문에서 extension으로 제안된 알고리즘이다. Adam은 식 (14)와 같이 $L_2$ norm을 기반으로 learning rate를 조절한다. AdaMax는 $L_2$ norm을 기반으로 learning rate를 조절하는 부분을 $L_p$ norm으로 확장시킨 알고리즘이다. 한 가지 문제점은 $p$가 매우 클 경우, $L_p$ norm은 극단적인 값을 갖는 등 매우 불안정하다는 것이다. 그러나 Adam 논문의 저자는 $p$가 무한대로 갈 때, 매우 간단하고 안정적인 알고리즘이 만들어지는 것을 다음과 같이 보여준다.

먼저, Adam에서 learning rate를 조절하는 $g_{ij}^{(t)}$는 AdaMax에서 다음과 같이 $L_p$ norm으로 확장된다.

$$g_{ij}^{(t)} = \beta_2^p g_{ij}^{(t-1)} + (1 - \beta_2^p) \left|\frac{\partial L}{\partial w_{ij}^{(t)}}\right|^p = (1 - \beta_2^p) \sum_{i=1}^t \beta_2^{p(t-i)} \left|\frac{\partial L}{\partial w_{ij}^{(t)}}\right|^p \tag{17}$$

AdaMax를 제안한 논문에서는 $p$가 무한대로 갈 때의 $(g_{ij}^{(t)})^{1/p}$를 다음과 같이 $G_{ij}^{(t)}$로 정의한다.

$$G_{ij}^{(t)} = \max\left(\beta_2 G_{ij}^{(t-1)},\; \left|\frac{\partial L}{\partial w_{ij}^{(t)}}\right|\right) \tag{18}$$

그 다음, $w_{ij}$를 다음과 같이 update한다.

$$w_{ij}^{(t+1)} = w_{ij}^{(t)} - \frac{\eta}{(1 - \beta_1^t)} \frac{v_{ij}^{(t)}}{G_{ij}^{(t)}} \tag{18}$$

이 때 $v_{ij}^{(t)}$는 Adam에서처럼 식 (15)와 같이 정의되며, 일반적으로 $\beta_1$과 $\beta_2$는 각각 0.9와 0.999로 설정된다.


7. 알고리즘 비교

아래의 표 1은 일반적으로 많이 이용되는 NAG, AdaGrad, RMSProp, Adam의 momentum 계산, learning rate 조절, weight update 식, 그리고 TensorFlow 또는 제안된 논문에서 권장하는 hyperparameter의 기본값을 요약한 것이다.


표 1. NAG, AdaGrad, RMSProp, Adam 요약