LSTM 分類器筆記及Theano實現


相關討論

http://tieba.baidu.com/p/3960350008

基於教程
http://deeplearning.net/tutorial/lstm.html

LSTM基本原理
http://tieba.baidu.com/p/3405569985
GRAVES 教程 http://www.cs.toronto.edu/~graves/preprint.pdf
因為原教程有些不太直觀的地方,展開講一下
目的:根據IMDB影評網站扒取的文本,及文本對應的對電影的評分(一顆星到五顆星)作為訓練集;得到自動分析文本情緒的LSTM分類器;可用來分析任意文本的情緒(積極或消極)
 

理論部分:

模型的時間展開圖:




如果一句話有n個詞,那么將這n個詞用維數為d的向量表示,分別為x0到xn;

這里的LSTM方框是一個又m個LSTM節點組成的陣列;m是模型中LSTM節點的總數。
也就是說x0箭頭所指的LSTM和x1所指的LSTM是同一個陣列,只不過它們發生在不同的時間。可以認為這個模型運行了n個時間單位(n為文本長度),每個時間單位t上,LSTM陣列的輸入為xt,輸出為ht, 其中t<=n;
Mean pooling是對所有時間單位上的ht的平均,得到向量h,再用邏輯回歸分類。


如果對上圖x0到LSTM到h0放大就是這個樣子;其中LSTM陣列中包含m個LSTM單元;
而其中每個單元如L1,有4組輸入權重(均為n維向量)與x0連接,且有4組輸入權重(均為m維向量)與h0連接。L1將輸出一個數作為h0中的第一個元素;
將L1部分再展開:



L1的輸入有8個,4個來自xt,分別為xt*Wc, xt*Wi, xt*Wf, xt*Wo; 4個來自h(t-1)分別為ht-1*Uc, ht-1*Ui, ht-1*Uf, ht-1*Uo; 而L1的輸出為ht 的一個元素


將L1單個節點展開
其中包含6個標量,分別為\tilde{Ct}, it, Ct, ft, ot, ht
其中展開it為 sigmoid(Wixt + Uiht-1),紙面有限其他的不畫了
 

權值更新

連接和計算方法如下

這樣在每個時間點t,xt對LSTM陣列的輸入權重為4個d*m的矩陣,而ht-1對LSTM陣列的輸入權重為4個m*m的矩陣。經過計算后生成ht。
權值更新:
在每一個minibatch,在此例中一個minibatch是16句話(每句話小於100個詞多余刪掉),計算出logistic regression的cost,然后計算出h 的殘差;
並計算出對應的Δh1,Δh2,... Δht
而由於ht和,ht-1存在某種函數關系,能夠計算出與Δht對應的Δht-1',這一來自LSTM陣列的慘差應該與來自Δh的殘差合並,並繼續做誤差反傳;

即對於每個minibatch,權重應該更新了t次,t即是每句話詞的數量;

我double check了一下,理解是正確的;reference:
DLBOOK(2015)page 315

http://www.iro.umontreal.ca/~bengioy/DLbook/rnn.html
Theano中權值更新通過theano.scan實現參考
http://deeplearning.net/software/theano/library/scan.html

keras包

然而keras包(基於theano)搞同樣的東西只要30行代碼
https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py

測試:

keras 文本生成器
https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py
雙層LSTM 示例


免責聲明!

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



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