ML 🐼/딥러닝 🔫

[딥러닝] 옵티마이저 (Optimizer)

Dobby98 2023. 1. 4. 16:06

각 옵티마이저 학습 과정을 시각화

 

1. Optimizer? 

딥러닝 모델을 학습하다 보면 마주치는 장치가 있다. 바로 옵티마이저(Optimizer)이다.

옵티마이저는 무엇일까?

 

쉽게 말해서 loss function(ex MSE, MAE...)을 사용해서 구한 오차를 이용하여 미분을 하여 기울기를 구하고이를 통해서 어떻게 뉴런 네트워크의 파라미터를 업데이트 할지 결정하는 방법이다.

 

즉, 옵티마이저를 결정함에 따라서 파라미터의 수정 방법과 학습의 정도가 차이 날 수 있다.물론 명심해야 할 것은 모든 학습에서 최고의 방법은 존재하지 않는다.각 옵티마이저를 사용해보고 비교한 다음 최적의 방법을 선택하는 것이 최선이다.

위 사진은 옵티마이저의 발전단계를 표현한 사진이다. 

스텝 방향을 조절하는 방법과 스텝 사이즈를 조절하는 방법으로 크게 나누어진다.

이에 대한 내용은 아래에서 자세히 다루겠다.

 

당연히 머신러닝의 Gradient Desent(경사하강법)이 그 시작점으로 최근 학습에서는Adam이 대표적으로 활용되고 있다.

(실제로 Adam의 경우 대부분의 학습에서 좋은 성능을 가진다)

아래에서 이러한 옵티마이저의 내용들을 상세히 살펴보도록 하자

 

2. Optimizer 종류

2-1 Gradient Desent (경사하강법) + Stochastic gradient descent(확률적 경사하강법) + Mini-Batch Gradient Desent(미니 배치 경사하강법)

경사하강법 수식

경사하강법은 머신러닝을 공부한 사람이라면 대부분 아는 방법이다.

가중치를 조절하는 가장 기본적인 방법이기 때문이다.

 

수식을 해석하면 다음과 같다

$\eta$ :학습률(Learning rate)

$\frac{\partial L}{\partial W}$ : Loss function을 가중치 W로 미분한 값(Gradient)

즉, 현재 $W$(가중치)에 Learning rate * Gradinet를 곱한 값을 빼주는 것이다.

 

하지만 이러한 방법은 데이터의 양이 많아지면 학습 시간도 동시에 증가한다는 것을 의미한다.

 

결국 여기서 연장되어서 해결하기 위해서 등장한 방법이 SGD(Stochastic gradient descent) 확률적 경사하강법이다

수식은 경사하강법과 동일하나 사용하는 데이터의 양을 조절하는 것이다

 쉽게 말해서 확률적으로 하나의 데이터를 뽑아서 이를 통해서 loss 값을 계산하여 가중치를 업데이트 하는 방식이다.

따라서 위의 사진에서 확인할 수 있듯이 과정이 매우 왔다 갔다 하는 것을 볼 수 있다. 그러나 적은 메모리와 적은 학습시간으로 모델을 학습할 수 있다는 장점이 있다

 

그러나 하나의 데이터가 모든 데이터의 오차를 설명할 수 있을까? 이러한 의문에서 또다시 추가되어 등장하게된것이

Mini-Batch Gradient Desent 미니 배치경사하강법이다.

즉, 하나의 데이터가 아니고 모든 데이터가 아닌 부분의 데이터를 활용해서 오차를 계산하고 가중치를 업데이트 하는 방식으로 Batch Gradient Desent(일반적 Gradient Desent)보다 빠르고 SGD보다는 조금더 안정적이라는 장점을 가지고 있다.

  Batch Gradient Desent SGD Mini-Batch Gradient Desent
Batch Size N개의 전체 데이터 N개의 전체 데이터 중 1개 N개의 전체 데이터중 M개 (1<M<N)

 

 

그러나 이러한 방법들은 단점이 분명하게 존재한다.

위의 사진을 보면 우리가 찾고자 하는 극값은 오른쪽에 아래로 볼록한 부분이다. 그러나 경사하강법을 통해서 업데이트를 하면 왼쪽 아래로 볼록한 부분에 멈출 수 있다. (GD한 값이 0이 되는 것 같기 때문에)

이러한 문제점을 Local Minima 문제라고 한다. 

즉, Global Minima를 찾는 것이 문제이지만 Local Minima에 갇혀버리게 된것이다. (2차원일 경우)

 

또한 차원이 많아질때, 즉, 고차원의 경우 Saddle point(안장점) 문제가 발생한다.

즉, 어느 방향에서는 극대값이지만 어느 방향에서는 극소값인 위치가 존재하는 것으로 

평면이 만들어 지기 때문에 경사하강법이 움직이지 못하게 되는 결과로 연결되는 것이다.

 

이해를 위한 영상👇

결국 Gradient Desent의 한계점이 명확하게 존재하며

이를 해결하기 위해서 등장한 방법들을 아래에서 계속해서 설명하겠다.


2-2. Momentum

모멘텀 수식

모멘텀은 쉽게 말해서 '관성'이다. (자동차 브레이크가 바로 먹지 않는 것 처럼)

쉽게 말해서, 아래로 향할 수록 힘을 축적 시켜주는 것이다. 

수식은 경사하강법과 크게 다르지 않다.

하지만 다른 점이 $\alpha V$가 등장했다는 것이다. (Gradinet Desent에 관성을 추가 [관성 = 과거의 속도])

 $\alpha V$가 의미 하는 것은 Accumulation (축적)으로 아래로 향할 수록 $\alpha$의 값이 커지기 때문에 이동 범위가 증가하게 되고 결국 local minima를 통과하는 기법이라고 할 수 있다. (관성의 힘으로 통과)

 

물론 Momentum 또한 SGD를 활용할 수 있다.

Momentum의 또다른 장점은 안정성이다.

위의 사진에서 확인 할 수 있듯이 Momentum의 경우 특정 방향으로 학습 되는 경우 속도가 증가하기 때문에 지그재그의 모양이 줄어들 수 있다.

 

 

그러나 이러한 Momentum에 대해서도 의문점이 들수 있다. Global minima로 향하는 길이 상당히 좁으면  그냥 지나칠 수 있지 않을까?

즉, 매우 가파르고 좁은 모양일 경우 그냥 지나치는 문제가 발생하는 것이다.

 


2-3. Nesterov Accelerated Gradient or Nesterov Momentum

이러한 문제점을 해결하기 위해서 등장한 것이 NAG or NM이다 (같은 말)

Momentum에 Lookahead gradeint라는 업데이트 방법을 추가해서 약간 변형시킨 방법이다.

쉽게 설명하면 현재 위치에서 관성과 관성방향으로 움직인 후

도착한 위치에서 gradient 반대방향을 합하는 방법이다.

모멘텀과 NAG 비교

위의 사진은 Momentum과 NAG를 비교한 것인데

왼쪽 Momentum의 경우 방향이 변화할때  Gradient방향이 Velocity로 인해서 Actual step이라는 중간 방향으로 향하게 되고 NAG의 경우 Velocity 방향으로 이동한 다음 반대 Gradinet 방향으로 향해 Actual step을 만드는 것이다

 

 

Momentum과 NAG를 자세히 이해하고 싶다면 아래 영상참고👇

그러나 이러한 방법 NAG가 가파르고 좁은 모형을 해결하는 것에 대해서 효과적인지는 확실하지 않다. 따라서 다른 접근이 필요하다 바로 '스텝의 사이즈'를 조절하는 방법들이다.

 

위에서 살펴본 Momentum 계열은 스텝의 방향을 조정해서 학습하는 Optimizer들이었다. 

그렇다면 학습률 $\eta$을 조정해서 학습하는 방법은 없을까? 

아래에 등장하는 Ada계열이 그러한 방법들이다.


2-4. Adaptive Gradient Descent (Adagrad)

adagrad

Adaptive 매우 익숙한 단어이다 - Adaboost에서 같은 단어이다.

즉, 맞춤형 경사하강법이다.

 

아이디어는 간단하다. 

위의 수식을 보면 기울기(h의 오른쪽 기울기의 제곱)가 클수록 h가 증가하게 되고 (제곱이기 때문에 매우 증가)

그리고 가중치를 업데이트하는 식에서는 h가 역수로 들어가게 되는데

이를 정리하면

기울기가 증가 할 수록 -> h가 증가 -> 학습률은 하락
기울기가 하락 할 수록 -> h가 하락 -> 학습률이 증가

즉, 기울기가 가파를수록(높을 수록) - 학습률이 하락하기 때문에 천천히(촘촘히) 움직이고

기울기가 평평할수록(낮을 수록) - 학습률이 증가하기 때문에 빠르게(성큼성큼)움직이게 된다.

즉, 평평한 면을 빠르게 통과하고 기울기가 하락할 때는 천천히 움직여서 Global Minima에 도착하는 원리인 것이다

 

따라서 우리가 원하는 Global Minima를 지나치치 않게 된다. (기울기에 맞쳐 속도를 조절하기 때문에)

 

그러나 기울기가 계속해서 낮아지는 모양일경우 학습률이 계속해서 하락하게 되고 걸음걸이가 계속 줄어들기 때문에 학습이 더뎌지는 문제점이 발생하게 되는데  (느려짐)

이를 해결하기 위해서 발전된 방법이 RMS Prop이 등장하게 된다.


2-4. RMS Prop

 

 

RMSprop는 지수 이동평균을 이용한 방법이다.

즉, 앞에서 살펴본 Adagrad의 h가 무한히 커지는 것을 방지하고자 제안된 방법으로 

제프리 힌튼교수가 코세라에서 소개하였다. https://ko.coursera.org/learn/deep-neural-network/lecture/BhJlm/rmsprop

 

https://kr.coursera.org/lecture/deep-neural-network/rmsprop-BhJlm

 

kr.coursera.org

Adagrad 식 h에 (h에 알파를 곱하고 기울기 제곱에 1-알파를 곱한다)  (1-알파)가중치를 곱해주는 것이로 1주기가 지날때 마다 (1-알파)라는 가중치가 이전값에 계속 곱해지기 떄문에 즉, 1부도 작아지기 때문에 시간이 지날수록 h의 크기가 줄어드는 (영향력 감소) 결과를 볼 수 있다. 

즉, 이러한 방식을 통해서 계속해서 기울기가 낮아질때 걸음걸이가 느려지는 것을 어느정도 보완해주는 것이다

 


2-5. Adam (Adaptive Moment Estimation)

마지막 끝판대장같은 Adam이 남아있다. (사실 Adadelta도 있지만 많이 사용하지 않기 때문에 생략)

사실 이 글은 Adam을 보여주기 위한 어그로와 같다 (미안하다 이거 보여줄려고 어그로 끌었다)

 

사실상 대부분 Adam을 Optimizer로 사용하기 때문이다 (일반적으로 제일 학습이 잘된다)

Adam의 아이디어를 한줄로 표현하면

'RMSProp + Momentum'이다.

즉, 스텝의 방향과 스텝의 사이즈를 합친 최고의 복합방법인것이다.

즉, 스텝사이즈와 스텝 방향을 복합적으로 조절해서 앞에서본 모델들의 단점을 보완하는 방법이다.

 

또한 Momentum 대신에 NAG를 활용한 Nadam도 존재한다


지금까지 살펴본 Optimizer를 정리하면 위의 사진과 같다.

앞에서 계속해서 언급했듯이 요즘 딥러닝 학습에서는 Adam을 많이 활용한다 (그냥 이거 쓰라는 말도 있다)

그러나 이러한 방법의 작동원리를 알고 

다양한 방법을 적용한 다음 모델을 비교하는 것이 가장 최적의 방법이라고 할 수 있다.

항상 올바른 길은 존재하지 않기 때문에...

 

다음시간에는 모델의 규제에 대해서 알아보도록하겠다