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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tensorflow-RNN和LSTM

發布時間:2024/4/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tensorflow-RNN和LSTM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本章主要介紹循環神經網絡(recurrent neuralnetwork,RNN)和長短時記憶網絡(long short-term memory,LSTM)

一. RNN簡介

1.背景

循環神經網絡挖掘數據中的時序信息以及語義信息的深度表達能力別充分利用,并在語音識別、語言模型、機器翻譯以及時序分析等方面實現了突破。

循環神經網絡的主要用途是處理和預測序列數據。在全連接神經網絡或卷積神經網絡中,網絡結構都是從輸入層到隱藏層再到輸出層,層與層之間是全連接或部分連接的,但每層之間的節點是無連接的??紤]這樣一個問題,如果要預測句子的下一個單詞是什么,一般需要用到當前單詞以及前面的單詞,因為句子中前后單詞并不是獨立的。循環神經網絡的來源就是為了刻畫一個序列當前的輸出與之前信息的關系。從網絡結構上,循環神經網絡會記憶之前的信息,并利用之前的信息影響后面節點的輸出。也就是說,循環神經網絡的隱藏層之間的節點是有連接的,隱藏層的輸入不僅包括輸入層的輸出,還包括上一時刻隱藏層的輸出。

2.RNN經典結構

如上所示為一個經典的循環神經網絡結構??梢钥吹皆诿恳粫r刻t,循環神經網絡會針對該時刻的輸入結合當前模型的狀態給出一個輸出,并更新模型狀態。此結構A的輸入除了來自輸入層xt,還有一個循環的邊來提供上一時刻的隱藏狀態(hidden state)ht-1。在每一個時刻,循環神經網絡的模塊A在讀取了xt和ht-1之后會生成新的隱藏狀態ht,并產生本時刻的輸出ot(在很多模型中隱藏狀態ht也被直接用于輸出,這類模型可以看作ot == ht的特性。一些資料直接用ht同時代表這兩個輸出),由于模型A中的運算和變量在不同時刻是相同的,因此循環神經網絡理論上可以被看作是同一神經網絡結構被無限復制的結果。正如卷積神經網絡在不同的空間位置共享參數,循環神經網絡是在不同時間位置共享參數,從而能夠使用有限的參數處理任意長度的序列。

3.展開輸入輸出序列

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

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

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

4. 機器翻譯案例

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

5.循環體介紹

如之前所介紹,循環神經網絡可以看作是同一神經網絡結構在時間序列上被復制多次的結果,這個被復制多次的結構被稱之為循環體。如何設計循環體的網絡結構是循環神經網絡解決實際問題的關鍵。下面展示了一個最簡單的循環體結構。這個循環體中只使用了一個類似全連接層的神經網絡結構。

循環神經網絡中的狀態是通過一個向量來表示的,這個向量的維度也稱為循環神經網絡隱藏層的大小,假設其為n,上圖可以看出,循環體中的神經網絡的輸入有兩部分,一部分為上一時刻的狀態,另一部分為當前時刻的輸入樣本。對于時間序列數據來說(比如不同時刻商品的銷量),每一時刻的輸入樣例可以是當前時刻的數值(比如銷量值);對于語言模型來說,輸入樣例可以是當前單詞對應的單詞向量。

假設輸入向量的維度為x,隱藏狀態的維度為n,那么上圖中循環體的全連接層神經網絡的輸入大小為n+x。也就是將上一時刻的狀態與當前時刻的輸入拼接成一個大的向量作為循環體中神經網絡的輸入(有時也將會將上一時刻狀態對應的權重和當前時刻輸入對應的權重特意分開,但它們的實質是一樣的。本節采用了向量拼接的方式)。因為該全連接層的輸出為當前時刻的狀態,于是輸出層的節點個數也為n,循環體中的參數個數為(n+x)xn+n。上圖可以看出,循環體中的神經網絡輸出不但提供給了下一時刻作為狀態,同時也會提供給當前時刻的輸出。注意到循環體狀態與最終輸出的維度通常不同,因此為了將當前時刻的狀態轉化為最終的輸出,循環神經網絡還需要另外一個全連接神經網絡來完成這個過程。這和卷積神經網絡中最后的全連接層的意思是一樣的。類似的,不同時刻用于輸出的全連接神經網絡中的參數也是一致的。

6. 循環神經網絡的前向傳播過程

如下圖所示,假設狀態的維度為2,輸入、輸出的維度都為1,而且循環體中的全連接層權重為:wrnn=[[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]],偏置項的大小為brnn=[0.1, -0.1]。用于輸出的全連接層權重為:woutput=[1.0, 2.0],偏置項大小為boutput=0.1.那么在時刻t0,因為沒有上一時刻,所以將狀態初始化為hinit=[0, 0],而當前的輸入為1,所以拼接得到的向量為[0, 0, 1],通過循環體中的全連接層神經網絡得到的結果為:

這個結果將作為下一時刻的輸入狀態,同時循環神經網絡也會使用該狀態生成輸出。將該向量作為輸入提供給用于輸出的全連接神經網絡可以得到t0時刻的最終輸出:[0.537, 0.462]x[1.0, 2.0] + 0.1 = 1.56,使用t0時刻的狀態可以類似地推導得出t1時刻的狀態為[0.860, 0.884],而t1時刻的輸出為2.73。在得到循環神經網絡的前向傳播結果之后,可以和其他神經網絡類似地定義損失函數,循環神經網絡唯一的區別在于因為它每個時刻都有一個輸出,所以循環神經網絡的總損失為所有時刻(或者部分時刻)上的損失函數的總和。

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

和其他神經網絡類似,在定義完損失函數之后,套用前面說的優化框架(指數衰減法、滑動平均模型、優化器、正則化等)Tensorflow就可以自動完成模型訓練的過程。這里唯一需要特別指出的是,理論上循環神經網絡可以支持任意長度的序列,然而在實際訓練過程中,,如果序列過長,一方面會導致優化時出現梯度消散和梯度爆炸的問題,另一方面,展開后的前饋神經網絡會占用過大的內存,所以實際中一般會規定一個最大長度,當序列長度超過規定長度之后會對序列進行截斷。

二、長短時記憶網絡(LSTM)結構

1. LSTM結構詳情

在有些問題中,模型僅僅需要短期內的信息來執行當前的任務,在這樣的場景中,相關的信息和待預測的詞的位置之間的間隔很小,循環神經網絡可以比較容易地利用先前的信息。這類問題可以用前面介紹的簡單循環體來解決。

但同樣也有一些上下文場景更加復雜的情況。比如一個模型僅僅根據短期的信息不能正確的預測正確的結果。這樣前面介紹的簡單循環神經網絡有可能會喪失學習到距離如此遠的信息的能力?;蛘咴趶碗s語言場景中,有用信息的間隔有大有小、長短不一,循環神經網絡的性能也會受到限制。

長短時記憶網絡(long short-term memory,LSTM)的設計就是為了解決這個問題,在很多任務上,采用LSTM結構的循環神經網絡比標準的循環神經網絡表現更好。LSTM結構是由Sepp Hochreiter和Jurgen Schmidhuber于1997年提出的,它是一種特殊的循環體結構。如下圖所示,與單一tanh循環體結構不同,LSTM是一種擁有三個“門”結構的特殊網絡結構。

LSTM靠一些“門”的結構讓信息有選擇性地影響循環神經網絡中每個時刻的狀態。所謂“門”的結構就是一個使用sigmoid神經網絡和一個按位做乘法的操作,這兩個操作合在一起就是一個“門”的結構。之所以該結構叫做“門”是因為使用sigmoid作為激活函數的全連接神經網絡層會輸出一個0到1之間的數值,描述當前輸入有多少信息量可以通過這個結構。于是這個結構的功能就類似于一扇門,當門打開時(sigmoid神經網絡層輸出為1時),全部信息都可以通過;當,而門關上時(sigmoid神經網絡層輸出為0時),任何信息都無法通過。

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

在循環神經網絡“忘記”了部分之前的狀態后,它還需要從當前的輸入補充最新的記憶。這個過程就是“輸入門”完成的。如上圖所示,“輸入門”會根據xt和ht-1決定哪些信息加入到轉態ct-1中生成新的狀態ct。比如當看到文章中提到環境被污染之后,模型需要將這個信息寫入新的狀態。這時“輸入門”和需要寫入的新狀態都從xt和ht-1計算產生。通過“遺忘門”和“輸入門”,LSTM結構可以更加有效地決定哪些信息應該被遺忘,哪些信息應該得到保留。

LSTM結構在計算得到新的狀態ct后需要產生當前時刻的輸出,這個過程是通過“輸出門”完成的。“輸出門”會根據最新的狀態ct、上一時刻的輸出ht-1和當前的輸入xt來決定該時刻的輸出ht。比如當前的狀態為被污染,那么“天空的顏色”后面的單詞很可能就是“灰色的”。

2. LSTM的前向傳播

相比1.6介紹的循環神經網絡結構,使用LSTM結構的循環神經網絡的前向傳播是一個相對比較復雜的過程。具體LSTM每個“門”的公式定義如下:

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? ?(新狀態)? ? ht = o * tanh ct? ?(輸出)

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

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

用tensorflow定義一個LSTM結構:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/LSTM_test.py

三、循環神經網絡的變種

1. 雙向循環神經網絡

在經典的循環神經網絡中,狀態的傳輸是從前往后單向的。然而,在有些問題中,當前時刻的輸出不僅和之前的狀態有關,也和之后的狀態相關。這時就需要使用雙向循環神經網絡(bidirectional RNN)來解決這類問題。例如預測一個句子中缺失的單詞不僅需要根據前文來判斷,也需要根據后面的內容,這時雙向循環神經網絡就可以發揮它的作用。雙向循環神經網絡是由兩個獨立的循環神經網絡疊加到一起組成的。輸出由這兩個循環神經網絡的輸出拼接而成。如下圖所示結構。

從上圖可以看出,雙向循環神經網絡的主體結構就是兩個單向循環神經網絡的結合。在每一個時刻t,輸入會同時提供給這兩個方向相反的循環神經網絡。兩個網絡獨立進行計算,各自產生該時刻的新狀態和輸出。而雙向循環神經網絡的最終輸出是這兩個單向循環神經網絡的輸出的簡單拼裝。兩個循環神經網絡除方向不同以外,其余結構完全對稱。每一層網絡中的循環體可以自由選用任意結構,如前面說的簡單RNN、LSTM均作為雙向循環神經網絡的循環體。雙向循環神經網絡的前向傳播過程和單向的循環神經網絡十分類似。

2. 深層循環神經網絡

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

用Tensorflow實現一個Deep RNN前向傳播過程:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_Deep.py

四、循環神經網絡的dropout

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

如上圖所示。假設要從t-2時刻的輸入xt-2傳遞到t+1時刻的輸入yt+1,那么xt-2將首先傳入第一層循環體結構,這個過程會使用dropout。但是從t-2時刻的第一層循環體結構傳遞到第一層的t-1、t、t+1時刻不會使用dropout。在t+1時刻的第一層循環體結構傳遞到傳遞到同一時刻內更高層的循環體結構時,會再次使用dropout,tensorflow中可以用tf.nn.rnn_cell.DropoutWrapper類實現dropout功能??梢詤⒖即说刂肪毩?#xff1a;https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_dropout.py

?五、RNN樣例應用

前面已經介紹了不同循環神經網絡的網絡結構,并給出了具體的Tensorflow程序來實現這些循環神經網絡的前向傳播過程。將以時序預測為例,利用循環神經網絡實現對函數sinx取值的預測。下面給出了sin函數的函數圖像。

下面將用Tensorflow程序來實現預測sin函數。因為循環神經網絡模型預測的是離散時刻的取值,所以在程序中需要將連續的sin函數曲線離散化。所謂離散化就是在一個給定的區間[0, MAX]內,通過有限個采樣點模擬一個連續的曲線。比如在以下練習中每個SAMPLE_ITERVAL對sin函數進行一次采樣,采樣得到的序列就是sin函數離散化之后的結果。練習代碼地址為:https://github.com/pythonAndAI/tensorflow-exercise/blob/master/com/tensorflow/exercise/RNN/RNN_sin_case.py

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

轉載于:https://www.cnblogs.com/bestExpert/p/10633794.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。