深度學習中的優化算法串講

作者 | 謝文睿
來源 | ID:Datawhale

本文對深度學習中的優化算法進行了梳理。首先,介紹整個優化算法的基本框架;然後將目前用的主流優化算法進行講解,帶領大家瞭解優化算法從SGD到Adam及Nadam的轉變。

基本框架

爲什麼這些算法是能串講的呢?因爲這些算法都是相通的。爲什麼是相通的呢?因爲所有的優化算法均基於下面優化算法的基本框架。

其中,一階動量和二階動量分別是歷史梯度的一階函數和二階函數。

SGD隨機梯度下降算法

首先,講一下最基礎的SGD算法:

缺點:容易陷入局部最優。由於SGD只考慮當前時刻的梯度,在局部最優點的當前梯度爲0。由計算公式可知,此時參數不再進行更新,故陷入局部最優的狀態。

改進策略及算法

  • 引入歷史梯度的一階動量,代表算法有:Momentum、NAG
  • 引入歷史梯度的二階動量,代表算法有:AdaGrad、RMSProp、AdaDelta
  • 同時引入歷史梯度的一階動量及二階動量,代表算法有:Adam、Nadam

改進策略1:引入一階動量

Momentum

改進思想:爲了抑制SGD的震盪,Momentum認爲梯度下降過程可以加入慣性,也就是在SGD基礎上引入了一階動量。

其中,關於歷史梯度的一階動量的計算採取指數加權移動平均值的思想進行計算,具體計算步驟詳見PPT或視頻講解。

NAG

改進思想:除了利用慣性跳出局部溝壑以外,我們還可以嘗試往前看一步。即:在Momentum考慮歷史梯度的基礎上,把當前梯度轉換爲未來梯度。

改進策略2:引入二階動量

二階動量的出現,才意味着“自適應學習率”優化算法時代的到來。在SGD及其引入一階動量的改進算法中,均已相同的學習率去更新參數。但是,以相同的學習率進行變化經常是不合理的。

在神經網絡中,參數需要用不同的學習率進行更新。對於經常更新的參數,我們已經積累了大量關於它的知識,不希望被單個樣本影響太大,希望學習速率慢一些;對於偶爾更新的參數,我們了解的信息太少,希望能從每個偶然出現的樣本身上多學一些,即學習速率大一些。

以神經網絡中的W及b爲例,如下圖爲損失函數圖像,W爲x軸,b爲y軸。發現每次b變動很大,而W每次僅更新一小步。但是,縱觀整個損失函數我們發現,W其實可以邁開步子往前走,b是不是可以跳躍不那麼大。

於是,出現了不同針對不同維度的參數採用不同學習率的二階動量改進算法。

AdaGrad

改進思想:從數學的角度來看,更新幅度很大的參數,通常歷史累計梯度的平方和會很大;相反的,更新幅度很小的參數,通常其累計歷史梯度的平方和會很小。

缺點:隨着時間步的拉長,歷史累計梯度平方和會越來越大,這樣會使得所有維度參數的學習率都不斷減小(單調遞減),無論更新幅度如何。

RMSProp/AdaDelta

改進思想:不累積全部歷史梯度,而只關注過去一段時間窗口的下降梯度,採用Momentum中的指數加權移動平均值的思路。

改進策略3:同時引入一階動量及二階動量

Adam

改進思想:加入Momentum的一階動量計算方法及AdaGrad的二階動量計算方法。

Nadam

改進思想:Nadam = Nesterov + Adam。核心在於計算當前時刻的梯度時使用了未來梯度。

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