1. 程式人生 > >梯度消失與梯度膨脹,以及6種解決措施

梯度消失與梯度膨脹,以及6種解決措施

我無意中看到一篇公眾號,挺不錯,就寫下來了

1.梯度消失

根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話,那麼即使這個結果是0.99,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於0。

這種情況會導致靠近輸入層的隱含層神經元調整極小。

2.梯度膨脹

根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都大於1的話,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於無窮大。

這種情況又會導致靠近輸入層的隱含層神經元調整變動極大。

3. 梯度消失和梯度膨脹的解決方案

本文提供6種常見的解決梯度消失和膨脹的方法,歡迎閱讀學習。

3.1 預訓練加微調

此方法來自Hinton在2006年發表的一篇論文,Hinton為了解決梯度的問題,提出採取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網路進行“微調”(fine-tunning)。

Hinton在訓練深度信念網路(Deep Belief Networks)中,使用了這個方法,在各層預訓練完成後,再利用BP演算法對整個網路進行訓練。此思想相當於是先尋找區域性最優,然後整合起來尋找全域性最優,此方法有一定的好處,但是目前應用的不是很多了。

3.2 梯度剪下、正則

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

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

關於WGAN(Wasserstein GAN) 的介紹

We introduce a new algorithm named WGAN, an alternative to traditional GAN training. In this new model, we show that we can improve the stability of learning, get rid of problems like mode collapse, and provide meaningful learning curves useful for debugging and hyperparameter searches. Furthermore, we show that the corresponding optimization problem is sound, and provide extensive theoretical work highlighting the deep connections to other distances between distributions.

另外一種解決梯度爆炸的手段是採用權重正則化(weithts regularization)比較常見的是l1正則,和l2正則,在各個深度框架中都有相應的API可以使用正則化,比如在tensorflow中,搭建網路的時候已經設定了正則化引數,則呼叫以下程式碼可以直接計算出正則損失:

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

如果沒有設定初始化引數,也可以使用以下程式碼計算l2 正則損失:

l2_loss = tf.add_n([tf.nn.l2_loss(varfor var in tf.trainable_variables() if 'weights' in var.name])

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

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

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

3.3 relu、leakrelu、elu等啟用函式

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

Relu的主要貢獻在於:

  1. 解決了梯度消失、爆炸的問題

  2. 計算方便,計算速度快

  3. 加速了網路的訓練

同時也存在一些缺點:

  1. 由於負數部分恆為0,會導致一些神經元無法啟用(可通過設定小學習率部分解決)

  2. 輸出不是以0為中心的


leakrelu就是為了解決relu的0區間帶來的影響,其數學表達為:leakrelu=max(k∗x,x) 


其中k是leak係數,一般選擇0.01或者0.02,或者通過學習而來。
leakrelu解決了0區間帶來的影響,而且包含了relu的所有優點

3.4 batchnorm

Batchnorm是深度學習發展以來提出的最重要的成果之一了,目前已經被廣泛的應用到了各大網路中,具有加速網路收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題

batchnorm全名是batch normalization,簡稱BN,

通過規範化操作將輸出x規範化以此來保證網路的穩定性。

batchnorm就是通過對每一層的輸出規範為均值和方差一致的方法,消除了w帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題。


詳情可參考文章:


http://blog.csdn.net/qq_25737169/article/details/79048516


3.5 殘差結構

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

殘差結構說起殘差的話,不得不提這篇論文了:

Deep Residual Learning for Image Recognition

3.6 LSTM

LSTM全稱是長短期記憶網路(long-short term memory networks),是不那麼容易發生梯度消失的,主要原因在於LSTM內部複雜的“門”(gates),LSTM通過它內部的“門”可以接下來更新的時候“記住”前幾次訓練的”殘留記憶“,因此,經常用於生成文字中。


出處:https://mp.weixin.qq.com/s/4VkjDuomzlk-sVZvHKlmTA