1. 程式人生 > >[深度學習] 梯度消失與梯度爆炸、Loss為Nan的原因

[深度學習] 梯度消失與梯度爆炸、Loss為Nan的原因

現象

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

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

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

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

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

梯度消失與梯度爆炸原因

首先,來看神經網路更新梯度的原理,即反向傳播演算法。

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

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

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

(2)啟用函式帶來的影響:啟用函式選擇不當;

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

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

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

神經網路權重初始化不當

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

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

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

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

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

啟用函式選擇不當

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。

LSTM能儘量避免梯度爆炸或者梯度消失的原因有兩個:

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

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

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

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

資料集本身問題

資料集本身可能標註不準確,引入大量噪聲。以圖片資料集為例,具體情況可能包括:

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

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

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

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

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

loss為Nan原因

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

2.不當的損失函式。

3.不當的輸入。

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