使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐

一 RNN的長期依賴問題

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

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

假設X0的輸入為”我住在深圳”,後面插入了很多其他的句子,然後在Xt輸入了“我在市政府上班”。由於X0與Xt相差很遠,當RNN輸入到Xt時,t時刻的記憶ht已經喪失了X0時保存的信息了。因此在Xt時刻神經網絡無法理解到我是在哪一個城市的市政府上班了。

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐

二 LSTM原理講解

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

所有RNN都具有一種重複神經網絡模塊的鏈式的形式。在標準的RNN 中,這個重複的模塊只有一個非常簡單的結構,例如一個tanh層。

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


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

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


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

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


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

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

1. 細胞狀態(Ct)

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

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐

2. 遺忘門

控制遺忘上一層細胞狀態的內容,根據上一序列的ht-1和本序列的Xt為輸入,通過sigmoid激活函數,得到上一層細胞狀態內容哪些需要去除,那些需要保留。值得注意的是,該輸入是以向量的形式,我們希望遺忘門輸出的值大多為0或1,即對向量中的每個值是完全忘記或者完全記住,因此我們使用的是sigmoid函數作為激活函數,因為該函數在許多取值範圍內的值都接近於0或1(這裡不能用階躍函數作為激活函數,因為它在所有位置的梯度都為0,無法作為激活函數)。其他門使用sigmoid函數同理。因此,雖然在其他神經網絡可以變換激活函數,但並不建議變換LSTM的激活函數。

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


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

3. 輸入門

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

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


有了遺忘門和輸入門,現在我們就能把細胞狀態Ct−1更新為Ct了。如下圖所示,其中ft×Ct−1表示希望刪除的信息,it×Ct表示新增的信息。

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


4. 輸出門

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

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


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

三 雙向LSTM(Bi-directional LSTM)

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

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐

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


使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐

四 Keras實現LSTM和雙向LSTM

Keras對循環神經網絡的支持和封裝在上一篇文章已經講解了,在這裡僅介紹兩個模型的搭建,如有疑問請閱讀上一篇文章--使用Keras進行深度學習:(五)RNN和雙向RNN講解及實踐

使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


使用Keras進行深度學習:(六)LSTM和雙向LSTM講解及實踐


(參考資料:https://colah.github.io/posts/2015-08-Understanding-LSTMs/)



對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站http://www.panchuang.net 我們的公眾號:磐創AI。



分享到:


相關文章: