[Deep Learning] 神經網路基礎

Poll的筆記發表於2016-06-19

本文是UPC Deep Learning Course總結翻譯系列的第一篇,主要課程內容是神經網路的基礎內容。講義原文參考:Feedforward Nets and Conv Nets (lecturer: Dario Garcia)
本系列更多文章傳送門:第二篇 [Deep Learning] 卷積神經網路 CNNs;第三篇 [Deep Learning] 整合學習Ensemble Learning&遷移學習Transfer Learning ;第四篇 [ [Deep Learning] 遞迴神經網路RNN ](https://www.jianshu.com/p/5c22b41e9f07)。

本文對人工神經網路(Artificial Neural Networks)的主要內容進行簡要介紹,感興趣部分可根據參考論文進行詳細學習。

神經網路發展緣起 A Bit of History

人工神經網路領域的第一篇論文誕生於1943年,由Warren McCulloch和Walter Pitts發表[1]。在這篇論文中兩人試圖解釋大腦是如何使用神經元這一簡單的處理單元來計算高度複雜的行為,並設計了多輸入權重的單個神經元模型來模擬人類神經元。

感知器 Rosenblatt’s Perceptron

1958年,Frank Rosenblatt基於McCulloch和Walter Pitts的神經元理論提出感知器演算法[2],感知器是一個將實值輸入對映為0/1輸出的二元分類器。


  • (其中,w是權重向量,b是偏移常量)

Rosenblatt在 “Mark I Perceptron”[3]中首次實踐採用了感知器演算法。“Mark I Perceptron”是一個由400個光敏感受器組成的視覺分類器,與512個步進電機相關聯,輸出8個神經元[3]。它僅僅包含一層可訓練的引數,關於這一感知器的更多細節可參考[4][5]

2764802-acc361aa37c55123.png
Mark I Perceptron

Rosenblatt在一系列出版物中承認他的感知器存在侷限性,與此同時,Minsky和Papert出版了“Perceptrons: an introduction to computational geometry”一書,詳細介紹了感知器的侷限性[6]。 Minsky和Papert的工作對公眾產生了巨大影響,儘管很少有人真正理解他們研究的本質。 簡言之,Minsky和Papert認為對於某些基本問題,例如異或問題,單層網路不能滿足需求,然而當時並沒有適合多層網路進行訓練的演算法,因此70年代人工神經網路的資金開始大幅減少直至80年代中期,在人工神經網路幾乎被放棄之後,人工智慧研究的重點開始轉向“專家系統”,雖然這些系統在90年代也將遭遇自己的“人工智慧寒冬”。

2764802-2545868355540c91.png
單層神經網路只能解決線性問題
反向傳播和隨機梯度下降 Backpropagation and Stochastic Gradient Descent

1974年,Werbos提出了針對多層神經網路訓練的反向傳播演算法[7]。1985年,Rumelhart,Geoffrey E. Hinton和Williams重新發現該演算法[8]並使其獲得廣泛關注,重新引發了人們對於人工神經網路的研究興趣,“AI寒冬”時期結束。

要訓練多層神經網路,首先從輸入開始正向傳遞直至到達網路的最後一層,然後將神經網路預測的輸出標籤與標定正確的真實資料標籤(the ground truth label)進行比較,並使用損失函式計算誤差,通過找到損失函式最小化的最佳梯度(儘管是偏導數)更新網路最末端一層的權重。然後,應用鏈式規則反向傳播,通過將前一層本地計算的梯度與向前傳遞的梯度相乘,得出那些不直接與輸出層相連的隱層的輸入值使得損失函式最小化的梯度,如下面的計算圖所示。當需要手動推導計算反向傳播演算法時,簡單實用的方法是繪製計算圖(computing graph)再代入數值。


2764802-a15dfca35c9d45d1.JPG
反向傳播使用的鏈式規則

權重根據梯度方向進行優化,具體調整的變化值通常使用隨機梯度下降(SGD)演算法進行計算。 SGD使用整個資料集的子集(mini-batch SGD)而不是完整的資料集迭代估計優化的最佳方向,因為整個資料集可能非常大,因而是隨機的梯度下降並不能保證每一步都是最優方向。除SGD演算法外,還有其他替代方案可用於計算權重的變化值進行權重優化,我們將在“適應性學習方法”一節中進行介紹。

對感知器和反向傳播演算法等神經網路的系統學習有興趣可進一步閱讀其他相關文章資源[9],包括反向傳播演算法的詳細數學解釋[10]、以一組資料為例計算反向傳播演算法各步驟執行結果[11]以及瞭解反向傳播演算法背後實現原理對解決梯度消失、死亡ReLU單元和RNN梯度爆炸等問題的幫助[12],關於演算法的一步步導數的數學推導解釋可參考[13],也可學習Stanford CS231n:Convolutional Neural Networks for Visual Recognition課程的相關內容。

伴隨著新的訓練方法的出現,ANN的研究重新活躍起來。1989年,Yann LeCun,現任Facebook人工智慧研究院院長,使用美國郵政局提供的資料開發了一個數字識別系統[14],首次展示瞭如何使用人工神經網路解決複雜的實際問題。LeCun的系統包含一層卷積神經元,基於1980年Fukushima提出的用於視覺模式識別的層次神經網路[15],這是目前卷積神經網路的雛形。

啟用函式 Activation Functions

人工神經網路的每個神經元使用啟用函式來確定多個權重輸入對應的輸出結果。Rosenblatt的感知器使用最簡單的二元函式,如果則啟用,輸出1,否則不啟用。如今我們可以選擇其他更復雜的非線性啟用函式,非線性啟用函式使得神經網路能夠對非線性模式進行學習。常用的啟用函式包括[16]

  • Sigmoid函式:
2764802-51b990191199b868.png
Sigmoid函式
  • Tanh函式:
2764802-bf62446eff44e8e8.png
Tanh函式
  • 修正線性單元/整流線性單元(The Rectified Linear Unit):

2764802-983c5e42b69a3562.jpeg
ReLU

目前,ReLU是大多數情況下預設使用的啟用函式,它使用固定的斜率避免了梯度消失問題[17],梯度消失的主要問題是當使用Sigmoid和Tanh這類將大範圍的輸入擠到[0,1]或[-1,1]小範圍輸出區間的啟用函式時,隨著神經網路誤差的反向傳播,前層的權重變化對輸出結果的影響越來越小直至梯度為零終止學習。

然而,ReLU單位在訓練期間可能“死亡”。例如,流過ReLU神經元的大梯度可能導致權重的更新使得神經元無法在任何資料上啟用。如果發生這種情況,那麼流經該單元的梯度將從該點開始永遠為零。也就是說,ReLU單元在訓練期間不可逆轉地死亡,可以從資料流中被淘汰。例如,如果學習率設定得太高,可能會發現多達網路中40%的神經元可能“死亡”。通過適當設定學習率可以解決該問題。關於啟用函式可進一步學習Stanford CS231n課程的相關內容[18]神經網路的優化的研究思路可從啟用函式優化入手,例如針對手機應用ReLU啟用函式時對非飽和區進行優化以大幅提升神經網路效能。

  • Leaky ReLU:
    Leaky ReLU試圖解決dying ReLU問題,當x <0時,函式不是零,而將具有小的負斜率(大約為0.01)。
2764802-240e9852b48c41c6.png
Leaky ReLU
  • Maxout:
    ReLU和Leaky ReLU都是這一函式的特例,例如ReLU對應w1,b1=0。
訓練引數 Training Parameters
  1. 訓練次數(Epochs)和批次大小(Batch Size)
  • Epoch對應訓練集的所有影象都訓練被一次的階段,通常,ANN訓練需要許多次,因為每個輸入例項將網路引數指引向不同方向,並且網路能夠在受到其他例項訓練影響後對之前訓練過的例項再次訓練,從同一示例中不止一次地學習。通常,當epoch次數過多,網路最終將過擬合。過擬合可以通過訓練集上的損失降低同時測試集上損失開始上升來識別。

  • 批次大小定義了在單次網路前向和反向傳播過程中的輸入例項的數量,是網路能夠“一起看到”的輸入數量。批次大小的範圍從1到完整資料集大小。較大的批次大小能夠更快地訓練,但可能會降低精確度[19]。批次大小太小可以通過損失函式的噪聲[20]來識別,即某一批次的損失與下一批次是否顯著不同。當批次大小越小時擺動越明顯,當批次大小等於資料集大小時噪聲損失函式方差最小(除非學習率太高,在這種情況下網路無法收斂)。最常用的批次大小為16和32。

2764802-a1a7ea188115709d.jpeg
在CIFAR-10資料集上訓練小型網路時,典型損失函式隨時間變化的示例
  1. 學習率
  • 學習率定義了每一步權重優化時的調整比例。通常,使用完全導數(學習率為1)會導致過度修正,學習率太大可能使得神經元在定義的高維空間內產生大的“跳躍”,從而無法收斂。學習率太小會使朝著最佳權重調整的步幅太小,訓練時間過長[21]較好的選擇是從較小的學習速率開始使權重調整走向正確的方向,然後逐漸增大以加快收斂。在訓練期間跟蹤的首先是loss,因為它在前向傳遞期間在各個批次上被評估。繪製不同學習率下loss隨時間的變化可以幫助我們更好地瞭解學習率的選擇。
2764802-87f6b5b0d28be8b6.jpeg
關於大小學習率的行為對比

2764802-b6389ed23b116b48.jpeg
描繪不同學習率影響
  1. 其他引數
    還有許多其他引數可能會影響學習過程,包括:
  • 權重衰減:每次更新後,權重會乘以一個0到1之間的因子。這是一種正則化的式。
  • 權重初始化:訓練開始前的初始權重和偏差值bias是訓練結果的關鍵。針對ReLU啟用函式的神經元,其權重初始化通常使用隨機數並使用來平衡方差[22],而bias通常直接初始化為零。
w = np.random.randn(n) * sqrt(2.0/n)
  • 動量:增加動量項能夠使得SGD能夠跳出區域性最小值(local minima)和鞍點(saddle point),加快在鞍點附近梯度緩慢處的前進。此外,增加動量項還能解決使用SGD時的Poor Conditioning:當損失函式在一個方向上改變很快而在另一方向改變很慢,使用普通SGD會出現在變化敏感方向上的鋸齒跳動,這種情況在高維下很常見。動量項將先前權重更新的一小部分新增到當前權重更新中。如果兩次更新在同一方向則會加快收斂,而更新在不同方向上時則會平滑方差,從而能夠儘快結束這種情況下的曲折前進(Zigzagging)。


    2764802-3587411424fdb3df.png
    Poorly Condition
  1. 普通SGD(Vanilla update):

    (梯度為損失函式下降的方向)
  2. 動量SGD(Momentum update):增加速度值(velocity)初始化為0

    (rho表示摩擦friction,通常設為0.9或0.99)
  3. Nesterov動量:



    2764802-6934264f43c3bcc5.png
    動量方法對比

關於如何優化這些引數的幾個技巧,可參考Stanford cs231n超引數優化部分[20]

適應性學習方法 Adaptative Learning Methods

SGD學習方法對學習率,動量,權量衰減等諸多引數的調參挑戰促使了其他自動化調參學習方法的出現。其中,廣受歡迎的方法有Adagrad,Adadelta,RMSprop和Adam。關於這些適應性學習方法的詳細介紹參見梯度下降的優化內容[23]

  • Adagrad: 記錄所有梯度的平方和,使得能夠在較緩的維度上除以一個較小值進行加速而在較陡的維度上除以一個較大值從而減速。但由於梯度的平方和越來越大,步幅會越來越小,可能會停在鞍點處無法出來,因而Adagrad只適用於卷積層的學習。


  • RMSprop: RMSprop在Adagrad基礎上進行小幅改動,對梯度的平方和進行衰減,衰減率(decay rate)通常設為0.9或0.99。


  • Adam: Adam結合了上述兩種方法和動量項,最為常用。


    2764802-68b1d2ce8de769d4.png
    Adam演算法
2764802-095af8d000b40006.gif
不同演算法在鞍點處的行為比較

2764802-bcf6bb5a5a8862f1.gif
不同演算法在損失平面等高線上隨時間的變化情況
正則化方法 Regularization Methods

網路的學習能力由其權重數量和深度定義。深層架構通常有數百萬引數(AlexNet有60M引數,VGG16有138M引數),其中大量引數來自全連線層,因為卷積層通過權重共享能夠大大減少它們的數量。一個具有4,096個神經元的全連線層加上輸入層的4,096個神經元就將包含16M引數(4,096 x 4,096)。具有如此多引數的模型對任何訓練資料集都很容易過擬和,因為它具有很強的記憶它的能力。為避免過擬合問題,用於深度架構的正則化方法被提出,常用的正則化方法包括:

  • L1 / L2正則化:該方法試圖通過對每個權重的平方增加懲罰(將項加入到loss函式中)來避免權重尖峰值的影響。
2764802-5f352a8a37140e83.png
L1/L2正則化
  • Dropout [24]:該方法在訓練期間以一定的概率設定部分神經元為0,在全連線層上簡單有效。Dropping概率p通常設為0.5,但dropout會導致輸出結果隨機,因此在測試時,根據概率計算的平均結果我們需要將啟用函式乘以dropping概率進行伸縮作為最終結果,或在訓練時的dropout mask步驟直接除以dropping概率。
  • 批標準化[25]:該方法對每批次輸入的均值和方差進行標準化,通常用在全連線層之後。它既可以作為正則化方法,也可以解決與權重初始化相關的問題,同時也可以加速收斂。
  • 層標準化[26]:該方法類似於批標準化,但均值和方差是在每層計算的。這對於批標準化不能直接應用的RNN和完全連線層十分有用,但不適用卷積層。它可以比批標準化更快地加速收斂。
  • Data Augmentation資料增量:對同一張圖片進行隨機剪下、伸縮旋轉、水平變換、改變亮度對比度、透鏡畸變等操作後作為輸入資料對網路進行訓練。
2764802-a6e4775903391f65.png
資料大小變換

2764802-a14f3b7d6a931413.png
資料色彩變換
  • Dropconnect:將權重矩陣中的某些值隨機設為0,丟棄某些連線。
  • Fractional Max Pooling:採用不同的pooling區域並在測試時固定平均。
  • Stochastic Depth:在訓練深度非常深的網路時隨機丟棄某些層,在測試時再恢復全部使用。

批標準化和層標準化、Dropout方法以及資料增量本質都是通過在訓練階段增加某些隨機性然後在測試時進行估計將隨機性平均化從而實現正則化[27]

參考文獻


  1. McCulloch, Warren S., and Walter Pitts. “A logical calculus of the ideas immanent in nervous activity.” The bulletin of mathematical biophysics 5.4 (1943): 115-133.

  2. Rosenblatt, Frank. “The perceptron: A probabilistic model for information storage and organization in the brain.” Psychological review 65.6 (1958): 386

  3. Mark I Perceptron Operators’ Manual

  4. Kurzweil, Ray. How to create a mind: The secret of human thought revealed. Penguin, 2013.

  5. http://www.andreykurenkov.com/writing/a-brief-history-of-neural-nets-and-deep-learning/

  6. https://en.wikipedia.org/wiki/Perceptrons_(book)

  7. Webos, Paul John. “Beyond regression: New tools for prediction and analysis in the behavioral sciences.” Doctoral Dissertation, Applied Mathematics, Harvard University (1974)

  8. Rumelhart, David E., Geoffrey E. Hinton, and Ronald J. Williams. Learning internal representations by error propagation. No. ICS-8506. California Univ San Diego La Jolla Inst for Cognitive Science, 1985.

  9. http://www.andreykurenkov.com/writing/a-brief-history-of-neural-nets-and-deep-learning/

  10. http://neuralnetworksanddeeplearning.com/chap2.html

  11. https://becominghuman.ai/back-propagation-is-very-simple-who-made-it-complicated-97b794c97e5c

  12. https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b

  13. https://medium.com/@erikhallstrm/backpropagation-from-the-beginning-77356edf427d

  14. LeCun, Yann, et al. “Backpropagation applied to handwritten zip code recognition.” Neural computation 1.4 (1989): 541-551.

  15. Fukushima, Kunihiko. “Neocognitron: A hierarchical neural network capable of visual pattern recognition.” Neural networks 1.2 (1988): 119-130.

  16. https://medium.com/the-theory-of-everything/understanding-activation-functions-in-neural-networks-9491262884e0

  17. https://www.quora.com/What-is-the-vanishing-gradient-problem

  18. http://cs231n.github.io/neural-networks-1/#actfun

  19. https://github.com/fchollet/keras/issues/68

  20. http://cs231n.github.io/neural-networks-3/

  21. https://www.linkedin.com/pulse/gradient-descent-simple-words-parth-jha

  22. https://arxiv.org/abs/1502.01852

  23. http://ruder.io/optimizing-gradient-descent/

  24. Srivastava Nitish, Geoffrey E. Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov. “Dropout: a simple way to prevent neural networks from overfitting.” Journal of Machine Learning Research 15.1 (2014): 1929-1958.

  25. Ioffe, Sergey, and Christian Szegedy. “Batch normalization: Accelerating deep network training by reducing internal covariate shift.” International Conference on Machine Learning. 2015.

  26. Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. “Layer normalization.” arXiv preprint arXiv:1607.06450 (2016).

  27. http://cs231n.github.io/neural-networks-2/

相關文章