30分鐘講清楚深度神經網路

m53469發表於2021-09-09

這兩年神經網路各種火。但對很多人而言,只是聽著覺得各種高大上,究其本質,還是聽不懂。下面我們花三十分鐘把這個事情講清楚。

神經網路演算法是最早來源於某神經生理學家和某數學家聯合發表的一篇論文,他們對人類神經執行規律的提出了一個猜想,並嘗試給出一個建模來模擬人類神經元的執行規律。

神經網路一開始由於求解問題的不穩定,以及範圍有限被拋棄。後面又在各個大神的努力下,對遇到的問題一個個解決,加上因為遊戲帶來的計算能力的提升獲得了一個爆發式的增長。

下面我們講講神經網路是啥以及遇到的問題和探索出來的解決方案,最終我們給出一個深度神經網路的預設的最優配置項。

神經網路是啥

建立M個隱藏層,按順序建立輸入層跟隱藏層的聯結,最後建立隱藏層跟輸出層的聯結。為每個隱藏層的每個節點選擇啟用函式。求解每個聯結的權重和每個節點自帶的bias值。參見下圖。

圖片描述

nn示例.png

所謂啟用函式就是對各個路徑的輸入求和之後進一步增強的函式
典型的有如下幾個:

圖片描述

簡單啟用2.png

神經網路訓練的本質

一題道出本質

下面這個圖裡面,是已知的各個聯結線的權值,求y1, y2

圖片描述

nn題目.png

這個練習可以測試對神經網路的理解。

答案是 y1 = 46,   y2 = 0

其實就是權值乘以輸入值加上偏差值之後,再透過啟用函式對結果進行一次處理,得出的輸出就是該節點最終的結果。

所以,Layer 1中的Neuron 1的值為 n1 = max(3 * 1 + 4 * (-1) + 9, 0) = 8。

Neuron 2的值為 n2 = max(3 * 2 + 4 * 0 + (-3), 0) = 3。

Layer 2中的Neuron 3 值為 n3 = max(n1 * 4 + n2 * 3 + 5, 0) = 46。

Neuron 4的值為 n4 = max(n1 * (-2) + n2 * 1 + 0, 0) = 0。

所謂神經網路問題的訓練本質,就是已知 y1,y2....yn, 已知x1, x2....xm,求解每個連線的權值和每個神經元上的偏差值。對單層的啟用函式為RELU的神經網路而言就是, y = max(sum(w * x)+b, 0),已知y和x,求解w和b。

訓練的方法

對於以上求解w和b的值,科學家們發現可以透過反向傳播和梯度下降相結合來求解。就是一開始用隨機數初始化我們每個聯結的權值,然後透過神經網路計算出來的y值跟真實的y值做比對。如果這個值相差比較大,則修改當前層的聯結的權重。當發現這個值相差不大時,則修改更低一層的權重。這個步驟一直重複,逐步傳遞到第一層的權值

神經網路求解遇到的問題

三大問題:

  • 神經網路的原生問題:求解時會遇到梯度消失或者梯度爆炸

  • 效能,訓練太慢

  • 過擬合

針對這三個問題,大拿們開始了一場探索之旅。

梯度消失或爆炸的解決方案

神經網路的求解是透過反向傳播的技術來解決的。透過梯度下降法。問題是,反向傳播從輸出層開始一步一步傳到Layer 1時,越到低層,聯結的權值變化越小,直到沒變化。這種叫梯度消失。還有一些呢?則是越到第一層,變化越來越大。這種叫梯度爆炸。常見於RNN。

解決方案探索如下:

  1. 聯結權重的初始化放棄完全隨機的方式,而是要使用特定的標準差。有He initialization和Xavier initialization

  2. 使用ReLU作為啟用函式。後面發現ReLU裡面某些神經元會變成0(Dying ReLU的問題),這個時候又演化出 LReLU,RReLU和PReLU以及ELU這些變種。一般來說,啟用函式的選擇優先順序有 ELU > leaky ReLu(包括LReLU,RReLU,PReLU) > ReLU > tanh > sigmoid

  3. Batch Normalization。就是在每層都對輸入的X進行轉化,變成以0為中心的分佈。最終求解同時要求出每層用來scale的引數應該是多少。

  4. Gradient Clipping。就是在反向傳播的過程中限制梯度不超過某個閾值。如果超過就減去相應的閾值。

目前來說,通常用1+2 多於 3 多於 4。就是現在一般使用He initialization跟ReLU的演進版本作為作為啟用函式來解決梯度消失和爆炸的問題,其次才使用Batch Normalization,最後使用Gradient Clipping。

效能問題的解決方案

通常來說,我們很難獲得足夠的標記好的訓練資料。常用解決方案如下:

  1. 複用已有的訓練好的網路。通常可以找到已經訓練好的模型的地方有  

  2. unsupervised pretraining。對無標籤的訓練資料,直接執行類似於autoencoders之類的演算法。這種演算法類似於聚類,可以提取出輸入資料裡面較為核心的特徵出來。透過這樣一步一步生成每一個隱藏層。最後再用有標籤的資料來訓練最終的網路。

對於大規模資料的訓練,很多時候速度很慢。除了解決梯度消失或爆炸的問題之外,還有使用AdamOptimizer替代GradientDescentOptimizer會大大加快收斂速度

過擬合的解決方案

  1. early stopping。一旦發現在驗證集合上效能下降,立即停止訓練

  2. 在cost function上新增L1 L2 Regularization。所謂L1 L2的Regularization就是新增對模型複雜度的懲罰項。模型用到的聯結線權值越大,懲罰越大。這樣模型的最佳化目標就不僅僅是要預測偏差儘量小,同時還要預測所使用的模型儘量簡單。

  3. 使用Dropout。就是每次隨機選擇一些神經元不參與訓練,只有在預測的時候這些神經元才生效。這個神經元的輸出結果要乘以一個機率值。降低貢獻。其實這種就有點類似於降低了神經元之間的依賴性。原來是每個聯結的神經元都參與計算的。現在是隨機失效了。這種技術竟然可以穩定的為神經網路的能力提升2%!

  4. max-norm regularization。就是限制每個神經元的聯結的weight的 l2 Regularization在一個閾值內。

  5. 資料補充。其實就是對已有的訓練資料做一定的變換,用來做訓練。提升模型泛化能力

一個神經網路的預設最優配置

Initialization Activation function Normalization Regularization Optimizer
He Initialization ELU Batch Normalization Dropout AdamOptimizer

我們後面會教大家用tensorflow構造出一個神經網路並求解。



作者:墨家鉅子
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2819/viewspace-2817844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章