日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

tensorflow-RNN和LSTM

發(fā)布時(shí)間:2024/4/15 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensorflow-RNN和LSTM 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本章主要介紹循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neuralnetwork,RNN)和長短時(shí)記憶網(wǎng)絡(luò)(long short-term memory,LSTM)

一. RNN簡介

1.背景

循環(huán)神經(jīng)網(wǎng)絡(luò)挖掘數(shù)據(jù)中的時(shí)序信息以及語義信息的深度表達(dá)能力別充分利用,并在語音識(shí)別、語言模型、機(jī)器翻譯以及時(shí)序分析等方面實(shí)現(xiàn)了突破。

循環(huán)神經(jīng)網(wǎng)絡(luò)的主要用途是處理和預(yù)測(cè)序列數(shù)據(jù)。在全連接神經(jīng)網(wǎng)絡(luò)或卷積神經(jīng)網(wǎng)絡(luò)中,網(wǎng)絡(luò)結(jié)構(gòu)都是從輸入層到隱藏層再到輸出層,層與層之間是全連接或部分連接的,但每層之間的節(jié)點(diǎn)是無連接的。考慮這樣一個(gè)問題,如果要預(yù)測(cè)句子的下一個(gè)單詞是什么,一般需要用到當(dāng)前單詞以及前面的單詞,因?yàn)榫渥又星昂髥卧~并不是獨(dú)立的。循環(huán)神經(jīng)網(wǎng)絡(luò)的來源就是為了刻畫一個(gè)序列當(dāng)前的輸出與之前信息的關(guān)系。從網(wǎng)絡(luò)結(jié)構(gòu)上,循環(huán)神經(jīng)網(wǎng)絡(luò)會(huì)記憶之前的信息,并利用之前的信息影響后面節(jié)點(diǎn)的輸出。也就是說,循環(huán)神經(jīng)網(wǎng)絡(luò)的隱藏層之間的節(jié)點(diǎn)是有連接的,隱藏層的輸入不僅包括輸入層的輸出,還包括上一時(shí)刻隱藏層的輸出。

2.RNN經(jīng)典結(jié)構(gòu)

如上所示為一個(gè)經(jīng)典的循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。可以看到在每一時(shí)刻t,循環(huán)神經(jīng)網(wǎng)絡(luò)會(huì)針對(duì)該時(shí)刻的輸入結(jié)合當(dāng)前模型的狀態(tài)給出一個(gè)輸出,并更新模型狀態(tài)。此結(jié)構(gòu)A的輸入除了來自輸入層xt,還有一個(gè)循環(huán)的邊來提供上一時(shí)刻的隱藏狀態(tài)(hidden state)ht-1。在每一個(gè)時(shí)刻,循環(huán)神經(jīng)網(wǎng)絡(luò)的模塊A在讀取了xt和ht-1之后會(huì)生成新的隱藏狀態(tài)ht,并產(chǎn)生本時(shí)刻的輸出ot(在很多模型中隱藏狀態(tài)ht也被直接用于輸出,這類模型可以看作ot == ht的特性。一些資料直接用ht同時(shí)代表這兩個(gè)輸出),由于模型A中的運(yùn)算和變量在不同時(shí)刻是相同的,因此循環(huán)神經(jīng)網(wǎng)絡(luò)理論上可以被看作是同一神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)被無限復(fù)制的結(jié)果。正如卷積神經(jīng)網(wǎng)絡(luò)在不同的空間位置共享參數(shù),循環(huán)神經(jīng)網(wǎng)絡(luò)是在不同時(shí)間位置共享參數(shù),從而能夠使用有限的參數(shù)處理任意長度的序列。

3.展開輸入輸出序列

3.1 將完整的輸入輸出展開,可以得到上面的結(jié)構(gòu),可以更加清楚地看到循環(huán)神經(jīng)網(wǎng)絡(luò)在每一個(gè)時(shí)刻會(huì)有一個(gè)輸入xt,然后根據(jù)循環(huán)神經(jīng)網(wǎng)絡(luò)前一時(shí)刻的狀態(tài)ht-1計(jì)算新的狀態(tài)ht,并輸出ot。循環(huán)神經(jīng)網(wǎng)絡(luò)當(dāng)前的狀態(tài)ht是根據(jù)上一時(shí)刻的狀態(tài)ht-1和當(dāng)前的輸入xt共同決定的。在時(shí)刻t,狀態(tài)ht-1濃縮了前面序列x0,x1,...,xt-1的信息,用于作為輸出ot的參考。由于序列的長度可以無限延長,維度有限的h狀態(tài)不可能將序列的全部信息都保存下來,因此模型必須學(xué)習(xí)只保留與后面任務(wù)ot,ot+1,...相關(guān)的最重要的信息。

3.2 循環(huán)網(wǎng)絡(luò)的展開在模型訓(xùn)練中有重要意義。從上圖可以看出,循環(huán)神經(jīng)網(wǎng)絡(luò)對(duì)長度為N的序列展開之后,可以視為一個(gè)有N個(gè)中間層的前饋神經(jīng)網(wǎng)絡(luò)。這個(gè)前饋神經(jīng)網(wǎng)絡(luò)沒有循環(huán)鏈接,因此可以直接使用反向傳播算法進(jìn)行訓(xùn)練,而不需要任何特別的優(yōu)化算法。這樣的訓(xùn)練方法稱為“沿時(shí)間反向傳播”(Back-Propagation Through Time),是訓(xùn)練循環(huán)神經(jīng)網(wǎng)絡(luò)最常見的方法。

3.3 從上圖可以看出循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)特征最擅長解決與時(shí)間時(shí)序相關(guān)的問題。循環(huán)神經(jīng)網(wǎng)絡(luò)也是處理這類問題時(shí)最自然的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。對(duì)于一個(gè)序列數(shù)據(jù),可以將這個(gè)序列上不同時(shí)刻的數(shù)據(jù)依次傳入循環(huán)神經(jīng)網(wǎng)絡(luò)的輸入層,而輸出可以是對(duì)序列中下一個(gè)時(shí)刻的預(yù)測(cè),也可以是對(duì)當(dāng)前時(shí)刻信息的處理結(jié)果(比如語音識(shí)別結(jié)果)。循環(huán)神經(jīng)網(wǎng)絡(luò)要求每一個(gè)時(shí)刻都有一個(gè)輸入。但是不一定每一個(gè)時(shí)刻都需要有輸出。循環(huán)神經(jīng)網(wǎng)絡(luò)被廣泛地應(yīng)用在語音識(shí)別、語言模型、機(jī)器翻譯以及時(shí)序分析等問題上,并取得了巨大的成功。

4. 機(jī)器翻譯案例

循環(huán)神經(jīng)網(wǎng)絡(luò)中每一個(gè)時(shí)刻的輸入為需要翻譯的句子中的單詞,如下圖所示,需要翻譯的句子為ABCD,那么循環(huán)神經(jīng)網(wǎng)絡(luò)第一段每一個(gè)時(shí)刻的輸入就分別是A、B、C和D,然后用"_"作為待翻譯句子的結(jié)束符(句子結(jié)束符可以用符號(hào)或字符串表示,只要文本正文中沒有出現(xiàn)過即可)。在第一段中,循環(huán)神經(jīng)網(wǎng)絡(luò)沒有輸出。從結(jié)束符”_“開始,循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)入翻譯階段。該階段中每一個(gè)時(shí)刻的輸入是上一個(gè)時(shí)刻的輸出,而最終得到的輸出就是句子ABCD翻譯的結(jié)果,當(dāng)網(wǎng)絡(luò)輸出"_"時(shí)翻譯結(jié)束。

5.循環(huán)體介紹

如之前所介紹,循環(huán)神經(jīng)網(wǎng)絡(luò)可以看作是同一神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)在時(shí)間序列上被復(fù)制多次的結(jié)果,這個(gè)被復(fù)制多次的結(jié)構(gòu)被稱之為循環(huán)體。如何設(shè)計(jì)循環(huán)體的網(wǎng)絡(luò)結(jié)構(gòu)是循環(huán)神經(jīng)網(wǎng)絡(luò)解決實(shí)際問題的關(guān)鍵。下面展示了一個(gè)最簡單的循環(huán)體結(jié)構(gòu)。這個(gè)循環(huán)體中只使用了一個(gè)類似全連接層的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。

循環(huán)神經(jīng)網(wǎng)絡(luò)中的狀態(tài)是通過一個(gè)向量來表示的,這個(gè)向量的維度也稱為循環(huán)神經(jīng)網(wǎng)絡(luò)隱藏層的大小,假設(shè)其為n,上圖可以看出,循環(huán)體中的神經(jīng)網(wǎng)絡(luò)的輸入有兩部分,一部分為上一時(shí)刻的狀態(tài),另一部分為當(dāng)前時(shí)刻的輸入樣本。對(duì)于時(shí)間序列數(shù)據(jù)來說(比如不同時(shí)刻商品的銷量),每一時(shí)刻的輸入樣例可以是當(dāng)前時(shí)刻的數(shù)值(比如銷量值);對(duì)于語言模型來說,輸入樣例可以是當(dāng)前單詞對(duì)應(yīng)的單詞向量。

假設(shè)輸入向量的維度為x,隱藏狀態(tài)的維度為n,那么上圖中循環(huán)體的全連接層神經(jīng)網(wǎng)絡(luò)的輸入大小為n+x。也就是將上一時(shí)刻的狀態(tài)與當(dāng)前時(shí)刻的輸入拼接成一個(gè)大的向量作為循環(huán)體中神經(jīng)網(wǎng)絡(luò)的輸入(有時(shí)也將會(huì)將上一時(shí)刻狀態(tài)對(duì)應(yīng)的權(quán)重和當(dāng)前時(shí)刻輸入對(duì)應(yīng)的權(quán)重特意分開,但它們的實(shí)質(zhì)是一樣的。本節(jié)采用了向量拼接的方式)。因?yàn)樵撊B接層的輸出為當(dāng)前時(shí)刻的狀態(tài),于是輸出層的節(jié)點(diǎn)個(gè)數(shù)也為n,循環(huán)體中的參數(shù)個(gè)數(shù)為(n+x)xn+n。上圖可以看出,循環(huán)體中的神經(jīng)網(wǎng)絡(luò)輸出不但提供給了下一時(shí)刻作為狀態(tài),同時(shí)也會(huì)提供給當(dāng)前時(shí)刻的輸出。注意到循環(huán)體狀態(tài)與最終輸出的維度通常不同,因此為了將當(dāng)前時(shí)刻的狀態(tài)轉(zhuǎn)化為最終的輸出,循環(huán)神經(jīng)網(wǎng)絡(luò)還需要另外一個(gè)全連接神經(jīng)網(wǎng)絡(luò)來完成這個(gè)過程。這和卷積神經(jīng)網(wǎng)絡(luò)中最后的全連接層的意思是一樣的。類似的,不同時(shí)刻用于輸出的全連接神經(jīng)網(wǎng)絡(luò)中的參數(shù)也是一致的。

6. 循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程

如下圖所示,假設(shè)狀態(tài)的維度為2,輸入、輸出的維度都為1,而且循環(huán)體中的全連接層權(quán)重為:wrnn=[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]],偏置項(xiàng)的大小為brnn=[0.1, -0.1]。用于輸出的全連接層權(quán)重為:woutput=[1.0, 2.0],偏置項(xiàng)大小為boutput=0.1.那么在時(shí)刻t0,因?yàn)闆]有上一時(shí)刻,所以將狀態(tài)初始化為hinit=[0, 0],而當(dāng)前的輸入為1,所以拼接得到的向量為[0, 0, 1],通過循環(huán)體中的全連接層神經(jīng)網(wǎng)絡(luò)得到的結(jié)果為:

這個(gè)結(jié)果將作為下一時(shí)刻的輸入狀態(tài),同時(shí)循環(huán)神經(jīng)網(wǎng)絡(luò)也會(huì)使用該狀態(tài)生成輸出。將該向量作為輸入提供給用于輸出的全連接神經(jīng)網(wǎng)絡(luò)可以得到t0時(shí)刻的最終輸出:[0.537, 0.462]x[1.0, 2.0] + 0.1 = 1.56,使用t0時(shí)刻的狀態(tài)可以類似地推導(dǎo)得出t1時(shí)刻的狀態(tài)為[0.860, 0.884],而t1時(shí)刻的輸出為2.73。在得到循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播結(jié)果之后,可以和其他神經(jīng)網(wǎng)絡(luò)類似地定義損失函數(shù),循環(huán)神經(jīng)網(wǎng)絡(luò)唯一的區(qū)別在于因?yàn)樗總€(gè)時(shí)刻都有一個(gè)輸出,所以循環(huán)神經(jīng)網(wǎng)絡(luò)的總損失為所有時(shí)刻(或者部分時(shí)刻)上的損失函數(shù)的總和。

此前向傳播代碼練習(xí)參考:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_basis.py

和其他神經(jīng)網(wǎng)絡(luò)類似,在定義完損失函數(shù)之后,套用前面說的優(yōu)化框架(指數(shù)衰減法、滑動(dòng)平均模型、優(yōu)化器、正則化等)Tensorflow就可以自動(dòng)完成模型訓(xùn)練的過程。這里唯一需要特別指出的是,理論上循環(huán)神經(jīng)網(wǎng)絡(luò)可以支持任意長度的序列,然而在實(shí)際訓(xùn)練過程中,,如果序列過長,一方面會(huì)導(dǎo)致優(yōu)化時(shí)出現(xiàn)梯度消散和梯度爆炸的問題,另一方面,展開后的前饋神經(jīng)網(wǎng)絡(luò)會(huì)占用過大的內(nèi)存,所以實(shí)際中一般會(huì)規(guī)定一個(gè)最大長度,當(dāng)序列長度超過規(guī)定長度之后會(huì)對(duì)序列進(jìn)行截?cái)唷?/p>

二、長短時(shí)記憶網(wǎng)絡(luò)(LSTM)結(jié)構(gòu)

1. LSTM結(jié)構(gòu)詳情

在有些問題中,模型僅僅需要短期內(nèi)的信息來執(zhí)行當(dāng)前的任務(wù),在這樣的場(chǎng)景中,相關(guān)的信息和待預(yù)測(cè)的詞的位置之間的間隔很小,循環(huán)神經(jīng)網(wǎng)絡(luò)可以比較容易地利用先前的信息。這類問題可以用前面介紹的簡單循環(huán)體來解決。

但同樣也有一些上下文場(chǎng)景更加復(fù)雜的情況。比如一個(gè)模型僅僅根據(jù)短期的信息不能正確的預(yù)測(cè)正確的結(jié)果。這樣前面介紹的簡單循環(huán)神經(jīng)網(wǎng)絡(luò)有可能會(huì)喪失學(xué)習(xí)到距離如此遠(yuǎn)的信息的能力。或者在復(fù)雜語言場(chǎng)景中,有用信息的間隔有大有小、長短不一,循環(huán)神經(jīng)網(wǎng)絡(luò)的性能也會(huì)受到限制。

長短時(shí)記憶網(wǎng)絡(luò)(long short-term memory,LSTM)的設(shè)計(jì)就是為了解決這個(gè)問題,在很多任務(wù)上,采用LSTM結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò)比標(biāo)準(zhǔn)的循環(huán)神經(jīng)網(wǎng)絡(luò)表現(xiàn)更好。LSTM結(jié)構(gòu)是由Sepp Hochreiter和Jurgen Schmidhuber于1997年提出的,它是一種特殊的循環(huán)體結(jié)構(gòu)。如下圖所示,與單一tanh循環(huán)體結(jié)構(gòu)不同,LSTM是一種擁有三個(gè)“門”結(jié)構(gòu)的特殊網(wǎng)絡(luò)結(jié)構(gòu)。

LSTM靠一些“門”的結(jié)構(gòu)讓信息有選擇性地影響循環(huán)神經(jīng)網(wǎng)絡(luò)中每個(gè)時(shí)刻的狀態(tài)。所謂“門”的結(jié)構(gòu)就是一個(gè)使用sigmoid神經(jīng)網(wǎng)絡(luò)和一個(gè)按位做乘法的操作,這兩個(gè)操作合在一起就是一個(gè)“門”的結(jié)構(gòu)。之所以該結(jié)構(gòu)叫做“門”是因?yàn)槭褂胹igmoid作為激活函數(shù)的全連接神經(jīng)網(wǎng)絡(luò)層會(huì)輸出一個(gè)0到1之間的數(shù)值,描述當(dāng)前輸入有多少信息量可以通過這個(gè)結(jié)構(gòu)。于是這個(gè)結(jié)構(gòu)的功能就類似于一扇門,當(dāng)門打開時(shí)(sigmoid神經(jīng)網(wǎng)絡(luò)層輸出為1時(shí)),全部信息都可以通過;當(dāng),而門關(guān)上時(shí)(sigmoid神經(jīng)網(wǎng)絡(luò)層輸出為0時(shí)),任何信息都無法通過。

為了使循環(huán)神經(jīng)網(wǎng)絡(luò)更有效的保存長期記憶,上圖中“遺忘門”和“輸入門”至關(guān)重要,它們是LSTM結(jié)構(gòu)的核心。“遺忘門”的作用是讓循環(huán)神經(jīng)網(wǎng)絡(luò)“忘記”之前沒有用的信息。比如一段文章中先介紹了某地原來是綠水藍(lán)天,但后來被污染了。于是在看到被污染了之后,循環(huán)神經(jīng)網(wǎng)絡(luò)應(yīng)該“忘記”之前綠水藍(lán)天的狀態(tài)。這個(gè)工作是通過“遺忘門”來完成的。“遺忘門”會(huì)根據(jù)當(dāng)前的輸入xt和上一時(shí)刻輸出ht-1決定那一部分記憶需要被遺忘。假設(shè)狀態(tài)c的維度為n,“遺忘門”會(huì)根據(jù)當(dāng)前的輸入xt和上一時(shí)刻輸出ht-1計(jì)算一個(gè)維度為n的向量f=sigmoid(W1x +?W2h),它在每一維度上的值都在(0,1)范圍內(nèi)。再將上一時(shí)刻的狀態(tài)ct-1與f向量按位相乘,那么f取值接近0的維度上的信息就會(huì)被“忘記”,而f取值接近1的維度上的信息會(huì)被保留。

在循環(huán)神經(jīng)網(wǎng)絡(luò)“忘記”了部分之前的狀態(tài)后,它還需要從當(dāng)前的輸入補(bǔ)充最新的記憶。這個(gè)過程就是“輸入門”完成的。如上圖所示,“輸入門”會(huì)根據(jù)xt和ht-1決定哪些信息加入到轉(zhuǎn)態(tài)ct-1中生成新的狀態(tài)ct。比如當(dāng)看到文章中提到環(huán)境被污染之后,模型需要將這個(gè)信息寫入新的狀態(tài)。這時(shí)“輸入門”和需要寫入的新狀態(tài)都從xt和ht-1計(jì)算產(chǎn)生。通過“遺忘門”和“輸入門”,LSTM結(jié)構(gòu)可以更加有效地決定哪些信息應(yīng)該被遺忘,哪些信息應(yīng)該得到保留。

LSTM結(jié)構(gòu)在計(jì)算得到新的狀態(tài)ct后需要產(chǎn)生當(dāng)前時(shí)刻的輸出,這個(gè)過程是通過“輸出門”完成的。“輸出門”會(huì)根據(jù)最新的狀態(tài)ct、上一時(shí)刻的輸出ht-1和當(dāng)前的輸入xt來決定該時(shí)刻的輸出ht。比如當(dāng)前的狀態(tài)為被污染,那么“天空的顏色”后面的單詞很可能就是“灰色的”。

2. LSTM的前向傳播

相比1.6介紹的循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),使用LSTM結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播是一個(gè)相對(duì)比較復(fù)雜的過程。具體LSTM每個(gè)“門”的公式定義如下:

z = tanh(Wz[ht-1,xt])? ? (輸入值)? ? ? ? i = sigmoid(Wi[ht-1,xt])? ? ? ? (輸入門)

f = sigmoid((Wf[ht-1,xt])) (遺忘門)? o = sigmoid(Wo[ht-1,xt])? ? (輸出門)

ct = f * ct-1?+ i * z? ?(新狀態(tài))? ? ht = o * tanh ct? ?(輸出)

其中Wz、Wi、Wf、Wo是4個(gè)維度為[2n, n]的參數(shù)矩陣。下面用流程圖的形式表示了上面的公式。

輸入:Ct-1、ht-1、Xt,輸出:Ct、ht

用tensorflow定義一個(gè)LSTM結(jié)構(gòu):https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/LSTM_test.py

三、循環(huán)神經(jīng)網(wǎng)絡(luò)的變種

1. 雙向循環(huán)神經(jīng)網(wǎng)絡(luò)

在經(jīng)典的循環(huán)神經(jīng)網(wǎng)絡(luò)中,狀態(tài)的傳輸是從前往后單向的。然而,在有些問題中,當(dāng)前時(shí)刻的輸出不僅和之前的狀態(tài)有關(guān),也和之后的狀態(tài)相關(guān)。這時(shí)就需要使用雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(bidirectional RNN)來解決這類問題。例如預(yù)測(cè)一個(gè)句子中缺失的單詞不僅需要根據(jù)前文來判斷,也需要根據(jù)后面的內(nèi)容,這時(shí)雙向循環(huán)神經(jīng)網(wǎng)絡(luò)就可以發(fā)揮它的作用。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)是由兩個(gè)獨(dú)立的循環(huán)神經(jīng)網(wǎng)絡(luò)疊加到一起組成的。輸出由這兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)的輸出拼接而成。如下圖所示結(jié)構(gòu)。

從上圖可以看出,雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的主體結(jié)構(gòu)就是兩個(gè)單向循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)合。在每一個(gè)時(shí)刻t,輸入會(huì)同時(shí)提供給這兩個(gè)方向相反的循環(huán)神經(jīng)網(wǎng)絡(luò)。兩個(gè)網(wǎng)絡(luò)獨(dú)立進(jìn)行計(jì)算,各自產(chǎn)生該時(shí)刻的新狀態(tài)和輸出。而雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的最終輸出是這兩個(gè)單向循環(huán)神經(jīng)網(wǎng)絡(luò)的輸出的簡單拼裝。兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)除方向不同以外,其余結(jié)構(gòu)完全對(duì)稱。每一層網(wǎng)絡(luò)中的循環(huán)體可以自由選用任意結(jié)構(gòu),如前面說的簡單RNN、LSTM均作為雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的循環(huán)體。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程和單向的循環(huán)神經(jīng)網(wǎng)絡(luò)十分類似。

2. 深層循環(huán)神經(jīng)網(wǎng)絡(luò)

深層循環(huán)神經(jīng)網(wǎng)絡(luò)(Deep RNN)是循環(huán)神經(jīng)網(wǎng)絡(luò)的另外一種變種。為了增強(qiáng)模型的表達(dá)能力,可以在網(wǎng)路中設(shè)置多個(gè)循環(huán)層,將每層循環(huán)網(wǎng)絡(luò)的輸出傳給下一層進(jìn)行處理。在前面描述的單層循環(huán)網(wǎng)絡(luò)中,每一時(shí)刻的輸入xt到輸出ot之間只有一個(gè)全連接層,因此在xt到ot的路徑上是一個(gè)很淺的神經(jīng)網(wǎng)絡(luò),從輸入中提取抽象信息的能力將受到限制。下圖給出的深層循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。可以看出,在一個(gè)L層的深層循環(huán)網(wǎng)絡(luò)中,每一個(gè)時(shí)刻的輸入xt到輸出ot之間有L個(gè)循環(huán)體,網(wǎng)絡(luò)因此可以從輸入中抽取更加高層的信息。和CNN類似,每一層(每個(gè)時(shí)刻的相同層,比如h1init是0時(shí)刻到t時(shí)刻的第一層)的循環(huán)體中參數(shù)是一致的,而不同層中的參數(shù)可以不同。Tensorflow中提供了MultiRNNCell類來實(shí)現(xiàn)深層循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程。

用Tensorflow實(shí)現(xiàn)一個(gè)Deep RNN前向傳播過程:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_Deep.py

四、循環(huán)神經(jīng)網(wǎng)絡(luò)的dropout

在CNN時(shí)有使用過dropout方法。通過dropout方法,可以讓卷積神經(jīng)網(wǎng)絡(luò)更加健壯。類似的,在循環(huán)神經(jīng)網(wǎng)絡(luò)中使用dropout也有同樣的功能。而且,類似CNN只在最后的全連接層中使用dropout,RNN一般只在不同層循環(huán)體結(jié)構(gòu)之間使用dropout,而不再同一層的循環(huán)體結(jié)構(gòu)之間使用。如下圖,也就是說從時(shí)刻t-1傳遞到時(shí)刻t時(shí),RNN不會(huì)進(jìn)行狀態(tài)的dropout;而在同一時(shí)刻t中,不同層循環(huán)體之間會(huì)使用dropout(下圖實(shí)線箭頭表示不使用dropout,虛線箭頭表示使用dropout)。

如上圖所示。假設(shè)要從t-2時(shí)刻的輸入xt-2傳遞到t+1時(shí)刻的輸入yt+1,那么xt-2將首先傳入第一層循環(huán)體結(jié)構(gòu),這個(gè)過程會(huì)使用dropout。但是從t-2時(shí)刻的第一層循環(huán)體結(jié)構(gòu)傳遞到第一層的t-1、t、t+1時(shí)刻不會(huì)使用dropout。在t+1時(shí)刻的第一層循環(huán)體結(jié)構(gòu)傳遞到傳遞到同一時(shí)刻內(nèi)更高層的循環(huán)體結(jié)構(gòu)時(shí),會(huì)再次使用dropout,tensorflow中可以用tf.nn.rnn_cell.DropoutWrapper類實(shí)現(xiàn)dropout功能。可以參考此地址練習(xí):https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_dropout.py

?五、RNN樣例應(yīng)用

前面已經(jīng)介紹了不同循環(huán)神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)結(jié)構(gòu),并給出了具體的Tensorflow程序來實(shí)現(xiàn)這些循環(huán)神經(jīng)網(wǎng)絡(luò)的前向傳播過程。將以時(shí)序預(yù)測(cè)為例,利用循環(huán)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)對(duì)函數(shù)sinx取值的預(yù)測(cè)。下面給出了sin函數(shù)的函數(shù)圖像。

下面將用Tensorflow程序來實(shí)現(xiàn)預(yù)測(cè)sin函數(shù)。因?yàn)檠h(huán)神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)的是離散時(shí)刻的取值,所以在程序中需要將連續(xù)的sin函數(shù)曲線離散化。所謂離散化就是在一個(gè)給定的區(qū)間[0, MAX]內(nèi),通過有限個(gè)采樣點(diǎn)模擬一個(gè)連續(xù)的曲線。比如在以下練習(xí)中每個(gè)SAMPLE_ITERVAL對(duì)sin函數(shù)進(jìn)行一次采樣,采樣得到的序列就是sin函數(shù)離散化之后的結(jié)果。練習(xí)代碼地址為:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_sin_case.py

https://www.cnblogs.com/eagou/p/9257380.html

轉(zhuǎn)載于:https://www.cnblogs.com/bestExpert/p/10633794.html

總結(jié)

以上是生活随笔為你收集整理的tensorflow-RNN和LSTM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。