LSTM和雙向LSTM講解及實踐

LSTM和雙向LSTM講解及實踐

目錄網絡

RNN的長期依賴問題
LSTM原理講解
雙向LSTM原理講解
Keras實現LSTM和雙向LSTM函數

1、RNN的長期依賴問題學習

在上篇文章中介紹的循環神經網絡RNN在訓練的過程當中會有長期依賴的問題,這是因爲RNN模型在訓練時會遇到梯度消失(大部分狀況)或者梯度爆炸(不多,但對優化過程影響很大)的問題。對於梯度爆炸是很好解決的,可使用梯度修剪(Gradient Clipping),即當梯度向量大於某個閾值,縮放梯度向量。但對於梯度消失是很難解決的。所謂的梯度消失或梯度爆炸是指訓練時計算和反向傳播,梯度傾向於在每一時刻遞減或遞增,通過一段時間後,梯度就會收斂到零(消失)或發散到無窮大(爆炸)。簡單來講,長期依賴的問題就是在每個時間的間隔不斷增大時,RNN會喪失到鏈接到遠處信息的能力。優化

以下圖,隨着時間點t的不斷遞增,當t時刻和0時刻的時間間隔較大的時候,t時刻的記憶ht可能已經喪失了學習鏈接到遠處0時刻的信息的能力了。.net

假設X0的輸入爲」我住在深圳」,後面插入了不少其餘的句子,而後在Xt輸入了「我在市政府上班」。因爲X0與Xt相差很遠,當RNN輸入到Xt時,t時刻的記憶ht已經喪失了X0時保存的信息了。所以在Xt時刻神經網絡沒法理解到我是在哪個城市的市政府上班了。設計

 

 

2、LSTM原理講解3d

在理論上,RNN絕對能夠處理這樣的長期依賴問題。人們能夠仔細挑選參數來解決這類問題中的最初級形式,但在實踐中,RNN卻不可以成功學習到這些知識。所以,LSTM就是爲了解決長期依賴問題而生的,LSTM經過刻意的設計來避免長期依賴問題。記住長期的信息在實踐中是 LSTM的默認行爲,而非須要付出很大代價才能得到的能力!blog

全部RNN都具備一種重複神經網絡模塊的鏈式的形式。在標準的RNN 中,這個重複的模塊只有一個很是簡單的結構,例如一個tanh層。\圖片

 

LSTM一樣是這樣的結構,可是重複的模塊擁有一個不一樣的結構。不一樣於 單一神經網絡層,這裏是有四個,以一種很是特殊的方式進行交互。ip

先介紹上圖中的符號意義:

 

 

 

在上面的圖例中,每一條黑線傳輸着一整個向量,從一個節點的輸出到其餘節點的輸入。粉色的圈表明 pointwise 的操做,諸如向量的和,而黃色的矩陣就是學習到的神經網絡層。合在一塊兒的線表示向量的鏈接,分開的線表示內容被複制,而後分發到不一樣的位置。

接下來將對LSTM進行逐步理解。在每一個記憶單元(圖中A)中包括細胞狀態(Ct),遺忘門,輸入門和輸出門。這些門結構能讓信息選擇性經過,用來去除或者增長信息到細胞狀態。

 

 

1.細胞狀態(Ct)

t時刻的記憶信息,用來保存重要信息。就好像咱們的筆記本同樣,保存了咱們之前學過的知識點。以下圖的水平線從圖上方貫穿運行,直接在整個鏈上運行,使得信息在上面流傳保持不變會很容易。

 

2.遺忘門

控制遺忘上一層細胞狀態的內容,根據上一序列的ht-1和本序列的Xt爲輸入,經過sigmoid激活函數,獲得上一層細胞狀態內容哪些須要去除,那些須要保留。值得注意的是,該輸入是以向量的形式,咱們但願遺忘門輸出的值大多爲0或1,即對向量中的每一個值是徹底忘記或者徹底記住,所以咱們使用的是sigmoid函數做爲激活函數,由於該函數在許多取值範圍內的值都接近於0或1(這裏不能用階躍函數做爲激活函數,由於它在全部位置的梯度都爲0,沒法做爲激活函數)。其餘門使用sigmoid函數同理。所以,雖然在其餘神經網絡能夠變換激活函數,但並不建議變換LSTM的激活函數。

以一個例子來講明遺忘門的做用:在語言模型中,細胞狀態可能保存着這樣的重要信息:當前主語爲單數或者複數等。如當前的主語爲「小明」,當輸入爲「同窗們」,此時遺傳門就要開始「幹活」了,將「小明」遺忘,主語爲單數形式遺忘。

3.輸入門

處理當前序列位置的輸入,肯定須要更新的信息,去更新細胞狀態。此過程分爲兩部分,一部分是使用包含sigmoid層的輸入門決定哪些新信息該被加入到細胞狀態;肯定了哪些新信息要加入後,須要將新信息轉換成可以加入到細胞狀態的形式。因此另外一部分是使用tanh函數產生一個新的候選向量。(能夠這麼理解,LSTM的作法是對信息都轉爲能加入細胞狀態的形式,而後再經過第一部分獲得的結果肯定其中哪些新信息加入到細胞狀態。)

有了遺忘門和輸入門,如今咱們就能把細胞狀態Ct−1更新爲Ct了。以下圖所示,其中ft×Ct−1表示但願刪除的信息,it×Ct表示新增的信息。

 

 

4.輸出門

最後要基於細胞狀態保存的內容來肯定輸出什麼內容。即選擇性的輸出細胞狀態保存的內容。相似於輸入門兩部分實現更新同樣,輸出門也是須要使用sigmoid激活函數肯定哪一個部分的內容須要輸出,而後再使用tanh激活函數對細胞狀態的內容進行處理(由於經過上面計算獲得的Ct每一個值不是在tanh的取值範圍-1~1中,須要調整),將這兩部分相乘就獲得了咱們但願輸出的那部分。

 

 

舉個例子,一樣在語言模型中,細胞狀態中此時包含不少重要信息,好比:主語爲單數形式,時態爲過去時態,主語的性別爲男性等,此時輸入爲一個主語,可能須要輸出與動詞相關的信息,這個時候只須要輸出是單數形式和時態爲過程,而不須要輸出主語性別就可肯定動詞詞性的變化。

 

3、雙向LSTM(Bi-directional LSTM)

                 

如上篇文章BRNN所述同理,有些時候預測可能須要由前面若干輸入和後面若干輸入共同決定,這樣會更加準確。所以提出了雙向循環神經網絡,網絡結構以下圖。能夠看到Forward層和Backward層共同鏈接着輸出層,其中包含了6個共享權值w1-w6。

 

 

在Forward層從1時刻到t時刻正向計算一遍,獲得並保存每一個時刻向前隱含層的輸出。在Backward層沿着時刻t到時刻1反向計算一遍,獲得並保存每一個時刻向後隱含層的輸出。最後在每一個時刻結合Forward層和Backward層的相應時刻輸出的結果獲得最終的輸出,用數學表達式以下:

 

 

有些問題,其實稍微看看就能夠明白。

 

4、Keras實現LSTM和雙向LSTM

Keras對循環神經網絡的支持和封裝在上一篇文章已經講解了,在這裏僅介紹兩個模型的搭建,若有疑問請閱讀keras系列的上一篇文章。

 

 

 

 

 

 

原文連接:https://blog.csdn.net/fendouaini/article/details/8019899

 

單向LSTM與雙向LSTM對比,一個簡單的DEMO:實現手寫數字圖片的識別

https://blog.csdn.net/kudou1994/article/details/80851227

相關文章
相關標籤/搜索