梯度彌散和梯度爆炸


一、現象介紹

靠近輸出層的hidden layer 梯度大,參數更新快,所以很快就會收斂;

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

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

而在另一種情況中,前面layer的梯度通過訓練變大,而后面layer的梯度指數級增大,這種現象又叫做梯度爆炸(exploding gradient problem)。

總的來說,就是在這個深度網絡中,梯度相當不穩定(unstable)。

 

二、梯度消失與梯度爆炸原因

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

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

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

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

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

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

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

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

 

三、各類原因以及解決方法

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

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

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

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

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

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

2、激活函數選擇不當

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

sigmoid函數:

tanh函數:

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

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

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

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

3.一般不使用sigmoid

3、神經網絡本身的結構問題,如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函數。

4、數據集本身問題
數據集本身可能標注不准確,引入大量噪聲。以圖片數據集為例,具體情況可能包括:

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

2.在使用mask rcnn檢測目標時,只用四點標注的bounding boxes來生成mask,可能會導致生成的mask不夠准確。如果偏差過大,也會引入梯度爆炸;

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

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

對於數據集本身的問題,帶來的梯度爆炸問題,一般需要注意,盡量使得標注准確,除非是進行難樣本挖掘操作,一般盡量使用清晰的圖片。

四、補充

1、如何確定是否出現梯度爆炸?

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

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

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

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

2、loss為Nan原因

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

2.不當的損失函數。

3.不當的輸入。

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

3、針對梯度爆炸主要做法是:一般靠裁剪后的優化算法解決。比如gradient clipping(如果梯度的范數大於某個給定值,將梯度同比收縮)。

4、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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM