梯度消失和梯度爆炸

● 每週一言

時間,是成長的必要代價。

導語

在機器學習模型訓練的常見問題中,除了會遇到過擬合、欠擬合問題,還有一類問題也經常出現,那便是 梯度問題。梯度問題具體是什麼?又有哪些應對之法?

梯度問題

梯度問題出現在深度神經網絡的殘差反向傳播過程當中,原因是神經網絡通過鏈式法則求解不同層的梯度,中間的連乘操作有可能導致殘差計算的不穩定性,使得模型訓練失效。梯度問題具體有兩種表現形式:梯度消失梯度爆炸

fig1

梯度消失 又叫 梯度彌散。根據鏈式法則,如果每一層神經元的權重與上一層傳遞過來的殘差之積都小於1,這樣經過足夠多層傳遞之後,殘差值將趨近於0。

梯度消失示例:y1 = w1x1, x2 = f(y1), y2 = w2x2, x3 = f(y2), y3 = w3x3, …, xn = f(yn-1)。

其中x1是輸入層的輸入,x2、x3分別是中間兩個隱層的輸出,xn是輸出層的輸出。w1的梯度求解:σw1 = L’ * f’(y1) * f’(y2) * … * f’(yn-1) * w2 * … * wn-1 * x1。

fig2

上述示例可以看出,造成梯度消失的具體原因,要麼是權重w偏小,要麼就是x偏小。w偏小一般是參數初始化的問題,x偏小則是激活函數的問題。

比如常見的sigmoid激活函數,其導數f’(x) = f(x) * (1 - f(x))的最大值爲0.25,連乘比較容易造成梯度消失。

同上述示例,梯度爆炸 的具體原因則是初始化權重w過大所致。例如,各層激活函數如果是sigmoid,那麼造成梯度爆炸的必要條件是w的初始值至少大於4。

fig3

解決梯度問題主要有以下六種方法:

pre-training&fine-tunning 該方法由Hinton在2006年提出,採取先局部後整體的思想,pre-training先逐層訓練每一個隱層的神經元,fine-tunning再通過BP對整個網絡進行訓練微調。

梯度剪切 顧名思義,在向前傳遞殘差的時候,根據設定閾值進行殘差截斷。該手段主要用於防止梯度爆炸。

損失函數加入正則項 通過加入正則項,限制權重大小,具體正則項的講解可參考 正則項:把控擬合方向的馬車伕。該手段主要也是防止梯度爆炸。

fig4

使用線性組合的激活函數 如前文所述,sigmoid激活函數導數最大值爲0.25,且越靠近邊界導數值下降越明顯,可替換成ReLU等線性組合的激活函數,這些函數既簡單、導數值又是常數,能有效防止梯度消失。

Batch Normalization 這是G公司在ICML2015的論文中提出來的一種“批量規範化”的方案,簡單而言就是通過對每一層的輸出先進行規範化(減均值除方差),再進行激活傳遞至下一層。

加入殘差網絡 傳統的BP網絡都是殘差逐層串行傳遞,而該網絡支持殘差跨層傳遞,直接避免了連乘帶來的計算不穩定性。

以上便是梯度問題的講解,敬請期待下節內容。

結語

感謝各位的耐心閱讀,後續文章於每週日奉上,敬請期待。歡迎大家關注小鬥公衆號 對半獨白

face

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