選自Paperspace 作者:Ayoosh Kathuria 機器之心編譯 參與:Nurhachu ,、淑婷
從很大程度上來說,,深度學習實際上是在解決大量煩人的優(yōu)化問題。神經(jīng)網(wǎng)絡僅僅是一個非常復雜的函數(shù),,包含數(shù)百萬個參數(shù),,這些參數(shù)代表的是一個問題的數(shù)學解答。以圖像分類為例,,AlexNet 就是一個數(shù)學函數(shù),它以代表圖像 RGB 值的數(shù)組為輸入,,生成一組分類得分的輸出,。 實質(zhì)上,通過訓練神經(jīng)網(wǎng)絡,,我們是在最小化一個損失函數(shù),。這個損失函數(shù)的值衡量了我們網(wǎng)絡的性能在給定數(shù)據(jù)集上離完美還差多少。 損失函數(shù) 簡單起見,,假設我們的網(wǎng)絡只有兩個參數(shù),。實際上,這個數(shù)量是在十億左右,,但是我們在這篇文章中會堅持使用兩個參數(shù)的例子,,以便我們在做一些可視化的嘗試時不會把自己逼瘋。一個很棒的損失函數(shù)的輪廓可能是這樣的,。 損失函數(shù)的輪廓 為何我說這是一個很棒的損失函數(shù),?因為擁有這種輪廓的損失函數(shù)就像圣誕老人一樣,是不存在的,。然而,,它仍然是一個不錯的教學工具,有助于全面了解關(guān)于梯度下降的一些最重要的想法,。那么,,我們從這里開始吧。 x 軸和 y 軸分別代表兩個權(quán)值,,z 軸代表在給定兩個特定權(quán)值的情況下?lián)p失函數(shù)的值,。我們的目標就是找到損失最小的特定權(quán)值,這個點被稱作損失函數(shù)的最小值點,。 你一開始就隨機初始化了權(quán)值,,所以你的神經(jīng)網(wǎng)絡可能會表現(xiàn)得像喝醉了的你一樣,,把貓的圖片歸類為人。這樣的情況對應的是損失函數(shù)輪廓中的 A 點,,此處的網(wǎng)絡性能十分差,,因此損失也很高。 我們需要尋找一種能夠?qū)Ш降健腹鹊住笲 點處的方法,,這里的損失函數(shù)值最小,。那么我們要怎么做呢? 梯度下降 初始化權(quán)值的時候,,我們處于損失函數(shù)圖形中的 A 點,。首先要做的就是查看 x-y 平面中所有可能的方向,看看哪個方向是損失函數(shù)的值下降最陡峭的方向,。這個就是我們必須移動的方向,,它恰恰與梯度的方向相反。梯度是高維導數(shù)的另一種說法,,它給出了最陡峭的上升方向,。 要想理解這個概念,請看下圖,。在曲面的任何一點,,我們都能夠定義一個與其相切的平面。在更高維度,,我們總能夠定義一個超平面,,但在這里我們還是堅持使用 3 維空間。然后,,在這個平面上有無限個方向,。其中,準確來說只有一個使函數(shù)上升最快的方向,,這個方向由梯度給出,,與之相反的方向就是下降最快的方向。這就是算法名稱的來源,,我們沿著梯度的方向進行下降,,所以就叫做梯度下降。 現(xiàn)在,,既然已經(jīng)有了前進方向,,我們必須決定需要采取步子的大小,而控制下降步幅大小的參數(shù)即學習率,。為了保證降到最小值,,我們必須謹慎地選擇學習率。 如果移動得太快,,我們可能越過最小值,,沿著「山谷」的山脊蹦蹦跳跳,,永遠都不可能到達最小值。如果移動太慢,,訓練可能花費太長的時間,,根本就不可行,此外太慢的學習率也容易讓算法陷入極小值,,我們會在本文后面的部分討論,。 一旦有了梯度和學習率,我們就開始行動,,然后在最終到達的任何位置重新計算梯度,,然后重復這個過程。 梯度的方向告訴我們哪個方向上升的最快,,它的幅值則表示最陡峭的上升/下降有多陡,。所以,在最小值的地方,,曲面輪廓幾乎是平坦的,,我們期望得到幾乎為零的梯度。事實上,,最小值點的梯度就是 0,。 梯度下降過程 使用太大的學習率 在實踐中,,我們可能永遠無法精確地達到最小值,,但是我們能夠在最小值附近的平坦區(qū)域震蕩。當我們在這個區(qū)域震蕩時,,損失值幾乎是我們能夠達到的最小值,,并且不會有很大的變化,因為我們是在真實的最小值附近跳動,。通常,,當損失值在預定的數(shù)字內(nèi)沒有提升的時候我們會停止迭代,例如 10 次或者 20 次迭代,。當這種情況發(fā)生時,,我們就說訓練已經(jīng)收斂了,或者說收斂已經(jīng)實現(xiàn)了,。 常見的錯誤 讓我稍微偏離主題一會,。如果搜索梯度下降的可視化圖,你很可能會看到一個起于一個點,、終于最小值點的軌跡,,就像前文動畫所展示的一樣。然而,,這個關(guān)于梯度下降的描述并不準確,。我們得到的軌跡完全局限在 x-y 平面內(nèi),,這個平面包含權(quán)重。 正如上面的動畫所描述的,,梯度下降并不涉及在 z 軸方向上的移動,。因為僅由 x 軸和 y 軸方向描述的權(quán)重是自由參數(shù)。實際得到的軌跡是定義在 x-y 平面中的,,如下圖所示: 實際的梯度下降軌跡 x-y 平面中的每一個點代表著一個唯一的權(quán)重組合,,而我們希望有一組由最小值描述的權(quán)重。 基本方程 描述梯度下降更新規(guī)則的基本方程是: 每一次迭代中都執(zhí)行更新,。此處,,w 是權(quán)重向量,它位于 x-y 平面,。我們從這個向量中減去學習率α乘上損失函數(shù)相對于權(quán)重的梯度,。梯度是一個向量,它給出了損失函數(shù)上升最快的方向,。下降最快的方向恰好和梯度方向相反,,這就是為什么要從權(quán)重向量中減去梯度向量的原因。 如果想象向量對你來說有一些難度,,那么,,幾乎同樣的更新規(guī)則同時適用于網(wǎng)絡的每一個權(quán)重。唯一的變化是,,我們現(xiàn)在對每個權(quán)重單獨執(zhí)行更新,,上述方程中的梯度被替換為梯度向量沿著特定權(quán)重方向的投影。 對所有的權(quán)重同時執(zhí)行更新,。 在做減法之前,,我們用學習率與梯度向量相乘。這是我們之前討論過的步驟,。要知道,,即使我們保持學習率不變,步長也會因為梯度大小,,即損失函數(shù)輪廓的陡峭性變化而變化,。隨著我們接近最小值點,梯度會接近于 0,,我們會以越來越小的步長接近最小值點,。 理論上而言,這樣很好,,因為我們希望當接近一個最小值的時候算法能夠采取更小的步長,。步長太大有可能導致跳過最小值,并且在最小值脊梁之間來回跳動。 梯度下降中常用的一個技術(shù)是采用可變的學習率,,而不是固定的學習率,。初始時,我們可以使用較大的學習率,。但是到了后來,,隨著接近最小值點,我們需要慢下來,。實現(xiàn)這種策略的一種方法就是模擬退火,,也就是衰減的學習率。在這種情況下,,學習率在股東能夠數(shù)量的迭代次數(shù)中逐漸減小,。 梯度下降挑戰(zhàn)之一:局部極小值 到目前為止,梯度下降的故事聽起來真的很美好?,F(xiàn)在,,我來揭開它的面紗。還記得我之前說過有種損失函數(shù)很好,,而這種損失函數(shù)是不存在的這句話嗎,?它們確實是不存在的。 首先,,神經(jīng)網(wǎng)絡是復雜的函數(shù),,我們在假設的函數(shù)中引入了大量的非線性變換。得到的損失函數(shù)看起來并不太好,,同樣只有一個我們可以收斂到的最小值點,。事實上,這種理想的損失函數(shù)被稱作「凸函數(shù)」(總是向上彎曲的函數(shù)),,而深度網(wǎng)絡的損失函數(shù)很難是凸的,。實際上,,它們很可能是這樣的: 在上圖中,,存在梯度為 0 的局部極小值點。然而,,我們想要達到的全局最小值點,,卻是無法實現(xiàn)的。現(xiàn)在,,如果你將權(quán)值初始化在 A 點,,那么你將會收斂到局部極小值點,而且,,一旦你收斂到這個極小值點,,梯度下降將沒法使你離開這里。 梯度下降是由梯度驅(qū)動的,它在任何一個極小值點都會為 0,。局部極小值之所以被稱作局部極小值,,是因為損失函數(shù)在該點的值在局部區(qū)域是最小的。而全局最小值被稱作全局最小值,,是因為在損失函數(shù)在該點的值在整個區(qū)域最小,。 更糟糕的是,由于我們考慮的那個 3 維損失函數(shù)輪廓在實際中是從沒有發(fā)生過的,,損失函數(shù)的輪廓可能更加復雜,。在實踐中,我們的神經(jīng)網(wǎng)絡大約會有 10 億個權(quán)重,,給我們一個大約(10 億+1)維的函數(shù),。 事實上,很難想象一個如此多維度的函數(shù)是什么樣子的,。然而,,深度學習領(lǐng)域如今人才濟濟,人們已經(jīng)想出了以 3D 的形式可視化損失函數(shù)輪廓的方法,。最近的一篇論文提出了一種名為「Filter Normalization」的技術(shù),,該項技術(shù)解釋了超出本文范圍的內(nèi)容。然而,,它確實讓我們看到了我們所處理的損失函數(shù)的潛在復雜性,。例如,下圖是 VGG-56 在 CIFAR-10 數(shù)據(jù)集上構(gòu)建的損失函數(shù)的 3D 架構(gòu),。 一個復雜的損失函數(shù)圖像(圖源:https://www.cs./~tomg/projects/landscapes/) 正如你所看到的,,到處都是局部極小值點。 梯度下降挑戰(zhàn)之二:鞍點 關(guān)于梯度下降的局限性,,我們得到的基本教訓是:一旦到達梯度為 0 的區(qū)域,,不管極小值點的質(zhì)量如何,它都幾乎無法逃離,。我們面臨的另一種問題是鞍點,,它們的形狀如下: 鞍點 你也可以在之前的圖片中看到兩座山峰相遇時候的鞍點。 鞍點得名于它的形狀類似于馬鞍,。盡管它在 x 方向上是一個最小值點,,但是它在另一個方向上是局部最大值點,并且,,如果它沿著 x 方向變得更平坦的話,,梯度下降會在 x 軸振蕩并且不能繼續(xù)根據(jù) y 軸下降,這就會給我們一種已經(jīng)收斂到最小值點的錯覺,。 隨機性的解救 那么,,我們?nèi)绾卧趪L試收斂到全局最優(yōu)值的同時擺脫局部極小值和鞍點呢?答案是使用隨機梯度下降。 到目前為止,,我們一直使用通過對訓練集上的所有可能樣本的損失值求和得到的損失函數(shù)進行梯度下降,。如果我們進入局部極小值或者鞍點,我們就會被困住,。幫助梯度下降擺脫這些困境的一種方法就是隨機梯度下降,。 在隨機梯度下降中,我們不是通過對所有損失函數(shù)求和來計算損失函數(shù)的梯度,,而是通過計算僅僅一個隨機抽樣(不替換)例子的損失梯度來采取步驟,。隨機梯度下降中的每個樣本都是隨機選擇的,相比之下,,早期方法在一個批量中處理所有的樣本,,因此稱為批量梯度下降。 更新規(guī)則也做了相應的改變,。 這意味著,,我們每一步采用的損失函數(shù)都不同于實際的損失函數(shù)(它是每一個樣本的損失函數(shù)的和)。這種「一個樣本損失函數(shù)」在某一特定點的梯度實際上可能指向與「所有樣本損失函數(shù)」的梯度略有不同的方向,。 也就是說,,盡管「所有樣本損失函數(shù)」的梯度可能把我們推向一個局部極小值,或者使我們困在一個鞍點,,但是這種「一個樣本損失函數(shù)」的梯度可能指向一個不同的方向,,并有可能幫助我們避開這些情況。 「所有樣本損失函數(shù)」的一個局部最小值點也應該考慮在內(nèi),。如果我們采用批量梯度下降,,那么我們會被困在這里,因為這里的梯度始終會指向局部最小值點,。但是,,如果我們使用隨機梯度下降,這個點可能不在「一個樣本損失函數(shù)」輪廓的局部最小值周圍,,這使得我們遠離局部最小值點,。 即使我們陷在「一個樣本損失函數(shù)」的局部最小值點,下一個隨機采樣點的「一個樣本損失函數(shù)」的損失情況也可能不同,,從而使我們能夠繼續(xù)移動,。 當它收斂的時候,,它會收斂到幾乎所有「一個樣本損失函數(shù)」的最小值,。也有經(jīng)驗顯示,鞍點是極不穩(wěn)定的,,輕輕一推就可以擺脫,。 所以,這是否意味著在實踐中應該使用這種一個樣本的隨機梯度下降呢? 批大小 答案是否定的,。盡管從理論上而言,,隨機梯度下降可能給我們帶來最好的結(jié)果,但是從計算角度而言,,它并不是一個非??尚械倪x擇。當我們使用由所有單個損失函數(shù)相加得到的函數(shù)進行梯度下降時,,所有單個損失函數(shù)的梯度可以并行計算,,而使用隨機梯度下降的時候,梯度的計算必須一個一個的順序進行,。 因此,,我們所做的是一個平衡的行為。我們使用固定數(shù)量(例如 16,、32 或者 128 個)的樣本形成一個 mini-batch 來構(gòu)建損失函數(shù),,而不是使用整個數(shù)據(jù)集或者單個樣本。這個詞與一次處理所有樣本形成了對比,,它通常被稱作批梯度下降,。選擇 mini-batch 的大小是為了保證我們有足夠的隨機性擺脫局部最小值,同時可以利用足夠的并行計算力,。 重新審視局部極小值:它們并沒有你想象的那么糟糕 不要急著反對局部極小值,,最近的研究表明局部最小值并不一定就是壞的。在神經(jīng)網(wǎng)絡的損失情況下,,最小值實在太多了,,好的局部極小值可能和全局最小值一樣好。 我為什么說好,?是因為你仍可能陷入由不穩(wěn)定的訓練樣本導致的局部極小值中,。好的局部極小值,或者文獻中提到的最優(yōu)局部極小值,,在給定神經(jīng)網(wǎng)絡的高維損失函數(shù)中也可能是大量存在的,。 你可能還會注意到,很多神經(jīng)網(wǎng)絡都在執(zhí)行分類任務,。如果一個局部極小值對應著 0.7—0.8 的正確標簽分數(shù),,而全局最小值能夠產(chǎn)生 0.95-0.98 的正確標簽分數(shù),那么兩者輸出的預測標簽結(jié)果將是相同的,。 最小值的一個理想屬性是它應該在平坦的一面,。為什么?因為平坦的最小值很容易收斂到,,而且越過最小值或者在最小值的脊梁之間跳躍的可能性更小,。 更重要的是,,我們期望測試集的損失曲面與我們訓練的訓練集的損失曲面略有不同。對處于平坦又較寬處的極小值,,由于這種變化,,損失不會有太大變化,但處于相對較窄處的極小值不是這樣,。我們要指出的一點是,,更平坦處的最小值能夠更好地泛化,因此是可取的,。 重新審視學習率 近來,,針對損失函數(shù)中的次優(yōu)最小值,關(guān)于學習率調(diào)度的研究激增,。即使學習率下降,,也有可能陷入局部極小值。傳統(tǒng)上,,要么在固定次數(shù)的迭代之后訓練完成,,要么在損失值沒有改善的情況下,固定次數(shù)的迭代(比如 10 次)之后訓練停止,。這種情況在文獻中被稱為早停,。 使用較快的學習率也有助于我們在訓練中更早地跳過一些局部極小值。 人們也把早停和學習率衰減結(jié)合起來,,在迭代 10 次后損失函數(shù)沒有改善的情況下學習率開始衰減,,最終在學習率低于某個確定的閾值時停止。 近年來,,循環(huán)學習率變得流行起來,,在循環(huán)學習率中,學習率是緩慢增加的,,然后緩慢減小,,以一種循環(huán)的形式持續(xù)著。 Leslie N. Smith 提出的 Triangular 和 Triangular2 循環(huán)學習率方法,。左側(cè)的最大學習率和最小學習率保持不變,。右側(cè)的區(qū)別在于每個周期之后學習率減半。圖源:Hafidz Zulkifli 所謂暖重啟的隨機梯度下降,,基本上是將學習率退火到一個下限,,然后將學習率恢復到初始值。 對于學習率如何下降,,我們也有不同的計劃,,例如,從指數(shù)衰減到余弦衰減,。 余弦退火與重啟相結(jié)合 最近的一篇論文介紹了一種叫做「隨機加權(quán)平均」的技術(shù),。作者提出了一種方法,,首先收斂到最小值,,緩存權(quán)重,,然后將學習率恢復到更高的值。然后,,這種更高的學習率將算法從最小值推到損失面中的隨機點,。然后使算法再次收斂到另一個最小值。重復幾次,,最后,,他們對所有緩存權(quán)重集的預測進行平均,以產(chǎn)生最終預測,。 隨機加權(quán)平均技術(shù) 結(jié)論 所以,,這是梯度下降的介紹性文章,這是深度學習優(yōu)化工作的驅(qū)動力,,因為關(guān)于反向訓練的開創(chuàng)性論文顯示,,可以通過計算梯度來訓練神經(jīng)網(wǎng)絡,。然而,,關(guān)于梯度下降還有一個我們在這篇文章中沒有談到的缺失部分,那就是解決 pathological curvature 的問題,。對經(jīng)典隨機梯度下降的擴展,,如動量,、RMSProp 和 Adam,被用來克服這個關(guān)鍵問題,。 然而,,我覺得我們所做的一切,對一篇文章來說已經(jīng)足夠了,,其余的將會由另一篇文章解決,。 原文鏈接:https://blog./intro-to-optimization-in-deep-learning-gradient-descent/ 本文為機器之心編譯,轉(zhuǎn)載請聯(lián)系本公眾號獲得授權(quán),。 ?------------------------------------------------ 加入機器之心(全職記者 / 實習生):[email protected] 投稿或?qū)で髨蟮溃?strong>content@jiqizhixin.com 廣告 & 商務合作:[email protected] |
|