1. 程式人生 > >Long Short-Term Memory(LSTM)

Long Short-Term Memory(LSTM)

迴圈神經網路(Recurrent Neural Network,RNN)可以通過許多不同的方式建立,但就像幾乎所有函式都可以被認為是前饋網路,基本上任何涉及迴圈的函式可以被認為是一個迴圈神經網路。它的基本結構以及其展開的理解如下圖所示:

這裡寫圖片描述
同一網路被視為展開的計算圖,其中每個節點現在與一個特定的時間例項相關聯。
h ( t

) = f ( U x t +
W h ( t 1 ) )
\mathrm h^{(t)}=f(U\mathrm{x}_t+W\mathrm h^{(t-1)})
之前在神經網路中證明過如果加深網路的話可能會造成梯度消失或者梯度爆炸,在RNN中也是,這就導致了RNN不能處理長期依賴資料的問題,即隨著時間的推移,以前的資料會影響非常小,且時間間隔非常小,很難處理超過10的序列。不過只要有需求就會有技術!其中一個RNN的變體–Long Short-Term Memory(LSTM)的表現在處理這個問題上非常好。它主要是採用了模組記憶體,將資料給記錄下來,從而可以儲存比較長時間的資訊,具體的結構如下:

這裡寫圖片描述

比照人腦的記憶執行,LSTM相比RNN它的結構特意的添加了:
遺忘機制(forgetting mechanism),即遺忘門,當新輸入來時,它專注於需要記住哪些資訊,以及需要丟棄哪些資訊。
儲存機制(saving mechanism),即輸入門,用於儲存資訊。
所謂“門”用以控制輸入的向量,即可以看成是一個普通的全連線層: g ( x ) = σ ( W x + b ) g(\mathbf{x})=\sigma(W\mathbf{x}+\mathbf{b})
回憶人類在面對事件時,總是依據現有事實再從以往經驗中那些對當前境況有用的經驗中提取有利的資訊用以綜合判斷,解決事件。所以當新輸入來時,往往需要先決定新輸入中的哪部分資訊是有用的,並將它們儲存在自己的長期記憶體中,再搜尋判斷存於長期記憶體中的記憶哪些是對當前狀態有用的,最後綜合得出結果。於是可以看到整個結構圖:

這裡寫圖片描述

在上圖中,可以看到這些細胞之間彼此迴圈相連用以代替一般迴圈網路中普通的隱藏單元,所有門控單元都具有Sigmoid非線性,而輸入單元可具有任意的壓縮非線性。其中黑色方塊表示單個時間步的延遲。
它不僅有外部RNN的迴圈,還有內部狀態單元的線性自環,因此它不僅僅是簡單的向輸入和迴圈單元的仿射變換之後施加一個逐元素的非線性。自環權重由迴圈門控制
f i ( t ) = σ ( b i f + U f x ( t ) + W f h ( t 1 ) ) f_i^{(t)}=\sigma(b_i^f+\sum U^fx^{(t)}+\sum W^fh^{(t-1)})
g i ( t ) = σ ( b i g + U g x ( t ) + W g h ( t 1 ) ) g_i^{(t)}=\sigma(b_i^g+\sum U^gx^{(t)}+\sum W^gh^{(t-1)})
q i ( t ) = σ ( b i q + U q x ( t ) + W q h ( t 1 ) ) q_i^{(t)}=\sigma(b_i^q+\sum U^qx^{(t)}+\sum W^qh^{(t-1)})
b,U,W分別是偏置,輸入權重和遺忘門的迴圈權重。f,g,q分別是遺忘門和輸入門,輸出門。記憶體細胞的更新為:
c t = f t c t 1 + i t c ~ t \mathbf{c}_t=f_t\circ{\mathbf{c}_{t-1}}+i_t\circ{\mathbf{\tilde{c}}_t}
輸出為 h t = σ ( W [ h t 1 , x t ] + b ) tanh ( c t ) \mathbf{h}_t=\sigma(W\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b})\circ \tanh(\mathbf{c}_t)
然後通過反向傳播調整引數訓練網路即可。

論加法與乘法。
為什麼結構圖中有些地方用了 \circ ,有些地方用了 + + 呢?
乘法直觀來講是作為一種對資訊某種控制的操作(比如乘0就消失,1不變,其他的數作放大縮小反向等),而加法可以看作是新資訊疊加舊資訊。當然了,lstm的設定肯定不會僅僅從直觀來判斷,如果把兩者進行比較會發現如果不這樣做將沒辦法解決梯度問題。

為什麼記憶要分長期記憶和有利記憶,而不是直接用同一種記憶呢?
門控遞迴單元(Gated Recurrent Units,GRU)本質上就是一個沒有輸出門的LSTM,因此它在每個時間步都會將記憶單元中的所有內容寫入整體網路,即直接使用了同一種記憶。具體的實現區別在於GRU單個門控同時控制遺忘因子和更新狀態單元的決定。

這裡寫圖片描述
輸出更新的方式變為:
h i ( t ) = u i ( t 1 ) h i ( t 1 ) + ( 1 u i ( t 1 ) ) σ ( b i + U x ( t ) + W r ( t 1 ) h ( t 1 ) ) h_i^{(t)}=u_i^{(t-1)}h_i^{(t-1)}+(1-u_i^{(t-1)})\sigma(b_i+\sum Ux^{(t)}+\sum Wr^{(t-1)}h^{(t-1)}) 其中u是更新門(Update Gate),r是復位門(Reset Gate)。
u i ( t ) = σ ( b i u + U u x ( t ) + W u h ( t ) ) u_i^{(t)}=\sigma(b_i^u+\sum U^ux^{(t)}+\sum W^uh^{(t)})
r i ( t ) = σ ( b i r + U r x ( t )