1. 程式人生 > >我對LSTM的理解(一)

我對LSTM的理解(一)

org 進行 而已 我們 序列 構造 介紹 拼接 影響

作者:Tobin
日期:2019/04/12
緣起:最近在做時間序列分析的實驗,FCN網絡做時序數據分類的效果還可以,由於時間的依賴性,自然地想到是否可以利用LSTM網絡進行時序數據的分類。我對CNN比較了解,但是對LSTM,感覺很多文章都介紹得太籠統,大部分都是介紹cell,而忽略了它和CNN的聯系。

LSTM叫長短期記憶網絡(Long short term memory),是RNN循環神經網絡(Recurrent Neural Network)的一個變形。我們先講講RNN。

RNN

每個綠色的部分叫做cell,看起來它們好像是不同的cell,但實際上它們只是同一個cell在不同時刻的樣子!中間的這個cell清晰地畫出了數據經過它到底進行了怎樣的操作~輸入是上一次cell輸出的狀態值和此時刻的輸入,組合後,乘以權重和偏置,經過一次tanh就得到了這個cell的輸出。

普通的RNN對於處理短的序列數據還行,當數據很長時,就會出現梯度消失和梯度爆炸的問題。所以又提出了改進版RNN,LSTM。

LSTM

LSTM多了什麽呢?
看下面的圖,很復雜對嘛,我們細細講解。LSTM多了一個表示cell記憶的值。也就是我們不僅要更新當前cell的輸出,我們還要思考,哪些東西可以記在我們的cell裏呢,記憶的話,記多少又如何確定呢?既然有了記憶,那麽我們的輸入不僅僅有上一時刻的輸出,此刻的輸入,還有cell本身存儲的那部分信息。所以LSTM的構造看起來很復雜,其實是圍繞著記憶做操作的。

下圖的C就表示記憶。

為了實現我們引入的記憶的思想,構造了三個門,遺忘門,輸入門,輸出門。

遺忘門

遺忘門能決定應丟棄或保留哪些信息。來自先前隱藏狀態的信息和當前輸入的信息同時輸入到Sigmoid函數,輸出值處於0和1之間,越接近0意味著越應該忘記,越接近1意味著越應該保留。這個f就可以用來操控遺忘哪些數據。

輸入門

f是forget的意思,i是input的意思。
輸入門用來更新單元狀態。先將先前隱藏狀態的信息和當前輸入的信息輸入到Sigmoid函數,在0和1之間調整輸出值來決定更新哪些信息,0表示不重要,1表示重要。也可將隱藏狀態和當前輸入傳輸給Tanh函數,並在-1和1之間壓縮數值以調節網絡,然後把Tanh輸出和Sigmoid輸出相乘,Sigmoid輸出將決定在Tanh輸出中哪些信息是重要的且需要進行保留。

下面這張圖顯示了,兩個門是如何控制遺忘和記憶的。

輸出門

我們確定了當前的狀態,那麽當前狀態的多少可以進行輸出呢?控制Ct輸出的門叫輸出門,用Ot表示。
輸出門能決定下個隱藏狀態的值,隱藏狀態中包含了先前輸入的相關信息。當然,隱藏狀態也可用於預測。首先把先前的隱藏狀態和當前輸入傳遞給Sigmoid函數;接著把新得到的單元狀態傳遞給Tanh函數;然後把Tanh輸出和Sigmoid輸出相乘,以確定隱藏狀態應攜帶的信息;最後把隱藏狀態作為當前單元輸出,把新的單元狀態和新的隱藏狀態傳輸給下個時間步。

代碼實現

def LSTMCELL(prev_ct, prev_ht, input)
    combine = prev_ht + input
    ft = forget_layer(combine)
    it = input_layer(combine)
    ot = ouput_layer(combine)
    candidate = candidate_layer(combine)
    Ct = prev_ct*ft+candidate*it
    ht = ot*tanh(Ct)
    return ht, Ct
    
ct = [0, 0, 0]
ht = [0, 0, 0]

for input in inputs:
    ct, ht = LSTMCELL(ct, ht, input)

ht和xt結合後(拼接),構造出三個門控單元。再進行此cell在t時刻狀態Ct的更新,利用Ct輸出ht。inputs是一個輸入的時間序列,可以看出,LSTM在不同時刻輸入,只是在不斷地循環輸入而已。整個代碼由幾個張量操作和一個for循環組成,循環神經網絡名字的來源一看便知哈。

多層LSTM

多層LSTM只是將單個cell進行堆疊。LSTM比為啥比CNN難理解呢?因為它把神經元的個數都藏到cell裏面啦。假設大家都了解過CNN,看下面的圖是不是有點感覺呢?我來解釋一下,一個cell其實就是一層神經元,只是LSTM和CNN不同的是,它的每一層t時刻的輸出和t-1時刻的狀態有關。也就是說當前cell的輸出ht不僅僅影響到下一cell(圖中右邊的那列),還影響本cell下一時刻的狀態和輸出(圖中按時間順序堆疊的三個綠色的cell)。
理解到這一點了,我們也自然地理解到,xt可以是多維的。然後每個cell的hidden_size都可以進行設置。

多層LSTM的代碼

代碼暫時沒寫,未完待續~
參考資料:
https://zhuanlan.zhihu.com/p/46981722
https://blog.csdn.net/gzj_1101/article/details/79376798

我對LSTM的理解(一)