梯度下降優(yōu)化算法綜述

image.png

標(biāo)題:An overview of gradient descent optimization algorithms?

論文地址:https://arxiv.org/pdf/1609.04747.pdf

Abstract:

雖然梯度下降優(yōu)化算法越來(lái)越受歡迎,但通常作為黑盒優(yōu)化器使用,因此很難對(duì)其優(yōu)點(diǎn)和缺點(diǎn)的進(jìn)行實(shí)際的解釋。本文旨在讓讀者對(duì)不同的算法有直觀的認(rèn)識(shí),以幫助讀者使用這些算法。在本綜述中,我們介紹梯度下降的不同變形形式,總結(jié)這些算法面臨的挑戰(zhàn),介紹最常用的優(yōu)化算法,回顧并行和分布式架構(gòu),以及調(diào)研用于優(yōu)化梯度下降的其他的策略。

1、Introduction:

梯度下降法是最常用的優(yōu)化算法之一,也是迄今為止最常用的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法。

同時(shí),每一SOTA的深度學(xué)習(xí)lib庫(kù)都包含各種算法來(lái)實(shí)現(xiàn)梯度下降的優(yōu)化。然而,這些算法通常被用作黑盒優(yōu)化器,因?yàn)楹茈y找到它們的優(yōu)缺點(diǎn)的實(shí)際解釋。

本文旨在為讀者提供有關(guān)優(yōu)化梯度下降的不同算法。

  • 第2節(jié),梯度下降的不同變體。
  • 第3節(jié),簡(jiǎn)要總結(jié)訓(xùn)練期間面臨的挑戰(zhàn)。
  • 第4節(jié),介紹最常用的優(yōu)化算法,包括這些算法在解決以上挑戰(zhàn)時(shí)的動(dòng)機(jī)以及如何得到更新規(guī)則的推導(dǎo)形式。
  • 第5節(jié),在并行和分布式環(huán)境中優(yōu)化梯度下降的算法和框架。
  • 第6節(jié),優(yōu)化梯度下降的附加策略。

梯度下降法是最小化目標(biāo)函數(shù)J(θ)的一種方法,其中,θ∈Rd為模型參數(shù),梯度下降法利用目標(biāo)函數(shù)關(guān)于參數(shù)的梯度?θJ(θ) 的反方向更新參數(shù)。學(xué)習(xí)率η決定達(dá)到最小值或者局部最小值過(guò)程中所采用的的步長(zhǎng)的大小。即,我們沿著目標(biāo)函數(shù)的斜面下降的方向。

2、 梯度下降法的變形形式:

梯度下降法有三種變體,它們?cè)谟?jì)算目標(biāo)函數(shù)梯度時(shí)使用的數(shù)據(jù)量上有所不同。根據(jù)數(shù)據(jù)量,我們?cè)趨?shù)更新的準(zhǔn)確性和執(zhí)行更新所需的時(shí)間之間進(jìn)行權(quán)衡。

2.1 Batch gradient descent【批量梯度下降】:

Vanilla gradient descent,又名batch gradient descent,在整個(gè)訓(xùn)練數(shù)據(jù)集上計(jì)算損失函數(shù)關(guān)于參數(shù)θ的梯度

image.png

因?yàn)樵趫?zhí)行每次更新時(shí),我們需要在整個(gè)數(shù)據(jù)集上計(jì)算所有的梯度,所以批梯度下降法的速度會(huì)很慢,同時(shí),批梯度下降法無(wú)法處理超出內(nèi)存容量限制的數(shù)據(jù)集。批梯度下降法同樣也不能在線更新模型,即在運(yùn)行的過(guò)程中,不能增加新的樣本。

批梯度下降法的代碼如下所示:

for i in range ( nb_epochs ):
    params_grad = evaluate_gradient ( loss_function , data , params )
    params = params - learning_rate * params_grad

對(duì)于預(yù)定義數(shù)量的歷元,我們首先計(jì)算整個(gè)數(shù)據(jù)集w.r.t.的損失函數(shù)的梯度向量params_grad。我們的參數(shù)向量params。請(qǐng)注意,最先進(jìn)的深度學(xué)習(xí)庫(kù)提供了自動(dòng)微分,可以有效地計(jì)算梯度w.r.t.一些參數(shù)。如果你自己推導(dǎo)梯度,那么梯度檢查是個(gè)好主意。6. 然后,我們按照梯度的方向更新參數(shù),學(xué)習(xí)速率決定我們執(zhí)行的更新的大小。對(duì)于凸誤差曲面,批梯度下降法保證收斂到全局最小值,對(duì)于非凸曲面,批梯度下降法保證收斂到局部最小值。

對(duì)于給定的迭代次數(shù)epchs:

(1)首先,我們利用全部數(shù)據(jù)集計(jì)算損失函數(shù)關(guān)于參數(shù)向量params的梯度向量params_grad。注意,最新的深度學(xué)習(xí)庫(kù)中提供了自動(dòng)求導(dǎo)的功能,可以有效地計(jì)算關(guān)于參數(shù)梯度。如果你自己求梯度,那么,梯度檢查是一個(gè)不錯(cuò)的主意。

(2)然后,我們利用梯度的方向和學(xué)習(xí)率更新參數(shù),學(xué)習(xí)率決定我們將以多大的步長(zhǎng)更新參數(shù)。
O 對(duì)于凸誤差函數(shù),批梯度下降法能夠保證收斂到全局最小值。
O 對(duì)于非凸函數(shù),則收斂到一個(gè)局部最小值。

2.2、 Stochastic gradient descent【隨機(jī)梯度下降算法】:

相比之下,隨機(jī)梯度下降(SGD)根據(jù)每一條訓(xùn)練樣本x(i)和標(biāo)簽y(i)更新參數(shù):

image.png

批量梯度下降法對(duì)大型數(shù)據(jù)集執(zhí)行冗余計(jì)算,因?yàn)樵诿看螀?shù)更新之前,它會(huì)重新計(jì)算相似樣本的梯度。SGD通過(guò)一次執(zhí)行一個(gè)更新來(lái)消除這種冗余。因此,它通常更快,也可以用于在線學(xué)習(xí)。SGD以高方差頻繁地更新,導(dǎo)致目標(biāo)函數(shù)劇烈波動(dòng),如圖1所示。

image.png

與批量梯度下降算法的收斂會(huì)使得損失函數(shù)陷入局部最小相比,由于SGD的波動(dòng)性:

  • 一方面,波動(dòng)性使得SGD可以跳到新的和潛在更好的局部最優(yōu)。
  • 另一方面,這使得最終收斂到特定最小值的過(guò)程變得復(fù)雜,因?yàn)镾GD會(huì)一直持續(xù)波動(dòng)。

然而,已經(jīng)證明當(dāng)我們緩慢減小學(xué)習(xí)率,SGD與批梯度下降法具有相同的收斂行為,對(duì)于非凸優(yōu)化和凸優(yōu)化,可以分別收斂到局部最小值和全局最小值。

與批梯度下降的代碼相比,SGD的代碼片段僅僅是在對(duì)訓(xùn)練樣本的遍歷和利用每一條樣本計(jì)算梯度的過(guò)程中增加一層循環(huán)。注意,如6.1節(jié)中的解釋,在每一次循環(huán)中,我們打亂訓(xùn)練樣本。

for i in range ( nb_epochs ):
    np . random . shuffle ( data )
    for example in data :
      params_grad = evaluate_gradient ( loss_function , example , params )
      params = params - learning_rate * params_grad
2.3、Mini-batch gradient descent【小批量梯度下降】:

小批量梯度下降法最終結(jié)合了上述兩種方法的優(yōu)點(diǎn),在每次更新時(shí)使用n個(gè)小批量訓(xùn)練樣本:

image.png
這種方法:
  • (a)減少參數(shù)更新的方差,這樣可以得到更加穩(wěn)定的收斂結(jié)果;
  • (b)可以利用最新的深度學(xué)習(xí)庫(kù)中高度優(yōu)化的矩陣優(yōu)化方法,高效地求解每個(gè)小批量數(shù)據(jù)的梯度。

通常,小批量數(shù)據(jù)的大小在50到256之間,也可以根據(jù)不同的應(yīng)用有所變化。當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型時(shí),小批量梯度下降法是典型的選擇算法,當(dāng)使用小批量梯度下降法時(shí),也將其稱為SGD。注意:在下文的改進(jìn)的SGD中,為了簡(jiǎn)單,我們省略了參數(shù)x(i:i+n)和y(i:i+n)。

在代碼中,不是在所有樣本上做迭代,我們現(xiàn)在只是在大小為50的小批量數(shù)據(jù)上做迭代:
for i in range ( nb_epochs ):
    np . random . shuffle ( data )
    for batch in get_batches ( data , batch_size =50):
      params_grad = evaluate_gradient ( loss_function , batch , params )
      params = params - learning_rate * params_grad

3、Challenges:

雖然Vanilla小批量梯度下降法并不能保證較好的收斂性,但是需要強(qiáng)調(diào)的是,這也給我們留下了如下的一些挑戰(zhàn):

  • 選擇一個(gè)合適的學(xué)習(xí)率可能是困難的。學(xué)習(xí)率太小會(huì)導(dǎo)致收斂的速度很慢,學(xué)習(xí)率太大會(huì)妨礙收斂,導(dǎo)致?lián)p失函數(shù)在最小值附近波動(dòng)甚至偏離最小值。

  • 學(xué)習(xí)率調(diào)整試圖在訓(xùn)練的過(guò)程中通過(guò)例如退火的方法調(diào)整學(xué)習(xí)率,即根據(jù)預(yù)定義的策略或者當(dāng)相鄰兩epochs之間的下降值小于某個(gè)閾值時(shí)減小學(xué)習(xí)率。然而,策略和閾值需要預(yù)先設(shè)定好,因此無(wú)法適應(yīng)數(shù)據(jù)集的特點(diǎn)

  • 此外,對(duì)所有的參數(shù)更新使用同樣的學(xué)習(xí)率。如果數(shù)據(jù)是稀疏的,同時(shí),特征的頻率差異很大時(shí),我們也許不想以同樣的學(xué)習(xí)率更新所有的參數(shù),對(duì)于出現(xiàn)次數(shù)較少的特征,我們對(duì)其執(zhí)行更大的學(xué)習(xí)率。

  • 高度非凸誤差函數(shù)普遍出現(xiàn)在神經(jīng)網(wǎng)絡(luò)中,在優(yōu)化這類函數(shù)時(shí),另一個(gè)關(guān)鍵的挑戰(zhàn)是使函數(shù)避免陷入無(wú)數(shù)次優(yōu)的局部最小值。Dauphin等人指出出現(xiàn)這種困難實(shí)際上并不是來(lái)自局部最小值,而是來(lái)自鞍點(diǎn),即那些在一個(gè)維度上是遞增的,而在另一個(gè)維度上是遞減的。這些鞍點(diǎn)通常被具有相同誤差的點(diǎn)包圍,因?yàn)樵谌我饩S度上的梯度都近似為0,所以SGD很難從這些鞍點(diǎn)中逃開(kāi)。

4、Gradient descent optimization algorithms【梯度下降優(yōu)化算法】:

在下文中,我們將概述一些算法,這些算法被深度學(xué)習(xí)社區(qū)廣泛用來(lái)處理前面提到的挑戰(zhàn)。我們不會(huì)討論在高維數(shù)據(jù)集的實(shí)際計(jì)算中不可行的算法,例如二階方法,如牛頓法7。

4.1 Momentum【動(dòng)量法】:

SGD難以在溝壑中航行,即曲面在一個(gè)維度上的曲線比在另一個(gè)維度上的曲線陡峭得多的區(qū)域[20],這在局部最優(yōu)點(diǎn)附近很常見(jiàn)。在這些情況下,SGD在溝谷的斜坡上振蕩,同時(shí)沿著底部向局部最優(yōu)方向緩慢前進(jìn),如圖2a所示:

image.png
  • 動(dòng)量是一種有助于在相關(guān)方向上加速SGD并抑制振蕩的方法,如圖2b所示。它通過(guò)將過(guò)去時(shí)間步長(zhǎng)的更新向量的一部分γ添加到當(dāng)前更新向量來(lái)實(shí)現(xiàn)這一點(diǎn)。
image.png
  • 動(dòng)量項(xiàng)γ通常設(shè)置為0.9或類似值

基本上,當(dāng)使用動(dòng)量時(shí),我們將球推下山。球在下坡時(shí)積累動(dòng)量,在途中變得越來(lái)越快(如果存在空氣阻力,即γ<1,則直到達(dá)到其極限速度)。我們的參數(shù)更新也會(huì)發(fā)生同樣的情況:

(1)對(duì)于在梯度點(diǎn)處具有相同的方向的維度,其動(dòng)量項(xiàng)增大。
(2)對(duì)于在梯度點(diǎn)處改變方向的維度,其動(dòng)量項(xiàng)減小。
(3)因此,我們可以得到更快的收斂速度,同時(shí)可以減少搖擺。
4.2 Nesterov accelerated gradient【內(nèi)斯特羅夫加速梯度下降法NAG】:

然而,球從山上滾下的時(shí)候,盲目地沿著斜率方向,往往并不能令人滿意。我們希望有一個(gè)智能的球,這個(gè)球能夠知道它將要去哪,以至于在將要重新遇到斜率上升時(shí)能夠知道減速。

Nesterov加速梯度下降法(Nesterov accelerated gradient,NAG)是一種能夠給動(dòng)量項(xiàng)這樣的預(yù)知能力的方法。我們知道,我們利用動(dòng)量項(xiàng)γvt?1來(lái)更新參數(shù)θ。通過(guò)計(jì)算θ?γvt?1能夠告訴我們參數(shù)未來(lái)位置的一個(gè)近似值(梯度并不是完全更新),這也就是告訴我們參數(shù)大致將變?yōu)槎嗌?。通過(guò)計(jì)算關(guān)于參數(shù)未來(lái)的近似位置的梯度,而不是關(guān)于當(dāng)前的參數(shù)θ的梯度,我們可以高效的求解 :

image.png
  • (1)同時(shí),我們?cè)O(shè)置動(dòng)量項(xiàng)γ大約為0.9。
  • (2)動(dòng)量法首先計(jì)算當(dāng)前的梯度值(圖3中的小的藍(lán)色向量),然后在更新的累積梯度(大的藍(lán)色向量)方向上前進(jìn)一大步,
  • (3)Nesterov加速梯度下降法NAG首先在先前累積梯度(棕色的向量)方向上前進(jìn)一大步,計(jì)算梯度值,然后做一個(gè)修正(綠色的向量)。
  • (4)這個(gè)具有預(yù)見(jiàn)性的更新防止我們前進(jìn)得太快,同時(shí)增強(qiáng)了算法的響應(yīng)能力,這一點(diǎn)在很多的任務(wù)中對(duì)于RNN的性能提升有著重要的意義[2]。
image.png

既然我們能夠使得我們的更新適應(yīng)誤差函數(shù)的斜率以相應(yīng)地加速SGD,我們同樣也想要使得我們的更新能夠適應(yīng)每一個(gè)單獨(dú)參數(shù),以根據(jù)每個(gè)參數(shù)的重要性決定大的或者小的更新。

4.3 Adagrad:
  • Adagrad是一種基于梯度的優(yōu)化算法,它可以做到這一點(diǎn):它根據(jù)參數(shù)調(diào)整學(xué)習(xí)速率,對(duì)不頻繁的參數(shù)執(zhí)行較大的更新,對(duì)頻繁的參數(shù)執(zhí)行較小的更新。

  • 因此,它非常適合處理稀疏數(shù)據(jù)。Dean等人發(fā)現(xiàn)Adagrad極大地提高了SGD的穩(wěn)健性,并將其用于在谷歌(Google)訓(xùn)練大規(guī)模神經(jīng)網(wǎng)絡(luò),其中包括在Youtube視頻10中學(xué)習(xí)識(shí)別貓。

  • 此外,Pennington等人[16]使用Adagrad來(lái)訓(xùn)練GloVe詞嵌入,因?yàn)榈皖l詞比高頻詞需要更大的步長(zhǎng)。

前面,我們每次更新所有的參數(shù)θ時(shí),每一個(gè)參數(shù)θi都使用的是相同的學(xué)習(xí)率η。由于Adagrad在t時(shí)刻對(duì)每一個(gè)參數(shù)θi使用了不同的學(xué)習(xí)率,我們首先介紹Adagrad對(duì)每一個(gè)參數(shù)的更新,然后我們對(duì)其向量化。為了簡(jiǎn)潔,令gt,i為在t時(shí)刻目標(biāo)函數(shù)關(guān)于參數(shù)θi的梯度:

image.png

在t時(shí)刻,對(duì)每個(gè)參數(shù)θi的更新過(guò)程變?yōu)椋?/p>

image.png

對(duì)于上述的更新規(guī)則,在t時(shí)刻,基于對(duì)θi計(jì)算過(guò)的歷史梯度,Adagrad修正了對(duì)每一個(gè)參數(shù)θi的學(xué)習(xí)率:

image.png

其中,Gt∈?d×d是一個(gè)對(duì)角矩陣,對(duì)角線上的元素i,i是直到t時(shí)刻為止,所有關(guān)于θi的梯度的平方和(Duchi等人[7]將該矩陣作為包含所有先前梯度的外積的完整矩陣的替代,因?yàn)榧词故菍?duì)于中等數(shù)量的參數(shù)d,矩陣的均方根的計(jì)算都是不切實(shí)際的。),?是平滑項(xiàng),用于防止除數(shù)為0(通常大約設(shè)置為1e?8)。比較有意思的是,如果沒(méi)有平方根的操作,算法的效果會(huì)變得很差。

  • 由于Gt的對(duì)角線上包含了關(guān)于所有參數(shù)θ的歷史梯度的平方和,現(xiàn)在,我們可以通過(guò)Gt和gt之間的元素向量乘法⊙向量化上述的操作
image.png
優(yōu)缺點(diǎn):

(1)Adagrad的主要優(yōu)點(diǎn)之一是,它無(wú)需手動(dòng)調(diào)整學(xué)習(xí)速度。大多數(shù)實(shí)現(xiàn)都使用默認(rèn)值0.01,并保持該值不變。

(2) Adagrad的主要缺點(diǎn)是分母中平方梯度的累積:由于每個(gè)附加項(xiàng)都是正的,因此累積的總和在訓(xùn)練期間不斷增長(zhǎng)。這反過(guò)來(lái)會(huì)導(dǎo)致學(xué)習(xí)速度下降,最終變得無(wú)窮小,此時(shí)算法不再能夠獲得額外的知識(shí)。以下算法旨在解決此缺陷。

4.4 Adadelta【阿達(dá)德?tīng)査浚?/h5>

Adadelta是Adagrad的一個(gè)擴(kuò)展,旨在減少其攻擊性、單調(diào)遞減性學(xué)習(xí)率。Adadelta并沒(méi)有累加所有過(guò)去的平方梯度,而是將計(jì)算歷史梯度的窗口大小限制為一個(gè)固定值w。

  • 在Adadelta中,無(wú)需存儲(chǔ)先前的w個(gè)平方梯度,而是將梯度的平方遞歸地表示成所有歷史梯度平方的均值。在t時(shí)刻的均值E[g2]t只取決于先前的均值和當(dāng)前的梯度(分量γ類似于動(dòng)量項(xiàng)):
image.png

我們將γ設(shè)置為與動(dòng)量項(xiàng)類似的值,約為0.9。為了清楚起見(jiàn),我們現(xiàn)在根據(jù)參數(shù)更新向量重寫(xiě)我們的普通SGD更新?θt:

image.png

因此,我們之前導(dǎo)出的Adagrad的參數(shù)更新向量的形式如下:

image.png

現(xiàn)在,我們簡(jiǎn)單將對(duì)角矩陣Gt替換成歷史梯度的均值E[g2]t:

image.png

由于分母只是梯度的均方根(RMS)誤差準(zhǔn)則,我們可以用標(biāo)準(zhǔn)簡(jiǎn)寫(xiě)來(lái)代替它:

image.png

作者指出,本次更新中的單位(以及SGD、Momentum或Adagrad中的單位)不匹配,即更新應(yīng)具有與參數(shù)相同的假設(shè)單位。為了實(shí)現(xiàn)這一點(diǎn),他們首先定義了另一個(gè)指數(shù)衰減的平均值,這次不是平方梯度,而是平方梯度參數(shù)更新

image.png

因此,參數(shù)更新的均方根誤差為:

image.png

由于RMS[Δθ]t是未知的,我們利用參數(shù)的均方根誤差來(lái)近似更新。利用RMS[Δθ]t?1替換先前的更新規(guī)則中的學(xué)習(xí)率η,最終得到Adadelta的更新規(guī)則:

image.png
  • 使用Adadelta,我們甚至不需要設(shè)置默認(rèn)學(xué)習(xí)速率,因?yàn)楦乱?guī)則中已經(jīng)移除了學(xué)習(xí)率。
4.5 RMSprop:

RMSprop是一個(gè)未被發(fā)表的自適應(yīng)學(xué)習(xí)率的算法,該算法由Geoff Hinton在其[Coursera課堂的課程6e]中提出。

RMSprop和Adadelta都是在同一時(shí)間獨(dú)立開(kāi)發(fā)的,這是因?yàn)樾枰鉀QAdagrad學(xué)習(xí)率急劇下降的問(wèn)題。實(shí)際上,RMSprop是先前我們得到的Adadelta的第一個(gè)更新向量的特例:

image.png

RMSprop將學(xué)習(xí)率分解成一個(gè)平方梯度的指數(shù)衰減的平均。

  • (1)Hinton建議將γ設(shè)置為0.9。
  • (2)而學(xué)習(xí)率η的良好默認(rèn)值為0.001
4.6、 Adam:

自適應(yīng)矩估計(jì)(Adam)是另一種計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率的方法。Adam對(duì)每一個(gè)參數(shù)都計(jì)算自適應(yīng)的學(xué)習(xí)率。

  • (1)除了像Adadelta和RMSprop一樣存儲(chǔ)一個(gè)指數(shù)衰減的歷史平方梯度的平均vt,
  • (2)Adam同時(shí)還保存一個(gè)歷史梯度的指數(shù)衰減均值mt,類似于動(dòng)量:
image.png

mt和vt分別是梯度的第一矩(平均值)和第二矩(非中心方差)的估計(jì)值,因此該方法的名稱。由于mt和vt被初始化為0的向量,Adam的作者觀察到它們偏向于零,尤其是在初始時(shí)間步,尤其是當(dāng)衰變率很小時(shí)(即β1和β2接近1)。

通過(guò)計(jì)算偏差校正的一階矩和二階矩估計(jì)來(lái)抵消偏差:

image.png

然后他們使用這些來(lái)更新參數(shù),就像我們?cè)贏dadelta和RMSprop中看到的那樣,這生成Adam更新規(guī)則:

image.png
  • 作者建議β1的默認(rèn)值為0.9,β2的默認(rèn)值為0.999,?為10?8?。他們的經(jīng)驗(yàn)表明,Adam在實(shí)踐中運(yùn)行良好,并優(yōu)于其他自適應(yīng)學(xué)習(xí)方法算法。
4.7、 AdaMax【阿達(dá)麥克斯】:

Adam update規(guī)則中的vt因子與過(guò)去梯度的`2范數(shù)成反比縮放梯度(通過(guò)vt?1項(xiàng))和電流梯度|gt | 2:

image.png

我們可以將這個(gè)更新推廣到`p范數(shù)。注意,Kingma和Ba也將β2參數(shù)化為βp2:

image.png

大p值的范數(shù)通常在數(shù)值上變得不穩(wěn)定,這就是為什么“1”和“2”范數(shù)在實(shí)踐中最常見(jiàn)的原因。然而∞ 也通常表現(xiàn)出穩(wěn)定的行為。因此,作者提出AdaMax[10],并表明vt與∞ 收斂到以下更穩(wěn)定的值。

image.png

我們現(xiàn)在可以通過(guò)替換√v?t+?通過(guò)ut獲得AdaMax更新規(guī)則:

image.png
  • 請(qǐng)注意,由于ut依賴于max運(yùn)算,因此不可能像Adam中的mt和vt那樣偏向于零,這就是為什么我們不需要計(jì)算ut的偏差校正。好的默認(rèn)值是同樣,η=0.002,β1=0.9,β2=0.999。
4.8、 Nadam【Nesterov加速自適應(yīng)矩估計(jì)】:

正如我們之前所看到的,Adam可以被視為RMSprop和動(dòng)量momentum的組合:RMSprop貢獻(xiàn)了過(guò)去平方梯度vt的指數(shù)衰減平均值,而動(dòng)量解釋了過(guò)去梯度mt的指數(shù)衰減平均值。我們還看到Nesterov加速梯度(NAG)優(yōu)于vanilla momentum。

因此,Nadam(Nesterov加速自適應(yīng)矩估計(jì))結(jié)合了Adam和NAG。為了將NAG并入Adam,我們需要修改它的動(dòng)量項(xiàng)mt。

  • (1) 首先,讓我們回顧一下使用當(dāng)前符號(hào)的動(dòng)量更新規(guī)則:
image.png

其中J是我們的目標(biāo)函數(shù),γ是動(dòng)量衰減項(xiàng),η是我們的步長(zhǎng)。將上面的第三個(gè)等式展開(kāi),可以得到:

image.png
這再次證明,動(dòng)量包括朝著前一個(gè)動(dòng)量向量的方向邁出一步,以及朝著當(dāng)前梯度的方向邁出一步。

NAG允許我們?cè)谟?jì)算梯度之前,通過(guò)動(dòng)量步更新參數(shù),在梯度方向上執(zhí)行更精確的步驟。因此,我們只需修改梯度gt即可達(dá)到NAG:

image.png

Dozat建議通過(guò)以下方式修改NAG:我們現(xiàn)在直接應(yīng)用前瞻動(dòng)量向量來(lái)更新當(dāng)前參數(shù),而不是兩次應(yīng)用動(dòng)量步—一次用于更新梯度gt,第二次用于更新參數(shù)θt+1。

image.png

請(qǐng)注意,不要使用前面的動(dòng)量向量mt?1如等式27所示,我們現(xiàn)在使用當(dāng)前動(dòng)量向量mt來(lái)展望未來(lái)。為了給Adam增加Nesterov動(dòng)量,我們可以用當(dāng)前動(dòng)量向量替換之前的動(dòng)量向量。第一回想一下,Adam更新規(guī)則如下(請(qǐng)注意,我們不需要修改v?t):

image.png

用m?t和mt的定義來(lái)展開(kāi)第二個(gè)方程,我們可以得到:

image.png

注意β1mt?1除以1?βT1.只是前一次動(dòng)量向量的偏差修正估計(jì)步,因此,我們可以用m?t代替它?1:

image.png

這個(gè)方程看起來(lái)非常類似于方程27中的擴(kuò)展動(dòng)量項(xiàng)。我們現(xiàn)在可以添加Nesterov動(dòng)量,就像我們?cè)诘仁?9中所做的那樣,只需替換前一時(shí)間步m?t-1動(dòng)量向量的偏差修正估計(jì).電流的偏差修正估計(jì)值動(dòng)量向量m?t,它給出了Nadam更新規(guī)則:

image.png
4.9 、Visualization of algorithms【算法可視化】:

以下兩幅圖提供了對(duì)所提出的優(yōu)化算法的優(yōu)化行為的一些直覺(jué):

在圖4a中,我們看到不同算法在損失曲面的等高線上走的不同路線。所有的算法都是從同一個(gè)點(diǎn)出發(fā)并選擇不同路徑到達(dá)最優(yōu)點(diǎn)。注意:Adagrad,Adadelta和RMSprop能夠立即轉(zhuǎn)移到正確的移動(dòng)方向上并以類似的速度收斂,而動(dòng)量法和NAG會(huì)導(dǎo)致偏離,想像一下球從山上滾下的畫(huà)面。然而,NAG能夠在偏離之后快速修正其路線,因?yàn)镹AG通過(guò)對(duì)最優(yōu)點(diǎn)的預(yù)見(jiàn)增強(qiáng)其響應(yīng)能力。

圖4b中,展示了不同算法在鞍點(diǎn)出的行為,鞍點(diǎn)即為一個(gè)點(diǎn)在一個(gè)維度上的斜率為正,而在其他維度上的斜率為負(fù),正如我們前面提及的,鞍點(diǎn)對(duì)SGD的訓(xùn)練造成很大困難。這里注意,SGD,動(dòng)量法和NAG在鞍點(diǎn)處很難打破對(duì)稱性,盡管后面兩個(gè)算法最終設(shè)法逃離了鞍點(diǎn)。而Adagrad,RMSprop和Adadelta能夠快速向著梯度為負(fù)的方向移動(dòng),其中Adadelta走在最前面。

image.png

正如我們所見(jiàn),自適應(yīng)學(xué)習(xí)率方法,即Adagrad、Adadelta、RMSprop和Adam最適合這些場(chǎng)景,并為這些場(chǎng)景提供了最佳的收斂性。

4.10 、Which optimizer to use?

那么,我們應(yīng)該選擇使用哪種優(yōu)化算法呢?如果輸入數(shù)據(jù)是稀疏的,選擇任一自適應(yīng)學(xué)習(xí)率算法可能會(huì)得到最好的結(jié)果。選用這類算法的另一個(gè)好處是無(wú)需調(diào)整學(xué)習(xí)率,選用默認(rèn)值就可能達(dá)到最好的結(jié)果。

總的來(lái)說(shuō):

(1)RMSprop是Adagrad的擴(kuò)展形式,用于處理在Adagrad中急速遞減的學(xué)習(xí)率。
(2)RMSprop與Adadelta相同,所不同的是Adadelta在更新規(guī)則中使用參數(shù)的均方根進(jìn)行更新。
(3)最后,Adam是將偏差校正和動(dòng)量加入到RMSprop中。

在這樣的情況下,RMSprop、Adadelta和Adam是很相似的算法并且在相似的環(huán)境中性能都不錯(cuò)。Kingma等人[9]指出在優(yōu)化后期由于梯度變得越來(lái)越稀疏,偏差校正能夠幫助Adam微弱地勝過(guò)RMSprop。綜合看來(lái),Adam可能是最佳的選擇。

有趣的是,最近許多論文中采用不帶動(dòng)量的SGD和一種簡(jiǎn)單的學(xué)習(xí)率的退火策略。已表明,通常SGD能夠找到最小值點(diǎn),但是比其他優(yōu)化的SGD花費(fèi)更多的時(shí)間,與其他算法相比,SGD更加依賴魯棒的初始化和退火策略,同時(shí),SGD可能會(huì)陷入鞍點(diǎn),而不是局部極小值點(diǎn)。因此,如果你關(guān)心的是快速收斂和訓(xùn)練一個(gè)深層的或者復(fù)雜的神經(jīng)網(wǎng)絡(luò),你應(yīng)該選擇一個(gè)自適應(yīng)學(xué)習(xí)率的方法。

5 、Parallelizing and distributing SGD【并行化和分布式SGD】:

當(dāng)存在大量的大規(guī)模數(shù)據(jù)和廉價(jià)的集群時(shí),利用分布式SGD來(lái)加速是一個(gè)顯然的選擇。SGD本身有固有的順序:一步一步,我們進(jìn)一步進(jìn)展到最小。SGD提供了良好的收斂性,但SGD的運(yùn)行緩慢,特別是對(duì)于大型數(shù)據(jù)集。相反,SGD異步運(yùn)行速度更快,但客戶端之間非最理想的通信會(huì)導(dǎo)致差的收斂。此外,我們也可以在一臺(tái)機(jī)器上并行SGD,這樣就無(wú)需大的計(jì)算集群。以下是已經(jīng)提出的優(yōu)化的并行和分布式的SGD的算法和框架。

5.1 Hogwild!:

Niu等人[14]提出稱為Hogwild!的更新機(jī)制,Hogwild!允許在多個(gè)CPU上并行執(zhí)行SGD更新。在無(wú)需對(duì)參數(shù)加鎖的情況下,處理器可以訪問(wèn)共享的內(nèi)存。這種方法只適用于稀疏的輸入數(shù)據(jù),因?yàn)槊恳淮胃轮粫?huì)修改一部分參數(shù)。在這種情況下,該更新策略幾乎可以達(dá)到一個(gè)最優(yōu)的收斂速率,因?yàn)镃PU之間不可能重寫(xiě)有用的信息。

5.2、 Downpour SGD:

Downpour SGD是SGD的一種異步的變形形式,在Google,Dean等人[6]在他們的DistBelief框架(TensorFlow的前身)中使用了該方法。Downpour SGD在訓(xùn)練集的子集上并行運(yùn)行多個(gè)模型的副本。這些模型將各自的更新發(fā)送給一個(gè)參數(shù)服務(wù)器,參數(shù)服務(wù)器跨越了多臺(tái)機(jī)器。每一臺(tái)機(jī)器負(fù)責(zé)存儲(chǔ)和更新模型的一部分參數(shù)。然而,因?yàn)楦北局g是彼此不互相通信的,即通過(guò)共享權(quán)重或者更新,因此可能會(huì)導(dǎo)致參數(shù)發(fā)散而不利于收斂。

5.3 、Delay-tolerant Algorithms for SGD【延遲容忍SGD】:

通過(guò)容忍延遲算法的開(kāi)發(fā),McMahan和Streeter[11]將AdaGraad擴(kuò)展成并行的模式,該方法不僅適應(yīng)于歷史梯度,同時(shí)適應(yīng)于更新延遲。該方法已經(jīng)在實(shí)踐中被證實(shí)是有效的。

5.4 、TensorFlow:

TensorFlow是Google近期開(kāi)源的框架,該框架用于實(shí)現(xiàn)和部署大規(guī)模機(jī)器學(xué)習(xí)模型。TensorFlow是基于DistBelief開(kāi)發(fā),同時(shí)TensorFlow已經(jīng)在內(nèi)部用來(lái)在大量移動(dòng)設(shè)備和大規(guī)模分布式系統(tǒng)的執(zhí)行計(jì)算。在[2016年4月]發(fā)布的分布式版本依賴于圖計(jì)算,圖計(jì)算即是對(duì)每一個(gè)設(shè)備將圖劃分成多個(gè)子圖,同時(shí),通過(guò)發(fā)送、接收節(jié)點(diǎn)對(duì)完成節(jié)點(diǎn)之間的通信。

5.5 、Elastic Averaging SGD【彈性平均SGD

】:

Zhang等人[22]提出的彈性平均SGD(Elastic Averaging SGD,EASGD)連接了異步SGD的參數(shù)客戶端和一個(gè)彈性力,即參數(shù)服務(wù)器存儲(chǔ)的一個(gè)中心變量。EASGD使得局部變量能夠從中心變量震蕩得更遠(yuǎn),這在理論上使得在參數(shù)空間中能夠得到更多的探索。經(jīng)驗(yàn)表明這種增強(qiáng)的探索能力通過(guò)發(fā)現(xiàn)新的局部最優(yōu)點(diǎn),能夠提高整體的性能

6 Additional strategies for optimizing SGD【優(yōu)化SGD的其他策略】:

最后,我們介紹可以與前面提及到的任一算法配合使用的其他的一些策略,以進(jìn)一步提高SGD的性能。

6.1、 Shuffling and Curriculum Learning【數(shù)據(jù)集的洗牌和課程學(xué)習(xí)】:
  • 總的來(lái)說(shuō),我們希望避免向我們的模型中以一定意義的順序提供訓(xùn)練數(shù)據(jù),因?yàn)檫@樣會(huì)使得優(yōu)化算法產(chǎn)生偏差。因此,在每一輪迭代后對(duì)訓(xùn)練數(shù)據(jù)洗牌是一個(gè)不錯(cuò)的主意。

  • 另一方面,在很多情況下,我們是逐步解決問(wèn)題的,而將訓(xùn)練集按照某個(gè)有意義的順序排列會(huì)提高模型的性能和SGD的收斂性,如何將訓(xùn)練集建立一個(gè)有意義的排列被稱為課程學(xué)習(xí)。

  • Zaremba and Sutskever[20]只能使用課程學(xué)習(xí)訓(xùn)練LSTM來(lái)評(píng)估簡(jiǎn)單程序,并表明組合或混合策略比單一的策略更好,通過(guò)增加難度來(lái)排列示例。

6.2、 Batch normalization【批量歸一化】:

(1)為了便于學(xué)習(xí),我們通常用0均值和單位方差初始化我們的參數(shù)的初始值來(lái)歸一化。 隨著不斷訓(xùn)練,參數(shù)得到不同的程度的更新,我們失去了這種歸一化,隨著網(wǎng)絡(luò)變得越來(lái)越深,這種現(xiàn)象會(huì)降低訓(xùn)練速度,且放大參數(shù)變化。

(2)批量歸一化在每次小批量數(shù)據(jù)反向傳播之后重新對(duì)參數(shù)進(jìn)行0均值單位方差標(biāo)準(zhǔn)化。通過(guò)將模型架構(gòu)的一部分歸一化,我們能夠使用更高的學(xué)習(xí)率,更少關(guān)注初始化參數(shù)。批量歸一化還充當(dāng)正則化的作用,減少(有時(shí)甚至消除)Dropout的必要性。

6.3、 Early stopping:

需要在訓(xùn)練的過(guò)程中時(shí)常在驗(yàn)證集上監(jiān)測(cè)誤差,在驗(yàn)證集上如果損失函數(shù)不再顯著地降低,那么應(yīng)該提前結(jié)束訓(xùn)練

6.4 、Gradient noise【梯度噪音】:
  • (1)Neelakantan等人[12]在每個(gè)梯度更新中增加滿足高斯分布N(0,σ2t)的噪音:

    image.png

  • (2)高斯分布的方差需要根據(jù)如下的策略退火:

image.png
  • (3)他們指出增加了噪音,使得網(wǎng)絡(luò)對(duì)不好的初始化更加魯棒,同時(shí)對(duì)深層的和復(fù)雜的網(wǎng)絡(luò)的訓(xùn)練特別有益。他們猜測(cè)增加的噪音使得模型更有機(jī)會(huì)逃離當(dāng)前的局部最優(yōu)點(diǎn),以發(fā)現(xiàn)新的局部最優(yōu)點(diǎn),這在更深層的模型中更加常見(jiàn)。

7、 Conclusion【結(jié)論】:

我們初步研究了:

  • (1)梯度下降的三個(gè)變形形式,其中,小批量梯度下降是最受歡迎的。
  • (2)然后我們研究了最常用于優(yōu)化SGD的算法:動(dòng)量法,Nesterov加速梯度,Adagrad,Adadelta,RMSprop,Adam以及不同的優(yōu)化異步SGD的算法。
  • (3)最后,我們已經(jīng)考慮其他一些改善SGD的策略,如洗牌和課程學(xué)習(xí),批量歸一化和early stopping。
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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