標(biāo)題:An overview of gradient descent optimization algorithms?
論文地址:https://arxiv.org/pdf/1609.04747.pdf
Abstract:
雖然梯度下降優(yōu)化算法越來越受歡迎羡滑,但通常作為黑盒優(yōu)化器使用锰茉,因此很難對其優(yōu)點和缺點的進行實際的解釋。本文旨在讓讀者對不同的算法有直觀的認識谴轮,以幫助讀者使用這些算法朽寞。在本綜述中识窿,我們介紹梯度下降的不同變形形式,總結(jié)這些算法面臨的挑戰(zhàn)脑融,介紹最常用的優(yōu)化算法喻频,回顧并行和分布式架構(gòu),以及調(diào)研用于優(yōu)化梯度下降的其他的策略肘迎。
1半抱、Introduction:
梯度下降法是最常用的優(yōu)化算法之一,也是迄今為止最常用的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法膜宋。
同時,每一SOTA的深度學(xué)習(xí)lib庫都包含各種算法來實現(xiàn)梯度下降的優(yōu)化炼幔。然而秋茫,這些算法通常被用作黑盒優(yōu)化器,因為很難找到它們的優(yōu)缺點的實際解釋乃秀。
本文旨在為讀者提供有關(guān)優(yōu)化梯度下降的不同算法肛著。
- 第2節(jié),梯度下降的不同變體跺讯。
- 第3節(jié)枢贿,簡要總結(jié)訓(xùn)練期間面臨的挑戰(zhàn)。
- 第4節(jié)刀脏,介紹最常用的優(yōu)化算法局荚,包括這些算法在解決以上挑戰(zhàn)時的動機以及如何得到更新規(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í)率η決定達到最小值或者局部最小值過程中所采用的的步長的大小驰吓。即,我們沿著目標(biāo)函數(shù)的斜面下降的方向系奉。
2檬贰、 梯度下降法的變形形式:
梯度下降法有三種變體,它們在計算目標(biāo)函數(shù)梯度時使用的數(shù)據(jù)量上有所不同喜最。根據(jù)數(shù)據(jù)量偎蘸,我們在參數(shù)更新的準(zhǔn)確性和執(zhí)行更新所需的時間之間進行權(quán)衡。
2.1 Batch gradient descent【批量梯度下降】:
Vanilla gradient descent瞬内,又名batch gradient descent迷雪,在整個訓(xùn)練數(shù)據(jù)集上計算損失函數(shù)關(guān)于參數(shù)θ的梯度:
因為在執(zhí)行每次更新時,我們需要在整個數(shù)據(jù)集上計算所有的梯度虫蝶,所以批梯度下降法的速度會很慢章咧,同時,批梯度下降法無法處理超出內(nèi)存容量限制的數(shù)據(jù)集能真。批梯度下降法同樣也不能在線更新模型赁严,即在運行的過程中,不能增加新的樣本粉铐。
批梯度下降法的代碼如下所示:
for i in range ( nb_epochs ):
params_grad = evaluate_gradient ( loss_function , data , params )
params = params - learning_rate * params_grad
對于預(yù)定義數(shù)量的歷元疼约,我們首先計算整個數(shù)據(jù)集w.r.t.的損失函數(shù)的梯度向量params_grad。我們的參數(shù)向量params蝙泼。請注意程剥,最先進的深度學(xué)習(xí)庫提供了自動微分,可以有效地計算梯度w.r.t.一些參數(shù)汤踏。如果你自己推導(dǎo)梯度织鲸,那么梯度檢查是個好主意。6. 然后溪胶,我們按照梯度的方向更新參數(shù)搂擦,學(xué)習(xí)速率決定我們執(zhí)行的更新的大小。對于凸誤差曲面哗脖,批梯度下降法保證收斂到全局最小值瀑踢,對于非凸曲面,批梯度下降法保證收斂到局部最小值才避。
對于給定的迭代次數(shù)epchs:
(1)首先丘损,我們利用全部數(shù)據(jù)集計算損失函數(shù)關(guān)于參數(shù)向量params的梯度向量params_grad。注意工扎,最新的深度學(xué)習(xí)庫中提供了自動求導(dǎo)的功能徘钥,可以有效地計算關(guān)于參數(shù)梯度。如果你自己求梯度肢娘,那么呈础,梯度檢查是一個不錯的主意舆驶。
(2)然后,我們利用梯度的方向和學(xué)習(xí)率更新參數(shù)而钞,學(xué)習(xí)率決定我們將以多大的步長更新參數(shù)沙廉。
O 對于凸誤差函數(shù),批梯度下降法能夠保證收斂到全局最小值臼节。
O 對于非凸函數(shù)撬陵,則收斂到一個局部最小值。
2.2网缝、 Stochastic gradient descent【隨機梯度下降算法】:
相比之下巨税,隨機梯度下降(SGD)根據(jù)每一條訓(xùn)練樣本x(i)和標(biāo)簽y(i)更新參數(shù):
批量梯度下降法對大型數(shù)據(jù)集執(zhí)行冗余計算,因為在每次參數(shù)更新之前粉臊,它會重新計算相似樣本的梯度草添。SGD通過一次執(zhí)行一個更新來消除這種冗余。因此扼仲,它通常更快远寸,也可以用于在線學(xué)習(xí)。SGD以高方差頻繁地更新屠凶,導(dǎo)致目標(biāo)函數(shù)劇烈波動驰后,如圖1所示。
與批量梯度下降算法的收斂會使得損失函數(shù)陷入局部最小相比矗愧,由于SGD的波動性:
- 一方面倡怎,波動性使得SGD可以跳到新的和潛在更好的局部最優(yōu)。
- 另一方面贱枣,這使得最終收斂到特定最小值的過程變得復(fù)雜,因為SGD會一直持續(xù)波動颤专。
然而纽哥,已經(jīng)證明當(dāng)我們緩慢減小學(xué)習(xí)率,SGD與批梯度下降法具有相同的收斂行為栖秕,對于非凸優(yōu)化和凸優(yōu)化春塌,可以分別收斂到局部最小值和全局最小值。
與批梯度下降的代碼相比簇捍,SGD的代碼片段僅僅是在對訓(xùn)練樣本的遍歷和利用每一條樣本計算梯度的過程中增加一層循環(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)點惕艳,在每次更新時使用n個小批量訓(xùn)練樣本:
這種方法:
- (a)減少參數(shù)更新的方差搞隐,這樣可以得到更加穩(wěn)定的收斂結(jié)果;
- (b)可以利用最新的深度學(xué)習(xí)庫中高度優(yōu)化的矩陣優(yōu)化方法远搪,高效地求解每個小批量數(shù)據(jù)的梯度劣纲。
通常,小批量數(shù)據(jù)的大小在50到256之間谁鳍,也可以根據(jù)不同的應(yīng)用有所變化癞季。當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型時,小批量梯度下降法是典型的選擇算法倘潜,當(dāng)使用小批量梯度下降法時绷柒,也將其稱為SGD。注意:在下文的改進的SGD中窍荧,為了簡單辉巡,我們省略了參數(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小批量梯度下降法并不能保證較好的收斂性瓤荔,但是需要強調(diào)的是净蚤,這也給我們留下了如下的一些挑戰(zhàn):
選擇一個合適的學(xué)習(xí)率可能是困難的。學(xué)習(xí)率太小會導(dǎo)致收斂的速度很慢输硝,學(xué)習(xí)率太大會妨礙收斂今瀑,導(dǎo)致?lián)p失函數(shù)在最小值附近波動甚至偏離最小值。
學(xué)習(xí)率調(diào)整試圖在訓(xùn)練的過程中通過例如退火的方法調(diào)整學(xué)習(xí)率点把,即根據(jù)預(yù)定義的策略或者當(dāng)相鄰兩epochs之間的下降值小于某個閾值時減小學(xué)習(xí)率橘荠。然而,策略和閾值需要預(yù)先設(shè)定好郎逃,因此無法適應(yīng)數(shù)據(jù)集的特點哥童。
此外,對所有的參數(shù)更新使用同樣的學(xué)習(xí)率褒翰。如果數(shù)據(jù)是稀疏的贮懈,同時,特征的頻率差異很大時优训,我們也許不想以同樣的學(xué)習(xí)率更新所有的參數(shù)朵你,對于出現(xiàn)次數(shù)較少的特征,我們對其執(zhí)行更大的學(xué)習(xí)率揣非。
高度非凸誤差函數(shù)普遍出現(xiàn)在神經(jīng)網(wǎng)絡(luò)中抡医,在優(yōu)化這類函數(shù)時,另一個關(guān)鍵的挑戰(zhàn)是使函數(shù)避免陷入無數(shù)次優(yōu)的局部最小值早敬。Dauphin等人指出出現(xiàn)這種困難實際上并不是來自局部最小值魂拦,而是來自鞍點毛仪,即那些在一個維度上是遞增的,而在另一個維度上是遞減的芯勘。這些鞍點通常被具有相同誤差的點包圍箱靴,因為在任意維度上的梯度都近似為0,所以SGD很難從這些鞍點中逃開荷愕。
4衡怀、Gradient descent optimization algorithms【梯度下降優(yōu)化算法】:
在下文中,我們將概述一些算法安疗,這些算法被深度學(xué)習(xí)社區(qū)廣泛用來處理前面提到的挑戰(zhàn)抛杨。我們不會討論在高維數(shù)據(jù)集的實際計算中不可行的算法,例如二階方法荐类,如牛頓法7怖现。
4.1 Momentum【動量法】:
SGD難以在溝壑中航行,即曲面在一個維度上的曲線比在另一個維度上的曲線陡峭得多的區(qū)域[20]玉罐,這在局部最優(yōu)點附近很常見屈嗤。在這些情況下,SGD在溝谷的斜坡上振蕩吊输,同時沿著底部向局部最優(yōu)方向緩慢前進饶号,如圖2a所示:
- 動量是一種有助于在相關(guān)方向上加速SGD并抑制振蕩的方法,如圖2b所示季蚂。它通過將過去時間步長的更新向量的一部分γ添加到當(dāng)前更新向量來實現(xiàn)這一點茫船。
- 動量項γ通常設(shè)置為0.9或類似值。
基本上扭屁,當(dāng)使用動量時算谈,我們將球推下山。球在下坡時積累動量料滥,在途中變得越來越快(如果存在空氣阻力然眼,即γ<1,則直到達到其極限速度)幔欧。我們的參數(shù)更新也會發(fā)生同樣的情況:
(1)對于在梯度點處具有相同的方向的維度,其動量項增大丽声。
(2)對于在梯度點處改變方向的維度礁蔗,其動量項減小。
(3)因此雁社,我們可以得到更快的收斂速度浴井,同時可以減少搖擺。
4.2 Nesterov accelerated gradient【內(nèi)斯特羅夫加速梯度下降法NAG】:
然而霉撵,球從山上滾下的時候磺浙,盲目地沿著斜率方向洪囤,往往并不能令人滿意。我們希望有一個智能的球撕氧,這個球能夠知道它將要去哪瘤缩,以至于在將要重新遇到斜率上升時能夠知道減速。
Nesterov加速梯度下降法(Nesterov accelerated gradient伦泥,NAG)是一種能夠給動量項這樣的預(yù)知能力的方法剥啤。我們知道,我們利用動量項γvt?1來更新參數(shù)θ不脯。通過計算θ?γvt?1能夠告訴我們參數(shù)未來位置的一個近似值(梯度并不是完全更新)府怯,這也就是告訴我們參數(shù)大致將變?yōu)槎嗌佟Mㄟ^計算關(guān)于參數(shù)未來的近似位置的梯度防楷,而不是關(guān)于當(dāng)前的參數(shù)θ的梯度牺丙,我們可以高效的求解 :
- (1)同時,我們設(shè)置動量項γ大約為0.9复局。
- (2)動量法首先計算當(dāng)前的梯度值(圖3中的小的藍色向量)冲簿,然后在更新的累積梯度(大的藍色向量)方向上前進一大步,
- (3)Nesterov加速梯度下降法NAG首先在先前累積梯度(棕色的向量)方向上前進一大步肖揣,計算梯度值民假,然后做一個修正(綠色的向量)。
- (4)這個具有預(yù)見性的更新防止我們前進得太快龙优,同時增強了算法的響應(yīng)能力羊异,這一點在很多的任務(wù)中對于RNN的性能提升有著重要的意義[2]。
既然我們能夠使得我們的更新適應(yīng)誤差函數(shù)的斜率以相應(yīng)地加速SGD彤断,我們同樣也想要使得我們的更新能夠適應(yīng)每一個單獨參數(shù)野舶,以根據(jù)每個參數(shù)的重要性決定大的或者小的更新。
4.3 Adagrad:
Adagrad是一種基于梯度的優(yōu)化算法宰衙,它可以做到這一點:它根據(jù)參數(shù)調(diào)整學(xué)習(xí)速率平道,對不頻繁的參數(shù)執(zhí)行較大的更新,對頻繁的參數(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í)識別貓。
此外涛贯,Pennington等人[16]使用Adagrad來訓(xùn)練GloVe詞嵌入诽嘉,因為低頻詞比高頻詞需要更大的步長。
前面,我們每次更新所有的參數(shù)θ時虫腋,每一個參數(shù)θi都使用的是相同的學(xué)習(xí)率η骄酗。由于Adagrad在t時刻對每一個參數(shù)θi使用了不同的學(xué)習(xí)率,我們首先介紹Adagrad對每一個參數(shù)的更新悦冀,然后我們對其向量化趋翻。為了簡潔,令gt,i為在t時刻目標(biāo)函數(shù)關(guān)于參數(shù)θi的梯度:
在t時刻雏门,對每個參數(shù)θi的更新過程變?yōu)椋?/p>
對于上述的更新規(guī)則嘿歌,在t時刻,基于對θi計算過的歷史梯度茁影,Adagrad修正了對每一個參數(shù)θi的學(xué)習(xí)率:
其中宙帝,Gt∈?d×d是一個對角矩陣,對角線上的元素i,i是直到t時刻為止募闲,所有關(guān)于θi的梯度的平方和(Duchi等人[7]將該矩陣作為包含所有先前梯度的外積的完整矩陣的替代步脓,因為即使是對于中等數(shù)量的參數(shù)d,矩陣的均方根的計算都是不切實際的浩螺。)靴患,?是平滑項,用于防止除數(shù)為0(通常大約設(shè)置為1e?8)要出。比較有意思的是鸳君,如果沒有平方根的操作,算法的效果會變得很差患蹂。
- 由于Gt的對角線上包含了關(guān)于所有參數(shù)θ的歷史梯度的平方和或颊,現(xiàn)在,我們可以通過Gt和gt之間的元素向量乘法⊙向量化上述的操作:
優(yōu)缺點:
(1)Adagrad的主要優(yōu)點之一是传于,它無需手動調(diào)整學(xué)習(xí)速度囱挑。大多數(shù)實現(xiàn)都使用默認值0.01,并保持該值不變沼溜。
(2) Adagrad的主要缺點是分母中平方梯度的累積:由于每個附加項都是正的平挑,因此累積的總和在訓(xùn)練期間不斷增長。這反過來會導(dǎo)致學(xué)習(xí)速度下降系草,最終變得無窮小通熄,此時算法不再能夠獲得額外的知識。以下算法旨在解決此缺陷找都。
4.4 Adadelta【阿達德爾塔】:
Adadelta是Adagrad的一個擴展唇辨,旨在減少其攻擊性、單調(diào)遞減性學(xué)習(xí)率檐嚣。Adadelta并沒有累加所有過去的平方梯度助泽,而是將計算歷史梯度的窗口大小限制為一個固定值w。
- 在Adadelta中嚎京,無需存儲先前的w個平方梯度嗡贺,而是將梯度的平方遞歸地表示成所有歷史梯度平方的均值。在t時刻的均值E[g2]t只取決于先前的均值和當(dāng)前的梯度(分量γ類似于動量項):
我們將γ設(shè)置為與動量項類似的值鞍帝,約為0.9诫睬。為了清楚起見,我們現(xiàn)在根據(jù)參數(shù)更新向量重寫我們的普通SGD更新?θt:
因此帕涌,我們之前導(dǎo)出的Adagrad的參數(shù)更新向量的形式如下:
現(xiàn)在摄凡,我們簡單將對角矩陣Gt替換成歷史梯度的均值E[g2]t:
由于分母只是梯度的均方根(RMS)誤差準(zhǔn)則,我們可以用標(biāo)準(zhǔn)簡寫來代替它:
作者指出蚓曼,本次更新中的單位(以及SGD亲澡、Momentum或Adagrad中的單位)不匹配,即更新應(yīng)具有與參數(shù)相同的假設(shè)單位纫版。為了實現(xiàn)這一點床绪,他們首先定義了另一個指數(shù)衰減的平均值,這次不是平方梯度其弊,而是平方梯度參數(shù)更新:
因此癞己,參數(shù)更新的均方根誤差為:
由于RMS[Δθ]t是未知的,我們利用參數(shù)的均方根誤差來近似更新梭伐。利用RMS[Δθ]t?1替換先前的更新規(guī)則中的學(xué)習(xí)率η痹雅,最終得到Adadelta的更新規(guī)則:
- 使用Adadelta,我們甚至不需要設(shè)置默認學(xué)習(xí)速率糊识,因為更新規(guī)則中已經(jīng)移除了學(xué)習(xí)率绩社。
4.5 RMSprop:
RMSprop是一個未被發(fā)表的自適應(yīng)學(xué)習(xí)率的算法,該算法由Geoff Hinton在其[Coursera課堂的課程6e]中提出技掏。
RMSprop和Adadelta都是在同一時間獨立開發(fā)的铃将,這是因為需要解決Adagrad學(xué)習(xí)率急劇下降的問題。實際上哑梳,RMSprop是先前我們得到的Adadelta的第一個更新向量的特例:
RMSprop將學(xué)習(xí)率分解成一個平方梯度的指數(shù)衰減的平均劲阎。
- (1)Hinton建議將γ設(shè)置為0.9。
- (2)而學(xué)習(xí)率η的良好默認值為0.001鸠真。
4.6悯仙、 Adam:
自適應(yīng)矩估計(Adam)是另一種計算每個參數(shù)的自適應(yīng)學(xué)習(xí)率的方法。Adam對每一個參數(shù)都計算自適應(yīng)的學(xué)習(xí)率吠卷。
- (1)除了像Adadelta和RMSprop一樣存儲一個指數(shù)衰減的歷史平方梯度的平均vt锡垄,
- (2)Adam同時還保存一個歷史梯度的指數(shù)衰減均值mt,類似于動量:
mt和vt分別是梯度的第一矩(平均值)和第二矩(非中心方差)的估計值祭隔,因此該方法的名稱货岭。由于mt和vt被初始化為0的向量路操,Adam的作者觀察到它們偏向于零,尤其是在初始時間步千贯,尤其是當(dāng)衰變率很小時(即β1和β2接近1)屯仗。
通過計算偏差校正的一階矩和二階矩估計來抵消偏差:
然后他們使用這些來更新參數(shù)脐彩,就像我們在Adadelta和RMSprop中看到的那樣日矫,這生成Adam更新規(guī)則:
- 作者建議β1的默認值為0.9抵代,β2的默認值為0.999墨坚,?為10?8?及穗。他們的經(jīng)驗表明苇经,Adam在實踐中運行良好理卑,并優(yōu)于其他自適應(yīng)學(xué)習(xí)方法算法大年。
4.7芜果、 AdaMax【阿達麥克斯】:
Adam update規(guī)則中的vt因子與過去梯度的`2范數(shù)成反比縮放梯度(通過vt?1項)和電流梯度|gt | 2:
我們可以將這個更新推廣到`p范數(shù)鞠呈。注意,Kingma和Ba也將β2參數(shù)化為βp2:
大p值的范數(shù)通常在數(shù)值上變得不穩(wěn)定右钾,這就是為什么“1”和“2”范數(shù)在實踐中最常見的原因粟按。然而∞ 也通常表現(xiàn)出穩(wěn)定的行為。因此霹粥,作者提出AdaMax[10]灭将,并表明vt與
∞ 收斂到以下更穩(wěn)定的值。
我們現(xiàn)在可以通過替換√v?t+?通過ut獲得AdaMax更新規(guī)則:
- 請注意后控,由于ut依賴于max運算庙曙,因此不可能像Adam中的mt和vt那樣偏向于零,這就是為什么我們不需要計算ut的偏差校正浩淘。好的默認值是同樣捌朴,η=0.002,β1=0.9张抄,β2=0.999砂蔽。
4.8、 Nadam【Nesterov加速自適應(yīng)矩估計】:
正如我們之前所看到的署惯,Adam可以被視為RMSprop和動量momentum的組合:RMSprop貢獻了過去平方梯度vt的指數(shù)衰減平均值左驾,而動量解釋了過去梯度mt的指數(shù)衰減平均值。我們還看到Nesterov加速梯度(NAG)優(yōu)于vanilla momentum极谊。
因此诡右,Nadam(Nesterov加速自適應(yīng)矩估計)結(jié)合了Adam和NAG。為了將NAG并入Adam轻猖,我們需要修改它的動量項mt帆吻。
- (1) 首先,讓我們回顧一下使用當(dāng)前符號的動量更新規(guī)則:
其中J是我們的目標(biāo)函數(shù)咙边,γ是動量衰減項猜煮,η是我們的步長次员。將上面的第三個等式展開,可以得到:
這再次證明王带,動量包括朝著前一個動量向量的方向邁出一步翠肘,以及朝著當(dāng)前梯度的方向邁出一步。
NAG允許我們在計算梯度之前辫秧,通過動量步更新參數(shù),在梯度方向上執(zhí)行更精確的步驟被丧。因此盟戏,我們只需修改梯度gt即可達到NAG:
Dozat建議通過以下方式修改NAG:我們現(xiàn)在直接應(yīng)用前瞻動量向量來更新當(dāng)前參數(shù),而不是兩次應(yīng)用動量步—一次用于更新梯度gt甥桂,第二次用于更新參數(shù)θt+1柿究。
請注意,不要使用前面的動量向量mt?1如等式27所示黄选,我們現(xiàn)在使用當(dāng)前動量向量mt來展望未來蝇摸。為了給Adam增加Nesterov動量,我們可以用當(dāng)前動量向量替換之前的動量向量办陷。第一回想一下貌夕,Adam更新規(guī)則如下(請注意,我們不需要修改v?t):
用m?t和mt的定義來展開第二個方程民镜,我們可以得到:
注意β1mt?1除以1?βT1.只是前一次動量向量的偏差修正估計步啡专,因此,我們可以用m?t代替它?1:
這個方程看起來非常類似于方程27中的擴展動量項制圈。我們現(xiàn)在可以添加Nesterov動量们童,就像我們在等式29中所做的那樣,只需替換前一時間步m?t-1動量向量的偏差修正估計.電流的偏差修正估計值動量向量m?t鲸鹦,它給出了Nadam更新規(guī)則:
4.9 慧库、Visualization of algorithms【算法可視化】:
以下兩幅圖提供了對所提出的優(yōu)化算法的優(yōu)化行為的一些直覺:
在圖4a中,我們看到不同算法在損失曲面的等高線上走的不同路線馋嗜。所有的算法都是從同一個點出發(fā)并選擇不同路徑到達最優(yōu)點齐板。注意:Adagrad,Adadelta和RMSprop能夠立即轉(zhuǎn)移到正確的移動方向上并以類似的速度收斂葛菇,而動量法和NAG會導(dǎo)致偏離覆积,想像一下球從山上滾下的畫面。然而熟呛,NAG能夠在偏離之后快速修正其路線宽档,因為NAG通過對最優(yōu)點的預(yù)見增強其響應(yīng)能力。
圖4b中庵朝,展示了不同算法在鞍點出的行為吗冤,鞍點即為一個點在一個維度上的斜率為正又厉,而在其他維度上的斜率為負,正如我們前面提及的椎瘟,鞍點對SGD的訓(xùn)練造成很大困難覆致。這里注意,SGD肺蔚,動量法和NAG在鞍點處很難打破對稱性煌妈,盡管后面兩個算法最終設(shè)法逃離了鞍點。而Adagrad宣羊,RMSprop和Adadelta能夠快速向著梯度為負的方向移動璧诵,其中Adadelta走在最前面。
正如我們所見仇冯,自適應(yīng)學(xué)習(xí)率方法之宿,即Adagrad、Adadelta苛坚、RMSprop和Adam最適合這些場景比被,并為這些場景提供了最佳的收斂性。
4.10 泼舱、Which optimizer to use?
那么等缀,我們應(yīng)該選擇使用哪種優(yōu)化算法呢?如果輸入數(shù)據(jù)是稀疏的娇昙,選擇任一自適應(yīng)學(xué)習(xí)率算法可能會得到最好的結(jié)果项滑。選用這類算法的另一個好處是無需調(diào)整學(xué)習(xí)率,選用默認值就可能達到最好的結(jié)果涯贞。
總的來說:
(1)RMSprop是Adagrad的擴展形式枪狂,用于處理在Adagrad中急速遞減的學(xué)習(xí)率。
(2)RMSprop與Adadelta相同宋渔,所不同的是Adadelta在更新規(guī)則中使用參數(shù)的均方根進行更新州疾。
(3)最后,Adam是將偏差校正和動量加入到RMSprop中皇拣。
在這樣的情況下严蓖,RMSprop、Adadelta和Adam是很相似的算法并且在相似的環(huán)境中性能都不錯氧急。Kingma等人[9]指出在優(yōu)化后期由于梯度變得越來越稀疏颗胡,偏差校正能夠幫助Adam微弱地勝過RMSprop。綜合看來吩坝,Adam可能是最佳的選擇毒姨。
有趣的是,最近許多論文中采用不帶動量的SGD和一種簡單的學(xué)習(xí)率的退火策略钉寝。已表明弧呐,通常SGD能夠找到最小值點闸迷,但是比其他優(yōu)化的SGD花費更多的時間,與其他算法相比俘枫,SGD更加依賴魯棒的初始化和退火策略腥沽,同時,SGD可能會陷入鞍點鸠蚪,而不是局部極小值點今阳。因此,如果你關(guān)心的是快速收斂和訓(xùn)練一個深層的或者復(fù)雜的神經(jīng)網(wǎng)絡(luò)茅信,你應(yīng)該選擇一個自適應(yīng)學(xué)習(xí)率的方法盾舌。
5 、Parallelizing and distributing SGD【并行化和分布式SGD】:
當(dāng)存在大量的大規(guī)模數(shù)據(jù)和廉價的集群時汹押,利用分布式SGD來加速是一個顯然的選擇。SGD本身有固有的順序:一步一步起便,我們進一步進展到最小棚贾。SGD提供了良好的收斂性,但SGD的運行緩慢榆综,特別是對于大型數(shù)據(jù)集妙痹。相反,SGD異步運行速度更快鼻疮,但客戶端之間非最理想的通信會導(dǎo)致差的收斂怯伊。此外,我們也可以在一臺機器上并行SGD判沟,這樣就無需大的計算集群耿芹。以下是已經(jīng)提出的優(yōu)化的并行和分布式的SGD的算法和框架。
5.1 Hogwild!:
Niu等人[14]提出稱為Hogwild!的更新機制挪哄,Hogwild!允許在多個CPU上并行執(zhí)行SGD更新吧秕。在無需對參數(shù)加鎖的情況下,處理器可以訪問共享的內(nèi)存迹炼。這種方法只適用于稀疏的輸入數(shù)據(jù)砸彬,因為每一次更新只會修改一部分參數(shù)。在這種情況下斯入,該更新策略幾乎可以達到一個最優(yōu)的收斂速率砂碉,因為CPU之間不可能重寫有用的信息。
5.2刻两、 Downpour SGD:
Downpour SGD是SGD的一種異步的變形形式增蹭,在Google,Dean等人[6]在他們的DistBelief框架(TensorFlow的前身)中使用了該方法磅摹。Downpour SGD在訓(xùn)練集的子集上并行運行多個模型的副本沪铭。這些模型將各自的更新發(fā)送給一個參數(shù)服務(wù)器壮池,參數(shù)服務(wù)器跨越了多臺機器。每一臺機器負責(zé)存儲和更新模型的一部分參數(shù)杀怠。然而椰憋,因為副本之間是彼此不互相通信的,即通過共享權(quán)重或者更新赔退,因此可能會導(dǎo)致參數(shù)發(fā)散而不利于收斂橙依。
5.3 、Delay-tolerant Algorithms for SGD【延遲容忍SGD】:
通過容忍延遲算法的開發(fā)硕旗,McMahan和Streeter[11]將AdaGraad擴展成并行的模式窗骑,該方法不僅適應(yīng)于歷史梯度,同時適應(yīng)于更新延遲漆枚。該方法已經(jīng)在實踐中被證實是有效的创译。
5.4 、TensorFlow:
TensorFlow是Google近期開源的框架墙基,該框架用于實現(xiàn)和部署大規(guī)模機器學(xué)習(xí)模型软族。TensorFlow是基于DistBelief開發(fā),同時TensorFlow已經(jīng)在內(nèi)部用來在大量移動設(shè)備和大規(guī)模分布式系統(tǒng)的執(zhí)行計算残制。在[2016年4月]發(fā)布的分布式版本依賴于圖計算立砸,圖計算即是對每一個設(shè)備將圖劃分成多個子圖,同時初茶,通過發(fā)送颗祝、接收節(jié)點對完成節(jié)點之間的通信。
5.5 恼布、Elastic Averaging SGD【彈性平均SGD
】:
Zhang等人[22]提出的彈性平均SGD(Elastic Averaging SGD螺戳,EASGD)連接了異步SGD的參數(shù)客戶端和一個彈性力,即參數(shù)服務(wù)器存儲的一個中心變量折汞。EASGD使得局部變量能夠從中心變量震蕩得更遠温峭,這在理論上使得在參數(shù)空間中能夠得到更多的探索。經(jīng)驗表明這種增強的探索能力通過發(fā)現(xiàn)新的局部最優(yōu)點字支,能夠提高整體的性能凤藏。
6 Additional strategies for optimizing SGD【優(yōu)化SGD的其他策略】:
最后,我們介紹可以與前面提及到的任一算法配合使用的其他的一些策略堕伪,以進一步提高SGD的性能揖庄。
6.1、 Shuffling and Curriculum Learning【數(shù)據(jù)集的洗牌和課程學(xué)習(xí)】:
總的來說欠雌,我們希望避免向我們的模型中以一定意義的順序提供訓(xùn)練數(shù)據(jù)蹄梢,因為這樣會使得優(yōu)化算法產(chǎn)生偏差。因此,在每一輪迭代后對訓(xùn)練數(shù)據(jù)洗牌是一個不錯的主意禁炒。
另一方面而咆,在很多情況下,我們是逐步解決問題的幕袱,而將訓(xùn)練集按照某個有意義的順序排列會提高模型的性能和SGD的收斂性暴备,如何將訓(xùn)練集建立一個有意義的排列被稱為課程學(xué)習(xí)。
Zaremba and Sutskever[20]只能使用課程學(xué)習(xí)訓(xùn)練LSTM來評估簡單程序们豌,并表明組合或混合策略比單一的策略更好涯捻,通過增加難度來排列示例。
6.2望迎、 Batch normalization【批量歸一化】:
(1)為了便于學(xué)習(xí)障癌,我們通常用0均值和單位方差初始化我們的參數(shù)的初始值來歸一化。 隨著不斷訓(xùn)練辩尊,參數(shù)得到不同的程度的更新涛浙,我們失去了這種歸一化,隨著網(wǎng)絡(luò)變得越來越深摄欲,這種現(xiàn)象會降低訓(xùn)練速度轿亮,且放大參數(shù)變化。
(2)批量歸一化在每次小批量數(shù)據(jù)反向傳播之后重新對參數(shù)進行0均值單位方差標(biāo)準(zhǔn)化蒿涎。通過將模型架構(gòu)的一部分歸一化哀托,我們能夠使用更高的學(xué)習(xí)率惦辛,更少關(guān)注初始化參數(shù)劳秋。批量歸一化還充當(dāng)正則化的作用,減少(有時甚至消除)Dropout的必要性胖齐。
6.3玻淑、 Early stopping:
需要在訓(xùn)練的過程中時常在驗證集上監(jiān)測誤差,在驗證集上如果損失函數(shù)不再顯著地降低呀伙,那么應(yīng)該提前結(jié)束訓(xùn)練补履。
6.4 、Gradient noise【梯度噪音】:
-
(1)Neelakantan等人[12]在每個梯度更新中增加滿足高斯分布N(0,σ2t)的噪音:
image.png (2)高斯分布的方差需要根據(jù)如下的策略退火:
- (3)他們指出增加了噪音剿另,使得網(wǎng)絡(luò)對不好的初始化更加魯棒箫锤,同時對深層的和復(fù)雜的網(wǎng)絡(luò)的訓(xùn)練特別有益。他們猜測增加的噪音使得模型更有機會逃離當(dāng)前的局部最優(yōu)點雨女,以發(fā)現(xiàn)新的局部最優(yōu)點谚攒,這在更深層的模型中更加常見。
7氛堕、 Conclusion【結(jié)論】:
我們初步研究了:
- (1)梯度下降的三個變形形式馏臭,其中,小批量梯度下降是最受歡迎的讼稚。
- (2)然后我們研究了最常用于優(yōu)化SGD的算法:動量法括儒,Nesterov加速梯度绕沈,Adagrad,Adadelta帮寻,RMSprop乍狐,Adam以及不同的優(yōu)化異步SGD的算法。
- (3)最后规婆,我們已經(jīng)考慮其他一些改善SGD的策略澜躺,如洗牌和課程學(xué)習(xí),批量歸一化和early stopping抒蚜。