[深度学习]理解RNN, GRU, LSTM 网络
Recurrent Neural Networks(RNN)
人類并不是每時每刻都從一片空白的大腦開始他們的思考。在你閱讀這篇文章時候,你都是基于自己已經擁有的對先前所見詞的理解來推斷當前詞的真實含義。我們不會將所有的東西都全部丟棄,然后用空白的大腦進行思考。我們的思想擁有持久性。
傳統的神經網絡并不能做到這點,看起來也像是一種巨大的弊端。例如,假設你希望對電影中的每個時間點的時間類型進行分類。傳統的神經網絡應該很難來處理這個問題——使用電影中先前的事件推斷后續的事件。
RNN 解決了這個問題。RNN 是包含循環的網絡,允許信息的持久化。
RNN 包含循環
在上面的示例圖中,神經網絡的模塊,A,正在讀取某個輸入 x_i,并輸出一個值 h_i。循環可以使得信息可以從當前步傳遞到下一步。
這些循環使得 RNN 看起來非常神秘。然而,如果你仔細想想,這樣也不比一個正常的神經網絡難于理解。RNN 可以被看做是同一神經網絡的多次復制,每個神經網絡模塊會把消息傳遞給下一個。所以,如果我們將這個循環展開:
展開的 RNN
?
鏈式的特征揭示了 RNN 本質上是與序列和列表相關的。他們是對于這類數據的最自然的神經網絡架構。
RNN的梯度消失
RNN在訓練時,也會遇到和訓練深層神經網絡時一樣的問題--會出現梯度消失或者梯度爆炸。對于梯度爆炸比較容易解決,對模型重新進行梯度修剪就能避免問題,下圖是梯度修剪實施的過程。但對于解決梯度消失問題比較困難。下面提到的GRU和LSTM是能有效解決梯度消失的方法。實施過程有點復雜。
并且 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 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。
在語言模型的例子中,因為他就看到了一個 代詞,可能需要輸出與一個 動詞 相關的信息。例如,可能輸出是否代詞是單數還是負數,這樣如果是動詞的話,我們也知道動詞需要進行的詞形變化。
?
使用了三個gate。且在LSTM(Long Short Term Memory)中,c<t>和a<t>不再是對等的。
候選細胞:
?c<t> = tanh(wc [ a<t-1>, x<t> ] + bc )
update gate(更新門):
Γu = σ(wu[ a<t-1>, x<t> ] + bu )
forget gate(遺忘門)::
Γf = σ(wf[ a<t-1>, x<t> ] + bf )
output gate(輸出門):;
Γo = σ(wo[ a<t-1>, x<t> ] + bo )
記憶細胞:
c<t> = Γu * ?c<t> + Γf * c<t-1> (可以發現Γf 等價于GRU中的1 - Γu )
從此式子上可以看出計算當前記憶細胞結合了上一時刻記憶細胞和當前時刻候選記憶細胞的信息,并通過遺忘門Γf 和更新門Γu 來控制信息的流動。當Γf 近似1而Γu 近似0時,過去時刻的信息一直通過時間保存下來,而當前信息則被丟棄遺忘。
傳入下一時刻的激活值(或者稱為隱藏信息):
a<t> = Γo * tanh c<t>
從此式子上可以看出,隱藏信息的流動取決于輸出門Γo ,當Γo 近似為1時,信息被傳遞到下一時刻;當Γo 近似為0時,細胞信息自己保留。
?
?
LSTM 的變體
我們到目前為止都還在介紹正常的 LSTM。但是不是所有的 LSTM 都長成一個樣子的。實際上,幾乎所有包含 LSTM 的論文都采用了微小的變體。差異非常小,但是也值得拿出來講一下。
1. 其中一個流形的 LSTM 變體,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是說,我們讓 門層 也會接受細胞狀態的輸入。
peephole 連接
上面的圖例中,我們增加了 peephole 到每個門上,但是許多論文會加入部分的 peephole 而非所有都加。
2. 另一個變體是通過使用 coupled 忘記和輸入門。不同于之前是分開確定什么忘記和需要添加什么新的信息,這里是一同做出決定。我們僅僅會當我們將要輸入在當前位置時忘記。我們僅僅輸入新的值到那些我們已經忘記舊的信息的那些狀態 。
coupled 忘記門和輸入門
3. 另一個改動較大的變體是 Gated Recurrent Unit (GRU),這是由 Cho, et al. (2014) 提出。它將忘記門和輸入門合成了一個單一的 更新門。同樣還混合了細胞狀態和隱藏狀態,和其他一些改動。最終的模型比標準的 LSTM 模型要簡單,也是非常流行的變體。
GRU
?
GRU(Gated Recurrent Units)門循環單元是組成RNN隱藏層的部分,不僅能夠幫助RNN更好地捕獲長范圍的連接關系,還對梯度消失問題有幫助。
-
GRU的簡略版
在GRU中,提出memory cell(記憶細胞)的概念,用c來表示。記憶細胞的作用就是記住一些需要記憶的信息。
在GRU的概念中,c<t> = a<t>,即記憶細胞的值是和激活函數的輸出值相等的。但在后面的LSTM概念中,兩者是有區別的。
在每個時間步長中,我們重新定義一個候選項:?c<t> = tanh(wc[c<t-1>, x<t>] + bc)
接著有:Γu (0<Γu<1)= σ(wu[c<t-1>, x<t>] + bu),這是在GRU中一個很重要的概念--更新門update gate,下標u表示update的意思,有時也用Gu表示。因為Γu 取0到1的范圍,所以用上sigmoid激活函數來使計算結果在0到1的范圍內。在具體操作中,用?c<t>來更新c<t>,用Γu來決定是否要更新c<t>或者什么時候更新c<t>。即用下面這個公式ct = Γu * ?c<t> + (1-Γu) * c<t-1>,當Γu=1時,c<t>更新為備選項?c<t>;當Γu=0時,c<t> = c<t-1>
更新門可以控制過去的信息在當前時刻的重要性。如果更新門一直近似1,過去的信息將一直通過時間保存并傳遞至當前時刻。GRU的這個設計可以應對RNN中的梯度衰減問題,并且更好地捕獲長范圍內前后信息的依賴關系。 -
RNN單元和GRU單元的可視化
- RNN:
- GRU:
-
GRU的完整版
在上面簡略版的基礎上再加入一個gate--Γr(r表示relevance),表示前后信息的關聯性。?c<t> = tanh(wc[ Γr * c<t-1>, x<t> ] + bc)
Γu = σ(wu[ c<t-1>, x<t> ] + bu)
Γr = σ(wr[ c<t-1>, x<t> ] + bu)
c<t> = Γu * ?c<t> + (1-Γu) * c<t-1>
a<t> = c<t>候選項?c<t>的公式中包含Γr * c<t-1>,說明這個門控制了上一時刻傳遞的信息的流入。如果Γr近似為0,c<t-1>將被丟棄,即上一時刻傳遞的信息會被拋棄。
(因為這個操作,Amazon的動手學深度學習課程中也稱這個門為重置門(reset gate))。
因此,Γr門提供了丟棄與未來無關的過去信息的機制。對門控循環單元的設計稍作總結:
Γr門有助于捕捉序列數據中短期的依賴關系。
Γu門有助于捕捉序列數據中長期的依賴關系。
這里只是部分流行的 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 更好的結果。
參考:
https://www.jianshu.com/p/9dc9f41f0b29
https://www.jianshu.com/p/d67e01618dde
?
https://segmentfault.com/a/1190000014574524
總結
以上是生活随笔為你收集整理的[深度学习]理解RNN, GRU, LSTM 网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提示“无法打开这个应用”怎么办 提示“无
- 下一篇: [机器学习]一个例子完美解释朴素贝叶斯分