【深度學習】梯度消失與梯度爆炸的原因分析與解決策略

前言

梯度消失和梯度爆炸是深度網絡訓練過程中容易遇到的問題,由於網絡層數的加深,梯度的膨脹或縮小效應不斷累積,最終很容易造成模型無法收斂。除了模型本身的深度,發生的原因往往與參數初始化及模型設置,這裏列舉一些場景的原因與解決策略,以供參考。

一、發生原因

梯度消失與梯度爆炸出現的原因基本一致,一般可能是網絡層數過深、激活函數、損失函數設置與參數初始化問題。學過梯度下降理論就很好理解,無非就是求梯度過程某個值過大過小或鏈式法則層數過多導致累積效果過大。
梯度消失:隱層過多;不合適的激活函數(也有可能產生梯度爆炸)
梯度爆炸:隱層過多;權重初始值過大

深層網絡

反向傳播算法根據鏈式求導法則,如果某部分比如激活函數求導的值持續小於1,那麼隨着網絡變深效果累積就會導致梯度以指數形式衰減,即發生了梯度消失;相應的如果持續大於1,那麼最終的梯度信息會以指數形式增加,最終發生了梯度爆炸。

這張圖就可以很好的說明這個現象,對於layer1,反向傳播過程鏈式法則的項數較多,如果持續小於1那麼梯度會變得很小,學習的速度也會相應變得很慢,正是由於這種累積效應,速度差異達到很多數量級。(這裏那能不能對於深層區域通過設計優化算法採用更高的學習率使之一致呢
總結一下,從深層網絡角度來講,不同的層學習的速度差異很大,表現爲網絡中靠近輸出的層學習的情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始隨機初始化的值差不多。因此,梯度消失、爆炸,其根本原因在於反向傳播訓練法則,屬於先天不足。

激活函數


這個可以參考之前對激活函數介紹的博文。很多激活函數例如sigmoid的導數本身值域就很小,甚至在一定範圍的輸入下十分接近零,這就導致很容易發生梯度消失。而tanh雖然好一點,但導數值域還是小於等於1的,效果也不夠理想。

初始化

這個就比較好理解了,初始化值如果過大其梯度很容易發散,導致梯度爆炸。

二、解決方案

爲了解決梯度消失和梯度爆炸的問題,可以從問題原因角度出發。例如激活函數、參數分佈(初始化來限制初始情況、正則項來限制更新),或者採用一些特殊結構來限制過深網絡的退化現象,甚至強制性的對問題結果即梯度爆炸進行截斷

激活函數

例如使用relu、leakrelu、elu之類的激活函數,如果激活函數的導數爲1,那麼就不存在梯度消失爆炸的問題了,每層的網絡都可以得到相同的更新速度

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

但是因爲負數部分恆爲零會導致一些神經元無法激活,但不會因此導致學習能力下降,只是需要更多的神經元,具體可以看之前激活函數那篇文章中的解釋。
這個是從激活函數的角度出發

參數初始化方式

例如使用He初始化方法
這個也是從數據分佈角度出發

batch norm

Batchnorm是深度學習發展以來提出的最重要的成果之一了,目前已經被廣泛的應用到了各大網絡中,具有加速網絡收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題。batchnorm全名是batch normalization,簡稱BN,即批規範化,通過規範化操作將輸出信號x規範化保證網絡的穩定性。
反向傳播式子中有xxx的存在,所以xxx的大小影響了梯度的消失和爆炸,batchnorm就是通過對每一層的輸出規範爲均值和方差一致的方法,消除了xxx帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題,或者可以理解爲BN將輸出從飽和區拉倒了非飽和區。
這個是從數據分佈的角度出發

殘差結構

在這裏插入圖片描述
Residual Unit中加入了shortcut來降低梯度丟失現象
這個是通過特殊結構來抑制梯度消失

LSTM


通過其內部複雜的門來進行記憶,從而使之不那麼容易“梯度消失”
這個也是通過特殊結構來抑制梯度消失

梯度剪切

設置一個梯度剪切的閾值,更新梯度的時候如果超過這個閾值那麼就將之限制在這個範圍內,防止梯度爆炸

權重正則化

正則化是通過對網絡權重做正則限制過擬合同時也能防止梯度爆炸,如果發生梯度爆炸那麼權值範數會很大,而通過正則化項可以限制梯度爆炸的發送
這個是通過

參考資料

https://blog.csdn.net/qq_25737169/article/details/78847691

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