1.梯度消失
根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話,那么即使這個結果是0.99,在經過足夠多層傳播之后,誤差對輸入層的偏導會趨於0。
這種情況會導致靠近輸入層的隱含層神經元調整極小。
2.梯度膨脹
根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都大於1的話,在經過足夠多層傳播之后,誤差對輸入層的偏導會趨於無窮大。
這種情況又會導致靠近輸入層的隱含層神經元調整變動極大。
3. 梯度消失的原因詳細解釋
生物神經元似乎是用 Sigmoid(S 型)激活函數活動的,因此研究人員在很長一段時間內堅持 Sigmoid 函數。但事實證明,Relu 激活函數通常在 ANN 工作得更好。這是生物研究誤導的例子之一。
當神經網絡有很多層,每個隱藏層都使用Sigmoid函數作為激勵函數時,很容易引起梯度消失的問題
我們知道Sigmoid函數有一個缺點:當x較大或較小時,導數接近0;並且Sigmoid函數導數的最大值是0.25

我們將問題簡單化來說明梯度消失問題,假設輸入只有一個特征,沒有偏置單元,每層只有一個神經元:

我們先進行前向傳播,這里將Sigmoid激勵函數寫為s(x):
z1 = w1*x
a1 = s(z1)
z2 = w2*a1
a2 = s(z2)
...
zn = wn*an-1 (這里n-1是下標)
an = s(zn)
根據鏈式求導和反向傳播,我們很容易得出,其中C是代價函數

如果我們使用標准方法來初始化網絡中的權重,那么會使用一個均值為0標准差為1的高斯分布。因此所有的權重通常會滿足|wj|<1,而s‘是小於0.25的值,那么當神經網絡特別深的時候,梯度呈指數級衰減,導數在每一層至少會被壓縮為原來的1/4,當z值絕對值特別大時,導數趨於0,正是因為這兩個原因,從輸出層不斷向輸入層反向傳播訓練時,導數很容易逐漸變為0,使得權重和偏差參數無法被更新,導致神經網絡無法被優化,訓練永遠不會收斂到良好的解決方案。 這被稱為梯度消失問題。
4.梯度爆炸的原因
當我們將w初始化為一個較大的值時,例如>10的值,那么從輸出層到輸入層每一層都會有一個s‘(zn)*wn的增倍,當s‘(zn)為0.25時s‘(zn)*wn>2.5,同梯度消失類似,當神經網絡很深時,梯度呈指數級增長,最后到輸入時,梯度將會非常大,我們會得到一個非常大的權重更新,這就是梯度爆炸的問題,在循環神經網絡中最為常見。
5.解決辦法
梯度消失和梯度爆炸問題都是因為網絡太深,網絡權值更新不穩定造成的,本質上是因為梯度反向傳播中的連乘效應。解決梯度消失、爆炸主要有以下幾種方法:
(1) pre-training+fine-tunning
此方法來自Hinton在2006年發表的一篇論文,Hinton為了解決梯度的問題,提出采取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成后,再對整個網絡進行“微調”(fine-tunning)。此思想相當於是先尋找局部最優,然后整合起來尋找全局最優,此方法有一定的好處,但是目前應用的不是很多了。
(2) 梯度剪切:對梯度設定閾值
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然后更新梯度的時候,如果梯度超過這個閾值,那么就將其強制限制在這個范圍之內。這可以防止梯度爆炸。
(3) 權重正則化
另外一種解決梯度爆炸的手段是采用權重正則化(weithts regularization),正則化主要是通過對網絡權重做正則來限制過擬合。如果發生梯度爆炸,那么權值就會變的非常大,反過來,通過正則化項來限制權重的大小,也可以在一定程度上防止梯度爆炸的發生。比較常見的是 L1 正則和 L2 正則,在各個深度框架中都有相應的API可以使用正則化。
(4) 選擇relu等梯度大部分落在常數上的激活函數
relu函數的導數在正數部分是恆等於1的,因此在深層網絡中使用relu激活函數就不會導致梯度消失和爆炸的問題。
(5) batch normalization
BN就是通過對每一層的輸出規范為均值和方差一致的方法,消除了權重參數放大縮小帶來的影響,進而解決梯度消失和爆炸的問題,或者可以理解為BN將輸出從飽和區拉倒了非飽和區。
(6) 殘差網絡的捷徑(shortcut)

相比較於以前直來直去的網絡結構,殘差中有很多這樣(如上圖所示)的跨層連接結構,這樣的結構在反向傳播中具有很大的好處,可以避免梯度消失。
(7) LSTM的“門(gate)”結構
LSTM全稱是長短期記憶網絡(long-short term memory networks),LSTM的結構設計可以改善RNN中的梯度消失的問題。主要原因在於LSTM內部復雜的“門”(gates),如下圖所示。

LSTM 通過它內部的“門”可以在接下來更新的時候“記住”前幾次訓練的”殘留記憶“。
參考:
https://blog.csdn.net/junjun150013652/article/details/81274958
