梯度消失(爆炸)及其解決方式


梯度消失和梯度爆炸的解決之道

參考<機器學習煉丹術>

因為梯度不穩定,因此產生梯度消失和梯度爆炸的問題

出現原因

梯度消失和梯度爆炸是指前面幾層的梯度,因為鏈式法則不斷乘小於(大於)1的數,導致梯度非常小(大)的現象;
sigmoid導數最大0.25,一般都是梯度消失問題。

兩者出現原因都是因為鏈式法則。當模型的層數過多的時候,計算梯度的時候就會出現非常多的乘積項。用下面這個例子來理解:

這里還可以說一句sigmoid是飽和函數,它是有屆的

解決方法

更改激活函數

最常見的方案就是更改激活函數,現在神經網絡中,除了最后二分類問題的最后一層會用sigmoid之外,每一層的激活函數一般都是用ReLU。

如果激活函數的導數是1,那么就沒有梯度爆炸問題了。

增加batchnorm層

這個是非常給力的成功,在圖像處理中必用的層了。BN層提出來的本質就是為了解決反向傳播中的梯度問題。

在神經網絡中,有這樣的一個問題:Internal Covariate Shift。假設第一層的輸入數據經過第一層的處理之后,得到第二層的輸入數據。這時候,第二層的輸入數據相對第一層的數據分布,就會發生改變,所以這一個batch,第二層的參數更新是為了擬合第二層的輸入數據的那個分布。然而到了下一個batch,因為第一層的參數也改變了,所以第二層的輸入數據的分布相比上一個batch,又不太一樣了。然后第二層的參數更新方向也會發生改變。層數越多,這樣的問題就越明顯。

但是為了保證每一層的分布不變的話,那么如果把每一層輸出的數據都歸一化0均值,1方差不就好了?但是這樣就會完全學習不到輸入數據的特征了。不管什么數據都是服從標准正太分布,想想也會覺得有點奇怪。所以BN就是增加了兩個自適應參數,可以通過訓練學習的那種參數。這樣把每一層的數據都歸一化到均值,標准差的正態分布上。

【將輸入分布變成正態分布,是一種去除數據絕對差異,擴大相對差異的一種行為,所以BN層用在分類上效果的好的。對於Image-to-Image這種任務,數據的絕對差異也是非常重要的,所以BN層可能起不到相應的效果。】

增加殘差結構

L2正則化

之前提到的梯度爆炸問題,一般都是因為\(w_j\)過大造成的,那么用L2正則化就可以解決問題。

另外一種解決梯度爆炸的手段是采用權重正則化(weithts regularization),正則化主要是通過對網絡權重做正則來限制過擬合。如果發生梯度爆炸,那么權值就會變的非常大,反過來,通過正則化項來限制權重的大小,也可以在一定程度上防止梯度爆炸的發生。比較常見的是 L1 正則和 L2 正則,在各個深度框架中都有相應的API可以使用正則化。

換網絡結構

比如換成lstm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM