1. SGD
現在的SGD一般都指小批量梯度下降,即每一次迭代計算mini-batch的梯度,然後對參數進行更新。
其中是模型參數,是模型目標函數,是目標函數的梯度,是學習率。
難點(缺點):
(1)學習率的選擇。過低收斂緩慢,過高無法收斂。
(2)“之字形”的出現,即在陡谷(一種在一個方向的彎曲程度遠大於其他方向的表面彎曲情況)處震盪。如下圖所示
2. 動量法(Momentum)
其中是一階動量,是動量因子。
優點:改善“之字形”震盪,動量項在梯度指向方向相同的方向逐漸增大,對梯度指向改變的方向逐漸減小(不斷中和)。
3. Nesterov
我們使用來移動,通過計算,我們能夠得到一個下次參數位置的近似值——也就是能告訴我們參數大致會變爲多少。那麼,通過基於未來參數的近似值而非當前的參數值計算相得應罰函數並求偏導數,我們能讓優化器高效地「前進」並收斂:
4. Adagrad
解決學習率的選擇問題,對學習率進行自適應約束。
其中是個很小的數,爲了確保分母不爲0,是梯度平方的累積,爲二階動量。
優點:不需要手工調節學習率。
缺點:隨着時間的增長,單調增長,單調減少,有可能過早的變爲0,訓練過早的結束。而且依然依賴與人工設定的學習率。
5. RMSprop
由於AdaGrad單調遞減的學習率變化過於激進,RMSprop只關注過去一段時間的梯度平均值,離的時間越遠越不重要。
6. Adadelta
RMSprop依然需要自己設定全局學習率,因此Adadelta在RMSprop的基礎上,用參數更新的平方來替代全局學習率的位置,這樣就可以省略全局學習率了。
7. Adam
融合一階動量和二階動量。
因爲當和一開始被初始化爲 0 時,最初的幾步通常會偏向0,表示參數更新太慢。
他們使用偏差糾正係數,來修正一階矩和二階矩的偏差:
8. Nadam
Nesterov + Adam = Nadam
公式還沒完全理解先不放了。
不知道算是原創還是轉載,放上幾篇參考網址吧:
https://zhuanlan.zhihu.com/p/22252270