<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 智能計算 > 設計應用 > 從零開(kāi)始:教你如何訓練神經(jīng)網(wǎng)絡(luò )

從零開(kāi)始:教你如何訓練神經(jīng)網(wǎng)絡(luò )

作者: 時(shí)間:2017-12-12 來(lái)源:網(wǎng)絡(luò ) 收藏

  作者從簡(jiǎn)單的數學(xué)定義開(kāi)始,沿著(zhù)損失函數、激活函數和反向傳播等方法進(jìn)一步描述基本的優(yōu)化算法。在理解這些基礎后,本文詳細描述了動(dòng)量法等當前十分流行的學(xué)習算法。此外,本系列將在后面介紹 Adam 和遺傳算法等其它重要的訓練方法。

本文引用地址:http://dyxdggzs.com/article/201712/372870.htm

  I. 簡(jiǎn)介

  本文是作者關(guān)于如何「訓練」的一部分經(jīng)驗與見(jiàn)解,處理神經(jīng)網(wǎng)絡(luò )的基礎概念外,這篇文章還描述了梯度下降(GD)及其部分變體。此外,該系列文章將在在后面一部分介紹了當前比較流行的學(xué)習算法,例如:

  動(dòng)量隨機梯度下降法(SGD)

  RMSprop 算法

  Adam 算法(自適應矩估計)

  遺傳算法

  作者在第一部分以非常簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò )介紹開(kāi)始,簡(jiǎn)單到僅僅足夠讓人理解我們所談?wù)摰母拍?。作者?huì )解釋什么是損失函數,以及「訓練」神經(jīng)網(wǎng)絡(luò )或者任何其他的機器學(xué)習模型到底意味著(zhù)什么。作者的解釋并不是一個(gè)關(guān)于神經(jīng)網(wǎng)絡(luò )全面而深度的介紹,事實(shí)上,作者希望我們讀者已經(jīng)對這些相關(guān)的概念早已了然于心。如果讀者想更好地理解神經(jīng)網(wǎng)絡(luò )具體是如何運行的,讀者可以閱讀《深度學(xué)習》等相關(guān)書(shū)籍,或參閱文末提供的相關(guān)學(xué)習資源列表。

  本文作者以幾年前在 kaggle 上進(jìn)行的貓狗鑒別競賽(https://www.kaggle.com/c/dogs-vs-cats)為例來(lái)解釋所有的東西。在這個(gè)比賽中我們面臨的任務(wù)是,給定一張圖片,判斷圖中的動(dòng)物是貓還是狗。

  II. 定義神經(jīng)網(wǎng)絡(luò )

  人工神經(jīng)網(wǎng)絡(luò )(ANN)的產(chǎn)生受到了人腦工作機制的啟發(fā)。盡管這種模擬是很不嚴格的,但是 ANN 確實(shí)和它們生物意義上的創(chuàng )造者有幾個(gè)相似之處。它們由一定數量的神經(jīng)元組成。所那么,我們來(lái)看一下一個(gè)單獨的神經(jīng)元吧。


  單個(gè)神經(jīng)元

  我們接下來(lái)要談?wù)摰纳窠?jīng)元是一個(gè)與 Frank Rosenblatt 在 1957 年提出的最簡(jiǎn)單的被稱(chēng)作「感知機,perception」的神經(jīng)元稍微有所不同的版本。我所做的所有修改都是為了簡(jiǎn)化,因為我在這篇文章中不會(huì )涉及神經(jīng)網(wǎng)絡(luò )的深入解釋。我僅僅試著(zhù)給讀者給出一個(gè)關(guān)于神經(jīng)網(wǎng)絡(luò )如何工作的直覺(jué)認識。

  什么是神經(jīng)元呢?它是一個(gè)數學(xué)函數,并以一定量的數值作為輸入(隨便你想要多少作為輸入),我在上圖畫(huà)出的神經(jīng)元有兩個(gè)輸入。我們將每個(gè)輸入記為 x_k,這里 k 是輸入的索引。對于每一個(gè)輸入 x_k,神經(jīng)元會(huì )給它分配另一個(gè)數 w_k,由這些參數 w_k 組成的向量叫做權重向量。正是這些權值才使得每個(gè)神經(jīng)元都是獨一無(wú)二的。在測試的過(guò)程中,權值是不會(huì )變化的,但是在訓練的過(guò)程中,我們要去改變這些權值以「調節」我們的網(wǎng)絡(luò )。我會(huì )在后面的文章中討論這個(gè)內容。正如前面提到的,一個(gè)神經(jīng)元就是一個(gè)數學(xué)函數。但是它是哪種函數呢?它是權值和輸入的一種線(xiàn)性組合,還有基于這種組合的某種非線(xiàn)性函數。我會(huì )繼續做進(jìn)一步解釋。讓我們來(lái)看一下首先的線(xiàn)性組合部分。


  輸入和權值的線(xiàn)性組合。

  上面的公式就是我提到的線(xiàn)性組合。我們要將輸入和對應的權值相乘,然后對所有的結果求和。結果就會(huì )一個(gè)數字。最后一部分—就是給這個(gè)數字應用某種非線(xiàn)性函數。今天最常用的非線(xiàn)性函數即一種被稱(chēng)作 ReLU(rectified linear unit) 的分段線(xiàn)性函數,其公式如下:


  線(xiàn)性整流單元的表達式。

  如果我們的數字大于 0,我們就會(huì )使用這個(gè)數字,如果它小于 0,我們就會(huì )用 0 去代替它。這個(gè)被用在線(xiàn)性神經(jīng)元上的非線(xiàn)性函數被稱(chēng)作激活函數。我們必須使用某種非線(xiàn)性函數的原因在后面會(huì )變得很明顯??偨Y一下,神經(jīng)元使用固定數目的輸入和(標量),并輸出一個(gè)標量的激活值。前面畫(huà)出的神經(jīng)元可以概括成一個(gè)公式,如下所示:

  將我要寫(xiě)的內容稍微提前一下,如果我們以貓狗鑒別的任務(wù)為例,我們會(huì )把圖片作為神經(jīng)元的輸入。也許你會(huì )疑問(wèn):當神經(jīng)元被定義為函數的時(shí)候,如何向它傳遞圖片。你應該記住,我們將圖片存儲在計算機中的方式是將它拿一個(gè)數組代表的,數組中的每一個(gè)數字代表一個(gè)像素的亮度。所以,將圖片傳遞到神經(jīng)元的方式就是將 2 維(或者 3 維的彩色圖片)數組展開(kāi),得到一個(gè)一維數組,然后將這些數字傳遞到神經(jīng)元。不幸的是,這會(huì )導致我們的神經(jīng)網(wǎng)絡(luò )會(huì )依賴(lài)于輸入圖片的大小,我們只能處理由神經(jīng)網(wǎng)絡(luò )定義的某個(gè)固定大小的圖片?,F代神經(jīng)網(wǎng)絡(luò )已經(jīng)發(fā)現了解決這個(gè)問(wèn)題的方法,但是我們在這里還是在這個(gè)限制下設計神經(jīng)網(wǎng)絡(luò )。

  現在我們定義一下神經(jīng)網(wǎng)絡(luò )。神經(jīng)網(wǎng)絡(luò )也是一個(gè)數學(xué)函數,它就是很多相互連接的神經(jīng)元,這里的連接指的是一個(gè)神經(jīng)元的輸出被用為另一個(gè)神經(jīng)元的輸入。下圖是一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò ),希望用這張圖能夠將這個(gè)定義解釋得更加清楚。

  一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò )。

  上圖定義的神經(jīng)網(wǎng)絡(luò )具有 5 個(gè)神經(jīng)元。正如你所看到的,這個(gè)神經(jīng)網(wǎng)絡(luò )由 3 個(gè)全連接層堆疊而成,即每一層的每個(gè)神經(jīng)元都連接到了下一層的每一個(gè)神經(jīng)元。你的神經(jīng)網(wǎng)絡(luò )有多少層、每一層有多少個(gè)神經(jīng)元、神經(jīng)元之間是怎么鏈接的,這這些因素共同定義了一個(gè)神經(jīng)網(wǎng)絡(luò )的架構。第一層叫做輸入層,包含兩個(gè)神經(jīng)元。這一層的神經(jīng)元并不是我之前所說(shuō)的神經(jīng)元,從某種意義而言,它并不執行任何計算。它們在這里僅僅代表神經(jīng)網(wǎng)絡(luò )的輸入。而神經(jīng)網(wǎng)絡(luò )對非線(xiàn)性的需求源于以下兩個(gè)事實(shí):1)我們的神經(jīng)元是連在一起的;2)基于線(xiàn)性函數的函數還是線(xiàn)性的。所以,如果不對每個(gè)神經(jīng)元應用一個(gè)非線(xiàn)性函數,神經(jīng)網(wǎng)絡(luò )也會(huì )是一個(gè)線(xiàn)性函數而已,那么它并不比單個(gè)神經(jīng)元強大。最后一點(diǎn)需要強調的是:我們通常是想讓一個(gè)神經(jīng)網(wǎng)絡(luò )的輸出大小在 0 到 1 之間,所以我們會(huì )將它按照概率對待。例如,在貓狗鑒別的例子中,我們可以把接近于 0 的輸出視為貓,將接近于 1 的輸出視為狗。為了完成這個(gè)目標,我們會(huì )在最后一個(gè)神經(jīng)元上應用一個(gè)不同的激活函數。我們會(huì )使用 sigmoid 激活函數。關(guān)于這個(gè)激活函數,你目前只需要知道它地返回值是一個(gè)介于 0 到 1 的數字,這正好是我們想要的。解釋完這些之后,我們可以定義一個(gè)和上圖對應的神經(jīng)網(wǎng)絡(luò )了。

  定義一個(gè)神經(jīng)網(wǎng)絡(luò )的函數。w 的上標代表神經(jīng)元的索引,下標代表輸入的索引。

  最后,我們得到了某種函數,它以幾個(gè)數作為輸入,輸出另一個(gè)介于 0 到 1 之間的數。實(shí)際上,這個(gè)函數怎樣表達并不重要,重要的是我們通過(guò)一些權重將一個(gè)非線(xiàn)性函數參數化了,我們可以通過(guò)改變這些權重來(lái)改變這個(gè)非線(xiàn)性函數。

  III. 損失函數

  在開(kāi)始討論神經(jīng)網(wǎng)絡(luò )的訓練之前,最后一個(gè)需要定義的就是損失函數了。損失函數是一個(gè)可以告訴我們,神經(jīng)網(wǎng)絡(luò )在某個(gè)特定的任務(wù)上表現有多好的函數。做這件事的最直覺(jué)的辦法就是,對每一個(gè)訓練樣本,都沿著(zhù)神經(jīng)網(wǎng)絡(luò )傳遞得到一個(gè)數字,然后將這個(gè)數字與我們想要得到的實(shí)際數字做差再求平方,這樣計算出來(lái)的就是預測值與真實(shí)值之間的距離,而訓練神經(jīng)網(wǎng)絡(luò )就是希望將這個(gè)距離或損失函數減小。

  上式中的 y 代表我們想要從神經(jīng)網(wǎng)絡(luò )得到的數字,y hat 指的一個(gè)樣本通過(guò)神經(jīng)網(wǎng)絡(luò )得到的實(shí)際結果,i 是我們的訓練樣本的索引。我們還是以貓狗鑒別為例。我們有一個(gè)數據集,由貓和狗的圖片組成,如果圖片是狗,對應的標簽是 1,如果圖片是貓,對應的標簽是 0。這個(gè)標簽就是對應的 y,在向神經(jīng)網(wǎng)絡(luò )傳遞一張圖片的時(shí)候我們想通過(guò)神經(jīng)網(wǎng)絡(luò )的得到的結果。為了計算損失函數,我們必須遍歷數據集中的每一張圖片,為每一個(gè)樣本計算 y,然后按照上面的定義計算損失函數。如果損失函數比較大,那么說(shuō)明我們的神經(jīng)網(wǎng)絡(luò )性能并不是很好,我們想要損失函數盡可能的小。為了更深入地了解損失函數和神經(jīng)網(wǎng)絡(luò )之間的聯(lián)系,我們可以重寫(xiě)這個(gè)公式,將 y 換成網(wǎng)絡(luò )的實(shí)際函數。

  IV. 訓練

  在開(kāi)始訓練神經(jīng)網(wǎng)絡(luò )的時(shí)候,要對權值進(jìn)行隨機初始化。顯然,初始化的參數并不會(huì )得到很好的結果。在訓練的過(guò)程中,我們想以一個(gè)很糟糕的神經(jīng)網(wǎng)絡(luò )開(kāi)始,得到一個(gè)具有高準確率的網(wǎng)絡(luò )。此外,我們還希望在訓練結束的時(shí)候,損失函數的函數值變得特別小。提升網(wǎng)絡(luò )是有可能的,因為我們可以通過(guò)調節權值去改變函數。我們希望找到一個(gè)比初始化的模型性能好很多的函數。

  問(wèn)題在于,訓練的過(guò)程相當于最小化損失函數。為什么是最小化損失而不是最大化呢?結果證明損失是比較容易優(yōu)化的函數。

  有很多用于函數優(yōu)化的算法。這些算法可以是基于梯度的,也可以不是基于梯度的,因為它們既可以使用函數提供的信息,還可以使用函數梯度提供的信息。最簡(jiǎn)單的基于梯度的算法之一叫做隨機梯度下降(SGD),這也是我在這篇文章中要介紹的算法。讓我們來(lái)看一下它是如何運行的吧。

  首先,我們要記住關(guān)于某個(gè)變量的導數是什么。我們拿比較簡(jiǎn)單的函數 f(x) = x 為例。如果還記得高中時(shí)候學(xué)過(guò)的微積分法則,我們就會(huì )知道,這個(gè)函數在每個(gè) x 處的導數都是 1。那么導數能夠告訴我們哪些信息呢?導數描述的是:當我么讓自變量朝正方向變化無(wú)限小的步長(cháng)時(shí),函數值變化有多快的速率。它可以寫(xiě)成下面的數學(xué)形式:

  它的意思是:函數值的變化量(方程的左邊)近似等于函數在對應的某個(gè)變量 x 處的導數與 x 的增量的乘積?;氐轿覀儎偛潘e的最簡(jiǎn)單的例子 f(x) = x,導數處處是 1,這意味著(zhù)如果我們將 x 朝正方向變化一小步ε,函數輸出的變化等于 1 和ε的乘積,剛好是ε本身。檢查這個(gè)規則是比較容易的。實(shí)際上這個(gè)并不是近似值,它是精確的。為什么呢?因為我們的導數對于每一個(gè) x 都是相同的。但是這并不適用于絕大多數函數。讓我們來(lái)看一個(gè)稍微復雜一點(diǎn)的函數 f(x) = x^2。

  通過(guò)微積分知識我們可以知道,這個(gè)函數的導數是 2*x?,F在如果我們從某個(gè) x 開(kāi)始移動(dòng)某個(gè)步長(cháng)的ε,很容易能夠發(fā)現對應的函數增量并不精確地等于上面的公式中的計算結果。

  現在,梯度是由偏導數組成的向量,這個(gè)向量的元素是這個(gè)函數所依賴(lài)的某些變量對應的導數。對于我們目前所考慮的簡(jiǎn)單函數來(lái)說(shuō),這個(gè)向量只有一個(gè)元素,因為我們所用的函數只有一個(gè)輸入。對于更加復雜的函數(例如我們的損失函數)而言,梯度會(huì )包含函數對應的每個(gè)變量的導數。

  為了最小化某個(gè)損失函數,我們可以怎么使用這個(gè)由導數提供的信息呢?還是回到函數 f(x) = x^2。顯然,這個(gè)函數在 x=0 的點(diǎn)取得最小值,但是計算機如何知道呢?假設我們開(kāi)始的時(shí)候得到的 x 的隨機初始值為 2,此時(shí)函數的導數等于 4。這意味著(zhù)如果 x 朝著(zhù)正方向改變,函數的增量會(huì )是 x 增量的 4 倍,因此函數值反而會(huì )增加。相反,我們希望最小化我們的函數,所以我們可以朝著(zhù)相反的方向改變 x,也就是負方向,為了確保函數值降低,我們只改變一小步。但是我們一步可以改變多大呢? 我們的導數只保證當 x 朝負方向改變無(wú)限小的時(shí)候函數值才會(huì )減小。因此,我們希望用一些超參數來(lái)控制一次能夠改變多大。這些超參數叫做學(xué)習率,我們后面會(huì )談到。我們現在看一下,如果我們從-2 這個(gè)點(diǎn)開(kāi)始,會(huì )發(fā)生什么。這里的導數是-4,這意味著(zhù)如果朝著(zhù)正方向改變 x,函數值會(huì )變小,這正是我們想要的結果。

  注意到這里的規律了嗎?當 x>0 的時(shí)候,我們導數值也大于 0,我們需要朝著(zhù)負方向改變,當 x<0 的時(shí)候,我們導數值小于 0,我們需要朝著(zhù)正方向改變,我們總需要朝著(zhù)導數的反方向改變 x。讓我們對梯度也引用同樣的思路。梯度是指向空間某個(gè)方向的向量,實(shí)際上它指向的是函數值增加最劇烈的方向。由于我們要最小化我們的函數,所以我們會(huì )朝著(zhù)與梯度相反的方向改變自變量?,F在在我們應用這個(gè)思想。在神經(jīng)網(wǎng)絡(luò )中,我們將輸入 x 和輸出 y 視為固定的數。我們要對其求導數的變量是權值 w,因為我們可以通過(guò)改變這些權值類(lèi)提升神經(jīng)網(wǎng)絡(luò )。如果我們對損失函數計算權值對應的梯度,然后朝著(zhù)與梯度相反的方向改變權值,我們的損失函數也會(huì )隨之減小,直至收斂到某一個(gè)局部極小值。這個(gè)算法就叫做梯度下降。在每一次迭代中更新權重的算法如下所示:    

  每一個(gè)權重值都要減去它對應的導數和學(xué)習率的乘積。

  上式中的 Lr 代表的是學(xué)習率,它就是控制每次迭代中步長(cháng)大小的變量。這是我們在訓練神經(jīng)網(wǎng)絡(luò )的時(shí)候要調節的重要超參數。如果我么選擇的學(xué)習率太大,會(huì )導致步進(jìn)太大,以至于跳過(guò)最小值,這意味著(zhù)你的算法會(huì )發(fā)散。如果你選擇的學(xué)習率太小,收斂到一個(gè)局部極小值可能會(huì )花費太多時(shí)間。人們開(kāi)發(fā)出了一些很好的技術(shù)來(lái)尋找一個(gè)最佳的學(xué)習率,然而這個(gè)內容超出本文所涉及的范圍了。

  不幸的是,我們不能應用這個(gè)算法來(lái)訓練神經(jīng)網(wǎng)絡(luò ),原因在于損失函數的公式。

  正如你可以在我之前的定義中看到的一樣,我們損失函數的公式是和的平均值。從微積分原理中我們可以知道,微分的和就是和的微分。所以,為了計算損失函數的梯度,我們需要遍歷我們的數據集中的每一個(gè)樣本。在每一次迭代中進(jìn)行梯度下降是非常低效的,因為算法的每次迭代僅僅以很小的步進(jìn)提升了損失函數。為了解決這個(gè)問(wèn)題,還有另外一個(gè)小批量梯度下降算法。該算法更新權值的方法是不變的,但是我們不會(huì )去計算精確的梯度。相反,我們會(huì )在數據集的一個(gè)小批量上近似計算梯度,然后使用這個(gè)梯度去更新權值。Mini-batch 并不能保證朝著(zhù)最佳的方向改變權值。事實(shí)上,它通常都不會(huì )。在使用梯度下降算法的時(shí)候,如果所選擇的學(xué)習率足夠小的話(huà),能夠保證你的損失函數在每一次迭代中都會(huì )減小。但是使用 Mini-batch 的時(shí)候并不是這樣。你的損失函數會(huì )隨著(zhù)時(shí)間減小,但是它會(huì )有波動(dòng),也會(huì )具有更多的「噪聲」。

  用來(lái)估計梯度的 batch 大小是你必須選擇的另一個(gè)超參數。通常,我們希望盡可能地選擇能處理的較大 batch。但是我很少見(jiàn)到別人使用比 100 還大的 batch size。

  mini-batch 梯度下降的極端情況就是 batch size 等于 1,這種形式的梯度下降叫做隨機梯度下降(SGD)。通常在很多文獻中,當人們說(shuō)隨機梯度下降的時(shí)候,實(shí)際上他們指的就是 mini-batch 隨機梯度下降。大多數深度學(xué)習框架都會(huì )讓你選擇隨機梯度下降的 batch size。

  以上是梯度下降和它變體的基本概念。但近來(lái)越來(lái)越多的人在使用更高級的算法,其中大多數都是基于梯度的,作者下一部分就主要介紹這些最優(yōu)化方法。

  VII. 反向傳播(BP)

  關(guān)于基于梯度的算法,剩下的唯一一件事就是如何計算梯度了。最快速的方法就是解析地給出每一個(gè)神經(jīng)元架構的導數。我想,當梯度遇到神經(jīng)網(wǎng)絡(luò )的時(shí)候,我不應該說(shuō)這是一個(gè)瘋狂的想法。我們在前面定義的一個(gè)很簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò )就已經(jīng)相當艱難了,而它只有區區 6 個(gè)參數。而現代神經(jīng)網(wǎng)絡(luò )的參數動(dòng)輒就是數百萬(wàn)。

  第二種方法就是使用我們從微積分中學(xué)到的下面的這個(gè)公式去近似計算梯度,事實(shí)上這也是最簡(jiǎn)單的方法?!? 

  盡管這個(gè)方法是非常容易實(shí)現的,但是它卻是非常耗計算資源的。

  最后一種計算梯度的方法,是對解析難度和計算成本的折中,這個(gè)方法被稱(chēng)作反向傳小節。反向傳播不在本文的討論范圍,如果你想了解更多的話(huà),可以查看 Goodfellow《深度學(xué)習》第六章第五小節,該章節對反向傳播算法有非常詳盡的介紹。

  VI. 它為什么會(huì )起作用?

  當我初次了解神經(jīng)網(wǎng)絡(luò )以及它是如何工作的時(shí)候,我理解所有的方程,但是我不是十分確定它們?yōu)樯稌?huì )起作用。這個(gè)想法對我而言有些怪誕:用幾個(gè)函數,求一些導數,最終會(huì )得到一個(gè)能夠認出圖片中是貓還是狗。為什么我不能給你們一個(gè)很好的關(guān)于為啥神經(jīng)網(wǎng)絡(luò )會(huì )如此好的奏效的直覺(jué)知識呢?請注意以下兩個(gè)方面。

  1. 我們想要用神經(jīng)網(wǎng)絡(luò )解決的問(wèn)題必須被以數學(xué)的形式表達出來(lái)。例如,對于對于貓狗鑒別:我們需要找到一個(gè)函數,它能夠把一副圖片中的所有像素作為輸入,然后輸出圖片中的內容是狗的概率。你可以用這種方法去定義任何一個(gè)分類(lèi)問(wèn)題。

  2. 或許并不是很清楚,為什么會(huì )有一個(gè)能夠從一副圖片中把貓和狗區分開(kāi)來(lái)的函數。這里的思想是:只要你有一些具有輸入和標簽的數據集,總會(huì )存在一個(gè)能夠在一個(gè)給定數據集上性能良好的函數。問(wèn)題在于這個(gè)函數會(huì )相當復雜。這時(shí)候神經(jīng)網(wǎng)絡(luò )就能夠有所幫助了。有一個(gè)「泛逼近性原理,universal approximation theorem」,指的是具有一個(gè)隱藏層的神經(jīng)網(wǎng)絡(luò )可以近似任何一個(gè)你想要的的函數,你想要它近似得多好,就能有多好。

  動(dòng)量隨機梯度下降算法

  -這是關(guān)于訓練神經(jīng)網(wǎng)絡(luò )和機器學(xué)習模型優(yōu)化算法系列的第二部分,第一部分是關(guān)于隨機梯度下降的。在這一部分,假定讀者對神經(jīng)網(wǎng)絡(luò )和梯度下降算法已有基本了解。如果讀者對神經(jīng)網(wǎng)絡(luò )一無(wú)所知,或者不知道神經(jīng)網(wǎng)絡(luò )是如何訓練的,可以在閱讀這部分之前閱讀第一部分。

  在本節中,除了經(jīng)典的 SGD 算法外,我們還會(huì )對動(dòng)量法進(jìn)行討論,這種算法一般比隨機梯度下降算法更好更快。動(dòng)量法 [1] 或具有動(dòng)量的 SGD 是一種方法,這種方法有助于加速向量向著(zhù)正確的方向梯度下降,從而使其收斂速度更快。這是最流行的優(yōu)化算法之一,許多各方向上最先進(jìn)的模型都是用這種方法進(jìn)行訓練的。在講高級的算法相關(guān)方程之前,我們先來(lái)看一些有關(guān)動(dòng)量的基礎數學(xué)知識。

  指數加權平均

  指數加權平均用于處理數字序列。假設我們有一些嘈雜的序列 S。在這個(gè)例子中,我繪制了余弦函數并添加了一些高斯噪聲。如下圖所示:  

  注意,盡管這些點(diǎn)看起來(lái)非常接近,但它們的 x 坐標是不同的。也就是說(shuō),對每個(gè)點(diǎn)而言,其 x 坐標是唯一的標識,因此這也是定義序列 S 中每個(gè)點(diǎn)的索引。

  我們需要處理這些數據,而非直接使用它們。我們需要某種「移動(dòng)」的平均值,這個(gè)平均值會(huì )使數據「去噪」從而使其更接近原始函數。指數加權平均值可以產(chǎn)生如下所示的圖片:

  動(dòng)量——來(lái)自指數加權平均的數據

  如我們所見(jiàn),這是一個(gè)相當不錯的結果。與噪聲很大的數據相比,我們得到了更平滑的曲線(xiàn),這意味著(zhù)與初始數據相比,我們得到了與原始函數更接近的結果。指數加權平均值用下面的公式定義了新的序列 V:  

  序列 V 是上面的散點(diǎn)圖中的黃色部分。Beta 是取值為 0 到 1 的另一個(gè)超參數。在上述例子中,取 Beta = 0.9。0.9 是一個(gè)很好的值,經(jīng)常用于具有動(dòng)量的 SGD 方法。我們可以這樣對 Beta 進(jìn)行直觀(guān)理解:我們對序列后面的 1 /(1- beta)的點(diǎn)進(jìn)行近似平均。讓我們看看 beta 的選擇會(huì )對新序列 V 產(chǎn)生怎樣的影響。

  Beta 取值不同時(shí)的指數加權平均結果。

  如我們所見(jiàn),Beta 取值越小,序列 V 波動(dòng)越大。因為我們平均的例子更少,因此結果與噪聲數據更「接近」。隨著(zhù) Beta 值越大,比如當 Beta = 0.98 時(shí),我們得到的曲線(xiàn)會(huì )更加圓滑,但是該曲線(xiàn)有點(diǎn)向右偏移,因為我們取平均值的范圍變得更大(beta = 0.98 時(shí)取值約為 50)。Beta = 0.9 時(shí),在這兩個(gè)極端間取得了很好的平衡。

  數學(xué)部分

  這個(gè)部分對你在項目中使用動(dòng)量而言不是必要的,所以可以跳過(guò)。但這部分更直觀(guān)地解釋了動(dòng)量是如何工作的。

  讓我們對指數加權平均新序列 V 的三個(gè)連續元素的定義進(jìn)行擴展。

  V——新序列。S——原始序列。

  將其進(jìn)行合并,我們可以得到:

  再對其進(jìn)行簡(jiǎn)化,可得:

  從這個(gè)等式中可以看出,新序列的第 T 個(gè)值取決于原始序列 S 的所有先前的數值 1…t。來(lái)自 S 的所有數值被賦了一定的權重。這個(gè)權重是序列 S 的第(t-i)個(gè)值乘以(1- beta)得到的權重。因為 Beta 小于 1,所以當我們對某個(gè)正數的冪取 beta 時(shí),值會(huì )變得更小。所以序列 S 的原始值的權重會(huì )小得多,也因此序列 S 對序列 V 產(chǎn)生的點(diǎn)積影響較小。從某些角度來(lái)說(shuō),該權重小到我們幾乎可以說(shuō)我們「忘記」了這個(gè)值,因為其影響小到幾乎無(wú)法注意到。使用這個(gè)近似值的好處在于當權重小于 1 / e 時(shí),更大的 beta 值會(huì )要求更多小于 1 / e 的權值。這就是為什么 beta 值越大,我們就要對更多的點(diǎn)積進(jìn)行平均。下面的圖表顯示的是與 threshold = 1 / e 相比,隨著(zhù)序列 S 初始值變化,權重變小的速度,在此我們「忘記」了初始值。

  最后要注意的是,第一次迭代得到的平均值會(huì )很差,因為我們沒(méi)有足夠的值進(jìn)行平均。我們可以通過(guò)使用序列 V 的偏差修正版而不是直接使用序列 V 來(lái)解決這一問(wèn)題。

  式中 b = beta。當 t 值變大時(shí),b 的 t 次冪與零無(wú)法進(jìn)行區分,因此不會(huì )改變 V 值。但是當 t 取值較小時(shí),這個(gè)方程會(huì )產(chǎn)生較好的結果。但是因為動(dòng)量的存在使得機器學(xué)習過(guò)程穩定得很快,因此人們通常會(huì )懶得應用這一部分。

  動(dòng)量 SGD 法

  我們已經(jīng)定義了一種方法來(lái)獲得一些序列的「移動(dòng)」平均值,該值會(huì )與數據一起變化。我們該如何將其應用于神經(jīng)網(wǎng)絡(luò )的訓練中呢?它可以平均我們的梯度。我將在下文中解釋它是如何在動(dòng)量中完成的這一工作,并將繼續解釋為什么它可能會(huì )得到更好的效果。

  我將提供兩個(gè)定義來(lái)定義具有動(dòng)量的 SGD 方法,這幾乎就是用兩種不同的方式表達同一個(gè)方程。首先,是吳恩達在 Coursera 深度學(xué)習專(zhuān)業(yè)化(https://www.deeplearning.ai/)的課程中提出的定義。他解釋的方式是,我們定義一個(gè)動(dòng)量,這是我們梯度的移動(dòng)平均值。然后我們用它來(lái)更新網(wǎng)絡(luò )的權重。如下所示:


  式中 L 是損失函數,三角形符號是梯度 w.r.t 權重,α 是學(xué)習率。另一種最流行的表達動(dòng)量更新規則的方式不那么直觀(guān),只是省略了(1 - beta)項。



  這與第一組方程式非常相似,唯一的區別是需要通過(guò)(1 - β)項來(lái)調整學(xué)習率。

  Nesterov 加速漸變

  Nesterov 動(dòng)量是一個(gè)版本略有不同的動(dòng)量更新,最近越來(lái)越受歡迎。在這個(gè)版本中,首先會(huì )得到一個(gè)當前動(dòng)量指向的點(diǎn),然后從這個(gè)點(diǎn)計算梯度。如下圖所示:   

  Nesterov 動(dòng)量可用下式定義:

  動(dòng)量工作原理

  在這里我會(huì )解釋為什么在絕大多數情況下動(dòng)量法會(huì )比經(jīng)典 SGD 法更好用。

  使用隨機梯度下降的方法,我們不會(huì )計算損失函數的確切導數。相反,我們是對一小批數據進(jìn)行估算的。這意味著(zhù)我們并不總是朝著(zhù)最佳的方向前進(jìn),因為我們得到的結果是「嘈雜的」。正如我在上文中列出的圖表。所以,指數的加權平均可以提供一個(gè)更好的估計值,該估計值比通過(guò)嘈雜計算得到的結果更接近實(shí)際值的導數。這就是動(dòng)量法可能比傳統 SGD 更好的原因之一。

  另一個(gè)原因在于溝谷(ravine)。溝谷是一個(gè)區域,在其中,曲線(xiàn)在一個(gè)維度比另一個(gè)維度陡得多。在深度學(xué)習中,溝谷區可近似視為局部最低點(diǎn),而這一特性無(wú)法用 SGD 方法得到。SGD 傾向于在狹窄的溝谷上擺動(dòng),因為負梯度將沿著(zhù)陡峭的一側下降,而非沿著(zhù)溝谷向最優(yōu)點(diǎn)前進(jìn)。動(dòng)量有助于加速梯度向正確的方向前進(jìn)。如下圖所示:  

  左圖——沒(méi)有動(dòng)量的 SGD,右圖——有動(dòng)量的 SGD(來(lái)源:https://www.willamette.edu/~gorr/classes/cs449/momrate.html)

  結論

  希望本節會(huì )提供一些關(guān)于具有動(dòng)量的 SGD 方法是如何起作用以及為什么會(huì )有用的想法。實(shí)際上它是深度學(xué)習中最流行的優(yōu)化算法之一,與更高級的算法相比,這種方法通常被人們更頻繁地使用。

  參考資源

  fast.ai(http://fast.ai/) :它針對程序員提供了兩個(gè)很不錯的關(guān)于深度學(xué)習的課程,以及一個(gè)關(guān)于可計算線(xiàn)性代數的課程。是開(kāi)始編寫(xiě)神經(jīng)網(wǎng)絡(luò )代碼的好地方,隨著(zhù)課程深度的延伸,當你學(xué)到更多理論的時(shí)候,你可以盡快用代碼實(shí)現。

  neuralnetworksanddeeplearning.com(http://neuralnetworksanddeeplearning.com/chap1.html):一本關(guān)于基本知識的很好的在線(xiàn)書(shū)籍。關(guān)于神經(jīng)網(wǎng)絡(luò )背后的理論。作者以一種很好的方式解釋了你需要知道的數學(xué)知識。它也提供并解釋了一些不使用任何深度學(xué)習框架從零開(kāi)始編寫(xiě)神經(jīng)網(wǎng)絡(luò )架構的代碼。

  Andrew Ng 的深度學(xué)習課程(https://www.coursera.org/specializations/deep-learning):coursera 上的課程,也是有關(guān)學(xué)習神經(jīng)網(wǎng)絡(luò )的。以非常簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò )例子開(kāi)始,逐步到卷積神經(jīng)網(wǎng)絡(luò )以及更多。

  3Blue1Brown(https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw):YouTube 上也有一些能夠幫助你理解神經(jīng)網(wǎng)絡(luò )和線(xiàn)性代數的很好的視頻。它們展示了很棒的可視化形式,以及以非常直覺(jué)的方式去理解數學(xué)和神經(jīng)網(wǎng)絡(luò )。

  Stanford CS231 課程(http://cs231n.stanford.edu/):這是關(guān)于用于視覺(jué)識別的卷積神經(jīng)網(wǎng)絡(luò )的課堂,可以學(xué)到很多關(guān)于深度學(xué)習和卷積神經(jīng)網(wǎng)絡(luò )的具體內容。

  參考文獻

[1] Ning Qian. On the momentum term in gradient descent learning algorithms . Neural networks : the official journal of the International Neural Network Society, 12(1):145–151, 1999

  [2] Distill, Why Momentum really works(https://distill.pub/2017/momentum/)

  [3] deeplearning.ai

  [4] Ruder(2016). An overview of gradient descent optimization algorithms. arXiv preprint arXiv:1609.04747

  [5] Ruder (2017) Optimization for Deep Learning Highlights in 2017.(http://ruder.io/deep-learning-optimization-2017/index.html)

  [6] Stanford CS231n lecture notes.(http://cs231n.github.io/neural-networks-3/)(http://cs231n.github.io/neural-networks-3/%EF%BC%89)

  [7] fast.ai(http://www.fast.ai/)







評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>