성장通

최적화 알고리즘 - SGD, 네스테로프, AdaGrad, RMSProp, Adam 본문

ML&DL/ML DL 기본기

최적화 알고리즘 - SGD, 네스테로프, AdaGrad, RMSProp, Adam

백악기작은펭귄 2024. 1. 6. 23:43

최적화 알고리즘 - SGD, 네스테로프, AdaGrad, RMSProp, Adam

신경망의 손실 함수가 복잡한 경우, 학습의 기본 최적화 알고리즘인 경사 하강법(Gradient Descent)과 미니 배치 훈련 방식으로 변형된 확률적 경사 하강법(Stochastic Gradient Descent, 이하 SGD)만으로는 최적해를 찾기 어려울뿐더러 학습 속도 또한 느리다. 이러한 한계를 극복하기 위해 확률적 경사 하강법을 변형한 많은 알고리즘이 제안되었다. 그중 주요 최적화 알고리즘인 SGD 모멘텀, 네스테로프 모멘텀, AdaGrad, RMSProp, Adam을 살펴보도록 하자.


확률적 경사 하강법의 문제점

확률적 경사 하강법의 개선 알고리즘들을 살펴보기 전에, 확률적 경사 하강법에는 어떠한 문제점이 있는지 알아보도록 하자.

 

고정된 학습률

스텝 크기(step size) 혹은 학습률(learning rate)은 경사 하강법 계열에서 최적화를 진행할 때 '한 번에 얼마나 많이 움직일 것이냐'를 결정하는 값이다. 이는 학습 속도 및 성능과 밀접한 관련이 있다. SGD는 고정된 학습률을 사용하는 알고리즘이기 때문에 연구자가 실험적으로 학습률을 지정해야 했다. 학습률이 너무 낮으면 학습 속도가 매우 느려질 수 있고, 반대로 학습률이 너무 크면 Local minimum에 빠져 최적해를 찾지 못하거나 오히려 손실이 점점 커지도록 발산해 버릴 수도 있다. 이 때문에 적절한 학습률을 지정하는 것은 매우 중요한 일이다. 하지만 최적의 학습률을 정하는 것은 쉬운 일이 아니었고, 이 때문에 SGD는 학습 단계에서의 비효율이 발생했다.

 

협곡 모양 곡면에서의 진동

SGD는 가장 가파른 방향으로 이동하기 때문에 손실 곡면의 등고선에 대해 항상 직각 방향으로 이동한다. SGD 방식을 사용할 경우 장축이 아주 길고 단축이 짧은 타원형 모양으로 표현되는 협곡에서 이동 궤적이 진동(oscilliate)하며 잘 수렴하지 못하는 상황이 종종 발생한다.

 

 

즉, 손실 곡면의 선이 타원형일 때 1차 미분인 경사 하강법만으로는 장축을 따라 부드럽게 진행할 수 없다는 문제점이 존재한다.

 

안장점에서의 학습 종료

손실 함수 곡면에서 임계점(critical point)은 미분값이 0인 지점으로, 최대점(maximum point), 최소점(minimum point), 안장점(saddle point)이 된다. 여기서 안장점이란 한쪽 축에서는 최소이나 다른 쪽 축에서는 최대인 지점으로, 말의 안장을 닮았다고 해서 붙여진 이름이다.

 

 

SGD 방식은 임계점에 도달할 경우, 해당 지점이 최대점인지 최소점인지 혹은 안장점인지 구분하지 못하고 학습이 종료될 수 있다. 물론 해당 임계점에서 loss를 계산해 보면 최소점에서의 loss보다 안장점에서의 loss가 더 크고, 또 조금만 움직여도 쉽게 더 낮은 loss를 보이는 지점을 찾아나갈 수 있지만 일반적인 SGD는 여전히 안장점에서의 학습 종료 위험을 안고 있게 된다.


SGD 모멘텀

SGD 모멘텀(Momentum)은 이름에서 알 수 있듯이, 최적해를 향해 진행하던 속도에 관성을 주어 SGD의 느린 학습 속도 및 안장점에서 학습이 종료되어 버릴 수 있는 문제를 개선한 최적화 알고리즘이다. SGD 모멘텀은 현재 시점에 가장 가파른 방향인 그래디언트 벡터에 현재의 속도 벡터를 더해서 다음 위치를 정한다.

 

 

SGD 모멘텀을 수식으로 표현하면 다음과 같다. 여기서 $v_t$는 현재 시점 t의 속도이고 $\triangledown f(x_t)$는 현재의 그래디언트 값이며 $\rho$는 마찰 계수(friction coefficient)이다. 마찰 계수는 보통 0.9나 0.99와 같이 1에 가까운 값을 사용한다.

 

$$
v_{t+1} = \rho v_t + \triangledown f(x_t)
$$
$$
x_{t+1} = x_t - \alpha v_{t+1}
$$

 

다음 속도 $v_{t+1}$은 현재 속도에 마찰 계수를 곱한 뒤 현재의 그래디언트 값을 더해서 구한다. 파라미터의 업데이트 식은 SGD의 파라미터 업데이트 식과 같은 형태를 사용하나, 그래디언트 대신 속도 $v_{t+1}$을 사용한다는 점이 다르다.

 

이와 같이 속도에 관성이 작용하면 손실 곡선 위에서의 이동 방향이 갑작스레 바뀌지 않게 되어 이동 궤적의 진동이 감소하고 같은 방향으로 계속 진행할 때에는 가속도가 붙어 더욱 빠르게 학습하게 된다. 또한 안장점이나 local minimum에 도달한 경우에도 탈출이 비교적 쉽고 손실 함수의 표면이 울퉁불퉁하여 기울기가 계속 바뀌는 상황에서도 관성이 작용하여 부드럽게 학습을 진행할 수 있게 된다.

 

SGD 모멘텀의 문제점

다만, 이러한 SGD 모멘텀 방식에도 단점은 존재한다. SGD 모멘텀은 손실 함수의 경사가 매우 가파를 경우 가속도에 의해 최저점을 지나쳐버리는 오버슈팅(overshooting)이 발생할 수 있다. 이러한 오버슈팅을 막기 위해서는 최적해 주변의 경사를 평탄하게 해주는 정규화 기법을 사용하거나, 관성에 의해 이동한 위치의 그래디언트 벡터를 이용해 그래디언트를 교정하는 방식을 사용할 수 있다. 이중 두 번째 방법을 사용하여 SGD 모멘텀의 문제점을 해소한 것이 바로 이어 설명할 네스테로프 모멘텀이다.


네스테로프 모멘텀

네스테로프 모멘텀(Nesterov Momentum)은 SGD 모멘텀과 유사하게 진행 속도에 관성을 주는 방법이다. 앞에서도 간단히 언급했지만, 네스테로프 모멘텀은 이러한 관성에 의해 이동한 위치의 그래디언트 값을 이용하여 그래디언트를 업데이트함으로써 오버슈팅이 발생하지 않도록 교정해 준다.

 

네스테로프 모멘텀을 수식으로 표현하면 다음과 같다. 이전과 동일하게, $v_t$는 현재 시점 t의 속도이고 $\triangledown f(x_t)$는 현재의 그래디언트 값이며 $\rho$는 마찰 계수(friction coefficient)이다.

 

$$
v_{t+1} - \rho v_t - \alpha \triangledown f(x_t + \rho v_t)
$$
$$
x_{t+1} = x_t + v_{t+1}
$$

 

위 식에서 $\triangledown f(x_t)$ 안에 $x_t$에 $\rho v_t$를 더한 $x_t + \rho v_t$를 사용한 것을 확인할 수 있는데, 이것이 바로 관성에 의해 이동한 위치의 그래디언트를 사용하기 위함이다. 현재 속도에 마찰 계수를 곱한 값에서 미리 이동한 위치의 그래디언트 값을 빼서 다음 시점의 속도를 계산한다.

 

이와 같은 방법을 통해 네스테로프 모멘텀은 진행 방향을 교정하고 최저점을 지나쳐 손실 함수를 따라 올라가 버리는 것을 방지함으로써 오버슈팅 문제를 해결한다. 이러한 업데이트 과정을 그림으로 나타내면 다음과 같다.

 

 

위 그림에서 파란색 벡터는 SGD 모멘텀에 의해 이동한 두 번의 벡터 진행이고 초록색은 갈색 네스테로프 모멘텀에 의해 교정된 모멘텀이다. 이 교정은 갈색에서 그래디언트로 한 스텝 더 이동한 벡터인 빨간색 벡터를 더해서(accumulate) 계산된다. 이러한 방식으로 네스테로프 모멘텀은 관성이 커지더라도 오버슈팅이 되지 않도록 교정함으로써 오버슈팅을 억제할 수 있다.

 

그래디언트 계산 트릭

네스테로프 모멘텀에서는 관성만큼 이동한 지점의 그래디언트를 계산하기 위해 이동했다가 다시 돌아와야 하므로 계산이 조금 복잡하다. 이러한 계산을 단순화하기 위해 다음과 같은 트릭을 사용할 수 있다. 트릭의 핵심 아이디어는 $x_t + \rho v_t$를 새로운 변수 $\tilde{x}_t=x_t + \rho v_t$로 치환하는 것이다.

 

$$
v_{t+1} = \rho v_t - \alpha \triangledown f(\tilde{x}_t)
$$
$$
\tilde{x}_{t+1} = \tilde{x}_t - \rho v_t + (1+\rho)v_{t+1} = \tilde{x}_t + v_{t+1} + \rho(v_{t+1} - v_t)
$$


AdaGrad

손실 함수의 경사가 완만할 때는 큰 폭으로 빠르게 이동하는 것이 좋고, 반면 경사가 가파를 때는 최저점을 지나치지 않도록 작은 폭으로 보수적으로 이동하는 것이 좋다. 이를 위해서는 현재의 손실 함수 곡면의 기울기에 따라 이동 폭을 조절할 필요가 있는데, 이러한 아이디어로부터 등장한 알고리즘이 바로 AdaGrad(Adaptive Gradient)이다. AdaGrad는 손실 함수 곡면의 변화량 크기에 따라 적응적으로 학습률을 정하는 알고리즘으로, t 시점까지의 모든 지점에서의 기울기 값을 가지고 있는 기울기 벡터 내 각 기울기의 제곱합을 계산해서 다음 시점 t+1에서의 곡면의 변화량을 구할 수 있다.

 

$$
곡면의~변화량=r_{t+1}=\triangledown f(x_1)^2 + \triangledown f(x_2)^2 + ... + \triangledown f(x_t)^2
$$

 

이렇게 구한 곡면의 변화량에 제곱근인 $\sqrt{r_{t+1}}$로 SGD 파라미터 업데이트 식의 학습률 $\alpha$를 나눠주면 적응적 학습률이 된다. 적응적 학습률은 곡면의 변화량에 반비례하므로, 곡면의 변화량이 클수록 학습률이 작아져 이동 속도가 느려진다. 이때, 곡면의 변화량이 0이 되어 계산이 불가능해지는 것을 막기 위해 아주 작은 상수인 $\epsilon$(보통 1e-7 내지는 1e-8)을 분모에 더해준다.

 

$$
r_{t+1} = r_t + \triangledown f(x_t)^2
$$
$$
x_{t+1} = x_t - {\alpha \over \sqrt{r_{t+1}} + \epsilon}\odot \triangledown f(x_t)
$$

 

이처럼 AdaGrad는 모델의 파라미터별로 곡면의 변화량을 계산하므로 파라미터별로 개별 학습률을 갖는 효과가 생기게 되어 좀 더 정확하고 빠르게 최적해로 수렴할 수 있게 된다.

 

AdaGrad의 문제점

이러한 AdaGrad에도 치명적인 단점이 존재한다. AdaGrad는 곡면의 변화량을 모든 시점의 기울기 값의 제곱합으로 계산하기 때문에 시간이 지날수록 곡면의 변화량은 커지고 이에 반비례하여 적응적 학습률을 점점 낮아지게 된다. 이와 같은 특징 때문에, 만약 학습이 가파른 손실 함수 위치에서 시작했다면 초반부터 적응적 학습률이 급격하게 낮아져 조기에 학습이 중단되어 버릴 수 있다. 이처럼 조기에 학습이 중단되는 문제를 곡면의 변화량을 구하는 공식을 수정함으로써 해결한 것이 바로 RMSProp이다.


RMSProp

RMSProp(Root Mean Square Propagation)은 곡면의 변화량을 계산할 때 전체 시점이 아닌 최근 경로의 변화량을 측정함으로써 곡면 변화량이 누적되어 지속적으로 증가하는 문제를 해결하였다.

RMSProp은 최근 경로의 곡면 변화량을 측정할 때 t 시점의 $r_t$와 그래디언트 제곱값인 $\triangledown f(x_t)^2$을 가중합산하여 $r_{t+1}$을 계산한다. 여기서 $\beta$는 가중치 파라미터로, 보통 0.9를 사용하여 그래디언트 값보다 $r_t$에 훨씬 큰 가중치를 부여한다.

 

$$
r_{t+1} = \beta r_t + (1-\beta)\triangledown f(x_t)^2
$$

 

위 식을 이용하여 $r_1$부터 $r_t$까지 가중합산을 하여 $r_{t+1}$을 계산하는 공식을 유도해 보면 다음과 같다.

 

$$
r_{t+1} = \beta^t r_1 + (1-\beta)(\triangledown f(x_t)^2 + \beta\triangledown f(x_{t-1})^2 + ... + \beta^{t-1}\triangledown f(x_1)^2)
$$

 

이처럼, RMSProp을 사용하면 $r_{t+1}$을 계산할 때 최근 변화, 즉 $\triangledown f(x_t)$는 많이 반영하고 오래된 변화, 즉 $\triangledown f(x_1)$은 적게 반영하게 된다. 여기서 그래디언트 제곱값에 곱해지는 가중치가 지수승으로 변화하기 때문에 지수가중평균(exponentially weighted average)이라고 하며, 단계마다 새로운 그래디언트 제곱의 비율을 반영하여 평균이 업데이트되기 때문에 이와 같은 방법을 지수가중이동평균(exponentially weighted moving average)이라고 한다.


Adam

마지막으로 소개할 최적화 알고리즘은 Adam(Adaptive Momentum estimation)이다. Adam은 최적화 성능이 우수하고 잡음(noise)에 강건하여서 딥러닝 학습 시 가장 흔하게 사용되는 옵티마이저(Optimizer)로, SGD 모멘텀과 RMSProp의 각 장점을 결합한 형태이다.

 

Adam은 속도를 계산하는 1차 관성(first momentum)과 그래디언트 제곱의 지수가중이동평균을 구하는 2차 관성(second momentum)으로 구성되어 있다. 각각은 SGD 모멘텀과 RMSProp의 식과 유사한 형태를 가지고 있다. 파라미터 업데이트 식의 경우 AdaGrad에서 사용한 식과 유사하지만 그래디언트 값 대신 관성을 갖는 속도 $v_{t+1}$을 이용하여 최근 경로의 곡면 변화량(feat. RMSProp)과 관성(feat. Momentum) 모두를 사용하게 된다.

 

$$
v_{t+1} = \beta_1 v_t + (1-\beta_1)\triangledown f(x_t)
$$
$$
r_{t+1} = \beta_2 r_t + (1-\beta_2)\triangledown f(x_t)^2
$$
$$
x_{t+1} = x_t - {\alpha \over \sqrt{r_{t+1}} + \epsilon}\odot v_{t+1}
$$

 

학습 초기 경로 편향 문제

그런데 위와 같은 식을 사용하여 학습을 진행할 경우 훈련 시작 시점에 1차 관성 $v_0$과 2차 관성 $r_0$이 모두 0으로 초기화되면서 적응적 학습률이 매우 커져 시작 지점에서 멀리 떨어진 곳으로 한 번에 이동해 버리는 문제점이 발생한다. 이는 학습 경로의 편향을 야기할 수 있으며 자칫 최적해로부터 멀어지게 되는 결과를 가져올 수도 있다.

 

이러한 초기 경로의 편향 문제는 적응적 학습률을 이용하는 RMSProp이 가지는 문제로, Adam은 이 편향을 제거하기 위해 $v_{t+1}={v_{t+1}\over(1-\beta_1^t)}$$r_{t+1} = {r_{t+1}\over(1-\beta_2^t}$를 적용함으로써 이를 해결하였다. 이 식에 의해 $v_1=0.1\triangledown f(x_0)$과 $r_1=0.01\triangledown f(x_0)^2$이 상쇄되어 학습 초반에 학습률이 급격히 커지는 편향이 제거되고 훈련이 진행될수록 두 식의 분모 $(1-\beta_1^t)$와 $(1-\beta_2^t)$가 1에 수렴하면서 원래의 알고리즘으로 바뀌게 된다.


기타 최적화 알고리즘 종류

여기서 소개한 최적화 알고리즘 외에도 다양한 알고리즘들이 존재한다. 각 내용을 정말 자세히 알아야 할 필요는 보통 없지만, 어떤 맥락에서 어떤 알고리즘이 등장했고, 또 어떤 개념을 이어받게 되었는지 정도는 알아두면 이후 연구에 많이 도움이 될 수 있기에 한 번쯤 봐두면 좋다.

 

 

'ML&DL > ML DL 기본기' 카테고리의 다른 글

다중 분류 모델과 카테고리 분포  (0) 2022.07.13
이진 분류 모델과 베르누이 분포  (0) 2022.07.06
분류와 회귀  (0) 2022.06.22
범용 함수 근사기로서의 신경망  (0) 2022.06.15
순방향 신경망 구조  (0) 2022.06.08