“循環(huán)神經(jīng)網(wǎng)絡(luò)RNN”與“LSTM”

一、為什么需要 RNN(Recurrent Neural Network)?

普通的神經(jīng)網(wǎng)絡(luò),都只能單獨的取處理一個個的輸入,前一個輸入和后一個輸入是完全沒有關(guān)系的。但是,某些任務(wù)需要能夠更好的處理序列的信息,即前面的輸入和后面的輸入是有關(guān)系的。

比如,當(dāng)我們在理解一句話意思時,孤立的理解這句話的每個詞是不夠的,我們需要處理這些詞連接起來的整個序列; 當(dāng)我們處理視頻的時候,我們也不能只單獨的去分析每一幀,而要分析這些幀連接起來的整個序列。也就是說,我們輸入到神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)之間是相互關(guān)聯(lián)的。

而普通的全連接NN就存在著一個問題——無法對時間序列上的變化進行建模。然而,樣本出現(xiàn)的時間順序?qū)τ谧匀徽Z言處理、語音識別、手寫體識別等應(yīng)用非常重要。對了適應(yīng)這種需求,就出現(xiàn)了題主所說的另一種神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)——循環(huán)神經(jīng)網(wǎng)絡(luò)RNN。


圖1 與時間軸相關(guān)的數(shù)據(jù)

二、什么是 RNN

RNN就是神經(jīng)元的輸出可以在下一個時間戳直接作用到自身,簡單的說就是讓數(shù)據(jù)之間的關(guān)聯(lián)也能被神經(jīng)網(wǎng)絡(luò)分析。

圖2 RNN 基本模型

那我們?nèi)绾巫寯?shù)據(jù)間的關(guān)聯(lián)也被 NN 加以分析呢? 最基本的方式,就是記住之前發(fā)生的事情。那我們讓神經(jīng)網(wǎng)絡(luò)也具備這種記住之前發(fā)生的事的能力,再分析 Data0 的時候,我們把分析結(jié)果存入記憶,然后當(dāng)分析 Data1的時候,NN會產(chǎn)生新的記憶,但是新記憶和舊記憶是有聯(lián)系的,RNN 會把新、舊記憶調(diào)用過來,一起分析。如果繼續(xù)分析更多的有序數(shù)據(jù),RNN就會把之前的記憶都累積起來,一起分析??梢杂孟聢D來表示。

圖3 RNN 模型展開

實際上,圖3就是圖2在時間軸上的展開。(t+1) 時刻網(wǎng)絡(luò)的最終結(jié)果 O(t+1) 是該時刻輸入和所有歷史共同作用的結(jié)果,這就達到了對時間序列建模的目的。所以RNN可以看成一個在時間上傳遞的神經(jīng)網(wǎng)絡(luò),它的深度是時間的長度。

但是,BUT,However,這樣的神經(jīng)網(wǎng)絡(luò)是有問題的。

之前我們說過,RNN 是在有順序的數(shù)據(jù)上進行學(xué)習(xí)的,為了記住這些數(shù)據(jù),RNN 會產(chǎn)生對先前發(fā)生事件的記憶。不過一般形式的 RNN 有時候比較健忘,為什么會這樣呢?

假如,我們的目標(biāo)信息,距離當(dāng)前時刻比較久(很久以前發(fā)生),這個信息原的記憶要進過長途跋涉才能抵達最后一個時間點。然后我們得到誤差,而且在反向傳遞得到的誤差的時候,他在每一步都會乘以一個自己的參數(shù) W,如果這個 W 是一個小于 1 的數(shù),比如0.9,這個0.9 不斷乘以誤差,誤差傳到初始時間點也會是一個接近于零的數(shù),我們把這個問題叫做梯度消失(Gradient vanishing)。

反之如果 W 是一個大于1 的數(shù),比如1.1,不斷累乘,則到最后變成了無窮大的數(shù),這種情況我們叫做 梯度爆炸(Gradient exploding)

圖4

如何解決這個問題呢?于是就產(chǎn)生了 LSTM 全稱叫 長短期記憶網(wǎng)絡(luò) Long Short-Term Memory networks。

三、LSTM( Long Short-Term Memory networks)

LSTM 就是為了解決 RNN 中 梯度消失 和 梯度爆炸 而誕生的。LSTM 和普通 RNN 相比,多出了三個控制器,輸入控制,輸出控制,忘記控制。 LSTM RNN 內(nèi)部的情況是這樣。

圖5 LSTM

整個Block相當(dāng)于隱藏層的一個神經(jīng)元。

輸入門(input gate): 一個Sigmoid層,觀察 h(t-1) 和 x(t),對于元胞狀態(tài)c(?t?1) 中的每一個元素輸出一個0~1之間的數(shù)。1表示“完全保留該信息”,0表示“完全丟棄該信息”.

Input Gate Signal
Input

遺忘門(forget gate): 一個Sigmoid層決定我們要更新哪些信息,并由一個tanh層創(chuàng)造了一個新的候選值(結(jié)果在(-1, 1)(?1,1)范圍)


Forget Gate

中間Cell


Cell

輸出門(output gate):控制哪些信息需要輸出


Output Gate
Hidden Layer Output

下圖為兩個block為中間隱藏層示意圖,可以結(jié)合上面公式來看就非常容易理解了。

圖6 LSTM連接

典型的工作流為:在“輸入門”中,根據(jù)當(dāng)前的數(shù)據(jù)流來控制接受細胞記憶的影響;接著,在 “遺忘門”里,更新這個細胞的記憶和數(shù)據(jù)流;然后在“輸出門”里產(chǎn)生輸出更新后的記憶和數(shù)據(jù)流。LSTM 模型的關(guān)鍵之一就在于這個“遺忘門”, 它能夠控制訓(xùn)練時候梯度在這里的收斂性(從而避免了 RNN 中的梯度 vanishing/exploding 問題),同時也能夠保持長期的記憶性。

如果我們把LSTM的 Forget Gate全部置0(總是忘記之前的信息),Input Gate全部 置1,Output Gate全部置1(把cell state中的信息全部輸出),這樣LSTM就變成一個標(biāo)準(zhǔn)的RNN。

最后:使用 TensorFlow 的一個 LSTM小栗子。紅線是一個正弦曲線,藍色的虛線會去擬合紅實線,隨著時間的推移,LSTM 記住了紅線的規(guī)律,從而逐漸擬合。完整的代碼可以看這里。

LSTM 小栗子

以上內(nèi)容參考莫凡Python。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容