深度學習最優化(四)—— 動量法/Nesterov/Adagrad/Adadelta/RMSprop/Adam/Nadam

1. SGD

現在的SGD一般都指小批量梯度下降,即每一次迭代計算mini-batch的梯度,然後對參數進行更新。

               g_{t}= \triangledown _{\theta_{t-1}}J(\theta_{t-1})

              \triangle \theta _t = -\eta \ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

其中\theta _t是模型參數,J(\theta _{t-1})是模型目標函數,g_t是目標函數的梯度,\eta是學習率。

難點(缺點):

          (1)學習率的選擇。過低收斂緩慢,過高無法收斂。

          (2)“之字形”的出現,即在陡谷(一種在一個方向的彎曲程度遠大於其他方向的表面彎曲情況)處震盪。如下圖所示

2. 動量法(Momentum)

               m_t=\mu \ast m_{t-1}-\eta g_t

               \theta _t = \theta _{t-1}+m _t

其中m_t是一階動量,\mu是動量因子。

優點:改善“之字形”震盪,動量項在梯度指向方向相同的方向逐漸增大,對梯度指向改變的方向逐漸減小(不斷中和)。

3. Nesterov

我們使用\mu \ast m_{t-1}來移動\theta,通過計算\theta_{t-1}+\mu \ast m_{t-1},我們能夠得到一個下次參數位置的近似值——也就是能告訴我們參數大致會變爲多少。那麼,通過基於未來參數的近似值而非當前的參數值計算相得應罰函數J(\theta_{t-1}+\mu \ast m_{t-1})並求偏導數,我們能讓優化器高效地「前進」並收斂:

               m_t=\mu \ast m_{t-1}-\eta \triangledown J(\theta _{t-1}+\mu \ast m_{t-1})

               \theta _t = \theta _{t-1}+m_t

4. Adagrad

解決學習率的選擇問題,對學習率進行自適應約束。

               n_t = n_{t-1}+g_t^2

              \triangle \theta _t = -\frac{\eta }{ \sqrt{n_t+\varepsilon }}\ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

其中\varepsilon是個很小的數,爲了確保分母不爲0,n_t是梯度平方的累積,爲二階動量。

優點:不需要手工調節學習率。

缺點:隨着時間的增長,n_t單調增長,\triangle \theta _t單調減少,有可能過早的變爲0,訓練過早的結束。而且依然依賴與人工設定的學習率。

5. RMSprop

由於AdaGrad單調遞減的學習率變化過於激進,RMSprop只關注過去一段時間的梯度平均值,離的時間越遠越不重要。

               n_t = \beta_2 n_{t-1}+(1-\beta_2 )g_t^2

              \triangle \theta _t = -\frac{\eta }{ \sqrt{n_t+\varepsilon }}\ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

6. Adadelta

RMSprop依然需要自己設定全局學習率,因此Adadelta在RMSprop的基礎上,用參數更新的平方來替代全局學習率的位置,這樣就可以省略全局學習率了。

               n_t = \beta_2 n_{t-1}+(1-\beta_2 )g_t^2

               V_t = \gamma V_{t-1}+(1-\gamma )\triangle\theta _t^2

              \triangle \theta _t = -\frac{ \sqrt{V_t+\varepsilon}}{ \sqrt{n_t+\varepsilon }}\ast g_t

              \theta _t = \theta _{t-1}+\triangle \theta _t

7. Adam

融合一階動量和二階動量。

               m_t=\beta_1 m_{t-1}+(1-\beta_1) g_t

               n_t = \beta_2 n_{t-1}+(1-\beta_2 )g_t^2

因爲當m_tn_t一開始被初始化爲 0 時,最初的幾步通常會偏向0,表示參數更新太慢。

他們使用偏差糾正係數,來修正一階矩和二階矩的偏差:

               \hat{m_t}=\frac{m_t}{1-\beta_1^t}

               \hat{n_t}=\frac{n_t}{1-\beta_2^t}

              \triangle \theta _t = -\eta \ast \frac{\hat{m_t} }{ \sqrt{\hat{n_t}+\varepsilon }}

              \theta _t = \theta _{t-1}+\triangle \theta _t

8. Nadam

Nesterov + Adam = Nadam

公式還沒完全理解先不放了。

不知道算是原創還是轉載,放上幾篇參考網址吧:

              https://zhuanlan.zhihu.com/p/22252270

              https://www.cnblogs.com/shixiangwan/p/7532858.html

              https://zhuanlan.zhihu.com/p/32230623

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章