作者: Christopher Olah (OpenAI)
譯者:朱小虎 Xiaohu (Neil) Zhu(CSAGI / University AI)
原文鏈接:https://colah.github.io/posts/2015-08-Understanding-LSTMs/
術(shù)語(yǔ):循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, 簡(jiǎn)稱 RNN); 長(zhǎng)短期記憶(Long Short-Term Memory, 簡(jiǎn)稱 LSTM); 門限循環(huán)單元(Gated Recurrent Unit, 簡(jiǎn)稱 GRU)
循環(huán)神經(jīng)網(wǎng)絡(luò)
人類并不是每時(shí)每刻都從一片空白的大腦開(kāi)始他們的思考。在你閱讀這篇文章時(shí)候,你都是基于自己已經(jīng)擁有的對(duì)先前所見(jiàn)詞的理解來(lái)推斷當(dāng)前詞的真實(shí)含義。我們不會(huì)將所有的東西都全部丟棄,然后用空白的大腦進(jìn)行思考。我們的思想擁有持久性。
傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)并不能做到這點(diǎn),看起來(lái)也像是一種巨大的弊端。例如,假設(shè)你希望對(duì)電影中的每個(gè)時(shí)間點(diǎn)的時(shí)間類型進(jìn)行分類。傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)應(yīng)該很難來(lái)處理這個(gè)問(wèn)題——使用電影中先前的事件推斷后續(xù)的事件。
RNN 解決了這個(gè)問(wèn)題。RNN 是包含循環(huán)的網(wǎng)絡(luò),允許信息的持久化。
在上面的示例圖中,神經(jīng)網(wǎng)絡(luò)的模塊,,正在讀取某個(gè)輸入
,并輸出一個(gè)值
。循環(huán)可以使得信息可以從當(dāng)前步傳遞到下一步。
這些循環(huán)使得 RNN 看起來(lái)非常神秘。然而,如果你仔細(xì)想想,這樣也不比一個(gè)正常的神經(jīng)網(wǎng)絡(luò)難于理解。RNN 可以被看做是同一神經(jīng)網(wǎng)絡(luò)的多次復(fù)制,每個(gè)神經(jīng)網(wǎng)絡(luò)模塊會(huì)把消息傳遞給下一個(gè)。所以,如果我們將這個(gè)循環(huán)展開(kāi):
鏈?zhǔn)降奶卣鹘沂玖?RNN 本質(zhì)上是與序列和列表相關(guān)的。他們是對(duì)于這類數(shù)據(jù)的最自然的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
并且 RNN 也已經(jīng)被人們應(yīng)用了!在過(guò)去幾年中,應(yīng)用 RNN 在語(yǔ)音識(shí)別,語(yǔ)言建模,翻譯,圖片描述等問(wèn)題上已經(jīng)取得一定成功,并且這個(gè)列表還在增長(zhǎng)。我建議大家參考 Andrej Karpathy 的博客文章——The Unreasonable Effectiveness of Recurrent Neural Networks 來(lái)看看更豐富有趣的 RNN 的成功應(yīng)用。
而這些成功應(yīng)用的關(guān)鍵之處就是 LSTM 的使用,這是一種特別的 RNN,比標(biāo)準(zhǔn)的 RNN 在很多的任務(wù)上都表現(xiàn)得更好。幾乎所有的令人振奮的關(guān)于 RNN 的結(jié)果都是通過(guò) LSTM 達(dá)到的。這篇博文也會(huì)就 LSTM 進(jìn)行展開(kāi)。
長(zhǎng)期依賴(Long-Term Dependencies)問(wèn)題
RNN 的關(guān)鍵點(diǎn)之一就是他們可以用來(lái)連接先前的信息到當(dāng)前的任務(wù)上,例如使用過(guò)去的視頻段來(lái)推測(cè)對(duì)當(dāng)前段的理解。如果 RNN 可以做到這個(gè),他們就變得非常有用。但是真的可以么?答案是,還有很多依賴因素。
有時(shí)候,我們僅僅需要知道先前的信息來(lái)執(zhí)行當(dāng)前的任務(wù)。例如,我們有一個(gè)語(yǔ)言模型用來(lái)基于先前的詞來(lái)預(yù)測(cè)下一個(gè)詞。如果我們?cè)囍A(yù)測(cè) “the clouds are in the sky” 最后的詞,我們并不需要任何其他的上下文 —— 因此下一個(gè)詞很顯然就應(yīng)該是 sky。在這樣的場(chǎng)景中,相關(guān)的信息和預(yù)測(cè)的詞位置之間的間隔是非常小的,RNN 可以學(xué)會(huì)使用先前的信息。
但是同樣會(huì)有一些更加復(fù)雜的場(chǎng)景。假設(shè)我們?cè)囍ヮA(yù)測(cè)“I grew up in France... I speak fluent French”最后的詞。當(dāng)前的信息建議下一個(gè)詞可能是一種語(yǔ)言的名字,但是如果我們需要弄清楚是什么語(yǔ)言,我們是需要先前提到的離當(dāng)前位置很遠(yuǎn)的 France 的上下文的。這說(shuō)明相關(guān)信息和當(dāng)前預(yù)測(cè)位置之間的間隔就肯定變得相當(dāng)?shù)拇蟆?/p>
不幸的是,在這個(gè)間隔不斷增大時(shí),RNN 會(huì)喪失學(xué)習(xí)到連接如此遠(yuǎn)的信息的能力。
在理論上,RNN 絕對(duì)可以處理這樣的 長(zhǎng)期依賴 問(wèn)題。人們可以仔細(xì)挑選參數(shù)來(lái)解決這類問(wèn)題中的最初級(jí)形式,但在實(shí)踐中,RNN 肯定不能夠成功學(xué)習(xí)到這些知識(shí)。Bengio, et al. (1994)等人對(duì)該問(wèn)題進(jìn)行了深入的研究,他們發(fā)現(xiàn)一些使訓(xùn)練 RNN 變得非常困難的相當(dāng)根本的原因。
然而,幸運(yùn)的是,LSTM 并沒(méi)有這個(gè)問(wèn)題!
LSTM 網(wǎng)絡(luò)
Long Short Term 網(wǎng)絡(luò)—— 一般就叫做 LSTM ——是一種 RNN 特殊的類型,可以學(xué)習(xí)長(zhǎng)期依賴信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves進(jìn)行了改良和推廣。在很多問(wèn)題,LSTM 都取得相當(dāng)巨大的成功,并得到了廣泛的使用。
LSTM 通過(guò)刻意的設(shè)計(jì)來(lái)避免長(zhǎng)期依賴問(wèn)題。記住長(zhǎng)期的信息在實(shí)踐中是 LSTM 的默認(rèn)行為,而非需要付出很大代價(jià)才能獲得的能力!
所有 RNN 都具有一種重復(fù)神經(jīng)網(wǎng)絡(luò)模塊的鏈?zhǔn)降男问健T跇?biāo)準(zhǔn)的 RNN 中,這個(gè)重復(fù)的模塊只有一個(gè)非常簡(jiǎn)單的結(jié)構(gòu),例如一個(gè) tanh
層。
LSTM 同樣是這樣的結(jié)構(gòu),但是重復(fù)的模塊擁有一個(gè)不同的結(jié)構(gòu)。不同于 單一神經(jīng)網(wǎng)絡(luò)層,這里是有四個(gè),以一種非常特殊的方式進(jìn)行交互。
不必?fù)?dān)心這里的細(xì)節(jié)。我們會(huì)一步一步地剖析 LSTM 解析圖。現(xiàn)在,我們先來(lái)熟悉一下圖中使用的各種元素的圖標(biāo)。
在上面的圖例中,每一條黑線傳輸著一整個(gè)向量,從一個(gè)節(jié)點(diǎn)的輸出到其他節(jié)點(diǎn)的輸入。粉色的圈代表按位 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學(xué)習(xí)到的神經(jīng)網(wǎng)絡(luò)層。合在一起的線表示向量的連接,分開(kāi)的線表示內(nèi)容被復(fù)制,然后分發(fā)到不同的位置。
LSTM 的核心思想
LSTM 的關(guān)鍵就是細(xì)胞狀態(tài),水平線在圖上方貫穿運(yùn)行。
細(xì)胞狀態(tài)類似于傳送帶。直接在整個(gè)鏈上運(yùn)行,只有一些少量的線性交互。信息在上面流傳保持不變會(huì)很容易。
LSTM 有通過(guò)精心設(shè)計(jì)的稱作為“門”的結(jié)構(gòu)來(lái)去除或者增加信息到細(xì)胞狀態(tài)的能力。門是一種讓信息選擇式通過(guò)的方法。他們包含一個(gè) sigmoid
神經(jīng)網(wǎng)絡(luò)層和一個(gè)按位的乘法操作。
Sigmoid 層輸出 到
之間的數(shù)值,描述每個(gè)部分有多少量可以通過(guò)。
代表“不許任何量通過(guò)”,
就指“允許任意量通過(guò)”!
LSTM 擁有三個(gè)門,來(lái)保護(hù)和控制細(xì)胞狀態(tài)。
逐步理解 LSTM
在我們 LSTM 中的第一步是決定我們會(huì)從細(xì)胞狀態(tài)中丟棄什么信息。這個(gè)決定通過(guò)一個(gè)稱為忘記門層完成。該門會(huì)讀取 和
,輸出一個(gè)在
到
之間的數(shù)值給每個(gè)在細(xì)胞狀態(tài)
中的數(shù)字。
表示“完全保留”,
表示“完全舍棄”。
讓我們回到語(yǔ)言模型的例子中來(lái)基于已經(jīng)看到的預(yù)測(cè)下一個(gè)詞。在這個(gè)問(wèn)題中,細(xì)胞狀態(tài)可能包含當(dāng)前主語(yǔ)的性別,因此正確的代詞可以被選擇出來(lái)。當(dāng)我們看到新的主語(yǔ),我們希望忘記舊的主語(yǔ)。
下一步是確定什么樣的新信息被存放在細(xì)胞狀態(tài)中。這里包含兩個(gè)部分。第一,sigmoid
層稱 “輸入門層” 決定什么值我們將要更新。然后,一個(gè) tanh
層創(chuàng)建一個(gè)新的候選值向量,,會(huì)被加入到狀態(tài)中。下一步,我們會(huì)講這兩個(gè)信息來(lái)產(chǎn)生對(duì)狀態(tài)的更新。
在我們語(yǔ)言模型的例子中,我們希望增加新的主語(yǔ)的性別到細(xì)胞狀態(tài)中,來(lái)替代舊的需要忘記的主語(yǔ)。
現(xiàn)在是更新舊細(xì)胞狀態(tài)的時(shí)間了, 更新為
。前面的步驟已經(jīng)決定了將會(huì)做什么,我們現(xiàn)在就是實(shí)際去完成。
我們把舊狀態(tài)與 相乘,丟棄掉我們確定需要丟棄的信息。接著加上
。這就是新的候選值,根據(jù)我們決定更新每個(gè)狀態(tài)的程度進(jìn)行變化。
在語(yǔ)言模型的例子中,這就是我們實(shí)際根據(jù)前面確定的目標(biāo),丟棄舊代詞的性別信息并添加新的信息的地方。
最終,我們需要確定輸出什么值。這個(gè)輸出將會(huì)基于我們的細(xì)胞狀態(tài),但是也是一個(gè)過(guò)濾后的版本。首先,我們運(yùn)行一個(gè) sigmoid
層來(lái)確定細(xì)胞狀態(tài)的哪個(gè)部分將輸出出去。接著,我們把細(xì)胞狀態(tài)通過(guò) tanh
進(jìn)行處理(得到一個(gè)在 到
之間的值)并將它和
sigmoid
門的輸出相乘,最終我們僅僅會(huì)輸出我們確定輸出的那部分。
在語(yǔ)言模型的例子中,因?yàn)樗涂吹搅艘粋€(gè) 代詞,可能需要輸出與一個(gè) 動(dòng)詞 相關(guān)的信息。例如,可能輸出是否代詞是單數(shù)還是負(fù)數(shù),這樣如果是動(dòng)詞的話,我們也知道動(dòng)詞需要進(jìn)行的詞形變化。
LSTM 的變體
我們到目前為止都還在介紹正常的 LSTM。但是不是所有的 LSTM 都長(zhǎng)成一個(gè)樣子的。實(shí)際上,幾乎所有包含 LSTM 的論文都采用了微小的變體。差異非常小,但是也值得拿出來(lái)講一下。
其中一個(gè)流形的 LSTM 變體,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是說(shuō),我們讓 門層 也會(huì)接受細(xì)胞狀態(tài)的輸入。
上面的圖例中,我們?cè)黾恿?peephole 到每個(gè)門上,但是許多論文會(huì)加入部分的 peephole 而非所有都加。
另一個(gè)變體是通過(guò)使用 coupled 忘記和輸入門。不同于之前是分開(kāi)確定什么忘記和需要添加什么新的信息,這里是一同做出決定。我們僅僅會(huì)當(dāng)我們將要輸入在當(dāng)前位置時(shí)忘記。我們僅僅輸入新的值到那些我們已經(jīng)忘記舊的信息的那些狀態(tài) 。
另一個(gè)改動(dòng)較大的變體是 Gated Recurrent Unit (GRU),這是由 Cho, et al. (2014) 提出。它將忘記門和輸入門合成了一個(gè)單一的 更新門。同樣還混合了細(xì)胞狀態(tài)和隱藏狀態(tài),和其他一些改動(dòng)。最終的模型比標(biāo)準(zhǔn)的 LSTM 模型要簡(jiǎn)單,也是非常流行的變體。
這里只是部分流行的 LSTM 變體。當(dāng)然還有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。還有用一些完全不同的觀點(diǎn)來(lái)解決長(zhǎng)期依賴的問(wèn)題,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
要問(wèn)哪個(gè)變體是最好的?其中的差異性真的重要嗎?Greff, et al. (2015) 給出了流行變體的比較,結(jié)論是他們基本上是一樣的。Jozefowicz, et al. (2015) 則在超過(guò) 1 萬(wàn)種 RNN 架構(gòu)上進(jìn)行了測(cè)試,發(fā)現(xiàn)一些架構(gòu)在某些任務(wù)上也取得了比 LSTM 更好的結(jié)果。
結(jié)論
剛開(kāi)始,我提到通過(guò) RNN 得到重要的結(jié)果。本質(zhì)上所有這些都可以使用 LSTM 完成。對(duì)于大多數(shù)任務(wù)確實(shí)展示了更好的性能!
由于 LSTM 一般是通過(guò)一系列的方程表示的,使得 LSTM 有一點(diǎn)令人費(fèi)解。然而本文中一步一步地解釋讓這種困惑消除了不少。
LSTM 是我們?cè)?RNN 中獲得的重要成功。很自然地,我們也會(huì)考慮:哪里會(huì)有更加重大的突破呢?在研究人員間普遍的觀點(diǎn)是:“Yes! 下一步已經(jīng)有了——那就是注意力!” 這個(gè)想法是讓 RNN 的每一步都從更加大的信息集中挑選信息。例如,如果你使用 RNN 來(lái)產(chǎn)生一個(gè)圖片的描述,可能會(huì)選擇圖片的一個(gè)部分,根據(jù)這部分信息來(lái)產(chǎn)生輸出的詞。實(shí)際上,Xu, et al.(2015)已經(jīng)這么做了——如果你希望深入探索注意力可能這就是一個(gè)有趣的起點(diǎn)!還有一些使用注意力的相當(dāng)振奮人心的研究成果,看起來(lái)有更多的東西亟待探索……
注意力也不是 RNN 研究領(lǐng)域中唯一的發(fā)展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起來(lái)也是很有前途。使用生成模型的 RNN,諸如Gregor, et al. (2015) Chung, et al. (2015) 和 Bayer & Osendorfer (2015) 提出的模型同樣很有趣。在過(guò)去幾年中,RNN 的研究已經(jīng)相當(dāng)?shù)娜迹芯砍晒?dāng)然也會(huì)更加豐富!
致謝
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.