우노
[DL] Momentum, NAG, AdaGrad, RMSProp, Adam 본문
- 이전 포스트에서는 배치 경사하강법, 확률적 경사하강법, 미니 배치 확률적 경사하강법에 대해서 다뤘었다.
개요
기존의 경사하강법(Gradient descent method)에서 특정 데이터만을 샘플링하여 학습하는 확률적 경사 하강법(SGD)은, deep neural network를 학습시키기 위해 주로 이용되고 있는 최적화 기법이다.
미니 배치 단위로 정의되는 loss function을 L이라 할 때, SGD를 통한 neural network의 i번째 뉴런의 j번째 weight(w_ij)는 다음과 같이 update된다.
이 때, η 는 learning rate 라고 하는 hyperparameter이고
∂L / ∂w_ij(t) 는 gradient라고 하는 요소로써, weight를 어느 방향으로 update할지를 결정한다.
따라서, 확률적 경사하강법(SGD)은 learning rate와 gradient라는 두 가지 요소로 구성된다는 것을 알 수 있다.
최근에는 deep neural network를 더욱 효율적으로 학습시키기 위해 SGD의 변형들이 제안되었다.
SGD의 변형들은 크게 두 가지 분류로 나눌 수 있는데
첫 번째는 momentum이라는 개념을 이용하여 gradient를 조절하는 알고리즘이고
두 번째는 learning rate를 조절하는 알고리즘이다.
아래의 그림은 이러한 분류에 따라 SGD의 변형들을 분류한 것이다.
Momentum
기존의 SGD는 위의 식(1) 과 같이 현재 시간의 gradient만 이용해서 weight를 update한다.
이와 반대로 momentum 기반의 SGD는, 이전 시간의 gradient(v_ij(t)) 까지도 고려하여 weight를 update한다.
momentum(v_ij(t))을 이용한 weight update 산식은 다음과 같다.
이 때, weight(w_ij(t))의 update 방향을 결정하는 momentum(v_ij(t))을 구하는 산식 다음과 같다.
- β 는 일반적으로 0.9로 설정되는 hyperparameter로써, 이전 gradient의 영향력을 조절한다.
- 따라서, β * v_ij(t-1) 은 이전 시간의 gradient 이고
- ∂L / ∂w_ij(t-1) 은 현재 시간의 gradient 이다.
momentum(v_ij(t))은 아래와 같이, 현재 시간까지의 모든 gradient를 고려한 것과 동일하게 표현할 수 있다.
- 따라서, momentum은, 현재 시간의 gradient인 ∂L / ∂w_ij(t) 에는 가장 높은 중요도를
- 그 이전 시간의 gradient인 ∂L / ∂w_ij(t-1) 에는 두 번째로 높은 중요도를 가지는 방식으로
- 이전 시간의 모든 gradient를 고려하여 방향을 설정하도록 만든다.
- 즉, 지수 가중 평균 방식이다.
즉, Momentum 기반의 SGD update rule은, 이전 시간에 A라는 방향으로 움직이고 있었던 물체를 B라는 방향으로 움직이도록 변경하여도, 일정 부분은 A라는 방향으로 계속 움직이려고 하는 힘이 작용하는 것을 나타낸 것이다.
아래 그림 2는 기본적인 SGD를 이용한 최적화 과정을 나타낸다.
- SGD은 기본적으로 learning rate의 크기만큼 gradient의 방향으로 이동하기 때문에
- 많은 경우에 최적점의 방향으로 곧장 이동하는 것이 아니라
- 그림 2와 같이 세로축으로 진동하며 이동한다.
- Momentum을 이용하는 경우에는 이러한 비효율적인 이동을 최소화 할 수 있다.
아래 그림 3은 SGD와 momentum을 결합한 최적화 과정을 나타낸다.
- 최적화 과정을 보면, 세로축으로 진동을 하면서도 식(4) 처럼 Momentum은 이전 시간의 이동 방향을 저장하기 때문에
- 모든 진동 방향에는 optimum으로 이동하고자 하는, 가로축 방향의 이동 또한 존재한다는 것이다.
- 이러한 momentum의 작용에 의해 위 그림처럼 momentum을 이용하는 SGD는, 그림 2의 기본적인 SGD 보다 더 빠르게 optimum으로 찾아갈 수 있는 것이다.
특징
- Momentum을 통해 기대할 수 있는 다른 이점은, Local optimum을 회피할 수도 있다는 것이다.
- Local optimum에 빠지면, 알고리즘이 Local optimum 주위를 계속해서 반복하는 현상이 발생한다.
- 이 때 momentum을 이용한다면, momentum이 일종의 관성처럼 작용하여 Local optimum 주변을 빠져나갈 수 있게 되는 것이다.
- 그러나 momentum을 이용한다고 해서, global optimum을 찾을 수 있는 것은 아니며
- 보통 실제로 머신 러닝 연구를 할 때는 Local optimum을 회피하겠다는 목적으로 momentum을 사용하지는 않는다.
NAG (Nesterov accelerated gradient)
기본적인 momentum 방식은 이동을 중지해야 하는 지점에 도달해도, momentum에 의해 해당 지점을 지나칠 수 있다는 문제가 있다.
NAG는 이러한 문제점을 해결하기 위해 제안되었다.
NAG의 weight update 산식은 아래와 같이 기본적인 momentum 방식과 동일하다.
하지만, NAG에서는 weight(w_ij(t))의 update 방향을 결정하는 momentum(v_ij(t)) 계산 시
momentum에 의해 발생하는 변화를 미리 보고 momentum을 결정한다.
momentum 산식은 아래와 같다.
- β 는 일반적으로 0.9로 설정되는 hyperparameter로써, 이전 gradient의 영향력을 조절한다.
- 따라서, β * v_ij(t-1) 은 이전 시간의 gradient 이고
- ∂L / ∂w^_ij(t) 은 momentum 이 적용된 후의 gradient 이다.
이 때, wˆ_ij(t)의 산식은 아래와 같다.
아래 그림은 weight를 update하는 방향을 설정하는데 있어, 기본적인 momentum 방식과 NAG의 차이를 보여준다.
- 기본적인 momentum 방식은, 이전의 시간의 momentum과 독립적으로 현재 시간의 gradient를 더함으로써 다음 시간의 gradient를 정했다.
- 반면에 NAG에서는, 먼저 momentum 만큼 update를 했다고 가정한 뒤에 해당 지점에서 gradient를 계산하고, 이를 기반으로 다음 gradient의 update의 방향을 결정한다.
- 즉, 기본적인 momentum 방식은 스텝을 계산해서 움직인 후, 이전에 내려 오던 관성 방향으로 다음 스텝을 밟는 것이며
- NAG 방식은, 일단 관성 방향으로 먼저 움직이고, 움직인 자리에서 스텝을 계산한 뒤 다음 스텝을 밟는 것이다.
- 기본적인 momentum 방식은, 현재의 가속도를 고려하지 않고 속도를 설정한다면, NAG는 현재의 가속도를 어느정도 고려하여 속도를 설정한다고 생각할 수 있다.
- 이러한 update 방식을 통해 NAG는 momentum을 이용한 빠른 이동이라는 장점을 유지하면서도 momentum에 의해 과하게 이동하는 단점을 완화했다.
AdaGrad (Adaptive Gradient)
AdaGrad는 2011년에 제안된 SGD 기반의 알고리즘으로써, 최적화 과정을 효율적으로 만들기 위해
weight 업데이트 시, 고정된 learning rate가 아니라 각각의 weight마다 적합한 learning rate를 자동으로 설정한다.
학습 과정에서 변화가 많았던 매개변수들은 optimum의 근처에 있을 확률이 높기 때문에, learning rate를 작게 함으로써 더욱 세밀하게 update가 되도록 만들고,
변화가 적었던 매개변수들은 optimum에서 멀리 벗어나 있을 확률이 높기 때문에, learning rate를 크게 함으로써 더욱 빠르게 optimum으로 수렴하도록 만드는 것이다.
경사 하강법에서 매개변수의 gradient(∂L / ∂w_ij(t)) 크기는, 매개변수가 현재 시간에 얼마나 많이 변화되었는지를 나타낸다.
따라서 AdaGrad는 이러한 점을 이용하여, 매개변수가 현재 시간까지 얼마나 많이 변화되었는지를 다음과 같이 g_ij(t)로 나타낸다.
- g_ij(t-1) 는 매개변수가 이전 시간까지 얼마나 많이 변화되었는지를 의미한다.
- ∂L / ∂w_ij(t) 는 매개변수가 현재 시간에 얼마나 많이 변화되었는지를 의미한다.
- 이 둘을 더해, 매개변수가 현재 시간까지 얼마나 많이 변화되었는지를 g_ij(t)로 나타낼 수 있다.
매개변수가 현재 시간까지 얼마나 변화(g_ij(t))해왔는지를 계산한 다음에는, 아래의 식과 같이 w_ij(t)를 update한다.
- 이 때, ϵ은 일반적으로 10^−8와 같은 매우 작은 수로 설정되는 상수로써, 0으로 나누는 것을 방지하기 위해 추가되었다.
- 위 식을 보면, weight가 현재 시간까지 얼마나 많이 변화했었는지를 의미하는 g_ij(t)가 클 수록, 전체 learning rate인 (η / √g_ij(t) + ϵ )가 작아지는 것을 볼 수 있다.
- 즉, learning rate 가 현재까지 많이 변화했으면, 줄이는 방향으로 진행된다는 것이다.
특징
- 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이다.
RMSProp (Root Mean Square Propagation)
RMSProp은 학습이 진행될 수록 learning rate가 극단적으로 감소하는 AdaGrad의 문제점을 해결하기 위해 제안되었다.
AdaGrad에서는 g_ij(t) 산식에서
매개변수가 이전 시간까지 얼마나 많이 변화되었는지를 의미하는 g_ij(t-1) 와
매개변수가 현재 시간에 얼마나 많이 변화되었는지를 의미하는 ∂L / ∂w_ij(t) 를 단순히 더해서 사용했다.
그러나 RMSProp에서는, g_ij(t-1) 와 ∂L / ∂w_ij(t) 에 가중치를 부여해서 다음과 같이 사용한다.
- 시간이 흐름에 따라 오래된 데이터의 영향이 지수적으로 감쇠하도록 설계한 것이며, 이를 지수 가중 평균 방식이라고 부른다.
그 다음, weight update는 AdaGrad와 동일하게 진행한다.
- 이 식에서 ϵ은 10^−8과 같은 매우 작은 수로 설정된다.
- AdaGrad에서의 g_ij는 현재 시간까지의 변화량의 합으로 정의되기 때문에, 시간이 지날수록 증가하고, 이에 따라 learning rate는 감소한다.
- 그러나, RMSProp에서의 g_ij는 이전의 변화량과 현재의 변화량에 가중치를 주어, 현재 변화량이 더 높은 경향을 줄 수 있도록 설계 되어있기 떄문에, learning rate가 급격하게 감소하는 현상을 방지할 수 있다.
예를 들어 β가 0.9인 경우, g_ij(t)는 다음과 같이 계산된다.
- 이전 변화량의 경향은 점점 작아지는 것을 볼 수 있다.
Adam (Adaptive Momentum Estimation)
아마도 Adam은 현재 deep neural network의 학습에 가장 광범위하게 이용되고 있는 알고리즘일 것이다.
딥 러닝 실험에선 일반적으로 Adam이 가장 좋은 학습 성능을 보인다.
Adam을 간단히 말하자면, Momentum과 RMSProp를 합친 것 같은 알고리즘이다.
Momentum은 이전 gradient의 경향을 사용하는 알고리즘이고
RMSProp은 이전 learning rate의 경향을 사용하는 알고리즘이다.
즉 momentum의 개념을 이용하지만, gradient의 경향(momentum)을 나타내는 v_ij와 learning rate의 경향을 나타내는 g_ij는 다음과 같이 지수 가중 평균으로 계산된다.
- 이 때, β1, β2 는 일반적으로 각각 0.9와 0.999로 설정된다.
Adam의 논문에서는, v_ij와 g_ij를 그대로 이용하는 것이 아니라, unbiased expectation의 형태로 이용하기 위해 다음과 같이 변형한다.
이 식에서 β_1(t)와 β_2(t)는 각각 β1과 β2를 t번 곱한 것이다.
Unbiased expectation이 식 (15, 16)과 같이 계산되는 이유는 다음 링크에 설명되어 있다.
최종적으로 w_ij에 대한 update는 아래 식과 같이 이루어진다.
참고
'AI > Deep Learning' 카테고리의 다른 글
[DL] End-to-End Deep Learning 이란? (6) | 2021.01.27 |
---|---|
[DL] 배치 정규화(Batch Normalization) (0) | 2021.01.21 |
[DL] 지수 가중 평균 (Exponentially Weighted Averages) (1) | 2021.01.20 |
[DL] Regularization (Dropout) (0) | 2021.01.19 |
[DL] 가중치 초기화 (1) | 2021.01.19 |