編者按:DRDO研究人員Ayoosh Kathuria深入淺出地介紹了梯度下降這一概念。
圖片來(lái)源:O'Reilly Media
深度學(xué)習(xí)在很大程度上是在解決大規(guī)模的煩人的優(yōu)化問(wèn)題。神經(jīng)網(wǎng)絡(luò)不過(guò)是一個(gè)包含數(shù)百萬(wàn)參數(shù)的非常復(fù)雜的函數(shù)??紤]圖像分類的例子。AlexNet是一個(gè)數(shù)學(xué)函數(shù),接受表示圖像的RGB值的數(shù)組作為輸入,產(chǎn)生一組分類評(píng)分作為輸出。
我們所說(shuō)的訓(xùn)練神經(jīng)網(wǎng)絡(luò),基本上是指最小化一個(gè)損失函數(shù)。損失函數(shù)的值為我們提供了網(wǎng)絡(luò)在給定數(shù)據(jù)集上的表現(xiàn)離完美有多遠(yuǎn)的測(cè)度。
損失函數(shù)
為了簡(jiǎn)化問(wèn)題,假定我們的網(wǎng)絡(luò)只有兩個(gè)參數(shù)。在實(shí)踐中,網(wǎng)絡(luò)可能有上億參數(shù),不過(guò)在本文中,我們將一直使用兩個(gè)參數(shù)的網(wǎng)絡(luò)作為例子,以便可視化。一個(gè)非常好的損失函數(shù)的等值曲面看起來(lái)可能是這樣。
為什么我要說(shuō)非常好的損失函數(shù)?因?yàn)榫邆渖蠄D這樣的等值曲面的損失函數(shù)就像圣人一樣,基本上是不存在的。不過(guò),它在教學(xué)上能起到很好的作用,可以幫助我們理解梯度下降最重要的一些想法。所以,讓我們開始吧!
圖中的x軸和y軸表示兩個(gè)權(quán)重的值。z軸表示損失函數(shù)的值。我們的目標(biāo)是找到損失值最小的權(quán)重值。
剛開始,我們隨機(jī)初始化權(quán)重,所以神經(jīng)網(wǎng)絡(luò)大概就像一個(gè)醉漢,將貓的圖像識(shí)別成人類。也就是下圖中的A點(diǎn),網(wǎng)絡(luò)表現(xiàn)很差,損失很高。
我們需要找到一種到達(dá)“谷底”B點(diǎn)(損失函數(shù)最小值)的方法。我們?cè)撛趺醋瞿兀?/p>
梯度下降
初始化權(quán)重時(shí),我們?cè)趽p失曲面的A點(diǎn)。我們首先要做的,是檢查一下,在x-y平面上的所有可能方向中,沿著哪個(gè)方向移動(dòng)能帶來(lái)最陡峭的損失值下降。這就是我們需要移動(dòng)的方向。這一方向恰好是梯度的反方向。梯度,導(dǎo)數(shù)的高維表兄弟,為我們提供了最陡峭的上升方向。
下圖可以幫助你理解這一點(diǎn)。在曲面的任一點(diǎn),可以定義一個(gè)正切的平面。在更高維情形下,我們可以定義一個(gè)超平面。不過(guò)現(xiàn)在還是讓我們保持三維吧。我們?cè)谶@個(gè)平面上有無(wú)窮方向,其中正好有一個(gè)方向能提供函數(shù)最陡峭的上升。這個(gè)方向就是梯度的方向。這也正是算法得名的原因。我們沿著梯度反向下降,所以稱為梯度下降。
現(xiàn)在,有了移動(dòng)的方向,我們需要決定移動(dòng)的步幅。這稱為學(xué)習(xí)率。我們必須仔細(xì)選擇學(xué)習(xí)率,以確保達(dá)到最小值。
如果學(xué)習(xí)率過(guò)快,我們可能越過(guò)最小值,在谷“脊”不斷反彈,再也到不了最小值。如果學(xué)習(xí)率過(guò)慢,訓(xùn)練可能過(guò)于漫長(zhǎng)而不再可行。即便不是這樣,非常低的學(xué)習(xí)率可能使優(yōu)化算法更容易陷入局部極小值(我們稍后將介紹局部極小值)。
一旦確定了梯度和學(xué)習(xí)率,我們開始訓(xùn)練一步,然后在停留處重新計(jì)算梯度,接著重復(fù)這一過(guò)程。
梯度的方向告訴我們哪個(gè)方向有最陡峭的上升,而它的數(shù)量則告訴我們最陡峭的上升/下降有多陡。所以,在最小值處,等值曲面幾乎是平的,相應(yīng)地,梯度幾乎是零。事實(shí)上,最小值處的梯度正好是零。
梯度下降中
學(xué)習(xí)率過(guò)大
在實(shí)踐中,我們也許從未恰好達(dá)到最小值,而是在最小值附近的平面區(qū)域反復(fù)振蕩。在這一區(qū)域振蕩時(shí),損失幾乎是我們可以達(dá)到的最小值,因?yàn)槲覀冊(cè)趯?shí)際最小值附近反復(fù)回彈,所以損失值幾乎沒(méi)什么變化。當(dāng)損失值在預(yù)定義的迭代次數(shù)(比如,10次或20次)后沒(méi)有改善時(shí),我們常常停止迭代。這時(shí)我們稱訓(xùn)練收斂了。
常見誤解
讓我稍稍停頓一下。如果你上網(wǎng)搜索梯度下降的可視化圖像,你大概會(huì)看到從某一點(diǎn)開始,朝向最低點(diǎn)的一條軌跡,就像前面的動(dòng)畫一樣。然而,這只是一個(gè)不精確的示意。實(shí)際上,軌跡完全被限制在x-y權(quán)重平面上,完全不涉及z軸上的移動(dòng)。這是因?yàn)闄?quán)重是唯一的自由參數(shù)。
x-y平面的每一點(diǎn)表示權(quán)重的一種獨(dú)特組合,我們想要找到損失值最小的權(quán)重組合。
基本等式
描述梯度下降更新規(guī)則的基本等式是:
每次迭代均進(jìn)行這樣的更新。上式中,w是位于x-y平面的權(quán)重向量。我們從這個(gè)向量減去損失函數(shù)在權(quán)重上的梯度乘以alpha,學(xué)習(xí)率。梯度也是一個(gè)向量,提供損失函數(shù)上升最陡峭的方向。最陡峭下降的方向正好是梯度的反方向,所以我們從權(quán)重向量中減去梯度向量。
如果想象向量對(duì)你來(lái)說(shuō)有點(diǎn)難,你可以想像梯度下降同時(shí)應(yīng)用于網(wǎng)絡(luò)的所有權(quán)重,按照幾乎一樣的更新規(guī)則。唯一的不同是,由于我們現(xiàn)在為每個(gè)權(quán)重分別應(yīng)用更新,上式中的梯度替換為梯度向量在表示具體權(quán)重的方向上的投影。
我們乘上了學(xué)習(xí)率,對(duì)應(yīng)我們之前提到的步幅。注意,即使學(xué)習(xí)率是常數(shù),由于梯度數(shù)量(損失曲面的陡峭程度)的變動(dòng),步幅仍然會(huì)改變。當(dāng)我們逼近最小值時(shí),梯度逼近零,我們以越來(lái)越小的步子邁向最小值。
理論上這很好,因?yàn)槲覀兿M惴ㄔ诒平钚≈禃r(shí)采用較小的步幅,以免過(guò)大的步幅導(dǎo)致越過(guò)極小值,并在極小值周圍的谷脊間反復(fù)回彈。
梯度下降中廣泛采用的一項(xiàng)技術(shù)是使用可變學(xué)習(xí)率,而不是固定學(xué)習(xí)率。剛開始,我們可以接受較大的學(xué)習(xí)率。之后,隨著訓(xùn)練進(jìn)行,我們漸漸接近最小值,這時(shí)我們想要放慢學(xué)習(xí)率。實(shí)現(xiàn)這一策略的一種方法是模擬退火,又稱學(xué)習(xí)率衰減。在這種方法中,學(xué)習(xí)率在固定數(shù)目的迭代之后衰減。
梯度下降的挑戰(zhàn)之一:局部極小值
好吧,目前為止,梯度下降看起來(lái)是一個(gè)非常美好的童話。不過(guò)我要開始潑涼水了。還記得我之前說(shuō)過(guò),我們的損失函數(shù)是一個(gè)非常好的函數(shù),這樣的損失函數(shù)并不真的存在?
首先,神經(jīng)網(wǎng)絡(luò)是復(fù)雜函數(shù),具有大量非線性變換。由此得到的損失函數(shù)看起來(lái)不像一個(gè)很好的碗,只有一處最小值可以收斂。實(shí)際上,這種圣人般的損失函數(shù)稱為凸函數(shù),而深度網(wǎng)絡(luò)的損失函數(shù)幾乎總是非凸的。事實(shí)上,損失函數(shù)可能是這樣的:
上圖中有一個(gè)梯度為零的局部極小值。然而,我們知道那不是我們能達(dá)到的最低損失(全局最小值)。如果初始權(quán)重位于點(diǎn)A,那么我們將收斂于局部極小值,一旦收斂于局部極小值,梯度下降無(wú)法逃離這一陷阱。
梯度下降是由梯度驅(qū)動(dòng)的,而梯度在任何極小值處都是零。局部極小值,顧名思義,是損失函數(shù)在局部達(dá)到最小值的點(diǎn)。而全局最小值,是損失函數(shù)整個(gè)定義域上可以達(dá)到的最小值。
讓事情更糟的是,損失等值曲面可能更加復(fù)雜,實(shí)踐中可沒(méi)有我們考慮的三維等值曲面。實(shí)踐中的神經(jīng)網(wǎng)絡(luò)可能有上億權(quán)重,相應(yīng)地,損失函數(shù)有上億維度。在那樣的圖像上梯度為零的點(diǎn)不知道有多少。
事實(shí)上,可視化這樣的高維函數(shù)很難。然而,因?yàn)楝F(xiàn)在有很多極具天賦的人從事深度學(xué)習(xí)研究,人們找到了以3D形式可視化損失函數(shù)的等值曲面的方法。最近的一篇論文提出了過(guò)濾器歸一化(Filter Normalization)技術(shù),本文就不解釋它的具體做法了。我們只要知道,它能夠?yàn)槲覀兲峁┏尸F(xiàn)損失函數(shù)復(fù)雜性的視圖。例如,下圖表示VGG-56深度網(wǎng)絡(luò)在CIFAR-10數(shù)據(jù)集上的損失函數(shù):
圖片來(lái)源:cs.umd.edu/~tomg
如你所見,上面遍布局部極小值。
梯度下降的挑戰(zhàn)之二:鞍點(diǎn)
我們碰到的另一種問(wèn)題是鞍點(diǎn),看起來(lái)是這樣的:
之前的圖片中,雙“峰”交匯處也有一個(gè)鞍點(diǎn)。
鞍點(diǎn)因形狀像馬鞍而得名。鞍點(diǎn)處,梯度在一個(gè)方向(x)上是極小值,在另一個(gè)方向上則是極大值。如果沿著x方向的等值曲面比較平,那么梯度下降會(huì)沿著y方向來(lái)回振蕩,造成收斂于最小值的錯(cuò)覺(jué)。
隨機(jī)性是救星!
所以,我們?cè)撊绾翁与x局部極小值和鞍點(diǎn),努力收斂于全局最小值呢?答案是隨機(jī)性。
目前為止,我們進(jìn)行梯度下降時(shí)計(jì)算的損失函數(shù)累加了訓(xùn)練集中所有可能樣本上的損失。如果我們碰到局部極小值或鞍點(diǎn),我們便陷入其中。幫助梯度下降擺脫這些的一種方法是使用隨機(jī)梯度下降。
隨機(jī)梯度下降并不通過(guò)累加所有損失函數(shù)計(jì)算損失,而是計(jì)算隨機(jī)取樣(無(wú)放回)的樣本的損失。和隨機(jī)選取一個(gè)樣本的隨機(jī)梯度下降不同,我們之前的方法在一個(gè)batch內(nèi)處理所有樣本,因此稱為批量梯度下降。
相應(yīng)地,隨機(jī)梯度下降的更新規(guī)則為:
基于“單樣本損失”計(jì)算出的梯度,方向和基于“全樣本損失”計(jì)算出的梯度可能略有不同。因此,當(dāng)“全樣本損失”可能將我們推入局部極小值,或讓我們陷于鞍點(diǎn)時(shí),“單樣本損失”梯度可能指向不同的方向,也許能幫助我們避開局部極小值和鞍點(diǎn)。
即使我們陷入了“單樣本損失”的局部極小值,下一個(gè)隨機(jī)取樣的數(shù)據(jù)點(diǎn)的“單樣本損失”可能不一樣,讓我們得以繼續(xù)移動(dòng)。
當(dāng)它真的收斂時(shí),它收斂于根據(jù)幾乎所有“單樣本損失”計(jì)算得出的最小值。同時(shí),經(jīng)驗(yàn)表明,鞍點(diǎn)極為不穩(wěn)定,小小的輕推可能就足以逃離鞍點(diǎn)。
所以,這是否意味著,在實(shí)踐中,我們應(yīng)該總是進(jìn)行這樣的單樣本隨機(jī)梯度下降?
batch大小
答案是否。盡管理論上,隨機(jī)梯度下降也許能為我們提供最好的結(jié)果,從算力上看,它是一個(gè)不太可行的選項(xiàng)。隨機(jī)梯度下降時(shí),我們需要一步一步地計(jì)算損失,而在批量梯度下降時(shí),單獨(dú)損失的梯度可以并行計(jì)算。
因此,我們?cè)谶@兩種方法之間尋找一個(gè)平衡。我們既不使用整個(gè)數(shù)據(jù)集,也不僅僅基于單個(gè)樣本構(gòu)造損失函數(shù),我們使用固定數(shù)量的樣本,比如,16、32、128,這稱為mini-batch。之所以稱為mini-batch,是為了區(qū)別批量(batch)梯度下降。選擇合適的mini-batch大小,可以確保我們既能有足夠的隨機(jī)性以擺脫局部極小值,又能充分利用并行處理的算力優(yōu)勢(shì)。
重新審視局部極小值:它們并沒(méi)有你想像的那么糟糕
在你仇視局部極小值之前,先看下最近的研究吧。最近的研究表明,局部極小值并不一定不好。在神經(jīng)網(wǎng)絡(luò)的損失曲面上,有太多的極小值了?!傲己谩钡木植繕O小值表現(xiàn)可能和全局最小值一樣好。
為什么我說(shuō)“良好”?因?yàn)槲覀內(nèi)匀豢赡芟萑腚y以預(yù)測(cè)的訓(xùn)練樣本導(dǎo)致的“糟糕”的局部極小值?!傲己谩钡木植繕O小值,文獻(xiàn)中常稱為最優(yōu)局部極小值,在神經(jīng)網(wǎng)絡(luò)的高維損失函數(shù)中,可以有相當(dāng)多個(gè)。
另外,許多神經(jīng)網(wǎng)絡(luò)進(jìn)行的是分類任務(wù)。如果局部極小值對(duì)應(yīng)的正確標(biāo)簽的分值在0.7-0.8之間,而同一樣本全局最小值對(duì)應(yīng)的正確標(biāo)簽的分值在0.95-0.98之間,最終得到的輸出分類預(yù)測(cè)是一樣的。
我們希望極小值具有的性質(zhì)是它位于較平坦的一邊。為什么?因?yàn)槠教箻O小值更容易收斂,跳過(guò)極小值、在極小值周圍的“谷脊”反復(fù)回彈的概率更低。
更重要的是,預(yù)測(cè)集的損失曲面一般和訓(xùn)練集的略有不同。平坦寬闊的極小值,從訓(xùn)練集到預(yù)測(cè)集的切換不會(huì)改變太多損失,而狹窄的極小值則不然。更平坦的極小值推廣性更好。
重新審視學(xué)習(xí)率
最近涌現(xiàn)了一堆學(xué)習(xí)率規(guī)劃的研究,以避免收斂于損失曲面的次優(yōu)極小值。即使使用學(xué)習(xí)率衰減,仍有可能陷入局部極小值。傳統(tǒng)上,訓(xùn)練或者在固定數(shù)目的迭代之后結(jié)束,或者在損失沒(méi)有改善的10個(gè)(比方說(shuō))迭代后結(jié)束(文獻(xiàn)中稱為及早停止)。
更高的學(xué)習(xí)率也有助于幫助我們?cè)谟?xùn)練早期逃離局部極小值。
也有人組合了及早停止和學(xué)習(xí)率衰減,每次遇到10個(gè)損失沒(méi)有改善的迭代,就降低學(xué)習(xí)率,并在學(xué)習(xí)率低于某個(gè)預(yù)訂的閾值時(shí)停止訓(xùn)練。
近年來(lái)也曾流行周期學(xué)習(xí)率,緩慢增加學(xué)習(xí)率,然后降低學(xué)習(xí)率,循環(huán)往復(fù)。
圖片來(lái)源:Hafidz Zulkifli
還有稱為熱重啟隨機(jī)梯度下降的技術(shù),基本上就是學(xué)習(xí)率退火至下界后,還原學(xué)習(xí)率為原值。
還有不同的學(xué)習(xí)率衰減的規(guī)劃方案,從指數(shù)衰減到余弦衰減。
余弦衰減搭配重啟
最近的一篇論文又引入了隨機(jī)權(quán)重平均的技術(shù)。作者研發(fā)了一種新方法,首先收斂于一個(gè)極小值,緩存權(quán)重,然后還原到較高的學(xué)習(xí)率。這一較高的學(xué)習(xí)率將算法推離極小值,到損失曲面上的一個(gè)隨機(jī)點(diǎn)。接著算法收斂于另一個(gè)極小值。重復(fù)幾次后,對(duì)所有緩存的權(quán)重取平均,基于平均權(quán)重作出預(yù)測(cè)。
結(jié)語(yǔ)
梯度下降就介紹到這里了。不過(guò)我們還漏了一點(diǎn)沒(méi)講,如何應(yīng)對(duì)病態(tài)曲率。隨機(jī)梯度下降的一些擴(kuò)展,如動(dòng)量、RMSProp、Adam可以用來(lái)克服這一問(wèn)題。
不過(guò)我覺(jué)得我們介紹的內(nèi)容對(duì)一篇博客文章來(lái)說(shuō)已經(jīng)夠多了,剩余的內(nèi)容將在另一篇文章中介紹。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4782瀏覽量
101220 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
63006 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5516瀏覽量
121597
原文標(biāo)題:深度學(xué)習(xí)優(yōu)化算法入門:一、梯度下降
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論