循環神經網絡RNN 3——LSTM及其變體

LSTM(Long Short Term Memory networks)被稱爲長短期記憶模型,是一種比較特殊的循環神經網絡,其基本結構和基本思路與RNN一樣。關於模型,我們都知道LSTM有解決長依賴問題的能力,這是區別於普通RNN的地方。本篇將總結LSTM及其相關變體。
循環神經網絡RNN 1—— 基本模型及其變體
循環神經網絡RNN 2—— attention注意力機制(附代碼)
循環神經網絡RNN 3——LSTM及其變體


1,LSTM概述

所有循環神經網絡都具有神經網絡的重複模塊鏈的形式。 在標準的RNN中,該重複模塊將具有非常簡單的結構,例如單個tanh層。標準的RNN網絡如下圖所示:
在這裏插入圖片描述
LSTMs也具有這種鏈式結構,但是它的重複單元不同於標準RNN網絡裏的單元只有一個網絡層,它的內部有四個網絡層。LSTMs的結構如下圖所示:
在這裏插入圖片描述
很多人問,爲什麼開發者知道這種結構就能有這樣的效果呢?其實,很多時候是有了這種效果然後解釋這種結構,能達到這種效果的結構有很多,不止一種,當然LSTM的效果是經得住考驗的,但是現在逐漸發展的transform結構已經逐漸有替代LSTM的趨勢。

2,剖析LSTM

2.1 細胞狀態

LSTMs的核心是細胞狀態,用貫穿細胞的水平線表示。細胞狀態像傳送帶一樣。它貫穿整個細胞卻只有很少的分支,這樣能保證信息不變的流過整個RNNs。細胞狀態如下圖所示:

在這裏插入圖片描述
LSTM網絡能通過一種被稱爲門的結構對細胞狀態進行刪除或者添加信息,總的來說還是比較好理解的,以細胞狀態爲軸,將每個time-step的信息進行過濾處理,添加到細胞狀態中,過濾就包括刪除和添加,由三個門來控制,這三個門分別稱爲忘記門、輸入門和輸出門。

2.2 忘記信息

在這裏插入圖片描述

ft=σ(Wf[ht1,xt]+bf)f_t=\sigma(W_f*[h_{t-1},x_t]+b_f)
LSTM的第一步就是決定細胞狀態需要丟棄哪些信息。這部分操作是通過一個稱爲忘記門的sigmoid單元來處理的。它通過查看ht1h_{t-1}xtx_t信息來輸出一個0-1之間的向量,該向量裏面的0-1值表示細胞狀態Ct1C_{t-1}中的哪些信息保留或丟棄多少,0表示不保留,1表示都保留。

2.3 添加信息

下一步是決定給細胞狀態添加哪些新的信息。這一步又分爲兩個步驟,首先,利用ht1h_{t-1}xtx_t通過一個稱爲輸入門的操作來決定更新哪些信息。然後利用ht1h_{t-1}xtx_t通過一個tanh層得到新的候選細胞信息CtC_t^{'},這些信息可能會被更新到細胞信息中。這兩步描述如下圖所示 。
在這裏插入圖片描述
it=σ(Wi[ht1,xt]+bi)Ct^=tanh(WC[gt1,xt]+bC)\begin{aligned} &i_t = \sigma(W_i*[h_{t-1},x_t]+b_i)\\ &\hat{C_t} = tanh(W_C*[g_{t-1},x_t] + b_C) \end{aligned}

2.4 更新細胞狀態

下面將更新舊的細胞信息Ct1C_{t-1},變爲新的細胞信息CtC_t。更新的規則就是通過忘記門選擇忘記舊細胞信息的一部分,通過輸入門選擇添加候選細胞信息CtC_t^{’}的一部分得到新的細胞信息CtC_t。更新操作如下圖所示:

在這裏插入圖片描述
Ct=ftCt1+itCt^C_t=f_t*C_{t-1}+i_t*\hat{C_t}

2.5 輸出細胞狀態

更新完細胞狀態後需要根據輸入的ht1h_{t-1}xtx_t來判斷輸出細胞的哪些狀態特徵,這裏需要將輸入經過一個稱爲輸出門的sigmoid層得到判斷條件,然後將細胞狀態經過tanh層得到一個-1~1之間值的向量,該向量與輸出門得到的判斷條件相乘就得到了最終該RNN單元的輸出。該步驟如下圖所示
在這裏插入圖片描述
ot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)\begin{aligned} & o_t = \sigma(W_o[h_t-1,x_t]+b_o)\\ & h_t = o_t*tanh(C_t) \end{aligned}

3, LSTM反向傳播

與RNN一樣,我們通過隱藏狀態的梯度一步步向前反向傳播,只不過LSTM有兩個隱藏狀態hh,CC,LSTM中所有的參數要經過這兩個狀態,只要這兩個隱藏狀態的導數計算出來,相應的U,V,W,bU,V,W,b等參數就很好計算了。這裏我們以h爲例做簡單推導。
爲了方便表示,我們將損失函數L(t)L(t)表示爲兩部分,一部分是位置t的損失函數,另一部分是位置t+1的損失函數。

L(t)={l(t)+L(t+1)if t<τl(t)if t=τ L(t)=\left\{ \begin{aligned} &l(t)+L(t+1) & if \ t<\tau \\ & l(t) & if \ t=\tau \\ \end{aligned} \right.
對於序列結尾的位置:
δh(τ)=Lhτ=(oτh(τ))TLτo(τ)=VT(y^(τ)y(τ))\begin{aligned} \delta_h^{(\tau)}&=\frac{\partial L}{\partial h^{\tau}}\\ &=(\frac{\partial o^\tau}{\partial h^{(\tau)}})^T\frac{\partial L^\tau}{\partial o^{(\tau)}}\\ & = V^T(\hat{y}^{(\tau)}-{y}^{(\tau)}) \end{aligned}
其他時間位置要多加一項:
δh(t)=Lht=l(t)ht+(ht+1h(t))TL(t+1)h(t+1)=VT(y^(τ)y(τ))+(ht+1h(t))Tδht1\begin{aligned} \delta_h^{(t)}&=\frac{\partial L}{\partial h^{t}}\\ &=\frac{\partial l(t)}{\partial h^{t}} + (\frac{\partial h^{t+1}}{\partial h^{(t)}})^T\frac{\partial L(t+1)}{\partial h^{(t+1)}}\\ & = V^T(\hat{y}^{(\tau)}-{y}^{(\tau)}) + (\frac{\partial h^{t+1}}{\partial h^{(t)}})^T\delta_h^{t-1} \end{aligned}
至於C的求導要更加複雜一些,有興趣的可以參考文末的資料。有了兩個隱藏變量的導數,就可以根據前向公式進行參數求導了。

4, LSTM注意事項

1)首先需要明確的是,RNN 中的梯度消失/梯度爆炸和普通的 MLP 或者深層 CNN 中梯度消失/梯度爆炸的含義不一樣。MLP/CNN 中不同的層有不同的參數,各是各的梯度;而 RNN 中同樣的權重在各個時間步共享,最終的梯度 g=gtg = \sum g_t.

2)由 1 中所述的原因,RNN 中總的梯度是不會消失的。即便梯度越傳越弱,那也只是遠距離的梯度消失,由於近距離的梯度不會消失,所有梯度之和便不會消失。RNN 所謂梯度消失的真正含義是,梯度被近距離梯度主導,導致模型難以學到遠距離的依賴關係

3)LSTM 中梯度的傳播有很多條路徑,細胞狀態C 這條路徑上只有逐元素相乘和相加的操作,梯度流最穩定;但是其他路徑(上梯度流與普通 RNN 類似,照樣會發生相同的權重矩陣反覆連乘。

4)LSTM 剛提出時沒有遺忘門,或者說相當於 ft=1f_t=1 ,這時候在ct1ctc_{t-1} 、c_t直接相連的短路路徑上,從而這條路徑上的梯度暢通無阻,不會消失。類似於 ResNet 中的殘差連接。

5)同樣,因爲總的遠距離梯度 = 各條路徑的遠距離梯度之和,高速公路上梯度流比較穩定,但其他路徑上梯度有可能爆炸,此時總的遠距離梯度 = 正常梯度 + 爆炸梯度 = 爆炸梯度,因此 LSTM 仍然有可能發生梯度爆炸。不過,由於 LSTM 的其他路徑非常崎嶇,和普通 RNN 相比多經過了很多次激活函數(導數都小於 1),因此 LSTM 發生梯度爆炸的頻率要低得多。實踐中梯度爆炸一般通過梯度裁剪來解決。

5, LSTM變體

5.1 peephole connections

在這裏插入圖片描述
ft=σ(Wf[Ct1,ht1,xt]+bf)it=σ(Wi[Ct1,ht1,xt]+bi)ot=σ(Wo[Ct1,ht1,xt]+bo)\begin{aligned} &f_t=\sigma(W_f[C_{t-1},h_{t-1},x_t]+b_f)\\ &i_t=\sigma(W_i[C_{t-1},h_{t-1},x_t]+b_i)\\ &o_t=\sigma(W_o[C_{t-1},h_{t-1},x_t]+b_o)\\ \end{aligned}
Peephole是窺視的意思,意圖也很明顯,就是將細胞狀態信息傳遞給各個門,讓其能窺視到細胞狀態。

5.2 引入耦合(GRU)

在這裏插入圖片描述

zt=σ(Wz[ht1,xt])rt=σ(Wr[ht1,xt])h^t=tanh(W[rtht1,xt])ht=(1zt)ht1+zth^t\begin{aligned} &z_t=\sigma(W_z[h_{t-1},x_t])\\ &r_t=\sigma(W_r[h_{t-1},x_t])\\ &\hat{h}_t=tanh(W[r_t*h_{t-1},x_t])\\ &h_t=(1-z_t)*h_{t-1}+z_t*\hat{h}_t\\ \end{aligned}
我們熟知的就是GRU,將忘記門和輸入門合併成一個新的門,稱爲更新門。GRU還有一個門稱爲重置門,上圖中前面那個門,決定了如何將新的輸入信息與前面的記憶相結合。

6, biLSTM

在這裏插入圖片描述
爲什麼會有雙向LSTM?原因很簡單,單項LSTM信息量不夠,例如:
“我今天不舒服,我打算____一天。”
只根據‘不舒服‘,可能推出我打算‘去醫院‘,‘睡覺‘,‘請假‘等等,但如果加上後面的‘一天‘,能選擇的範圍就變小了,‘去醫院‘這種就不能選了,而‘請假‘‘休息‘之類的被選擇概率就會更大。
而雙向計算的思路也很簡單,從前往後計算一遍,然後從後往前再計算一遍,得到的特徵維度要比lstm多一倍

7, LSTM總結

回顧一下,LSTM的過程,LSTM與RNN一樣是重複模塊鏈式結構,我們把每個模塊看做細胞,其中貫穿所有細胞的爲細胞狀態CC,起到保留有效信息的左右,對於每個細胞狀態,根據當前輸入和前一時刻的輸入,分別計算需要忘記和保留的細胞信息,並把這些信息添加到細胞狀態中,然後再根據當前輸入計算細胞狀態輸出。
LSTM 之所以能夠實現長時記憶而不會形成遠距離梯度衰減,是因爲有細胞狀態這條高速通道。

參考文獻
https://www.cnblogs.com/pinard/p/6519110.html
https://www.zhihu.com/question/34878706

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章