LSTM梳理,理解,和keras實現 (一)


注:本文主要是在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

 

未完待續。。(搬磚去了)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM