天天看點

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

1.神經網絡

神經網絡其實就是一個多層的感覺器,我們下面來看下其結構:

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

從上面的圖例我們可以看出來,神經網絡主要分為3種網絡層

輸入層:就是資料輸入神經網絡的入口,比如MNIST是28*28的像素點集,則輸入層就需要有28*28個輸入神經元 + 一個代表偏移量的輸入神經元(如圖:左側常量的神經元)

隐藏層:就是神經網絡的中間層,可能有一點抽象,

           舉個例子:一個人臉識别系統,假設有3個隐藏層

                          隐藏層1: 識别眼睛和眉毛的特征

                          隐藏層2: 識别嘴巴和耳朵的特征

                          隐藏層3: 識别膚色即全部人臉

           隐藏層就是從低到高逐層抽象的網絡層

輸出層:就是模型預測值的輸出口,這裡我們使用常用的softmax,用于分類MNIST的圖像類别

那麼,可以看出來:

從下到上(輸出層 -> 隐藏層 -> 輸出層),就是訓練模型的過程: 小批量/全量資料逐漸調節權重,基于loss函數尋求最優loss的過程

自上而下,進行反向微分調參,下面我們會基于此來進行梯度爆炸和消失的問題剖析

到這裡我們對神經網絡有了一個初步的認識,下面來進入重點 梯度消失和梯度爆炸

2.梯度消失和梯度爆炸

正如之前所說,反向傳播算法(即BP算法)是從輸出層反向傳到輸入層,逐層傳遞誤差梯度,進而進行權重的更新;

我們應該知道無論是機器學習還是深度學習(DNN)都是在一次次訓練中根據前一次的誤差進行梯度下降更行權重

這時候随着網絡層的增加,我們會暴露兩個問題: 梯度消失 和 梯度爆炸

2.1.從深度網絡的角度說明梯度消失和梯度爆炸

深度神經網絡訓練的時候,采用的是反向傳播方式,該方式使用鍊式求導法則,計算每層梯度的時候會涉及一些連乘操作。是以,對激活函數進行求導時,如果此部分大于1,顯而易見層數很多的時候,最終求出的梯度更新将以指數形式增加,即發生梯度爆炸;如果此部分小于1,那麼随着層數增多,求出的梯度更新資訊将會以指數形式衰減,即發生了梯度消失。

2.2 從激活函數的角度來看

計算權值更新資訊的時候需要計算前層偏導資訊,是以如果激活函數選擇不合适,比如使用sigmoid,梯度消失就會很明顯了,原因看下圖,左圖是sigmoid的損失函數圖,右邊是其導數的圖像,如果使用sigmoid作為損失函數,其梯度是不可能超過0.25的,這樣經過鍊式求導之後,很容易發生梯度消失。

2.2.1 sigmoid函數及其導數的數學表達式為:

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

下面我們來看其函數及其導函數圖像:

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

2.2.2 tanh作為激活函數

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

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案
梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

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

3.1 預訓練加微調

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

3.2 梯度剪切、正則

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

注:在WGAN中也有梯度剪切限制操作,但是和這個是不一樣的,WGAN限制梯度更新資訊是為了保證lipchitz條件。

另外一種解決梯度爆炸的手段是采用權重正則化,比較常見的又L1正則和L2正則。正則化是通過對網絡權重做正則限制過拟合,仔細看正則項在損失函數的形式:

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

a是正則化系數,如果發生梯度爆炸,權值的範數就會變得非常大,通過正則化項,可以部分抑制。

3.3 采用不同的激活函數

(1) ReLU函數:

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

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案
梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

ReLU的主要貢獻在于:

  • 解決了梯度消失、爆炸的問題。
  • 計算友善,計算速度快。
  • 加速了網絡的訓練。

同時也存在一些缺點:

  • 由于負數部分恒為0,會導緻一些神經元無法激活(可通過設定國小習率部分解決)。
  • 輸出不是以0為中心的。

(2) LeakyReLU函數:

LeakyReLU就是為了解決ReLU的0區間帶來的影響,該函數輸出對負值輸入有很小的坡度,由于導數總是不為零,這能減少靜默神經元的出現,允許基于梯度的學習(雖然會很慢),解決了ReLU函數進入負區間後,導緻神經元不學習的問題。

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

(3) ELU函數:

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案
  • 融合了sigmoid和ReLU,左側具有軟飽和性,右側無飽和性。
  • 右側線性部分使得ELU能夠緩解梯度消失,而左側軟飽能夠讓ELU對輸入變化或噪聲更魯棒。
  • ELU的輸出均值接近于零,是以收斂速度更快,但相對于LeakyReLU來說,計算要更耗時間一些。

還有其他一些激活函數,如下表:

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

3.4 Batch Normalization

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

反向傳播式子中有w的存在,是以w的大小影響了梯度的消失和爆炸,BN就是通過對每一層的輸出規範為均值和方差一緻的方法,消除了w帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題,或者可以了解為BN将輸出從飽和區拉倒了非飽和區。

有關Batch Normalization詳細的内容可以參考這篇部落格:Batch Normalization

3.5 殘差結構

事實上,就是殘差網絡的出現導緻了image net比賽的終結,自從殘差提出後,幾乎所有的深度網絡都離不開殘差的身影,相比較之前的幾層,幾十層的深度網絡,在殘差網絡面前都不值一提,殘差可以很輕松的建構幾百層,一千多層的網絡而不用擔心梯度消失過快的問題,原因就在于殘差的捷徑(shortcut)部分。具體關于殘差網絡ResNet的了解後續再來解析。

3.6 LSTM網絡

LSTM是循環神經網絡RNN的變體,全稱是長短期記憶網絡(long-short term memory networks),它是不那麼容易發生梯度消失的,主要原因在于LSTM内部複雜的“門”結構,LSTM通過它内部的“門”可以接下來更新的時候“記住”前幾次訓練的“殘留記憶”,是以,經常用于生成文本中。關于LSTM的原理詳解後續再分析。

梯度消失和梯度爆炸1.神經網絡2.梯度消失和梯度爆炸3. 解決梯度爆炸和梯度消失的方案

繼續閱讀