梯度彌散和梯度爆炸

1、現象介紹html

靠近輸出層的hidden layer 梯度大,參數更新快,因此很快就會收斂;算法

而靠近輸入層的hidden layer 梯度小,參數更新慢,幾乎就和初始狀態同樣,隨機分佈。網絡

這種現象就是梯度彌散(vanishing gradient problem)。框架

而在另外一種狀況中,前面layer的梯度經過訓練變大,然後面layer的梯度指數級增大,這種現象又叫作梯度爆炸(exploding gradient problem)。函數

總的來講,就是在這個深度網絡中,梯度至關不穩定(unstable)。學習

 

2、梯度消失與梯度爆炸緣由優化

首先,來看神經網絡更新梯度的原理,即反向傳播算法。(反向傳播算法請移步:https://www.cnblogs.com/CJT-blog/p/10419523.html)spa

經過反向傳播算法更新梯度的公式能夠看到,影響梯度更新的有,初始權重、激活函數、梯度流動方式、損失值過大等。.net

下面分別來一一進行介紹:orm

(1)初始權重帶來的影響:神經網絡權重初始化不當;

(2)激活函數帶來的影響:激活函數選擇不當;

(3)梯度流動方式帶來的影響:網絡結構自己的問題,如RNN;

(4)損失值過大帶來的影響:數據集的問題,如標註不許等。

下面,就來對這幾種狀況分別進行一一介紹。

 

3、各種緣由以及解決方法

一、神經網絡權重初始化不當

深度神經網絡訓練的時候,採用反向傳導的方式,其背後的本質是鏈式求導,計算每層梯度的時候會涉及到一些連乘操做。每一層的殘差都由後一層的殘差乘以兩層之間的權重矩陣,再乘以當前層的激活函數的導數獲得。所以,神經網絡權重的初始化相當重要,不當的初始化可能會帶來梯度消失或者梯度爆炸。

當網絡過深,若是連乘的因子大部分小於1,最後乘積可能趨於0;另外一方面,若是連乘的因子大部分大於1,最後乘積可能趨於無窮。這就是所謂的梯度消失與梯度爆炸。

防止因權重初始化不當帶來的梯度爆炸:

(1) 使用Xavier初始化法或者MSRA初始化法,使得在深度網絡的每一層,激活值都有很好的分佈。

(2) 使用預訓練模型,初始化已有網絡層的權重。

二、激活函數選擇不當

激活函數可移步:https://www.cnblogs.com/CJT-blog/p/10421822.html

sigmoid函數:

tanh函數:

若是選擇sigmoid 或者 tanh 函數,由它們的曲線能夠看出,當輸入很大或者很小的時候,飽和的神經元會帶來梯度消失。

防止因激活函數選擇不當帶來的梯度消失:

1.最常使用Relu,須要當心地調節學習速率(若是relu參數初始化不理想,前向計算結果爲負值,則進行梯度計算的時候所有變爲0,在反向計算的時候也會沒有響應);

2.偶爾可考慮Relu的變種,如Leaky Relu;

3.通常不使用sigmoid

三、神經網絡自己的結構問題,如RNN

 

RNN至關於把許多循環神經網絡單元鏈接成一個序列。能夠設想梯度流穿過,當咱們要計算關於h0的損失函數的梯度時,反向傳播須要通過RNN中的每個單元。每次反向傳播通過一個單元時,都要使用其中某一個W的轉置。

這意味着最終的表達式對h0梯度的表達式將會包含不少不少權重矩陣因子,這樣不斷對同一個值作乘法,是很是糟糕的。

在標量狀況下,要麼當這個值的絕對值大於1時,發生梯度爆炸;要麼當這個值的絕對值小於1時,發生梯度消失,直到爲0。既不發生梯度爆炸也不發生梯度消失,也就是當這個值正好爲1。

對於矩陣而言,須要關注矩陣的最大奇異值,若是最大奇異值大於1,會發生梯度爆炸;若是最大奇異值小於1,會發生梯度消失。

防止因使用循環神經網絡RNN帶來的梯度消失與梯度爆炸問題:

1.設置梯度剪切閾值(gradient clipping threshold),一旦梯度超過該值,直接設置爲該值;

2.使用沿時間的截斷反向傳導方法(詳見[深度學習]循環神經網絡:RNN,LSTM,GRU,Attention機制,沿時間的截斷反向傳導算法);

2.使用更加複雜的RNN結構,例如LSTM。

LSTM能儘可能避免梯度爆炸或者梯度消失的緣由有兩個:

1.這裏的遺忘門是矩陣元素相乘,而不是矩陣相乘。

2.矩陣元素相乘,可能會在不一樣的時間點乘以一個不一樣的遺忘門。

3.遺忘門是一個sigmoid函數,因此矩陣元素相乘的結果,會保證在(0,1)之間。

4.從最後的隱藏單元狀態,反向傳播到第一個單元狀態,在反向傳播的路徑上,咱們只經過一個單一的非線性tanh向後傳播,而不是在每個時間步長中單獨設置tanh函數。

四、數據集自己問題
數據集自己可能標註不許確,引入大量噪聲。以圖片數據集爲例,具體狀況可能包括:

1.在目標檢測中,四邊形標註框與實際不匹配,標註框的面積過多大於實際目標的面積;

2.在使用mask rcnn檢測目標時,只用四點標註的bounding boxes來生成mask,可能會致使生成的mask不夠準確。若是誤差過大,也會引入梯度爆炸;

3.在場景文字檢測中,爲了套用已有的檢測水平方向物體的目標檢測框架,將原有的任意四邊形標註框轉換爲其水平方向的最小外接矩形,也會致使標註框的面積過多大於實際目標的面積;

4.在場景文字識別中,對於一張完整的圖片,通常是根據座標對單詞區域進行裁剪,再將全部的單詞區域縮放成相同的大小。一是單詞區域裁剪不許確,二是若是縮放尺寸沒有選擇好,較小的圖片放大成過大的尺寸,會使得訓練圖片很是模糊,引入大量噪聲。

對於數據集自己的問題,帶來的梯度爆炸問題,通常須要注意,儘可能使得標註準確,除非是進行難樣本挖掘操做,通常儘可能使用清晰的圖片。

4、補充

一、如何肯定是否出現梯度爆炸?

在訓練過程當中出現梯度爆炸會伴隨一些細微的信號,如:

(1)模型沒法從訓練數據中得到更新;

(2)模型不穩定,致使更新過程當中的損失出現顯著變化;

(3)訓練過程當中,模型的損失變爲Nan。

二、loss爲Nan緣由

1.梯度爆炸。梯度變得很是大,使得學習過程難以繼續。

2.不當的損失函數。

3.不當的輸入。

4.池化層中步長比卷積核的尺寸大。

三、針對梯度爆炸主要作法是:通常靠裁剪後的優化算法解決。好比gradient clipping(若是梯度的範數大於某個給定值,將梯度同比收縮)。

四、BN層防止梯度彌散

BN(Batch Normalization)層的做用
(1)加速收斂(2)控制過擬合,能夠少用或不用Dropout和正則(3)下降網絡對初始化權重不敏感(4)容許使用較大的學習率
在每一層輸入的時候,加個BN預處理操做。BN應做用在非線性映射前,即對x=Wu+b作規範化。在BN中,是經過將activation規範爲均值和方差一致的手段使得本來會減少的activation的scale變大。能夠說是一種更有效的local response normalization方法。

BN層請移步:等一下。

 

轉自:https://blog.csdn.net/u013250416/article/details/81410693

參考:https://www.cnblogs.com/callyblog/p/8098646.html

https://blog.csdn.net/manong_wxd/article/details/78735599

https://blog.csdn.net/u013403054/article/details/78424095