bp演算法中為什麼會產生梯度消失?


簡單地說,根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話(w_{ij}y_{i} ),那麼即使這個結果是0.99,在經過足夠多層傳播之後,誤差對輸入層的偏導會趨於0(lim_{n	oinfty}0.99^n=0 )。下面是數學推導推導。

假設網路輸出層中的第k 個神經元輸出為y_{k}(t),而要學習的目標為d_{k}(t) 。這裡的t 表示時序,與輸入無關,可以理解為網路的第t 層。

若採用平方誤差作為損失函數,第k 個輸出神經元對應的損失為 L=frac{1}{2}(d_{k}(t)-y_{k}(t))^{2}

將損失L 對輸出y_{k}(t)求偏導 vartheta_{k}(t)=frac{partial{L}}{partial{y_{k}(t)}}=y_{k}

根據鏈式法則,我們知道,第t-1 層的梯度可以根據第t 層的梯度求出來

vartheta_{i}(t-1)=y_{i}

這裡用i 表示第t-1 層的第i 個神經元,j 表示第t 層的第j 個神經元。

進一步,第t-q 層的梯度可以由第t-q+1 層的梯度計算出來

vartheta_{i}(t-q)=y_{i}

這實際上是一個遞歸嵌套的式子,如果我們對vartheta_{j}(t-q+1) 做進一步展開,可以得到式子

vartheta_{i}(t-q)=y_{i}

最終,可以一直展開到第t 層。

把所有的加法都移到最外層,可以得到

vartheta_{i}(t-q)=sum_{l_{t-q+1}=1}^{n}cdotcdotcdotsum_{l_{t}=1}^{n}prod_{m=0}^{q}w_{l_{m}l_{m-1}}vartheta_{lm}(t-m)

l_{t-q+1} 表示的是第t-q+1 層中神經元的下標(即第t-q+1 層第l_{t-q+1} 個神經元),l_{t} 表示第t 層的下標。m=0 對應輸出層,m=q 對應第t-q 層。實際上展開式就是從網路的第t 層到t-q 層,每一層都取出一個神經元來進行排列組合的結果。這個式子並不準確,因為m=0 時實際是損失L 對輸出層的偏導,即

vartheta_{k}(t)=y_{k}

並沒有應用權重w_{l_{m}l_{m-1}},把它修正一下

vartheta_{i}(t-q)=sum_{l_{t-q+1}=1}^{n}cdotcdotcdotsum_{l_{t}=1}^{n}prod_{m=1}^{q}w_{l_{m}l_{m-1}}y_{lm}

這樣,我們就得到了第t-q 層和第t 層的梯度之間的關係

frac{vartheta_{i}(t-q)}{vartheta_{k}(t)}=sum_{l_{t-q+1}=1}^{n}cdotcdotcdotsum_{l_{t}=1}^{n}prod_{m=1}^{q}w_{l_{m}l_{m-1}}y_{lm}

在上面的式子中,由於加法項正負號之間可能互相抵消。因此,比值的量級主要受最後的乘法項影響。如果對於所有的m

|w_{l_{m}l_{m-1}}y_{lm}1.0" eeimg="1">

則梯度會隨著反向傳播層數的增加而呈指數增長,導致梯度爆炸。

如果對於所有的m

|w_{l_{m}l_{m-1}}y_{lm}

則在經過多層的傳播後,梯度會趨向於0,導致梯度消失。

LSTM就是為了解決以上兩個問題提出的方法之一,它強制令w_{l_{m}l_{m-1}}y_{lm} 。 LSTM如何來避免梯度彌撒和梯度爆炸? - 知乎

有興趣可以參考Long Short Term Memory 一文 。上面的推導過程大體上也參考自這篇論文。

Reference:

Graves, Alex. Long Short-Term Memory. Supervised Sequence Labelling with Recurrent Neural Networks. Springer Berlin Heidelberg, 2012:1735-1780.


主要是因為以前用sigmoid的時候,sigmoid中心部位和兩側的梯度差別太大,如果權重初始化得太大,激活值基本都在sigmoid兩側,兩側梯度幾乎為0,傳播幾層就沒有梯度了。

即使用很好的初始化演算法把激活值控制在一個合理範圍內,優化幾下有幾個神經元就又跑到兩側了,而一旦到兩側,因為梯度過小,就再也無法通過梯度更新來使其恢復。

這個問題在提出ReLU和有效的初始化方法(例如MSRA)後已經大概率解決。

後來又出了個Batch Normalization,不管優化多少層都跟淺層一樣,梯度消失問題基本可以認為徹底解決了。


別的答案都寫得很好,我就不說那麼複雜了,手機打不太方便,你算一算sigmoid函數的導數,x*(1-x)反向傳播的時候是一個鏈式偏導,本來你的神經元經過前向傳播sigmoid函數激活後就是一個0到1之間的數,現在還乘以1-x,兩個小數相稱,乘的多就趨於0了啊,那還有個鬼的梯度啊


我覺得這個取決於你用的activation function吧。比如說sigmoid

圖像不是很清晰哈,z=wx+b,a=f(z)指sigmoid函數,當z偏大或者偏小的時候,我們對w求偏導。

所以說會出現梯度消失的情況,準確的說是loss會下降的非常慢不是完全消失。為了防止這種情況,我們使用batchnorm。

推導的時候有一定瑕疵,比如說x^應先對x(也就是z)求偏導然後乘以x,不過為了方便理解省略了,大體就是這樣,歡迎前輩指導。(字體比較丑。。。


這篇文章寫的通俗易懂,如果看不懂公式推導可以只看解釋的部分。

總的來說是因為激活函數的問題,造成每層乘以了最多0.25的乘積。

同時也解釋了為什麼會梯度激增

http://m.blog.csdn.net/article/details?id=52742773from=timeline


梯度消失指的是權重不再更新,直觀上看是從最後一層到第一層權重的更新越來越慢,直至不更新。本質原因是反向傳播的連乘效應,導致最後對權重的偏導接近於零。


網路層數太多是導致梯度消失或者梯度爆炸的直接原因, 使用S型激活函數(如:sigmoid函數,tanh函數)會導致梯度消失問題,初始權重設置太大會導致梯度爆炸


sigmoid你求下導數就知道了。 最大值為1/4。層數一深就自然而然vanish了。和saturation有關,但更大的原因還是因為不管在哪裡sigmoid導數都小於等於1/4。 tanh好一些,但依舊有類似問題。所以為什麼relu好,因為導數要麼0要麼1,gradient explode,clip就好,頂多收斂慢一些。而vanish就沒辦法了。

residual也是一個解決vanish比較好的辦法。 residual感覺是隨著訓練進行,有效depth在逐漸增加。


推薦閱讀:

一個沒有基礎的工科研究生如何學習神經網路?
word2vec 相比之前的 Word Embedding 方法好在什麼地方?
在使用relu的網路中,是否還存在梯度消失的問題?
關於語音識別特徵提取該如何入門?
詞向量,LDA,word2vec三者的關係是什麼?_?

TAG:機器學習 | 神經網路 |