一厕倍、
RNN 的關(guān)鍵點(diǎn)之一就是他們可以用來(lái)連接先前的信息到當(dāng)前的任務(wù)上寡壮,例如使用過(guò)去的視頻段來(lái)推測(cè)對(duì)當(dāng)前段的理解。如果 RNN 可以做到這個(gè),他們就變得非常有用况既。但是真的可以么这溅?答案是,還有很多依賴(lài)因素棒仍。
有時(shí)候悲靴,我們僅僅需要知道先前的信息來(lái)執(zhí)行當(dāng)前的任務(wù)。例如降狠,我們有一個(gè)語(yǔ)言模型用來(lái)基于先前的詞來(lái)預(yù)測(cè)下一個(gè)詞对竣。如果我們?cè)囍A(yù)測(cè) “the clouds are in the sky” 最后的詞,我們并不需要任何其他的上下文 —— 因此下一個(gè)詞很顯然就應(yīng)該是 sky榜配。在這樣的場(chǎng)景中否纬,相關(guān)的信息和預(yù)測(cè)的詞位置之間的間隔是非常小的,RNN 可以學(xué)會(huì)使用先前的信息蛋褥。
但是同樣會(huì)有一些更加復(fù)雜的場(chǎng)景临燃。假設(shè)我們?cè)囍ヮA(yù)測(cè)“I grew up in France... I speak fluent French”最后的詞募闲。當(dāng)前的信息建議下一個(gè)詞可能是一種語(yǔ)言的名字搓逾,但是如果我們需要弄清楚是什么語(yǔ)言声旺,我們是需要先前提到的離當(dāng)前位置很遠(yuǎn)的 France 的上下文的焰情。這說(shuō)明相關(guān)信息和當(dāng)前預(yù)測(cè)位置之間的間隔就肯定變得相當(dāng)?shù)拇蟆?/p>
不幸的是野揪,在這個(gè)間隔不斷增大時(shí)茶宵,RNN 會(huì)喪失學(xué)習(xí)到連接如此遠(yuǎn)的信息的能力倍踪。
在理論上梯捕,RNN 絕對(duì)可以處理這樣的 長(zhǎng)期依賴(lài) 問(wèn)題匙瘪。人們可以仔細(xì)挑選參數(shù)來(lái)解決這類(lèi)問(wèn)題中的最初級(jí)形式铆铆,但在實(shí)踐中,RNN 肯定不能夠成功學(xué)習(xí)到這些知識(shí)丹喻。Bengio, et al. (1994)等人對(duì)該問(wèn)題進(jìn)行了深入的研究薄货,他們發(fā)現(xiàn)一些使訓(xùn)練 RNN 變得非常困難的相當(dāng)根本的原因。
然而碍论,幸運(yùn)的是谅猾,LSTM 并沒(méi)有這個(gè)問(wèn)題!
LSTM 網(wǎng)絡(luò)
Long Short Term 網(wǎng)絡(luò)—— 一般就叫做 LSTM ——是一種 RNN 特殊的類(lèi)型鳍悠,可以學(xué)習(xí)長(zhǎng)期依賴(lài)信息税娜。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves進(jìn)行了改良和推廣藏研。在很多問(wèn)題敬矩,LSTM 都取得相當(dāng)巨大的成功,并得到了廣泛的使用遥倦。
LSTM 通過(guò)刻意的設(shè)計(jì)來(lái)避免長(zhǎng)期依賴(lài)問(wèn)題谤绳。記住長(zhǎng)期的信息在實(shí)踐中是 LSTM 的默認(rèn)行為占锯,而非需要付出很大代價(jià)才能獲得的能力!
所有 RNN 都具有一種重復(fù)神經(jīng)網(wǎng)絡(luò)模塊的鏈?zhǔn)降男问剿跎浮T跇?biāo)準(zhǔn)的 RNN 中消略,這個(gè)重復(fù)的模塊只有一個(gè)非常簡(jiǎn)單的結(jié)構(gòu),例如一個(gè) tanh 層瞎抛。
LSTM 同樣是這樣的結(jié)構(gòu)艺演,但是重復(fù)的模塊擁有一個(gè)不同的結(jié)構(gòu)。不同于 單一神經(jīng)網(wǎng)絡(luò)層桐臊,這里是有四個(gè)胎撤,以一種非常特殊的方式進(jìn)行交互。
不必?fù)?dān)心這里的細(xì)節(jié)断凶。我們會(huì)一步一步地剖析 LSTM 解析圖∩颂幔現(xiàn)在,我們先來(lái)熟悉一下圖中使用的各種元素的圖標(biāo)认烁。
在上面的圖例中肿男,每一條黑線傳輸著一整個(gè)向量,從一個(gè)節(jié)點(diǎn)的輸出到其他節(jié)點(diǎn)的輸入却嗡。粉色的圈代表 pointwise 的操作舶沛,諸如向量的和,而黃色的矩陣就是學(xué)習(xí)到的神經(jīng)網(wǎng)絡(luò)層窗价。合在一起的線表示向量的連接如庭,分開(kāi)的線表示內(nèi)容被復(fù)制,然后分發(fā)到不同的位置撼港。
LSTM 的核心思想
LSTM 的關(guān)鍵就是細(xì)胞狀態(tài)坪它,水平線在圖上方貫穿運(yùn)行。
細(xì)胞狀態(tài)類(lèi)似于傳送帶餐胀。直接在整個(gè)鏈上運(yùn)行哟楷,只有一些少量的線性交互瘤载。信息在上面流傳保持不變會(huì)很容易否灾。
LSTM 有通過(guò)精心設(shè)計(jì)的稱(chēng)作為“門(mén)”的結(jié)構(gòu)來(lái)去除或者增加信息到細(xì)胞狀態(tài)的能力。門(mén)是一種讓信息選擇式通過(guò)的方法鸣奔。他們包含一個(gè) sigmoid 神經(jīng)網(wǎng)絡(luò)層和一個(gè) pointwise 乘法操作墨技。
Sigmoid 層輸出 0 到 1 之間的數(shù)值,描述每個(gè)部分有多少量可以通過(guò)挎狸。0 代表“不許任何量通過(guò)”扣汪,1 就指“允許任意量通過(guò)”!
LSTM 擁有三個(gè)門(mén)锨匆,來(lái)保護(hù)和控制細(xì)胞狀態(tài)崭别。
逐步理解 LSTM
在我們 LSTM 中的第一步是決定我們會(huì)從細(xì)胞狀態(tài)中丟棄什么信息冬筒。這個(gè)決定通過(guò)一個(gè)稱(chēng)為忘記門(mén)層完成。該門(mén)會(huì)讀取h_{t-1}和x_t茅主,輸出一個(gè)在 0 到 1 之間的數(shù)值給每個(gè)在細(xì)胞狀態(tài)C_{t-1}中的數(shù)字舞痰。1 表示“完全保留”,0 表示“完全舍棄”诀姚。
讓我們回到語(yǔ)言模型的例子中來(lái)基于已經(jīng)看到的預(yù)測(cè)下一個(gè)詞响牛。在這個(gè)問(wèn)題中,細(xì)胞狀態(tài)可能包含當(dāng)前主語(yǔ)的性別赫段,因此正確的代詞可以被選擇出來(lái)呀打。當(dāng)我們看到新的主語(yǔ),我們希望忘記舊的主語(yǔ)糯笙。
下一步是確定什么樣的新信息被存放在細(xì)胞狀態(tài)中贬丛。這里包含兩個(gè)部分。第一给涕,sigmoid 層稱(chēng) “輸入門(mén)層” 決定什么值我們將要更新瘫寝。然后,一個(gè) tanh 層創(chuàng)建一個(gè)新的候選值向量稠炬,\tilde{C}_t焕阿,會(huì)被加入到狀態(tài)中。下一步首启,我們會(huì)講這兩個(gè)信息來(lái)產(chǎn)生對(duì)狀態(tài)的更新暮屡。
在我們語(yǔ)言模型的例子中,我們希望增加新的主語(yǔ)的性別到細(xì)胞狀態(tài)中毅桃,來(lái)替代舊的需要忘記的主語(yǔ)褒纲。
現(xiàn)在是更新舊細(xì)胞狀態(tài)的時(shí)間了,C_{t-1}更新為C_t钥飞。前面的步驟已經(jīng)決定了將會(huì)做什么莺掠,我們現(xiàn)在就是實(shí)際去完成。
我們把舊狀態(tài)與f_t相乘读宙,丟棄掉我們確定需要丟棄的信息彻秆。接著加上i_t * \tilde{C}_t。這就是新的候選值结闸,根據(jù)我們決定更新每個(gè)狀態(tài)的程度進(jìn)行變化唇兑。
在語(yǔ)言模型的例子中,這就是我們實(shí)際根據(jù)前面確定的目標(biāo)桦锄,丟棄舊代詞的性別信息并添加新的信息的地方扎附。
最終,我們需要確定輸出什么值结耀。這個(gè)輸出將會(huì)基于我們的細(xì)胞狀態(tài)留夜,但是也是一個(gè)過(guò)濾后的版本匙铡。首先,我們運(yùn)行一個(gè) sigmoid 層來(lái)確定細(xì)胞狀態(tài)的哪個(gè)部分將輸出出去碍粥。接著慰枕,我們把細(xì)胞狀態(tài)通過(guò) tanh 進(jìn)行處理(得到一個(gè)在 -1 到 1 之間的值)并將它和 sigmoid 門(mén)的輸出相乘,最終我們僅僅會(huì)輸出我們確定輸出的那部分即纲。
在語(yǔ)言模型的例子中具帮,因?yàn)樗涂吹搅艘粋€(gè)?代詞,可能需要輸出與一個(gè)?動(dòng)詞?相關(guān)的信息低斋。例如蜂厅,可能輸出是否代詞是單數(shù)還是負(fù)數(shù),這樣如果是動(dòng)詞的話膊畴,我們也知道動(dòng)詞需要進(jìn)行的詞形變化掘猿。
LSTM 的變體
我們到目前為止都還在介紹正常的 LSTM。但是不是所有的 LSTM 都長(zhǎng)成一個(gè)樣子的唇跨。實(shí)際上稠通,幾乎所有包含 LSTM 的論文都采用了微小的變體。差異非常小买猖,但是也值得拿出來(lái)講一下改橘。
其中一個(gè)流形的 LSTM 變體,就是由?Gers & Schmidhuber (2000)?提出的玉控,增加了 “peephole connection”飞主。是說(shuō),我們讓 門(mén)層 也會(huì)接受細(xì)胞狀態(tài)的輸入高诺。
上面的圖例中碌识,我們?cè)黾恿?peephole 到每個(gè)門(mén)上,但是許多論文會(huì)加入部分的 peephole 而非所有都加虱而。
另一個(gè)變體是通過(guò)使用 coupled 忘記和輸入門(mén)筏餐。不同于之前是分開(kāi)確定什么忘記和需要添加什么新的信息,這里是一同做出決定牡拇。我們僅僅會(huì)當(dāng)我們將要輸入在當(dāng)前位置時(shí)忘記魁瞪。我們僅僅輸入新的值到那些我們已經(jīng)忘記舊的信息的那些狀態(tài) 。
另一個(gè)改動(dòng)較大的變體是 Gated Recurrent Unit (GRU)诅迷,這是由?Cho, et al. (2014)?提出佩番。它將忘記門(mén)和輸入門(mén)合成了一個(gè)單一的 更新門(mén)众旗。同樣還混合了細(xì)胞狀態(tài)和隱藏狀態(tài)罢杉,和其他一些改動(dòng)。最終的模型比標(biāo)準(zhǔn)的 LSTM 模型要簡(jiǎn)單贡歧,也是非常流行的變體滩租。
這里只是部分流行的 LSTM 變體赋秀。當(dāng)然還有很多其他的,如Yao, et al. (2015)?提出的 Depth Gated RNN律想。還有用一些完全不同的觀點(diǎn)來(lái)解決長(zhǎng)期依賴(lài)的問(wèn)題猎莲,如Koutnik, et al. (2014)?提出的 Clockwork RNN。
要問(wèn)哪個(gè)變體是最好的技即?其中的差異性真的重要嗎著洼?Greff, et al. (2015)?給出了流行變體的比較,結(jié)論是他們基本上是一樣的而叼。Jozefowicz, et al. (2015)?則在超過(guò) 1 萬(wàn)種 RNN 架構(gòu)上進(jìn)行了測(cè)試身笤,發(fā)現(xiàn)一些架構(gòu)在某些任務(wù)上也取得了比 LSTM 更好的結(jié)果。
結(jié)論
剛開(kāi)始葵陵,我提到通過(guò) RNN 得到重要的結(jié)果液荸。本質(zhì)上所有這些都可以使用 LSTM 完成。對(duì)于大多數(shù)任務(wù)確實(shí)展示了更好的性能脱篙!
由于 LSTM 一般是通過(guò)一系列的方程表示的娇钱,使得 LSTM 有一點(diǎn)令人費(fèi)解。然而本文中一步一步地解釋讓這種困惑消除了不少绊困。
LSTM 是我們?cè)?RNN 中獲得的重要成功文搂。很自然地,我們也會(huì)考慮:哪里會(huì)有更加重大的突破呢秤朗?在研究人員間普遍的觀點(diǎn)是:“Yes! 下一步已經(jīng)有了——那就是注意力细疚!” 這個(gè)想法是讓 RNN 的每一步都從更加大的信息集中挑選信息。例如川梅,如果你使用 RNN 來(lái)產(chǎn)生一個(gè)圖片的描述疯兼,可能會(huì)選擇圖片的一個(gè)部分,根據(jù)這部分信息來(lái)產(chǎn)生輸出的詞贫途。實(shí)際上吧彪,Xu,et al.(2015)已經(jīng)這么做了——如果你希望深入探索注意力可能這就是一個(gè)有趣的起點(diǎn)!還有一些使用注意力的相當(dāng)振奮人心的研究成果丢早,看起來(lái)有更多的東西亟待探索……
注意力也不是 RNN 研究領(lǐng)域中唯一的發(fā)展方向姨裸。例如,Kalchbrenner,et al.(2015)?提出的 Grid LSTM 看起來(lái)也是很有前途怨酝。使用生成模型的 RNN傀缩,諸如Gregor,et al.(2015)?Chung,et al.(2015)?和?Bayer & Osendorfer (2015)?提出的模型同樣很有趣。在過(guò)去幾年中农猬,RNN 的研究已經(jīng)相當(dāng)?shù)娜忌募瑁芯砍晒?dāng)然也會(huì)更加豐富!
二斤葱、
1. rnn 結(jié)構(gòu)的BPTT學(xué)習(xí)算法存在的問(wèn)題
先看一下比較典型的BPTT一個(gè)展開(kāi)的結(jié)構(gòu)慷垮,如下圖揖闸,這里只考慮了部分圖,因?yàn)槠渌糠植皇沁@里要討論的內(nèi)容料身。
對(duì)于t時(shí)刻的誤差信號(hào)計(jì)算如下:
這樣權(quán)值的更新方式如下:
上面的公式在BPTT中是非常常見(jiàn)的了汤纸,那么如果這個(gè)誤差信號(hào)一直往過(guò)去傳呢,假設(shè)任意兩個(gè)節(jié)點(diǎn)u, v他們的關(guān)系是下面這樣的:
那么誤差傳遞信號(hào)的關(guān)系可以寫(xiě)成如下的遞歸式:
n表示圖中一層神經(jīng)元的個(gè)數(shù)芹血,這個(gè)遞歸式的大概含義不難理解贮泞,要求t-q時(shí)刻誤差信號(hào)對(duì)t時(shí)刻誤差信號(hào)的偏導(dǎo),就先求出t-q+1時(shí)刻對(duì)t時(shí)刻的幔烛,然后把求出來(lái)的結(jié)果傳到t-q時(shí)刻隙畜,遞歸停止條件是q = 1時(shí),就是剛開(kāi)始寫(xiě)的那部分計(jì)算公式了说贝。將上面的遞歸式展開(kāi)后可以得到:
論文里面說(shuō)的是可以通過(guò)歸納來(lái)證明议惰,我沒(méi)仔細(xì)推敲這里了,把里面連乘展開(kāi)看容易明白一點(diǎn):
整個(gè)結(jié)果式對(duì)T求和的次數(shù)是n^(q-1), 即T有n^(q-1)項(xiàng)乡恕,那么下面看問(wèn)題出在哪兒言询。
如果|T| > 1, 誤差就會(huì)隨著q的增大而呈指數(shù)增長(zhǎng),那么網(wǎng)絡(luò)的參數(shù)更新會(huì)引起非常大的震蕩傲宜。
如果|T| < 1运杭, 誤差就會(huì)消失,導(dǎo)致學(xué)習(xí)無(wú)效函卒,一般激活函數(shù)用simoid函數(shù)辆憔,它的倒數(shù)最大值是0.25, 權(quán)值最大值要小于4才能保證不會(huì)小于1。
誤差呈指數(shù)增長(zhǎng)的現(xiàn)象比較少报嵌,誤差消失在BPTT中很常見(jiàn)虱咧。在原論文中還有更詳細(xì)的數(shù)學(xué)分析,但是了解到此個(gè)人覺(jué)的已經(jīng)足夠理解問(wèn)題所在了锚国。
2.最初的 LSTM 結(jié)構(gòu)
為了克服誤差消失的問(wèn)題腕巡,需要做一些限制,先假設(shè)僅僅只有一個(gè)神經(jīng)元與自己連接血筑,簡(jiǎn)圖如下:
根據(jù)上面的绘沉,t時(shí)刻的誤差信號(hào)計(jì)算如下:
為了使誤差不產(chǎn)生變化,可以強(qiáng)制令下式為1:
根據(jù)這個(gè)式子豺总,可以得到:
這表示激活函數(shù)是線性的车伞,常常的令fj(x) = x, wjj = 1.0,這樣就獲得常數(shù)誤差流了喻喳,也叫做CEC另玖。
但是光是這樣是不行的,因?yàn)榇嬖谳斎胼敵鎏帣?quán)值更新的沖突(這里原論文里面的解釋我不是很明白),所以加上了兩道控制門(mén)日矫,分別是input gate, output gate赂弓,來(lái)解決這個(gè)矛盾绑榴,圖如下:
圖中增加了兩個(gè)控制門(mén)哪轿,所謂控制的意思就是計(jì)算cec的輸入之前,乘以input gate的輸出翔怎,計(jì)算cec的輸出時(shí)窃诉,將其結(jié)果乘以output gate的輸出,整個(gè)方框叫做block, 中間的小圓圈是CEC, 里面是一條y = x的直線表示該神經(jīng)元的激活函數(shù)是線性的赤套,自連接的權(quán)重為1.0
3.增加forget gate
最初lstm結(jié)構(gòu)的一個(gè)缺點(diǎn)就是cec的狀態(tài)值可能會(huì)一直增大下去飘痛,增加forget gate后,可以對(duì)cec的狀態(tài)進(jìn)行控制容握,它的結(jié)構(gòu)如下圖:
這里的相當(dāng)于自連接權(quán)重不再是1.0宣脉,而是一個(gè)動(dòng)態(tài)的值,這個(gè)動(dòng)態(tài)值是forget gate的輸出值剔氏,它可以控制cec的狀態(tài)值塑猖,在必要時(shí)使之為0,即忘記作用谈跛,為1時(shí)和原來(lái)的結(jié)構(gòu)一樣羊苟。
4.增加Peephole的LSTM結(jié)構(gòu)
上面增加遺忘門(mén)一個(gè)缺點(diǎn)是當(dāng)前CEC的狀態(tài)不能影響到input gate, forget gate在下一時(shí)刻的輸出,所以增加了Peephole connections感憾。結(jié)構(gòu)如下:
這里的gate的輸入部分就多加了一個(gè)來(lái)源了蜡励,forget gate, input gate的輸入來(lái)源增加了cec前一時(shí)刻的輸出,output gate的輸入來(lái)源增加了cec當(dāng)前時(shí)刻的輸出阻桅,另外計(jì)算的順序也必須保證如下:
? ? ? ? ? ? ? ? ? ? ? 1. input gate, forget gate的輸入輸出
? ? ? ? ? ? ? ? ? ? ? 2. cell的輸入
? ? ? ? ? ? ? ? ? ? ? 3. output gate的輸入輸出
? ? ? ? ? ? ? ? ? ? ? 4. cell的輸出(這里也是block的輸出)
5. 一個(gè)LSTM的FULL BPTT推導(dǎo)(用誤差信號(hào))
我記得當(dāng)時(shí)看論文公式推導(dǎo)的時(shí)候很多地方比較難理解凉倚,最后隨便谷歌了幾下,找到一個(gè)寫(xiě)的不錯(cuò)的類(lèi)似課件的PDF,但是已經(jīng)不知道出處了嫂沉,很容易就看懂LSTM的前向計(jì)算占遥,誤差反傳更新了。把其中關(guān)于LSTM的部分放上來(lái)输瓜,首先網(wǎng)絡(luò)的完整結(jié)構(gòu)圖如下:
這個(gè)結(jié)構(gòu)也是rwthlm源碼包中LSTM的結(jié)構(gòu)瓦胎,下面看一下公式的記號(hào):
-- wij表示從神經(jīng)元i到j(luò)的連接權(quán)重(注意這和很多論文的表示是反著的)
-- 神經(jīng)元的輸入用a表示,輸出用b表示
-- 下標(biāo)?ι, φ 和 ω分別表示input gate, forget gate尤揣,output gate
-- c下標(biāo)表示cell搔啊,從cell到?input, forget和output gate的peephole權(quán)重分別記做 ?wcι , wcφ and wcω
-- Sc表示cell c的狀態(tài)
-- 控制門(mén)的激活函數(shù)用f表示,g北戏,h分別表示cell的輸入輸出激活函數(shù)
-- I表示輸入層的神經(jīng)元的個(gè)數(shù)负芋,K是輸出層的神經(jīng)元個(gè)數(shù),H是隱層cell的個(gè)數(shù)
前向的計(jì)算:
誤差反傳更新:
此外,還有GRU結(jié)構(gòu)同樣是解決RNN的缺點(diǎn)旧蛾,這里將LSTM和GRU進(jìn)行對(duì)比莽龟。
LSTM與GRU:
1) LSTM:
2)GRU:
3)概括的來(lái)說(shuō),LSTM和GRU都能通過(guò)各種Gate將重要特征保留锨天,保證其在long-term 傳播的時(shí)候也不會(huì)被丟失毯盈;還有一個(gè)不太好理解,作用就是有利于BP的時(shí)候不容易vanishing:
3.實(shí)驗(yàn)結(jié)果:
實(shí)驗(yàn)用了三個(gè)unit病袄,傳統(tǒng)的tanh搂赋,以及LSTM和GRU:
可以發(fā)現(xiàn)LSTM和GRU的差別并不大,但是都比tanh要明顯好很多益缠,所以在選擇LSTM或者GRU的時(shí)候還要看具體的task data是什么, 不過(guò)在收斂時(shí)間和需要的epoch上脑奠,GRU應(yīng)該要更勝一籌:
相關(guān)博客和教程:
https://zybuluo.com/hanbingtao/note/581764
http://www.reibang.com/p/9dc9f41f0b29
http://www.csdn.net/article/2015-06-05/2824880
http://blog.csdn.net/zdy0_2004/article/details/49977423
http://blog.csdn.net/a635661820/article/details/45390671
http://deeplearning.net/tutorial/lstm.html
https://www.zhihu.com/question/29411132
原文參考:http://www.cnblogs.com/taojake-ML/p/6272605.html