梯度消失和梯度爆炸問題及其解決方法詳解

梯度消失和梯度爆炸問題

概念

  • 梯度消失是由於隨着網絡深度的加深,網絡反向傳播的小於1的導數通過逐層累積而致使其越靠近輸入層,其值越小,所以靠近輸入層的權值更新就會很是緩慢甚至停滯不前,那麼網絡深度的加深就失去了其意義,網絡只等價於後面基層淺層網絡的學習。
  • 梯度爆炸通常出現深層網絡和權值初始化值太大的狀況下。隨着網絡的深度的加深,大於1的導數通過逐層累積,變得很是大,梯度值太大,會致使權值瞬間跳躍,指向不該該指向的位置,致使訓練收斂緩慢,甚至陷入局部最小值。

原理詳解

以梯度消失中的Sigmoid激活函數爲例,下面四個圖分別是Sigmod原函數公式及曲線和其導數公式及曲線。
 啊html

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

觀察Sigmoid函數曲線,能夠知道其輸出分佈在【0,1】區間,並且在輸入值較大和較小的狀況,其輸出值變化都會比較小,僅僅當輸入值接近爲0時,它們纔對輸入強烈敏感。Sigmod單元的普遍飽和性會使得基於梯度的學習變得很是困難。由於這個緣由,如今已經不鼓勵將它們做爲前饋網絡的隱藏單元。web

觀察Simod導數曲線,呈現一個相似高斯分佈的駝峯裝,其取值範圍在【0,0.25】之間,而咱們初始化後的網絡權值一般小於1,所以當層數增多時,小於0的值不斷相乘,最後就會致使梯度消失的狀況出現。而梯度爆炸則是當權值過大,致使其導數大於1,大於1的數不斷相乘,發生梯度爆炸。
同時Sigmoid還有其餘缺點,如輸出不是以0爲中心,而是0.5,這樣在求解權重的梯度時,梯度老是正或負的,指數計算耗時。網絡

總之不推薦使用sigmoid飽和激活函數。svg

不過sigmoid和tanh在RNN(LSTM、注意力機制等)結構上有所應用,做爲門控或者機率值。函數

這裏關於tanh爲何比simoid收斂快有一個比較好的說法,這裏引用了:性能

梯度消失問題程度
tanh′(x)=1−tanh(x)2∈(0,1)tanh′⁡(x)=1−tanh⁡(x)2∈(0,1)
sigmoid: s′(x)=s(x)×(1−s(x))∈(0,1/4)sigmoid: s′(x)=s(x)×(1−s(x))∈(0,1/4)
能夠看出tanh(x)的梯度消失問題比sigmoid要輕.梯度若是過早消失,收斂速度較慢.
以零爲中心的影響
若是當前參數(w0,w1)的最佳優化方向是(+d0, -d1),則根據反向傳播計算公式,咱們但願 x0 和 x1 符號相反。可是若是上一級神經元採用 Sigmoid 函數做爲激活函數,sigmoid不以0爲中心,輸出值恆爲正,那麼咱們沒法進行最快的參數更新,而是走 Z 字形逼近最優解。學習

在這裏插入圖片描述

解決方法

更改激活函數(Relu、Leaky-Relu、P-Relu等)

參考個人這篇博客 深度學習—非線性激活函數全面(Sigmoid、tanh、ReLU、Leaky ReLU、PReLU、RReLU、ELU、SELU、Swish、Maxout 10種)優化

權重初始化

不一樣的激活函數可能適用於不一樣的初始化方法,好比ReLU使用MSRA的初始化方法,tanh使用xavier的初始化方式。
第一選擇應該是ReLU,可是若是效果不佳能夠嘗試使用其變體或者Maxout激活函數。
能夠嘗試tanh正切函數(以零點爲中心,零點處梯度爲1)。.net

加入BN層(Batch Normalization)

paper:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

最初來自於Google的Inception-v2,由於效果很是好,加快收斂速度明顯。加上計算複雜度不高,目前大多數網絡模型都會添加BN層,使得輸出值在輸入到非線性激活函數以前映射到【0,1】區間。並且能夠減小前一層參數的變化對後一層輸入值的影響,每一層獨立訓練,具備必定的正則化效果。
在這裏插入圖片描述3d

梯度剪切、權重正則(針對梯度爆炸)

梯度剪切是設置一個剪切閾值,若是更新梯度時,梯度大於此閾值,那麼會將梯度拉回到閾值範圍內,能夠防止梯度爆炸。
權重正則,是防止過擬合的一個方法,可是當發生梯度爆炸時,權值的範數就會很是大,所以經過正則化項的限制,也能夠防止梯度爆炸。

使用預訓練模型進行finetue

這個方法和初始化的思想相似。原始思想是逐層進行訓練,而後再對整個網絡進行finetune,不過現階段,你們廣泛都是拿Imagenet上的預訓練模型進行finetune。
finetune會使得網絡權值分佈在一個相對較好的區間內,在更新的時候,會下降梯度變得過大太小的可能性。

使用ResNet殘差結構

來自何的大做,被認爲是深度學習模型的里程碑,後來不少模型以及其餘任務上的深度學習方法,都或多或少的參考了ResNet的skip connection結構。其在必定程度能夠防止梯度消失。甚至在網絡達到152層的時候,依然具備卓越的性能。


參考連接:
激活函數(ReLU, Swish, Maxout)
梯度消失和梯度爆炸問題詳解
http://www.javashuo.com/article/p-oyrovvyw-nm.html


2019.10.30 但願能幫到你。