一文簡(jiǎn)述深度學(xué)習(xí)優(yōu)化方法:梯度下降
從很大程度上來(lái)說(shuō),深度學(xué)習(xí)實(shí)際上是在解決大量煩人的優(yōu)化問(wèn)題。神經(jīng)網(wǎng)絡(luò)僅僅是一個(gè)非常復(fù)雜的函數(shù),包含數(shù)百萬(wàn)個(gè)參數(shù),這些參數(shù)代表的是一個(gè)問(wèn)題的數(shù)學(xué)解答。以圖像分類為例,AlexNet 就是一個(gè)數(shù)學(xué)函數(shù),它以代表圖像 RGB 值的數(shù)組為輸入,生成一組分類得分的輸出。
實(shí)質(zhì)上,通過(guò)訓(xùn)練神經(jīng)網(wǎng)絡(luò),我們是在最小化一個(gè)損失函數(shù)。這個(gè)損失函數(shù)的值衡量了我們網(wǎng)絡(luò)的性能在給定數(shù)據(jù)集上離完美還差多少。
一、損失函數(shù)
簡(jiǎn)單起見(jiàn),假設(shè)我們的網(wǎng)絡(luò)只有兩個(gè)參數(shù)。實(shí)際上,這個(gè)數(shù)量是在十億左右,但是我們?cè)谶@篇文章中會(huì)堅(jiān)持使用兩個(gè)參數(shù)的例子,以便我們?cè)谧鲆恍┛梢暬膰L試時(shí)不會(huì)把自己逼瘋。一個(gè)很棒的損失函數(shù)的輪廓可能是這樣的。
1. 損失函數(shù)的輪廓
為何我說(shuō)這是一個(gè)很棒的損失函數(shù)?因?yàn)閾碛羞@種輪廓的損失函數(shù)就像圣誕老人一樣,是不存在的。然而,它仍然是一個(gè)不錯(cuò)的教學(xué)工具,有助于全面了解關(guān)于梯度下降的一些最重要的想法。那么,我們從這里開(kāi)始吧。
x 軸和 y 軸分別代表兩個(gè)權(quán)值,z 軸代表在給定兩個(gè)特定權(quán)值的情況下?lián)p失函數(shù)的值。我們的目標(biāo)就是找到損失最小的特定權(quán)值,這個(gè)點(diǎn)被稱作損失函數(shù)的最小值點(diǎn)。
你一開(kāi)始就隨機(jī)初始化了權(quán)值,所以你的神經(jīng)網(wǎng)絡(luò)可能會(huì)表現(xiàn)得像喝醉了的你一樣,把貓的圖片歸類為人。這樣的情況對(duì)應(yīng)的是損失函數(shù)輪廓中的 A 點(diǎn),此處的網(wǎng)絡(luò)性能十分差,因此損失也很高。
我們需要尋找一種能夠?qū)Ш降健腹鹊住笲 點(diǎn)處的方法,這里的損失函數(shù)值最小。那么我們要怎么做呢?
2. 梯度下降
初始化權(quán)值的時(shí)候,我們處于損失函數(shù)圖形中的 A 點(diǎn)。首先要做的就是查看 x-y 平面中所有可能的方向,看看哪個(gè)方向是損失函數(shù)的值下降最陡峭的方向。這個(gè)就是我們必須移動(dòng)的方向,它恰恰與梯度的方向相反。梯度是高維導(dǎo)數(shù)的另一種說(shuō)法,它給出了最陡峭的上升方向。
要想理解這個(gè)概念,請(qǐng)看下圖。在曲面的任何一點(diǎn),我們都能夠定義一個(gè)與其相切的平面。在更高維度,我們總能夠定義一個(gè)超平面,但在這里我們還是堅(jiān)持使用 3 維空間。然后,在這個(gè)平面上有無(wú)限個(gè)方向。其中,準(zhǔn)確來(lái)說(shuō)只有一個(gè)使函數(shù)上升最快的方向,這個(gè)方向由梯度給出,與之相反的方向就是下降最快的方向。這就是算法名稱的來(lái)源,我們沿著梯度的方向進(jìn)行下降,所以就叫做梯度下降。
現(xiàn)在,既然已經(jīng)有了前進(jìn)方向,我們必須決定需要采取步子的大小,而控制下降步幅大小的參數(shù)即學(xué)習(xí)率。為了保證降到最小值,我們必須謹(jǐn)慎地選擇學(xué)習(xí)率。
如果移動(dòng)得太快,我們可能越過(guò)最小值,沿著「山谷」的山脊蹦蹦跳跳,永遠(yuǎn)都不可能到達(dá)最小值。如果移動(dòng)太慢,訓(xùn)練可能花費(fèi)太長(zhǎng)的時(shí)間,根本就不可行,此外太慢的學(xué)習(xí)率也容易讓算法陷入極小值,我們會(huì)在本文后面的部分討論。
一旦有了梯度和學(xué)習(xí)率,我們就開(kāi)始行動(dòng),然后在最終到達(dá)的任何位置重新計(jì)算梯度,然后重復(fù)這個(gè)過(guò)程。
梯度的方向告訴我們哪個(gè)方向上升的最快,它的幅值則表示最陡峭的上升/下降有多陡。所以,在最小值的地方,曲面輪廓幾乎是平坦的,我們期望得到幾乎為零的梯度。事實(shí)上,最小值點(diǎn)的梯度就是 0。

梯度下降過(guò)程
使用太大的學(xué)習(xí)率
在實(shí)踐中,我們可能永遠(yuǎn)無(wú)法精確地達(dá)到最小值,但是我們能夠在最小值附近的平坦區(qū)域震蕩。當(dāng)我們?cè)谶@個(gè)區(qū)域震蕩時(shí),損失值幾乎是我們能夠達(dá)到的最小值,并且不會(huì)有很大的變化,因?yàn)槲覀兪窃谡鎸?shí)的最小值附近跳動(dòng)。通常,當(dāng)損失值在預(yù)定的數(shù)字內(nèi)沒(méi)有提升的時(shí)候我們會(huì)停止迭代,例如 10 次或者 20 次迭代。當(dāng)這種情況發(fā)生時(shí),我們就說(shuō)訓(xùn)練已經(jīng)收斂了,或者說(shuō)收斂已經(jīng)實(shí)現(xiàn)了。
二、常見(jiàn)的錯(cuò)誤
讓我稍微偏離主題一會(huì)。如果搜索梯度下降的可視化圖,你很可能會(huì)看到一個(gè)起于一個(gè)點(diǎn)、終于最小值點(diǎn)的軌跡,就像前文動(dòng)畫所展示的一樣。然而,這個(gè)關(guān)于梯度下降的描述并不準(zhǔn)確。我們得到的軌跡完全局限在 x-y 平面內(nèi),這個(gè)平面包含權(quán)重。
正如上面的動(dòng)畫所描述的,梯度下降并不涉及在 z 軸方向上的移動(dòng)。因?yàn)閮H由 x 軸和 y 軸方向描述的權(quán)重是自由參數(shù)。實(shí)際得到的軌跡是定義在 x-y 平面中的,如下圖所示:
實(shí)際的梯度下降軌跡
x-y 平面中的每一個(gè)點(diǎn)代表著一個(gè)唯一的權(quán)重組合,而我們希望有一組由最小值描述的權(quán)重。
三、基本方程
描述梯度下降更新規(guī)則的基本方程是:
每一次迭代中都執(zhí)行更新。此處,w 是權(quán)重向量,它位于 x-y 平面。我們從這個(gè)向量中減去學(xué)習(xí)率α乘上損失函數(shù)相對(duì)于權(quán)重的梯度。梯度是一個(gè)向量,它給出了損失函數(shù)上升最快的方向。下降最快的方向恰好和梯度方向相反,這就是為什么要從權(quán)重向量中減去梯度向量的原因。
如果想象向量對(duì)你來(lái)說(shuō)有一些難度,那么,幾乎同樣的更新規(guī)則同時(shí)適用于網(wǎng)絡(luò)的每一個(gè)權(quán)重。唯一的變化是,我們現(xiàn)在對(duì)每個(gè)權(quán)重單獨(dú)執(zhí)行更新,上述方程中的梯度被替換為梯度向量沿著特定權(quán)重方向的投影。
對(duì)所有的權(quán)重同時(shí)執(zhí)行更新。
在做減法之前,我們用學(xué)習(xí)率與梯度向量相乘。這是我們之前討論過(guò)的步驟。要知道,即使我們保持學(xué)習(xí)率不變,步長(zhǎng)也會(huì)因?yàn)樘荻却笮。磽p失函數(shù)輪廓的陡峭性變化而變化。隨著我們接近最小值點(diǎn),梯度會(huì)接近于 0,我們會(huì)以越來(lái)越小的步長(zhǎng)接近最小值點(diǎn)。
理論上而言,這樣很好,因?yàn)槲覀兿M?dāng)接近一個(gè)最小值的時(shí)候算法能夠采取更小的步長(zhǎng)。步長(zhǎng)太大有可能導(dǎo)致跳過(guò)最小值,并且在最小值脊梁之間來(lái)回跳動(dòng)。
梯度下降中常用的一個(gè)技術(shù)是采用可變的學(xué)習(xí)率,而不是固定的學(xué)習(xí)率。初始時(shí),我們可以使用較大的學(xué)習(xí)率。但是到了后來(lái),隨著接近最小值點(diǎn),我們需要慢下來(lái)。實(shí)現(xiàn)這種策略的一種方法就是模擬退火,也就是衰減的學(xué)習(xí)率。在這種情況下,學(xué)習(xí)率在股東能夠數(shù)量的迭代次數(shù)中逐漸減小。
四、梯度下降挑戰(zhàn)之一:局部極小值
到目前為止,梯度下降的故事聽(tīng)起來(lái)真的很美好?,F(xiàn)在,我來(lái)揭開(kāi)它的面紗。還記得我之前說(shuō)過(guò)有種損失函數(shù)很好,而這種損失函數(shù)是不存在的這句話嗎?它們確實(shí)是不存在的。
首先,神經(jīng)網(wǎng)絡(luò)是復(fù)雜的函數(shù),我們?cè)诩僭O(shè)的函數(shù)中引入了大量的非線性變換。得到的損失函數(shù)看起來(lái)并不太好,同樣只有一個(gè)我們可以收斂到的最小值點(diǎn)。事實(shí)上,這種理想的損失函數(shù)被稱作「凸函數(shù)」(總是向上彎曲的函數(shù)),而深度網(wǎng)絡(luò)的損失函數(shù)很難是凸的。實(shí)際上,它們很可能是這樣的:
在上圖中,存在梯度為 0 的局部極小值點(diǎn)。然而,我們想要達(dá)到的全局最小值點(diǎn),卻是無(wú)法實(shí)現(xiàn)的?,F(xiàn)在,如果你將權(quán)值初始化在 A 點(diǎn),那么你將會(huì)收斂到局部極小值點(diǎn),而且,一旦你收斂到這個(gè)極小值點(diǎn),梯度下降將沒(méi)法使你離開(kāi)這里。
梯度下降是由梯度驅(qū)動(dòng)的,它在任何一個(gè)極小值點(diǎn)都會(huì)為 0。局部極小值之所以被稱作局部極小值,是因?yàn)閾p失函數(shù)在該點(diǎn)的值在局部區(qū)域是最小的。而全局最小值被稱作全局最小值,是因?yàn)樵趽p失函數(shù)在該點(diǎn)的值在整個(gè)區(qū)域最小。
更糟糕的是,由于我們考慮的那個(gè) 3 維損失函數(shù)輪廓在實(shí)際中是從沒(méi)有發(fā)生過(guò)的,損失函數(shù)的輪廓可能更加復(fù)雜。在實(shí)踐中,我們的神經(jīng)網(wǎng)絡(luò)大約會(huì)有 10 億個(gè)權(quán)重,給我們一個(gè)大約(10 億+1)維的函數(shù)。
事實(shí)上,很難想象一個(gè)如此多維度的函數(shù)是什么樣子的。然而,深度學(xué)習(xí)領(lǐng)域如今人才濟(jì)濟(jì),人們已經(jīng)想出了以 3D 的形式可視化損失函數(shù)輪廓的方法。最近的一篇論文提出了一種名為「Filter Normalization」的技術(shù),該項(xiàng)技術(shù)解釋了超出本文范圍的內(nèi)容。然而,它確實(shí)讓我們看到了我們所處理的損失函數(shù)的潛在復(fù)雜性。例如,下圖是 VGG-56 在 CIFAR-10 數(shù)據(jù)集上構(gòu)建的損失函數(shù)的 3D 架構(gòu)。
一個(gè)復(fù)雜的損失函數(shù)圖像
正如你所看到的,到處都是局部極小值點(diǎn)。
五、梯度下降挑戰(zhàn)之二:鞍點(diǎn)
關(guān)于梯度下降的局限性,我們得到的基本教訓(xùn)是:一旦到達(dá)梯度為 0 的區(qū)域,不管極小值點(diǎn)的質(zhì)量如何,它都幾乎無(wú)法逃離。我們面臨的另一種問(wèn)題是鞍點(diǎn),它們的形狀如下:
鞍點(diǎn)
你也可以在之前的圖片中看到兩座山峰相遇時(shí)候的鞍點(diǎn)。
鞍點(diǎn)得名于它的形狀類似于馬鞍。盡管它在 x 方向上是一個(gè)最小值點(diǎn),但是它在另一個(gè)方向上是局部最大值點(diǎn),并且,如果它沿著 x 方向變得更平坦的話,梯度下降會(huì)在 x 軸振蕩并且不能繼續(xù)根據(jù) y 軸下降,這就會(huì)給我們一種已經(jīng)收斂到最小值點(diǎn)的錯(cuò)覺(jué)。
六、隨機(jī)性的解救
那么,我們?nèi)绾卧趪L試收斂到全局最優(yōu)值的同時(shí)擺脫局部極小值和鞍點(diǎn)呢?答案是使用隨機(jī)梯度下降。
到目前為止,我們一直使用通過(guò)對(duì)訓(xùn)練集上的所有可能樣本的損失值求和得到的損失函數(shù)進(jìn)行梯度下降。如果我們進(jìn)入局部極小值或者鞍點(diǎn),我們就會(huì)被困住。幫助梯度下降擺脫這些困境的一種方法就是隨機(jī)梯度下降。
在隨機(jī)梯度下降中,我們不是通過(guò)對(duì)所有損失函數(shù)求和來(lái)計(jì)算損失函數(shù)的梯度,而是通過(guò)計(jì)算僅僅一個(gè)隨機(jī)抽樣(不替換)例子的損失梯度來(lái)采取步驟。隨機(jī)梯度下降中的每個(gè)樣本都是隨機(jī)選擇的,相比之下,早期方法在一個(gè)批量中處理所有的樣本,因此稱為批量梯度下降。
更新規(guī)則也做了相應(yīng)的改變。
這意味著,我們每一步采用的損失函數(shù)都不同于實(shí)際的損失函數(shù)(它是每一個(gè)樣本的損失函數(shù)的和)。這種「一個(gè)樣本損失函數(shù)」在某一特定點(diǎn)的梯度實(shí)際上可能指向與「所有樣本損失函數(shù)」的梯度略有不同的方向。
也就是說(shuō),盡管「所有樣本損失函數(shù)」的梯度可能把我們推向一個(gè)局部極小值,或者使我們困在一個(gè)鞍點(diǎn),但是這種「一個(gè)樣本損失函數(shù)」的梯度可能指向一個(gè)不同的方向,并有可能幫助我們避開(kāi)這些情況。
「所有樣本損失函數(shù)」的一個(gè)局部最小值點(diǎn)也應(yīng)該考慮在內(nèi)。如果我們采用批量梯度下降,那么我們會(huì)被困在這里,因?yàn)檫@里的梯度始終會(huì)指向局部最小值點(diǎn)。但是,如果我們使用隨機(jī)梯度下降,這個(gè)點(diǎn)可能不在「一個(gè)樣本損失函數(shù)」輪廓的局部最小值周圍,這使得我們遠(yuǎn)離局部最小值點(diǎn)。
即使我們陷在「一個(gè)樣本損失函數(shù)」的局部最小值點(diǎn),下一個(gè)隨機(jī)采樣點(diǎn)的「一個(gè)樣本損失函數(shù)」的損失情況也可能不同,從而使我們能夠繼續(xù)移動(dòng)。
當(dāng)它收斂的時(shí)候,它會(huì)收斂到幾乎所有「一個(gè)樣本損失函數(shù)」的最小值。也有經(jīng)驗(yàn)顯示,鞍點(diǎn)是極不穩(wěn)定的,輕輕一推就可以擺脫。
所以,這是否意味著在實(shí)踐中應(yīng)該使用這種一個(gè)樣本的隨機(jī)梯度下降呢?
七、批大小
答案是否定的。盡管從理論上而言,隨機(jī)梯度下降可能給我們帶來(lái)最好的結(jié)果,但是從計(jì)算角度而言,它并不是一個(gè)非??尚械倪x擇。當(dāng)我們使用由所有單個(gè)損失函數(shù)相加得到的函數(shù)進(jìn)行梯度下降時(shí),所有單個(gè)損失函數(shù)的梯度可以并行計(jì)算,而使用隨機(jī)梯度下降的時(shí)候,梯度的計(jì)算必須一個(gè)一個(gè)的順序進(jìn)行。
因此,我們所做的是一個(gè)平衡的行為。我們使用固定數(shù)量(例如 16、32 或者 128 個(gè))的樣本形成一個(gè) mini-batch 來(lái)構(gòu)建損失函數(shù),而不是使用整個(gè)數(shù)據(jù)集或者單個(gè)樣本。這個(gè)詞與一次處理所有樣本形成了對(duì)比,它通常被稱作批梯度下降。選擇 mini-batch 的大小是為了保證我們有足夠的隨機(jī)性擺脫局部最小值,同時(shí)可以利用足夠的并行計(jì)算力。
八、重新審視局部極小值:它們并沒(méi)有你想象的那么糟糕
不要急著反對(duì)局部極小值,最近的研究表明局部最小值并不一定就是壞的。在神經(jīng)網(wǎng)絡(luò)的損失情況下,最小值實(shí)在太多了,好的局部極小值可能和全局最小值一樣好。
我為什么說(shuō)好?是因?yàn)槟闳钥赡芟萑胗刹环€(wěn)定的訓(xùn)練樣本導(dǎo)致的局部極小值中。好的局部極小值,或者文獻(xiàn)中提到的最優(yōu)局部極小值,在給定神經(jīng)網(wǎng)絡(luò)的高維損失函數(shù)中也可能是大量存在的。
你可能還會(huì)注意到,很多神經(jīng)網(wǎng)絡(luò)都在執(zhí)行分類任務(wù)。如果一個(gè)局部極小值對(duì)應(yīng)著 0.7—0.8 的正確標(biāo)簽分?jǐn)?shù),而全局最小值能夠產(chǎn)生 0.95-0.98 的正確標(biāo)簽分?jǐn)?shù),那么兩者輸出的預(yù)測(cè)標(biāo)簽結(jié)果將是相同的。
最小值的一個(gè)理想屬性是它應(yīng)該在平坦的一面。為什么?因?yàn)槠教沟淖钚≈岛苋菀资諗康?,而且越過(guò)最小值或者在最小值的脊梁之間跳躍的可能性更小。
更重要的是,我們期望測(cè)試集的損失曲面與我們訓(xùn)練的訓(xùn)練集的損失曲面略有不同。對(duì)處于平坦又較寬處的極小值,由于這種變化,損失不會(huì)有太大變化,但處于相對(duì)較窄處的極小值不是這樣。我們要指出的一點(diǎn)是,更平坦處的最小值能夠更好地泛化,因此是可取的。
九、重新審視學(xué)習(xí)率
近來(lái),針對(duì)損失函數(shù)中的次優(yōu)最小值,關(guān)于學(xué)習(xí)率調(diào)度的研究激增。即使學(xué)習(xí)率下降,也有可能陷入局部極小值。傳統(tǒng)上,要么在固定次數(shù)的迭代之后訓(xùn)練完成,要么在損失值沒(méi)有改善的情況下,固定次數(shù)的迭代(比如 10 次)之后訓(xùn)練停止。這種情況在文獻(xiàn)中被稱為早停。
使用較快的學(xué)習(xí)率也有助于我們?cè)谟?xùn)練中更早地跳過(guò)一些局部極小值。
人們也把早停和學(xué)習(xí)率衰減結(jié)合起來(lái),在迭代 10 次后損失函數(shù)沒(méi)有改善的情況下學(xué)習(xí)率開(kāi)始衰減,最終在學(xué)習(xí)率低于某個(gè)確定的閾值時(shí)停止。
近年來(lái),循環(huán)學(xué)習(xí)率變得流行起來(lái),在循環(huán)學(xué)習(xí)率中,學(xué)習(xí)率是緩慢增加的,然后緩慢減小,以一種循環(huán)的形式持續(xù)著。
Leslie N. Smith 提出的 Triangular 和 Triangular2 循環(huán)學(xué)習(xí)率方法。左側(cè)的最大學(xué)習(xí)率和最小學(xué)習(xí)率保持不變。右側(cè)的區(qū)別在于每個(gè)周期之后學(xué)習(xí)率減半。圖源:Hafidz Zulkifli
所謂暖重啟的隨機(jī)梯度下降,基本上是將學(xué)習(xí)率退火到一個(gè)下限,然后將學(xué)習(xí)率恢復(fù)到初始值。
對(duì)于學(xué)習(xí)率如何下降,我們也有不同的計(jì)劃,例如,從指數(shù)衰減到余弦衰減。
余弦退火與重啟相結(jié)合
最近的一篇論文介紹了一種叫做「隨機(jī)加權(quán)平均」的技術(shù)。作者提出了一種方法,首先收斂到最小值,緩存權(quán)重,然后將學(xué)習(xí)率恢復(fù)到更高的值。然后,這種更高的學(xué)習(xí)率將算法從最小值推到損失面中的隨機(jī)點(diǎn)。然后使算法再次收斂到另一個(gè)最小值。重復(fù)幾次,最后,他們對(duì)所有緩存權(quán)重集的預(yù)測(cè)進(jìn)行平均,以產(chǎn)生最終預(yù)測(cè)。
隨機(jī)加權(quán)平均技術(shù)
十、結(jié)論
所以,這是梯度下降的介紹性文章,這是深度學(xué)習(xí)優(yōu)化工作的驅(qū)動(dòng)力,因?yàn)殛P(guān)于反向訓(xùn)練的開(kāi)創(chuàng)性論文顯示,可以通過(guò)計(jì)算梯度來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)。然而,關(guān)于梯度下降還有一個(gè)我們?cè)谶@篇文章中沒(méi)有談到的缺失部分,那就是解決 pathological curvature 的問(wèn)題。對(duì)經(jīng)典隨機(jī)梯度下降的擴(kuò)展,如動(dòng)量、RMSProp 和 Adam,被用來(lái)克服這個(gè)關(guān)鍵問(wèn)題。
原文鏈接:https://blog.paperspace.com/intro-to-optimization-in-deep-learning-gradient-descent/
【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】





























 
 
 












 
 
 
 