天天看點

LSTM

人類并不是每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候,你都是基于自己已經擁有的對先前所見詞的了解來推斷目前詞的真實含義。我們不會将所有的東西都全部丢棄,然後用空白的大腦進行思考。我們的思想擁有持久性。 

傳統的神經網絡并不能做到這點,看起來也像是一種巨大的弊端。例如,假設你希望對電影中的每個時間點的時間類型進行分類。傳統的神經網絡應該很難來處理這個問題——使用電影中先前的事件推斷後續的事件。 

RNN 解決了這個問題。RNN 是包含循環的網絡,允許資訊的持久化。

LSTM

RNN 包含循環

在上面的示例圖中,神經網絡的子產品,A,正在讀取某個輸入 x_i,并輸出一個值 h_i。循環可以使得資訊可以從目前步傳遞到下一步。這些循環使得 RNN 看起來非常神秘。然而,如果你仔細想想,這樣也不比一個正常的神經網絡難于了解。RNN 可以被看做是同一神經網絡的多次指派,每個神經網絡子產品會把消息傳遞給下一個。是以,如果我們将這個循環展開:

LSTM

展開的 RNN

鍊式的特征揭示了 RNN 本質上是與序列和清單相關的。他們是對于這類資料的最自然的神經網絡架構。

而這些成功應用的關鍵之處就是 LSTM 的使用,這是一種特别的 RNN,比标準的 RNN 在很多的任務上都表現得更好。幾乎所有的令人振奮的關于 RNN 的結果都是通過 LSTM 達到的。這篇博文也會就 LSTM 進行展開。

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

LSTM

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

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

LSTM

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

然而,幸運的是,LSTM 并沒有這個問題!

LSTM 通過刻意的設計來避免長期依賴問題。記住長期的資訊在實踐中是 LSTM 的預設行為,而非需要付出很大代價才能獲得的能力!

所有 RNN 都具有一種重複神經網絡子產品的鍊式的形式。在标準的 RNN 中,這個重複的子產品隻有一個非常簡單的結構,例如一個 tanh 層。

LSTM

标準 RNN 中的重複子產品包含單一的層

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

LSTM

LSTM 中的重複子產品包含四個互動的層

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

LSTM

LSTM 中的圖示

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

LSTM 的關鍵就是細胞狀态,水準線在圖上方貫穿運作。細胞狀态類似于傳送帶。直接在整個鍊上運作,隻有一些少量的線性互動。資訊在上面流傳保持不變會很容易。 

LSTM

Paste_Image.png

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

LSTM

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

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

在我們 LSTM 中的第一步是決定我們會從細胞狀态中丢棄什麼資訊。這個決定通過一個稱為 忘記門層 完成。該門會讀取h_{t-1}和x_t,輸出一個在 0 到 1 之間的數值給每個在細胞狀态C_{t-1}中的數字。1 表示“完全保留”,0 表示“完全舍棄”。

讓我們回到語言模型的例子中來基于已經看到的預測下一個詞。在這個問題中,細胞狀态可能包含目前 主語 的類别,是以正确的 代詞 可以被選擇出來。當我們看到新的 代詞 ,我們希望忘記舊的 代詞 。

LSTM

決定丢棄資訊

下一步是确定什麼樣的新資訊被存放在細胞狀态中。這裡包含兩個部分。第一,sigmoid 層稱 “輸入門層” 決定什麼值我們将要更新。然後,一個 tanh 層建立一個新的候選值向量,\tilde{C}_t,會被加入到狀态中。下一步,我們會講這兩個資訊來産生對狀态的更新。

在我們語言模型的例子中,我們希望增加新的代詞的類别到細胞狀态中,來替代舊的需要忘記的代詞。

LSTM

确定更新的資訊

現在是更新舊細胞狀态的時間了,C_{t-1}更新為C_t。前面的步驟已經決定了将會做什麼,我們現在就是實際去完成。

我們把舊狀态與f_t相乘,丢棄掉我們确定需要丢棄的資訊。接着加上i_t * \tilde{C}_t。這就是新的候選值,根據我們決定更新每個狀态的程度進行變化。

在語言模型的例子中,這就是我們實際根據前面确定的目标,丢棄舊代詞的類别資訊并添加新的資訊的地方。

LSTM

更新細胞狀态

最終,我們需要确定輸出什麼值。這個輸出将會基于我們的細胞狀态,但是也是一個過濾後的版本。首先,我們運作一個 sigmoid 層來确定細胞狀态的哪個部分将輸出出去。接着,我們把細胞狀态通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)并将它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們确定輸出的那部分。

在語言模型的例子中,因為他就看到了一個 代詞 ,可能需要輸出與一個 動詞 相關的資訊。例如,可能輸出是否代詞是單數還是負數,這樣如果是動詞的話,我們也知道動詞需要進行的詞形變化。

LSTM

輸出資訊

我們到目前為止都還在介紹正常的 LSTM。但是不是所有的 LSTM 都長成一個樣子的。實際上,幾乎所有包含 LSTM 的論文都采用了微小的變體。差異非常小,但是也值得拿出來講一下。

LSTM

peephole 連接配接

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

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

LSTM

coupled 忘記門和輸入門

LSTM

GRU

剛開始,我提到通過 RNN 得到重要的結果。本質上所有這些都可以使用 LSTM 完成。對于大多數任務确實展示了更好的性能!

由于 LSTM 一般是通過一系列的方程表示的,使得 LSTM 有一點令人費解。然而本文中一步一步地解釋讓這種困惑消除了不少。

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.

繼續閱讀