第六章 循環(huán)神經(jīng)網(wǎng)絡(luò)
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network欺抗,RNN)是一類具有短期記憶能力的神經(jīng)網(wǎng)絡(luò)如绸。循環(huán)神經(jīng)網(wǎng)絡(luò)的參數(shù)學(xué)習(xí)可以通過隨時間反向傳播算法來學(xué)習(xí)。隨時間反向傳播算法即按照時間的逆序?qū)㈠e誤信息一步步地往前傳遞余佃。當(dāng)輸入序列比較長時扇单,會存在梯度爆炸和消失問題,也稱為長程依賴問題誉碴。為了解決這個問題,人們對循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行了很多的改進(jìn)漱挚,其中最有效的改進(jìn)方式引入門控機(jī)制翔烁。
循環(huán)神經(jīng)網(wǎng)絡(luò)可以很容易地擴(kuò)展到兩種更廣義的記憶網(wǎng)絡(luò)模型:遞歸神經(jīng)網(wǎng)絡(luò)和圖網(wǎng)絡(luò)渺氧。
給網(wǎng)絡(luò)增加記憶能力
延時神經(jīng)網(wǎng)絡(luò)
一種簡單的利用歷史信息的方法是建立一個額外的延時單元旨涝,用來存儲網(wǎng)絡(luò)的歷史信息(可以包括輸入侣背、輸出、隱狀態(tài)等)弧腥。比較有代表性的模型是延時神經(jīng)網(wǎng)絡(luò)
延時神經(jīng)網(wǎng)絡(luò)在時間維度上共享權(quán)值,以降低參數(shù)數(shù)量管搪。因此對于序列輸入來講铡买,延時神經(jīng)網(wǎng)絡(luò)就相當(dāng)于卷積神經(jīng)網(wǎng)絡(luò)更鲁。
實(shí)現(xiàn)方式:延時神經(jīng)網(wǎng)絡(luò)是在前饋網(wǎng)絡(luò)中的非輸出層都添加一個延時器奇钞,記錄最近幾次神經(jīng)元的輸出。在第t 個時刻媒至,第l + 1 層神經(jīng)元和第l 層神經(jīng)元的最近p 次輸出相關(guān)拒啰,即:谋旦,通過延時器蛤织,前饋網(wǎng)絡(luò)就具有了短期記憶的能力指蚜。
有外部輸入的非線性自回歸模型
自回歸模型(AutoRegressive Model摊鸡,AR)是統(tǒng)計學(xué)上常用的一類時間序列模型免猾,用一個變量的歷史信息來預(yù)測自己猎提。
其中p 為超參數(shù)锨苏,為可學(xué)習(xí)參數(shù)伞租,為第t 個時刻的噪聲葵诈,方差和時間無關(guān)理疙。
有外部輸入的非線性自回歸模型(NARX)是自回歸模型的擴(kuò)展沪斟,在每個時刻t 都有一個外部輸入xt主之,產(chǎn)生一個輸出yt槽奕。NARX通過一個延時器記錄最近幾次的外部輸入和輸出粤攒,第t 個時刻的輸出yt 為:
其中f(·) 表示非線性函數(shù)夯接,可以是一個前饋網(wǎng)絡(luò)晴弃,p 和q 為超參數(shù)逊拍。
循環(huán)神經(jīng)網(wǎng)絡(luò)
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network芯丧,RNN)通過使用帶自反饋的神經(jīng)元缨恒,能夠處理任意長度的時序數(shù)據(jù)肿轨。
給定一個輸入序列椒袍,循環(huán)神經(jīng)網(wǎng)絡(luò)通過公式更新帶反饋邊的隱藏層的活性值ht驹暑。其中h0 = 0,f(·) 為一個非線性函數(shù)帆焕,也可以是一個前饋網(wǎng)絡(luò)叶雹。
理論上折晦,循環(huán)神經(jīng)網(wǎng)絡(luò)可以近似任意的非線性動力系統(tǒng)满着。
簡單循環(huán)網(wǎng)絡(luò)
簡單循環(huán)網(wǎng)絡(luò)(Simple Recurrent Network风喇,SRN) 是一個非常簡單的循環(huán)神經(jīng)網(wǎng)絡(luò)透且,只有一個隱藏層的神經(jīng)網(wǎng)絡(luò)秽誊。
?
循環(huán)神經(jīng)網(wǎng)絡(luò)的計算能力
由于循環(huán)神經(jīng)網(wǎng)絡(luò)具有短期記憶能力锅论,相當(dāng)于存儲裝置,因此其計算能力十分強(qiáng)大藻懒。前饋神經(jīng)網(wǎng)絡(luò)可以模擬任何連續(xù)函數(shù)嬉荆,而循環(huán)神經(jīng)網(wǎng)絡(luò)可以模擬任何程序鄙早。
我們先定義一個完全連接的循環(huán)神經(jīng)網(wǎng)絡(luò)限番,其輸入為xt,輸出為yt霜瘪,
?
循環(huán)神經(jīng)網(wǎng)絡(luò)的通用近似定理
一個完全連接的循環(huán)網(wǎng)絡(luò)是任何非線性動力系統(tǒng)的近似器惜互。
圖靈完備
是指一種數(shù)據(jù)操作規(guī)則训堆,比如一種計算機(jī)編程語言膘流,可以實(shí)現(xiàn)圖靈機(jī)(Turing Machine)的所有功能呼股,解決所有的可計算問題彭谁,目前主流的編程語言(比如C++缠局、Java、Python 等)都是圖靈完備的唱矛。
一個完全連接的循環(huán)神經(jīng)網(wǎng)絡(luò)可以近似解決所有的可計算問題揖赴。
應(yīng)用到機(jī)器學(xué)習(xí)
序列到類別模式
序列到類別模式主要用于序列數(shù)據(jù)的分類問題:輸入為序列,輸出為類別阿逃。比如在文本分類中,輸入數(shù)據(jù)為單詞的序列破托,輸出為該文本的類別土砂。
同步的序列到序列模式
主要用于序列標(biāo)注(Sequence Labeling)任務(wù)萝映,即每一時刻都有輸入和輸出蚌卤,輸入序列和輸出序列的長度相同逊彭。比如詞性標(biāo)注(Partof-Speech Tagging)中诫龙,每一個單詞都需要標(biāo)注其對應(yīng)的詞性標(biāo)簽。
異步的序列到序列模式
也稱為編碼器-解碼器(Encoder-Decoder)模型锦聊,即輸入序列和輸出序列不需要有嚴(yán)格的對應(yīng)關(guān)系孔庭,也不需要保持相同的長度。比如在機(jī)器翻譯中芽淡,輸入為源語言的單詞序列挣菲,輸出為目標(biāo)語言的單詞序列。
參數(shù)學(xué)習(xí)
可以通過梯度下降方法來進(jìn)行學(xué)習(xí)或杠。
以隨機(jī)梯度下降為例向抢,給定一個訓(xùn)練樣本(x, y)笋额,其中為長度是T 的輸入序列茉盏,是長度為T 的標(biāo)簽序列鸠姨。即在每個時刻t,都有一個監(jiān)督信息yt巍糯,我們定義時刻t 的損失函數(shù)為:,其中g(shù)(ht) 為第t 時刻的輸出宅楞,為可微分的損失函數(shù)厌衙,比如交叉熵。那么整個序
列的損失函數(shù)為:饲趋,整個序列的損失函數(shù)關(guān)于參數(shù)U 的梯度為:堂污,即每個時刻損失對參數(shù)U 的偏導(dǎo)數(shù)之和盟猖。
在循環(huán)神經(jīng)網(wǎng)絡(luò)中主要有兩種計算梯度的方式:隨時間反向傳播(BPTT)算法和實(shí)時循環(huán)學(xué)習(xí)(RTRL)算法反镇。
隨時間反向傳播算法
BPTT算法的主要思想是通過類似前饋神經(jīng)網(wǎng)絡(luò)的錯誤反向傳播算法來計算梯度夕玩。
BPTT 算法將循環(huán)神經(jīng)網(wǎng)絡(luò)看作是一個展開的多層前饋網(wǎng)絡(luò)燎孟,其中“每一層”對應(yīng)循環(huán)網(wǎng)絡(luò)中的“每個時刻”揩页。這樣,循環(huán)神經(jīng)網(wǎng)絡(luò)就可以按照前饋網(wǎng)絡(luò)中的反向傳播算法計算參數(shù)梯度兔仰。在“展開”的前饋網(wǎng)絡(luò)中,所有層的參數(shù)是共享的无虚,因此參數(shù)的真實(shí)梯度是所有“展開層”的參數(shù)梯度之和友题。
計算第t 時刻損失對參數(shù)U 的偏導(dǎo)數(shù):
所以整個序列的損失函數(shù)關(guān)于參數(shù)U的梯度是:
同理可得告匠,整個序列的損失函數(shù)關(guān)于權(quán)重W 和偏置b 的梯度為:和
實(shí)時循環(huán)學(xué)習(xí)算法
與反向傳播的BPTT算法不同的是划鸽,實(shí)時循環(huán)學(xué)習(xí)(Real-Time Recurrent Learning裸诽,RTRL)是通過前向傳播的方式來計算梯度嘱函。
假設(shè)循環(huán)神經(jīng)網(wǎng)絡(luò)中第t + 1時刻的狀態(tài)ht+1為:
其關(guān)于參數(shù)的偏導(dǎo)數(shù)為:
兩種算法比較:RTRL算法和BPTT算法都是基于梯度下降的算法粒梦,分別通過前向模式和反向模式應(yīng)用鏈?zhǔn)椒▌t來計算梯度缴淋。在循環(huán)神經(jīng)網(wǎng)絡(luò)中重抖,一般網(wǎng)絡(luò)輸出維度遠(yuǎn)低于輸入維度,因此BPTT算法的計算量會更小恨统,但是BPTT算法需要保存所有時刻的中間梯度畜埋,空間復(fù)雜度較高。RTRL算法不需要梯度回傳咖祭,因此非常適合用于需要在線學(xué)習(xí)或無限序列的任務(wù)中。
長程依賴問題
循環(huán)神經(jīng)網(wǎng)絡(luò)在學(xué)習(xí)過程中的主要問題是由于梯度消失或爆炸問題硬鞍,很難建模長時間間隔(Long Range)的狀態(tài)之間的依賴關(guān)系。
在BPTT算法中伐坏,將公式展開得到
如果定義,則
若γ > 1,當(dāng)t ? k → ∞時埠褪,γt?k → ∞。當(dāng)間隔t ? k 比較大時渴语,梯度也變得很大,會造成系統(tǒng)不穩(wěn)定昆咽,稱為梯度爆炸問題驾凶。
相反,若γ < 1掷酗,當(dāng)t ? k → ∞時调违,γt?k → 0汇在。當(dāng)間隔t ? k 比較大時翰萨,梯度也變得非常小,會出現(xiàn)和深層前饋神經(jīng)網(wǎng)絡(luò)類似的梯度消失問題糕殉,這就是長程依賴問題
由于循環(huán)神經(jīng)網(wǎng)絡(luò)經(jīng)常使用非線性激活函數(shù)為Logistic函數(shù)或Tanh函數(shù)作為非線性激活函數(shù)亩鬼,其導(dǎo)數(shù)值都小于1,并且權(quán)重矩陣∥U∥ 也不會太大阿蝶,因此如果時間間隔t ? k 過大雳锋,δt,k 會趨向于0,因而經(jīng)常會出現(xiàn)梯度消失問題羡洁。
改進(jìn)方案
為了避免梯度爆炸或消失問題玷过,一種最直接的方式就是選取合適的參數(shù),同時使用非飽和的激活函數(shù),盡量使得 ≈ 1辛蚊,這種方式需要足夠的人工調(diào)參經(jīng)驗(yàn)粤蝎,限制了模型的廣泛應(yīng)用。比較有效的方式是通過改進(jìn)模型或優(yōu)化方法來緩解循環(huán)網(wǎng)絡(luò)的梯度爆炸和梯度消失問題袋马。
梯度爆炸一般而言初澎,循環(huán)網(wǎng)絡(luò)的梯度爆炸問題比較容易解決,一般通過權(quán)重衰減或梯度截斷(是一種啟發(fā)式的解
決梯度爆炸問題的有效方法)來避免虑凛。
梯度消失是循環(huán)網(wǎng)絡(luò)的主要問題碑宴。除了使用一些優(yōu)化技巧外,更有效的方式就是改變模型桑谍,比如讓延柠,同時令為單位矩陣,即:锣披,其中是一個非線性函數(shù)贞间,θ為參數(shù)。
可以看出是線性依賴關(guān)系盈罐,且權(quán)重系數(shù)為1榜跌,這樣就不存在梯度爆炸或消失問題。但是盅粪,這種改變也丟失了神經(jīng)元在反饋邊上的非線性激活的性質(zhì)钓葫,因此也降低了模型的表示能力。
為了避免這個缺點(diǎn)票顾,我們可以采用一種更加有效的改進(jìn)策略:
這樣之間既有線性關(guān)系础浮,也有非線性關(guān)系,并且可以緩解梯度消失問題奠骄。但這種改進(jìn)依然存在兩個問題:
- 梯度爆炸問題豆同,因?yàn)槠渲写嬖诜蔷€性關(guān)系
- 記憶容量問題,:隨著ht不斷累積存儲新的輸入信息含鳞,會發(fā)生飽和現(xiàn)象影锈。假設(shè)g(·) 為Logistic 函數(shù),則隨著時間t 的增長蝉绷,ht 會變得越來越大鸭廷,從而導(dǎo)致h變得飽和。也就是說熔吗,隱狀態(tài)ht 可以存儲的信息是有限的辆床,隨著記憶單元存儲的內(nèi)容越來越多,其丟失的信息也越來越多桅狠。
基于門控的循環(huán)神經(jīng)網(wǎng)絡(luò)
為了改善循環(huán)神經(jīng)網(wǎng)絡(luò)的長程依賴問題讼载,一種非常好的解決方案是在上一個改進(jìn)方案的的基礎(chǔ)上引入門控機(jī)制來控制信息的累積速度轿秧,包括有選擇地加入新的信息,并有選擇地遺忘之前累積的信息咨堤。這一類網(wǎng)絡(luò)可以稱為基于門控的循環(huán)神經(jīng)網(wǎng)絡(luò)(Gated RNN)菇篡。本節(jié)中,主要介紹兩種基于門控的循環(huán)神經(jīng)網(wǎng)絡(luò):長短期記憶網(wǎng)絡(luò)和門控循環(huán)單元網(wǎng)絡(luò)吱型。
長短期記憶網(wǎng)絡(luò)(LSTM)
是循環(huán)神經(jīng)網(wǎng)絡(luò)的一個變體逸贾,可以有效地解決簡單循環(huán)神經(jīng)網(wǎng)絡(luò)的梯度爆炸或消失問題。
LSTM的改進(jìn)點(diǎn)在兩個方面:
LSTM網(wǎng)絡(luò)引入了一個新的內(nèi)部狀態(tài)ct專門進(jìn)行線性的循環(huán)信息傳遞津滞,同時(非線性地)輸出信息給隱藏層的外部狀態(tài)ht。
門控機(jī)制:LSTM網(wǎng)絡(luò)中的三個“門”是一種“軟”門颖侄,取值在(0, 1) 之間鸟雏,表示以一定的比例運(yùn)行信息通過。
遺忘門ft 控制上一個時刻的內(nèi)部狀態(tài)ct?1 需要遺忘多少信息览祖。
輸入門it 控制當(dāng)前時刻的候選狀態(tài) 有多少信息需要保存。
輸出門ot 控制當(dāng)前時刻的內(nèi)部狀態(tài)ct 有多少信息需要輸出給外部狀態(tài)ht又活。
其中σ(·) 為Logistic 函數(shù)锰悼,其輸出區(qū)間為(0, 1)
上述公式可簡潔的描述為:
記憶循環(huán)神經(jīng)網(wǎng)絡(luò)中的隱狀態(tài)h存儲了歷史信息箕般,可以看作是一種記憶(Memory)耐薯。在簡單循環(huán)網(wǎng)絡(luò)中,隱狀態(tài)每個時刻都會被重寫丝里,因此可以看作是一種短期記憶(Short-Term Memory)曲初。在神經(jīng)網(wǎng)絡(luò)中,長期記憶(Long-Term Memory)可以看作是網(wǎng)絡(luò)參數(shù)丙者,隱含了從訓(xùn)練數(shù)據(jù)中學(xué)到的經(jīng)驗(yàn)复斥,其更新周期要遠(yuǎn)遠(yuǎn)慢于短期記憶。而在LSTM 網(wǎng)絡(luò)中械媒,記憶單元c 可以在某個時刻捕捉到某個關(guān)鍵信息目锭,并有能力將此關(guān)鍵信息保存一定的時間間隔评汰。記憶單元c 中保存信息的生命周期要長于短期記憶h,但又遠(yuǎn)遠(yuǎn)短于長期記憶痢虹, 長短期記憶是指長的“短期記憶”被去。因此稱為長短期記憶。
LSTM網(wǎng)絡(luò)的各種變體
無遺忘門的LSTM網(wǎng)絡(luò):即最早提出的LSTM網(wǎng)絡(luò)奖唯,其內(nèi)部狀態(tài)的更新為:
沒有遺忘門惨缆,記憶單元c 會不斷增大。當(dāng)輸入序列的長度非常大時丰捷,記憶單元的容量會飽和坯墨,從而大大降低LSTM模型的性能。
peephole 連接:讓三個門不但依賴于輸入xt 和上一時刻的隱狀態(tài)ht?1病往,也依賴于上一個時刻的記憶單元ct?1捣染。
耦合輸入門和遺忘門:LSTM網(wǎng)絡(luò)中的輸入門和遺忘門有些互補(bǔ)關(guān)系蕾各,因此同時用兩個門比較冗余。為了減少LSTM網(wǎng)絡(luò)的計算復(fù)雜度庆揪,將這兩門合并為一個門式曲。令
這樣,內(nèi)部狀態(tài)的更新方式為:
門控循環(huán)單元網(wǎng)絡(luò)(GRU)
GRU是是一種比LSTM網(wǎng)絡(luò)更加簡單的循環(huán)神經(jīng)網(wǎng)絡(luò)嚷硫。
GRU網(wǎng)絡(luò)引入門控機(jī)制來控制信息更新的方式检访。和LSTM 不同,GRU不引入額外的記憶單元仔掸,GRU 網(wǎng)絡(luò)也是在公式的基礎(chǔ)上引入一個更新門(Update Gate)來控制當(dāng)前狀態(tài)需要從歷史狀態(tài)中保留多少信息(不經(jīng)過非線性變換)脆贵,以及需要從候選狀態(tài)中接受多少新信息。
?
其中為更新門起暮,
在LSTM網(wǎng)絡(luò)中卖氨,輸入門和遺忘門是互補(bǔ)關(guān)系,具有一定的冗余性负懦。GRU網(wǎng)絡(luò)直接使用一個門來控制輸入和遺忘之間的平衡筒捺。當(dāng)zt = 0 時,當(dāng)前狀態(tài)ht 和前一時刻的狀態(tài)ht?1 之間為非線性函數(shù)關(guān)系纸厉;當(dāng)zt = 1 時系吭,ht 和ht?1 之間為線性函數(shù)關(guān)系。
在GRU網(wǎng)絡(luò)中颗品,函數(shù)g(xt,ht?1; θ) 的定義為:沃缘,(這里使用tanh 激活函數(shù)是
由于其導(dǎo)數(shù)有比較大的值域,能夠緩解梯度消失問題则吟。)
其中表示當(dāng)前時刻的候選狀態(tài)槐臀,為重置門,用來控制候選狀態(tài)的計算是否依賴上一時刻的狀態(tài)
?
當(dāng)rt = 0 時氓仲,候選狀態(tài) 只和當(dāng)前輸入xt 相關(guān),和歷史狀態(tài)無關(guān)敬扛。當(dāng)rt = 1 時晰洒,候選狀態(tài)和當(dāng)前輸入xt 以及歷史狀態(tài)ht?1 相關(guān)舔哪,和簡單循環(huán)網(wǎng)絡(luò)一致欢顷。
綜上,GRU網(wǎng)絡(luò)的狀態(tài)更新方式為:
可以看出捉蚤,當(dāng)zt = 0, r = 1 時,GRU網(wǎng)絡(luò)退化為簡單循環(huán)網(wǎng)絡(luò)炼七;若zt =0, r = 0 時缆巧,當(dāng)前狀態(tài)ht 只和當(dāng)前輸入xt相關(guān),和歷史狀態(tài)ht-1 無關(guān)豌拙。當(dāng)zt = 1時陕悬,當(dāng)前狀態(tài)ht = ht-1 等于上一時刻狀態(tài)ht?1,和當(dāng)前輸入xt 無關(guān)按傅。
深層循環(huán)神經(jīng)網(wǎng)絡(luò)
如果是長時間序列的神經(jīng)網(wǎng)絡(luò)捉超,按時間片段展開,即的路徑是很長的唯绍,可以說這是個很“深”的神經(jīng)網(wǎng)絡(luò)拼岳,但是不按時間片段展開,只看同一時刻網(wǎng)絡(luò)輸入到輸出的路徑况芒,即惜纸,這又是一個很“淺”的網(wǎng)絡(luò)。
深層循環(huán)神經(jīng)網(wǎng)絡(luò)是通過增加或者之間的路徑绝骚,從而增強(qiáng)循環(huán)神經(jīng)網(wǎng)絡(luò)的能力耐版。
堆疊循環(huán)神經(jīng)網(wǎng)絡(luò)(SRNN)
就是將多個循環(huán)網(wǎng)絡(luò)堆疊起來。一個堆疊的簡單循環(huán)網(wǎng)絡(luò)(Stacked SRN)也稱為循環(huán)多層感知器(RMLP)压汪。
雙向循環(huán)神經(jīng)網(wǎng)絡(luò)
假設(shè)第1 層按時間順序粪牲,第2 層按時間逆序,在時刻t 時的隱狀態(tài)定義為和止剖,則:
擴(kuò)展到圖結(jié)構(gòu)
因?yàn)橥粚蛹壍碾[狀態(tài),在時間鏈中舌狗,可以構(gòu)成一條鏈路叽奥,而鏈?zhǔn)浇Y(jié)構(gòu)是一種特殊的圖結(jié)構(gòu),我們可以比較容易地將這種消息傳遞(Message Passing)的思想擴(kuò)展到任意的圖結(jié)構(gòu)上痛侍。
遞歸神經(jīng)網(wǎng)絡(luò)(RecNN)
是循環(huán)神經(jīng)網(wǎng)絡(luò)在有向無循環(huán)圖上的擴(kuò)展朝氓。遞歸神經(jīng)網(wǎng)絡(luò)的一般結(jié)構(gòu)為樹狀的層次結(jié)構(gòu)。
以圖a中的結(jié)構(gòu)為例主届,有三個隱藏層h1赵哲、h2 和h3,其中h1 由兩個輸入x1和x2 計算得到君丁,h2 由另外兩個輸入層x3 和x4 計算得到枫夺,h3 由兩個隱藏層h1 和h2 計算得到。
對于一個節(jié)點(diǎn)hi绘闷,它可以接受來自父節(jié)點(diǎn)集合πi 中所有節(jié)點(diǎn)的消息橡庞,并更新自己的狀態(tài):
其中表示集合中所有節(jié)點(diǎn)狀態(tài)的拼接,是一個和節(jié)點(diǎn)位置無關(guān)的非線性函數(shù)印蔗,可以為一個單層的前饋神經(jīng)網(wǎng)絡(luò)扒最。比如圖a所示的遞歸神經(jīng)網(wǎng)絡(luò)具體可以寫為:
其中,表示非線性激活函數(shù)华嘹,W和b是可學(xué)習(xí)的參數(shù)吧趣。
同樣,輸出層y可以為一個分類器耙厚,比如:
圖網(wǎng)絡(luò)
圖網(wǎng)絡(luò)(Graph Network强挫,GN)是將消息傳遞的思想擴(kuò)展到圖結(jié)構(gòu)數(shù)據(jù)上的神經(jīng)網(wǎng)絡(luò)。