好久沒寫博客了,近幾天重新看LSTM,發現有很多細節之前沒有理解到位,並且至今有一些疑惑。接下來從RNN談起,利用公式描述,並結合tensorflow函數說明兩個容易混淆的細節。之後講解LSTM,主要參考自大神Alex Graves論文《supervised sequence labelling with recurrent neural networks》,同時加上自己的理解,如果不對,請大家指出,在此先行謝過!
首先,說一下自己的疑惑!目前幾乎所有的博客、教程,在講解LSTM時,幾乎都是以一個block裏僅有一個memory cell進行講解,但是實際情況是一個block裏有可以有多個memory cell,在LSTM發明者 Hochreiter & Schmidhuber,1997的論文中,明確指出了一個block裏可以有多個cell。我的問題是:
1、對於一個block裏有多個memory cell的情況,假設有一個block裏有兩個memory cell,那麼這兩個cell是如何連接的?是共用三個門嗎?如果是,若採用全零初始化,那豈不是兩個cell的值會一直相同?還是各自有自己的門?如果是各自有各自的門,豈不是可以看作多個block,一個block內,僅有一個memory cell?
希望大神看到後可以幫我解答一下,謝謝!
1、RNN
1.1 公式
經典RNN也就是Vanilla RNN,如下圖1所示:
循環神經網絡的獨特之處在於隱層,它是與上一時刻自連接的,也就是隱層對應的權值矩陣一定是方陣。將圖1簡化爲圖2。
用公式表達爲:
(1)
,爲激活函數 (2)
(3)
以圖1爲例,表示在t時刻神經網絡的輸入,的shape爲,的shape爲,的shape爲,U的shape爲,W的shape爲,一定是方陣,V 的shape爲。
1.2 tensorflow代碼易混點
在tf中,經常會遇到RNN輸出tuple,例如
(outputs,state)=tf.nn.static_rnn(cell,inouts)
在這裏,outputs爲每個時間步的輸出,是一個長度爲T的list;state是最後一個時間步的狀態。
那麼,outputs[-1]與state相同嗎?對於上述經典RNN來說是相同的,用博客《如何簡單的理解LSTM——其實沒有那麼複雜》中的圖表示,如圖3所示。
從圖中可以看出,state就是outputs[-1]的複製,圖3中的h對應式(2)中的h。但是,這個結論對於LSTM卻不適用,接下來會進行講解。
2、 LSTM
2.1 LSTM發展歷程
簡要說明一下,最初LSTM《Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735-1780.》是沒有遺忘門的,後來2000年Gers改進,增加了遺忘門,之後又增加了peephole連接。peephole連接是將t-1時刻未激活的memory cell狀態,送到 t 時刻,作爲輸入門與輸出門的輸入,也就是下圖4-5中綠線表示。
2.2 公式
公式部分主要參考Alex Graves論文《supervised sequence labelling with recurrent neural networks》33 34 37 38頁。
接下來以輸入層4個節點,輸出層爲2個block,每個block有1個memory cell爲例進行說明。
圖4-圖7給出了LSTM前向過程的公式表達(圖片右邊)以及示意圖,以及各個權值矩陣的shape。
2.2 tensorflow代碼易混點
在1.2中講到,對於LSTM來說,outputs[-1]與state是不同的,原因在於outputs裏是隱層輸出,而state是cell狀態,用上圖公式裏的符號表示爲outputs是的集合,而state是最後一個時刻的。對應博客《如何簡單的理解LSTM——其實沒有那麼複雜》中的圖表示,如圖8、9所示。圖8、9中的對應圖6中的,圖8、9中的對於圖7中的,這裏,是由標量,構成的向量,是細胞狀態與隱層輸出。
參考:
https://www.cnblogs.com/ooon/p/5594438.html
https://zybuluo.com/hanbingtao/note/581764
https://www.jianshu.com/p/4b4701beba92