一、循環神經網絡概述 算法
循環神經網絡(RNN)和DNN,CNN不一樣,它能處理序列問題。常見的序列有:一段段連續的語音,一段段連續的手寫文字,一條句子等等。這些序列長短不一,又比較難拆分紅一個個獨立的樣原本訓練。那麼RNN又是怎麼來處理這類問題的呢?RNN就是假設咱們的樣本是基於序列的。好比給定一個從索引$0$到$T$的序列,對於這個序列中任意索引號$t$,它對應的輸入都是樣本$x$中的第$t$個元素$x^{(t)}$。而模型在序列索引號t位置的隱藏狀態$h^{(t)}$則是由$x^{(t)}$和在$t-1$位置的隱藏狀態$h^{(t-1)}$共同決定的。而模型在$t$時刻的輸出$o^{(t)}$,就是由$h^{(t)}$經過非線性轉換獲得的。網絡
當咱們在理解一句話意思時,孤立的理解這句話的每一個詞是不夠的,咱們須要處理這些詞鏈接起來的整個序列。函數
以nlp的一個最簡單詞性標註任務來講,將」我」 「吃」 「蘋果「 三個單詞標註詞性爲 我/nn 吃/v 蘋果/nn。那麼這個任務的輸入就是:學習
我 吃 蘋果 (已經分詞好的句子)優化
這個任務的輸出是:atom
我/nn 吃/v 蘋果/nn(詞性標註好的句子)spa
對於這個任務來講,咱們固然能夠直接用普通的神經網絡來作,給網絡的訓練數據格式了就是我-> 我/nn 這樣的多個單獨的單詞->詞性標註好的單詞。可是很明顯,一個句子中,前一個單詞其實對於當前單詞的詞性預測是有很大影響的,好比預測蘋果的時候,因爲前面的吃是一個動詞,那麼很顯然蘋果做爲名詞的機率就會遠大於動詞的機率,由於動詞後面接名詞很常見,而動詞後面接動詞不多見。此時就須要RNN來處理該問題。.net
再者咱們常見的語言模型有2-Gram或者是3-Gram,當n-Gram中的n大於3以後,樣本容量會很是大,甚至超過現有的計算能力。此時RNN就能夠解決該問題,理論上RNN能夠往前日後關聯任意多個詞。設計
二、循環神經網絡模型3d
先以一個最多見的RNN模型來展開
上圖中左邊是RNN模型沒有按時間展開的圖,若是按時間序列展開,則是上圖中的右邊部分。咱們重點觀察右邊部分的圖。
這幅圖描述了在序列索引號t 附近RNN的模型。其中:
1)x(t)表明在序列索引號 t 時訓練樣本的輸入。一樣的,x(t-1) 和 x(t+1) 表明在序列索引號 t−1 和 t+1 時訓練樣本的輸入。
2)h(t) 表明在序列索引號 t 時模型的隱藏狀態。h(t)由x(t)和 h(t-1) 共同決定。
3)o(t) 表明在序列索引號 t 時模型的輸出。o(t)只由模型當前的隱藏狀態 h(t) 決定。
4)L(t) 表明在序列索引號 t 時模型的損失函數,模型總體的損失函數是全部的L(t)相加和。
5)y(t) 表明在序列索引號 t 時訓練樣本序列的真實輸出。
6)$U, W, V$這三個矩陣就是咱們的模型的線性關係參數,它在整個RNN網絡中是共享的。也正是由於是共享的,它體現了RNN的模型的「循環反饋」的思想。
三、循環神經網絡的前向傳播算法
循環網絡的前向傳播算法很是簡單,對於t時刻:
其中$\phi (.)$爲激活函數,通常來講會選擇tanh函數,b爲偏置。則 t 時刻的輸出:
最終模型的預測輸出爲:
其中σ爲激活函數,激活函數一般選擇softmax函數。
四、循環神經網絡的反向傳播算法
BPTT(back-propagation through time)算法是經常使用的訓練RNN的方法,其實本質仍是BP算法,只不過RNN處理時間序列數據,因此要基於時間反向傳播,故叫隨時間反向傳播。BPTT的中心思想和BP算法相同,沿着須要優化的參數的負梯度方向不斷尋找更優的點直至收斂。固然這裏的BPTT和DNN中的BP算法也有很大的不一樣點,即這裏全部的 $U, W, V$ 在序列的各個位置是共享的,反向傳播時咱們更新的是相同的參數。
對於RNN,因爲咱們在序列的每一個位置都有損失函數,所以最終的損失L爲:
所以能夠獲得U,V,W的偏導,其中V的比較好求
而在求W和U的時候就比較的複雜了。
在反向傳播時,在某一序列位置 t 的梯度損失由當前文職的輸出對應的梯度損失和序列索引位置 t + 1 時的梯度損失兩部分共同決定的。
對於W在某一序列位置 t 的梯度損失須要反向傳播一步步的計算。
好比以$t=3$時刻爲例
所以,在某個時刻的對 W 或是 U 的偏導數,須要追溯這個時刻以前全部時刻的信息。根據上面的式子能夠概括出 L 在 t 時刻對 W 和 U 偏導數的通式:
而對於裏面的乘積部分,咱們引入激活函數,則能夠表示爲:
或者是
然而對於 Sigmoid 函數和 tanh 函數及其導數有如下的特色
sigmoid 函數及其導數
tanh 函數及其導數
Relu 函數及其導數
咱們能夠從中觀察到,sigmoid 函數的導數範圍是(0, 0.25], tanh 函數的導數範圍是 (0, 1] ,他們的導數最大都不大於 1。所以在上面求梯度的乘積中,隨着時間序列的不斷深刻,小數的累乘就會致使梯度愈來愈小直到接近於 0,這就會引發梯度消失現象。梯度消失就意味着那一層的參數不再更新了,則模型的訓練毫無心義。Relu 函數必定程度上能夠解決梯度消失的問題,可是容易引發梯度爆炸的問題。此外 tanh 函數的收斂速度要快於 sigmoid 函數,並且梯度消失的速度要慢於 sigmoid 函數。
利用BPTT算法訓練網絡時容易出現梯度消失的問題,當序列很長的時候問題尤爲嚴重,所以上面的RNN模型通常不能直接應用。而較爲普遍使用的是RNN的一個特例LSTM。
五、LSTM 網絡
Long Short Term 網絡,通常就叫作 LSTM ,是一種 RNN 特殊的類型,能夠學習長期依賴信息。LSTM 經過刻意的設計來避免長期依賴問題。記住長期的信息在實踐中是 LSTM 的默認行爲,而非須要付出很大代價才能得到的能力!
全部 RNN 都具備一種重複神經網絡模塊的鏈式的形式。在標準的 RNN 中,這個重複的模塊只有一個很是簡單的結構,例如一個 tanh 層。
LSTM 一樣是這樣的結構,可是重複的模塊的結構更加複雜。不一樣於 單一神經網絡層,總體上除了 h 在隨時間流動,細胞狀態 c 也在隨時間流動。細胞狀態 c 就表明着長期記憶,而狀態 h 表明了短時間記憶。
上面咱們給出了LSTM的模型結構,下面咱們就一點點的剖析LSTM模型在每一個序列索引位置 t 時刻的內部結構。
從上圖中能夠看出,在每一個序列索引位置 t 時刻向前傳播的除了和RNN同樣的隱藏狀態 ht ,還多了另外一個隱藏狀態,如圖中上面的長橫線。這個隱藏狀態咱們通常稱爲細胞狀態(Cell State),記爲 Ct 。以下圖所示:
細胞狀態相似於傳送帶。直接在整個鏈上運行,只有一些少許的線性交互。信息在上面流傳保持不變會很容易。LSTM 有經過精心設計的稱做爲「門」的結構來去除或者增長信息到細胞狀態的能力。LSTM在在每一個序列索引位置t的門通常包括遺忘門,輸入門和輸出門三種。下面咱們就來研究上圖中LSTM的遺忘門,輸入門和輸出門以及細胞狀態。
5.1 遺忘門
遺忘門(forget gate)顧名思義,是控制是否遺忘的,在LSTM中即以必定的機率控制是否遺忘上一層的隱藏細胞狀態。遺忘門子結構以下圖所示:
在這裏 ht-1 表示歷史信息,xt 表示當前流入細胞中新的信息。
xt 在這裏的做用是爲了根據當前輸入的新的信息來決定要忘記哪些歷史信息。
例如在語言模型中,基於已經看到的預測下一個詞。
在這個問題中,細胞狀態可能包含當前主語的性別,所以正確的代詞能夠被選擇出來。
當咱們看到新的主語,咱們但願忘記舊的主語。
二者的結構都是向量,在這裏咱們將兩個向量拼接起來輸入。輸出一個在 0 到 1 之間的數值,這個數值決定要遺忘多少歷史信息。
1 表示「徹底保留」,0 表示「徹底捨棄」。
5.2 輸入門
輸入門(input gate)負責處理當前序列位置的輸入,肯定什麼樣的新信息被存放在細胞狀態中。這裏包含兩個部分。第一,sigmoid 層稱 「輸入門層」 決定什麼值咱們將要更新。而後一個 tanh 層建立一個新的候選值向量 $ \tilde{C}_t $ ,會被加入到狀態中。它的子結構以下圖:
在咱們語言模型的例子中,咱們但願增長新的主語的性別到細胞狀態中,來替代舊的須要忘記的主語。因此在更新新的細胞狀態時,主要要作的兩件事就是決定哪些歷史信息該流入當前細胞中(遺忘們控制),決定哪些新的信息該流入細胞中(輸入們控制)。
在得到了輸入門和遺忘門係數以後就能夠更新當前的細胞狀態,Ct-1 更新爲 Ct 。
5.3 輸出門
在獲得了新的隱藏細胞狀態 Ct ,咱們就得開始去輸出結果,輸出門的子結構以下:
從圖中能夠看出,隱藏狀態 ht 的更新由兩部分組成,輸出門依然是由歷史信息 ht-1 和新的信息 xt 來決定的,。
輸入門、遺忘門、輸出們所對應的函數都是 sigmoid 函數(由於 Sigmoid 函數的輸出值範圍爲0-1,至關於控制門的百分比過濾),所以輸出的結果是[0, 1],當爲0時,門徹底關閉,當爲1時,門徹底打開。輸入們控制這當前輸入值有多少信息流入到當前的計算中,遺忘門控制着歷史信息中有多少信息流入到當前計算中,輸出們控制着輸出值中有多少信息流入到隱層中。全部LSTM除了有三個門來控制當前的輸入和輸出,其餘的和RNN是一致的。
六、LSTM前向傳播算法
LSTM模型有兩個隱藏狀態 ht , Ct ,模型參數幾乎是RNN的4倍,由於如今多了 Wf, Uf, bf, Wa, Ua, ba, Wi, Ui, bi, Wo, Uo, bo 這些參數。
前向傳播過程在每一個序列索引位置的過程爲:
1)更新遺忘門輸出:
2)更新輸入門兩部分輸出:
3)更新細胞狀態:
4)更新輸出門輸出:
5)更新當前序列索引預測輸出:
知道了前向傳播,反向傳播和RNN中的同樣,也是藉助梯度降低來訓練模型,具體的訓練過程能夠看這裏
總歸LSTM模型結構是很是複雜的,並且參數衆多,所以調參時要很是仔細,而且要深入理解模型的每一個結構才能更好的選取參數。
**本文爲結合多篇博客的總結筆記**