神經網絡基礎--循環神經網絡RNN

在處理序列問題(如語言識別等)上,使用循環神經網絡(Recurrent Neural Networks,RNN)是很自然的方式;所謂循環神經網絡,其實就是把上一時刻的信息作爲當前時刻輸入的一部分,從而實現信息的傳遞;本文將先介紹基礎版RNN,並說明基礎版的問題,然後介紹改進版的循環神經網絡LSTM、GRU。

RNN

RNN的基本結構如下圖所示:

結構比較簡單,通過單元狀態s的循環來實現信息的傳遞,其公式如下:

\left\{ \begin{matrix} s_t = f(Ux_t+Ws_{t-1}) \\ O_t = g(Vs_t) \end{matrix}\right.

單元狀態s的更新公式就是一個遞推公式,依賴當前輸入和上一時刻的單元狀態。

RNN的訓練通過BPTT(backpropagation through time)來完成,即累加loss對每個時刻的梯度;

\partial s_t/\partial s_{t-1} = Diag({f}'(s_{t-1}))W\partial s_t/\partial s_{1} = \prod_{i=1}^{t-1} Diag({f}'(s_{i}))W,當t很大時,這種連乘的結構很容易導致梯度消失和爆炸;這也造成了RNN對長時記憶的困難【seq2seq任務中,可通過翻轉輸入序列來緩解;若使用正常序列輸入,則輸入序列的第一個詞和輸出序列的第一個詞相距較遠,難以學到長期依賴。將輸入序列反向後,輸入序列的第一個詞就會和輸出序列的第一個詞非常接近,二者的相互關係也就比較容易學習了。】;雖然可以通過一些方法來緩解梯度消失(使用ReLU等激活函數、初始化W爲正交矩陣【WW^T=I=W^TW】)和梯度爆炸(Clipping Gradients),但一般實際應用時還是會傾向於使用LSTM或GRU。

LSTM

LSTM(Long Short Term Memory networks)中引入了門控機制來控制信息的流入流出,包括有選擇地加入新的信息,並有選擇地遺忘之前累計的信息,其結構和公式如下:

        \left\{ \begin{matrix} forget \;gate: f_t = sigmoid(W_f[h_{t-1},x_t]) \\ input \;gate: i_t = sigmoid(W_i[h_{t-1},x_t]) \\ output \;gate: o_t = sigmoid(W_o[h_{t-1},x_t]) \\ tmp \;state: \tilde{s_t} = tanh(W[h_{t-1},x_t]) \\ cur \;state: s_t = f_t\ast s_{t-1} + i_t \ast \tilde{s_t} \\ output: h_t = o_t \ast tanh(s_t) \end{matrix}\right.

LSTM有三個門:遺忘門forget gate、輸入門input gate、輸出門output gate,每個門都是由上一時刻的輸出和當前時刻的輸入控制;遺忘門控制上一狀態流入的信息量,輸入門控制當前輸入流入的信息量,從而完成狀態的更新;輸出門控制流出;

對當前狀態的更新公式進行展開,有

s_t = f_t \ast s_{t-1} + i_t\ast \tilde{s_t} = \sum_{k=1}^{t-1}[i_k \ast \prod_{m=k+1}^{t}f_m]\ast \tilde{s_k} + i_t\ast \tilde{s_t},可知當前狀態等於當前爲止的各個臨時狀態(輸入相關)的加權和,也就是說可以通過遺忘門和輸入門的控制來靈活調製各時刻輸入對當前狀態的影響,從而達到長短時記憶的效果;

當前狀態對上一狀態的導數:

\partial s_t/\partial s_{t-1} = {f_t}'s_{t-1} + Diag(f_t) + {f_t}'\tilde{s}_{t-1} + {f_t}{\tilde{s}}'_{t-1},由於有加法項f_t \in (0,1)的存在,在進行BPTT時,能有效避免導數連乘時的梯度消失問題。

GRU

GRU(Gated Recurrent Unit)是對LSTM的一種變形,將單元狀態和單元輸出合二爲1,也簡化了門控,其結構和公式如下:

Ref:

https://colah.github.io/posts/2015-08-Understanding-LSTMs/