CS231n課程筆記翻譯:神經網路筆記1(下)

譯者註:本文智能單元首發,譯自斯坦福CS231n課程筆記Neural Nets notes 1,課程教師Andrej Karpathy授權翻譯。本篇教程由杜客翻譯完成,李藝穎和堃堃進行校對修改。譯文含公式和代碼,建議PC端閱讀。

原文如下

內容列表:

  • 不用大腦做類比的快速簡介
  • 單個神經元建模
    • 生物動機和連接
    • 作為線性分類器的單個神經元
    • 常用的激活函數
  • 神經網路結構 譯者註:下篇翻譯起始處
    • 層組織
    • 前向傳播計算例子
    • 表達能力
    • 設置層的數量和尺寸
  • 小節
  • 參考文獻

神經網路結構

靈活地組織層

將神經網路演算法以神經元的形式圖形化。神經網路被建模成神經元的集合,神經元之間以無環圖的形式進行連接。也就是說,一些神經元的輸出是另一些神經元的輸入。在網路中是不允許循環的,因為這樣會導致前向傳播的無限循環。通常神經網路模型中神經元是分層的,而不是像生物神經元一樣聚合成大小不一的團狀。對於普通神經網路,最普通的層的類型是全連接層(fully-connectednlayer。全連接層中的神經元與其前後兩層的神經元是完全成對連接的,但是在同一個全連接層內的神經元之間沒有連接。下面是兩個神經網路的圖例,都使用的全連接層:

————————————————————————————————————————

左邊是一個2層神經網路,隱層由4個神經元(也可稱為單元(unit))組成,輸出層由2個神經元組成,輸入層是3個神經元。右邊是一個3層神經網路,兩個含4個神經元的隱層。注意:層與層之間的神經元是全連接的,但是層內的神經元不連接。

————————————————————————————————————————

命名規則。當我們說N層神經網路的時候,我們沒有把輸入層算入。因此,單層的神經網路就是沒有隱層的(輸入直接映射到輸出)。因此,有的研究者會說邏輯回歸或者SVM只是單層神經網路的一個特例。研究者們也會使用人工神經網路(Artificial NeuralnNetworks 縮寫ANN)或者多層感知器(Multi-Layer Perceptrons 縮寫MLP)來指代神經網路。很多研究者並不喜歡神經網路演算法和人類大腦之間的類比,他們更傾向於用單元(unit)而不是神經元作為術語。

輸出層。和神經網路中其他層不同,輸出層的神經元一般是不會有激活函數的(或者也可以認為它們有一個線性相等的激活函數)。這是因為最後的輸出層大多用於表示分類評分值,因此是任意值的實數,或者某種實數值的目標數(比如在回歸中)。

確定網路尺寸。用來度量神經網路的尺寸的標準主要有兩個:一個是神經元的個數,另一個是參數的個數,用上面圖示的兩個網路舉例:

  • 第一個網路有4+2=6個神經元(輸入層不算),[3x4]+[4x2]=20個權重,還有4+2=6個偏置,共26個可學習的參數。
  • 第二個網路有4+4+1=9個神經元,[3x4]+[4x4]+[4x1]=32個權重,4+4+1=9個偏置,共41個可學習的參數。

為了方便對比,現代卷積神經網路能包含約1億個參數,可由10-20層構成(這就是深度學習)。然而,有效(effective)連接的個數因為參數共享的緣故大大增多。在後面的卷積神經網路內容中我們將學習更多。

前向傳播計算舉例

不斷重複的矩陣乘法與激活函數交織。將神經網路組織成層狀的一個主要原因,就是這個結構讓神經網路演算法使用矩陣向量操作變得簡單和高效。用上面那個3層神經網路舉例,輸入是[3x1]的向量。一個層所有連接的強度可以存在一個單獨的矩陣中。比如第一個隱層的權重W1是[4x3],所有單元的偏置儲存在b1中,尺寸[4x1]。這樣,每個神經元的權重都在W1的一個行中,於是矩陣乘法np.dot(W1, x)就能計算該層中所有神經元的激活數據。類似的,W2將會是[4x4]矩陣,存儲著第二個隱層的連接,W3是[1x4]的矩陣,用於輸出層。完整的3層神經網路的前向傳播就是簡單的3次矩陣乘法,其中交織著激活函數的應用。

# 一個3層神經網路的前向傳播:nf = lambda x: 1.0/(1.0 + np.exp(-x)) # 激活函數(用的sigmoid)nx = np.random.randn(3, 1) # 含3個數字的隨機輸入向量(3x1)nh1 = f(np.dot(W1, x) + b1) # 計算第一個隱層的激活數據(4x1)nh2 = f(np.dot(W2, h1) + b2) # 計算第二個隱層的激活數據(4x1)nout = np.dot(W3, h2) + b3 # 神經元輸出(1x1)n

在上面的代碼中,W1,W2,W3,b1,b2,b3都是網路中可以學習的參數。注意x並不是一個單獨的列向量,而可以是一個批量的訓練數據(其中每個輸入樣本將會是x中的一列),所有的樣本將會被並行化的高效計算出來。注意神經網路最後一層通常是沒有激活函數的(例如,在分類任務中它給出一個實數值的分類評分)。

全連接層的前向傳播一般就是先進行一個矩陣乘法,然後加上偏置並運用激活函數。

表達能力

理解具有全連接層的神經網路的一個方式是:可以認為它們定義了一個由一系列函數組成的函數族,網路的權重就是每個函數的參數。如此產生的問題是:該函數族的表達能力如何?存在不能被神經網路表達的函數嗎?

現在看來,擁有至少一個隱層的神經網路是一個通用的近似器。在研究(例如1989年的論文Approximation by Superpositions of Sigmoidal Function,或者Michael Nielsen的這個直觀解釋。)中已經證明,給出任意連續函數f(x)和任意epsilon >0,均存在一個至少含1個隱層的神經網路g(x)(並且網路中有合理選擇的非線性激活函數,比如sigmoid),對於forall x,使得|f(x)-g(x)|<epsilon。換句話說,神經網路可以近似任何連續函數。

既然一個隱層就能近似任何函數,那為什麼還要構建更多層來將網路做得更深?答案是:雖然一個2層網路在數學理論上能完美地近似所有連續函數,但在實際操作中效果相對較差。在一個維度上,雖然以a,b,c為參數向量「指示塊之和」函數g(x)=sum_ic_i1(a_i<x<b_i) 也是通用的近似器,但是誰也不會建議在機器學習中使用這個函數公式。神經網路在實踐中非常好用,是因為它們表達出的函數不僅平滑,而且對於數據的統計特性有很好的擬合。同時,網路通過最優化演算法(例如梯度下降)能比較容易地學習到這個函數。類似的,雖然在理論上深層網路(使用了多個隱層)和單層網路的表達能力是一樣的,但是就實踐經驗而言,深度網路效果比單層網路好。

另外,在實踐中3層的神經網路會比2層的表現好,然而繼續加深(做到4,5,6層)很少有太大幫助。卷積神經網路的情況卻不同,在卷積神經網路中,對於一個良好的識別系統來說,深度是一個極端重要的因素(比如數十(以10為量級)個可學習的層)。對於該現象的一種解釋觀點是:因為圖像擁有層次化結構(比如臉是由眼睛等組成,眼睛又是由邊緣組成),所以多層處理對於這種數據就有直觀意義。

全面的研究內容還很多,近期研究的進展也很多。如果你對此感興趣,我么推薦你閱讀下面文獻:

  • Deep Learning的Chapter6.4,作者是Bengio等。
  • Do Deep Nets Really Need to be Deep?
  • FitNets: Hints for Thin Deep Nets

設置層的數量和尺寸

在面對一個具體問題的時候該確定網路結構呢?到底是不用隱層呢?還是一個隱層?兩個隱層或更多?每個層的尺寸該多大?

首先,要知道當我們增加層的數量和尺寸時,網路的容量上升了。即神經元們可以合作表達許多複雜函數,所以表達函數的空間增加。例如,如果有一個在二維平面上的二分類問題。我們可以訓練3個不同的神經網路,每個網路都只有一個隱層,但是每層的神經元數目不同:

————————————————————————————————————————

更大的神經網路可以表達更複雜的函數。數據是用不同顏色的圓點表示他們的不同類別,決策邊界是由訓練過的神經網路做出的。你可以在ConvNetsJS demo上練練手。

————————————————————————————————————————

在上圖中,可以看見有更多神經元的神經網路可以表達更複雜的函數。然而這既是優勢也是不足,優勢是可以分類更複雜的數據,不足是可能造成對訓練數據的過擬合。過擬合(Overfitting)是網路對數據中的雜訊有很強的擬合能力,而沒有重視數據間(假設)的潛在基本關係。舉例來說,有20個神經元隱層的網路擬合了所有的訓練數據,但是其代價是把決策邊界變成了許多不相連的紅綠區域。而有3個神經元的模型的表達能力只能用比較寬泛的方式去分類數據。它將數據看做是兩個大塊,並把個別在綠色區域內的紅色點看做雜訊。在實際中,這樣可以在測試數據中獲得更好的化(generalization)能力。

基於上面的討論,看起來如果數據不是足夠複雜,則似乎小一點的網路更好,因為可以防止過擬合。然而並非如此,防止神經網路的過擬合有很多方法(L2正則化,dropout和輸入噪音等),後面會詳細討論。在實踐中,使用這些方法來控制過擬合比減少網路神經元數目要好得多。

不要減少網路神經元數目的主要原因在於小網路更難使用梯度下降等局部方法來進行訓練:雖然小型網路的損失函數的局部極小值更少,也比較容易收斂到這些局部極小值,但是這些最小值一般都很差,損失值很高。相反,大網路擁有更多的局部極小值,但就實際損失值來看,這些局部極小值表現更好,損失更小。因為神經網路是非凸的,就很難從數學上研究這些特性。即便如此,還是有一些文章嘗試對這些目標函數進行理解,例如The Loss Surfaces of Multilayer Networks這篇論文。在實際中,你將發現如果訓練的是一個小網路,那麼最終的損失值將展現出多變性:某些情況下運氣好會收斂到一個好的地方,某些情況下就收斂到一個不好的極值。從另一方面來說,如果你訓練一個大的網路,你將發現許多不同的解決方法,但是最終損失值的差異將會小很多。這就是說,所有的解決辦法都差不多,而且對於隨機初始化參數好壞的依賴也會小很多。

重申一下,正則化強度是控制神經網路過擬合的好方法。看下圖結果:

————————————————————————————————————————

不同正則化強度的效果:每個神經網路都有20個隱層神經元,但是隨著正則化強度增加,它的決策邊界變得更加平滑。你可以在ConvNetsJS demo上練練手。

————————————————————————————————————————

需要記住的是:不應該因為害怕出現過擬合而使用小網路。相反,應該進儘可能使用大網路,然後使用正則化技巧來控制過擬合。

小結

小結如下:

  • 介紹了生物神經元的粗略模型;
  • 討論了幾種不同類型的激活函數,其中ReLU是最佳推薦;
  • 介紹了神經網路,神經元通過全連接層連接,層間神經元兩兩相連,但是層內神經元不連接;
  • 理解了分層的結構能夠讓神經網路高效地進行矩陣乘法和激活函數運算;
  • 理解了神經網路是一個通用函數近似器,但是該性質與其廣泛使用無太大關係。之所以使用神經網路,是因為它們對於實際問題中的函數的公式能夠某種程度上做出「正確」假設。
  • 討論了更大網路總是更好的這一事實。然而更大容量的模型一定要和更強的正則化(比如更高的權重衰減)配合,否則它們就會過擬合。在後續章節中我們講學習更多正則化的方法,尤其是dropout。


    參考資料

  • 使用Theano的deeplearning.net tutorial
  • ConvNetJS
  • Michael Nielsens tutorials

譯者反饋

  1. 轉載須全文轉載且註明原文鏈接,否則保留維權權利;
  2. 請知友們通過評論和私信等方式批評指正,貢獻者均會補充提及。

推薦閱讀:

大咖來信|李開復:美國AI見聞錄
神經網路知識基礎:七種網路單元,四種層連接方式
智能化「AI+」 對CUI的挑戰
李彥宏:人工智慧剛剛走到石器時代,但未來它會像電流一樣普遍

TAG:机器学习 | 人工智能 | 大数据分析 |