從本質認識RNN到LSTM【附例項】
(一)說明
這裡寫一下RNN的相關公式推導,以及程式碼中RNN的理解,簡單的說明本質問題,不再詳細介紹RNN相關發展以及相關概念。有相關基礎肯能會比較好懂。主要介紹RNN、LSTM並簡單介紹其他RNN的變種。
(二)本質分析開始--RNN推導與理解
給出最直觀理解RNN的圖:
引數這裡是共享的。
接下來是RNN的前向傳播計算公式:
RNN時間序列的反向傳播公式推導:
首先簡化上面前向計算的公式:
反向傳播公式推導,舉一反三:
以上用公式推導了RNN的計算,接下來看不同情況下RNN的應用場景:
One to one : 傳統文字分類
One to many: 英文釋義
Many to one: 情感分析
Many to many: 機器翻譯
Many to many(同步):文字序列標註
(三)深度學習的“著名”問題即引出LSTM
上述RNN計算會有一個深度學習中有名的問題:梯度消失或梯度爆炸。
在深度學習的非線性函式的不斷巢狀使得引數的梯度在後邊越來越小或越來越大,尤其是使用sigmoid函式,很顯然的是sigmoid函式的導數最大也只是0.25的啟用值。具體可以推導一下。當引數值在後邊越來越小或越來越大,RNN前邊資訊都很快被丟失。(還記得剛說過的sigmoid的0.25吧!)接下來看一下過程:
既然RNN對資訊不能很好地記住,那麼接下來就說說能記點東西的LSTM吧!
這裡直接上我看過的書上的圖吧:
(四)總結與例項
剩下其他RNN變種舉一反三去認識即可,例如現在用的較多的GRU。
另外在寫程式碼的時候要確定輸入單元的數量,以及輸入步長(序列)的數量,隱藏層的數量,輸出層的數量,接下來的工作即用tensorflow搭模型即可。
提供一個字元級別RNN的例子:
-- Tensorflow版本
https://github.com/sherjilozair/char-rnn-tensorflow
--