『cs231n』RNN之理解LSTM網絡
概述
LSTM是RNN的增強版,1.RNN能完成的工作LSTM也都能勝任且有更好的效果;2.LSTM解決了RNN梯度消失或爆炸的問題,進而可以具有比RNN更為長時的記憶能力。LSTM網絡比較復雜,而恰好找到一篇不錯的介紹文章,和課程的講述範圍差不多,所以這裏摘下來(自己截圖記錄好麻煩),另外找到一篇推了公式的LSTM介紹,這個cs231n的課程並沒有涉及,我暫時也不做這方面的研究,不過感覺內容不錯,鏈接記下來以備不時之需。
本篇原文鏈接
RNN以及LSTM的介紹和公式梳理
按照老師的說法,LSTM和ResNet的殘差網絡有異曲同工之妙,
正文
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 更好的結果。
Jozefowicz等人論文截圖
結論
剛開始,我提到通過 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.
『cs231n』RNN之理解LSTM網絡