打算寫一個從RNN到Attention的系列文章,今天先介紹一下循環神經網絡RNN和門控循環神經網絡LSTM,很多內容爲筆者自己的理解,難免有疏漏之處,歡迎大家探討。
一.爲什麼RNN比DNN更適合時間序列問題
DNN求解時序問題
對於一個時間序列問題,以單詞預測爲例,已知x 1 , x 2 , x 3 , … … , x t x_1,x_2,x_3,……,x_t x 1 , x 2 , x 3 , … … , x t ,求解t時刻的單詞x t + 1 x_{t+1} x t + 1 ,那麼從概率的角度,該問題可以建模爲求解a r g m a x θ P ( x t + 1 ∣ x 1 , x 2 , . . . . x t , θ ) argmax_{\theta}P(x_{t+1}|x_{1},x_2,....x_t,\theta) a r g m a x θ P ( x t + 1 ∣ x 1 , x 2 , . . . . x t , θ ) ,其中θ \theta θ 爲模型參數。如果我們用DNN求解該問題,則模型輸入輸出可以分別表示爲
X = [ x 1 , x 2 , x 3 , … … , x t − 1 , x t ] X=[x_1,x_2,x_3,……,x_{t-1},x_t] X = [ x 1 , x 2 , x 3 , … … , x t − 1 , x t ]
Y = x t + 1 Y=x_{t+1} Y = x t + 1
似乎沒有什麼問題,但是假設一個單詞的維度爲d d d ,則X X X 的維度爲d ∗ t d*t d ∗ t ,僅考慮從輸入到第一層隱藏層,且隱藏層的維度爲m m m ,那麼其中的參數總量爲d ∗ t ∗ m d*t*m d ∗ t ∗ m ,如下圖所示,隨着t的增長,參數量的增長是非常恐怖的,而且採用這種建模方式,x 1 , x 2 , x 3 , … … x t x_1,x_2,x_3,……x_t x 1 , x 2 , x 3 , … … x t 對於模型來說是等價的,丟失了他們的時序關係,因此DNN處理時序問題存在
1.參數量過大
2.丟失了時序關係
RNN求解時序問題
RNN的結構如圖表示
其中x i x_{i} x i 爲輸入,對應單詞預測問題即爲單詞的向量表示,h i h_{i} h i 爲隱含層(hidden layer),是循環神經網絡中特有的網絡結構,其中
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \boldsymbol{H}_t = \phi(\boldsymbol{X}_t \boldsymbol{W}{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} + \boldsymbol{b}_h). H t = ϕ ( X t W x h + H t − 1 W h h + b h ) .
我們從上述式子可以看出:
隱含狀態H t H_t H t 與t時刻輸入x t x_t x t 和上一時刻的隱含狀態H t − 1 H_{t-1} H t − 1 有關,而H t − 1 H_{t-1} H t − 1 也同樣與t-1時刻輸入x t − 1 x_{t-1} x t − 1 和上上一時刻的隱含狀態H t − 2 H_{t-2} H t − 2 有關,以此類推,H t H_t H t 可以作爲t時刻之前的輸入和隱藏狀態的信息儲藏,而由於更近的時刻信息儲藏的更加完整,從而既保留了之前的輸入信息,同時還保證了他們時序關係 。
X X X 和H t − 1 H_{t-1} H t − 1 分別通過兩個矩陣乘法與H t H_t H t 相關聯。
如果去掉H t − 1 W h h \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} H t − 1 W h h ,則上式就是一個全連接。
事實上,我們令X t ′ = [ X t , H t − 1 ] , W ′ = [ W x h , W h h ] X^{'}_t=[X_t,H_{t-1}],W^{'}=[W_{xh},W_{hh}] X t ′ = [ X t , H t − 1 ] , W ′ = [ W x h , W h h ] ,則上式可以改寫爲H t = ϕ ( X t ′ W ′ + b h ) H_t= \phi(X^{'}_tW^{'}+b_h) H t = ϕ ( X t ′ W ′ + b h ) ,我們可以通過全連接來實現RNN 。
我們來看一下參數量,循環神經網絡中的隱含狀態與隱藏層作用類似,因此我們可以比較兩者的參數量大小,我們假定隱藏層的維度也爲m,首先忽略b h b_h b h 因爲都是m維,則W x h W_{xh} W x h 的維度爲x的維度d*隱藏層的維度m,即d ∗ m d*m d ∗ m ,W h h W_{hh} W h h 的維度爲m ∗ m m*m m ∗ m ,因此總的維度爲( d + m ) ∗ m (d+m)*m ( d + m ) ∗ m ,顯然遠遠小於DNN的d ∗ t ∗ m d*t*m d ∗ t ∗ m ,且與t t t 的長度無關!理論上,我們可以將輸入的長度拉倒無限長。
我們再來思考一下爲什麼循環神經網絡的參數量與t t t 的長度無關呢?因爲對於長度爲t t t 的輸入,他們共用了同一個W x h W_{xh} W x h 和W h h W_{hh} W h h ,大大減少了參數量。
我們怎麼從隱藏層h t h_t h t 得到y t y_t y t 的呢?其實隱藏層h t h_t h t 的作用和DNN中的隱藏層作用類似,我們可以有很多處理方式,比如直接通過softmax求出y t y_t y t 的概率分佈,也可以作爲一個全連接層的輸入,再經過別的操作得到y t y_t y t 。
二、門控循環神經網絡LSTM
從上面的介紹我們可以看出RNN的關鍵在於H t H_t H t 保存之前的信息應用到當前的任務之上 ,但是H t H_t H t 真的可以做到嗎?很難!當時間步距離較大時,循環神經網絡在反向傳播的過程中的梯度較容易出現衰減或爆炸(詳見通過時間反向傳播 ),LSTM(Long Short Term Memory)可以避免上述的長期依賴問題,由於GRU和LSTM類似,基本可以視爲LSTM的簡化版,在這裏就不做贅述。
LSTM的網絡結構圖如下所示:
如果有小夥伴看過這張圖,不知道初次看的時候內心是什麼感受,反正我當時是一臉懵逼(臥槽,這什麼玩意兒?)仔細研究過後,我發現其實LSTM的整個網絡結構可以簡述爲“三門兩細胞”,我們依照這個主線來理解應該會更輕鬆一些,首先來看“三門”:記憶門,遺忘門和輸出門。
I t = σ ( X t W x i + H t − 1 W h i + b i ) \begin{aligned} \boldsymbol{I}_t &= \sigma(\boldsymbol{X}_t \boldsymbol{W}{xi} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hi} + \boldsymbol{b}i) \end{aligned} I t = σ ( X t W x i + H t − 1 W h i + b i )
F t = σ ( X t W x f + H t − 1 W h f + b f ) , \begin{aligned}\ \boldsymbol{F}_t &= \sigma(\boldsymbol{X}_t \boldsymbol{W}{xf} + \boldsymbol{H}_{t-1} \boldsymbol{W}{hf} + \boldsymbol{b}f),\end{aligned} F t = σ ( X t W x f + H t − 1 W h f + b f ) ,
O t = σ ( X t W x o + H t − 1 W h o + b o ) , \begin{aligned}\ \boldsymbol{O}_t &= \sigma(\boldsymbol{X}_t \boldsymbol{W}{xo} + \boldsymbol{H}_{t-1} \boldsymbol{W}{ho} + \boldsymbol{b}_o), \end{aligned} O t = σ ( X t W x o + H t − 1 W h o + b o ) ,
這三個門在之後的計算中分別承載了不同的物理意義,計算上和之前RNN中隱藏層的計算差不多,也就是矩陣運算+激活函數,同樣用到了前一時刻的隱含變量H t − 1 H_{t-1} H t − 1 和當前時刻的輸入X t X_t X t ,事實上他們也都可以通過一個全連接表示。
“兩細胞”包括候選記憶細胞C ~ t \tilde{\boldsymbol{C}}_t C ~ t 和記憶細胞C t \boldsymbol{C}_t C t 。
候選記憶細胞C ~ t \tilde{\boldsymbol{C}}t C ~ t 的表達式爲
C ~ t = tanh ( X t W x c + H t − 1 W h c + b c ) \tilde{\boldsymbol{C}}_t = \text{tanh}(\boldsymbol{X}_t \boldsymbol{W}{xc} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hc} + \boldsymbol{b}_c) C ~ t = tanh ( X t W x c + H t − 1 W h c + b c )
它的計算與上面介紹的3個門也類似,但使用了值域在 [−1,1] 的tanh函數作爲激活函數。候選記憶細胞C ~ t \tilde{\boldsymbol{C}}t C ~ t 的作用是作爲記憶細胞C t \boldsymbol{C}_t C t 的輸入 。
記憶細胞C t \boldsymbol{C}_t C t 的計算公式爲:
C t = F t ⊙ C t − 1 + I t ⊙ C ~ t \boldsymbol{C}_t = \boldsymbol{F}_t \odot \boldsymbol{C}_{t-1} + \boldsymbol{I}_t \odot \tilde{\boldsymbol{C}}_t C t = F t ⊙ C t − 1 + I t ⊙ C ~ t
其中⊙ \odot ⊙ 爲點乘,此時我們發現在記憶細胞C t \boldsymbol{C}_t C t 的計算公式中,用到了遺忘門F t \boldsymbol{F}_t F t ,並且與前一時刻的記憶細胞C t − 1 \boldsymbol{C}_{t-1} C t − 1 做點乘,表達的物理含義是我們希望對之前記憶的遺忘程度,當遺忘門某維度近似1,則該維度上一時刻的記憶被傳遞到當前記憶細胞,反之則被遺忘 。
同樣的,對於輸入門I t \boldsymbol{I}_t I t ,並且與當前時刻的候選記憶細胞C ~ t \tilde{\boldsymbol{C}}_t C ~ t 做點乘,表達對於當前時刻的候選記憶細胞的接收程度,當輸入門某維度近似1,則當前時刻的候選記憶細胞的該維度信息被接收到當前記憶細胞,反之被忽略
我們再來做個比較,其實它和RNN的公式H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \boldsymbol{H}_t = \phi(\boldsymbol{X}_t \boldsymbol{W}{xh} + \boldsymbol{H}_{t-1} \boldsymbol{W}_{hh} + \boldsymbol{b}_h). H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . 很相似,F t \boldsymbol{F}_t F t 類似於W t − 1 \boldsymbol{W}_{t-1} W t − 1 ,都是對於歷史數據的處理,輸入門I t \boldsymbol{I}_t I t 和W h h \boldsymbol{W}_{hh} W h h 類似,都是表達對於輸入的處理,不同的是F t \boldsymbol{F}_t F t 和I t \boldsymbol{I}_t I t 是做點乘,另外二者爲矩陣乘法。
最後隱藏層的輸出爲
H t = O t ⊙ tanh ( C t ) . \boldsymbol{H}_t = \boldsymbol{O}_t \odot \text{tanh}(\boldsymbol{C}_t). H t = O t ⊙ tanh ( C t ) .
同樣是點乘,O t \boldsymbol{O}_t O t 是物理含義是對於輸出的篩選,當輸出門某維度近似1時,記憶細胞將該維度的信息傳遞到隱藏層供輸出層使用;當輸出門近似0時,則該維度的信息無法傳遞到隱藏層 。
我們最後再總結一下LSTM的整個設計思想
當前輸入X t X_t X t 和前一時刻的隱含狀態H t − 1 H_{t-1} H t − 1 生成輸入門I t I_t I t 、輸出門O t O_t O t 和遺忘門F t F_t F t ,以及候選記憶細胞C ~ t \tilde{\boldsymbol{C}}_t C ~ t
候選記憶細胞C ~ t \tilde{\boldsymbol{C}}_t C ~ t 和輸入門I t I_t I t 控制當前時刻對於記憶細胞C t \boldsymbol{C}_t C t 輸入,遺忘門F t F_t F t 和前一時刻的記憶細胞C ~ t − 1 \tilde{\boldsymbol{C}}_{t-1} C ~ t − 1 控制記憶細胞歷史時刻的輸入,注意這裏是點乘
記憶細胞C t \boldsymbol{C}_t C t 和輸出門O t O_t O t 控制隱藏層,注意這裏也是點乘