梯度消失和爆炸原因以及解決方法

1、梯度消失與梯度爆炸問題簡述

        層數比較多的神經網絡模型在使用梯度下降法對誤差進行反向傳播時會出現梯度消失和梯度爆炸問題。梯度消失問題和梯度爆炸問題一般會隨着網絡層數的增加變得越來越明顯。
      例如,對於圖所示的含有3個隱藏層的神經網絡,梯度消失問題發生時,靠近輸出層的hidden layer 3的權值更新相對正常,但是靠近輸入層的hidden layer1的權值更新會變得很慢,導致靠近輸入層的隱藏層權值幾乎不變,扔接近於初始化的權值。這就導致hidden layer 1 相當於只是一個映射層,對所有的輸入做了一個函數映射,這時此深度神經網絡的學習就等價於只有後幾層的隱藏層網絡在學習。

     梯度爆炸的情況是:當初始的權值過大,靠近輸入層的hidden layer 1的權值變化比靠近輸出層的hidden layer 3的權值變化更快,就會引起梯度爆炸的問題。在深層網絡或循環神經網絡中,誤差梯度可在更新中累積,變成非常大的梯度,然後導致網絡權重的大幅更新,並因此使網絡變得不穩定。在極端情況下,權重的值變得非常大,以至於溢出,導致 NaN 值。網絡層之間的梯度(值大於 1.0)重複相乘導致的指數級增長會產生梯度爆炸。

                                         

      那麼爲什麼會出現梯度消失的現象呢?因爲通常神經網絡所用的激活函數是sigmoid函數,這個函數有個特點,就是能將負無窮到正無窮的數映射到0和1之間,並且對這個函數求導的結果是f′(x)=f(x)(1−f(x))。因此兩個0到1之間的數相乘,得到的結果就會變得很小了。神經網絡的反向傳播是逐層對函數偏導相乘,因此當神經網絡層數非常深的時候,最後一層產生的偏差就因爲乘了很多的小於1的數而越來越小,最終就會變爲0,從而導致層數比較淺的權重沒有更新,這就是梯度消失

2、推導梯度消失與梯度爆炸的原因

1.深層網絡角度

下面以上圖中含有三個隱藏層的單神經元神經網絡爲例,激活函數使用sigmoid:

圖中是一個四層的全連接網絡,假設每一層網絡激活後的輸出爲f_{i}(x),其中i 爲第i 層, x代表第i層的輸入,也就是第i−1層的輸出,f是激活函數,那麼得出 :,記爲

BP算法基於梯度下降策略,以目標的負梯度方向對參數進行調整,參數的更新爲w \leftarrow w+\Delta w,如果要更新第二隱藏層的權值信息,根據鏈式求導法則,更新梯度信息: 
                              

f_{2}=f(f_{1}*w_{2})得,,其中f_{1}是第一層的輸出。

                                               \frac{\partial f_4}{\partial f_3} =f^{'}*w_{4}  ,\frac{\partial f_3}{\partial f_2} =f^{'}*w_{3} .

   對激活函數進行求導f^{'},如果此部分大於1,那麼層數增多的時候,最終的求出的梯度更新將以指數形式增加,即發生梯度爆炸,如果此部分小於1,那麼隨着層數增多,求出的梯度更新信息將會以指數形式衰減,即發生了梯度消失.

      從深層網絡角度來講,不同的層學習的速度差異很大,表現爲網絡中靠近輸出的層學習的情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始隨機初始化的值差不多。因此,梯度消失、爆炸,其根本原因在於反向傳播訓練法則,屬於先天不足。如下圖所示,對於四個隱層的網絡來說,第四隱藏層比第一隱藏層的更新速度慢了兩個數量級:

            

2.激活函數角度

        上文中提到計算權值更新信息的時候需要計算前層偏導信息,因此如果激活函數選擇不合適,比如使用sigmoid,梯度消失就會很明顯了,左圖是sigmoid的損失函數圖,右邊是其導數的圖像,如果使用sigmoid作爲損失函數,其梯度是不可能超過0.25的,這樣經過鏈式求導之後,很容易發生梯度消失。

sigmoid函數數學表達式爲:
                                       

                  
     可見sigmoid的導數的最大值爲1/4,通常初始化的網絡權值w通常都小於1,從而有 |\sigma ^{'}(z)w|\leq \frac{1}{4}                                     

     當|\sigma ^{'}(z)w|> 1,也就是w比較大的情況。則前面的網絡層比後面的網絡層梯度變化更快,引起了梯度爆炸的問題。通常來說當激活函數是sigmoid時,梯度消失比梯度爆炸更容易發生。

    同理,tanh作爲激活函數,它的導數圖如下,可以看出,tanh比sigmoid要好一些,但是它的導數仍然是小於1的。tanh數學表達爲:
                                                        

        

3、梯度消失、爆炸的解決方案

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

  1. 模型無法從訓練數據中獲得更新(如低損失)。
  2. 模型不穩定,導致更新過程中的損失出現顯著變化。
  3. 訓練過程中,模型損失變成 NaN。

1. 重新設計網絡模型

       梯度爆炸可以通過重新設計層數更少的網絡來解決。使用更小的批尺寸對網絡訓練也有好處。另外也許是學習率過大導致的問題,減小學習率。

2. 使用 ReLU 激活函數

      梯度爆炸的發生可能是因爲激活函數,如之前很流行的 Sigmoid 和 Tanh 函數。使用 ReLU 激活函數可以減少梯度爆炸。採用 ReLU 激活函數是最適合隱藏層的,是目前使用最多的激活函數。

                                                 

     relu函數的導數在正數部分是恆等於1的,因此在深層網絡中使用relu激活函數就不會導致梯度消失和爆炸的問題。

    relu的主要貢獻在於:

  1.  -- 解決了梯度消失、爆炸的問題
  2.  -- 計算方便,計算速度快, 加速了網絡的訓練

同時也存在一些缺點:

  1. 由於負數部分恆爲0,會導致一些神經元無法激活(可通過設置小學習率部分解決)
  2. 輸出不是以0爲中心的

leakrelu
                                  

  leak relu就是爲了解決relu的0區間帶來的影響,而且包含了relu的所有優點,其數學表達爲:

                                               

其中k是leak係數,一般選擇0.01或者0.02,或者通過學習而來。

elu

elu激活函數也是爲了解決relu的0區間帶來的影響,其數學表達爲:

                                                        

其函數及其導數數學形式爲:

但是elu相對於leakrelu來說,計算要更耗時間一些。

3. 使用長短期記憶網絡

     在循環神經網絡中,梯度爆炸的發生可能是因爲某種網絡的訓練本身就存在不穩定性,使用長短期記憶(LSTM)單元和相關的門類型神經元結構可以減少梯度爆炸問題。採用 LSTM 單元是適合循環神經網絡的序列預測的最新最好實踐。

4. 使用梯度截斷(Gradient Clipping)

      梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個範圍之內。這可以防止梯度爆炸。

5. 使用權重正則化(Weight Regularization)

     如果梯度爆炸仍然存在,可以嘗試另一種方法,即檢查網絡權重的大小,並懲罰產生較大權重值的損失函數。該過程被稱爲權重正則化,通常使用的是 L1 懲罰項(權重絕對值)或 L2 懲罰項(權重平方)。比如在tensorflow中,若搭建網絡的時候已經設置了正則化參數,則調用以下代碼可以直接計算出正則損失:

regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope='my_resnet_50'))

正則化是通過對網絡權重做正則限制過擬合,仔細看正則項在損失函數的形式:

                                           
其中,α 是指正則項係數,如果發生梯度爆炸,權值的範數就會變的非常大,通過正則化項,可以部分限制梯度爆炸的發生。

注:事實上,在深度神經網絡中,往往是梯度消失出現的更多一些。

6、預訓練加finetunning

        其基本思想是每次訓練一層隱藏層節點,將上一層隱藏層的輸出作爲輸入,而本層隱節點的輸出作爲下一層隱節點的輸入,這就是逐層預訓練。在預訓練完成後,再對整個網絡進行“微調”(fine-tunning)。Hinton在訓練深度信念網絡(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP算法對整個網絡進行訓練。此思想相當於是先尋找局部最優,然後整合起來尋找全局最優,此方法有一定的好處,但是目前應用的不是很多了。現在基本都是直接拿imagenet的預訓練模型直接進行finetunning。

7、批量歸一化

      Batchnorm具有加速網絡收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題。batchnorm全名是batch normalization,簡稱BN,即批規範化,通過規範化操作將輸出信號x規範化保證網絡的穩定性。

from:Batch Normalization批量歸一化

8、殘差結構

      殘差網絡的出現導致了image net比賽的終結,自從殘差提出後,幾乎所有的深度網絡都離不開殘差的身影,相比較之前的幾層,幾十層的深度網絡,殘差可以很輕鬆的構建幾百層,一千多層的網絡而不用擔心梯度消失過快的問題,原因就在於殘差的捷徑(shortcut)部分,殘差網絡通過加入 shortcut connections,變得更加容易被優化。包含一個 shortcut connection 的幾層網絡被稱爲一個殘差塊(residual block),如下圖所示:
                               
     相比較於以前網絡的直來直去結構,殘差中有很多這樣的跨層連接結構,這樣的結構在反向傳播中具有很大的好處,見下式:
                       

     式子的第一個因子表示的損失函數到達 L的梯度,小括號中的1表明短路機制可以無損地傳播梯度,而另外一項殘差梯度則需要經過帶有weights的層,梯度不是直接傳遞過來的。殘差梯度不會那麼巧全爲-1,而且就算其比較小,有1的存在也不會導致梯度消失。所以殘差學習會更容易。

from:CNN經典模型:深度殘差網絡(DRN)ResNet


from:https://blog.csdn.net/qq_25737169/article/details/78847691

from :https://www.jianshu.com/p/243ab5aff906

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