主要是自己學習Recurrent Neural Network過程中的知識梳理。
涉及到的資料來源:
- CS224n: Natural Language Processing with Deep Learning (Lecture 8, Lecture 9, Lecture 12)
- CS231n: Convolutional Neural Networks for Visual Recognition (Lecture 10)
- Understanding LSTM Networks-colah
- NTU李宏毅的ML課程:https://www.youtube.com/watch?v=xCGidAeyS4M (Lecture 25)
Primary RNN
傳統的神經網絡往往只關注於當前結點,不能處理時序信息。例如在任務型問答系統的slot filling任務中,要識別出某一詞對應於哪個slot:
a: 幫我訂明天晚上到北京的機票。
b: 幫我訂明天晚上從北京出發的機票。
a、b兩句話都包含兩個slot,其中“明天晚上”均爲”Time“,而a中的”北京“應識別爲”Destination“,b中的”北京“應識別爲”Place of departure“。
因此需要一種能保留時序信息的模型,判斷當前詞的類別時考慮前面的信息,這樣就能根據”到“或”從“來判斷出到底是出發地還是目的地了。
簡單RNN的網絡結構如下圖所示。RNN允許信息的持久化,對當前的狀態保留記憶(以隱變量的方式存在,即圖中的h_t)。
X_t 表示當前詞的輸入word vector,當前時刻的輸出 y_t 由 X_t 和上一時刻的狀態 h_{t-1} 共同決定。
需要注意的是,
- 每一時刻的參數W是相同的。
- 在時刻t0,狀態h0由隨機初始化得到。
- 設 的word vector維度爲d,隱藏層的維度爲 ,預測類別的個數爲C,即 , , ,那麼 , ,
另一個更爲直觀的圖示:
更爲通用的情況下,RNN的輸入和輸出個數並不是固定的,可以隨特定的任務而變化,滿足不同任務的需求。例如,在情感分類任務中,輸入是很多的詞序列,而輸出只有一個;在機器翻譯任務中,輸入是一系列的詞,輸出也是一系列詞,而它們之間並不是一一對應的;在詞性標註任務中,每一個詞對應一個分類結果,輸入和輸出是一一對應的。如下圖:
以上我們討論的是最簡單的情況,RNN內部只有一層隱藏層,且只考慮正向的序列信息。很多情況下當前詞之後的信息對當前詞的預測也會產生影響,此時可以擴展爲雙向RNN:
而類似於傳統神經網絡,RNN同樣也可以增加隱藏層的個數,擴展爲多層:
簡單RNN存在的最大問題就是梯度消失和梯度爆炸。解決梯度爆炸問題很簡單,可以用較爲trick的方法:clipping gradient,即如果梯度的範數大於某個給定的閾值,將梯度同比收縮。而解決梯度消失問題,就要用到下面的LSTM了。