深度學習之RNN、LSTM、GRU篇

寫在前面,作爲RNN篇學習的記錄
參考1:https://blog.csdn.net/mpk_no1/article/details/72875185
參考2:https://blog.csdn.net/lreaderl/article/details/78022724

RNN( Recurrent Neural Networks循環神經網絡)

循環神經網絡的主要用途是處理和預測序列數據,在全連接神經網絡或卷積神經網絡中,網絡結果都是從輸入層到隱含層再到輸出層,層與層之間是全連接或部分連接的,但每層之間的結點是無連接的。考慮這樣一個問題,如果要預測句子的下一個單詞是什麼,一般需要用到當前單詞以及前面的單詞,因爲句子中前後單詞並不是獨立的,比如,當前單詞是“很”,前一個單詞是“天空”,那麼下一個單詞很大概率是“藍”。循環神經網絡的來源就是爲了刻畫一個序列當前的輸出與之前信息的關係。從網絡結果上來說,RNN會記憶之前的信息,並利用之前的信息影響後面的輸出。也就是說,RNN的隱藏層之間的結點是有連接的,隱藏層的輸入不僅包括輸入層的輸出,還包含上一時刻隱藏層的輸出。
在這裏插入圖片描述典型的RNN結構如圖所示,對於RNN來說,一個非常重要的概念就是時刻,RNN會對於每一個時刻的輸入結合當前模型的狀態給出一個輸出,從圖中可以看出,RNN的主體結構A的輸入除了來自輸入層的Xt,還有一個循環的邊來提供當前時刻的狀態。同時A的狀態也會從當前步傳遞到下一步。可以很清晰地看到信息在隱藏層之間的傳遞:
鏈式的特徵揭示了 RNN 本質上是與序列和列表相關的。他們是對於這類數據的最自然的神經網絡架構。
並且 RNN 也已經被人們應用了!在過去幾年中,應用 RNN 在語音識別,語言建模,翻譯,圖片描述等問題上已經取得一定成功,並且這個列表還在增長。

RNN的隱藏層的計算是一個全連接,在這裏插入圖片描述

長期依賴(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 肯定不能夠成功學習到這些知識。如果序列過長會導致優化時出現梯度消散的問題
然而,幸運的是,LSTM 並沒有這個問題!

LSTM(長短期記憶網絡)

LSTM解決了RNN Deep Network的Gradient錯誤累積太多,以至於Gradient歸零或者成爲無窮大,所以無法繼續進行優化的問題。
在這裏插入圖片描述
如圖所示,標準LSTM模型是一種特殊的RNN類型,在每一個重複的模塊中有四個特殊的結構,以一種特殊的方式進行交互。LSTM是一種擁有三個“門”結構的特殊網絡結構(輸入門,狀態控制門(遺忘門),輸出門)。
LSTM 靠一些“門”的結構讓信息有選擇性地影響RNN中每個時刻的狀態。所謂“門”的結構就是一個使用sigmod神經網絡和一個按位做乘法的操作,這兩個操作合在一起就是一個“門”結構。之所以該結構叫做門是因爲使用sigmod作爲激活函數的全連接神經網絡層會輸出一個0到1之間的值,描述當前輸入有多少信息量可以通過這個結構,於是這個結構的功能就類似於一扇門,當門打開時(sigmod輸出爲1時),全部信息都可以通過;當門關上時(sigmod輸出爲0),任何信息都無法通過。

LSTM模型的核心思想是“細胞狀態”。“細胞狀態”類似於傳送帶。直接在整個鏈上運行,只有一些少量的線性交互。信息在上面流傳保持不變會很容易。
在這裏插入圖片描述在LSTM模型中,第一步是決定我們從“細胞”中丟棄什麼信息,這個操作由一個忘記門層來完成。該層讀取當前輸入x和前神經元信息h,由ft來決定丟棄的信息。輸出結果1表示“完全保留”,0 表示“完全捨棄”。 在這裏插入圖片描述
第二步是確定細胞狀態所存放的新信息,這一步由兩層組成。sigmoid層作爲“輸入門層”,決定我們將要更新的值i;tanh層來創建一個新的候選值向量~Ct加入到狀態中。在語言模型的例子中,我們希望增加新的主語到細胞狀態中,來替代舊的需要忘記的主語。
在這裏插入圖片描述 第三步就是更新舊細胞的狀態,將Ct-1更新爲Ct。我們把舊狀態與 ft相乘,丟棄掉我們確定需要丟棄的信息。接着加上 it * ~Ct。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。在語言模型的例子中,這就是我們實際根據前面確定的目標,丟棄舊代詞的信息並添加新的信息的地方。
在這裏插入圖片描述最後一步就是確定輸出了,這個輸出將會基於我們的細胞狀態,但是也是一個過濾後的版本。首先,我們運行一個 sigmoid 層來確定細胞狀態的哪個部分將輸出出去。接着,我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)並將它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。在語言模型的例子中,因爲語境中有一個代詞,可能需要輸出與之相關的信息。例如,輸出判斷是一個動詞,那麼我們需要根據代詞是單數還是負數,進行動詞的詞形變化。
在這裏插入圖片描述

GRU( Gated Recurrent Unit,LSTM變體)

GRU作爲LSTM的一種變體,將忘記門和輸入門合成了一個單一的更新門。同樣還混合了細胞狀態和隱藏狀態,加諸其他一些改動。最終的模型比標準的 LSTM 模型要簡單,也是非常流行的變體。GRU的構造更簡單:比LSTM少一個gate,這樣就少幾個矩陣乘法。在訓練數據很大的情況下GRU能節省很多時間。
在這裏插入圖片描述

雙向RNN

在經典的循環神經網絡中,狀態的傳輸是從前往後單向的。然而,在有些問題中,當前時刻的輸出不僅和之前的狀態有關係,也和之後的狀態相關。這時就需要雙向RNN(BiRNN)來解決這類問題。例如預測一個語句中缺失的單詞不僅需要根據前文來判斷,也需要根據後面的內容,這時雙向RNN就可以發揮它的作用。

雙向RNN是由兩個RNN上下疊加在一起組成的。輸出由這兩個RNN的狀態共同決定。
在這裏插入圖片描述
從上圖可以看出,雙向RNN的主題結構就是兩個單向RNN的結合。在每一個時刻t,輸入會同時提供給這兩個方向相反的RNN,而輸出則是由這兩個單向RNN共同決定(可以拼接或者求和等)。

同樣地,將雙向RNN中的RNN替換成LSTM或者GRU結構,則組成了BiLSTM和BiGRU。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章