梯度彌散、梯度爆炸及解決方案

1.梯度更新

 在處理複雜任務上,深度網絡比淺層網絡具有更好的效果。但是,目前優化神經網絡的方法都是基於反向傳播的思想,即根據損失函數計算的誤差通過梯度反向傳播的方式,指導深度網絡權值的更新優化
 深度神經網絡可看做是複合的非線性多元函數
F(x)=fn(...f3(f2(f1(x)θ1+b)θ2+b)...)F(x)=f_n(...f_3(f_2(f_1(x)∗θ_1+b)∗θ_2+b)...)
優化深度網絡就是爲了尋找到合適的權值,滿足Loss=L(ytrue,F(x))Loss=L(y_{true},F(x))取得極小值點。而尋找極小值,通常採用梯度下降法

2.梯度消失、梯度爆炸

梯度消失
 網絡層之間的梯度(小於1)重複相乘導致的指數級減小會產生梯度消失。
原因: 主要是因爲網絡層數太多、太深,導致梯度無法傳播。本質應該是激活函數的飽和性。
表現: 神經網絡的反向傳播是逐層對函數偏導相乘,因此當神經網絡層數非常深的時候,最後一層產生的偏差就因爲乘了很多的小於1的數而越來越小,最終就會變爲0,從而導致層數比較淺的權重沒有更新。
經常出現的情況:
 (1) 在深層網絡中
 (2) 採用了不合適的損失函數,比如sigmoid

梯度爆炸
 網絡層之間的梯度(大於 1.0)重複相乘導致的指數級增長會產生梯度爆炸。
原因: 初始化權值過大,前面層會比後面層變化的更快,就會導致權值越來越大,梯度爆炸的現象就發生了。
表現:深層網絡或循環神經網絡中,誤差梯度可在更新中累積,變成非常大的梯度,然後導致網絡權重的大幅更新,並因此使網絡變得不穩定。在極端情況下,權重的值變得非常大,以至於溢出,導致 NaN 值(即無窮大)。
一般出現的情況:
 (1)在深層網絡、循環神經網絡中
 (2)權值初始化值太大

2.1.BP更新權重

 BP算法基於梯度下降策略,以目標的負梯度方向對參數進行調整,參數的更新爲ww+Δww←w+Δw,給定學習率α\alpha,得出Δw=αLossw\Delta w=-\alpha \frac{\partial Loss}{\partial w}
 給定4層全連接網絡,定義網絡輸入爲Xinput=x0X_{input}=x_0ff是激活函數,ii隱藏層網絡HLiHL_i經激活函數的輸出爲fi(x)f_i(x),其中xx代表第ii層的輸入、第i1i−1層的輸出。
HL1HL_1f1=f(x0w1+b1)f_1=f(x_0*w_1+b_1)
HLi+1HL_{i+1}fi+1=f(fiwi+1+bi+1)=f(zi+1)f_{i+1}=f(f_i*w_{i+1}+b_{i+1})=f(z_{i+1})
更新第2隱藏層的權值信息,根據鏈式求導法則
Δw2=Lossw2=Lossf4f4f3f3f2f2w2=Lossf4f4z4z4f3f3z3z3f2f2z2z2w2=Lossf4f(z4)w4f(z3)w3f(z2)f1\Delta w_2=\frac{\partial Loss}{\partial w_2}=\frac{\partial Loss}{\partial f_4}\frac{\partial f_4}{\partial f_3}\frac{\partial f_3}{\partial f_2}\frac{\partial f_2}{\partial w_2}\\=\frac {\partial Loss}{\partial f_4}*\frac{\partial f_4}{\partial z_4}\frac{\partial z_4}{\partial f_3}*\frac{\partial f_3}{\partial z_3}\frac{\partial z_3}{\partial f_2}*\frac{\partial f_2}{\partial z_2}\frac{\partial z_2}{\partial w_2}\\=\frac {\partial Loss}{\partial f_4}*f'(z_4)w_4*f'(z_3)w_3*f'(z_2)f_1

f2w2=f(f1w2+b2)(f1w2+b2)(f1w2+b2)w2=f(f1w2+b2)f1=f(z2)f1\frac{\partial f_2}{\partial w_2}=\frac {\partial f(f_1*w_2+b_2)}{\partial (f_1*w_2+b_2)}*\frac {\partial (f_1*w_2+b_2)}{\partial w_2}\\=f'(f_1*w_2+b_2)*f_1=f'(z_2)f_1

第四層激活函數對第三層輸出的導數:
f4f3=f(f3w4+b4)(f3w4+b4)(f3w4+b4)f3=f(f3w4+b4)w4=f(z4)w4\frac {\partial f_4}{\partial f_3} = \frac {\partial f(f_3*w_4+b_4)}{\partial (f_3*w_4+b_4)}*\frac {\partial (f_3*w_4+b_4)}{\partial f_3}\\=f'(f_3*w_4+b_4)*w_4=f'(z_4)*w_4

根據上式可知,在權重更新時,會出現多個激活函數的導數相乘的情況。此時:

  • 導數>1,隨着層數的增加,求出的梯度的更新將以指數形式增加,發生梯度爆炸
  • 導數<1,隨着層數的增加求出的梯度更新的信息會以指數形式衰減,發生梯度消失

 從深層網絡角度來說,不同的層學習的速度差異很大,表現爲網絡中靠近輸出的層學習的情況很好靠近輸入層的學習很慢,甚至即使訓練了很久,前幾層的權值和剛開始初始化的值差不多,因此梯度消失和梯度爆炸的根本原因在於反向傳播算法的不足
 Hinton提出capsule的原因就是爲了徹底拋棄反向傳播

2.2.激活函數的影響

在這裏插入圖片描述
ReLU及其變體則是非飽和激活函數。使用非飽和激活函數的優勢在於:

  1. 解決梯度消失
  2. 加快收斂速度:
    Sigmoid函數需要將輸入壓縮至[0, 1]的範圍
    tanh函數需要將輸入壓縮至[-1, 1]的範圍

2.2.1. Sigmoid

Sigmoid(x)=σ(x)=11+exSigmoid(x)=\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=σ(x)(1σ(x))\sigma'(x)=\sigma(x)(1-\sigma(x))
使用sigmoid作爲損失函數,其梯度是不可能超過0.25的,經過鏈式求導之後,很容易發生梯度消失在這裏插入圖片描述

2.2.2.Tanh

tanh(x)=exexex+extanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
tanh(x)=1(tanh(x))2tanh'(x)=1-(tanh(x))^2
tanh比sigmoid要好一些,但是它的導數仍然小於1。
tanh求導推導代碼和可視化
在這裏插入圖片描述

2.2.3. Relu

ReLU=max(0,x)={0,x<0x,x>0ReLU=max(0,x)=\begin{cases}0,x<0\\x,x>0\end{cases}
ReLU={0,x<01,x>0ReLU'=\begin{cases}0,x<0\\1,x>0\end{cases}
ReLU函數的導數在正數部分恆等於1,因此在深層網絡中使用不會導致梯度消失和爆炸
在這裏插入圖片描述

優點:

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

缺點:

  • 由於負數部分恆爲0,會導致一些神經元無法激活(可通過設置小學習率部分解決)
  • 輸出不是以0爲中心的

2.2.4.LeakReLU

leakReLU=max(αx,x),0<α<1leakReLU=max(\alpha∗x,x),0<\alpha<1
leakReLU={leak,x<01,x>0leakReLU'=\begin{cases}leak,x<0\\1,x>0\end{cases}
其中,leak係數α\alpha一般選擇0.01或者0.02,或者通過學習而來。
leakReLU解決了0區間帶來的影響,而且包含了ReLU的所有優點。
在這裏插入圖片描述

2.2.5.ELU

ELU(x)=max(0,x)={x,x0α(ex1),x<0ELU(x)=max(0,x)=\begin{cases}x,x\geqslant0\\\alpha(e^x-1),x<0\end{cases}
ELU(x)={1,x0ELU(x)+α,x<0ELU'(x)=\begin{cases}1,x\geqslant0\\ELU(x)+\alpha,x<0\end{cases}
其中,α>0\alpha>0

ELU相對於leakReLU來說,計算要更耗時。
在這裏插入圖片描述

2.2.6.PReLU(參數化修正線性單元)

 PReLU可以看作是Leaky ReLU的一個變體。在PReLU中,負值部分的斜率是根據數據來定的,而非預先定義的。
 作者稱,在ImageNet分類(2015,Russakovsky等)上,PReLU是超越人類分類水平的關鍵所在。

2.2.7.RReLU(隨機糾正線性單元)

PReLU(x)={x,x0αx,x<0PReLU(x)=\begin{cases}x,x\geqslant0\\\alpha x,x<0\end{cases}
αU(l,r),l<rl,r[0,1)\alpha\sim U(l,r),l<r且l,r∈[0,1)
 RReLU也是Leaky ReLU的一個變體。在RReLU中,負值的斜率在訓練中是隨機的在之後的測試中是固定的
亮點: 在訓練環節中,α\alpha是從一個均勻分佈U(l,r)U(l,r)中隨機抽取的數值。

2.2.8.ReLU其他變體

ReLU其他變體鏈接
CReLU(Concatenated Rectified Linear Units)
SELU

3.解決方案

在深度神經網絡中,往往是梯度消失出現的更多一些。

3.1.預訓練加微調

Hinton爲了解決梯度的問題,提出採取無監督逐層訓練方法。其基本思想是:

  1. 逐層預訓練:每次訓練一層隱節點,訓練時將上一層隱節點的輸出作爲輸入,而本層隱節點的輸出作爲下一層隱節點的輸入
  2. Fine-tunning:在預訓練完成後,再對整個網絡進行“微調”

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

3.2.梯度剪切(針對梯度爆炸)

設置梯度剪切閾值。在更新梯度時,如果梯度超過這個閾值,那麼就將其強制限制在這個範圍之內。

注:在WGAN中也有梯度剪切限制操作,但是和這個是不一樣的,WGAN限制梯度更新信息是爲了保證lipchitz條件。(?)

3.3.權重正則化(針對梯度爆炸)

Loss=(yWTx)2+αW2Loss=(y-W^Tx)^2+ \alpha ||W||^2
其中,α\alpha是指正則項係數。
發生梯度爆炸時,權值的範數會非常大,通過正則化項,可以部分限制梯度爆炸的發生。此外,通過對網絡權重做正則,還可限制過擬合

3.4.使用ReLU等激活函數

3.5.批規範化 Batch Normalization

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

舉例:
正向傳播:f2=f(f1(wTx+b))f_2=f(f_1(w^T*x+b))
反向傳播:f2w=f2f1x\frac {\partial f_2}{\partial w}=\frac{\partial f_2}{\partial f_1}x
反向傳播的式子中有xx的存在,所以**xx的大小會影響梯度的消失和爆炸**。
BN通過將每一層的輸出規範爲均值和方差一致的方法,消除了xx帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題。也可以理解爲:BN將輸出從飽和區拉到了非飽和區。

3.6.殘差結構

 殘差可以很輕鬆的構建幾百層,一千多層的網絡而不用擔心梯度消失過快的問題,原因就在於殘差的捷徑(shortcut)部分。
在這裏插入圖片描述
 相比較於以前網絡的直來直去結構,殘差中有很多這樣的跨層連接結構,這樣的結構在反向傳播中具有很大的好處。
在這裏插入圖片描述
上式表示損失函數到達L的梯度,小括號裏的1表示短路機制(identity x) 可以無損地傳播梯度,而另一項殘差梯度則需要經過帶有weights的層,殘差梯度不會那麼巧全爲-1,就算其很小,由於1的存在不會導致梯度消失,所以殘差學習會更容易。

殘差網絡的出現導致了Image net比賽的終結。
論文:Deep Residual Learning for Image Recognition
論文解讀

3.7.優化的循環神經網絡

重置:有助於捕捉時間序列短期的依賴關係;
更新:有助於捕捉時間序列⾥⻓期的依賴關係。
遺忘門:控制上一時間步的記憶細胞
輸入門:控制當前時間步的輸入
輸出門:控制從記憶細胞到隱藏狀態
記憶細胞:種特殊的隱藏狀態的信息的流動

3.7.1.LSTM

 LSTM全稱是長短期記憶網絡(long-short term memory networks),不容易發生梯度消失
 主要原因在於LSTM內部複雜的門(gates)。LSTM通過“門”,可以在接下來更新的時候“記住”前幾次訓練的”殘留記憶“。因此,經常用於生成文本中。目前也有基於CNN的LSTM。
在這裏插入圖片描述
在這裏插入圖片描述

3.7.2.GRU

在這裏插入圖片描述

3.7.3.深度循環網絡

在這裏插入圖片描述

3.7.4.雙向循環神經網絡

在這裏插入圖片描述

3.8.初始化合理的權重值

可避免梯度爆炸或消失,也可以加快訓練速度。

參考

https://blog.csdn.net/qq_25737169/article/details/78847691
https://zhuanlan.zhihu.com/p/68579467
https://www.mscto.com/ai/288755.html
https://blog.csdn.net/qq_30815237/article/details/89453315
https://blog.csdn.net/sisteryaya/article/details/81364089
https://www.cnblogs.com/chamie/p/8665251.html

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