일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- jupyter
- version
- Peephole Connection
- python
- AI
- ResNet
- Skip Connectioin
- vim-plug
- Inception V1
- GCN
- RNN
- DL
- Manager
- GoogLeNet
- Bottleneck Layer
- Regression
- Residual Connection
- Linear
- Inception Module
- iTerm2
- virtualenv
- Optimizer
- DCGAN
- Vanilla RNN
- Generative
- Skip Connection
- classification
- sigmoid
- cnn
- Gated Skip Connection
- Today
- Total
IT Repository
(13) Optimizer - Adaptive learning rate 개념 본문
- Vanilla SGD
- Momentum 개념
- Momentum
- NAG
- Adaptive learning rate 개념
- AdaGrad
- AdaDelta, RMSProp
- 위의 두 방법을 병합: ADAM (RMSProp + NAG)
- Momentum 개념
Adagrad (Adaptive Gradient)¶
Vanilla SGD : 일괄적인 Learning rate
Adagrad : 각 파라미터마다 다른 Learning rate를 적용 (Adaptive Learning rate)
$\theta$ 안에 $k$개의 파라미터가 있다고 할 때,
$G_t : \{ e_1, e_2, e_3, \dots , e_k \}$
각 $e_k$는 대응되는 파라미터의 Gradient의 제곱$\left ( = \left ( \nabla_\theta J(\theta_t) \right )^2 \right )$의 누적합
따라서, Gradient의 제곱은 항상 양수이고, $G_t$는 Gradient가 얼마만큼 변화했었는지가 저장된 벡터 값이다.
$\array{& \text{Learning rate} && \text{Gradient} \\ &&& \\ \text{Vanilla SGD} & \eta & \cdot & \nabla_\theta J(\theta) \\ &&& \\ && \Downarrow & \\ &&& \\ \text{Adagrad} & \dfrac{\eta}{\sqrt{G_t + \epsilon}} && \nabla_\theta J(\theta_t) \\ &&& \\ &\downarrow & & \downarrow \\ &&& \\ \text{(element-wise)} &\begin{bmatrix}e_1 \\ e_2 \\ \cdots \\ e_k\end{bmatrix} & \times & \begin{bmatrix}g_1 \\ g_2 \\ \cdots \\ g_k\end{bmatrix} }$
위와 같이 element-wise 곱 연산으로 인해 각 파라미터에 따라 서로 다른 Learning rate가 적용된다.
참고로 초기 상태에서는 $G_t$가 0이므로, 0으로 나누지 않기 위해 아주 작은 값인 $\epsilon$을 더한다.
Problem of Adagrad
스텝이 진행될수록 $G_t$가 무한대로 발산해버리므로, 스텝 사이즈가 0으로 수렴해버림
RMSProp¶
Adagrad에서 decay 상수($\gamma$)를 곱해줌으로써, $G_t$가 무한대로 발산하는 것을 방지
$$\theta_{t+1} = \theta - \dfrac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_\theta J(\theta_t) \\ G_t = \gamma G_{t-1} + (1 - \gamma)\left( \nabla_\theta J(\theta_t) \right) ^2 \\ (\gamma : \text{0 ~ 1 범위의 decay 상수})$$Adadelta¶
Adagrad에서 파라미터 업데이트 시에 각 변수의 단위를 맞추고자 함
$$\theta_{t+1} = \theta_t - \Delta_\theta \\ ~\\ \Delta_\theta = \dfrac{\sqrt{s + \epsilon}}{\sqrt{G + \epsilon}} \cdot \nabla_\theta J(\theta_t) \\ ~\\ s_{t+1} = \gamma s_t + (1 - \gamma) \Delta_\theta \\ G_{t+1} = \gamma G_t + (1 - \gamma) \left ( \nabla_\theta J(\theta_t) \right )^2 \\ ~\\ \begin{pmatrix}\text{s : 파라미터가 얼마나 변화해왔는지에 대한 벡터값} \\ \text{G : Gradient가 얼마나 변화해왔는지에 대한 벡터값} \end{pmatrix}$$\
$\array{ & \theta_t & = & \theta & - & \dfrac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_\theta J(\theta_t) \\ && = & \theta & - & \dfrac{\eta}{\sqrt{G_t + \epsilon}} \cdot \dfrac{\delta J}{\delta \theta} \\ ~\\ \text{단위} & (u) && (u) && \dfrac{Constant}{(u^{-1})} \cdot {(u^{-1})} \\ & (u) && (u) && Constant }$
$\theta$를 어떠한 물리량이라고 가정하고 그 단위를 $u$라고 하면, $\eta$는 상수이고 $\dfrac{\delta J}{\delta \theta}$는 단위가 $u^{-1}$이 됨
\
$\ \array{ & \theta_{t+1} & = & \theta_t & - & \Delta_\theta \\ \text{단위} & (u) && (u) && (u) }$
$\Delta_\theta$의 단위는 아래와 같이 계산된다.
$\array{ & \Delta_\theta & = & \dfrac{\sqrt{s + \epsilon}}{\sqrt{G + \epsilon}} & \cdot & \nabla_\theta J(\theta_t)\\ \text{단위}& (u) && \dfrac{(u)}{(u^{-1})} && (u^{-1}) }$
따라서, Adadelta는 따로 Learning rate를 지정해주지 않는다.
Adadelta가 Adagrad보다 더 잘 작동하는 경우도 있으나, 그렇지 않은 경우도 있다.
'Basic fundamentals' 카테고리의 다른 글
(14) Optimizer - ADAM Optimizer (0) | 2020.01.13 |
---|---|
(12) Optimizer - Momentum 개념 (0) | 2020.01.13 |
(11) Optimizer - Vanilla SGD (0) | 2020.01.13 |
(10) Optimizer (0) | 2020.01.13 |
(9) Other Techniques of Optimize (0) | 2020.01.13 |