史上最詳細循環(huán)神經(jīng)網(wǎng)絡講解(RNNLSTMGRU)
馬上就要入職了,擔心自己啥都忘了被領導爆錘,在此復習一下之前學過的知識。我相信每次的學習整理都會對自己更加深刻理解這些知識有很大的幫助,同時也希望更多的人看了我的文章有所收獲。今天先來復習一下,循環(huán)神經(jīng)網(wǎng)絡(RNN)!
一。什么是循環(huán)神經(jīng)網(wǎng)絡:
循環(huán)神經(jīng)網(wǎng)絡(Rerrent Neural Network, RNN),歷史啊,誰發(fā)明的都不重要,說了你也記不住,你只要記住RNN是神經(jīng)網(wǎng)絡的一種,類似的還有深度神經(jīng)網(wǎng)絡DNN,卷積神經(jīng)網(wǎng)絡CNN,生成對抗網(wǎng)絡GAN,等等。另外你需要記住RNN的特點,RNN對具有序列特性的數(shù)據(jù)非常有效,它能挖掘數(shù)據(jù)中的時序信息以及語義信息,利用了RNN的這種能力,使深度學習模型在解決語音識別、語言模型、機器翻譯以及時序分析等NLP領域的問題時有所突破。
我們需要重點來了解一下RNN的特點這句話,什么是序列特性呢?我個人理解,就是符合時間順序,邏輯順序,或者其他順序就叫序列特性,舉幾個例子:
拿人類的某句話來說,也就是人類的自然語言,是不是符合某個邏輯或規(guī)則的字詞拼湊排列起來的,這就是符合序列特性。語音,我們發(fā)出的聲音,每一幀每一幀的銜接起來,才湊成了我們聽到的話,這也具有序列特性、股票,隨著時間的推移,會產(chǎn)生具有順序的一系列數(shù)字,這些數(shù)字也是具有序列特性。二。為什么要發(fā)明循環(huán)神經(jīng)網(wǎng)絡:
我們先來看一個NLP很常見的問題,命名實體識別,舉個例子,現(xiàn)在有兩句話:
第一句話:I like eating apple?。ㄎ蚁矚g吃蘋果?。?/p>
第二句話:The Apple is a great company?。ㄌO果真是一家很棒的公司!)
現(xiàn)在的任務是要給apple打Label,我們都知道第一個apple是一種水果,第二個apple是蘋果公司,假設我們現(xiàn)在有大量的已經(jīng)標記好的數(shù)據(jù)以供訓練模型,當我們使用全連接的神經(jīng)網(wǎng)絡時,我們做法是把apple這個單詞的特征向量輸入到我們的模型中(如下圖),在輸出結(jié)果時,讓我們的label里,正確的label概率最大,來訓練模型,但我們的語料庫中,有的apple的label是水果,有的label是公司,這將導致,模型在訓練的過程中,預測的準確程度,取決于訓練集中哪個label多一些,這樣的模型對于我們來說完全沒有作用。問題就出在了我們沒有結(jié)合上下文去訓練模型,而是單獨的在訓練apple這個單詞的label,這也是全連接神經(jīng)網(wǎng)絡模型所不能做到的,于是就有了我們的循環(huán)神經(jīng)網(wǎng)絡。
(全連接神經(jīng)網(wǎng)絡結(jié)構(gòu))三。循環(huán)神經(jīng)網(wǎng)絡的結(jié)構(gòu)及原理:
(RNN結(jié)構(gòu))
上圖就是RNN的結(jié)構(gòu),我第一次看到這圖的第一反應是,不是說好的循環(huán)神經(jīng)網(wǎng)絡么,起碼得是神經(jīng)網(wǎng)絡啊,神經(jīng)網(wǎng)絡不是有很多球球么,也就是神經(jīng)元,這RNN咋就這幾個球球,不科學啊,看不懂?。。。?!隨著慢慢的了解RNN,才發(fā)現(xiàn)這圖看著是真的清楚,因為RNN的特殊性,如果展開畫成那種很多神經(jīng)元的神經(jīng)網(wǎng)絡,會很麻煩。
我們先來講解一下上面這幅圖,首先不要管右邊的W,只看X,U,S,V,O,這幅圖就變成了,如下:
等等,這圖看著有點眼熟啊,這不就是全連接神經(jīng)網(wǎng)絡結(jié)構(gòu)嗎?對,沒錯,不看W的話,上面那幅圖展開就是全連接神經(jīng)網(wǎng)絡,其中X是一個向量,也就是某個字或詞的特征向量,作為輸入層,如上圖也就是3維向量,U是輸入層到隱藏層的參數(shù)矩陣,在上圖中其維度就是3X4,S是隱藏層的向量,如上圖維度就是4,V是隱藏層到輸出層的參數(shù)矩陣,在上圖中就是4X2,O是輸出層的向量,在上圖中維度為2。有沒有一種頓時豁然開朗的感覺,正是因為我當初在學習的時候,可能大家都覺得這個問題比較小,所以沒人講,我一直搞不清楚那些神經(jīng)元去哪了。。所以我覺得講出來,讓一些跟我一樣的小白可以更好的理解。
弄懂了RNN結(jié)構(gòu)的左邊,那么右邊這個W到底是什么???把上面那幅圖打開之后,是這樣的:
等等,這又是什么??別慌,很容易看,舉個例子,有一句話是,I love you,那么在利用RNN做一些事情時,比如命名實體識別,上圖中的 代表的就是I這個單詞的向量,
代表的是love這個單詞的向量,
代表的是you這個單詞的向量,以此類推,我們注意到,上圖展開后,W一直沒有變,W其實是每個時間點之間的權(quán)重矩陣,我們注意到,RNN之所以可以解決序列問題,是因為它可以記住每一時刻的信息,每一時刻的隱藏層不僅由該時刻的輸入層決定,還由上一時刻的隱藏層決定,公式如下,其中
代表t時刻的輸出,
代表t時刻的隱藏層的值:
值得注意的一點是,在整個訓練過程中,每一時刻所用的都是同樣的W。
四。舉個例子,方便理解:
假設現(xiàn)在我們已經(jīng)訓練好了一個RNN,如圖,我們假設每個單詞的特征向量是二維的,也就是輸入層的維度是二維,且隱藏層也假設是二維,輸出也假設是二維,所有權(quán)重的值都為1且沒有偏差且所有激活函數(shù)都是線性函數(shù),現(xiàn)在輸入一個序列,到該模型中,我們來一步步求解出輸出序列:
你可能會好奇W去哪了?W在實際的計算中,在圖像中表示非常困難 ,所以我們可以想象上一時刻的隱藏層的值是被存起來,等下一時刻的隱藏層進來時,上一時刻的隱藏層的值通過與權(quán)重相乘,兩者相加便得到了下一時刻真正的隱藏層,如圖 ,
可以看做每一時刻存下來的值,當然初始時
,
是沒有存值的,因此初始值為0:
當我們輸入第一個序列,【1,1】,如下圖,其中隱藏層的值,也就是綠色神經(jīng)元,是通過公式 計算得到的,因為所有權(quán)重都是1,所以也就是
(我把向量X拆開計算的,由于篇幅關(guān)系,我只詳細列了其中一個神經(jīng)元的計算過程,希望大家可以看懂,看不懂的請留言),輸出層的值4是通過公式
計算得到的,也就是
(同上,也是只舉例其中一個神經(jīng)元),得到輸出向量【4,4】:
當【1,1】輸入過后,我們的記憶里的 已經(jīng)不是0了,而是把這一時刻的隱藏狀態(tài)放在里面,即變成了2,如圖,輸入下一個向量【1,1】,隱藏層的值通過公式
得到,
,輸出層的值通過公式
,得到
,最終得到輸出向量【12,12】:
同理,該時刻過后 的值變成了6,也就是輸入第二個【1,1】過后所存下來的值,同理,輸入第三個向量【2,2】,如圖,細節(jié)過程不再描述,得到輸出向量【32,32】:
由此,我們得到了最終的輸出序列為:
至此,一個完整的RNN結(jié)構(gòu)我們已經(jīng)經(jīng)歷了一遍,我們注意到,每一時刻的輸出結(jié)果都與上一時刻的輸入有著非常大的關(guān)系,如果我們將輸入序列換個順序,那么我們得到的結(jié)果也將是截然不同,這就是RNN的特性,可以處理序列數(shù)據(jù),同時對序列也很敏感。
五。什么是LSTM:
如果你經(jīng)過上面的文章看懂了RNN的內(nèi)部原理,那么LSTM對你來說就很簡單了,首先大概介紹一下LSTM,是四個單詞的縮寫,Long short-term memory,翻譯過來就是長短期記憶,是RNN的一種,比普通RNN高級(上面講的那種),基本一般情況下說使用RNN都是使用LSTM,現(xiàn)在很少有人使用上面講的那個最基礎版的RNN,因為那個存在一些問題,LSTM效果好,當然會選擇它了!
六。為什么LSTM比普通RNN效果好?
這里就牽扯到梯度消失和爆炸的問題了,我簡單說兩句,上面那個最基礎版本的RNN,我們可以看到,每一時刻的隱藏狀態(tài)都不僅由該時刻的輸入決定,還取決于上一時刻的隱藏層的值,如果一個句子很長,到句子末尾時,它將記不住這個句子的開頭的內(nèi)容詳細內(nèi)容,具體原因可以看我之前寫的文章,如下:
韋偉:從反向傳播推導到梯度消失and爆炸的原因及解決方案(從DNN到RNN,內(nèi)附詳細反向傳播公式推導)616 贊同 · 30 評論文章
LSTM通過它的“門控裝置”有效的緩解了這個問題,這也就是為什么我們現(xiàn)在都在使用LSTM而非普通RNN。
七。揭開LSTM神秘的面紗:
既然前面已經(jīng)說了,LSTM是RNN的一種變體,更高級的RNN,那么它的本質(zhì)還是一樣的,還記得RNN的特點嗎,可以有效的處理序列數(shù)據(jù),當然LSTM也可以,還記得RNN是如何處理有效數(shù)據(jù)的嗎,是不是每個時刻都會把隱藏層的值存下來,到下一時刻的時候再拿出來用,這樣就保證了,每一時刻含有上一時刻的信息,如圖,我們把存每一時刻信息的地方叫做Memory Cell,中文就是記憶細胞,可以這么理解。
打個比喻吧,普通RNN就像一個乞丐,路邊撿的,別人丟的,什么東西他都想要,什么東西他都不嫌棄,LSTM就像一個貴族,沒有身份的東西他不要,他會精心挑選符合自己身份的物品。這是為什么呢?有沒有思考過,原因很簡單,乞丐沒有選擇權(quán),他的能力注定他只能當一個乞丐,因此他沒有挑選的權(quán)利,而貴族不一樣,貴族能力比較強,經(jīng)過自己的打拼,終于有了地位和身份,所以可以選擇舍棄一些低檔的東西,這也是能力的凸顯。
LSTM和普通RNN正是貴族和乞丐,RNN什么信息它都存下來,因為它沒有挑選的能力,而LSTM不一樣,它會選擇性的存儲信息,因為它能力強,它有門控裝置,它可以盡情的選擇。如下圖,普通RNN只有中間的Memory Cell用來存所有的信息,而從下圖我們可以看到,LSTM多了三個Gate,也就是三個門,什么意思呢?在現(xiàn)實生活中,門就是用來控制進出的,門關(guān)上了,你就進不去房子了,門打開你就能進去,同理,這里的門是用來控制每一時刻信息記憶與遺忘的。
依次來解釋一下這三個門:
Input Gate:中文是輸入門,在每一時刻從輸入層輸入的信息會首先經(jīng)過輸入門,輸入門的開關(guān)會決定這一時刻是否會有信息輸入到Memory Cell。Output Gate:中文是輸出門,每一時刻是否有信息從Memory Cell輸出取決于這一道門。Forget Gate:中文是遺忘門,每一時刻Memory Cell里的值都會經(jīng)歷一個是否被遺忘的過程,就是由該門控制的,如果打卡,那么將會把Memory Cell里的值清除,也就是遺忘掉。
按照上圖的順序,信息在傳遞的順序,是這樣的:
先經(jīng)過輸入門,看是否有信息輸入,再判斷遺忘門是否選擇遺忘Memory Cell里的信息,最后再經(jīng)過輸出門,判斷是否將這一時刻的信息進行輸出。
八。LSTM內(nèi)部結(jié)構(gòu):
抱歉最近事比較多,沒有及時更新。。讓我們先回顧一下之前講了點啥,關(guān)于LSTM,我們了解了它的能力比普通RNN要強,因為它可以對輸入的信息,選擇性的記錄或遺忘,這是因為它擁有強大的門控系統(tǒng),分別是記憶門,遺忘門,和輸出門,至于這三個門到底是如何工作的,如何起作用的。本節(jié)我們就來詳細講解LSTM的內(nèi)部結(jié)構(gòu)。
在了解LSTM的內(nèi)部結(jié)構(gòu)之前,我們需要先回顧一下普通RNN的結(jié)構(gòu),以免在這里很多讀者被搞懵,如下:
我們可以看到,左邊是為了簡便描述RNN的工作原理而畫的縮略圖,右邊是展開之后,每個時間點之間的流程圖,注意,我們接下來看到的LSTM的結(jié)構(gòu)圖,是一個時間點上的內(nèi)部結(jié)構(gòu),就是整個工作流程中的其中一個時間點,也就是如下圖:
注意,上圖是普通RNN的一個時間點的內(nèi)部結(jié)構(gòu),上面已經(jīng)講過了公式和原理,LSTM的內(nèi)部結(jié)構(gòu)更為復雜,不過如果這么類比來學習,我認為也沒有那么難。
我們類比著來學習,首先看圖中最中間的地方,Cell,我們上面也講到了memory cell,也就是一個記憶存儲的地方,這里就類似于普通RNN的 ,都是用來存儲信息的,這里面的信息都會保存到下一時刻,其實標準的叫法應該是
,因為這里對應神經(jīng)網(wǎng)絡里的隱藏層,所以是hidden的縮寫,無論普通RNN還是LSTM其實t時刻的記憶細胞里存的信息,都應該被稱為
。再看最上面的
,是這一時刻的輸出,也就是類似于普通RNN里的
。最后,我們再來看這四個
,這四個相輔相成,才造就了中間的Memory Cell里的值,你肯恩要問普通RNN里有個
作為輸入,那LSTM的輸入在哪?別著急,其實這四個
都有輸入向量
的參與。對了,在解釋這四個分別是什么之前,我要先解釋一下上圖的所有這個符號,
都代表一個激活函數(shù),LSTM里常用的激活函數(shù)有兩個,一個是tanh,一個是sigmoid。
其中 是最為普通的輸入,可以從上圖中看到,
是通過該時刻的輸入
和上一時刻存在memory cell里的隱藏層信息
向量拼接,再與權(quán)重參數(shù)向量
點積,得到的值經(jīng)過激活函數(shù)tanh最終會得到一個數(shù)值,也就是
,注意只有
的激活函數(shù)是tanh,因為
是真正作為輸入的,其他三個都是門控裝置。
再來看 ,input gate的縮寫i,所以也就是輸入門的門控裝置,
同樣也是通過該時刻的輸入
和上一時刻隱藏狀態(tài),也就是上一時刻存下來的信息
向量拼接,在與權(quán)重參數(shù)向量
點積(注意每個門的權(quán)重向量都不一樣,這里的下標i代表input的意思,也就是輸入門)。得到的值經(jīng)過激活函數(shù)sigmoid的最終會得到一個0-1之間的一個數(shù)值,用來作為輸入門的控制信號。
以此類推,就不詳細講解 了,分別是縮寫forget和output的門控裝置,原理與上述輸入門的門控裝置類似。
上面說了,只有 是輸入,其他的三個都是門控裝置,負責把控每一階段的信息記錄與遺忘,具體是怎樣的呢?我們先來看公式:
首先解釋一下,經(jīng)過這個sigmod激活函數(shù)后,得到的 都是在0到1之間的數(shù)值,1表示該門完全打開,0表示該門完全關(guān)閉,