RNN, LSTM, GRU之間的原理與差異
這篇文章簡單說明幾種 RNN 網路的設計理論與差異,包括 RNN, LSTM, GRU。同時會簡單的比較一下,在實務應用中什麼時候應該使用哪一種設計。
Recurrent Neural Network: RNN
首先,RNN 是處理序列輸入的一種神經網路,可以處理具有不定長度的輸入數據,比如聲音、影片、或文章。同時他的輸出也可以是不定長度的,全靠網路決定什麼時候該停止輸出。RNN 的特性是它會設計一個不可學習、但是會在數據序列中傳遞的隱藏向量,我們稱之為 hidden vector,用來幫助 RNN 利用過去的資訊處理預測未來的結果。後面提到的 LSTM, RNU 都屬於 RNN 的其中一個子類。
在圖解與公式中,h(t) 代表在時間點 t 的 hidden vector。從公式中,可以看到 h(t) 的更新公式其實是輸入 x(t) 與前一個階段 h(t-1)的線性組合。單就等號的右邊而言,其實這跟傳統的神經網路沒有什麼兩樣。唯一的差別是等號的左邊,稍早的 hidden vector h(t-1) 會不斷的被新的 h(t) 更新。這也是 RNN 中 Recurrent 的命名由來。
對後面提到的 LSTM 與 RNU,他們的輸出與 RNN 一樣,都可以看成是 hidden vector 加上一層 MLP——矩陣相乘相加並接著一個 sigmoid 函數。
Long Short-Term Memory: LSTM
比 RNN 複雜,但是可以較簡單的理解。首先他引入了一個 cell vector C(t) 來解決梯度消失的問題 (vanishing gradient):
首先,cell vector C 可以被視為另一個 hidden vector,只是他的設計理念不同,因此作者使用不同的名詞區分它。從公式第 5 行,可以發現 C(t) 被設計成一個 C(t) 與 C(t-1) 的線性相加。這種線性的設計與 ResNet 的殘叉設計相似,在 gradient propogation 階段可以更好的傳遞,也沒有受到非線性函數 sigmoid function 的阻擾。另一方面,cell vector 的梯度可以透過上述公式的第 6 行,很簡單的傳遞並更新 hidden vector。
在公式中,f(t), i(t), o(t) 分別代表了 forgot gate, input gate, and output gate。Gate 被設計成一個值域介於 0–1 之間的向量,其作用就像一個大門,決定哪些元素應該被保留、哪些應該被消去。所有的 gate vector 都是透過 hidden vector h(t-1) 與輸入 x(t) 做線性運算,加上 sigmoid 函數計算得來的。
LSTM 的命名借用了人腦的 long-term memory 與 short-term memory 的理論。其中 C 屬於 long-term memory,因為他的梯度可以透過純線性運算而簡單的在序列之中傳遞,屬於長期記憶。而 h 屬於 short-term memory,因為他是透過長期記憶 C 經過 output gate 之後得來的,屬於短期記憶。
Gated Recurrent Unit: GRU
我們已經在 LSTM 解釋了 gate 的意義。GRU 相比於 LSTM,其使用了更少的 gate 並去除了 cell vector 來提升計算性能。
與 LSTM 的 cell vector 類似,GRU 的 hidden vector 設計成了 h(t) 與 h(t-1) 的線性內差。這個設計保留了 LSTM 的優點,讓 GRU 也能夠解決 vanishing gradient 的問題。
在 GRU 中的 z(t) 代表 update gate,它決定了我們要使用多少的比例來更新 h:同時 r(t) 被稱為 reset gate 它決定了在新的 h(t) 裡面要重置掉多少的舊記憶 h(t-1)。
應用在實務中
與 LSTM 相比,GRU 減少了學習參數與計算量,因此會更有效率,同時也繼承了 LSTM 易於梯度傳播的特點。但另一方面,因為減少了參數與計算量,通常 GRU 的最終效果會比 LSTM 略差。在追求更高的 accuracy 的時候,還是應該選擇 LSTM 而非 GRU。當你的任務難度較簡單、序列長度也不長的時候,或許直接使用最簡單的 RNN 也是不錯的選擇。