1. 程式人生 > >梯度消失與梯度爆炸總結

梯度消失與梯度爆炸總結



神經網路中梯度消失與梯度爆炸問題綜述

前言

隨著計算資源和資料量的增加,深度學習方法又再次回到公眾的視野。但是隨著深度的增加,神經網路的訓練越來越難,一個重要的原因是,深度的增加會導致梯度消失梯度爆炸問題的出現,使網路權重難以訓練。文章分為兩部分,第一部分簡單介紹梯度消失和梯度下降的相關概念及對網路訓練的影響,第二部分重點介紹梯度消失發生的原因和解決方法。

一、梯度消失與梯度爆炸

梯度下降和反向傳播演算法的雙劍合璧,使深層次神經網路的訓練成為可能,但隨著網路層數的增加。訓練的難度越來越大,出現這種情況的原因是,深度神經網路很容易出現梯度消失(vanishing gradient) 梯度爆炸(exploding gradient)問題。

梯度消失:反向傳播時,當梯度從後往前傳時,梯度不斷減小,最後變為零,此時,淺層的神經網路權重得不到更新,這種現象稱為“飽和”(saturate,整個網路學習速度非常慢。梯度消失導致後層的權重更新的快,而前層網路由於梯度傳遞不過去而得不到更新。這樣在網路很深的時候,學習的速度很慢或者無法學習。

梯度爆炸:這是一種與梯度消失相反的情況,當進行反向傳播時,梯度從後往前傳時,梯度不斷增大,導致權重更新太大,以致不斷波動,使網路在最優點之間波動。

這兩種情況都導致了,神經網路很好地無法學習,第二部分將詳細分析產生這兩種現象的原因以及解決的辦法。

二、梯度消失和梯度爆炸的原因及解決方法

目前主流的深度學習的網路結構為

卷積神經網路(CNN)迴圈神經網路(RNN)。這部分將從兩個方面分析梯度消失和梯度爆炸產生的原因,一個從非線性啟用函式層面,另一個是從網路結構層面。

2.1  sigmoidtanh啟用函式的梯度消失問題

神經網路的非線性啟用函式使之具有了學習非線性函式的能力,早期使用的非線性啟用函式為sigmoid(tanh)函式。這兩個函式的取值和求導特性,導致梯度消失問題的出現。

如圖2-1,為一個最簡單的神經元的示意圖,本文將從最原始的神經元的前向和方向傳播過程解釋用sigmoid函式時,梯度消失和梯度爆炸的原因。

2-1   一個神經元的結構圖

     1

         2

其中,X為輸入資料,

W為輸入資料的權重,b偏置,Z為神經元的輸入,g為神經元的輸出。

當非線性啟用函式為sigmoid (tanh),為了說明啟用函式特性對梯度的影響,首先我們給出這兩個函式的函式取值和導數取值影象,然後給出求導公式。如圖2-2,圖2-3分別是sigmoid tanh的函式及其導數圖:

2-2  sigmoid 函式及其導數

2-3  tanh 函式及其導數

當我知道sigmoid函式取值和求導後,下面程式碼是當啟用函式為sigmoid函式時,前向傳播和後向傳播的python程式碼

z = 1/(1 + np.exp(-np.dot(W, x))) # 前向傳播         (3)dx = np.dot(W.T, z*(1-z)) # 後向傳播:  x的導數      (4)dW = np.outer(z*(1-z), x) # 後向傳播: W的導數      (5)

(5)可以看出,z的取值對權重的梯度有很大的影響。由(1),z值受兩個方面的影響,所以梯度消失的原因分別是:

  1. W初始化太大或者太小,導致Z值很大

    W很大或很小時,計算出的Z會趨向於10,然後導致Z*(1-Z)這項變為0。從而梯度也變為0,導致了梯度的消失。

  2. 訓練資料沒有進行正確的預處理(preprocess)

    當訓練資料本身的取值很大或很小時,也會使Z趨向於10,也會導致梯度消失問題。

  3. 啟用函式函式本身的性質

    對於sigmoid函式來說,導數的極大值為 0.25,當網路層數過多時,就算權重和資料預處理做得很好,也會出現梯度消失現象。

    針對上面三個問題,研究者分別提出三種解決方法:

  1. 針對權重問題 ,提出合理的權值初始化,如高斯分佈、均勻分佈初始化

    合理的初始化不僅使梯度問題得到一些解決,還可以消除同層神經元的對稱性。

  2. 針對資料問題,提出batch normal 的方法

    這種方法將輸入資料壓縮至標準正太分佈,不僅防止了輸入資料過大導致梯度爆炸,梯度消失的問題,而且還提高了對W的敏感性[1]

  3. 針對sigmoid tanh的問題,提出reluPrelu等啟用函式

    如圖2-4,為Relu函式及其導數,當z值為正時,梯度可以很好的得到傳播,但是當為負時。會出現“die relu”問題,這個問題是說,當啟用函式值為0時,導數為0,導致那個單元的權重得不到更新,從而導致那個單元對整個神經網路的貢獻為0,這也是‘die’的含義。

    2-4  relu函式及其導數

    除了上面的三種解決辦法外,還有兩種更具技巧性的解決辦法,方法如下:

  4. 調整學習率

    這個方法的思路是動態地改變學習率。當梯度過小時,增大學習率,當過大時,減小學習率。可是怎麼合理的改變學習率的大小,這是一個難題。

    5.改變網路結構

    對於深度神經網路,梯度從後往前傳播的路徑過長導致梯度消失或者梯度爆炸問題,一些研究者通過改變網路的結構,構造梯度傳播的捷徑(shortcut connection),避免過大或過小,這種方法的一個典型就是ResNet網路[6]

2.2  RNN梯度消失與梯度爆炸

如圖2-5,是一個Vanilla  RNN網路結構圖:

2-5   Vanilla  RNN網路結構

這種網路結構可以很好的用於解決時間序列問題,如語言模型、語音識別、機器翻譯等問題。但是這種迴圈的結構也有一個致命的缺點,那就是梯度消失和梯度爆炸問題。這個問題使網路的迴圈體不能太長,也就是說這個網路學不到長時依賴(long term dependencies)。下面將從具體的公式中,詳細推匯出產生梯度問題的原因。

首先我們給出它的每個單元的前向傳播公式,然後我們給出後向傳播公式。

一個迴圈神經網路前向傳播計算如下:

  1. 式是網路的一個單元的計算過程,展開後為(2)式,其中Xt-1t-1時刻的隱藏層輸出,Utt時刻的輸入。

    後向傳播過程為:

  1. 式表示整個迴圈神經網路的損失是所有損失的累積,(4)式是對t時刻的損失函式展開計算,(5)式中的每個部分是一個向量對向量的求導,是一個Jacobian Matrix

    繼續對jacobian Matrix

  1. 式表明可能梯度可能會非常小,從而發生梯度消失,也可能會非常大,發生梯度爆炸。

    上面的公式表明,隨著t的增大,發生梯度消失和梯度爆炸的可能性變大,這也導致了RNN不能學習長期依賴(long-term dependencie),為了解決梯度消失和梯度爆炸問題,有兩種思路,一種是不改變網路結構,通過調整梯度大小,使神經網路的訓練能繼續進行。

    解決方法一:不改變網路結構

    針對梯度爆炸:

  1. 降低梯度規模(scaling down the gradients

    梯度爆炸就是梯度過大,一個直觀的解決辦法是當梯度較大時,減少梯度。

    這種方法也是這種思想,當梯度使梯度在一個合理的範圍內。

    演算法如下:

    使用梯度下降方法時,這個演算法等價於把學習率降低。

    針對梯度消失

  2. 消失梯度正規化(Vanishing gradient regularition)[2]

    跟處理梯度爆炸的思路類似,梯度消失的發生是梯度變小,我們可以當梯度變小的時候,通過某種方法增加梯度大小。。

  3. 合理初始化權重W,啟用函式使用Relu

    迴圈神經網路容易發生梯度消失和梯度爆炸的本質原因在於自身的網路結構。使反向傳播時出現jacobian矩陣連乘的情況。可以證明當把W合理初始化為單位矩陣,且啟用函式使用Relu時能避免梯度問題[5]

    解決方法二:改變網路結構

    這種方法與ResNet的思路類似,通過設定梯度傳播的捷徑,解決“鏈式”傳播中梯度問題。典型的網路結構為LSTMGRU,下面將具體通過GRU說明解決思路。

    如圖2-6,為一個GRU(gated RNN Unit) 的結構圖,

    2-6  Gated RNN Unit 結構圖

    各個模組的計算公式為:

    如圖2-7,為vanilla RNN的前向和反向傳播示意圖,藍色為前向傳播,紅色為反向傳播。

    2-7   rnn前向和反向傳播圖

    vanilla RNN出現梯度消失和梯度爆炸的直觀感覺的就是梯度會一層一層的傳遞,梯度以連乘的形式傳播到開始節點,導致梯度過大或者過小。GRU解決這個問題的直觀解釋就是為每個節點學習一個到每個節點的自適應的捷徑(shortcut connection),自適應的含義是可以通過引數學習與哪個節點連線或者不連線,如圖2-8

    2-8  每個節點都建立一條到後續節點的捷徑

    為什麼能避免梯度問題:

    由圖2-8,反向傳播時,梯度不再是鏈式的傳過去,而是有某一條捷徑可以走。從而避免了梯度連乘導致的梯度爆炸和梯度消失問題[4]

    上面的梯度爆炸和梯度消失的分析,僅僅是針對當前流行的神經網路的簡單分析。事實上,這個問題的複雜性遠遠超出了我們的想象,一些trick的提出的目的不是單純的為了解決梯度問題,而是為了解決更深層次的問題,如權重初始化,是為了消除同層節點的對稱性,batch nomalization還可以加速神經網路的訓練速度,ResNet是為了解決深度神經網路的degradation問題,degradation問題時隨著神經網路層數的增加,準確率卻降低,但是網路卻沒有過擬合。由於本人能力水平有限,只能簡單進行總結,有錯誤的地方,還望交流指正!

    參考資料

    [1] Batch Normalization: Accelerating Deep Network Training By Reducing Internal Covariate Shift

  1. Gustavson A, Magnuson A, Blomberg B, et al. On the difficulty of training Recurrent Neural Network.Computer Science, 2013

  2. long short-term memory

  3. Parsing with Compositional Vector Grammars, Socher et at.2013

  4. Deep Residual Learning for Image Recognitio