轉(zhuǎn)載:《理解 LSTM 網(wǎng)絡(luò) | 我愛計算機》
Recurrent Neural Networks
人類對事物的理解并不是從一片空白開始的,往往都是基于對先前所見所聞的理解來對看到的進行推斷;我們的思想有持久性,對市場歷史的理解對將來的走勢也具有一定的參考和借鑒。
傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)一大弊端就是只是在每個時間點對事件類型進行分類,很難根據(jù)先前的事件對后續(xù)進行推斷。RNN解決了這個問題,RNN包含循環(huán)網(wǎng)絡(luò),允許信息的持久化。

上圖中,神經(jīng)網(wǎng)絡(luò)模塊 A ,讀取某個輸入 x_i ,并輸出一個值 h_i ;循環(huán)可以使得信息從當前步傳遞到下一步。循環(huán)使得RNN看起來神秘,仔細想想,其實跟正常的神經(jīng)網(wǎng)絡(luò)沒有太大區(qū)別。RNN可以看做是同一神經(jīng)網(wǎng)絡(luò)的多次復(fù)制,每個神經(jīng)網(wǎng)絡(luò)模塊會把信息傳遞個下一個。如果展開這個循環(huán)就得到:

鏈式的特征揭示了RNN本質(zhì)山是序列和列表相關(guān)的,RNN是對于這類數(shù)據(jù)最自然的神經(jīng)網(wǎng)絡(luò)架構(gòu)。過去幾年,應(yīng)用RNN在語音識別、語言建模、翻譯、圖片描述等問題上,已經(jīng)取得了一定的成功。建議參考Andrej Karpathy 的博客文章——The Unreasonable Effectiveness of Recurrent Neural Networks 來看看更豐富有趣的 RNN 的成功應(yīng)用。
這些成功應(yīng)用的關(guān)鍵之處就是LSTM的使用,LSTM是一種特殊的RNN,比標準的RNN在很多任務(wù)上表現(xiàn)更好,幾乎所有令人興奮的關(guān)于RNN的結(jié)果都是通過LSTM達到的。
**長期依賴(Long-Term Dependencies)問題 **
RNN 的關(guān)鍵點之一就是他們可以用來連接先前的信息到當前的任務(wù)上,例如使用過去的視頻段來推測對當前段的理解。如果 RNN 可以做到這個,他們就變得非常有用。但是真的可以么?答案是,還有很多依賴因素。
有時候,我們僅僅需要知道先前的信息來執(zhí)行當前的任務(wù)。例如,我們有一個語言模型用來基于先前的詞來預(yù)測下一個詞。如果我們試著預(yù)測 “the clouds are in the sky” 最后的詞,我們并不需要任何其他的上下文 —— 因此下一個詞很顯然就應(yīng)該是 sky。在這樣的場景中,相關(guān)的信息和預(yù)測的詞位置之間的間隔是非常小的,RNN 可以學會使用先前的信息。

但是同樣會有一些更加復(fù)雜的場景。假設(shè)我們試著去預(yù)測“I grew up in France... I speak fluent French”最后的詞。當前的信息建議下一個詞可能是一種語言的名字,但是如果我們需要弄清楚是什么語言,我們是需要先前提到的離當前位置很遠的 France 的上下文的。這說明相關(guān)信息和當前預(yù)測位置之間的間隔就肯定變得相當?shù)拇蟆2恍业氖?,在這個間隔不斷增大時,RNN 會喪失學習到連接如此遠的信息的能力。

在理論上,RNN 絕對可以處理這樣的 長期依賴 問題。人們可以仔細挑選參數(shù)來解決這類問題中的最初級形式,但在實踐中,RNN 肯定不能夠成功學習到這些知識。Bengio, et al. (1994)等人對該問題進行了深入的研究,他們發(fā)現(xiàn)一些使訓練 RNN 變得非常困難的相當根本的原因。然而,幸運的是,LSTM 并沒有這個問題!
LSTM網(wǎng)絡(luò)
Long Short Term 網(wǎng)絡(luò)—— 一般就叫做 LSTM ——是一種 RNN 特殊的類型,可以學習長期依賴信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves進行了改良和推廣。在很多問題,LSTM 都取得相當巨大的成功,并得到了廣泛的使用。LSTM 通過刻意的設(shè)計來避免長期依賴問題。記住長期的信息在實踐中是 LSTM 的默認行為,而非需要付出很大代價才能獲得的能力!所有 RNN 都具有一種重復(fù)神經(jīng)網(wǎng)絡(luò)模塊的鏈式的形式。在標準的 RNN 中,這個重復(fù)的模塊只有一個非常簡單的結(jié)構(gòu),例如一個 tanh 層。

LSTM 同樣是這樣的結(jié)構(gòu),但是重復(fù)的模塊擁有一個不同的結(jié)構(gòu)。不同于 單一神經(jīng)網(wǎng)絡(luò)層,這里是有四個,以一種非常特殊的方式進行交互。

不必擔心這里的細節(jié)。我們會一步一步地剖析 LSTM 解析圖?,F(xiàn)在,我們先來熟悉一下圖中使用的各種元素的圖標。

在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節(jié)點的輸出到其他節(jié)點的輸入。粉色的圈代表 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學習到的神經(jīng)網(wǎng)絡(luò)層。合在一起的線表示向量的連接,分開的線表示內(nèi)容被復(fù)制,然后分發(fā)到不同的位置。
LSTM的核心思想
LSTM 的關(guān)鍵就是細胞狀態(tài),水平線在圖上方貫穿運行。細胞狀態(tài)類似于傳送帶。直接在整個鏈上運行,只有一些少量的線性交互。信息在上面流傳保持不變會很容易。

LSTM 有通過精心設(shè)計的稱作為“門”的結(jié)構(gòu)來去除或者增加信息到細胞狀態(tài)的能力。門是一種讓信息選擇式通過的方法。他們包含一個 sigmoid 神經(jīng)網(wǎng)絡(luò)層和一個 pointwise 乘法操作。

Sigmoid 層輸出 0 到 1 之間的數(shù)值,描述每個部分有多少量可以通過。0 代表“不許任何量通過”,1 就指“允許任意量通過”!LSTM 擁有三個門,來保護和控制細胞狀態(tài)。
逐步理解LSTM
在我們 LSTM 中的第一步是決定我們會從細胞狀態(tài)中丟棄什么信息。這個決定通過一個稱為忘記門層完成。該門會讀取h_{t-1}和 x_t,輸出一個在 0 到 1 之間的數(shù)值給每個在細胞狀態(tài) C_{t-1}中的數(shù)字。1 表示“完全保留”,0 表示“完全舍棄”。
讓我們回到語言模型的例子中來基于已經(jīng)看到的預(yù)測下一個詞。在這個問題中,細胞狀態(tài)可能包含當前主語的性別,因此正確的代詞可以被選擇出來。當我們看到新的主語,我們希望忘記舊的主語。

下一步是確定什么樣的新信息被存放在細胞狀態(tài)中。這里包含兩個部分。第一,sigmoid 層稱 “輸入門層” 決定什么值我們將要更新。然后,一個 tanh 層創(chuàng)建一個新的候選值向量,{C}_t,會被加入到狀態(tài)中。下一步,我們會講這兩個信息來產(chǎn)生對狀態(tài)的更新。在我們語言模型的例子中,我們希望增加新的主語的性別到細胞狀態(tài)中,來替代舊的需要忘記的主語。

現(xiàn)在是更新舊細胞狀態(tài)的時間了,C_{t-1}更新為 C_t。前面的步驟已經(jīng)決定了將會做什么,我們現(xiàn)在就是實際去完成。我們把舊狀態(tài)與 f_t相乘,丟棄掉我們確定需要丟棄的信息。接著加上i_t* {C}_t。這就是新的候選值,根據(jù)我們決定更新每個狀態(tài)的程度進行變化。在語言模型的例子中,這就是我們實際根據(jù)前面確定的目標,丟棄舊代詞的性別信息并添加新的信息的地方。

最終,我們需要確定輸出什么值。這個輸出將會基于我們的細胞狀態(tài),但是也是一個過濾后的版本。首先,我們運行一個 sigmoid 層來確定細胞狀態(tài)的哪個部分將輸出出去。接著,我們把細胞狀態(tài)通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)并將它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。在語言模型的例子中,因為他就看到了一個 代詞,可能需要輸出與一個 動詞 相關(guān)的信息。例如,可能輸出是否代詞是單數(shù)還是負數(shù),這樣如果是動詞的話,我們也知道動詞需要進行的詞形變化。

LSTM的變體
我們到目前為止都還在介紹正常的 LSTM。但是不是所有的 LSTM 都長成一個樣子的。實際上,幾乎所有包含 LSTM 的論文都采用了微小的變體。差異非常小,但是也值得拿出來講一下。其中一個流形的 LSTM 變體,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是說,我們讓 門層 也會接受細胞狀態(tài)的輸入。

上面的圖例中,我們增加了 peephole 到每個門上,但是許多論文會加入部分的 peephole 而非所有都加。
另一個變體是通過使用 coupled 忘記和輸入門。不同于之前是分開確定什么忘記和需要添加什么新的信息,這里是一同做出決定。我們僅僅會當我們將要輸入在當前位置時忘記。我們僅僅輸入新的值到那些我們已經(jīng)忘記舊的信息的那些狀態(tài) 。

另一個改動較大的變體是 Gated Recurrent Unit (GRU),這是由 Cho, et al. (2014) 提出。它將忘記門和輸入門合成了一個單一的 更新門。同樣還混合了細胞狀態(tài)和隱藏狀態(tài),和其他一些改動。最終的模型比標準的 LSTM 模型要簡單,也是非常流行的變體。

這里只是部分流行的 LSTM 變體。當然還有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。還有用一些完全不同的觀點來解決長期依賴的問題,如Koutnik, et al. (2014) 提出的 Clockwork RNN。要問哪個變體是最好的?其中的差異性真的重要嗎?Greff, et al. (2015) 給出了流行變體的比較,結(jié)論是他們基本上是一樣的。Jozefowicz, et al. (2015) 則在超過 1 萬種 RNN 架構(gòu)上進行了測試,發(fā)現(xiàn)一些架構(gòu)在某些任務(wù)上也取得了比 LSTM 更好的結(jié)果。

結(jié)論
剛開始,我提到通過 RNN 得到重要的結(jié)果。本質(zhì)上所有這些都可以使用 LSTM 完成。對于大多數(shù)任務(wù)確實展示了更好的性能!由于 LSTM 一般是通過一系列的方程表示的,使得 LSTM 有一點令人費解。然而本文中一步一步地解釋讓這種困惑消除了不少。LSTM 是我們在 RNN 中獲得的重要成功。很自然地,我們也會考慮:哪里會有更加重大的突破呢?在研究人員間普遍的觀點是:“Yes! 下一步已經(jīng)有了——那就是注意力!” 這個想法是讓 RNN 的每一步都從更加大的信息集中挑選信息。例如,如果你使用 RNN 來產(chǎn)生一個圖片的描述,可能會選擇圖片的一個部分,根據(jù)這部分信息來產(chǎn)生輸出的詞。實際上,Xu, et al.(2015)已經(jīng)這么做了——如果你希望深入探索注意力可能這就是一個有趣的起點!還有一些使用注意力的相當振奮人心的研究成果,看起來有更多的東西亟待探索……
注意力也不是 RNN 研究領(lǐng)域中唯一的發(fā)展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起來也是很有前途。使用生成模型的 RNN,諸如Gregor, et al.(2015) Chung, et al. (2015) 和 Bayer & Osendorfer (2015) 提出的模型同樣很有趣。在過去幾年中,RNN 的研究已經(jīng)相當?shù)娜?,而研究成果當然也會更加豐富!