從零開始:教你如何訓練神經網絡

 2017-12-11 12:08:00.0

原標題:從零開始:教你如何訓練神經網絡

選自TowardsDataScience

作者:Vitaly Bushaev

作者從神經網絡簡單的數學定義開始,沿着損失函數、激活函數和反向傳播等方法進一步描述基本的優化算法。在理解這些基礎後,本文詳細描述了動量法等當前十分流行的學習算法。此外,本系列將在後面介紹 Adam 和遺傳算法等其它重要的神經網絡訓練方法。

I. 簡介

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

  • 動量隨機梯度下降法(SGD)

  • RMSprop 算法

  • Adam 算法(自適應矩估計)

  • 遺傳算法

作者在第一部分以非常簡單的神經網絡介紹開始,簡單到僅僅足夠讓人理解我們所談論的概念。作者會解釋什麼是損失函數,以及「訓練」神經網絡或者任何其他的機器學習模型到底意味着什麼。作者的解釋並不是一個關於神經網絡全面而深度的介紹,事實上,作者希望我們讀者已經對這些相關的概念早已瞭然於心。如果讀者想更好地理解神經網絡具體是如何運行的,讀者可以閱讀《深度學習》等相關書籍,或參閱文末提供的相關學習資源列表。

本文作者以幾年前在 kaggle 上進行的貓狗鑑別競賽(https://www.kaggle.com/c/dogs-vs-cats)爲例來解釋所有的東西。在這個比賽中我們面臨的任務是,給定一張圖片,判斷圖中的動物是貓還是狗。

II. 定義神經網絡

人工神經網絡(ANN)的產生受到了人腦工作機制的啓發。儘管這種模擬是很不嚴格的,但是 ANN 確實和它們生物意義上的創造者有幾個相似之處。它們由一定數量的神經元組成。所那麼,我們來看一下一個單獨的神經元吧。

單個神經元

我們接下來要談論的神經元是一個與 Frank Rosenblatt 在 1957 年提出的最簡單的被稱作「感知機,perception」的神經元稍微有所不同的版本。我所做的所有修改都是爲了簡化,因爲我在這篇文章中不會涉及神經網絡的深入解釋。我僅僅試着給讀者給出一個關於神經網絡如何工作的直覺認識。

什麼是神經元呢?它是一個數學函數,並以一定量的數值作爲輸入(隨便你想要多少作爲輸入),我在上圖畫出的神經元有兩個輸入。我們將每個輸入記爲 x_k,這裏 k 是輸入的索引。對於每一個輸入 x_k,神經元會給它分配另一個數 w_k,由這些參數 w_k 組成的向量叫做權重向量。正是這些權值才使得每個神經元都是獨一無二的。在測試的過程中,權值是不會變化的,但是在訓練的過程中,我們要去改變這些權值以「調節」我們的網絡。我會在後面的文章中討論這個內容。正如前面提到的,一個神經元就是一個數學函數。但是它是哪種函數呢?它是權值和輸入的一種線性組合,還有基於這種組合的某種非線性函數。我會繼續做進一步解釋。讓我們來看一下首先的線性組合部分。

輸入和權值的線性組合。

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

線性整流單元的表達式。

如果我們的數字大於 0,我們就會使用這個數字,如果它小於 0,我們就會用 0 去代替它。這個被用在線性神經元上的非線性函數被稱作激活函數。我們必須使用某種非線性函數的原因在後面會變得很明顯。總結一下,神經元使用固定數目的輸入和(標量),並輸出一個標量的激活值。前面畫出的神經元可以概括成一個公式,如下所示:

將我要寫的內容稍微提前一下,如果我們以貓狗鑑別的任務爲例,我們會把圖片作爲神經元的輸入。也許你會疑問:當神經元被定義爲函數的時候,如何向它傳遞圖片。你應該記住,我們將圖片存儲在計算機中的方式是將它拿一個數組代表的,數組中的每一個數字代表一個像素的亮度。所以,將圖片傳遞到神經元的方式就是將 2 維(或者 3 維的彩色圖片)數組展開,得到一個一維數組,然後將這些數字傳遞到神經元。不幸的是,這會導致我們的神經網絡會依賴於輸入圖片的大小,我們只能處理由神經網絡定義的某個固定大小的圖片。現代神經網絡已經發現瞭解決這個問題的方法,但是我們在這裏還是在這個限制下設計神經網絡。

現在我們定義一下神經網絡。神經網絡也是一個數學函數,它就是很多相互連接的神經元,這裏的連接指的是一個神經元的輸出被用爲另一個神經元的輸入。下圖是一個簡單的神經網絡,希望用這張圖能夠將這個定義解釋得更加清楚。

一個簡單的神經網絡。

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

定義一個神經網絡的函數。w 的上標代表神經元的索引,下標代表輸入的索引。

最後,我們得到了某種函數,它以幾個數作爲輸入,輸出另一個介於 0 到 1 之間的數。實際上,這個函數怎樣表達並不重要,重要的是我們通過一些權重將一個非線性函數參數化了,我們可以通過改變這些權重來改變這個非線性函數。

III. 損失函數

在開始討論神經網絡的訓練之前,最後一個需要定義的就是損失函數了。損失函數是一個可以告訴我們,神經網絡在某個特定的任務上表現有多好的函數。做這件事的最直覺的辦法就是,對每一個訓練樣本,都沿着神經網絡傳遞得到一個數字,然後將這個數字與我們想要得到的實際數字做差再求平方,這樣計算出來的就是預測值與真實值之間的距離,而訓練神經網絡就是希望將這個距離或損失函數減小。

上式中的 y 代表我們想要從神經網絡得到的數字,y hat 指的一個樣本通過神經網絡得到的實際結果,i 是我們的訓練樣本的索引。我們還是以貓狗鑑別爲例。我們有一個數據集,由貓和狗的圖片組成,如果圖片是狗,對應的標籤是 1,如果圖片是貓,對應的標籤是 0。這個標籤就是對應的 y,在向神經網絡傳遞一張圖片的時候我們想通過神經網絡的得到的結果。爲了計算損失函數,我們必須遍歷數據集中的每一張圖片,爲每一個樣本計算 y,然後按照上面的定義計算損失函數。如果損失函數比較大,那麼說明我們的神經網絡性能並不是很好,我們想要損失函數儘可能的小。爲了更深入地瞭解損失函數和神經網絡之間的聯繫,我們可以重寫這個公式,將 y 換成網絡的實際函數。

IV. 訓練

在開始訓練神經網絡的時候,要對權值進行隨機初始化。顯然,初始化的參數並不會得到很好的結果。在訓練的過程中,我們想以一個很糟糕的神經網絡開始,得到一個具有高準確率的網絡。此外,我們還希望在訓練結束的時候,損失函數的函數值變得特別小。提升網絡是有可能的,因爲我們可以通過調節權值去改變函數。我們希望找到一個比初始化的模型性能好很多的函數。

問題在於,訓練的過程相當於最小化損失函數。爲什麼是最小化損失而不是最大化呢?結果證明損失是比較容易優化的函數。

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

首先,我們要記住關於某個變量的導數是什麼。我們拿比較簡單的函數 f(x) = x 爲例。如果還記得高中時候學過的微積分法則,我們就會知道,這個函數在每個 x 處的導數都是 1。那麼導數能夠告訴我們哪些信息呢?導數描述的是:當我麼讓自變量朝正方向變化無限小的步長時,函數值變化有多快的速率。它可以寫成下面的數學形式:

它的意思是:函數值的變化量(方程的左邊)近似等於函數在對應的某個變量 x 處的導數與 x 的增量的乘積。回到我們剛纔所舉的最簡單的例子 f(x) = x,導數處處是 1,這意味着如果我們將 x 朝正方向變化一小步ε,函數輸出的變化等於 1 和ε的乘積,剛好是ε本身。檢查這個規則是比較容易的。實際上這個並不是近似值,它是精確的。爲什麼呢?因爲我們的導數對於每一個 x 都是相同的。但是這並不適用於絕大多數函數。讓我們來看一個稍微複雜一點的函數 f(x) = x^2。

通過微積分知識我們可以知道,這個函數的導數是 2*x。現在如果我們從某個 x 開始移動某個步長的ε,很容易能夠發現對應的函數增量並不精確地等於上面的公式中的計算結果。

現在,梯度是由偏導數組成的向量,這個向量的元素是這個函數所依賴的某些變量對應的導數。對於我們目前所考慮的簡單函數來說,這個向量只有一個元素,因爲我們所用的函數只有一個輸入。對於更加複雜的函數(例如我們的損失函數)而言,梯度會包含函數對應的每個變量的導數。

爲了最小化某個損失函數,我們可以怎麼使用這個由導數提供的信息呢?還是回到函數 f(x) = x^2。顯然,這個函數在 x=0 的點取得最小值,但是計算機如何知道呢?假設我們開始的時候得到的 x 的隨機初始值爲 2,此時函數的導數等於 4。這意味着如果 x 朝着正方向改變,函數的增量會是 x 增量的 4 倍,因此函數值反而會增加。相反,我們希望最小化我們的函數,所以我們可以朝着相反的方向改變 x,也就是負方向,爲了確保函數值降低,我們只改變一小步。但是我們一步可以改變多大呢? 我們的導數只保證當 x 朝負方向改變無限小的時候函數值纔會減小。因此,我們希望用一些超參數來控制一次能夠改變多大。這些超參數叫做學習率,我們後面會談到。我們現在看一下,如果我們從-2 這個點開始,會發生什麼。這裏的導數是-4,這意味着如果朝着正方向改變 x,函數值會變小,這正是我們想要的結果。

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

每一個權重值都要減去它對應的導數和學習率的乘積。

上式中的 Lr 代表的是學習率,它就是控制每次迭代中步長大小的變量。這是我們在訓練神經網絡的時候要調節的重要超參數。如果我麼選擇的學習率太大,會導致步進太大,以至於跳過最小值,這意味着你的算法會發散。如果你選擇的學習率太小,收斂到一個局部極小值可能會花費太多時間。人們開發出了一些很好的技術來尋找一個最佳的學習率,然而這個內容超出本文所涉及的範圍了。

不幸的是,我們不能應用這個算法來訓練神經網絡,原因在於損失函數的公式。

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

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

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

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

VII. 反向傳播(BP)

關於基於梯度的算法,剩下的唯一一件事就是如何計算梯度了。最快速的方法就是解析地給出每一個神經元架構的導數。我想,當梯度遇到神經網絡的時候,我不應該說這是一個瘋狂的想法。我們在前面定義的一個很簡單的神經網絡就已經相當艱難了,而它只有區區 6 個參數。而現代神經網絡的參數動輒就是數百萬。

第二種方法就是使用我們從微積分中學到的下面的這個公式去近似計算梯度,事實上這也是最簡單的方法。

儘管這個方法是非常容易實現的,但是它卻是非常耗計算資源的。

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

VI. 它爲什麼會起作用?

當我初次瞭解神經網絡以及它是如何工作的時候,我理解所有的方程,但是我不是十分確定它們爲啥會起作用。這個想法對我而言有些怪誕:用幾個函數,求一些導數,最終會得到一個能夠認出圖片中是貓還是狗。爲什麼我不能給你們一個很好的關於爲啥神經網絡會如此好的奏效的直覺知識呢?請注意以下兩個方面。

1. 我們想要用神經網絡解決的問題必須被以數學的形式表達出來。例如,對於對於貓狗鑑別:我們需要找到一個函數,它能夠把一副圖片中的所有像素作爲輸入,然後輸出圖片中的內容是狗的概率。你可以用這種方法去定義任何一個分類問題。

2. 或許並不是很清楚,爲什麼會有一個能夠從一副圖片中把貓和狗區分開來的函數。這裏的思想是:只要你有一些具有輸入和標籤的數據集,總會存在一個能夠在一個給定數據集上性能良好的函數。問題在於這個函數會相當複雜。這時候神經網絡就能夠有所幫助了。有一個「泛逼近性原理,universal approximation theorem」,指的是具有一個隱藏層的神經網絡可以近似任何一個你想要的的函數,你想要它近似得多好,就能有多好。

動量隨機梯度下降算法

-這是關於訓練神經網絡和機器學習模型優化算法系列的第二部分,第一部分是關於隨機梯度下降的。在這一部分,假定讀者對神經網絡和梯度下降算法已有基本瞭解。如果讀者對神經網絡一無所知,或者不知道神經網絡是如何訓練的,可以在閱讀這部分之前閱讀第一部分。

在本節中,除了經典的 SGD 算法外,我們還會對動量法進行討論,這種算法一般比隨機梯度下降算法更好更快。動量法 [1] 或具有動量的 SGD 是一種方法,這種方法有助於加速向量向着正確的方向梯度下降,從而使其收斂速度更快。這是最流行的優化算法之一,許多各方向上最先進的模型都是用這種方法進行訓練的。在講高級的算法相關方程之前,我們先來看一些有關動量的基礎數學知識。

指數加權平均

指數加權平均用於處理數字序列。假設我們有一些嘈雜的序列 S。在這個例子中,我繪製了餘弦函數並添加了一些高斯噪聲。如下圖所示:

注意,儘管這些點看起來非常接近,但它們的 x 座標是不同的。也就是說,對每個點而言,其 x 座標是唯一的標識,因此這也是定義序列 S 中每個點的索引。

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

動量——來自指數加權平均的數據

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

序列 V 是上面的散點圖中的黃色部分。Beta 是取值爲 0 到 1 的另一個超參數。在上述例子中,取 Beta = 0.9。0.9 是一個很好的值,經常用於具有動量的 SGD 方法。我們可以這樣對 Beta 進行直觀理解:我們對序列後面的 1 /(1- beta)的點進行近似平均。讓我們看看 beta 的選擇會對新序列 V 產生怎樣的影響。

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

如我們所見,Beta 取值越小,序列 V 波動越大。因爲我們平均的例子更少,因此結果與噪聲數據更「接近」。隨着 Beta 值越大,比如當 Beta = 0.98 時,我們得到的曲線會更加圓滑,但是該曲線有點向右偏移,因爲我們取平均值的範圍變得更大(beta = 0.98 時取值約爲 50)。Beta = 0.9 時,在這兩個極端間取得了很好的平衡。

數學部分

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

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

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

將其進行合併,我們可以得到:

再對其進行簡化,可得:

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

最後要注意的是,第一次迭代得到的平均值會很差,因爲我們沒有足夠的值進行平均。我們可以通過使用序列 V 的偏差修正版而不是直接使用序列 V 來解決這一問題。

式中 b = beta。當 t 值變大時,b 的 t 次冪與零無法進行區分,因此不會改變 V 值。但是當 t 取值較小時,這個方程會產生較好的結果。但是因爲動量的存在使得機器學習過程穩定得很快,因此人們通常會懶得應用這一部分。

動量 SGD 法

我們已經定義了一種方法來獲得一些序列的「移動」平均值,該值會與數據一起變化。我們該如何將其應用於神經網絡的訓練中呢?它可以平均我們的梯度。我將在下文中解釋它是如何在動量中完成的這一工作,並將繼續解釋爲什麼它可能會得到更好的效果。

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

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

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

Nesterov 加速漸變

Nesterov 動量是一個版本略有不同的動量更新,最近越來越受歡迎。在這個版本中,首先會得到一個當前動量指向的點,然後從這個點計算梯度。如下圖所示:

Nesterov 動量可用下式定義:

動量工作原理

在這裏我會解釋爲什麼在絕大多數情況下動量法會比經典 SGD 法更好用。

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

另一個原因在於溝谷(ravine)。溝谷是一個區域,在其中,曲線在一個維度比另一個維度陡得多。在深度學習中,溝谷區可近似視爲局部最低點,而這一特性無法用 SGD 方法得到。SGD 傾向於在狹窄的溝谷上擺動,因爲負梯度將沿着陡峭的一側下降,而非沿着溝谷向最優點前進。動量有助於加速梯度向正確的方向前進。如下圖所示:

左圖——沒有動量的 SGD,右圖——有動量的 SGD(來源:https://www.willamette.edu/~gorr/classes/cs449/momrate.html)

結論

希望本節會提供一些關於具有動量的 SGD 方法是如何起作用以及爲什麼會有用的想法。實際上它是深度學習中最流行的優化算法之一,與更高級的算法相比,這種方法通常被人們更頻繁地使用。

參考資源

  • fast.ai(http://fast.ai/) :它針對程序員提供了兩個很不錯的關於深度學習的課程,以及一個關於可計算線性代數的課程。是開始編寫神經網絡代碼的好地方,隨着課程深度的延伸,當你學到更多理論的時候,你可以儘快用代碼實現。

  • neuralnetworksanddeeplearning.com(http://neuralnetworksanddeeplearning.com/chap1.html):一本關於基本知識的很好的在線書籍。關於神經網絡背後的理論。作者以一種很好的方式解釋了你需要知道的數學知識。它也提供並解釋了一些不使用任何深度學習框架從零開始編寫神經網絡架構的代碼。

  • Andrew Ng 的深度學習課程(https://www.coursera.org/specializations/deep-learning):coursera 上的課程,也是有關學習神經網絡的。以非常簡單的神經網絡例子開始,逐步到卷積神經網絡以及更多。

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

  • Stanford CS231 課程(http://cs231n.stanford.edu/):這是關於用於視覺識別的卷積神經網絡的課堂,可以學到很多關於深度學習和卷積神經網絡的具體內容。

參考文獻

[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/)

原文鏈接:

第一部分https://towardsdatascience.com/how-do-we-train-neural-networks-edd985562b73

第二部分 :Stochastic Gradient Descent with momentum (https://quip.com/tJ7sAxbyrwZg)

https://towardsdatascience.com/stochastic-gradient-descent-with-momentum-a84097641a5d

文章來源:機器之心