梯度消失和梯度爆炸問題詳解


1.為什么使用梯度下降來優化神經網絡參數?

反向傳播(用於優化神網參數):根據損失函數計算的誤差通過反向傳播的方式,指導深度網絡參數的更新優化。

采取反向傳播的原因:首先,深層網絡由許多線性層和非線性層堆疊而來,每一層非線性層都可以視為是一個非線性函數f(x)(非線性來自於非線性激活函數),因此整個深度網絡可以視為是一個復合的非線性多元函數。

我們最終的目的是希望這個非線性函數很好的完成輸入到輸出之間的映射,也就是找到讓損失函數取得極小值。所以最終的問題就變成了一個尋找函數最小值的問題,在數學上,很自然的就會想到使用梯度下降來解決。

2.梯度消失、爆炸會帶來哪些影響

舉個例子,對於一個含有三層隱藏層的簡單神經網絡來說,當梯度消失發生時,接近於輸出層的隱藏層由於其梯度相對正常,所以權值更新時也就相對正常,但是當越靠近輸入層時,由於梯度消失現象,會導致靠近輸入層的隱藏層權值更新緩慢或者更新停滯。這就導致在訓練時,只等價於后面幾層的淺層網絡的學習。

 
image

3.產生的原因

以最簡單的網絡結構為例,加入有三個隱藏層,每層的神經元個數都是1,且對應的非線性函數為y_i = \sigma(z_i)=\sigma(w_i x_i + b_i)(其中 \sigma 為某個激活函數)如下圖:

 
image

現在假設我們需要更新參數 b_1 ,那么我們就要求出損失函數對參數 b_1 的導數,根據鏈式法則,可以寫成下面這樣:

而對於激活函數,之前一直使用Sigmoid函數,其函數圖像成一個S型,如下所示,它會將正無窮到負無窮的數映射到0~1之間:

S(x) = \frac{1}{1+e^{-x}} = \frac{e^x}{e^x+1}

 
image

當我們對Sigmoid函數求導時,得到其結果如下:
S(x) = S(x)(1-S(x))

由此可以得到它Sigmoid函數圖像,呈現一個駝峰狀(很像高斯函數),從求導結果可以看出,Sigmoid導數的取值范圍在0~0.25之間,而我們初始化的網絡權值|w|通常都小於1,因此,當層數增多時,小於0的值不斷相乘,最后就導致梯度消失的情況出現。同理,梯度爆炸的問題也就很明顯了,就是當權值|w|過大時,導致 |\sigma'(z)w| > 1,最后大於1的值不斷相乘,就會產生梯度爆炸。

Sigmoid函數求導圖像


 
image

4.解決辦法

梯度消失和梯度爆炸本質上是一樣的,都是因為網絡層數太深而引發的梯度反向傳播中的連乘效應。

解決梯度消失、爆炸主要有以下幾種方案:

4.1 換用Relu、LeakyRelu、Elu等激活函數

ReLu:讓激活函數的導數為1

LeakyReLu:包含了ReLu的幾乎所有有點,同時解決了ReLu中0區間帶來的影響

ELU:和LeakyReLu一樣,都是為了解決0區間問題,相對於來,elu計算更耗時一些(為什么)

具體可以看關於各種激活函數的解析與討論

4.2 BatchNormalization

BN本質上是解決傳播過程中的梯度問題,具體待補充完善,查看BN

4.3 ResNet殘差結構

具體待補充完善,查看ResNet

4.4 LSTM結構

LSTM不太容易發生梯度消失,主要原因在於LSTM內部復雜的“門(gates)”,具體看LSTM基本原理解析

4.4 預訓練加finetunning

此方法來自Hinton在06年發表的論文上,其基本思想是每次訓練一層隱藏層節點,將上一層隱藏層的輸出作為輸入,而本層的輸出作為下一層的輸入,這就是逐層預訓練。

訓練完成后,再對整個網絡進行“微調(fine-tunning)”。

此方法相當於是找全局最優,然后整合起來尋找全局最優,但是現在基本都是直接拿imagenet的預訓練模型直接進行finetunning。

4.5 梯度剪切、正則

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

另一種防止梯度爆炸的手段是采用權重正則化,正則化主要是通過對網絡權重做正則來限制過擬合,但是根據正則項在損失函數中的形式:

可以看出,如果發生梯度爆炸,那么權值的范數就會變的非常大,反過來,通過限制正則化項的大小,也可以在一定程度上限制梯度爆炸的發生。



轉:https://www.jianshu.com/p/3f35e555d5ba


免責聲明!

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



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