1. 程式人生 > >關於lstm和gru的一些簡單資料,講得比較容易理解

關於lstm和gru的一些簡單資料,講得比較容易理解

Recurrent Neural Networks

人類並不是每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候,你都是基於自己已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。我們不會將所有的東西都全部丟棄,然後用空白的大腦進行思考。我們的思想擁有永續性。
傳統的神經網路並不能做到這點,看起來也像是一種巨大的弊端。例如,假設你希望對電影中的每個時間點的時間型別進行分類。傳統的神經網路應該很難來處理這個問題——使用電影中先前的事件推斷後續的事件。
RNN 解決了這個問題。RNN 是包含迴圈的網路,允許資訊的持久化。


RNN 包含迴圈

在上面的示例圖中,神經網路的模組,A,正在讀取某個輸入 x_i,並輸出一個值 h_i。迴圈可以使得資訊可以從當前步傳遞到下一步。
這些迴圈使得 RNN 看起來非常神祕。然而,如果你仔細想想,這樣也不比一個正常的神經網路難於理解。RNN 可以被看做是同一神經網路的多次複製,每個神經網路模組會把訊息傳遞給下一個。所以,如果我們將這個迴圈展開:


展開的 RNN


鏈式的特徵揭示了 RNN 本質上是與序列和列表相關的。他們是對於這類資料的最自然的神經網路架構。
並且 RNN 也已經被人們應用了!在過去幾年中,應用 RNN 在語音識別,語言建模,翻譯,圖片描述等問題上已經取得一定成功,並且這個列表還在增長。我建議大家參考 Andrej Karpathy 的部落格文章——The Unreasonable Effectiveness of Recurrent Neural Networks 來看看更豐富有趣的 RNN 的成功應用。
而這些成功應用的關鍵之處就是 LSTM 的使用,這是一種特別的 RNN,比標準的 RNN 在很多的任務上都表現得更好。幾乎所有的令人振奮的關於 RNN 的結果都是通過 LSTM 達到的。這篇博文也會就 LSTM 進行展開。

長期依賴(Long-Term Dependencies)問題

RNN 的關鍵點之一就是他們可以用來連線先前的資訊到當前的任務上,例如使用過去的視訊段來推測對當前段的理解。如果 RNN 可以做到這個,他們就變得非常有用。但是真的可以麼?答案是,還有很多依賴因素。
有時候,我們僅僅需要知道先前的資訊來執行當前的任務。例如,我們有一個語言模型用來基於先前的詞來預測下一個詞。如果我們試著預測 “the clouds are in the sky” 最後的詞,我們並不需要任何其他的上下文 —— 因此下一個詞很顯然就應該是 sky。在這樣的場景中,相關的資訊和預測的詞位置之間的間隔是非常小的,RNN 可以學會使用先前的資訊。


不太長的相關資訊和位置間隔

但是同樣會有一些更加複雜的場景。假設我們試著去預測“I grew up in France... I speak fluent French”最後的詞。當前的資訊建議下一個詞可能是一種語言的名字,但是如果我們需要弄清楚是什麼語言,我們是需要先前提到的離當前位置很遠的 France 的上下文的。這說明相關資訊和當前預測位置之間的間隔就肯定變得相當的大。
不幸的是,在這個間隔不斷增大時,RNN 會喪失學習到連線如此遠的資訊的能力。


相當長的相關資訊和位置間隔

在理論上,RNN 絕對可以處理這樣的 長期依賴 問題。人們可以仔細挑選引數來解決這類問題中的最初級形式,但在實踐中,RNN 肯定不能夠成功學習到這些知識。Bengio, et al. (1994)等人對該問題進行了深入的研究,他們發現一些使訓練 RNN 變得非常困難的相當根本的原因。
然而,幸運的是,LSTM 並沒有這個問題!

LSTM 網路

Long Short Term 網路—— 一般就叫做 LSTM ——是一種 RNN 特殊的型別,可以學習長期依賴資訊。LSTM 由Hochreiter & Schmidhuber (1997)提出,並在近期被Alex Graves進行了改良和推廣。在很多問題,LSTM 都取得相當巨大的成功,並得到了廣泛的使用。
LSTM 通過刻意的設計來避免長期依賴問題。記住長期的資訊在實踐中是 LSTM 的預設行為,而非需要付出很大代價才能獲得的能力!
所有 RNN 都具有一種重複神經網路模組的鏈式的形式。在標準的 RNN 中,這個重複的模組只有一個非常簡單的結構,例如一個 tanh 層。


標準 RNN 中的重複模組包含單一的層


LSTM 同樣是這樣的結構,但是重複的模組擁有一個不同的結構。不同於 單一神經網路層,這裡是有四個,以一種非常特殊的方式進行互動。


LSTM 中的重複模組包含四個互動的層


不必擔心這裡的細節。我們會一步一步地剖析 LSTM 解析圖。現在,我們先來熟悉一下圖中使用的各種元素的圖示。


LSTM 中的圖示


在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。粉色的圈代表 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學習到的神經網路層。合在一起的線表示向量的連線,分開的線表示內容被複制,然後分發到不同的位置。

LSTM 的核心思想

LSTM 的關鍵就是細胞狀態,水平線在圖上方貫穿執行。
細胞狀態類似於傳送帶。直接在整個鏈上執行,只有一些少量的線性互動。資訊在上面流傳保持不變會很容易。


Paste_Image.png

LSTM 有通過精心設計的稱作為“門”的結構來去除或者增加資訊到細胞狀態的能力。門是一種讓資訊選擇式通過的方法。他們包含一個 sigmoid 神經網路層和一個 pointwise 乘法操作。


Paste_Image.png


Sigmoid 層輸出 0 到 1 之間的數值,描述每個部分有多少量可以通過。0 代表“不許任何量通過”,1 就指“允許任意量通過”!

LSTM 擁有三個門,來保護和控制細胞狀態。

逐步理解 LSTM

在我們 LSTM 中的第一步是決定我們會從細胞狀態中丟棄什麼資訊。這個決定通過一個稱為忘記門層完成。該門會讀取 h_{t-1}x_t,輸出一個在 0 到 1 之間的數值給每個在細胞狀態 C_{t-1} 中的數字。1 表示“完全保留”,0 表示“完全捨棄”。
讓我們回到語言模型的例子中來基於已經看到的預測下一個詞。在這個問題中,細胞狀態可能包含當前主語的類別,因此正確的代詞可以被選擇出來。當我們看到新的主語,我們希望忘記舊的主語


決定丟棄資訊


下一步是確定什麼樣的新資訊被存放在細胞狀態中。這裡包含兩個部分。第一,sigmoid 層稱 “輸入門層” 決定什麼值我們將要更新。然後,一個 tanh 層建立一個新的候選值向量,\tilde{C}_t,會被加入到狀態中。下一步,我們會講這兩個資訊來產生對狀態的更新。
在我們語言模型的例子中,我們希望增加新的主語的類別到細胞狀態中,來替代舊的需要忘記的主語。


確定更新的資訊

現在是更新舊細胞狀態的時間了,C_{t-1} 更新為 C_t。前面的步驟已經決定了將會做什麼,我們現在就是實際去完成。
我們把舊狀態與 f_t 相乘,丟棄掉我們確定需要丟棄的資訊。接著加上 i_t * \tilde{C}_t。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。
在語言模型的例子中,這就是我們實際根據前面確定的目標,丟棄舊代詞的類別資訊並新增新的資訊的地方。


更新細胞狀態

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


輸出資訊

LSTM 的變體

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


peephole 連線

上面的圖例中,我們增加了 peephole 到每個門上,但是許多論文會加入部分的 peephole 而非所有都加。

另一個變體是通過使用 coupled 忘記和輸入門。不同於之前是分開確定什麼忘記和需要新增什麼新的資訊,這裡是一同做出決定。我們僅僅會當我們將要輸入在當前位置時忘記。我們僅僅輸入新的值到那些我們已經忘記舊的資訊的那些狀態 。


coupled 忘記門和輸入門


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


GRU


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

結論

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

致謝

I’m grateful to a number of people for helping me better understand LSTMs, commenting on the visualizations, and providing feedback on this post.
I’m very grateful to my colleagues at Google for their helpful feedback, especially Oriol Vinyals,Greg Corrado, Jon Shlens, Luke Vilnis, and Ilya Sutskever. I’m also thankful to many other friends and colleagues for taking the time to help me, including Dario Amodei, and Jacob Steinhardt. I’m especially thankful to Kyunghyun Cho for extremely thoughtful correspondence about my diagrams.
Before this post, I practiced explaining LSTMs during two seminar series I taught on neural networks. Thanks to everyone who participated in those for their patience with me, and for their feedback.