文章導讀:算法
1. 梯度消失問題網絡
2. 是什麼致使了梯度消失問題?app
3. 複雜神經網絡中的梯度不穩定問題ide
以前的章節,咱們利用一個僅包含一層隱藏層的簡單神經網絡就在MNIST識別問題上得到了98%左右的準確率。咱們因而本能會想到用更多的隱藏層,構建更復雜的神經網絡將會爲咱們帶來更好的結果。函數
就如同在進行圖像模式識別的時候,第一層的神經層能夠學到邊緣特徵,第二層的能夠學到更復雜的圖形特徵,例如三角形,長方形等,第三層又會識別更加複雜的圖案。這樣看來,多層的結構就會帶來更強大的模型,進行更復雜的識別。學習
那麼在這一章,就試着訓練這樣的神經網絡來看看對結果有沒有什麼提高。不過咱們發現,訓練的過程將會出現問題,咱們的神經網絡的效果並無什麼提高。spa
爲何會出現這樣的狀況呢,這一章就是主要圍繞着這個問題展開的。咱們將會發現,不一樣層的學習速率是不同的。例如,在後面的網絡層訓練正在順利學習的時候,前面網絡層的學習卻卡住幾乎不動了。並且咱們會發現這並非偶然的,而是在理論上由梯度降低算法致使的。隨着咱們對問題的深刻了解,咱們會發現相反的狀況也是可能發生的,就是前面網絡層學習正常,然後面網絡層學習中止。設計
這雖然看上去都是壞消息,不過深刻探索這些問題也是幫助咱們設計更好的更高效的深度神經網絡的訓練方法。3d
先回到以前的程序上,當咱們選擇一個隱藏層的時候獲得準確率爲96.48%。接着增長一個隱藏層獲得96.90%的結果。看上去結果不錯,畢竟提高了。接着再加上一個隱藏層,卻只獲得了96.57%的結果。這個結果雖然說降低了沒多少,可是咱們模型變複雜了,咱們指望獲得一個更好的結果,可是卻事與願違了。blog
這個結果看上去是奇怪的,而外的隱藏層理應使得模型能夠處理更復雜的分類函數,不說結果提高多少,可是至少不能降低吧。爲了搞清楚這期間究竟是出了什麼問題,咱們回到兩個隱藏層的狀況,下面的圖中,神經元上的柱形的長度表現的是其參數的更新速率,是當參數初始化完成後獲得的結果:
大體看上去,第二層總體的更新速率要比第一層的快不少。可是因爲權重的初始化也是隨機的,咱們很難判斷這是否是一種巧合。
爲了驗證這是巧合仍是事實,咱們先定義$\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)$進行連乘,仍是會出現梯度不穩定的問題。