一、梯度消失、梯度爆炸産生的原因
對于1.1 1.2,其實就是矩陣的高次幂導緻的。在多層神經網絡中,影響因素主要是權值和激活函數的偏導數。
1.1 前饋網絡
若要對于w1求梯度,根據鍊式求導法則,得到的解為:

通常,若使用的激活函數為sigmoid函數,其導數最大為1/4:
這樣可以看到,如果我們使用标準化初始w,那麼各個層次的相乘都是0-1之間的小數,而激活函數f的導數也是0-1之間的數,其連乘後,結果會變的很小,導緻梯度消失。若我們初始化的w是很大的數,w大到乘以激活函數的導數都大于1,那麼連乘後,可能會導緻求導的結果很大,形成梯度爆炸。
通常我們會将一個完整的句子序列視作一個訓練樣本,是以總誤差即為各時間步(單詞)的誤差之和。
而RNN還存在一個權值共享的問題,即這幾個w都是一個,假設,存在一個反複與w相乘的路徑,t步後,得到向量:
若特征值大于1,則會出現梯度爆炸,若特征值小于1,則會出現梯度消失。是以在一定程度上,RNN對比BP更容易出現梯度問題。主要是因為RNN處理時間步長一旦長了,W求導的路徑也變的很長,即使RNN深度不大,也會比較深的BP神經網絡的鍊式求導的過程長很大;另外,對于共享權值w,不同的wi相乘也在一定程度上可以避免梯度問題。
二、如何解決梯度消失、梯度爆炸
1、對于RNN,可以通過梯度截斷,避免梯度爆炸
首先設定梯度門檻值:clip_gradient
在後向傳播中求出各參數的梯度,不直接用梯度進行參數更新,求梯度的L2範數
然後比較範數||g||與clip_gradient的大小
如果範數大,求縮放因子clip_gradient/||g||,由縮放因子可以看出梯度越大,縮放因子越小,就可以很好的控制梯度的範圍。
最後将梯度乘以縮放因子得到最後需要的梯度。
L1範數是指向量中各個元素絕對值之和
L2範數是指向量各元素的平方和然後求平方根
2、可以通過添加正則項,避免梯度爆炸
正則化是通過對網絡權重做正則限制過拟合,仔細看正則項在損失函數的形式:
regularization 公式:
Loss=(y−WTx)2+α∣∣W∣∣2,其中,α 是指正則項系數,是以,如果發生梯度爆炸,權值的範數就會變的非常大,通過正則化項,可以部分限制梯度爆炸的發生。
3、使用LSTM等自循環和門控制機制,避免梯度消失
4、優化激活函數,譬如将sigmold改為relu,避免梯度消失
如果激活函數的導數是1,那麼就沒有梯度爆炸問題了。可以發現,relu函數的導數在正數部分,是等于1的,是以就可以避免梯度消失的問題。【不好】:但是負數部分的導數等于0,這樣意味着,隻要在鍊式法則中某一個
小于0,那麼這個神經元的梯度就是0,不會更新。
5、BN層
BN層提出來的本質就是為了解決反向傳播中的梯度問題。
假設第一層的輸入資料經過第一層的處理之後,得到第二層的輸入資料。這時候,第二層的輸入資料相對第一層的資料分布,就會發生改變,是以這一個batch,第二層的參數更新是為了拟合第二層的輸入資料的那個分布。然而到了下一個batch,因為第一層的參數也改變了,是以第二層的輸入資料的分布相比上一個batch,又不太一樣了。然後第二層的參數更新方向也會發生改變。層數越多,這樣的問題就越明顯。
但是為了保證每一層的分布不變的話,那麼如果把每一層輸出的資料都歸一化0均值,1方差不就好了?但是這樣就會完全學習不到輸入資料的特征了。不管什麼資料都是服從标準正太分布,想想也會覺得有點奇怪。是以BN就是增加了兩個自适應參數,可以通過訓練學習的那種參數。這樣把每一層的資料都歸一化到β均值,γ标準差的正态分布上。
【将輸入分布變成正态分布,是一種去除資料絕對差異,擴大相對差異的一種行為,是以BN層用在分類上效果的好的。
6、殘差網絡
殘差單元可以以跳層連接配接的形式實作,即将單元的輸入直接與單元輸出加在一起,然後再激活。是以殘差網絡可以輕松地用主流的自動微分深度學習架構實作,直接使用BP算法更新參數。錯誤信号可以不經過任何中間權重矩陣變換直接傳播到低層,一定程度上可以緩解梯度彌散問題(即便中間層矩陣權重很小,梯度也基本不會消失)。
三、梯度消失和梯度爆炸哪種經常出現
事實上,梯度消失更容易出現,因為對于激活函數的求導:
可以看到,當w越大,其wx+b很可能變的很大,而根據上面sigmoid函數導數的圖像可以看到,wx+b越大,導數的值也會變的很小。是以,若要出現梯度爆炸,其w既要大還要保證激活函數的導數不要太小。
通常,若使用的激活函數為sigmoid函數,其導數: