0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

深入淺出地介紹了梯度下降這一概念

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-09-28 09:06 ? 次閱讀

編者按:DRDO研究人員Ayoosh Kathuria深入淺出地介紹了梯度下降這一概念。

圖片來源:O'Reilly Media

深度學習在很大程度上是在解決大規(guī)模的煩人的優(yōu)化問題。神經(jīng)網(wǎng)絡不過是一個包含數(shù)百萬參數(shù)的非常復雜的函數(shù)??紤]圖像分類的例子。AlexNet是一個數(shù)學函數(shù),接受表示圖像的RGB值的數(shù)組作為輸入,產(chǎn)生一組分類評分作為輸出。

我們所說的訓練神經(jīng)網(wǎng)絡,基本上是指最小化一個損失函數(shù)。損失函數(shù)的值為我們提供了網(wǎng)絡在給定數(shù)據(jù)集上的表現(xiàn)離完美有多遠的測度。

損失函數(shù)

為了簡化問題,假定我們的網(wǎng)絡只有兩個參數(shù)。在實踐中,網(wǎng)絡可能有上億參數(shù),不過在本文中,我們將一直使用兩個參數(shù)的網(wǎng)絡作為例子,以便可視化。一個非常好的損失函數(shù)的等值曲面看起來可能是這樣。

為什么我要說非常好的損失函數(shù)?因為具備上圖這樣的等值曲面的損失函數(shù)就像圣人一樣,基本上是不存在的。不過,它在教學上能起到很好的作用,可以幫助我們理解梯度下降最重要的一些想法。所以,讓我們開始吧!

圖中的x軸和y軸表示兩個權重的值。z軸表示損失函數(shù)的值。我們的目標是找到損失值最小的權重值。

剛開始,我們隨機初始化權重,所以神經(jīng)網(wǎng)絡大概就像一個醉漢,將貓的圖像識別成人類。也就是下圖中的A點,網(wǎng)絡表現(xiàn)很差,損失很高。

我們需要找到一種到達“谷底”B點(損失函數(shù)最小值)的方法。我們該怎么做呢?

梯度下降

初始化權重時,我們在損失曲面的A點。我們首先要做的,是檢查一下,在x-y平面上的所有可能方向中,沿著哪個方向移動能帶來最陡峭的損失值下降。這就是我們需要移動的方向。這一方向恰好是梯度的反方向。梯度,導數(shù)的高維表兄弟,為我們提供了最陡峭的上升方向。

下圖可以幫助你理解這一點。在曲面的任一點,可以定義一個正切的平面。在更高維情形下,我們可以定義一個超平面。不過現(xiàn)在還是讓我們保持三維吧。我們在這個平面上有無窮方向,其中正好有一個方向能提供函數(shù)最陡峭的上升。這個方向就是梯度的方向。這也正是算法得名的原因。我們沿著梯度反向下降,所以稱為梯度下降。

現(xiàn)在,有了移動的方向,我們需要決定移動的步幅。這稱為學習率。我們必須仔細選擇學習率,以確保達到最小值。

如果學習率過快,我們可能越過最小值,在谷“脊”不斷反彈,再也到不了最小值。如果學習率過慢,訓練可能過于漫長而不再可行。即便不是這樣,非常低的學習率可能使優(yōu)化算法更容易陷入局部極小值(我們稍后將介紹局部極小值)。

一旦確定了梯度和學習率,我們開始訓練一步,然后在停留處重新計算梯度,接著重復這一過程。

梯度的方向告訴我們哪個方向有最陡峭的上升,而它的數(shù)量則告訴我們最陡峭的上升/下降有多陡。所以,在最小值處,等值曲面幾乎是平的,相應地,梯度幾乎是零。事實上,最小值處的梯度正好是零。

梯度下降中

學習率過大

在實踐中,我們也許從未恰好達到最小值,而是在最小值附近的平面區(qū)域反復振蕩。在這一區(qū)域振蕩時,損失幾乎是我們可以達到的最小值,因為我們在實際最小值附近反復回彈,所以損失值幾乎沒什么變化。當損失值在預定義的迭代次數(shù)(比如,10次或20次)后沒有改善時,我們常常停止迭代。這時我們稱訓練收斂了。

常見誤解

讓我稍稍停頓一下。如果你上網(wǎng)搜索梯度下降的可視化圖像,你大概會看到從某一點開始,朝向最低點的一條軌跡,就像前面的動畫一樣。然而,這只是一個不精確的示意。實際上,軌跡完全被限制在x-y權重平面上,完全不涉及z軸上的移動。這是因為權重是唯一的自由參數(shù)。

x-y平面的每一點表示權重的一種獨特組合,我們想要找到損失值最小的權重組合。

基本等式

描述梯度下降更新規(guī)則的基本等式是:

每次迭代均進行這樣的更新。上式中,w是位于x-y平面的權重向量。我們從這個向量減去損失函數(shù)在權重上的梯度乘以alpha,學習率。梯度也是一個向量,提供損失函數(shù)上升最陡峭的方向。最陡峭下降的方向正好是梯度的反方向,所以我們從權重向量中減去梯度向量。

如果想象向量對你來說有點難,你可以想像梯度下降同時應用于網(wǎng)絡的所有權重,按照幾乎一樣的更新規(guī)則。唯一的不同是,由于我們現(xiàn)在為每個權重分別應用更新,上式中的梯度替換為梯度向量在表示具體權重的方向上的投影。

我們乘上了學習率,對應我們之前提到的步幅。注意,即使學習率是常數(shù),由于梯度數(shù)量(損失曲面的陡峭程度)的變動,步幅仍然會改變。當我們逼近最小值時,梯度逼近零,我們以越來越小的步子邁向最小值。

理論上這很好,因為我們希望算法在逼近最小值時采用較小的步幅,以免過大的步幅導致越過極小值,并在極小值周圍的谷脊間反復回彈。

梯度下降中廣泛采用的一項技術是使用可變學習率,而不是固定學習率。剛開始,我們可以接受較大的學習率。之后,隨著訓練進行,我們漸漸接近最小值,這時我們想要放慢學習率。實現(xiàn)這一策略的一種方法是模擬退火,又稱學習率衰減。在這種方法中,學習率在固定數(shù)目的迭代之后衰減。

梯度下降的挑戰(zhàn)之一:局部極小值

好吧,目前為止,梯度下降看起來是一個非常美好的童話。不過我要開始潑涼水了。還記得我之前說過,我們的損失函數(shù)是一個非常好的函數(shù),這樣的損失函數(shù)并不真的存在?

首先,神經(jīng)網(wǎng)絡是復雜函數(shù),具有大量非線性變換。由此得到的損失函數(shù)看起來不像一個很好的碗,只有一處最小值可以收斂。實際上,這種圣人般的損失函數(shù)稱為凸函數(shù),而深度網(wǎng)絡的損失函數(shù)幾乎總是非凸的。事實上,損失函數(shù)可能是這樣的:

上圖中有一個梯度為零的局部極小值。然而,我們知道那不是我們能達到的最低損失(全局最小值)。如果初始權重位于點A,那么我們將收斂于局部極小值,一旦收斂于局部極小值,梯度下降無法逃離這一陷阱。

梯度下降是由梯度驅(qū)動的,而梯度在任何極小值處都是零。局部極小值,顧名思義,是損失函數(shù)在局部達到最小值的點。而全局最小值,是損失函數(shù)整個定義域上可以達到的最小值。

讓事情更糟的是,損失等值曲面可能更加復雜,實踐中可沒有我們考慮的三維等值曲面。實踐中的神經(jīng)網(wǎng)絡可能有上億權重,相應地,損失函數(shù)有上億維度。在那樣的圖像上梯度為零的點不知道有多少。

事實上,可視化這樣的高維函數(shù)很難。然而,因為現(xiàn)在有很多極具天賦的人從事深度學習研究,人們找到了以3D形式可視化損失函數(shù)的等值曲面的方法。最近的一篇論文提出了過濾器歸一化(Filter Normalization)技術,本文就不解釋它的具體做法了。我們只要知道,它能夠為我們提供呈現(xiàn)損失函數(shù)復雜性的視圖。例如,下圖表示VGG-56深度網(wǎng)絡在CIFAR-10數(shù)據(jù)集上的損失函數(shù):

圖片來源:cs.umd.edu/~tomg

如你所見,上面遍布局部極小值。

梯度下降的挑戰(zhàn)之二:鞍點

我們碰到的另一種問題是鞍點,看起來是這樣的:

之前的圖片中,雙“峰”交匯處也有一個鞍點。

鞍點因形狀像馬鞍而得名。鞍點處,梯度在一個方向(x)上是極小值,在另一個方向上則是極大值。如果沿著x方向的等值曲面比較平,那么梯度下降會沿著y方向來回振蕩,造成收斂于最小值的錯覺。

隨機性是救星!

所以,我們該如何逃離局部極小值和鞍點,努力收斂于全局最小值呢?答案是隨機性。

目前為止,我們進行梯度下降時計算的損失函數(shù)累加了訓練集中所有可能樣本上的損失。如果我們碰到局部極小值或鞍點,我們便陷入其中。幫助梯度下降擺脫這些的一種方法是使用隨機梯度下降。

隨機梯度下降并不通過累加所有損失函數(shù)計算損失,而是計算隨機取樣(無放回)的樣本的損失。和隨機選取一個樣本的隨機梯度下降不同,我們之前的方法在一個batch內(nèi)處理所有樣本,因此稱為批量梯度下降。

相應地,隨機梯度下降的更新規(guī)則為:

基于“單樣本損失”計算出的梯度,方向和基于“全樣本損失”計算出的梯度可能略有不同。因此,當“全樣本損失”可能將我們推入局部極小值,或讓我們陷于鞍點時,“單樣本損失”梯度可能指向不同的方向,也許能幫助我們避開局部極小值和鞍點。

即使我們陷入了“單樣本損失”的局部極小值,下一個隨機取樣的數(shù)據(jù)點的“單樣本損失”可能不一樣,讓我們得以繼續(xù)移動。

當它真的收斂時,它收斂于根據(jù)幾乎所有“單樣本損失”計算得出的最小值。同時,經(jīng)驗表明,鞍點極為不穩(wěn)定,小小的輕推可能就足以逃離鞍點。

所以,這是否意味著,在實踐中,我們應該總是進行這樣的單樣本隨機梯度下降?

batch大小

答案是否。盡管理論上,隨機梯度下降也許能為我們提供最好的結果,從算力上看,它是一個不太可行的選項。隨機梯度下降時,我們需要一步一步地計算損失,而在批量梯度下降時,單獨損失的梯度可以并行計算。

因此,我們在這兩種方法之間尋找一個平衡。我們既不使用整個數(shù)據(jù)集,也不僅僅基于單個樣本構造損失函數(shù),我們使用固定數(shù)量的樣本,比如,16、32、128,這稱為mini-batch。之所以稱為mini-batch,是為了區(qū)別批量(batch)梯度下降。選擇合適的mini-batch大小,可以確保我們既能有足夠的隨機性以擺脫局部極小值,又能充分利用并行處理的算力優(yōu)勢。

重新審視局部極小值:它們并沒有你想像的那么糟糕

在你仇視局部極小值之前,先看下最近的研究吧。最近的研究表明,局部極小值并不一定不好。在神經(jīng)網(wǎng)絡的損失曲面上,有太多的極小值了?!傲己谩钡木植繕O小值表現(xiàn)可能和全局最小值一樣好。

為什么我說“良好”?因為我們?nèi)匀豢赡芟萑腚y以預測的訓練樣本導致的“糟糕”的局部極小值?!傲己谩钡木植繕O小值,文獻中常稱為最優(yōu)局部極小值,在神經(jīng)網(wǎng)絡的高維損失函數(shù)中,可以有相當多個。

另外,許多神經(jīng)網(wǎng)絡進行的是分類任務。如果局部極小值對應的正確標簽的分值在0.7-0.8之間,而同一樣本全局最小值對應的正確標簽的分值在0.95-0.98之間,最終得到的輸出分類預測是一樣的。

我們希望極小值具有的性質(zhì)是它位于較平坦的一邊。為什么?因為平坦極小值更容易收斂,跳過極小值、在極小值周圍的“谷脊”反復回彈的概率更低。

更重要的是,預測集的損失曲面一般和訓練集的略有不同。平坦寬闊的極小值,從訓練集到預測集的切換不會改變太多損失,而狹窄的極小值則不然。更平坦的極小值推廣性更好。

重新審視學習率

最近涌現(xiàn)了一堆學習率規(guī)劃的研究,以避免收斂于損失曲面的次優(yōu)極小值。即使使用學習率衰減,仍有可能陷入局部極小值。傳統(tǒng)上,訓練或者在固定數(shù)目的迭代之后結束,或者在損失沒有改善的10個(比方說)迭代后結束(文獻中稱為及早停止)。

更高的學習率也有助于幫助我們在訓練早期逃離局部極小值。

也有人組合了及早停止和學習率衰減,每次遇到10個損失沒有改善的迭代,就降低學習率,并在學習率低于某個預訂的閾值時停止訓練。

近年來也曾流行周期學習率,緩慢增加學習率,然后降低學習率,循環(huán)往復。

圖片來源:Hafidz Zulkifli

還有稱為熱重啟隨機梯度下降的技術,基本上就是學習率退火至下界后,還原學習率為原值。

還有不同的學習率衰減的規(guī)劃方案,從指數(shù)衰減到余弦衰減。

余弦衰減搭配重啟

最近的一篇論文又引入了隨機權重平均的技術。作者研發(fā)了一種新方法,首先收斂于一個極小值,緩存權重,然后還原到較高的學習率。這一較高的學習率將算法推離極小值,到損失曲面上的一個隨機點。接著算法收斂于另一個極小值。重復幾次后,對所有緩存的權重取平均,基于平均權重作出預測。

結語

梯度下降就介紹到這里了。不過我們還漏了一點沒講,如何應對病態(tài)曲率。隨機梯度下降的一些擴展,如動量、RMSProp、Adam可以用來克服這一問題。

不過我覺得我們介紹的內(nèi)容對一篇博客文章來說已經(jīng)夠多了,剩余的內(nèi)容將在另一篇文章中介紹。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標題:深度學習優(yōu)化算法入門:一、梯度下降

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深入淺出AVR

    深入淺出AVR,本書。
    發(fā)表于 07-15 12:02

    深入淺出玩轉(zhuǎn)FPGA

    深入淺出玩轉(zhuǎn)FPGA
    發(fā)表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發(fā)表于 08-18 10:12

    HDMI技術深入淺出

    HDMI技術深入淺出
    發(fā)表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發(fā)表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發(fā)表于 04-26 10:48

    深入淺出安防視頻監(jiān)控系統(tǒng)

    深入淺出安防視頻監(jiān)控系統(tǒng)深入淺出安防視頻監(jiān)控系統(tǒng)
    發(fā)表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發(fā)表于 08-23 10:10

    深入淺出matlab

    深入淺出matlab 本書介紹MATLAB 7.X版本與其他語言混合編程的方法。內(nèi)容包括在MATLAB中以文件方式導入、導
    發(fā)表于 06-18 09:13 ?261次下載
    <b class='flag-5'>深入淺出</b>matlab

    深入淺出數(shù)據(jù)分析

    深入淺出數(shù)據(jù)分析,有需要的朋友下來看看。
    發(fā)表于 01-15 14:22 ?0次下載

    深入淺出AVR單片機_精要

    本書深入淺出介紹AVR單片機的原理及應用
    發(fā)表于 03-24 10:47 ?16次下載

    深入淺出談多層面板布線技巧

    深入淺出談多層面板布線技巧
    發(fā)表于 12-13 22:20 ?0次下載

    深入淺出Android—Android開發(fā)經(jīng)典教材

    深入淺出Android—Android開發(fā)經(jīng)典教材
    發(fā)表于 10-24 08:52 ?15次下載
    <b class='flag-5'>深入淺出</b>Android—Android開發(fā)經(jīng)典教材

    深入淺出數(shù)字信號處理

    深入淺出數(shù)字信號處理
    發(fā)表于 12-07 20:14 ?507次閱讀

    深入淺出學習250個通信原理資源下載

    深入淺出學習250個通信原理資源下載
    發(fā)表于 04-12 09:16 ?28次下載