主要參考:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
RNN(Recurrent NeuralNetworks,迴圈神經網路)
對於普通的神經網路而言,之前的資訊不能對現在的理解產生影響,比如說,閱讀一篇文章,我們需要藉助之前學到的詞彙,而普通神經網路做不到這一點,因此出現了迴圈神經網路,其最大的優點在於對於之前資訊的保持性。
xt為輸入,經過函數A,輸出ht ,而經過這個過程之後,對函數A進行修改,使其含本次的輸入資訊。可以理解為下面這個模型
LSTM:
提出的背景:RNN無疑解決了神經網路的記憶問題,RNN在短期記憶中應用較好,比如一個句子,推斷它的下一個詞是什麼,只需要很少的一段學習過程,就可以利用最近的資訊推斷出來,但是當這個句子變成一個段落,對於迴圈神經網路來說可能就不能準確推斷了。在理論上,RNN是可以建立長時間的聯絡,但是,在實際中,可能很難學習到很久之前的資訊。
LSTM就是一種能夠學習到很久之前的資訊的特殊RNN,在1997年提出,並得到了廣泛的應用。他的提出就是為瞭解決長時間的依賴問題。
從上述兩幅圖中可以看出RNN和LSTM的差異所在,在第二個模組中RNN只有一個tanh門,而LSTM有四個門。對於每個狀態都可以對其進行更新。
下面對於這四個門的具體作用以及運算式進行分析:
1.首先LSTM演算法要決定的是哪些資訊是需要扔掉的。主要是通過遺忘門層(forget gate layer)來實現。通過對輸入ht-1和xt進行處理,在狀態 輸出一個0~1之間的值來表示遺忘程度,其中0表示全部遺忘,1表示全部記住。
2.LSTM演算法的第二步是確定儲存的新的資訊。首先,輸入門層決定哪些值需要更新,tanh層產生新的向量,這兩個部分共同對此時的狀態進行更新
3.將狀態Ct-1更新至Ct ,用 ft與Ct-1相乘,表示決定遺忘的程度,而it 與 C~t相乘,表示新增加的資訊,從而得到下一時刻的資訊。
4.確定輸出,輸出是基於我們上述分析的,不過還要加上濾波,首先運行一個sigmod層,來確定那一部分狀態是我們將要輸出的,然後,將狀態輸入到tanh,使其值介於-1~1之間,然後將輸出與sigmoid門的輸出相乘,就得到我們決定的輸出部分。
LSTM演算法的一些變形:
1.添加窺視孔串連,也就是讓各門層監視系統的狀態。有的變形是所有的都加,有的是部分加。
2.利用串連的遺忘門和輸入門。之前是分別決定遺忘的資訊以及需要添加的新資訊,改進是讓這兩種結合在一塊,只有當有替代輸入時才對這部分進行遺忘,只有當遺忘掉一些老的東西時才進行新的輸入。
3.添加門控迴圈單元,將遺忘門和輸入門結合為更新門,同時也融合了目前狀態以及隱藏狀態。