DL課程:RNN、LSTM、GRU及相關應用案例程式碼
阿新 • • 發佈:2018-12-20
以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。
前面學習了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層建立一個新的候選值向量 ;③上述2步是為狀態更新做準備。
(3)更新“細胞狀態”:①更新Ct-1為Ct ;②把舊狀態與ft相乘,丟棄掉我們確定需要丟棄的資訊;③加上it* 。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。
(4)基於“細胞狀態”得到輸出 :① 首先執行一個sigmoid 層來確定細胞狀態的哪個部分將輸出;②接著用tanh處理細胞狀態(得到一個在-1到1之間的值),再將它和sigmoid門的輸出相乘,輸出我們確定輸出的那部分。 ③比如我們可能需要單複數資訊來確定輸出“他”還是“他們”: - 一些變種:
①增加“peephole connection”,讓 門層 也會接受細胞狀態的輸入。
②通過使用 coupled 忘記和輸入門 ,之前是分開確定需要忘記和新增的資訊,這裡是一同做出決定。
GRU(Gated Recurrent Unit)神經網路:
它是2014年提出,將忘記門和輸入門合成了一個單一的 更新門 ,同樣還混合了細胞狀態和隱藏狀態,和其他一些改動,比標準LSTM簡單:
其他推倒具體參考:參考一
案例程式碼:歡迎關注我的github
To be continue......