1. 程式人生 > >梯度消失和梯度爆炸的解答

梯度消失和梯度爆炸的解答

層數比較多的神經網路模型在訓練時也是會出現一些問題的,其中就包括梯度消失問題(gradient vanishing problem)和梯度爆炸問題(gradient exploding problem)。梯度消失問題和梯度爆炸問題一般隨著網路層數的增加會變得越來越明顯。

例如,對於下圖所示的含有3個隱藏層的神經網路,梯度消失問題發生時,接近於輸出層的hidden layer 3等的權值更新相對正常,但前面的hidden layer 1的權值更新會變得很慢,導致前面的層權值幾乎不變,仍接近於初始化的權值,這就導致hidden layer 1相當於只是一個對映層,對所有的輸入做了一個同一對映,這是此深層網路的學習就等價於只有後幾層的淺層網路的學習了。

而這種問題為何會產生呢?以下圖的反向傳播為例(假設每一層只有一個神經元且對於每一層y_i=\sigma\left(z_i\right)=\sigma\left(w_ix_i+b_i\right),其中\sigma為sigmoid函式)

第一層:f1=\sigma (x0*w1+b1)

第二層:f2=\sigma (f1*w2+b2)

第三層:f3=\sigma (f2*w3+b3)

第四層:f4=\sigma (f3*w4+b4)L=loss(f4,y)


假設求第二層的權重更新,可以推匯出

\frac{\partial L}{\partial w2}=\frac{\partial L}{\partial f4}*\frac{\partial f4}{\partial f3}*\frac{\partial f3}{\partial f2}*\frac{\partial f2}{\partial w2}

此處 \frac{\partial f2}{\partial w2}=f1 ,中間的 \frac{\partial f4}{\partial f3}\frac{\partial f3}{\partial f2}是對啟用函式求導,如果這部分大於1,當網路的層數增加時,會發生梯度爆炸;如果這部分小於1,當網路的層數減少時,會發生梯度消失。

表現:深層網路不同層的學習速度差異很大,靠近網路輸出的層學習的好。

比如sigmoid的導數\sigma'\left(x\right)如下圖


可見,\sigma'\left(x\right)的最大值為\frac{1}{4},而我們初始化的網路權值|w|通常都小於1,因此|\sigma'\left(z\right)w|\leq\frac{1}{4},因此對於上面的鏈式求導,啟用函式的倒數都小於0.

這樣,梯度爆炸問題的出現原因就顯而易見了,即|\sigma'\left(z\right)w|>1

,也就是w比較大的情況。但對於使用sigmoid啟用函式來說,這種情況比較少。因為\sigma'\left(z\right)的大小也與w有關(z=wx+b),除非該層的輸入值x在一直一個比較小的範圍內。

其實梯度爆炸和梯度消失問題都是因為網路太深,網路權值更新不穩定造成的,本質上是因為梯度反向傳播中的連乘效應。對於更普遍的梯度消失問題,可以考慮用ReLU啟用函式取代sigmoid啟用函式。另外,LSTM的結構設計也可以改善RNN中的梯度消失問題。

二、解決方案

深度網路的梯度下降過程,梯度的變化和權重、啟用函式有關。見DNN的梯度下降過程

1、預訓練加微調

此方法來自Hinton在2006年發表的一篇論文,Hinton為了解決梯度的問題,提出採取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網路進行“微調”(fine-tunning)。Hinton在訓練深度信念網路(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP演算法對整個網路進行訓練。此思想相當於是先尋找區域性最優,然後整合起來尋找全域性最優,此方法有一定的好處,但是目前應用的不是很多了。

2、梯度剪下

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

3、正則化

另外一種解決梯度爆炸的手段是採用權重正則化(weithts regularization)比較常見的是L1正則,和L2正則。因此,如果發生梯度爆炸,權值的範數就會變的非常大,通過正則化項,可以部分限制梯度爆炸的發生

一般情況下,在深層網路中,梯度消失出現的情況更多一些。

4、修改啟用函式

(1)RELU

如果啟用函式的導數為1,那麼就不存在梯度消失爆炸的問題了,每層的網路都可以得到相同的更新速度,relu就這樣應運而生。

從上圖中,我們可以很容易看出,relu函式的導數在正數部分是恆等於1的,因此在深層網路中使用relu啟用函式就不會導致梯度消失和爆炸的問題。

RELU的優點:解決了梯度消失、梯度爆炸;計算速度快;加速訓練

缺點:負數部分,神經元不會啟用;輸出不是以0為中心

(2)LEAKRELU

leakrelu就是為了解決relu的0區間帶來的影響,其數學表達為:leakrelu=max(k∗x,0)leakrelu=max(k∗x,0)其中k是leak係數,一般選擇0.01或者0.02,或者通過學習而來

 5、batchnorm

Batchnorm是深度學習發展以來提出的最重要的成果之一了,目前已經被廣泛的應用到了各大網路中,具有加速網路收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題。batchnorm全名是batch normalization,簡稱BN,即批規範化,通過規範化操作將輸出訊號x規範化保證網路的穩定性。

具體的batchnorm原理非常複雜,在這裡不做詳細展開,此部分大概講一下batchnorm解決梯度的問題上。具體來說就是反向傳播中,經過每一層的梯度會乘以該層的權重,舉個簡單例子: 
正向傳播中f2=f1(w^T*x+b)),那麼反向傳播中,\frac{\partial f2}{\partial x}=\frac{\partial f2}{\partial f1}w,反向傳播式子中有w的存在,所以w的大小影響了梯度的消失和爆炸,batchnorm就是通過對每一層的輸出規範為均值和方差一致的方法,消除了w帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題,或者可以理解為BN將輸出從飽和區拉倒了非飽和區。