1. 程式人生 > >DL課程:RNN、LSTM、GRU及相關應用案例程式碼

DL課程:RNN、LSTM、GRU及相關應用案例程式碼

以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。

前面學習了CNN卷積神經網路,本文主要介紹RNN迴圈神經網路及相關升級版。

RNN迴圈神經網路

RNN(Recurrent Neural Network)是一類用於處理序列資料的神經網路。簡單來看,把序列按時間展開結構如下:

  • 結構中:
    ①Xt是時間t處的輸入;
    ②St是時間t處的“記憶”,St=f(UXt+WSt−1),f可以是tanh等;
    ③Ot是時間t出的輸出,比如是預測下個詞的話,可能是softmax輸出的屬於每個候選詞的概率,Ot = softmax(VSt)。
  • 結構細節
    ①可以把隱狀態St視作“記憶體”,捕捉了之前時間點上的資訊;
    ②輸出Ot由當前時間及之前所有的“記憶”共同計算得到;
    ③很可惜,實際應用中,St並不能捕捉和保留之前所有資訊(記憶有限?) 
    ④不同於CNN,這裡的RNN其實整個神經網路都共享一組引數(U,V,W),極大減小了需要訓練和預估的引數量 ;
    ⑤圖中的Ot在有些任務下是不存在的,比如文字情感分析,其實只需要最後的output結果就行 。
  • 梯度計算:DNN和CNN都是用BP演算法求偏導,RNN是用BPTT(back-propagation through time)其實本質還是BP演算法,只不過RNN處理時間序列資料,所以要基於時間反向傳播,故叫隨時間反向傳播。BPTT的中心思想和BP演算法相同,沿著需要優化的引數的負梯度方向不斷尋找更優的點直至收斂。


    ①先按照BP鏈式求導,可以看到它依賴於前一時刻的sj-1:


    ②我們總結規律得到:


    ③我們會發現累乘會導致啟用函式導數的累乘,進而會導致“梯度消失“和“梯度爆炸“現象的發生。具體參考(參考一
  • 雙向RNN:
    ①有些情況下,當前的輸出不只依賴於之前的序列元素,還可能依賴之後的序列元素 ;
    ②比如從一段話踢掉部分詞,讓你補全 ;
    ③直觀理解:雙向RNN疊加 ,具體結構如下圖:

  • 深層雙向RNN:和雙向RNN的區別是每一步/每個時間點我們設定多層結構 :

LSTM(long short-term memory)長短期記憶網路:

長短期記憶網路是RNN的一種變體,RNN由於梯度消失的原因只能有短期記憶,LSTM網路通過精妙的門控制將短期記憶與長期記憶結合起來,並且一定程度上解決了梯度消失的問題;

  • 與RNN的區別是:
    ① 它的“記憶細胞”改造過:


    ②該記的資訊會一直傳遞,不該記的會被“門”截斷。

  • LSTM關鍵:“細胞狀態”
    ①細胞狀態類似於傳送帶。直接在整個鏈上執行,只有一些少量的線性互動。資訊在上面流傳保持不變會很容易。


    ②LSTM怎麼控制“細胞狀態”?(1)通過“門”讓資訊選擇性通過,來去除或者增加資訊到細胞狀態;(2)包含一個sigmoid神經網路層 和 一個pointwise乘法操作;(3)Sigmoid 層輸出0到1之間的概率值,描述每個部分有多少量可以通過。0代表“不許任何量通過”,1就指“允許任意量通過”。

  • LSTM的幾個關鍵“門”與操作:
    (1)決定從“細胞狀態”中丟棄什麼資訊  =>  “忘記門”:


    (2)決定放什麼新資訊到“細胞狀態”中:①Sigmoid層決定什麼值需要更新 ;②Tanh層建立一個新的候選值向量 \tilde{C_{t}};③上述2步是為狀態更新做準備。


    (3)更新“細胞狀態”:①更新Ct-1為Ct ;②把舊狀態與ft相乘,丟棄掉我們確定需要丟棄的資訊;③加上it*\tilde{C_{t}}  。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。 


    (4)基於“細胞狀態”得到輸出 :① 首先執行一個sigmoid 層來確定細胞狀態的哪個部分將輸出;②接著用tanh處理細胞狀態(得到一個在-1到1之間的值),再將它和sigmoid門的輸出相乘,輸出我們確定輸出的那部分。 ③比如我們可能需要單複數資訊來確定輸出“他”還是“他們”:

  • 一些變種:
    ①增加“peephole connection”,讓 門層 也會接受細胞狀態的輸入。


    ②通過使用 coupled 忘記和輸入門 ,之前是分開確定需要忘記和新增的資訊,這裡是一同做出決定。

GRU(Gated Recurrent Unit)神經網路:

它是2014年提出,將忘記門和輸入門合成了一個單一的 更新門 ,同樣還混合了細胞狀態和隱藏狀態,和其他一些改動,比標準LSTM簡單:

其他推倒具體參考:參考一

案例程式碼:歡迎關注我的github


To be continue......