neural network 학습을 빠르게 하기 위한 다양한 최적화 알고리즘들이 있다
- Gradient descent with momentum
대부분 그냥 gradient descent를 사용한 것 보다 좋은 성능을 가진다고 한다
이 방법을 사용하기 위해서는 exponentially weigthed averages (EMA)에 대해 먼저 알아야 한다
EMA는 평균을 구할 때 모두 같은 가중치를 주어 구하는 것이 아니라 중요한 데이터는 큰 가중치, 중요하지 않은 데이터는 작은 가중치를 주어 더하는 방법이다
식으로는 $\theta$가 데이터일때 $ v_t = \beta v_{t-1}+ (1-\beta)\theta_t $와 같이 표현할 수 있다
$\beta$ , $1-\beta$ 이런 모양처럼 가중치의 합은 1이 되어야 한다
또한 이 식은 $v_t$가 $ \frac{1}{1-\beta} $ 데이터의 평균에 수렴한다고 볼 수 있다
만약 beta가 0.9라면
$ v_{100} = 0.9v_{99}+0.1\theta_{100} $ , $ v_{99} = 0.9v_{98}+0.1\theta_{99} $ 이런식으로 식을 만들 수 있다
결합하여 $ v_{100} = 0.1\theta_{100} +0.9(0.1\theta_{99} + 0.9(0.1\theta_{98}+0.9v_{97})) $ 가 된다
$ v_{100} = 0.1\theta_{100} +0.1 \times0.9 \theta_{99}+0.1 \times(0.9)^2 \theta_{98}+0.1 \times(0.9)^3 \theta_{97} + ... $ 처럼 나타내어보면 exponentially하게 beta가 곱해지는 것을 알 수 있다
이렇게 식을 전개해두었을 때도 등비수열의 합 공식을 사용하여 확인해보면 모든 가중치를 더하면 1이 된다
식으로 구현 할 때는 실제로 $v$값을 다 저장하지는 않고 예전것은 버려가면서 구현한다
EMA를 사용할 때 $v_0$을 0으로 지정해둔다면 초반에는 $v$의 값이 너무 작게 나오게 된다
이를 보정하기 위해 $v_t \rightarrow \frac{v_t}{1-\beta^t}$로 사용하는 bias correction 방법이 있다
$\beta^t$가 커지면 0으로 수렴하면서 점점 영향을 덜 주고 초반에는 $v_t$를 키워주는 효과가 있다
아무튼 이러한 EMA를 사용하는 것이 gradient descent with momentum이다
$dW$를 사용하는 것이 아니라 $ V_{dW} = \beta V_{dW} + (1-\beta)dW $
$db$를 사용하는 것이 아니라 $ V_{db} = \beta V_{db} + (1-\beta)db $를 사용한다
update 과정은 $ W := W - \alpha V_{dW} , b := b - \alpha V_{db} $ 처럼 진행한다
이렇게 모멘텀을 사용하면 gradient 값을 smoothing 해주어서 mini batch 를 사용할 때 처럼 gradient가 노이지 할 때 좋다
실제로 구현할 때는 beta라는 하이퍼파라미터가 하나 늘었지만 대부분 0.9로 쓰는 경향이 있다
- Adagrad & RMSProp
root mean sqaure propagation
이런식으로 생긴 loss function이 있다면 w방향으로는 빠르게 이동, b방향으로는 느리게 이동하는 것이 진동을 해결할 수 있어 좋을 것이다
AdaGrad를 사용하면 $dW,db$을 계속 기울기값을 제곱하여 더해준 값으로 나누어주면서 학습률을 낮춘다
하지만 AdaGrad를 사용한다면 0에 수렴할 수 있으므로 여기에 EMA를 적용한 RMSProp을 사용한다
$ S_{dW} = \beta S_{dW} + (1-\beta){dW}^2 $, $ S_{db} = \beta S_{db} + (1-\beta){db}^2 $ 값을 이용한다
$dW$가 작다면 $ \frac{1}{\sqrt{S_{dW}}} $는 커진다
따라서 update 과정에서 $ W := W - \alpha \frac{dW}{\sqrt{S_{dW}}} $처럼 진행한다면 $S_{dW}$를 사용하지 않았을 때보다 가파르게 이동한다
$db$가 크다면 $ \frac{1}{\sqrt{S_{db}}}$는 커진다
따라서 update 과정에서 완만하게 b가 이동한다
이렇게 RMSProp을 사용하면 노이즈도 잡을 수 있고 학습 속도도 빨라진다
- Adam optimizer
제일 많이 쓰는 Adaptive moment estimation optimizer
momentum과 RMSProp을 합쳐서 쓰는 거라고 생각하면 된다
$ V_{dW} = \beta_1 V_{dW} + (1-\beta_1)dW , V_{db} = \beta_1 V_{db} + (1-\beta_1)db $ momentum에서 나온 $ \beta_1$
$ S_{dW} = \beta_2 S_{dW} + (1-\beta_2){dW}^2, S_{db} = \beta_2 S_{db} + (1-\beta_2){db}^2 $ RMSProp에서 나온 $ \beta_2$를 전부 사용한다
여기에 bias correction도 적용하여 $ V^{corrected}_{dW} = \frac{V_{dW}}{1-\beta_1^t}, V^{corrected}_{db} = \frac{V_{db}}{1-\beta_1^t} $과 $ S^{corrected}_{dW} = \frac{S_{dW}}{1-\beta_2^t}, S^{corrected}_{db} = \frac{S_{db}}{1-\beta_2^t} $ 로 나타낸 값을 사용할 것이다
update는
$$ W := W - \alpha \frac{V^{corrected}_{dW}}{\sqrt{S^{corrected}_{dW}+\epsilon}} $$
$$ b := b - \alpha \frac{V^{corrected}_{db}}{\sqrt{S^{corrected}_{db}+\epsilon}} $$
와 같이 한다
하이퍼 파라미터가 많이 늘었는데 보통 $\beta_1$은 0.9, $\beta_2$는 0.99, $\epsilon$은 $10^{-8}$을 사용한다고 한다
- Learning rate decay
마지막으로 볼 learing rate decay
일반적으로 학습 초반에는 Loss 가 크니까 learning rate를 크게, 학습 후반에는 작게 하는 것이 좋다
따라서 epoch마다 learing rate를 줄여주는 방법이다
$$ \alpha = \frac{1}{1+\texttt{decay rate} \times \texttt{epoch num}}\alpha_0 $$
initial 값인 $ \alpha_0$을 점점 줄여주는데 이때 initial 값과 decay rate는 따로 결정해주어야 한다
꼭 이런 모양이 아니더라도
$ \alpha =0.95^{\texttt{epoch num}}\cdot \alpha_0 $, $ \alpha =\frac{k}{\sqrt{\texttt{epoch num}}}\cdot \alpha_0 $와 같이 점점 줄어들기만 하면 된다
discrete하게 10 epoch동안 loss 변화가 없으면 낮추기 이런 방법도 가능하다
ITE4053 : Deep Lerarning ( Hanyang University )
'AI' 카테고리의 다른 글
RNN (0) | 2021.06.01 |
---|---|
Convolution & CNN (0) | 2021.05.31 |
Batch Normalization (0) | 2021.04.18 |
Regularization 4 - Early Stopping (0) | 2021.04.18 |
Regularization 3 - Data Augmentation (0) | 2021.04.18 |