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

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

  • 科技行者

  • 算力行者

見(jiàn)證連接與計(jì)算的「力量」

首頁(yè) RNN系列教程之四 | 利用LSTM或GRU緩解梯度消失問(wèn)題

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

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

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

基于時(shí)間的反向傳播算法和梯度消失問(wèn)題

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

今天,我們將詳細(xì)介紹LSTM(長(zhǎng)短時(shí)記憶)神經(jīng)網(wǎng)絡(luò)和GRU(門(mén)控循環(huán)單元)。LSTM于1997年由Sepp Hochreiter 和Jürgen Schmidhuber首次提出,是當(dāng)前應(yīng)用最廣的NLP深度學(xué)習(xí)模型之一。GRU于2014年首次被提出,是LSTM的簡(jiǎn)單變體,兩者有諸多共性。

先來(lái)看看LSTM,隨后再探究LSTM與GRU的差異。

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

我們?cè)诘谌糠值慕坛讨刑岬竭^(guò)梯度消失問(wèn)題是如何阻礙標(biāo)準(zhǔn)RNN學(xué)習(xí)長(zhǎng)期依賴(lài)的。而LSTM就是通過(guò)引入一個(gè)叫做“門(mén)”(gating)的機(jī)制來(lái)緩解梯度消失問(wèn)題。為了更好的理解這一問(wèn)題,不妨先看看LSTM是如何計(jì)算隱藏層s_t的:

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

LSTM計(jì)算式子

這些式子看似復(fù)雜,實(shí)則不難。首先,我們要注意LSTM層僅僅是計(jì)算隱藏層的另一種方式。

在傳統(tǒng)的RNN中,我們用s_t = tanh(Ux_t + Ws_{t-1})這個(gè)式子來(lái)計(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)。如下圖:

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

簡(jiǎn)化LSTM和GRU模型

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

總結(jié)如下:

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

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

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

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

圖片來(lái)源:“Empirical evaluation of gated recurrent neural networks on sequence modeling.” Chung, Junyoung等著。

。即當(dāng)我們把所有輸入門(mén)固定為1,所有忘記門(mén)固定為0(即永遠(yuǎn)忽略前一時(shí)刻的記憶單元),所有輸出門(mén)固定為1(即呈現(xiàn)所有記憶),就近乎得到了標(biāo)準(zhǔn)的RNN,只不過(guò)多出一個(gè)附加的tanh,縮小了輸出范圍。正是這個(gè)“門(mén)機(jī)制”讓LSTM可以明確建立長(zhǎng)期記憶以來(lái)的模型,通過(guò)學(xué)習(xí)這些“門(mén)”的參數(shù),神經(jīng)網(wǎng)絡(luò)能夠更好地學(xué)習(xí)如何利用這些記憶。

顯然,基礎(chǔ)LSTM架構(gòu)也有幾種變體。最常見(jiàn)的變體是創(chuàng)建了窺視孔(peephole)連接,使“門(mén)”不僅僅取決于前一時(shí)刻的隱藏狀態(tài)s_{t-1}和前一時(shí)刻的內(nèi)部記憶單元c_{t-1},并在“門(mén)”的方程中增加了附選項(xiàng)即可。當(dāng)然,LSTM還有更多變體。這篇論文(LSTM: A Search Space Odyssey)做了更詳述的介紹,如有需要可供參考。

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

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

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

GRU計(jì)算式子


GRU有兩個(gè)門(mén):重置(reset)門(mén)r和更新(update)門(mén)z。直觀來(lái)講,重置門(mén)決定了新的輸入與前一時(shí)刻記憶的組合方式,更新門(mén)則決定了先前記憶信息的保留程度。如果將所有重置門(mén)設(shè)為1,所有更新門(mén)設(shè)為0,即可再次得到傳統(tǒng)的RNN模型。

我們發(fā)現(xiàn),GRU中用門(mén)機(jī)制來(lái)實(shí)現(xiàn)學(xué)習(xí)長(zhǎng)期記憶的基本原理與LSTM相同,但也有一些區(qū)別:

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

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

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

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

GRU vs LSTM

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

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

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

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

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

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

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

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

我們也在實(shí)現(xiàn)中增加了偏置單元 b, c,這在之前的式子中沒(méi)有體現(xiàn)。由于參數(shù)U和W的維度有所改變,還需修改參數(shù)U和W的初始值。Gitub上已有該初始化編碼(https://github.com/dennybritz/rnn-tutorial-gru-lstm),在此就不一一展示。

在這里,我還添加了一個(gè)詞嵌入層(word embedding)E,后文會(huì)有詳細(xì)介紹。

接下來(lái)說(shuō)說(shuō)梯度。像之前一樣,我們可以用鏈?zhǔn)角髮?dǎo)法則推導(dǎo)E、W、U、b和c的梯度。但在實(shí)際操作中,多數(shù)人偏愛(ài)用像Theano這樣的框架來(lái)實(shí)現(xiàn)。如果你還想要自己計(jì)算梯度,就需要實(shí)現(xiàn)不同模塊的求導(dǎo)算法。

這里,我們利用Theano來(lái)計(jì)算梯度:

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

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è)問(wèn)題,SGD還有有許多變體,如(Nesterov) Momentum Method、AdaGrad、AdaDelta 和RMSProp等等。這篇文章中有詳述的總結(jié)(http://cs231n.github.io/neural-networks-3/#update)。

這里,我們將使用RMSProp這個(gè)方法,其基本原理是根據(jù)先前的梯度之和來(lái)調(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為例):

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

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

2.添加嵌入(embedding)層

諸如word2vec和GloVe這樣的詞嵌入( word embedding)是提升模型準(zhǔn)確度的常用方法。和用one-hot表示句子不同,這種詞嵌入的方法用低維(通常是幾百維)的向量來(lái)表示詞語(yǔ),這有個(gè)好處,那就是能通過(guò)向量來(lái)判斷兩個(gè)詞的語(yǔ)義是否相近,因?yàn)槿绻麄円馑枷嘟脑?,他們的向量就很相近。要使用這些向量,需要預(yù)訓(xùn)練語(yǔ)料庫(kù)。從直覺(jué)上來(lái)看,使用word embedding層,就相當(dāng)于你告訴神經(jīng)網(wǎng)絡(luò)詞語(yǔ)的意思,從而神經(jīng)網(wǎng)絡(luò)就不需要學(xué)習(xí)關(guān)于這些詞語(yǔ)的知識(shí)了。

我的實(shí)驗(yàn)中并未使用預(yù)訓(xùn)練的單詞向量,只添加了一個(gè)嵌入層(即編碼中的矩陣E),便于插入單詞。嵌入式矩陣與查表類(lèi)似,第i欄的向量對(duì)應(yīng)單詞表中第i個(gè)詞。通過(guò)更新矩陣E可自學(xué)單詞向量,但僅針對(duì)我們的任務(wù)(以及數(shù)據(jù)集),不同于那些由大量文檔訓(xùn)練而成的可下載的數(shù)據(jù)。

添加第二個(gè)GRU層

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

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

增加一層GRU或者LSTM

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

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

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

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

4.性能注釋

之前我對(duì)此也有疑惑,因此提前聲明,在此提供的編碼效率較低,其優(yōu)化版僅用于解說(shuō)和教學(xué)目的。盡管它能夠配合模型運(yùn)作,但無(wú)法勝任生產(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)練過(guò)程將會(huì)極其緩慢。

所以如果想訓(xùn)練大型模型,我首推那些經(jīng)過(guò)性能優(yōu)化的已有深度學(xué)習(xí)框架。訓(xùn)練一個(gè)模型,利用上述編碼可能花費(fèi)數(shù)日或數(shù)周,但借助這些框架只需要幾個(gè)小時(shí)。我個(gè)人偏愛(ài)Keras,因其操作簡(jiǎn)單且附有許多RNN的示例。

5.結(jié)果

為節(jié)省訓(xùn)練模型的時(shí)間,我訓(xùn)練了一個(gè)與第二部分中類(lèi)似的模型。該模型詞匯規(guī)模為8000,我將詞映射到48維向量并使用了兩個(gè)128維GRU層。iPython notebook內(nèi)含載入該模型的代碼,可以操作或修改代碼、生成文本。

以下為該網(wǎng)絡(luò)輸出的成功示例(我修改了大小寫(xiě))。

  • 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 .

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

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

分享至
0贊

好文章,需要你的鼓勵(lì)

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