本部分是本系列RNN教程的最后一部分。錯(cuò)過前三部分的可點(diǎn)擊以下文字鏈接進(jìn)行回顧:
基于時(shí)間的反向傳播算法和梯度消失問題
今天,我們將詳細(xì)介紹LSTM(長(zhǎng)短時(shí)記憶)神經(jīng)網(wǎng)絡(luò)和GRU(門控循環(huán)單元)。LSTM于1997年由Sepp Hochreiter 和Jürgen Schmidhuber首次提出,是當(dāng)前應(yīng)用最廣的NLP深度學(xué)習(xí)模型之一。GRU于2014年首次被提出,是LSTM的簡(jiǎn)單變體,兩者有諸多共性。
先來看看LSTM,隨后再探究LSTM與GRU的差異。
我們?cè)诘谌糠值慕坛讨刑岬竭^梯度消失問題是如何阻礙標(biāo)準(zhǔn)RNN學(xué)習(xí)長(zhǎng)期依賴的。而LSTM就是通過引入一個(gè)叫做“門”(gating)的機(jī)制來緩解梯度消失問題。為了更好的理解這一問題,不妨先看看LSTM是如何計(jì)算隱藏層s_t的:
LSTM計(jì)算式子
這些式子看似復(fù)雜,實(shí)則不難。首先,我們要注意LSTM層僅僅是計(jì)算隱藏層的另一種方式。
在傳統(tǒng)的RNN中,我們用s_t = tanh(Ux_t + Ws_{t-1})這個(gè)式子來計(jì)算隱藏層。其中,隱藏層的輸入單元有兩個(gè),一個(gè)是當(dāng)前時(shí)刻t的輸入x_t以及前一時(shí)刻的隱藏狀態(tài)s_{t-1}。LSTM單元的功能與之相同,只是方式不同而已。這是理解LSTM的關(guān)鍵。你基本上可將LSTB(和GRU)單元視為黑匣子,只要你給定當(dāng)前輸入和前一時(shí)刻的隱藏狀態(tài),便可計(jì)算出下一隱藏狀態(tài)。如下圖:
簡(jiǎn)化LSTM和GRU模型
了解這一點(diǎn)后,就可以來看看LSTM單元中隱藏層的計(jì)算方法了。Chris Olah的一篇博文詳細(xì)介紹過這一點(diǎn)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/),此處不作贅述,僅簡(jiǎn)單介紹。
總結(jié)如下:
LSTM的內(nèi)部細(xì)節(jié)
圖片來源:“Empirical evaluation of gated recurrent neural networks on sequence modeling.” Chung, Junyoung等著。
。即當(dāng)我們把所有輸入門固定為1,所有忘記門固定為0(即永遠(yuǎn)忽略前一時(shí)刻的記憶單元),所有輸出門固定為1(即呈現(xiàn)所有記憶),就近乎得到了標(biāo)準(zhǔn)的RNN,只不過多出一個(gè)附加的tanh,縮小了輸出范圍。正是這個(gè)“門機(jī)制”讓LSTM可以明確建立長(zhǎng)期記憶以來的模型,通過學(xué)習(xí)這些“門”的參數(shù),神經(jīng)網(wǎng)絡(luò)能夠更好地學(xué)習(xí)如何利用這些記憶。
顯然,基礎(chǔ)LSTM架構(gòu)也有幾種變體。最常見的變體是創(chuàng)建了窺視孔(peephole)連接,使“門”不僅僅取決于前一時(shí)刻的隱藏狀態(tài)s_{t-1}和前一時(shí)刻的內(nèi)部記憶單元c_{t-1},并在“門”的方程中增加了附選項(xiàng)即可。當(dāng)然,LSTM還有更多變體。這篇論文(LSTM: A Search Space Odyssey)做了更詳述的介紹,如有需要可供參考。
GRU網(wǎng)絡(luò)的原理與LSTM非常相似,方程式也幾乎相同,如下:
GRU計(jì)算式子
GRU有兩個(gè)門:重置(reset)門r和更新(update)門z。直觀來講,重置門決定了新的輸入與前一時(shí)刻記憶的組合方式,更新門則決定了先前記憶信息的保留程度。如果將所有重置門設(shè)為1,所有更新門設(shè)為0,即可再次得到傳統(tǒng)的RNN模型。
我們發(fā)現(xiàn),GRU中用門機(jī)制來實(shí)現(xiàn)學(xué)習(xí)長(zhǎng)期記憶的基本原理與LSTM相同,但也有一些區(qū)別:
GRU內(nèi)部細(xì)節(jié)
圖片來源:“Empirical evaluation of gated recurrent neural networks on sequence modeling.” Chung, Junyoung等人于2014年著。
現(xiàn)在,我們已經(jīng)了解了解決RNN梯度消失問題的兩種模型,但可能還不清楚應(yīng)該使用哪一種模型。
具體來看,GRU仍處于初級(jí)階段(于2014年提出),關(guān)于它的一些利弊現(xiàn)在還沒有探索清楚。
但事實(shí)上,這兩種模型在許多任務(wù)中都不相上下,因此,與挑選出一個(gè)理想的架構(gòu)相比,調(diào)整層數(shù)這些超參數(shù)等更重要。
現(xiàn)在我們借助GRU來實(shí)現(xiàn)第二部分中的語言模型(LSTM也差不多,只是式子不同而已)。
我們基于之前Theano版本的代碼來修改。別忘了GRU (LSTM)層只是計(jì)算隱藏狀態(tài)的另一種方式,因此我們需要在前向轉(zhuǎn)播的代碼里,把隱藏層的計(jì)算步驟修改一下。
Tip:點(diǎn)擊圖片可看大圖
我們也在實(shí)現(xiàn)中增加了偏置單元 b, c,這在之前的式子中沒有體現(xiàn)。由于參數(shù)U和W的維度有所改變,還需修改參數(shù)U和W的初始值。Gitub上已有該初始化編碼(https://github.com/dennybritz/rnn-tutorial-gru-lstm),在此就不一一展示。
在這里,我還添加了一個(gè)詞嵌入層(word embedding)E,后文會(huì)有詳細(xì)介紹。
接下來說說梯度。像之前一樣,我們可以用鏈?zhǔn)角髮?dǎo)法則推導(dǎo)E、W、U、b和c的梯度。但在實(shí)際操作中,多數(shù)人偏愛用像Theano這樣的框架來實(shí)現(xiàn)。如果你還想要自己計(jì)算梯度,就需要實(shí)現(xiàn)不同模塊的求導(dǎo)算法。
這里,我們利用Theano來計(jì)算梯度:
1.用RMSProp(SGD的一種優(yōu)化算法)更新參數(shù)
在第二部分教程中,我們用隨機(jī)梯度下降(SGD)的基礎(chǔ)版更新了參數(shù)。結(jié)果不盡人意。但如果將學(xué)習(xí)率設(shè)置得足夠低,SGD確實(shí)能讓你得到非常好的訓(xùn)練效果,只是實(shí)際操作時(shí)會(huì)耗費(fèi)大量時(shí)間。
為了解決這個(gè)問題,SGD還有有許多變體,如(Nesterov) Momentum Method、AdaGrad、AdaDelta 和RMSProp等等。這篇文章中有詳述的總結(jié)(http://cs231n.github.io/neural-networks-3/#update)。
這里,我們將使用RMSProp這個(gè)方法,其基本原理是根據(jù)先前的梯度之和來調(diào)整每個(gè)參數(shù)的學(xué)習(xí)率。直觀上,出現(xiàn)頻率越高的參數(shù)學(xué)習(xí)率越?。ㄒ?yàn)樘荻瓤偤透螅?,反之亦然?/span>
RMSProp的實(shí)現(xiàn)非常簡(jiǎn)單。我們保留每個(gè)參數(shù)的緩存變量,并在梯度下降時(shí)更新以下參數(shù)以及緩存變量,如下(以W為例):
衰減通常設(shè)為0.9到0.95之間,另外,添加1e-6是為了避免除數(shù)為0。
諸如word2vec和GloVe這樣的詞嵌入( word embedding)是提升模型準(zhǔn)確度的常用方法。和用one-hot表示句子不同,這種詞嵌入的方法用低維(通常是幾百維)的向量來表示詞語,這有個(gè)好處,那就是能通過向量來判斷兩個(gè)詞的語義是否相近,因?yàn)槿绻麄円馑枷嘟脑挘麄兊南蛄烤秃芟嘟?。要使用這些向量,需要預(yù)訓(xùn)練語料庫(kù)。從直覺上來看,使用word embedding層,就相當(dāng)于你告訴神經(jīng)網(wǎng)絡(luò)詞語的意思,從而神經(jīng)網(wǎng)絡(luò)就不需要學(xué)習(xí)關(guān)于這些詞語的知識(shí)了。
我的實(shí)驗(yàn)中并未使用預(yù)訓(xùn)練的單詞向量,只添加了一個(gè)嵌入層(即編碼中的矩陣E),便于插入單詞。嵌入式矩陣與查表類似,第i欄的向量對(duì)應(yīng)單詞表中第i個(gè)詞。通過更新矩陣E可自學(xué)單詞向量,但僅針對(duì)我們的任務(wù)(以及數(shù)據(jù)集),不同于那些由大量文檔訓(xùn)練而成的可下載的數(shù)據(jù)。
添加第二層能使網(wǎng)絡(luò)捕捉到更高層次的交互,還可以添加其他層,但本實(shí)驗(yàn)中我沒這么做。2到3層之后,可能會(huì)出現(xiàn)遞減倒退(計(jì)算值逐漸減?。菙?shù)據(jù)足夠龐大(但我們沒有),否則層數(shù)的增加不僅不會(huì)產(chǎn)生明顯變化,還將導(dǎo)致過擬合。
增加一層GRU或者LSTM
第二層的添加過程非常簡(jiǎn)單,只需(再次)修正前向傳播的計(jì)算過程和初始化函數(shù)即可:
Tip:點(diǎn)擊圖片可看大圖
此處附上GRU網(wǎng)絡(luò)的完整代碼:https://github.com/dennybritz/rnn-tutorial-gru-lstm/blob/master/gru_theano.py
之前我對(duì)此也有疑惑,因此提前聲明,在此提供的編碼效率較低,其優(yōu)化版僅用于解說和教學(xué)目的。盡管它能夠配合模型運(yùn)作,但無法勝任生產(chǎn)或大型數(shù)據(jù)集訓(xùn)練。
優(yōu)化RNN性能的方法有很多,但最重要的是批量處理所有更新。由于GPU能夠高效處理大型矩陣乘法,因此你可以對(duì)相同長(zhǎng)度的句子進(jìn)行分組或?qū)⑺芯渥诱{(diào)整成相同長(zhǎng)度(而非逐句學(xué)習(xí)),進(jìn)行大型矩陣乘法運(yùn)算并對(duì)整批數(shù)據(jù)梯度求和。不這么做的話,我們只能依靠GPU得到小幅提速,訓(xùn)練過程將會(huì)極其緩慢。
所以如果想訓(xùn)練大型模型,我首推那些經(jīng)過性能優(yōu)化的已有深度學(xué)習(xí)框架。訓(xùn)練一個(gè)模型,利用上述編碼可能花費(fèi)數(shù)日或數(shù)周,但借助這些框架只需要幾個(gè)小時(shí)。我個(gè)人偏愛Keras,因其操作簡(jiǎn)單且附有許多RNN的示例。
5.結(jié)果
為節(jié)省訓(xùn)練模型的時(shí)間,我訓(xùn)練了一個(gè)與第二部分中類似的模型。該模型詞匯規(guī)模為8000,我將詞映射到48維向量并使用了兩個(gè)128維GRU層。iPython notebook內(nèi)含載入該模型的代碼,可以操作或修改代碼、生成文本。
以下為該網(wǎng)絡(luò)輸出的成功示例(我修改了大小寫)。
多個(gè)時(shí)間步長(zhǎng)后,觀察句子的語義依賴性非常有趣。舉個(gè)例子,機(jī)器人和自動(dòng)化聯(lián)系緊密,就像括號(hào)的兩端。我們的網(wǎng)絡(luò)能夠?qū)W會(huì)這些,確實(shí)非常有用。
至此,本系列關(guān)于RNN的教程就結(jié)束,如果您對(duì)其它教程感興趣,歡迎在評(píng)論區(qū)留言??萍夹姓邔⒉贿z余力為您呈上!
好文章,需要你的鼓勵(lì)
浙江大學(xué)團(tuán)隊(duì)提出動(dòng)態(tài)專家搜索方法,讓AI能根據(jù)不同問題靈活調(diào)整內(nèi)部專家配置。該方法在數(shù)學(xué)、編程等任務(wù)上顯著提升推理準(zhǔn)確率,且不增加計(jì)算成本。研究發(fā)現(xiàn)不同類型問題偏愛不同專家配置,為AI推理優(yōu)化開辟新路徑。
清華大學(xué)研究團(tuán)隊(duì)提出SIRI方法,通過"壓縮-擴(kuò)張"交替訓(xùn)練策略,成功解決了大型推理模型"話多且準(zhǔn)確率低"的問題。實(shí)驗(yàn)顯示,該方法在數(shù)學(xué)競(jìng)賽題上將模型準(zhǔn)確率提升43.2%的同時(shí),輸出長(zhǎng)度減少46.9%,真正實(shí)現(xiàn)了效率與性能的雙重優(yōu)化,為AI模型訓(xùn)練提供了新思路。
南洋理工大學(xué)與騰訊聯(lián)合研究團(tuán)隊(duì)開發(fā)出Rolling Forcing技術(shù),實(shí)現(xiàn)AI視頻實(shí)時(shí)流式生成的重大突破。該技術(shù)通過滾動(dòng)窗口聯(lián)合去噪、注意力錨點(diǎn)機(jī)制和高效訓(xùn)練算法三項(xiàng)創(chuàng)新,解決了長(zhǎng)視頻生成中的錯(cuò)誤累積問題,可在單GPU上以16fps速度生成多分鐘高質(zhì)量視頻,延遲僅0.76秒,質(zhì)量漂移指標(biāo)從傳統(tǒng)方法的1.66降至0.01,為交互式媒體和內(nèi)容創(chuàng)作開辟新可能。
華中科技大學(xué)研究團(tuán)隊(duì)發(fā)現(xiàn),通過讓AI模型學(xué)習(xí)解決幾何問題,能夠顯著提升其空間理解能力。他們構(gòu)建了包含約30000個(gè)幾何題目的Euclid30K數(shù)據(jù)集,使用強(qiáng)化學(xué)習(xí)方法訓(xùn)練多個(gè)AI模型。實(shí)驗(yàn)結(jié)果顯示,幾何訓(xùn)練在四個(gè)空間智能測(cè)試基準(zhǔn)上都帶來顯著提升,其中最佳模型達(dá)到49.6%準(zhǔn)確率,超越此前最好成績(jī)。這項(xiàng)研究揭示了基礎(chǔ)幾何知識(shí)對(duì)培養(yǎng)AI空間智能的重要價(jià)值。