讀書筆記 - 《深度學習之美》(更新中...)

這本書已經讀了好幾章,忽然以爲有必要在閱讀的過程當中作一些筆記或記錄一些問題什麼的,故如今有了此篇文章。算法

 

14.循環遞歸RNN,序列建模套路深網絡

 

問題:函數

(1)RNN中的「深度」與傳統的深度神經網絡裏的「深度」有何不一樣?blog

答:RNN中的深度主要是指時間和空間(如網絡中的隱含層個數)特性上的深度。遞歸

(2)RNN爲何會有梯度彌散或梯度爆炸的問題?ip

答:若是用到sigmoid激活函數(末尾推薦的兩個回答是基於tanh激活函數),則它會將+∞~-∞之間的輸入壓縮到0~1之間,當input的值更新時,output會有很小的更新。又由於上一層的輸出將做爲後一層的輸入,而輸出通過sigmoid後更新速率會逐步衰減,直到輸出層只會有微乎其微的更新。從數學的角度出發,可知sigmoid導數在0的位置取最大值1/4。當使用均值爲0,方差爲1的高斯分佈及初始化參數w,有|w|<1. 隨網絡層數加深,w的變化幅度會呈1/4的指數衰減,使得最後學不到東西,形成梯度彌散。一樣,當|w|>1,w變化幅度會指數遞增,最後形成梯度爆炸。get

【另外,推薦知乎高贊回答(RNN梯度消失與梯度爆炸的緣由:https://zhuanlan.zhihu.com/p/28687529https://zhuanlan.zhihu.com/p/28687529)】input

(3)梯度彌散或爆炸問題在必定程度上阻礙了RNN的進一步發展,有什麼策略能夠在必定程度上抑制這個問題嗎?數學

答:下圖展現了RNN網絡損失函數對權重和偏置的關係:cli

上圖中存在一個很是陡峭的面,在更新參數的過程當中,若是當前參數所處的位置恰好位於這個高高的「偏差牆」上,因爲這個面上的梯度很是大,那麼採用梯度降低法更新後的參數可能就跑得很遠,如圖中藍色的實線所示。所以,爲了解決這個問題,gradient clipping算法爲梯度的範數設置了一個閾值,當梯度的範數大於某個值的時候,將梯度設置爲這個閾值,算法描述以下:

可是這個方法只可以解決梯度爆炸的問題,要解決梯度彌散的問題,能夠從下面兩點入手:

  • 對於隱層態的權重矩陣Whh使用單位矩陣進行初始化而不是隨機初始化;
  • 使用RELU激活函數而不是Sigmoid激活函數,由於RELU函數的導數爲0或者1,在反向傳播的過程當中不會衰減至0。

除此以外,還能夠更改內部結構來解決梯度消失和梯度爆炸問題,那就是LSTM,請見下回分解!

(4)除了梯度彌散或爆炸問題,RNN還存在什麼問題?如何解決?

答:

(5)你能將RNN預測正弦序列的實現範例用Eager執行模式進行改寫嗎?

相關文章
相關標籤/搜索