av天堂久久天堂色综合,最近中文字幕mv免费高清在线,在线a级毛片免费视频,av动漫,中文字幕精品亚洲无线码一区

微信掃一掃,關(guān)注公眾號

  • 科技行者

  • 算力行者

見證連接與計算的「力量」

首頁 RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

2017-11-29 13:04
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2017-11-29 13:04 ? CNET科技行者

本部分是本系列RNN教程的最后一部分。錯過前三部分的可點(diǎn)擊以下文字鏈接進(jìn)行回顧:

基于時間的反向傳播算法和梯度消失問題

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

今天,我們將詳細(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的差異。

LSTM網(wǎng)絡(luò)

我們在第三部分的教程中提到過梯度消失問題是如何阻礙標(biāo)準(zhǔn)RNN學(xué)習(xí)長期依賴的。而LSTM就是通過引入一個叫做“門”(gating)的機(jī)制來緩解梯度消失問題。為了更好的理解這一問題,不妨先看看LSTM是如何計算隱藏層s_t的:

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

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)。如下圖:

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

簡化LSTM和GRU模型

了解這一點(diǎn)后,就可以來看看LSTM單元中隱藏層的計算方法了。Chris Olah的一篇博文詳細(xì)介紹過這一點(diǎn)(http://colah.github.io/posts/2015-08-Understanding-LSTMs/),此處不作贅述,僅簡單介紹。

總結(jié)如下:

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

  • i, f, o分別為input(輸入)門,forget(遺忘)門和output(輸出)門。需要注意的是,它們的方程式完全相同,只是參數(shù)矩陣不同。而之所以被稱作“門”,是由于sigmoid函數(shù)將這些向量值的區(qū)間縮減為0到1,然后將其與另一向量對應(yīng)相乘,便可界定讓多少其它的向量能“通過”這個門。輸入門決定的是讓多少新計算出的隱藏狀態(tài)通過當(dāng)前輸入。遺忘門則決定讓多少之前的隱藏狀態(tài)通過。最后的輸出門則決定了讓多少信息傳遞到更高一層的神經(jīng)網(wǎng)絡(luò)或者下一時刻。這三個“門”都有相同的的維度ds,即隱藏層的大小。
  • g是基于當(dāng)前輸入和先前隱藏狀態(tài)計算出的“候選”隱藏狀態(tài)。它與傳統(tǒng)RNN中的方程式完全相同,此處僅將參數(shù)U和W重命名為U^g和W^g。在傳統(tǒng)RNN中,我們指定g的值為新隱藏狀態(tài),并輸出給下一個狀態(tài),而在LSTM中,我們將通過輸入門來挑選g的一部分值,再輸出給下一個狀態(tài)。
  • c_t是內(nèi)部的記憶單元。它等于前一時刻的記憶c_{t-1}乘以遺忘門的結(jié)果,再加上隱藏候選狀態(tài)g和輸入門的相乘結(jié)果。直觀上,它是一個可以由我們決定的先前記憶和新輸入數(shù)值的組合。因此,我們可選擇完全忽略上一個記憶單元的內(nèi)容(即把遺忘門全部設(shè)為0),或完全忽略新輸入的狀態(tài)(即輸入門全部設(shè)為0)。但現(xiàn)實(shí)情況是,我們需要在這兩個極端之間尋求某種平衡。
  • 給定記憶單元c_t,與輸出門相乘,最終可計算出隱藏層s_t。當(dāng)然,并不是所有的內(nèi)部記憶單元都與其他隱藏狀態(tài)相關(guān)。

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

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ò)

GRU網(wǎng)絡(luò)的原理與LSTM非常相似,方程式也幾乎相同,如下:

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

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有兩個門,而LSTM有三個門。
  • GRU中不存在區(qū)別于內(nèi)部記憶單元(c_t),也沒有LSTM中的輸出門。
  • LSTM的輸入門和遺忘門,在GRU中被整合成一個更新門z;而重置門r被直接用到前一個隱藏狀態(tài)上面了。因此,LSTM中重置門的功能實(shí)際上由GRU中的重置門r和更新門z代替。
  • 計算輸出時,不再借助非線性函數(shù)。

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

GRU內(nèi)部細(xì)節(jié)

圖片來源:“Empirical evaluation of gated recurrent neural networks on sequence modeling.” Chung, Junyoung等人于2014年著。

GRU vs LSTM

現(xiàn)在,我們已經(jīng)了解了解決RNN梯度消失問題的兩種模型,但可能還不清楚應(yīng)該使用哪一種模型。

具體來看,GRU仍處于初級階段(于2014年提出),關(guān)于它的一些利弊現(xiàn)在還沒有探索清楚。

但事實(shí)上,這兩種模型在許多任務(wù)中都不相上下,因此,與挑選出一個理想的架構(gòu)相比,調(diào)整層數(shù)這些超參數(shù)等更重要。

實(shí)現(xiàn)RNN

現(xiàn)在我們借助GRU來實(shí)現(xiàn)第二部分中的語言模型(LSTM也差不多,只是式子不同而已)。

我們基于之前Theano版本的代碼來修改。別忘了GRU (LSTM)層只是計算隱藏狀態(tài)的另一種方式,因此我們需要在前向轉(zhuǎn)播的代碼里,把隱藏層的計算步驟修改一下。

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

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來計算梯度:

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

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為例):

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

衰減通常設(shè)為0.9到0.95之間,另外,添加1e-6是為了避免除數(shù)為0。

2.添加嵌入(embedding)層

諸如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ù)。

添加第二個GRU層

添加第二層能使網(wǎng)絡(luò)捕捉到更高層次的交互,還可以添加其他層,但本實(shí)驗中我沒這么做。2到3層之后,可能會出現(xiàn)遞減倒退(計算值逐漸減小),除非數(shù)據(jù)足夠龐大(但我們沒有),否則層數(shù)的增加不僅不會產(chǎn)生明顯變化,還將導(dǎo)致過擬合。

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

增加一層GRU或者LSTM

第二層的添加過程非常簡單,只需(再次)修正前向傳播的計算過程和初始化函數(shù)即可:

RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問題

Tip:點(diǎn)擊圖片可看大圖

此處附上GRU網(wǎng)絡(luò)的完整代碼:https://github.com/dennybritz/rnn-tutorial-gru-lstm/blob/master/gru_theano.py

4.性能注釋

之前我對此也有疑惑,因此提前聲明,在此提供的編碼效率較低,其優(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ò)輸出的成功示例(我修改了大小寫)。

  • I am a bot, and this action was performed automatically .
  • I enforce myself ridiculously well enough to just youtube.
  • I’ve got a good rhythm going !
  • There is no problem here, but at least still wave !
  • It depends on how plausible my judgement is .

多個時間步長后,觀察句子的語義依賴性非常有趣。舉個例子,機(jī)器人和自動化聯(lián)系緊密,就像括號的兩端。我們的網(wǎng)絡(luò)能夠?qū)W會這些,確實(shí)非常有用。

至此,本系列關(guān)于RNN的教程就結(jié)束,如果您對其它教程感興趣,歡迎在評論區(qū)留言??萍夹姓邔⒉贿z余力為您呈上!

分享至
0贊

好文章,需要你的鼓勵

推薦文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-