簡單認(rèn)識(shí)Adam優(yōu)化器

基于隨機(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容