基于隨機(jī)梯度下降(SGD)的優(yōu)化算法在科研和工程的很多領(lǐng)域里都是極其核心的傲诵。很多理論或工程問題都可以轉(zhuǎn)化為對目標(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
針對簡單的SGD及Momentum存在的問題,2011年John Duchi等發(fā)布了AdaGrad優(yōu)化算法(Adaptive Gradient她肯,自適應(yīng)梯度)佳头,它能夠?qū)γ總€(gè)不同的參數(shù)調(diào)整不同的學(xué)習(xí)率,對頻繁變化的參數(shù)以更小的步長進(jìn)行更新辕宏,而稀疏的參數(shù)以更大的步長進(jìn)行更新畜晰。
公式:
gt表示第t時(shí)間步的梯度(向量砾莱,包含各個(gè)參數(shù)對應(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)相對就會(huì)變小财松,而稀疏的梯度瘪贱,則導(dǎo)致累積的分母項(xiàng)中對應(yīng)值比較小纱控,那么更新的步長則相對比較大。
AdaGrad能夠自動(dòng)為不同參數(shù)適應(yīng)不同的學(xué)習(xí)率(平方根的分母項(xiàng)相當(dāng)于對學(xué)習(xí)率α進(jìn)進(jìn)行了自動(dòng)調(diào)整菜秦,然后再乘以本次梯度)甜害,大多數(shù)的框架實(shí)現(xiàn)采用默認(rèn)學(xué)習(xí)率α=0.01即可完成比較好的收斂。
優(yōu)勢:在數(shù)據(jù)分布稀疏的場景球昨,能更好利用稀疏梯度的信息尔店,比標(biāo)準(zhǔn)的SGD算法更有效地收斂。
缺點(diǎn):主要缺陷來自分母項(xiàng)的對梯度平方不斷累積主慰,隨之時(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)勢:能夠克服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)尘颓。對梯度的一階矩估計(jì)(First Moment Estimation,即梯度的均值)和二階矩估計(jì)(Second
Moment Estimation晦譬,即梯度的未中心化的方差)進(jìn)行綜合考慮疤苹,計(jì)算出更新步長。
主要包含以下幾個(gè)顯著的優(yōu)點(diǎn):
1. 實(shí)現(xiàn)簡單敛腌,計(jì)算高效卧土,對內(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ù)的場景
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算法鸭叙,對梯度平方進(jìn)行加權(quán)均值觉啊。
默認(rèn)為0.999
第三,由于m0初始化為0沈贝,會(huì)導(dǎo)致mt偏向于0杠人,尤其在訓(xùn)練初期階段。
所以宋下,此處需要對梯度均值mt進(jìn)行偏差糾正嗡善,降低偏差對訓(xùn)練初期的影響。
第四学歧,與m0 類似罩引,因?yàn)関0初始化為0導(dǎo)致訓(xùn)練初始階段vt偏向0,對其進(jìn)行糾正枝笨。
第五袁铐,更新參數(shù),初始的學(xué)習(xí)率α乘以梯度均值與梯度方差的平方根之比伺帘。
其中默認(rèn)學(xué)習(xí)率α=0.001
ε=10^-8昭躺,避免除數(shù)變?yōu)?忌锯。
由表達(dá)式可以看出伪嫁,對更新的步長計(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ī)視覺的對象識(shí)別脚猾、NLP中的機(jī)器翻譯)的最佳成果仍然是使用帶動(dòng)量(Momentum)的SGD來獲取到的葱峡。Wilson?等人的論文結(jié)果顯示,在對象識(shí)別龙助、字符級別建模砰奕、語法成分分析等方面,自適應(yīng)學(xué)習(xí)率方法(包括AdaGrad提鸟、AdaDelta军援、RMSProp、Adam等)通常比Momentum算法效果更差称勋。
針對Adam等自適應(yīng)學(xué)習(xí)率方法的問題胸哥,主要兩個(gè)方面的改進(jìn):
1、解耦權(quán)重衰減
在每次更新梯度時(shí)赡鲜,同時(shí)對其進(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)致在這種場景下收斂比較差狱庇。
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