注:本文主要是在http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 這篇文章的基礎上了解寫成,姑且也可以稱作 The understanding of understanding LSTM network. 感謝此篇作者的無私分享和通俗精确的講解。
一. RNN
說到LSTM,無可避免的首先要提到最簡單最原始的RNN。在這一部分,我的目标隻是了解“循環神經網絡”中的‘循環’二字,不打算扔出任何公式,順便一提曾經困惑過我的keras中的輸入資料格式。

我們經常可以看到有人說,LSTM适合時序序列,變長序列,尤其适合自然語言處理。那麼是什麼賦予它可以處理變長序列的能力呢? 其實,隻要仔細研究上圖,相信每個人都能有一個直覺的答案。
從圖檔左邊來看,RNN有兩個輸入,一個是目前t時刻的輸入Xt, 另一個是一個看似“本身“的輸入。
這樣看還不甚明了,再看圖檔右邊: 實際上右圖是左圖的一個在時間序列上的展開,上一個時刻輸出是這一個時刻的輸入。值得注意的是,實際上,右圖上的所有神經元是同一個神經元,也就是左圖,它們共享同樣的權值,隻不過在每一個時刻接受不同的輸入,再把輸出給下一個時刻作為輸入。這就是存儲的過去的資訊。
了解到“循環”的含義即達到本章的目的了,公式和細節将在LSTM中詳細叙述。
keras中文文檔: http://keras-cn.readthedocs.io/en/latest/layers/recurrent_layer/ (中文文檔真的做的很贊,除了翻譯的内容,還加了額外的内容,例如tensor, batch size的概念幫助DL新手了解)
在所有的RNN中,包括simpleRNN, LSTM, GRU等等,輸入輸出資料格式如下:
輸入是一個三維向量。samples即為資料的條數。難以了解的是timesteps 和input_dim. Input_dim是資料的表示形式的次元,timestep則為總的時間步數。例如這樣一個資料,總共100條句子,每個句子20個詞,每個詞都由一個80維的向量表示。在RNN中,每一個timestep的輸入是一個詞(當然這不一定,你也可以調成兩個詞或者其他),從第一張RNN的圖來看,t0時刻是第一個時間步,x0則為代表一條句子中第一個詞的80維向量,t1是第二個時間步,x1表示句子中第二個詞的80維向量。。。是以,輸入資料的大小應當是(100, 20, 80)
注:實際中句子長度不會一模一樣,但從RNN的工作流程來看,它可以處理變長序列。在kera中,可以首先将句子設為最大長度,不足這個長度的句子補足0,然後在RNN層前加embedding層或者Mask層過濾掉補足的字元。具體在我的博文中
http://www.cnblogs.com/leeshum/p/6089286.html
未完待續。。(搬磚去了)