理論上講,只要足夠大的RNN結構就能去生成任意復雜的序列結構。
但是在實際上,標准的RNN並不能有效的長期保存信息(這是由於類似HMM的結構,每次每個節點的信息如果始終經過同樣的變換,那么會要么指數爆炸要么指數衰減,很快信息就會丟失)。也是由於它這個“健忘”的特點,這種RNN生成的序列很容易缺乏穩定性。這樣的話,如果只能依賴上幾步的結果去預測下一步,而又使用預測的新結果去預測再下一步,那么一旦出現了錯誤,系統就會很容易沿着錯誤的方向走下去,而很少有機會能從之前的信息中把錯誤改正過來。
從這個角度講,如果RNN能有一個“長久的記憶”的話,就會能在穩定性上有很好的效果,因為即使它不能確定當前幾步是不是正確的,它也能夠從更久之前的信息中得到一些“啟發”來形成新的預測。
(有人可能會說:如果在訓練RNN的時候本身就加上噪音或者其他方法讓它在遇到奇怪的輸入時能夠依然保持穩定。但是我們依然覺得引進更好的記憶方法是更高效更有長久發展意義的舉動。)
LSTM
LSTM是指Long Short-term Memory。這是一種在1997年搞出來的一種結構。
大概如圖所示。
這種結構設計的非常精妙,包含了輸入閘(input gate),遺忘閘(forget gate)和輸出閘(output gate)。這三種閘都是由特定的數據控制的,取值為{0, 1}(實際上會用一個sigmoid或者tanh函數來逼近,因為離散的0和1是不可求導的。)。其中輸入閘,輸出閘,遺忘閘和Cell都是和ht大小一樣的{0,1}向量。
例如:
輸入閘為0,遺忘閘為1,輸出閘為1的時候這個LSTM單元就會不接受這次的輸入數據而把上次的記錄數據再次返回。(類似於只讀)
輸入閘為1,遺忘閘為0,輸出閘為1的時候這個LSTM單元就會清空之前的“記憶”,只把這次來自Xt的信息傳給ht,同時記錄下來。(類似於刷新)
輸入閘為1,遺忘閘為1,輸出閘為0的時候這個LSTM單元會在記憶中加入這次的輸入信息但是不會接着傳遞下去。(類似於存儲)
等等。。。
如果沒有太明白的話看一下他們之間的傳遞公式會比較好理解
(其中σ(x)表示sigmoid函數)
其中W矩陣都是對角陣,表示每個閘的元素都是由對應維數的數據得到的,也就是說不同維數的節點之間是互不干擾的!
原本的LSTM算法有一個自己定做的遞降近似求法使得網絡的權值能夠在每一個時間點都進行更新,但是整個遞降可以通過對時間的反向傳播來完成,這也是這里用的方法。然而有個問題需要解決就是有些導數會變得非常的大,導致計算很困難。為了防止這種情況出現,本文的所有實驗都將對整個網絡的輸入的求導停止在LSTM層(在sigmoid和tanh使用之前)。(這個之后再詳細講)
文中全部圖片和數據都來自論文