###### tags: `Machine learning`
{%hackmd @kk6333/theme-sty1 %}
# Optimizer 優化器 : Momentum、AdaGrad、RMSProp、Adam
這邊介紹一下幾個常見的優化器
- Momentum
- AdaGrad
- RMSProp
- Adam
這些都是從最基本的**梯度下降 Gradient Descent** 演變過來,介紹可以[看這邊](https://hackmd.io/0nN91045TBCTiV1SluiHgQ?view#Optimization-%E5%84%AA%E5%8C%96%E5%99%A8)
<br>
## 1. Momentum (MSGD)
我們在做 Gradient Descent 時有可能會遇到收斂在 Critic Point 的情況 ( local min、saddle point )
造成 gradient 為 0,loss 無法下降
這時我們參考真實物理,如果在下降時加上動量 (Momentum)
遇到卡在 Critic point 的情況也有機會因為動量慣性而突破此地帶

:::info
**原本 Gradient Descent**
$$w^1 \leftarrow w^0 - \eta * \frac{\partial{L}}{\partial{w}}$$
我們替換 gradient 為一個移動量 Movement (m)
$$w^1 \leftarrow w^0 - m^1 $$
Movement 定義如下,就是在原本 gradient 的反方向加上**前一個**的移動量 m
( ❗ $m^0$=0 )
$$m^1 = \lambda m^0 - \eta \frac{\partial{L}}{\partial{w}} = \lambda m^0 - \eta g^0$$
所以總結為以下
$$w^t \leftarrow w^{t-1} - m^t $$
$$m^t = \lambda m^{t-1} - \eta * g^{t-1} $$
- $\lambda$ : 為一常數
- $w$ : 權重參數
- $g$ : gradient
:::
<br>
## 2. AdaGrad
在做參數優化時,learning rate 會是一個很重要的參數,
learning rate 太大會難以收斂,太小又收斂太慢
在複雜的 loss 空間中要挑出好的 learning rate 更是困難,因為有時需要大的 lr 有時較小效果好。
**AdaGrad (Adaptive Learning Rates)** 就是用在此處,
他可以**根據目前梯度情況來調整 learning rate** 達到更好的效果
:::info
Adagrad 會在原本的 learning rate 除一個 $\sigma_i^t$
此數是會依據"之前到現在"的 gradient 來做改變
$$ \theta_i^{t+1} \longleftarrow \theta_i^{t} - \frac{\eta}{\sigma_i^t}g^t_i$$
$$\sigma_i^0 = \sqrt{({g^0})^2}$$
$$\sigma_i^1 = \sqrt{\frac{1}{2}[ ({g^0})^2 + ({g^1})^2 ]}$$
$$\sigma_i^n = \sqrt{\frac{1}{n+1}\sum{}_{k=0}^n({g^{k}})^2}$$
<br>
當 gradient 越大時, $\sigma$ 越大, lr 越小,**有效控制下降速度**,
當 gradient 越小時, $\sigma$ 越小, lr 越大,**可以防止下降緩慢甚至不下降情形**
- $\theta$ : 權重參數,與 Momentum 的 $w$ 通用 ( 只是我打完後懶得改~~ )
:::
<br>
## 3. RMSProp
RMSProp 是 AdaGrad 的改良版,
使用 AdaGrad 時雖然效果不錯,但當我們在比較複雜的平面,可能會有缺點
因為我們收斂前進的方向在複雜平面可能高低差異大( Gradient 差異大)
導致前一刻因為 gradient 小所以 lr 大,卻在下一刻遇到了大的 gradient 所以衝出去

這時就可以使用 RMSprop,用不同權重比例控制當前 gradient 的重要性
:::info
RMSProp 在計算 $\sigma$ 時,只使用前一個時刻的 $\sigma^{t-1}$ 和當前的 gradient 做計算
並分配權重 ( 自訂 ) $\alpha$ 來調整 gradient 的重要性
$$ \theta_i^{t+1} \longleftarrow \theta_i^{t} - \frac{\eta}{\sigma_i^t}g^t_i$$
$$\sigma_i^0 = \sqrt{({g^0})^2}$$
$$\sigma_i^n = \sqrt{ \alpha ({\sigma^{n-1}})^2 + (1-\alpha) ({g^n})^2 }$$
$$ 0 < \alpha < 1 $$
:::
<br>
## 4. Adam
Adam 融合了 Momentum 和 RMSprop,也是當今最長用的優化器之一
"概念上"可以寫成以下公式
:::warning
$$ \theta_i^{t+1} \longleftarrow \theta_i^{t} - \frac{1}{\sigma_i^t}m^t_i$$
- $m^t = \lambda m^{t-1} - \eta * g^{t-1}$
- $\sigma_i^n = \sqrt{ \alpha ({\sigma^{n-1}})^2 + (1-\alpha) ({g^n})^2 }$
:::
<br>
那真正的公式對參數使用進行了改變,並在最後加上"偏差校正",
來控制更新的步伐,減少偏差
:::info
先將 $\sigma_i^n$ 中的根號拿掉取作 $v^n_i$
$$ \theta_i^{t+1} \longleftarrow \theta_i^{t} - \frac{\eta}{\sqrt{\hat{v}_i^t} + \epsilon}\hat{m}^t_i$$
- $m^0 = 0$
- $m^{t+1} = \beta_1 m^{t} - (1-\beta_1) * g^{t}$
- $v_i^n =\beta_2 ({v^{n-1}})^2 + (1-\beta_2) ({g^n})^2$
**偏差校正**
- $\hat{m}^{t} = \frac{m^t}{1-\beta_1}$
- $\hat{v}^{t} = \frac{v^t}{1-\beta_2}$
**參數建議值**
- $\beta_1$ : 0.9
- $\beta_2$ : 0.999
:::