梯度消失、梯度爆炸的解決方法及其解釋

首發地址:https://zhuanlan.zhihu.com/p/143417405

1、梯度消失

1.1、換激活函數

從sigmoid換成relu或relu的一系列改進版,比如leaky relu等。sigmoid中導數接近於零的情況,就換成了導數恆定的情況,單個節點的梯度(導數)就不管x變化都永遠有了。

但是多個0~1之間的數相乘還是趨近於0的趨勢沒變,所以只是緩解,而非完全解決。
sigmoid

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正則化項。


如果覺得有用,請點贊~

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