基于隨機(jī)梯度下降(SGD)的優(yōu)化算法在科研和工程的很多領(lǐng)域里都是極其核心的。很多理論或工程問題都可以轉(zhuǎn)化為對(duì)目標(biāo)函數(shù)進(jìn)行最小化的數(shù)學(xué)問題。
按吳恩達(dá)老師所說的,梯度下降(Gradient Descent)就好比一個(gè)人想從高山上奔跑到山谷最低點(diǎn),用最快的方式(steepest)奔向最低的位置(minimum)。
SGD基本公式

動(dòng)量(Momentum)


參考鏈接:https://distill.pub/2017/momentum/
基本的mini-batch SGD優(yōu)化算法在深度學(xué)習(xí)取得很多不錯(cuò)的成績。然而也存在一些問題需解決:
1. 選擇恰當(dāng)?shù)某跏紝W(xué)習(xí)率很困難。
2. 學(xué)習(xí)率調(diào)整策略受限于預(yù)先指定的調(diào)整規(guī)則。
3. 相同的學(xué)習(xí)率被應(yīng)用于各個(gè)參數(shù)。
4. 高度非凸的誤差函數(shù)的優(yōu)化過程,如何避免陷入大量的局部次優(yōu)解或鞍點(diǎn)。
自適應(yīng)優(yōu)化
AdaGrad
針對(duì)簡單的SGD及Momentum存在的問題,2011年John Duchi等發(fā)布了AdaGrad優(yōu)化算法(Adaptive Gradient,自適應(yīng)梯度),它能夠?qū)γ總€(gè)不同的參數(shù)調(diào)整不同的學(xué)習(xí)率,對(duì)頻繁變化的參數(shù)以更小的步長進(jìn)行更新,而稀疏的參數(shù)以更大的步長進(jìn)行更新。
公式:

gt表示第t時(shí)間步的梯度(向量,包含各個(gè)參數(shù)對(duì)應(yīng)的偏導(dǎo)數(shù),gt,i表示第i個(gè)參數(shù)t時(shí)刻偏導(dǎo)數(shù))
gt2表示第t時(shí)間步的梯度平方(向量,由gt各元素自己進(jìn)行平方運(yùn)算所得,即Element-wise)
與SGD的核心區(qū)別在于計(jì)算更新步長時(shí),增加了分母:梯度平方累積和的平方根。此項(xiàng)能夠累積各個(gè)參數(shù)gt,i的歷史梯度平方,頻繁更新的梯度,則累積的分母項(xiàng)逐漸偏大,那么更新的步長(stepsize)相對(duì)就會(huì)變小,而稀疏的梯度,則導(dǎo)致累積的分母項(xiàng)中對(duì)應(yīng)值比較小,那么更新的步長則相對(duì)比較大。
AdaGrad能夠自動(dòng)為不同參數(shù)適應(yīng)不同的學(xué)習(xí)率(平方根的分母項(xiàng)相當(dāng)于對(duì)學(xué)習(xí)率α進(jìn)進(jìn)行了自動(dòng)調(diào)整,然后再乘以本次梯度),大多數(shù)的框架實(shí)現(xiàn)采用默認(rèn)學(xué)習(xí)率α=0.01即可完成比較好的收斂。
優(yōu)勢(shì):在數(shù)據(jù)分布稀疏的場(chǎng)景,能更好利用稀疏梯度的信息,比標(biāo)準(zhǔn)的SGD算法更有效地收斂。
缺點(diǎn):主要缺陷來自分母項(xiàng)的對(duì)梯度平方不斷累積,隨之時(shí)間步地增加,分母項(xiàng)越來越大,最終導(dǎo)致學(xué)習(xí)率收縮到太小無法進(jìn)行有效更新。
RMSProp
RMSProp是Geoffrey Hinton教授在教案中提到的算法,結(jié)合梯度平方的指數(shù)移動(dòng)平均數(shù)來調(diào)節(jié)學(xué)習(xí)率的變化。能夠在不穩(wěn)定(Non-Stationary)的目標(biāo)函數(shù)情況下進(jìn)行很好地收斂。
Hinton教授講述RMSProp算法的材料:
http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
計(jì)算t時(shí)間步的梯度:

計(jì)算梯度平方的指數(shù)移動(dòng)平均數(shù)(Exponential Moving Average),γ是遺忘因子(或稱為指數(shù)衰減率),依據(jù)經(jīng)驗(yàn),默認(rèn)設(shè)置為0.9。

梯度更新時(shí)候,與AdaGrad類似,只是更新的梯度平方的期望(指數(shù)移動(dòng)均值),其中ε=10^-8,避免除數(shù)為0。默認(rèn)學(xué)習(xí)率α=0.001。

優(yōu)勢(shì):能夠克服AdaGrad梯度急劇減小的問題,在很多應(yīng)用中都展示出優(yōu)秀的學(xué)習(xí)率自適應(yīng)能力。尤其在不穩(wěn)定(Non-Stationary)的目標(biāo)函數(shù)下,比基本的SGD、Momentum、AdaGrad表現(xiàn)更良好。
Adam優(yōu)化器
2014年12月,Kingma和Lei Ba兩位學(xué)者提出了Adam優(yōu)化器,結(jié)合AdaGrad和RMSProp兩種優(yōu)化算法的優(yōu)點(diǎn)。對(duì)梯度的一階矩估計(jì)(First Moment Estimation,即梯度的均值)和二階矩估計(jì)(Second
Moment Estimation,即梯度的未中心化的方差)進(jìn)行綜合考慮,計(jì)算出更新步長。
主要包含以下幾個(gè)顯著的優(yōu)點(diǎn):
1. 實(shí)現(xiàn)簡單,計(jì)算高效,對(duì)內(nèi)存需求少
2. 參數(shù)的更新不受梯度的伸縮變換影響
3. 超參數(shù)具有很好的解釋性,且通常無需調(diào)整或僅需很少的微調(diào)
4. 更新的步長能夠被限制在大致的范圍內(nèi)(初始學(xué)習(xí)率)
5. 能自然地實(shí)現(xiàn)步長退火過程(自動(dòng)調(diào)整學(xué)習(xí)率)
6. 很適合應(yīng)用于大規(guī)模的數(shù)據(jù)及參數(shù)的場(chǎng)景
7. 適用于不穩(wěn)定目標(biāo)函數(shù)
8. 適用于梯度稀疏或梯度存在很大噪聲的問題
綜合Adam在很多情況下算作默認(rèn)工作性能比較優(yōu)秀的優(yōu)化器。
Adam實(shí)現(xiàn)原理
算法偽代碼:

Adam更新規(guī)則
計(jì)算t時(shí)間步的梯度:

首先,計(jì)算梯度的指數(shù)移動(dòng)平均數(shù),m0 初始化為0。
類似于Momentum算法,綜合考慮之前時(shí)間步的梯度動(dòng)量。
β1 系數(shù)為指數(shù)衰減率,控制權(quán)重分配(動(dòng)量與當(dāng)前梯度),通常取接近于1的值。
默認(rèn)為0.9

下圖簡單展示出時(shí)間步1~20時(shí),各個(gè)時(shí)間步的梯度隨著時(shí)間的累積占比情況。

其次,計(jì)算梯度平方的指數(shù)移動(dòng)平均數(shù),v0初始化為0。
β2 系數(shù)為指數(shù)衰減率,控制之前的梯度平方的影響情況。
類似于RMSProp算法,對(duì)梯度平方進(jìn)行加權(quán)均值。
默認(rèn)為0.999

第三,由于m0初始化為0,會(huì)導(dǎo)致mt偏向于0,尤其在訓(xùn)練初期階段。
所以,此處需要對(duì)梯度均值mt進(jìn)行偏差糾正,降低偏差對(duì)訓(xùn)練初期的影響。

第四,與m0 類似,因?yàn)関0初始化為0導(dǎo)致訓(xùn)練初始階段vt偏向0,對(duì)其進(jìn)行糾正。

第五,更新參數(shù),初始的學(xué)習(xí)率α乘以梯度均值與梯度方差的平方根之比。
其中默認(rèn)學(xué)習(xí)率α=0.001
ε=10^-8,避免除數(shù)變?yōu)?。
由表達(dá)式可以看出,對(duì)更新的步長計(jì)算,能夠從梯度均值及梯度平方兩個(gè)角度進(jìn)行自適應(yīng)地調(diào)節(jié),而不是直接由當(dāng)前梯度決定。

Adam代碼實(shí)現(xiàn)
算法思路很清晰,實(shí)現(xiàn)比較直觀:

代碼地址:https://github.com/dream-catcher/learning_blogs/blob/master/Adam_Optimizer/adam_optimizer.py
Adam可視化

notebook試驗(yàn)地址:https://github.com/dream-catcher/learning_blogs/tree/master/Adam_Optimizer
Adam缺陷及改進(jìn)
雖然Adam算法目前成為主流的優(yōu)化算法,不過在很多領(lǐng)域里(如計(jì)算機(jī)視覺的對(duì)象識(shí)別、NLP中的機(jī)器翻譯)的最佳成果仍然是使用帶動(dòng)量(Momentum)的SGD來獲取到的。Wilson?等人的論文結(jié)果顯示,在對(duì)象識(shí)別、字符級(jí)別建模、語法成分分析等方面,自適應(yīng)學(xué)習(xí)率方法(包括AdaGrad、AdaDelta、RMSProp、Adam等)通常比Momentum算法效果更差。
針對(duì)Adam等自適應(yīng)學(xué)習(xí)率方法的問題,主要兩個(gè)方面的改進(jìn):
1、解耦權(quán)重衰減
在每次更新梯度時(shí),同時(shí)對(duì)其進(jìn)行衰減(衰減系數(shù)w略小于1),避免產(chǎn)生過大的參數(shù)。

在Adam優(yōu)化過程中,增加參數(shù)權(quán)重衰減項(xiàng)。解耦學(xué)習(xí)率和權(quán)重衰減兩個(gè)超參數(shù),能單獨(dú)調(diào)試優(yōu)化兩個(gè)參數(shù)。

參考鏈接:http://ruder.io/deep-learning-optimization-2017/index.html
2、修正指數(shù)移動(dòng)均值
最近的幾篇論文顯示較低的[if !msEquation][endif](如0.99或0.9)能夠獲得比默認(rèn)值0.999更佳的結(jié)果,暗示出指數(shù)移動(dòng)均值本身可能也包含了缺陷。例如在訓(xùn)練過程中,某個(gè)mini-batch出現(xiàn)比較大信息量的梯度信息,但由于這類mini-batch出現(xiàn)頻次很少,而指數(shù)移動(dòng)均值會(huì)減弱他們的作用(因?yàn)楫?dāng)前梯度權(quán)重及當(dāng)前梯度的平方的權(quán)重,權(quán)重都比較?。?,導(dǎo)致在這種場(chǎng)景下收斂比較差。

https://openreview.net/pdf?id=ryQu7f-RZ
論文作者提出Adam的變形算法AMSGrad。
AMSGrad?使用最大的來更新梯度,而不像Adam算法中采用歷史的指數(shù)移動(dòng)均值來實(shí)現(xiàn)。作者在小批量數(shù)據(jù)集及CIFAR-10上觀察到比Adam更佳的效果。
參考資料
http://ruder.io/optimizing-gradient-descent/
http://ruder.io/deep-learning-optimization-2017/index.html