很久沒有更新blog了,最近抽時間看了Nielsen的《Neural Networks and Deep Learning》感受小有收穫,分享給你們。算法
瞭解深度學習的同窗可能知道,目前深度學習面臨的一個問題就是在網絡訓練的過程當中存在梯度消失問題(vanishing gradient problem),或者更廣義地來說就是不穩定梯度問題。那麼到底什麼是梯度消失呢?這個問題又是如何致使的呢?這就是本文要分享的內容。網絡
首先,咱們將一個網絡在初始化以後在訓練初期的結果可視化以下:函數
在上圖中,神經元上的條能夠理解爲神經元的學習速率。這個網絡是通過隨機初始化的,可是從上圖不難發現,第二層神經元上的條都要大於第一層對應神經元上的條,即第二層神經元的學習速率大於第一層神經元學習速率。那這可不多是個巧合呢?其實不是的,在書中,Nielsen經過實驗說明這種現象是廣泛存在的。學習
咱們再來看下對於一個具備四個隱層的神經網絡,各隱藏層的學習速率曲線以下:spa
能夠看出,第一層的學習速度和最後一層要差兩個數量級,也就是比第四層慢了100倍。 實際上,這個問題是能夠避免的,儘管替代方法並非那麼有效,一樣會產生問題——在前面的層中的梯度會變得很是大!這也叫作激增的梯度問題(exploding gradient problem),這也沒有比消失的梯度問題更好處理。更加通常地說,在深度神經網絡中的梯度是不穩定的,在前面的層中或會消失,或會激增,這種不穩定性纔是深度神經網絡中基於梯度學習的根本緣由。3d
爲了弄清楚爲什麼會出現消失的梯度,來看看一個極簡單的深度神經網絡:每一層都只有一個單一的神經元。下面就是有三層隱藏層的神經網絡:code
咱們把梯度的整個表達式寫出來:blog
$\dfrac{\partial{C}}{\partial{b_{1}}}=\sigma^{\prime}(z_{1})\omega_{2}\sigma^{\prime}(z_{2})\omega_{3}\sigma^{\prime}(z_{3})\omega_{4}\sigma^{\prime}(z_{4})\dfrac{\partial{C}}{\partial{a_{4}}}$token
爲了理解每一個項的行爲,先看下sigmoid函數導數的曲線:深度學習
該導數在$\sigma^{\prime}(0)=\dfrac{1}{4}$時達到最高。如今,若是咱們使用標準方法來初始化網絡中的權重,那麼會使用一個均值爲0標準差爲1的高斯分佈。所以全部的權重一般會知足$|\omega_{j}|<1$。有了這些信息,咱們發現會有$\omega_{j}\sigma^{\prime(z_{j})}<\dfrac{1}{4}$,而且在進行全部這些項的乘積時,最終結果確定會指數級降低:項越多,乘積的降低也就越快。
下面咱們從公式上比較一下第三層和第一層神經元的學習速率:
比較一下$\dfrac{\partial{C}}{\partial{b_{1}}}$和$\dfrac{\partial{C}}{\partial{b_{3}}}$可知,$\dfrac{\partial{C}}{\partial{b_{1}}}$要遠遠小於$\dfrac{\partial{C}}{\partial{b_{3}}}$。 所以,梯度消失的本質緣由是:$\omega_{j}\sigma^{\prime}(z_{j})<\dfrac{1}{4}$的約束。
舉個例子說明下:
不穩定的梯度問題:根本的問題其實並不是是消失的梯度問題或者激增的梯度問題,而是在前面的層上的梯度是來自後面的層上項的乘積。當存在過多的層次時,就出現了內在本質上的不穩定場景。惟一讓全部層都接近相同的學習速度的方式是全部這些項的乘積都能獲得一種平衡。若是沒有某種機制或者更加本質的保證來達成平衡,那網絡就很容易不穩定了。簡而言之,真實的問題就是神經網絡受限於不穩定梯度的問題。因此,若是咱們使用標準的基於梯度的學習算法,在網絡中的不一樣層會出現按照不一樣學習速度學習的狀況。
1. Michael Nielsen,《Neural Networks and Deep Learning》