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

磐石001發表於2018-05-04

歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識!

介紹

長短期記憶(Long Short Term Memory, LSTM)也是一種時間遞迴神經網路,最早由 Hochreiter & Schmidhuber 在1997年提出,設計初衷是希望能夠解決RNN中的長期依賴問題,讓記住長期資訊成為神經網路的預設行為,而不是需要很大力氣才能學會。

目錄

  • RNN的長期依賴問題
  • LSTM原理講解
  • 雙向LSTM原理講解
  • 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時刻神經網路無法理解到我是在哪一個城市的市政府上班了。

二、LSTM原理講解

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

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

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

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

在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。粉色的圈代表 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中,需要調整),將這兩部分相乘就得到了我們希望輸出的那部分。

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

 

三、雙向LSTM(Bi-directional LSTM)

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

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

四、Keras實現LSTM和雙向LSTM

Keras對迴圈神經網路的支援和封裝在上一篇文章已經講解了,在這裡僅介紹兩個模型的搭建,如有疑問請閱讀keras系列的上一篇文章。

參考文獻:https://colah.github.io/posts/2015-08-Understanding-LSTMs/

本篇文章出自http://www.tensorflownews.com,對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!


相關文章