1. 程式人生 > >梯度消失和梯度爆炸問題詳解

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

1.為什麼使用梯度下降來優化神經網路引數?

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

採取反向傳播的原因:首先,深層網路由許多線性層和非線性層堆疊而來,每一層非線性層都可以視為是一個非線性函式 f ( x ) f(x)

(非線性來自於非線性啟用函式),因此整個深度網路可以視為是一個複合的非線性多元函式。

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

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

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

3.產生的原因

以最簡單的網路結構為例,加入有三個隱藏層,每層的神經元個數都是1,且對應的非線性函式為 y i = σ ( z i

) = σ ( w i x i + b i ) y_i = \sigma(z_i)=\sigma(w_i x_i + b_i) (其中 σ \sigma 為某個啟用函式)如下圖:

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

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

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

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

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

Sigmoid函式求導影象

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 梯度剪下、正則

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

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

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