딥러닝 최적화(Optimization)

2024. 5. 21. 13:05AI & Data Science/Deep Learning

1. GD vs SGD

 

GD(Gradient Descent) 는 시작 지점에서 기울기의 반대 방향으로 하강하면서 손실 함수(loss function)를 최소화하는 지점을 찾기 위한 가장 직관적인 방법입니다. 이처럼 전체 데이터 셋을 가지고 학습하게 되면 안정적이긴 하지만, 계산량과 학습 비용이 많아지게 됩니다.

 

이때 전체 데이터 셋이 아닌, 무작위로 뽑은 데이터들에 대한 Gradient Descent를 진행하고, 이를 반복하며 정확도를 찾아 나가는 것을 SGD(Stochastic Gradient Descent)라고 합니다.

 

데이터셋은 IMDB 영화 리뷰 데이터 셋을 사용합니다. 해당 데이터셋은 훈련용 데이터 25,000개와 테스트용 데이터 25,000개로 이루어져 있으며, 레이블은 긍정/부정으로 두 가지입니다. 이때 긍정은 1, 부정은 0으로 표시되어 있습니다. 우리의 목표는 전처리된 영화 리뷰 데이터를 가지고 그 리뷰가 긍정적인지 혹은 부정적인지를 예측하는 것입니다.



GD와 SGD의 모델은 똑같이 하고 batch size를 GD는 25000, SGD 500으로 하였다.

 

scores_gd:  0.6955338
scores_sgd:  0.63184285

 

 

 

2. 모멘텀을 적용한 모델 비교하기.

 

SGD는 손실 함수(loss function)의 최솟값에 도달하는 동안 Gradient가 진동하여 최적값에 도달하기까지의 시간이 오래 걸리는 단점을 가지고 있습니다. 이를 보완하기 위해 사용되는 모멘텀(momentum) 기법은 관성의 개념을 이용해 최적값에 좀 더 빠르게 도달할 수 있도록 도와줍니다.

 

SGD에서 momentum을 사용하기 위한 함수/라이브러리

  • tf.keras.optimizers.SGD(lr, momentum):
    • lr : 학습률 (learning rate) (lr >= 0), 기본값 0.1
    • momentum : 진동을 막아주고 SGD를 가속하는 파라미터 (momentum >= 0), 기본값 0.9

 

sgd_opt = tf.keras.optimizers.SGD(lr = 0.01, momentum = 0)
sgd_model.compile(loss = 'binary_crossentropy', optimizer = sgd_opt, 
    metrics = ['accuracy', 'binary_crossentropy'])
    
msgd_opt = tf.keras.optimizers.SGD(lr = 0.01, momentum = 0.9)
msgd_model.compile(loss = 'binary_crossentropy', optimizer = msgd_opt, 
    metrics = ['accuracy', 'binary_crossentropy'])

 

 

 

scores_sgd:  0.62154835
scores_msgd:  0.5680819

 

모멘텀을 사용한 모델이 더 좋다!

 

 

 

3. Adagrad, RMSprop, Adam 최적화(optimize) 알고리즘

Adagrad

Adagrad(Adaptive Gradient) 최적화 알고리즘은 손실 함수(loss function)의 값을 최소로 만드는 최적의 가중치를 찾아내기 위해 learning rate를 조절해 하강하는 방법 중 하나입니다.

기존 방식이 가중치들의 업데이트를 같은 속도로 한꺼번에 하는 방법이었다면, Adagrad는 가중치 각각의 업데이트 속도를 데이터에 맞추어(adaptively) 계산해 적절한 learning rate로 하강하도록 합니다.

 

  • tf.keras.optimizers.Adagrad(lr, epsilon, decay) :
    • lr : 학습률 (learning rate) (lr >= 0), 기본값 0.1
    • epsilon : 연산 시 분모가 0이 되는 것을 막는, 0에 가까운 상수 (epsilon >= 0), 기본값 0.000001
    • decay : 업데이트마다 학습률을 비율만큼 줄여주는 파라미터 (decay >= 0), 기본값 0.0

RMSprop

RMSprop 최적화 알고리즘은 학습이 진행될수록 가중치 업데이트 강도가 약해지는 Adagrad의 단점을 보완하고자 제안된 방법입니다.

RMSProp은 과거의 gradient 값은 잊고 새로운 gradient 값을 크게 반영해서 가중치를 업데이트합니다.

RMSprop

  • tf.keras.optimizers.RMSprop(lr) :
  • lr : 학습률, 기본값 0.1

Adam

Adam은 최적화 알고리즘 중 가장 발전된 기법입니다. RMSProp과 모멘텀(momentum)을 함께 사용함으로써, 진행 방향과 learning rate 모두를 적절하게 유지하면서 학습할 수 있도록 고안되었습니다.

Adam

  • tf.keras.optimizers.Adam(lr, beta_1, beta_2) :
  • lr : 학습률, 기본값 0.01
  • beta_1 : 모멘텀을 결정하기 위해 사용하는 파라미터 (beta_1 >= 0 ), 기본값 0.9
  • beta_2 : step size를 결정하기 위해 사용하는 파라미터 (beta_2 >= 0), 기본값 0.999

 

scores_adagrad:  0.6945019
scores_rmsprop:  0.6222704
scores_adam:  0.6003031

 

 

 

일반적으로 Adam의 성능이 제일 좋고, 그 다음 RMSProp, Adagrad 순으로 성능이 좋다고 알려져 있습니다.