從軟件工程的角度寫機器學習7——-LSTM網絡實現

LSTM網絡實現

問題描述

影片評價問題:
輸入一個英文句子,輸出好/壞的二元評價,比如
The movie is very bad -> 0
Wonderful -> 1

算法思路

本圖中的數字僅爲示例,並非真實數據
框圖

Embedding層

在上一篇卷積神經網絡的實現中,我們將類別直接映射爲{0,0…1,…0}這樣的向量,但對於單詞而言,這個向量維度太大了(500個單詞就是500維…),結合後面的時間序列展開會變成非常龐大,因此,我們需要新的方式。

新的方式就是引入一個Embedding Layer:
1、統計所有互不相同的單詞個數,記爲n。
2、先將單詞轉換爲數字序號{0,1,2……,n-1}。
3、初始化一個 (n,m) 的係數矩陣。
4、讀取序號所對應的行,這個m維向量即爲轉換結果
這個係數矩陣及這個映射即 Embedding Layer,係數矩陣通過後向傳播算法訓練。
毫無疑問,這個層的係數矩陣非常的大,訓練它也是比較麻煩的,也可以用word2vec等現有的庫去把單詞轉化爲向量。

時間序列的處理

在情感分析這個問題中,每條句子的長短不一,而每個單詞被映射爲相同長度的向量,句子中的單詞存在先後關係,因此構成了一個時間序列。

在實際計算中,時間序列按固定的迭代次數,展開處理。比如取定迭代次數爲50,單詞轉化成的向量長度爲10(m=10),則展開的向量爲50*10=500。

句子的長短不一,有的比50大,那就截斷,只取最後50個單詞;有的比50小,就需要引入mask,標誌這個展開向量後面若干是無效的。

LSTM公式

LSTM 層的輸入是一個 t*m 的向量,輸出也是一個 t*m 的向量,在運算時,分成 t 個 m 長度的向量逐個計算:
(x0,x1,x2,...,xt1,xt)>(h0,h1,h2,...,ht)

參考 http://deeplearning.net/tutorial/lstm.html
這篇文檔講得非常清楚,就是如下一系列的核心公式:
it=σ(Wixt+Uiht1+bi)
Ct¯=tanh(Wcxt+Ucht1+bc)
ft=σ(Wfxt+Ufht1+bf)
Ct=itCt¯+ftCt1
ot=σ(Woxt+Uoht1+bo)
ht=ottanh(Ct)

反向傳播

Embedding 層的反向傳播

Embedding 層的反向傳播僅對係數有效。
在正向傳播時記錄下所選取的index,把相應的差分加到相應的行上去即可。
(詳細待補)

LSTM 層的反向傳播

LSTM層的反向傳播需要分別計算
輸入差: Δx0,Δx1,...,Δxt
以及係數差:ΔWi,ΔUi,Δbi,ΔWc,ΔUc,Δbc,ΔWf,ΔUf,Δbf,ΔWo,ΔUo,Δbo
爲了計算,需要分別對it,Ct¯,ft,Ct,ot,ht 求導展開,大致思路可以參考下面的草稿圖(右上角那幅圖是計算輸入差的,其餘是計算係數差,式中計算單元均是矩陣,最後的連線是矩陣乘法,之前的是矩陣元素乘法)

LSTM Backward

需要注意的是:Δhi 包括兩個部分,第一部分由 Δhi+1 傳遞過來,第二部分是外連的層傳遞的(如果是接的 max 層,那只有 Δht 有輸出層的反向傳播)

LSTM的反向傳播是相當麻煩的,如果實現了自動求導,會輕鬆不少。

代碼工程

待補

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章