好久沒有更新blog了,最近抽時間看了Nielsen的《Neural Networks and Deep Learning》感覺小有收獲,分享給大家。
了解深度學習的同學可能知道,目前深度學習面臨的一個問題就是在網絡訓練的過程中存在梯度消失問題(vanishing gradient problem),或者更廣義地來講就是不穩定梯度問題。那么到底什么是梯度消失呢?這個問題又是如何導致的呢?這就是本文要分享的內容。
1. 消失的梯度
首先,我們將一個網絡在初始化之后在訓練初期的結果可視化如下:
在上圖中,神經元上的條可以理解為神經元的學習速率。這個網絡是經過隨機初始化的,但是從上圖不難發現,第二層神經元上的條都要大於第一層對應神經元上的條,即第二層神經元的學習速率大於第一層神經元學習速率。那這可不可能是個巧合呢?其實不是的,在書中,Nielsen通過實驗說明這種現象是普遍存在的。
我們再來看下對於一個具有四個隱層的神經網絡,各隱藏層的學習速率曲線如下:
可以看出,第一層的學習速度和最后一層要差兩個數量級,也就是比第四層慢了100倍。 實際上,這個問題是可以避免的,盡管替代方法並不是那么有效,同樣會產生問題——在前面的層中的梯度會變得非常大!這也叫做激增的梯度問題(exploding gradient problem),這也沒有比消失的梯度問題更好處理。更加一般地說,在深度神經網絡中的梯度是不穩定的,在前面的層中或會消失,或會激增,這種不穩定性才是深度神經網絡中基於梯度學習的根本原因。
2. 什么導致了梯度消失?
為了弄清楚為何會出現消失的梯度,來看看一個極簡單的深度神經網絡:每一層都只有一個單一的神經元。下面就是有三層隱藏層的神經網絡:
我們把梯度的整個表達式寫出來:
$\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}}}$
為了理解每個項的行為,先看下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}$的約束。
3. 梯度激增問題
舉個例子說明下:
4. 不穩定的梯度問題
不穩定的梯度問題:根本的問題其實並非是消失的梯度問題或者激增的梯度問題,而是在前面的層上的梯度是來自后面的層上項的乘積。當存在過多的層次時,就出現了內在本質上的不穩定場景。唯一讓所有層都接近相同的學習速度的方式是所有這些項的乘積都能得到一種平衡。如果沒有某種機制或者更加本質的保證來達成平衡,那網絡就很容易不穩定了。簡而言之,真實的問題就是神經網絡受限於不穩定梯度的問題。所以,如果我們使用標准的基於梯度的學習算法,在網絡中的不同層會出現按照不同學習速度學習的情況。
5. 參考文獻
1. Michael Nielsen,《Neural Networks and Deep Learning》