天天看點

梯度消失和爆炸産生的主要原因及解決辦法

在牛客刷題來總結一下,發現總結後的吸收效果更好,有表達不清和了解錯誤的地方希望大家指出。

從原理上,梯度消失和爆炸都是由鍊式求導法則引起了,差別在于在鍊式法則的連乘過程中,某個參數的引起的改變是被無限縮小(梯度消失)還是無限放大 (梯度爆炸)。故這裡隻讨論一下梯度消失的問題。

梯度消失産生是由于鍊式法則的無限縮小引起的:其中的“無限”展現在網絡的層數,“縮小”則由不合适的激活函數引起。

(1)網絡層數過多的情況下,考慮一種極端情況,若每層網絡計算的導數值均小于1,則經過多層網絡連乘後,最前面幾層網絡的參數的更新值将會無限小。

(2)激活函數選擇不合适,比如使用sigmoid,梯度消失就會很明顯,原因如果使用sigmoid作為損失函數,其梯度是不可能超過0.25的,這樣經過鍊式求導之後,很容易發生梯度消失。

解決方法:

(1)pre-training+fine-tunning

其基本思想是每次訓練一層隐節點,訓練時将上一層隐節點的輸出作為輸入,而本層隐節點的輸出作為下一層隐節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網絡進行“微調”(fine-tunning)。

(2) 選擇relu等梯度大部分落在常數上的激活函數

relu函數的導數在正數部分是恒等于1的,是以在深層網絡中使用relu激活函數就不會導緻梯度消失的問題,但也有可能會導緻梯度爆炸。

(3)batch normalization

BN就是通過對每一層的輸出規範為均值和方差一緻的方法,消除了權重參數放大縮小帶來的影響,進而解決梯度消失的問題,或者可以了解為BN将輸出從飽和區拉到了非飽和區。

(4) 特殊網絡的結構

殘差網絡中有很多跨層連接配接結構(shortcut),這樣的結構在反向傳播時多了反向傳播的路徑,可以一定程度上解決梯度消失的問題;LSTM全稱是長短期記憶網絡(long-short term memory networks),LSTM的結構設計可以改善RNN中的梯度消失的問題。主要原因在于LSTM内部複雜的“門”(gates),LSTM通過它内部的“門”可以在更新的時候“記住”前幾次訓練的”殘留記憶“。

參考資料:

https://www.nowcoder.com/test/question/done?tid=31361018&qid=894494#summary

https://www.cnblogs.com/XDU-Lakers/p/10553239.html

https://www.cnblogs.com/pinking/p/9418280.html

繼續閱讀