梯度消失、梯度爆炸及其表現和解決方法

一、梯度消失

梯度消失出現的原因:

在深層網絡中,如果激活函數的導數小於1,根據鏈式求導法則,靠近輸入層的參數的梯度因爲乘了很多的小於1的數而越來越小,最終就會趨近於0,例如sigmoid函數,其導數f′(x)=f(x)(1−f(x))的值域爲(0,1/4),極易發生這種情況。
所以梯度消失出現的原因經常是因爲網絡層次過深,以及激活函數選擇不當,比如sigmoid函數。

梯度消失的表現:

模型無法從訓練數據中獲得更新,損失幾乎保持不變。

二、梯度爆炸

梯度爆炸出現的原因:

同梯度消失的原因一樣,求解損失函數對參數的偏導數時,在梯度的連續乘法中總是遇上很大的絕對值,部分參數的梯度因爲乘了很多較大的數而變得非常大,導致模型無法收斂。
所以梯度爆炸出現的原因也是網絡層次過深,或者權值初始化值太大

梯度爆炸的表現:

(1)模型型不穩定,更新過程中的損失出現顯著變化。
(2)訓練過程中,模型損失變成 NaN。

三、梯度消失爆炸的解決方法:

  • 重新設置網絡結構,減少網絡層數,調整學習率(消失增大,爆炸減小)。
  • 預訓練加微調
    • 此方法來自Hinton在2006年發表的一篇論文,Hinton爲了解決梯度的問題,提出採取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作爲輸入,而本層隱節點的輸出作爲下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網絡進行“微調”(fine-tunning)。Hinton在訓練深度信念網絡(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP算法對整個網絡進行訓練。此思想相當於是先尋找局部最優,然後整合起來尋找全局最優,此方法有一定的好處,但是目前應用的不是很多了。
  • 激活函數採用relu,leaky relu,elu等。
  • batch normalization
  • 更換參數初始化方法(對於CNN,一般用xavier或者msra的初始化方法)
  • 調整深度神經網絡的結構
  • 使用殘差模塊,DESNET模塊或LSTM等結構(避免梯度消失)
  • l1、l2正則化(避免梯度爆炸)
  • 減小學習率、減小batch size(避免梯度爆炸)
  • 梯度裁剪(避免梯度爆炸)
    • 對於RNN,加入gradient clipping,每當梯度達到一定的閾值,就把他們設置回一個小一些的數字;

擴展:

loss突然變nan的原因?

可能原因:
1、training sample中出現了髒數據,或輸入數據未進行歸一化
2、學習速率過大,梯度值過大,產生梯度爆炸;
3、在某些涉及指數計算,可能最後算得值爲INF(無窮)(比如不做其他處理的softmax中分子分母需要計算exp(x),值過大,最後可能爲INF/INF,得到NaN,此時你要確認你使用的softmax中在計算exp(x)做了相關處理(比如減去最大值等等));
4、不當的損失函數(尤其是自定義的損失函數時);
5、在卷積層的卷積步伐大於卷積核大小的時候。

現在的網絡普遍採用ReLU激活函數,爲什麼仍然存在梯度爆炸和消失的問題呢?

梯度消失和 梯度爆炸在relu下都存在, 隨着 網絡層數變深, activations傾向於越大和越小的方向前進, 往大走梯度爆炸(回想一下你在求梯度時, 每反向傳播一層, 都要乘以這一層的activations), 往小走進入死區, 梯度消失。 這兩個問題最大的影響是,深層網絡難於converge。BN和xavier初始化(經指正, 這裏最好應該用msra初始化, 這是he kaiming大神他們對xavier的修正, 其實就是xavier多除以2)很大程度上解決了該問題。sigmoid不存在梯度爆炸, 在activations往越大越小的方向上前進時, 梯度都會消失。
ReLU的負半軸梯度爲0,所以有時候(比較少見)也還是會梯度消失,這時可以使用PReLU替代,如果用了PReLU還會梯度彌散和爆炸,請調整初始化參數,對自己調參沒信心或者就是懶的,請直接上BN。至於sigmoid爲什麼會有梯度消失現象,是因爲sigmoid(x)在不同尺度的x下的梯度變化太大了,而且一旦x的尺度變大,梯度消失得特別快,網絡得不到更新,就再也拉不回來了。

參考網址:
訓練深度學習網絡時候,出現Nan是什麼原因,怎麼才能避免?
梯度消失和梯度爆炸原因,表現,解決方案
警惕!損失Loss爲Nan或者超級大的原因
知乎:訓練神經網絡循環3000次後,交叉熵損失爲nan原因?
詳解機器學習中的梯度消失、爆炸原因及其解決方法
梯度消失,梯度爆炸及表現
知乎:怎麼理解梯度彌散和梯度爆炸呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章