轉自<a href="http://www.jianshu.com/p/9dc9f41f0b29">http://www.jianshu.com/p/9dc9f41f0b29</a></p> |
|
<p>常常接觸LSTM,GRU,RNN這些模型,對於LSTM的印象只是知道它用來解決梯度消失梯度爆炸問題,對於長距離的句子的學習效果很差的問題,並且大概知道里面是加了一些參數,加了門單元來選擇忘記和記住一些信息。可是具體公式沒有推過,因此理解的不夠深。</p> |
|
<p>可是上面這篇長博文,做者真心花了不少心血來創做,寫的詳細,易懂,對於學習lstm有很大的幫助。</p> |
|
<p>讀完後我以爲要理解幾個門的做用,文中做者提到的三個例子恰到好處。我的認爲這三個例子是弄明白lstm的關鍵。</p> |
|
<p>忘記門: <br /> |
|
做用對象:細胞狀態 <br /> |
|
做用:將細胞狀態中的信息選擇性的遺忘 <br /> |
|
讓咱們回到語言模型的例子中來基於已經看到的預測下一個詞。在這個問題中,細胞狀態可能包含當前主語的類別,所以正確的代詞能夠被選擇出來。當咱們看到新的主語,咱們但願忘記舊的主語。 |
|
<br /> |
|
例如,他今天有事,因此我。。。當處理到‘’我‘’的時候選擇性的忘記前面的’他’,或者說減少這個詞對後面詞的做用。</p> |
|
<p>輸入層門: <br /> |
|
做用對象:細胞狀態 <br /> |
|
做用:將新的信息選擇性的記錄到細胞狀態中 <br /> |
|
在咱們語言模型的例子中,咱們但願增長新的主語的類別到細胞狀態中,來替代舊的須要忘記的主語。 <br /> |
|
例如:他今天有事,因此我。。。。當處理到‘’我‘’這個詞的時候,就會把主語我更新到細胞中去。</p> |
|
<p>輸出層門: <br /> |
|
做用對象:隱層ht <br /> |
|
在語言模型的例子中,由於他就看到了一個 代詞,可能須要輸出與一個 動詞 相關的信息。例如,可能輸出是否代詞是單數仍是負數,這樣若是是動詞的話,咱們也知道動詞須要進行的詞形變化。 |
|
<br /> |
|
例如:上面的例子,當處理到‘’我‘’這個詞的時候,能夠預測下一個詞,是動詞的可能性較大,並且是第一人稱。 <br /> |
|
會把前面的信息保存到隱層中去。</p> |
|
<p>Gated Recurrent Unit (GRU)就是lstm的一個變態,這是由 Cho, et al. (2014) 提出。<strong><em>它將忘記門和輸入門合成了一個單一的 更新門。一樣還混合了細胞狀態和隱藏狀態</em></strong>,和其餘一些改動。最終的模型比標準的 LSTM 模型要簡單,也是很是流行的變體。</p> |
|
<p>以上的觀點純屬我的經過學習這篇博文後的一些理解,有錯誤的地方請你們見諒。</p> |
|
</div> |
|
<p></p> |
|
<p><br /></p> |
|
<p></p> |
|
<h1 class="title">[譯] 理解 LSTM 網絡</h1> |
|
<div class="show-content"> |
|
<p>本文譯自 <a href="http://colah.github.io/posts/2015-08-Understanding-LSTMs/"> |
|
Christopher Olah 的博文</a></p> |
|
<h1>Recurrent Neural Networks</h1> |
|
<p>人類並非每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候,你都是基於本身已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。咱們不會將全部的東西都所有丟棄,而後用空白的大腦進行思考。咱們的思想擁有持久性。<br /> |
|
傳統的神經網絡並不能作到這點,看起來也像是一種巨大的弊端。例如,假設你但願對電影中的每一個時間點的時間類型進行分類。傳統的神經網絡應該很難來處理這個問題——使用電影中先前的事件推斷後續的事件。<br /> |
|
RNN 解決了這個問題。RNN 是包含循環的網絡,容許信息的持久化。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-f16c8acc01d2d469.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">RNN 包含循環</div> |
|
</div> |
|
<p>在上面的示例圖中,神經網絡的模塊,A,正在讀取某個輸入 x_i,並輸出一個值 h_i。循環可使得信息能夠從當前步傳遞到下一步。<br /> |
|
這些循環使得 RNN 看起來很是神祕。然而,若是你仔細想一想,這樣也不比一個正常的神經網絡難於理解。RNN 能夠被看作是同一神經網絡的屢次複製,每一個神經網絡模塊會把消息傳遞給下一個。因此,若是咱們將這個循環展開:</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-d6749df8fb93b0b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">展開的 RNN</div> |
|
</div> |
|
<p><br /> |
|
鏈式的特徵揭示了 RNN 本質上是與序列和列表相關的。他們是對於這類數據的最天然的神經網絡架構。<br /> |
|
而且 RNN 也已經被人們應用了!在過去幾年中,應用 RNN 在語音識別,語言建模,翻譯,圖片描述等問題上已經取得必定成功,而且這個列表還在增加。我建議你們參考 Andrej Karpathy 的博客文章——<a href="http://karpathy.github.io/2015/05/21/rnn-effectiveness/">The Unreasonable Effectiveness of Recurrent Neural Networks</a> |
|
來看看更豐富有趣的 RNN 的成功應用。<br /> |
|
而這些成功應用的關鍵之處就是 LSTM 的使用,這是一種特別的 RNN,比標準的 RNN 在不少的任務上都表現得更好。幾乎全部的使人振奮的關於 RNN 的結果都是經過 LSTM 達到的。這篇博文也會就 LSTM 進行展開。</p> |
|
<h1>長期依賴(Long-Term Dependencies)問題</h1> |
|
<p>RNN 的關鍵點之一就是他們能夠用來鏈接先前的信息到當前的任務上,例如使用過去的視頻段來推測對當前段的理解。若是 RNN 能夠作到這個,他們就變得很是有用。可是真的能夠麼?答案是,還有不少依賴因素。<br /> |
|
有時候,咱們僅僅須要知道先前的信息來執行當前的任務。例如,咱們有一個語言模型用來基於先前的詞來預測下一個詞。若是咱們試着預測 「the clouds are in the sky」 最後的詞,咱們並不須要任何其餘的上下文 —— 所以下一個詞很顯然就應該是 sky。在這樣的場景中,相關的信息和預測的詞位置之間的間隔是很是小的,RNN 能夠學會使用先前的信息。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-feb16ca499c4b96a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">不太長的相關信息和位置間隔</div> |
|
</div> |
|
<p>可是一樣會有一些更加複雜的場景。假設咱們試着去預測「I grew up in France... I speak fluent French」最後的詞。當前的信息建議下一個詞多是一種語言的名字,可是若是咱們須要弄清楚是什麼語言,咱們是須要先前提到的離當前位置很遠的 France 的上下文的。這說明相關信息和當前預測位置之間的間隔就確定變得至關的大。<br /> |
|
不幸的是,在這個間隔不斷增大時,RNN 會喪失學習到鏈接如此遠的信息的能力。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-becb05d96b1e4af7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">至關長的相關信息和位置間隔</div> |
|
</div> |
|
<p>在理論上,RNN 絕對能夠處理這樣的 長期依賴 問題。人們能夠仔細挑選參數來解決這類問題中的最初級形式,但在實踐中,RNN 確定不可以成功學習到這些知識。<a href="http://www-dsi.ing.unifi.it/~paolo/ps/tnn-94-gradient.pdf">Bengio, et al. (1994)</a>等人對該問題進行了深刻的研究,他們發現一些使訓練 RNN 變得很是困難的至關根本的緣由。<br /> |
|
然而,幸運的是,LSTM 並無這個問題!</p> |
|
<h1>LSTM 網絡</h1> |
|
<p>Long Short Term 網絡—— 通常就叫作 LSTM ——是一種 RNN 特殊的類型,能夠學習長期依賴信息。LSTM 由<a href="http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf">Hochreiter & Schmidhuber (1997)</a>提出,並在近期被<a href="https://scholar.google.com/citations?user=DaFHynwAAAAJ&hl=en">Alex |
|
Graves</a>進行了改良和推廣。在不少問題,LSTM 都取得至關巨大的成功,並獲得了普遍的使用。<br /> |
|
LSTM 經過刻意的設計來避免長期依賴問題。記住長期的信息在實踐中是 LSTM 的默認行爲,而非須要付出很大代價才能得到的能力!<br /> |
|
全部 RNN 都具備一種重複神經網絡模塊的鏈式的形式。在標準的 RNN 中,這個重複的模塊只有一個很是簡單的結構,例如一個 tanh 層。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-9ac355076444b66f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">標準 RNN 中的重複模塊包含單一的層</div> |
|
</div> |
|
<p><br /> |
|
LSTM 一樣是這樣的結構,可是重複的模塊擁有一個不一樣的結構。不一樣於 單一神經網絡層,這裏是有四個,以一種很是特殊的方式進行交互。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-b9a16a53d58ca2b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">LSTM 中的重複模塊包含四個交互的層</div> |
|
</div> |
|
<p><br /> |
|
沒必要擔憂這裏的細節。咱們會一步一步地剖析 LSTM 解析圖。如今,咱們先來熟悉一下圖中使用的各類元素的圖標。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-ea943b818b8e18d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">LSTM 中的圖標</div> |
|
</div> |
|
<p><br /> |
|
在上面的圖例中,每一條黑線傳輸着一整個向量,從一個節點的輸出到其餘節點的輸入。粉色的圈表明 pointwise 的操做,諸如向量的和,而黃色的矩陣就是學習到的神經網絡層。合在一塊兒的線表示向量的鏈接,分開的線表示內容被複制,而後分發到不一樣的位置。</p> |
|
<h1>LSTM 的核心思想</h1> |
|
<p>LSTM 的關鍵就是細胞狀態,水平線在圖上方貫穿運行。<br /> |
|
細胞狀態相似於傳送帶。直接在整個鏈上運行,只有一些少許的線性交互。信息在上面流傳保持不變會很容易。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-ac1eb618f37a9dea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">Paste_Image.png</div> |
|
</div> |
|
<p>LSTM 有經過精心設計的稱做爲「門」的結構來去除或者增長信息到細胞狀態的能力。門是一種讓信息選擇式經過的方法。他們包含一個 sigmoid 神經網絡層和一個 pointwise 乘法操做。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-7169541c790efd13.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">Paste_Image.png</div> |
|
</div> |
|
<p><br /> |
|
Sigmoid 層輸出 0 到 1 之間的數值,描述每一個部分有多少許能夠經過。0 表明「不準任何量經過」,1 就指「容許任意量經過」!</p> |
|
<p>LSTM 擁有三個門,來保護和控制細胞狀態。</p> |
|
<h1>逐步理解 LSTM</h1> |
|
<p>在咱們 LSTM 中的第一步是決定咱們會從細胞狀態中丟棄什麼信息。這個決定經過一個稱爲<strong>忘記門層</strong>完成。該門會讀取 <code> |
|
h_{t-1}</code> 和 <code>x_t</code>,輸出一個在 0 到 1 之間的數值給每一個在細胞狀態 <code>C_{t-1}</code> 中的數字。1 表示「徹底保留」,0 表示「徹底捨棄」。<br /> |
|
讓咱們回到語言模型的例子中來基於已經看到的預測下一個詞。在這個問題中,細胞狀態可能包含當前<strong>主語</strong>的性別,所以正確的<strong>代詞</strong>能夠被選擇出來。當咱們看到新的<strong>主語</strong>,咱們但願忘記舊的<strong>主語</strong>。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-96b387f711d1d12c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">決定丟棄信息</div> |
|
</div> |
|
<p><br /> |
|
下一步是肯定什麼樣的新信息被存放在細胞狀態中。這裏包含兩個部分。第一,sigmoid 層稱 「輸入門層」 決定什麼值咱們將要更新。而後,一個 tanh 層建立一個新的候選值向量,<code>\tilde{C}_t</code>,會被加入到狀態中。下一步,咱們會講這兩個信息來產生對狀態的更新。<br /> |
|
在咱們語言模型的例子中,咱們但願增長新的主語的性別到細胞狀態中,來替代舊的須要忘記的主語。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-7fa07e640593f930.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">肯定更新的信息</div> |
|
</div> |
|
<p>如今是更新舊細胞狀態的時間了,<code>C_{t-1}</code> 更新爲 <code>C_t</code>。前面的步驟已經決定了將會作什麼,咱們如今就是實際去完成。<br /> |
|
咱們把舊狀態與 <code>f_t</code> 相乘,丟棄掉咱們肯定須要丟棄的信息。接着加上 <code>i_t * \tilde{C}_t</code>。這就是新的候選值,根據咱們決定更新每一個狀態的程度進行變化。<br /> |
|
在語言模型的例子中,這就是咱們實際根據前面肯定的目標,丟棄舊代詞的性別信息並添加新的信息的地方。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-d88caa3c4faf5353.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">更新細胞狀態</div> |
|
</div> |
|
<p>最終,咱們須要肯定輸出什麼值。這個輸出將會基於咱們的細胞狀態,可是也是一個過濾後的版本。首先,咱們運行一個 sigmoid 層來肯定細胞狀態的哪一個部分將輸出出去。接着,咱們把細胞狀態經過 tanh 進行處理(獲得一個在 -1 到 1 之間的值)並將它和 sigmoid 門的輸出相乘,最終咱們僅僅會輸出咱們肯定輸出的那部分。<br /> |
|
在語言模型的例子中,由於他就看到了一個 <strong>代詞</strong>,可能須要輸出與一個 <strong>動詞</strong> 相關的信息。例如,可能輸出是否代詞是單數仍是負數,這樣若是是動詞的話,咱們也知道動詞須要進行的詞形變化。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-4c9186bf786063d6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">輸出信息</div> |
|
</div> |
|
<h1>LSTM 的變體</h1> |
|
<p>咱們到目前爲止都還在介紹正常的 LSTM。可是不是全部的 LSTM 都長成一個樣子的。實際上,幾乎全部包含 LSTM 的論文都採用了微小的變體。差別很是小,可是也值得拿出來說一下。<br /> |
|
其中一個流形的 LSTM 變體,就是由 <a href="ftp://ftp.idsia.ch/pub/juergen/TimeCount-IJCNN2000.pdf"> |
|
Gers & Schmidhuber (2000)</a> 提出的,增長了 「peephole connection」。是說,咱們讓 門層 也會接受細胞狀態的輸入。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-0f80ad5540ea27f9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">peephole 鏈接</div> |
|
</div> |
|
<p>上面的圖例中,咱們增長了 peephole 到每一個門上,可是許多論文會加入部分的 peephole 而非全部都加。</p> |
|
<p>另外一個變體是經過使用 coupled 忘記和輸入門。不一樣於以前是分開肯定什麼忘記和須要添加什麼新的信息,這裏是一同作出決定。咱們僅僅會當咱們將要輸入在當前位置時忘記。咱們僅僅輸入新的值到那些咱們已經忘記舊的信息的那些狀態 。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-bd2f1feaea22630e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">coupled 忘記門和輸入門</div> |
|
</div> |
|
<p><br /> |
|
另外一個改動較大的變體是 Gated Recurrent Unit (GRU),這是由 <a href="http://arxiv.org/pdf/1406.1078v3.pdf"> |
|
Cho, et al. (2014)</a> 提出。它將忘記門和輸入門合成了一個單一的 更新門。一樣還混合了細胞狀態和隱藏狀態,和其餘一些改動。最終的模型比標準的 LSTM 模型要簡單,也是很是流行的變體。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-dd3d241fa44a71c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">GRU</div> |
|
</div> |
|
<p><br /> |
|
這裏只是部分流行的 LSTM 變體。固然還有不少其餘的,如<a href="http://arxiv.org/pdf/1508.03790v2.pdf">Yao, et al. (2015)</a> 提出的 Depth Gated RNN。還有用一些徹底不一樣的觀點來解決長期依賴的問題,如<a href="http://arxiv.org/pdf/1402.3511v1.pdf">Koutnik, |
|
et al. (2014)</a> 提出的 Clockwork RNN。<br /> |
|
要問哪一個變體是最好的?其中的差別性真的重要嗎?<a href="http://arxiv.org/pdf/1503.04069.pdf">Greff, et al. (2015)</a> 給出了流行變體的比較,結論是他們基本上是同樣的。<a href="http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf">Jozefowicz, |
|
et al. (2015)</a> 則在超過 1 萬種 RNN 架構上進行了測試,發現一些架構在某些任務上也取得了比 LSTM 更好的結果。</p> |
|
<div class="image-package"><img src="http://upload-images.jianshu.io/upload_images/42741-acd4c079d94803d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="" /><br /><div class="image-caption">Jozefowicz等人論文截圖</div> |
|
</div> |
|
<h1>結論</h1> |
|
<p>剛開始,我提到經過 RNN 獲得重要的結果。本質上全部這些均可以使用 LSTM 完成。對於大多數任務確實展現了更好的性能!<br /> |
|
因爲 LSTM 通常是經過一系列的方程表示的,使得 LSTM 有一點使人費解。然而本文中一步一步地解釋讓這種困惑消除了很多。<br /> |
|
LSTM 是咱們在 RNN 中得到的重要成功。很天然地,咱們也會考慮:哪裏會有更加劇大的突破呢?在研究人員間廣泛的觀點是:「Yes! 下一步已經有了——那就是<strong>注意力</strong>!」 這個想法是讓 RNN 的每一步都從更加大的信息集中挑選信息。例如,若是你使用 RNN 來產生一個圖片的描述,可能會選擇圖片的一個部分,根據這部分信息來產生輸出的詞。實際上,<a href="http://arxiv.org/pdf/1502.03044v2.pdf">Xu, |
|
<em>et al.</em>(2015)</a>已經這麼作了——若是你但願深刻探索<strong>注意力</strong>可能這就是一個有趣的起點!還有一些使用注意力的至關振奮人心的研究成果,看起來有更多的東西亟待探索……<br /> |
|
注意力也不是 RNN 研究領域中惟一的發展方向。例如,<a href="http://arxiv.org/pdf/1507.01526v1.pdf">Kalchbrenner, |
|
<em>et al.</em> (2015)</a> 提出的 Grid LSTM 看起來也是頗有前途。使用生成模型的 RNN,諸如<a href="http://arxiv.org/pdf/1502.04623.pdf">Gregor, |
|
<em>et al.</em> (2015)</a> <a href="http://arxiv.org/pdf/1506.02216v3.pdf"> |
|
Chung, <em>et al.</em> (2015)</a> 和 <a href="http://arxiv.org/pdf/1411.7610v3.pdf"> |
|
Bayer & Osendorfer (2015)</a> 提出的模型一樣頗有趣。在過去幾年中,RNN 的研究已經至關的燃,而研究成果固然也會更加豐富!</p> |