本部分是本系列RNN教程的最后一部分。錯過前三部分的可點(diǎn)擊以下文字鏈接進(jìn)行回顧:
基于時間的反向傳播算法和梯度消失問題
今天,我們將詳細(xì)介紹LSTM(長短時記憶)神經(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的簡單變體,兩者有諸多共性。
先來看看LSTM,隨后再探究LSTM與GRU的差異。
我們在第三部分的教程中提到過梯度消失問題是如何阻礙標(biāo)準(zhǔn)RNN學(xué)習(xí)長期依賴的。而LSTM就是通過引入一個叫做“門”(gating)的機(jī)制來緩解梯度消失問題。為了更好的理解這一問題,不妨先看看LSTM是如何計算隱藏層s_t的:
LSTM計算式子
這些式子看似復(fù)雜,實(shí)則不難。首先,我們要注意LSTM層僅僅是計算隱藏層的另一種方式。
在傳統(tǒng)的RNN中,我們用s_t = tanh(Ux_t + Ws_{t-1})這個式子來計算隱藏層。其中,隱藏層的輸入單元有兩個,一個是當(dāng)前時刻t的輸入x_t以及前一時刻的隱藏狀態(tài)s_{t-1}。LSTM單元的功能與之相同,只是方式不同而已。這是理解LSTM的關(guān)鍵。你基本上可將LSTB(和GRU)單元視為黑匣子,只要你給定當(dāng)前輸入和前一時刻的隱藏狀態(tài),便可計算出下一隱藏狀態(tài)。如下圖:
簡化LSTM和GRU模型
了解這一點(diǎn)后,就可以來看看LSTM單元中隱藏層的計算方法了。Chris Olah的一篇博文詳細(xì)介紹過這一點(diǎn)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/),此處不作贅述,僅簡單介紹。
總結(jié)如下:
LSTM的內(nèi)部細(xì)節(jié)
圖片來源:“Empirical evaluation of gated recurrent neural networks on sequence modeling.” Chung, Junyoung等著。
。即當(dāng)我們把所有輸入門固定為1,所有忘記門固定為0(即永遠(yuǎn)忽略前一時刻的記憶單元),所有輸出門固定為1(即呈現(xiàn)所有記憶),就近乎得到了標(biāo)準(zhǔn)的RNN,只不過多出一個附加的tanh,縮小了輸出范圍。正是這個“門機(jī)制”讓LSTM可以明確建立長期記憶以來的模型,通過學(xué)習(xí)這些“門”的參數(shù),神經(jīng)網(wǎng)絡(luò)能夠更好地學(xué)習(xí)如何利用這些記憶。
顯然,基礎(chǔ)LSTM架構(gòu)也有幾種變體。最常見的變體是創(chuàng)建了窺視孔(peephole)連接,使“門”不僅僅取決于前一時刻的隱藏狀態(tài)s_{t-1}和前一時刻的內(nèi)部記憶單元c_{t-1},并在“門”的方程中增加了附選項即可。當(dāng)然,LSTM還有更多變體。這篇論文(LSTM: A Search Space Odyssey)做了更詳述的介紹,如有需要可供參考。
GRU網(wǎng)絡(luò)的原理與LSTM非常相似,方程式也幾乎相同,如下:
GRU計算式子
GRU有兩個門:重置(reset)門r和更新(update)門z。直觀來講,重置門決定了新的輸入與前一時刻記憶的組合方式,更新門則決定了先前記憶信息的保留程度。如果將所有重置門設(shè)為1,所有更新門設(shè)為0,即可再次得到傳統(tǒng)的RNN模型。
我們發(fā)現(xiàn),GRU中用門機(jī)制來實(shí)現(xiàn)學(xué)習(xí)長期記憶的基本原理與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仍處于初級階段(于2014年提出),關(guān)于它的一些利弊現(xiàn)在還沒有探索清楚。
但事實(shí)上,這兩種模型在許多任務(wù)中都不相上下,因此,與挑選出一個理想的架構(gòu)相比,調(diào)整層數(shù)這些超參數(shù)等更重要。
現(xiàn)在我們借助GRU來實(shí)現(xiàn)第二部分中的語言模型(LSTM也差不多,只是式子不同而已)。
我們基于之前Theano版本的代碼來修改。別忘了GRU (LSTM)層只是計算隱藏狀態(tài)的另一種方式,因此我們需要在前向轉(zhuǎn)播的代碼里,把隱藏層的計算步驟修改一下。
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),在此就不一一展示。
在這里,我還添加了一個詞嵌入層(word embedding)E,后文會有詳細(xì)介紹。
接下來說說梯度。像之前一樣,我們可以用鏈?zhǔn)角髮?dǎo)法則推導(dǎo)E、W、U、b和c的梯度。但在實(shí)際操作中,多數(shù)人偏愛用像Theano這樣的框架來實(shí)現(xiàn)。如果你還想要自己計算梯度,就需要實(shí)現(xiàn)不同模塊的求導(dǎo)算法。
這里,我們利用Theano來計算梯度:
1.用RMSProp(SGD的一種優(yōu)化算法)更新參數(shù)
在第二部分教程中,我們用隨機(jī)梯度下降(SGD)的基礎(chǔ)版更新了參數(shù)。結(jié)果不盡人意。但如果將學(xué)習(xí)率設(shè)置得足夠低,SGD確實(shí)能讓你得到非常好的訓(xùn)練效果,只是實(shí)際操作時會耗費(fèi)大量時間。
為了解決這個問題,SGD還有有許多變體,如(Nesterov) Momentum Method、AdaGrad、AdaDelta 和RMSProp等等。這篇文章中有詳述的總結(jié)(http://cs231n.github.io/neural-networks-3/#update)。
這里,我們將使用RMSProp這個方法,其基本原理是根據(jù)先前的梯度之和來調(diào)整每個參數(shù)的學(xué)習(xí)率。直觀上,出現(xiàn)頻率越高的參數(shù)學(xué)習(xí)率越?。ㄒ驗樘荻瓤偤透螅?,反之亦然。
RMSProp的實(shí)現(xiàn)非常簡單。我們保留每個參數(shù)的緩存變量,并在梯度下降時更新以下參數(shù)以及緩存變量,如下(以W為例):
衰減通常設(shè)為0.9到0.95之間,另外,添加1e-6是為了避免除數(shù)為0。
諸如word2vec和GloVe這樣的詞嵌入( word embedding)是提升模型準(zhǔn)確度的常用方法。和用one-hot表示句子不同,這種詞嵌入的方法用低維(通常是幾百維)的向量來表示詞語,這有個好處,那就是能通過向量來判斷兩個詞的語義是否相近,因為如果他們意思相近的話,他們的向量就很相近。要使用這些向量,需要預(yù)訓(xùn)練語料庫。從直覺上來看,使用word embedding層,就相當(dāng)于你告訴神經(jīng)網(wǎng)絡(luò)詞語的意思,從而神經(jīng)網(wǎng)絡(luò)就不需要學(xué)習(xí)關(guān)于這些詞語的知識了。
我的實(shí)驗中并未使用預(yù)訓(xùn)練的單詞向量,只添加了一個嵌入層(即編碼中的矩陣E),便于插入單詞。嵌入式矩陣與查表類似,第i欄的向量對應(yīng)單詞表中第i個詞。通過更新矩陣E可自學(xué)單詞向量,但僅針對我們的任務(wù)(以及數(shù)據(jù)集),不同于那些由大量文檔訓(xùn)練而成的可下載的數(shù)據(jù)。
添加第二層能使網(wǎng)絡(luò)捕捉到更高層次的交互,還可以添加其他層,但本實(shí)驗中我沒這么做。2到3層之后,可能會出現(xiàn)遞減倒退(計算值逐漸減小),除非數(shù)據(jù)足夠龐大(但我們沒有),否則層數(shù)的增加不僅不會產(chǎn)生明顯變化,還將導(dǎo)致過擬合。
增加一層GRU或者LSTM
第二層的添加過程非常簡單,只需(再次)修正前向傳播的計算過程和初始化函數(shù)即可:
Tip:點(diǎn)擊圖片可看大圖
此處附上GRU網(wǎng)絡(luò)的完整代碼:https://github.com/dennybritz/rnn-tutorial-gru-lstm/blob/master/gru_theano.py
之前我對此也有疑惑,因此提前聲明,在此提供的編碼效率較低,其優(yōu)化版僅用于解說和教學(xué)目的。盡管它能夠配合模型運(yùn)作,但無法勝任生產(chǎn)或大型數(shù)據(jù)集訓(xùn)練。
優(yōu)化RNN性能的方法有很多,但最重要的是批量處理所有更新。由于GPU能夠高效處理大型矩陣乘法,因此你可以對相同長度的句子進(jìn)行分組或?qū)⑺芯渥诱{(diào)整成相同長度(而非逐句學(xué)習(xí)),進(jìn)行大型矩陣乘法運(yùn)算并對整批數(shù)據(jù)梯度求和。不這么做的話,我們只能依靠GPU得到小幅提速,訓(xùn)練過程將會極其緩慢。
所以如果想訓(xùn)練大型模型,我首推那些經(jīng)過性能優(yōu)化的已有深度學(xué)習(xí)框架。訓(xùn)練一個模型,利用上述編碼可能花費(fèi)數(shù)日或數(shù)周,但借助這些框架只需要幾個小時。我個人偏愛Keras,因其操作簡單且附有許多RNN的示例。
5.結(jié)果
為節(jié)省訓(xùn)練模型的時間,我訓(xùn)練了一個與第二部分中類似的模型。該模型詞匯規(guī)模為8000,我將詞映射到48維向量并使用了兩個128維GRU層。iPython notebook內(nèi)含載入該模型的代碼,可以操作或修改代碼、生成文本。
以下為該網(wǎng)絡(luò)輸出的成功示例(我修改了大小寫)。
多個時間步長后,觀察句子的語義依賴性非常有趣。舉個例子,機(jī)器人和自動化聯(lián)系緊密,就像括號的兩端。我們的網(wǎng)絡(luò)能夠?qū)W會這些,確實(shí)非常有用。
至此,本系列關(guān)于RNN的教程就結(jié)束,如果您對其它教程感興趣,歡迎在評論區(qū)留言??萍夹姓邔⒉贿z余力為您呈上!
好文章,需要你的鼓勵
騰訊ARC實(shí)驗室推出AudioStory系統(tǒng),首次實(shí)現(xiàn)AI根據(jù)復(fù)雜指令創(chuàng)作完整長篇音頻故事。該系統(tǒng)結(jié)合大語言模型的敘事推理能力與音頻生成技術(shù),通過交錯式推理生成、解耦橋接機(jī)制和漸進(jìn)式訓(xùn)練,能夠?qū)?fù)雜指令分解為連續(xù)音頻場景并保持整體連貫性。在AudioStory-10K基準(zhǔn)測試中表現(xiàn)優(yōu)異,為AI音頻創(chuàng)作開辟新方向。
Meta與特拉維夫大學(xué)聯(lián)合研發(fā)的VideoJAM技術(shù),通過讓AI同時學(xué)習(xí)外觀和運(yùn)動信息,顯著解決了當(dāng)前視頻生成模型中動作不連貫、違反物理定律的核心問題。該技術(shù)僅需添加兩個線性層就能大幅提升運(yùn)動質(zhì)量,在多項測試中超越包括Sora在內(nèi)的商業(yè)模型,為AI視頻生成的實(shí)用化應(yīng)用奠定了重要基礎(chǔ)。
上海AI實(shí)驗室發(fā)布OmniAlign-V研究,首次系統(tǒng)性解決多模態(tài)大語言模型人性化對話問題。該研究創(chuàng)建了包含20萬高質(zhì)量樣本的訓(xùn)練數(shù)據(jù)集和MM-AlignBench評測基準(zhǔn),通過創(chuàng)新的數(shù)據(jù)生成和質(zhì)量管控方法,讓AI在保持技術(shù)能力的同時顯著提升人性化交互水平,為AI價值觀對齊提供了可行技術(shù)路徑。
谷歌DeepMind團(tuán)隊開發(fā)的GraphCast是一個革命性的AI天氣預(yù)測模型,能夠在不到一分鐘內(nèi)完成10天全球天氣預(yù)報,準(zhǔn)確性超越傳統(tǒng)方法90%的指標(biāo)。該模型采用圖神經(jīng)網(wǎng)絡(luò)技術(shù),通過學(xué)習(xí)40年歷史數(shù)據(jù)掌握天氣變化規(guī)律,在極端天氣預(yù)測方面表現(xiàn)卓越,能耗僅為傳統(tǒng)方法的千分之一,為氣象學(xué)領(lǐng)域帶來了效率和精度的雙重突破。