【神經網絡和深度學習】筆記 - 第五章 深度神經網絡學習過程中的梯度消失問題


文章導讀:

1. 梯度消失問題

2. 是什么導致了梯度消失問題?

3. 復雜神經網絡中的梯度不穩定問題

 

之前的章節,我們利用一個僅包含一層隱藏層的簡單神經網絡就在MNIST識別問題上獲得了98%左右的准確率。我們於是本能會想到用更多的隱藏層,構建更復雜的神經網絡將會為我們帶來更好的結果。

就如同在進行圖像模式識別的時候,第一層的神經層可以學到邊緣特征,第二層的可以學到更復雜的圖形特征,例如三角形,長方形等,第三層又會識別更加復雜的圖案。這樣看來,多層的結構就會帶來更強大的模型,進行更復雜的識別。

那么在這一章,就試着訓練這樣的神經網絡來看看對結果有沒有什么提升。不過我們發現,訓練的過程將會出現問題,我們的神經網絡的效果並沒有什么提升。

為什么會出現這樣的情況呢,這一章就是主要圍繞着這個問題展開的。我們將會發現,不同層的學習速率是不一樣的。例如,在后面的網絡層訓練正在順利學習的時候,前面網絡層的學習卻卡住幾乎不動了。而且我們會發現這並不是偶然的,而是在理論上由梯度下降算法導致的。隨着我們對問題的深入了解,我們會發現相反的情況也是可能發生的,就是前面網絡層學習正常,而后面網絡層學習停止。

這雖然看上去都是壞消息,不過深入探索這些問題也是幫助我們設計更好的更高效的深度神經網絡的訓練方法。

一. 梯度消失問題

先回到之前的程序上,當我們選擇一個隱藏層的時候得到准確率為96.48%。接着增加一個隱藏層得到96.90%的結果。看上去結果不錯,畢竟提升了。接着再加上一個隱藏層,卻只得到了96.57%的結果。這個結果雖說下降了沒多少,但是我們模型變復雜了,我們期望得到一個更好的結果,但是卻事與願違了。

這個結果看上去是奇怪的,而外的隱藏層理應使得模型可以處理更復雜的分類函數,不說結果提升多少,但是至少不能下降吧。為了搞清楚這期間到底是出了什么問題,我們回到兩個隱藏層的情況,下面的圖中,神經元上的柱形的長度表現的是其參數的更新速率,是當參數初始化完成后得到的結果:

大致看上去,第二層整體的更新速率要比第一層的快很多。但是由於權重的初始化也是隨機的,我們很難判斷這是不是一種巧合。

為了驗證這是巧合還是事實,我們先定義$\delta ^l_j = \frac{\partial C}{\partial b^l_j}$,然后$\delta ^l$可以看作是一個向量,其中每個分量表示第$l$層中該神經元上參數更新的速率。於是就可以將$||\delta^l||$看作是$l$層整體的學習速率,利用該速率的大小就可以比較不同層學習速率間的差別。

根據這些定義,我們發現$||\delta ^1 = 0.07||$和$||\delta ^2 = 0.31||$,這的確印證了一開始觀察到的結果,第二層整體比第一層快。

三層隱藏層的時候呢?結果為0.012, 0.060和0.283,也是一樣的結果:后面的層比前面的層快。四層的時候為0.003,0.017,0.070和0.285,也是一樣。

我們已經驗證了參數剛初始完時的情形,也就是訓練剛剛開始的情形,那么隨着訓練的進行,它們之間速率會發生什么變化呢?

先看兩層的情形:

可以看到兩者的速率差別,第一層的速率一直比第二層要慢得多。接着看一下三層和四層的情況:

 

 

也是一樣的結果,速率都是前面的層要慢於后面的層。

我們於是可以得到一個重要的觀察現象:在某些神經網絡中,通過隱藏層從后向前看,梯度會變的越來越小。這也意味着,前面層的學習會顯著慢於后面層的學習。這就是梯度消失問題。

那么是什么導致了梯度消失呢?是否可以避免這樣的問題呢?事實上,的確存在替代方案,但是會導致另外一個問題:前面層的梯度會變的很大而不是消失。這就是梯度爆炸問題。也就是說深度神經網絡上的梯度要么傾向於爆炸要么傾向於消失,這都是不穩定的。而這個不穩定性也是基於梯度的學習算法都要面臨的一個基本問題。

不過我們也許會有疑問,為什么梯度消失就是問題,梯度是不是說明學習已經夠了,這個神經元的參數已經被正確學習到了呢?

事實當然不是這樣的,我們一開始初始化產生的參數肯定不可能那么巧合是最優的參數。然而從三層隱藏層的那個例子看到,隨機初始化意味着第一層會錯過很多的重要信息,即使后面的層訓練的再好,也很難識別輸入圖像。並不是第一層已經訓練好了,而是它們無法得到足夠的訓練。如果我們想要訓練這樣的神經網絡,就必須解決梯度消失問題。

二. 是什么導致了梯度消失問題?

看一個簡單的例子,一個每層只有一個神經元的神經網絡:

 

 不過注意到這里的$C$其實表示的是損失函數,其輸出分別為:$a_1,a_2,a_3,a_4$。

根據求導的鏈式法則有:

為什么會發生梯度消失:

其實看到這樣一個式子:

$$\frac{\partial C}{\partial b_1} = \sigma '(z_1)w_2 \sigma '(z_2)w_3 \sigma '(z_3)w_4 \sigma '(z_4)\frac{\partial C}{\partial a_4} \quad (122)$$

如果還記得前面章節神經元saturated發生的原因的話也能知道這里究竟是什么導致了梯度消失。

注意到其間有一系列的$w_j \sigma '(z_j)$項,先看一下sigmoid函數的導數圖像:

最大值也才0.25,然后由於參數的初始化使用$G(0, 1)$的高斯分布,常常會導致$|w_j| < 1$,這樣就會導致$w_j \sigma '(z_j)<\frac{1}{4}$。然后一系列這些小值的積也會變得更小。

當然這並不是一個嚴格的數學證明,我們很容易就會舉出很多反例。比如在訓練過程中權重$w_j$是可能變大的,如果大到使得$|w_j\sigma '(z_j)<\frac{1}{4}|$不再滿足,或者說大於1,梯度就不會消失了,它將指數增長,從而導致另外一個問題:梯度爆炸問題。

 

梯度爆炸問題:

再來看一個梯度爆炸發生的例子。我們選擇大的權重:$w_1=w_2=w_3=w_4=100$。然后選擇偏差使得$\sigma '(z_j)$不太小。這個並不難做到,例如我們可以選擇使得$z_j=0$時的bias,於是得到$w_j \sigma '(z_j) = 100*0.25 = 25$,這樣就會導致梯度爆炸了。

 

梯度的不穩定性問題:

經過這些討論我們就會發現,梯度消失也好,梯度爆炸也好,歸根結底是由於層數的增加,多個項相乘,勢必就會導致不穩定的情況。除非這些積能恰到好處的相等,才可以讓不同層之間的學習速率相近。不過實際上,這幾乎是不可能發生的。總之,只要我們使用基於梯度的學習算法,不同層的學習速率勢必是有很大差距的。

練習:

問題:

之前我們基於$\sigma '(z) <\frac{1}{4}$的事實討論了梯度消失的問題,那么是否可以使用另外一個激活函數,使得其導數足夠大,來幫助我們解決梯度不穩定的問題呢?

答案:

這個當然是不可以的,不管一開始的值是怎么樣的,因為多個項相乘,這就會導致積是指數增長或者指數下降,可能淺層時不明顯,但是隨着層數的增加,都會導致這個問題出現。

 

梯度消失問題很難消除的原因:

之前已經發現了在深層網絡的前幾層會出現梯度或者消失或者爆炸的問題。事實上,當使用sigmoid函數作為激活函數的時候,梯度消失幾乎是總會出現的。考慮到避免梯度消失,要滿足條件$|w\sigma '(z)| \geqslant 1$。我們也許會覺得這還不簡單,只要$w$大不就可以了,但是注意到$w$大,也會導致$z=wx+b$也大,然后$\sigma '(z)$就會很小。唯一的方法就是還需要保證$x$只出現在一個很小的范圍內,這在實際情況下顯然是很難發生的。所以說就總是會導致梯度消失的問題。

 

拓展:

拓展一:

考慮$|w\sigma '(wa+b)|$,假設$|w\sigma '(wa+b)| \geqslant 1$

(1) 證明這只可能在$|w|\geqslant 4$時成立

之前已經知道$|\sigma '(z)|$在0處取最大值0.25,所以$|w\sigma '(wa+b)| \geqslant 1$成立的話勢必需要$|w| \geqslant 1/0.25 = 5$ 。

(2)假設$|w|\geqslant 4$,考慮到$|w\sigma '(wa+b)| \geqslant 1$,證明此時的$a$的變化區間被限制在寬度$$\frac{2}{|w|}ln (\frac{|w| (1 + \sqrt{1-4/|w|})}{2} -1)$$內

這個就是純數學問題解方程了,利用一元二次方程的求根公式可以求得$e^{-z}_{max}$和$e^{-z}_{min}$,然后求對數后相減,稍微變換一下形式就可以得到這個結果。

(3)證明上面的范圍的最大值大約為0.45,在$|w| \approx 6.9$處得到。於是可以看到即使所有這些條件都滿足,激活函數的符合要求的輸入范圍還是非常窄,還是很難避免梯度消失的問題。

求導算導數為0的點求得。

拓展二:identity神經元

考慮一個單輸入$x$的神經元,中間層參數為$w_1$和$b$,然后輸出層參數為$w_2$,證明通過選擇適當的權重和偏差,可以使得$w_2 \sigma (w_1 x + b) \approx x$對任意$x\in [0, 1]$成立。這個神經元可以被認為是一種identity神經元,其輸出和輸入一樣(只差一個權重因子的放縮)。提示:可以將$x$寫為$x=\frac{1}{2} + \Delta$, 假設$w_1$很小,使用$w_1 \Delta$處的泰勒展開。

之前討論sigmoid函數形狀的時候知道,當$|w_1|$增大的時候,函數會變得越來越窄,逼近解約函數。當$|w_1|$非常小的時候,函數越來越寬,在某個區間內會逼近線性函數,但是既然是sigmoid函數,當$x \rightarrow \infty$時,函數都是會趨向於1或0的。

這里的證明我沒有用泰勒展開,我想的是既然要證明該函數在某個區間的線性,只要證明它導數在該區間趨近於常數即可。

求$\sigma (w_1 x+b)$的導數為$\sigma '(w_1 x +b) = \frac{w_1 e^{-(w_1 x + b)}}{(1+e^{-(w_1 x + b)})^2} = \frac{w_1 e^{w_1 x + b}}{(1+e^{w_1 x + b})^2}$。

不妨令$x = \frac{1}{2} + \Delta$則上式變為:

$\frac{w_1 e^{w_1 \Delta}}{1+2e^{w_1 \Delta} + e^{2w_1 \Delta}}$,由於$\Delta = x - \frac{1}{2} \in [-\frac{1}{2}, \frac{1}{2}]$, 而$w_1$是很小的數,於是可將上式展開為$\frac{w_1 (1+ w_1 \Delta)}{1 + 2(1+w_1 \Delta) + 1 + 2w_1 \Delta} = \frac{w_1 (1+ w_1 \Delta)}{4(1+ w_1 \Delta)} = \frac{w_1}{4}$為常數,通過適當調整$w_2$就可以使其輸出恰好為$x$。

 

三. 復雜神經網絡中的梯度不穩定問題

前面是在一個簡單的例子下討論的梯度不穩定問題,對於如下這個復雜的情況:

根據之前反向傳播的知識,我們可以得到:

$$\delta ^l = \sum '(z^l)(w^{l+1})^T \sum '(z^{l+1})(w^{l+2})^T...\sum '(z^L) \bigtriangledown_a C$$

其中$\sum '(z^l)$為一個對角矩陣,其中每個成員為$\sigma '(z)$為第l層的各個加權輸入。$w^l$是不同層的權重矩陣,$\bigtriangledown_a C$為損失函數C對輸出層的輸出的偏導數。

這個式子看上去比之前復雜的多,但是其實還是能看到其中很多個$(w^j)^T\sum '(z^j)$進行連乘,還是會出現梯度不穩定的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM