吳恩達深度學習筆記(114)-RNN梯度消失問題詳解

循環神經網絡的梯度消失(Vanishing gradients with RNNs)

你已經瞭解了RNN時如何工作的了,並且知道如何應用到具體問題上,比如

命名實體識別,比如語言模型,你也看到了怎麼把反向傳播用於RNN。其實,基本的RNN算法還有一個很大的問題,就是梯度消失的問題。這節課我們會討論,在下幾節課我們會討論一些方法用來解決這個問題。

吳恩達深度學習筆記(114)-RNN梯度消失問題詳解

你已經知道了RNN的樣子,現在我們舉個語言模型的例子,假如看到這個句子(上圖編號1所示),

“The cat, which already ate ……, was full.”,前後應該保持一致,因為cat是單數,所以應該用was

“The cats, which ate ……, were full.”(上圖編號2所示),cats是複數,所以用were

這個例子中的句子有長期的依賴,最前面的單詞對句子後面的單詞有影響。

但是我們目前見到的基本的RNN模型(上圖編號3所示的網絡模型),不擅長捕獲這種長期依賴效應,解釋一下為什麼。

你應該還記得之前討論的訓練很深的網絡,我們討論了梯度消失的問題。比如說一個很深很深的網絡(上圖編號4所示),100層,甚至更深,對這個網絡從左到右做前向傳播然後再反向傳播。我們知道如果這是個很深的神經網絡,從輸出^y得到的梯度很難傳播回去,很難影響靠前層的權重,很難影響前面層(編號5所示的層)的計算。

對於有同樣問題的RNN,首先從左到右前向傳播,然後反向傳播。但是反向傳播會很困難,因為同樣的梯度消失的問題,後面層的輸出誤差(上圖編號6所示)很難影響前面層(上圖編號7所示的層)的計算。這就意味著,實際上很難讓一個神經網絡能夠意識到它要記住看到的是單數名詞還是複數名詞,然後在序列後面生成依賴單複數形式的was或者were。

而且在英語裡面,這中間的內容(上圖編號8所示)可以任意長,對吧?

所以你需要長時間記住單詞是單數還是複數,這樣後面的句子才能用到這些信息。也正是這個原因,所以基本的RNN模型會有很多局部影響,意味著這個輸出^y^(<3>)(上圖編號9所示)主要受^y^(<3>)附近的值(上圖編號10所示)的影響,上圖編號11所示的一個數值主要與附近的輸入(上圖編號12所示)有關,上圖編號6所示的輸出,基本上很難受到序列靠前的輸入(上圖編號10所示)的影響,這是因為不管輸出是什麼,不管是對的,還是錯的,這個區域都很難反向傳播到序列的前面部分,也因此網絡很難調整序列前面的計算。

這是基本的RNN算法的一個缺點,我們會在下幾節筆記裡處理這個問題。如果不管的話,RNN會不擅長處理長期依賴的問題。

吳恩達深度學習筆記(114)-RNN梯度消失問題詳解

儘管我們一直在討論梯度消失問題,但是,你應該記得我們在講很深的神經網絡時,我們也提到了梯度爆炸,我們在反向傳播的時候,隨著層數的增多,梯度不僅可能指數型的下降,也可能指數型的上升。

事實上梯度消失在訓練RNN時是首要的問題,儘管梯度爆炸也是會出現,但是梯度爆炸很明顯,因為指數級大的梯度會讓你的參數變得極其大,以至於你的網絡參數崩潰

所以梯度爆炸很容易發現,因為參數會大到崩潰,你會看到很多NaN,或者不是數字的情況,這意味著你的網絡計算出現了數值溢出。如果你發現了梯度爆炸的問題,一個解決方法就是用梯度修剪梯度修剪的意思就是觀察你的梯度向量,如果它大於某個閾值,縮放梯度向量,保證它不會太大,這就是通過一些最大值來修剪的方法

所以如果你遇到了梯度爆炸,如果導數值很大,或者出現了NaN,就用梯度修剪,這是相對比較魯棒的,這是梯度爆炸的解決方法。然而梯度消失更難解決,這也是我們下幾節筆記的主題。

總結一下,在前面的課程,我們瞭解了訓練很深的神經網絡時,隨著層數的增加,導數有可能指數型的下降或者指數型的增加,我們可能會遇到梯度消失或者梯度爆炸的問題。

加入一個RNN處理1,000個時間序列的數據集或者10,000個時間序列的數據集,這就是一個1,000層或者10,000層的神經網絡,這樣的網絡就會遇到上述類型的問題。

梯度爆炸基本上用梯度修剪就可以應對,但梯度消失比較棘手。

我們下節會介紹GRU,門控循環單元網絡,這個網絡可以有效地解決梯度消失的問題,並且能夠使你的神經網絡捕獲更長的長期依賴。


分享到:


相關文章: