首發地址:https://zhuanlan.zhihu.com/p/143417405
1、梯度消失
1.1、換激活函數
從sigmoid換成relu或relu的一系列改進版,比如leaky relu等。sigmoid中導數接近於零的情況,就換成了導數恆定的情況,單個節點的梯度(導數)就不管x變化都永遠有了。
但是多個0~1之間的數相乘還是趨近於0的趨勢沒變,所以只是緩解,而非完全解決。
1.2、Batch Norm
還用sigmoid,可以通過normalization將值scale到sigmoid的有效範圍內,有效範圍內導數大於0,可以緩解梯度下降的情況。
(圖片來源 : 李宏毅講transformer:www.bilibili.com/video/av56239558/)
上圖中,橫向紅框是batch norm,縱向紅框是layer norm
(圖片來源 : https://blog.csdn.net/wsp_1138886114/article/details/81535272)
1.3、換網絡結構
1.3.1、LSTM
下圖紅箭頭路徑是相加的關係,所以求梯度就不再是導數相乘的關係,就緩解了梯度下降的問題。(但是綠色路徑依然存在梯度爆炸的問題。)
(圖片來源 : https://www.cnblogs.com/pinking/p/9362966.html)
1.3.2、ResNet
感性理解是,導數整體加了1,相比原先就不那麼容易梯度消失了吧。
更感性理解是,resnet是兩個網絡融合之後的結果,一個是原先的,一個是去掉這一層結構的,去掉後相乘的元素就少了一個,就不那麼容易梯度消失了,,兩個結構合併後也比原先更不容易梯度消失;多層resnet也是同理。
1.4、pretrain + fine-tuning
好多資料都說了這一點,可是我感覺這壓根就是兩碼事,因爲如果考慮可以換成預訓練模型,那選項那麼多,直接選不容易梯度消失的模型就可以了。問題就轉成了怎麼選模型的問題了,就已經不是怎麼(通過小改動)解決梯度消失的問題了。故略。
2、梯度爆炸
**
2.1、梯度剪切
**
設置梯度的最大閾值,當算出來梯度很大,超過閾值時,就取最大閾值當做梯度。
強硬不讓它炸。就這麼簡單粗暴有效。
(記得李宏毅說這方法最早的出現,並不在論文正文中,有人復現不出結果纔看論文後面的資料,纔看到。)
2.2、權重正則化
目標函數 = 損失函數 + 正則化項。通過目標函數中的正則化項,“懲罰”過大的權重,從而使權重不會過大,進而緩解梯度爆炸的問題。
比如L1、L2正則化項。
如果覺得有用,請點贊~