###### 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 的情況也有機會因為動量慣性而突破此地帶 ![](https://i.imgur.com/TcuUDqc.png =500x300) :::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 所以衝出去 ![](https://i.imgur.com/4KcU9PA.png =500x300) 這時就可以使用 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 :::