1.1 RNN概述
RNN很多實施情況都可通過時間序列模型來描述(RNN又被叫做序列模型)。
例如,如果你想寫一個文檔,單詞的順序很重要,當前的單詞肯定取決於以前的單詞。如果把注意力放在文字寫作上…… 一個單詞中的下一個字符取決於之前的字符(例如,The quick brown f...,下一個字母是 o 的概率很高),如下圖所示,關鍵思想是在給定上下文的情況下產生下一個字符的分布,然后從分布中取樣產生下一個候選字符:
一個簡單的變體是存儲多個預測值,並創建一個預測擴展樹,如下圖所示:
基於序列的模型可以用在很多領域中。在音樂中,一首曲子的下一個音符肯定取決於前面的音符,而在視頻領域,電影中的下一幀肯定與先前的幀有關。此外,在某些情況下,視頻的當前幀、單詞、字符或音符不僅僅取決於過去的信號,而且還取決於未來的信號。
1.2 RNN基本模型介紹
基於時間序列的模型可以用RNN來描述,其中,時刻 i 輸入為 Xi,輸出為 Yi,時刻 [0,i-1] 區間的狀態信息被反饋至網絡。這種反饋過去狀態的思想被循環描述出來,如下圖所示:
展開(unfolding)網絡可以更清晰地表達循環關系,如下圖所示:
而RNN模型通過區別隱層接收的是上一時刻的隱層還是上一時刻的輸出將其分為兩種基礎模型結構:
最簡單的 RNN 單元由簡單的 tanh 函數組成,即雙曲正切函數,如下圖所示:
1.3 雙向RNN(Bidirectional RNN)
RNN既然能繼承歷史信息,是不是也能吸收點未來的信息呢?因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了雙向RNN、雙向LSTM,同時利用歷史和未來的信息。
雙向RNN
值得一提的是,但由於RNN 建模中的遺忘性,最后一個 state 中包含的信息是有損的,且序列越靠前的信息損失可能越嚴重。一種比較可行的解決方法是同時訓練兩個RNN,一個正向學習,一個反向學習,將正向的和反向的最后一個state 對應向量 concate 后得到的向量作為最終產物。
對於正向RNN最后一個向量中記錄的信息量從前往后依次增強,反向的最后一個state記錄的信息從后往前依次增強,兩者組合正好記錄了比較完整的信息。
1.4 RNN的多種結構(處理向量序列)
RNN 強大的是它能夠處理向量序列,其中 RNN 的輸入和輸出可以是序列,下圖很好地說明了這一點,最左邊的例子是一個傳統(非遞歸)網絡,后面跟着一個序列輸出的 RNN,接着跟着一個序列輸入的 RNN,其次跟着序列輸入和序列輸出不同步的 RNN,最后是序列輸入和序列輸出同步的 RNN。
RNN序列示例圖:
機器翻譯是輸入序列和輸出序列中不同步的一個例子:網絡將輸入文本作為一個序列讀取,讀完全文后輸出目標語言。
視頻分類是輸入序列和輸出序列同步的一個例子:視頻輸入是一系列幀,對於每一幀,在輸出中提供分類標簽。
詳解見:https://www.jiqizhixin.com/articles/2018-12-14-4
2、RNN所涉及的梯度問題
由於存在兩個穩定性問題,訓練 RNN 是很困難的。由於反饋環路的緣故,梯度可以很快地發散到無窮大,或者迅速變為 0。如下圖所示:
在這兩種情況下,網絡將停止學習任何有用的東西。梯度爆炸的問題可以通過一個簡單的策略來解決,就是梯度裁剪。梯度消失的問題則難以解決,它涉及更復雜的 RNN 基本單元(例如長短時記憶(LSTM)網絡或門控循環單元(GRU))的定義。先來討論梯度爆炸和梯度裁剪。
梯度裁剪包括對梯度限定最大值,以使其不能無界增長。如下圖所示,該方法提供了一個解決梯度爆炸問題的簡單方案:
解決梯度消失需要一個更復雜的記憶模型,它可以有選擇地忘記以前的狀態,只記住真正重要的狀態。如下圖所示,將輸入以概率 p∈[0,1] 寫入記憶塊 M,並乘以輸入的權重。以類似的方式,以概率 p∈[0,1] 讀取輸出,並乘以輸出的權重。再用一個概率來決定要記住或忘記什么:
3、長短時記憶網絡(LSTM)
長短時記憶網絡可以控制何時讓輸入進入神經元,何時記住之前時序中學到的東西,以及何時讓輸出傳遞到下一個時間戳。所有這些決策僅僅基於輸入就能自我調整。乍一看,LSTM 看起來很難理解,但事實並非如此。我們用下圖來解釋它是如何工作的:
首先,需要一個邏輯函數 σ 計算出介於 0 和 1 之間的值,並且控制哪個信息片段流經 LSTM 門。請記住,logisitic 函數是可微的,所以它允許反向傳播。
然后需要一個運算符 ⊗ 對兩個相同維數的矩陣進行點乘產生一個新矩陣,其中新矩陣的第 ij 個元素是兩個原始矩陣第 ij 個元素的乘積。同樣,需要一個運算符 ⊕ 將兩個相同維數的矩陣相加,其中新矩陣的第 ij 個元素是兩個原始矩陣第 ij 個元素的和。在這些基本模塊中,將 i 時刻的輸入 xi 與前一步的輸出 yi 放在一起。
方程 fi = σ(Wf · [yi - 1, xi] + bf) 是邏輯回歸函數,通過控制激活門 ⊗ 決定前一個單元狀態 Ci-1 中有多少信息應該傳輸給下一個單元狀態 Ci(Wf 是權重矩陣,bf 是偏置)。邏輯輸出 1 意味着完全保留先前單元狀態 Ct-1,輸出 0 代表完全忘記 Ci-1 ,輸出(0,1)中的數值則代表要傳遞的信息量。
接着,方程根據當前輸入產生新信息,方程 si = σ(Wc · [Yi - 1, Xi] + bc) 則能控制有多少新信息
通過運算符 ⊕ 被加入到單元狀態 Ci 中。利用運算符 ⊗ 和 ⊕,給出公式
對單元狀態進行更新。
最后,需要確定當前單元狀態的哪些信息輸出到 Yi。很簡單,再次采用邏輯回歸方程,通過 ⊗ 運算符控制候選值的哪一部分應該輸出。在這里有一點需要注意,單元狀態是通過 tanh 函數壓縮到 [-1,1]。這部分對應的方程是 Yi=ti * tanh(Ci)。
LSTM的理論講解看上去好像十分復雜,但它的運用其實非常簡單。你可以使用LSTM單元作為標准RNN元的黑盒替換,即可解決梯度消失問題。而大多數深度學習框架提供了相關內容的調用。
4、門控循環單元(GRU)和窺孔LSTM
近年來已經提出了許多 LSTM 的變種模型,其中有兩個很受歡迎:窺孔(peephole)LSTM 允許門層查看單元狀態,如下圖中虛線所示;而門控循環單元(GRU)將隱藏狀態和單元狀態合並為一個信息通道。
GRU單元是LSTM單元的簡化版,性能相似。主要簡化如下:
- 長期狀態和短期狀態合並為一個單獨的向量。
- 采用單獨的門控來控制遺忘門和輸入門。如果門控輸出1,輸入門打開,遺忘門關閉。如果門控輸出0,執行相反的操作。當一些記憶需要存儲時,存儲這些信息的地方需要先清空。這實際上是LSTM單元及其自身的常見變體。
- 沒有輸出門,每個時間節點輸出全部狀態向量。然而,新引入一個控制器來控制前一個狀態的哪個部分提供給主層。
參考資料
簡書 - 循環神經網絡(RNN) 基礎講解:https://www.jianshu.com/p/9f155515bdf0
C語言中文網 - RNN循環神經網絡及原理(詳解版):http://c.biancheng.net/view/1946.html
Bilibili - RNN介紹(覃秉豐Pytorch課程):https://www.bilibili.com/video/BV1iv41117Zg?p=25
知乎 - 循環神經網絡(RNN)筆記——LSTM: