본문 바로가기
Learning-driven Methodology/DL (Deep Learning)

[Deep Learning] 최적화 (Optimizer)

by goatlab 2022. 1. 3.
728x90
반응형
SMALL

최적화 (Optimizer)

 

데이터의 크기가 클수록 훈련 속도는 느려진다. 따라서 neural network를 빠르게 훈련하기 위해 효율성을 높이기 위한 최적화 알고리즘을 잘 선택해야 한다.

 

 

Gradient Descent

 

경사하강법에서는  에 대해 gradient의 반대 방향으로 일정 크기만큼 이동해내는 것을 반복하여 loss function  의 값을 최소화하는 파라미터 w를 찾는다. 

 

gradient descent은 무작정 기울어진 방향으로 이동하는 방식이기 때문에 탐색 경로가 비효율적이다. 또한 SGD는 방향에 따라서 기울기 값이 달라지는 경우에 적합하지 않은데 최소값의 방향으로만 움직이기 때문에 본래의 최저점으로 기울기의 방향이 좀처럼 향하지 않게 되고 다른 방향을 가리키게 되어 비효율이게 되기도 한다.

 

tf.keras.optimizers.SGD(
    learning_rate=0.01, momentum=0.0, nesterov=False, name="SGD", **kwargs
)
- Batch Gradient Desencet (BGD) : 전체 데이터 셋에 대한 에러를 구한 뒤 기울기를 한번만 계산하여 모델의 parameter를 업데이트 하는 방법

- Stochastic Gradient Descent (SGD) : 임의의 하나의 데이터에 대해서 에러를 구한 뒤 기울기를 계산하여 모델의 parameter를 업데이트 하는 방법


- Mini-batch Gradient Descent (MGD) : 전체 데이터셋에서 뽑은 Mini-batch의 데이터에 대해서 각 데이터에 대한 기울기를 구한 뒤, 그것의 평균 기울기를 통해 모델의 parameter를 업데이트 하는 방법

 

BGD는 학습 한 번에 모든 데이터셋에 대한 기울기를 구하는 것이다. 반면, MGD는 학습 한 번에 데이터셋의 일부에 대해서만 기울기를 구하는 것을 의미한다. 즉 전체 데이터에 대한 기울기가 아닌, mini-batch로 나누어 기울기를 구하여 backpropagation하여 weight를 업데이트 하는 것이다.

 

SGD는 손실함수의 기울기를 계산하여서 이 기울기 값에 학습률 (learning rate)을 계산하여 이 결과 값으로 기존의 가중치 값을 갱신한다다.

 

여기서 gradient descent를 사용하기 위해서는 batch의 크기(mini-batch size)를 선택해야 한다.

 

전체 데이터가 m개 일 때
  • mini-batch size = m -> Batch Gradient Descent
  • mini-batch size = 1 -> Stochastic Gradient Descent
  • mini-batch size = n < m -> Mini-batch Gradient Descent

 

BGD

 

전체 데이터에 대하여 오차를 계산하기 때문에 minimum에 안정적으로 수렴한다. 하지만, 한 번의 iteration마다 모든 학습 데이터를 사용하므로 학습이 오래 걸린다.

장점 : loss가 안정적으로 수렴 (cost function의 optimal로 안정적으로 수렴)
단점 : 한 iteration에 모든 데이터셋을 사용하기 때문에 학습이 오래 걸린다. local optimal을 빠져나오기 힘들다.

 

SGD

 

한 번의 iteration마다 한개의 sample로 gradient descent하는 것이기 때문에, 거의 항상 global minimum에 도달한다. BGD보다 noisy한 이유는, 어떤 샘플은 minimum으로 가는 좋은 샘플일 수도 있고 어떤 샘플은 minimum으로 가기 어려운 샘플일 수도 있기 때문이다. 또한, SGD의 가장 큰 단점은 벡터화 과정에서 속도가 매우 느리다는 것이다. 데이터 하나씩 처리하는 방식이기 때문에 매우 비효율적이다.

장점 : local minimum에 빠질 위험이 적다.
단점 : optimal을 찾지 못할 가능성이 있다. 다른 알고리즘에 비해 속도가 느리다. 

 

MGD

 

한 번의 iteration마다 n (1 < n < m)개의 데이터를 사용하기 때문에 BGD와 SGD의 장점을 합친 알고리즘이다. MGD를 사용하 때는 mini-batch size를 잘 설정해야 한다.

 

Momentum

 

모멘텀은 운동량을 의미한다. 기울기에서 속도의 개념이 추가된 것이다. 속도가 크게 나올수록 기울기가 크게 업데이트 되어 SGD가 가지는 단점을 보완할 수 있다. momentum은 마찰력과 공기저항 같은 것에 해당하며 기울기 업데이트 시 이 폭을 조절하는 역할을 한다. 이에 따라 속도 velocity가 변화한다. 

 

지수 가중 평균 (지수 이동 평균)이란 데이터의 이동 평균을 구할 때 오래된 데이터가 미치는 영향을 지수적으로 감쇠 (exponential decay) 하도록 만들어 주는 방법이다. 

 

RMSprop

 

tf.keras.optimizers.RMSprop(
    learning_rate=0.001,
    rho=0.9,
    momentum=0.0,
    epsilon=1e-07,
    centered=False,
    name="RMSprop",
    **kwargs
)

RMSprop은 Root Mean Square Propatation의 약자로 기울기 강하의 속도를 증가시키는 알고리즘이다. momentum과 마찬가지로 지수 이동 평균이 적용된다. hyperparameter인 로 조절할 수 있다.

 

Adam

 

tf.keras.optimizers.Adam(
    learning_rate=0.001,
    beta_1=0.9,
    beta_2=0.999,
    epsilon=1e-07,
    amsgrad=False,
    name="Adam",
    **kwargs
)

 

아담 (Adam)은 Adaptive Moment Estimation의 약자로 momentum과 RMSprop을 섞어놓은 딥러닝에서 많이 사용되는 최적화 알고리즘이다.

 

hyperparameter
 : learning rate
 : 1차 moment, 대부분 0.9 (의 지수 가중 평균 계산 )
: 2차 moment, 논문에서 0.99 (과 의 지수 가중 평균 계산)
: 논문에서 0.10^{-8} (성능에 거의 영향 없음)

 

그 외 optimizer

 

https://keras.io/api/optimizers/

 

Keras documentation: Optimizers

Optimizers Usage with compile() & fit() An optimizer is one of the two arguments required for compiling a Keras model: from tensorflow import keras from tensorflow.keras import layers model = keras.Sequential() model.add(layers.Dense(64, kernel_initializer

keras.io

 

https://blog.paperspace.com/intro-to-optimization-momentum-rmsprop-adam/

 

Intro to optimization in deep learning: Momentum, RMSProp and Adam

In this post, we take a look at a problem that plagues training of neural networks, pathological curvature.

blog.paperspace.com

 

728x90
반응형
LIST