神經網絡梯度消失和梯度爆炸原因推導及其解決方案

當我們需要解決一個非常複雜的問題,例如在高分辨率圖像中檢測數百種類型的對象,我們可能需要訓練一個非常深的DNN,可能需要幾十層或者上百層,每層包含數百個神經元,通過成千上萬個連接進行連接,我們會遇到以下問題:

首先,梯度消失或梯度爆炸

其次,訓練緩慢

第三,訓練參數大於訓練集的風險

梯度消失的原因:


生物神經元似乎是用 Sigmoid(S 型)激活函數活動的,因此研究人員在很長一段時間內堅持 Sigmoid 函數。但事實證明,Relu 激活函數通常在 ANN 工作得更好。這是生物研究誤導的例子之一。

當神經網絡有很多層,每個隱藏層都使用Sigmoid函數作爲激勵函數時,很容易引起梯度消失的問題

我們知道Sigmoid函數有一個缺點:當x較大或較小時,導數接近0;並且Sigmoid函數導數的最大值是0.25

我們將問題簡單化來說明梯度消失問題,假設輸入只有一個特徵,沒有偏置單元,每層只有一個神經元:

我們先進行前向傳播,這裏將Sigmoid激勵函數寫爲s(x):

z1 = w1*x

a1 = s(z1)

z2 = w2*a1

a2 = s(z2)

...

zn = wn*an-1 (這裏n-1是下標)

an = s(zn)

根據鏈式求導和反向傳播,我們很容易得出,其中C是代價函數

如果我們使用標準方法來初始化網絡中的權重,那麼會使用一個均值爲0標準差爲1的高斯分佈。因此所有的權重通常會滿足|wj|<1,而s‘是小於0.25的值,那麼當神經網絡特別深的時候,梯度呈指數級衰減,導數在每一層至少會被壓縮爲原來的1/4,當z值絕對值特別大時,導數趨於0,正是因爲這兩個原因,從輸出層不斷向輸入層反向傳播訓練時,導數很容易逐漸變爲0,使得權重和偏差參數無法被更新,導致神經網絡無法被優化,訓練永遠不會收斂到良好的解決方案。 這被稱爲梯度消失問題。

那麼我們繼續推廣到每層有多個神經元時,有其中a是Sigmoid函數的輸出,那麼它的範圍就是-1<a<1,那麼我們只考慮δ,有那麼很容易得出當參數|θ|<1時,容易引發梯度消失。

梯度爆炸的原因:


當我們將w初始化爲一個較大的值時,例如>10的值,那麼從輸出層到輸入層每一層都會有一個s‘(zn)*wn的增倍,當s‘(zn)爲0.25時s‘(zn)*wn>2.5,同梯度消失類似,當神經網絡很深時,梯度呈指數級增長,最後到輸入時,梯度將會非常大,我們會得到一個非常大的權重更新,這就是梯度爆炸的問題,在循環神經網絡中最爲常見.

解決方案:


好的參數初始化方式,如He初始化

非飽和的激活函數(如 ReLU)

批量規範化(Batch Normalization)

梯度截斷(Gradient Clipping)

更快的優化器

LSTM

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章