寫在前面:
有些部落客對這個問題的解釋很好,這裡參考了:
詳解機器學習中的梯度消失、爆炸原因及其解決方法
我在這方面的工作經驗和知識面還不夠,還需要積累後再做出更為專業的解答。
參考我之前轉發過的一篇文章 : 轉載-從ReLU到GELU,一文概覽神經網絡的激活函數
1、什麼是梯度消失、梯度爆炸
深度學習中的梯度消失和梯度爆炸的問題發生在深度神經網絡模型訓練時反向傳播階段。深層網絡由許多非線性層堆疊而來,每一層非線性層都可以視為是一個非線性函數 f(x)(非線性來自于非線性激活函數),是以整個深度網絡可以視為是一個複合的非線性多元函數
優化深度網絡就是為了尋找到合适的權值,求解損失函數的最小值問題,采用梯度下降的方法再适合不過了。
可訓練參數的更新公式一般使用的梯度更新規則推導出的公式,w←w+Δw。
是以,根據鍊式法則,當梯度很少的時候,多層梯度相乘,就會使得更新項幾乎為零,那麼可訓練參數就不會發生改變。這就是梯度消失問題。
當梯度值很大的時候,多層梯度相乘,會使得更新項異常大,那麼可訓練參數可能波動很大,不會收斂。這就是梯度爆炸問題。
2、為什麼會發生梯度消失、梯度爆炸
1.深層網絡角度
從深層網絡角度來講,不同的層學習的速度差異很大,表現為網絡中靠近輸出的層學習的情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始随機初始化的值差不多。是以,梯度消失、爆炸,其根本原因在于反向傳播訓練法則,屬于先天不足,另外多說一句,Hinton提出capsule的原因就是為了徹底抛棄反向傳播
2.激活函數角度
計算權值更新資訊的時候需要計算前層偏導資訊,是以如果激活函數選擇不合适,比如使用sigmoid,梯度消失就會很明顯了。下圖是sigmoid的導數的圖像,其梯度不會超過0.25,如果使用sigmoid作為損失函數,經過鍊式求導之後,很容易發生梯度消失。
3、梯度消失、梯度爆炸在深度學習、機器學習模型訓練中的表現形式
表現為網絡中靠近輸出的層學習的情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始随機初始化的值差不多
4、在模型中快速定位梯度消失、梯度爆炸問題
5、梯度消失、梯度爆炸問題的解決方法
1、 預訓練加微調
2、梯度剪切、權重正則(針對梯度爆炸)
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設定一個梯度剪切門檻值,然後更新梯度的時候,如果梯度超過這個門檻值,那麼就将其強制限制在這個範圍之内。這可以防止梯度爆炸。
另外一種解決梯度爆炸的手段是采用權重正則化(weithts regularization)比較常見的是L1正則,和 L2正則,在各個深度架構中都有相應的API可以使用正則化。
3、 使用不同的激活函數,relu、leakrelu、elu等激活函數
4、使用batchnorm(梯度消失、梯度爆炸)
batchnorm是batch normalization,簡稱BN,即批規範化,通過規範化操作将輸出信号x規範化保證網絡的穩定性。目前已經被廣泛的應用到了各大網絡中,具有加速網絡收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題。
BatchNormalization就是通過對每一層的輸出規範為均值和方差一緻的方法,消除了x帶來的放大縮小的影響,進而解決梯度消失和爆炸的問題,或者可以了解為BN将輸出從飽和區拉倒了非飽和區。
5、 使用殘差結構(梯度消失)
來自何恺明的深度殘差網絡中的殘差結構。殘差結構中有跨層的連接配接連接配接,在反向傳播中可以解決梯度消失過快問題。神經網絡層數可以增加到上千層。
6、使用LSTM網絡(梯度消失、梯度爆炸)
LSTM全稱是長短期記憶網絡(long-short term memory networks),是不那麼容易發生梯度消失的,主要原因在于LSTM内部複雜的“門”(gates),如下圖,LSTM通過它内部的“門”可以接下來更新的時候“記住”前幾次訓練的”殘留記憶“。