1. 程式人生 > >長短時記憶網路LSTM

長短時記憶網路LSTM

因為迴圈神經網路很難訓練的原因,這導致了它在實際應用中,很難處理長距離的依賴。我們將介紹一種改進之後的迴圈神經網路:長短時記憶網路(Long Short Term Memory Network, LSTM),它成功的解決了原始迴圈神經網路的缺陷,成為當前最流行的RNN,在語音識別、圖片描述、自然語言處理等許多領域中成功應用。但不幸的一面是,LSTM的結構很複雜,因此,我們再介紹一種LSTM的變體:GRU (Gated Recurrent Unit)。 它的結構比LSTM簡單,而效果卻和LSTM一樣好,因此,它正在逐漸流行起來。

原始RNN的隱藏層只有一個狀態,即h,它對於短期的輸入非常敏感。那麼,假如我們再增加一個狀態,即c,讓它來儲存長期的狀態,那麼問題不就解決了麼?如下圖所示:

新增加的狀態c,稱為單元狀態(cell state)。我們把上圖按照時間維度展開:

上圖僅僅是一個示意圖,我們可以看出,在t時刻,LSTM的輸入有三個:當前時刻網路的輸入值、上一時刻LSTM的輸出值、以及上一時刻的單元狀態;LSTM的輸出有兩個:當前時刻LSTM輸出值、和當前時刻的單元狀態

LSTM的關鍵,就是怎樣控制長期狀態。在這裡,LSTM的思路是使用三個控制開關。第一個開關,負責控制繼續儲存長期狀態(也就是說上一時刻狀態是否匯入);第二個開關,負責控制把即時狀態輸入到長期狀態;第三個開關,負責控制是否把長期狀態作為當前的LSTM的輸出。三個開關的作用如下圖所示:

接下來,我們要描述一下,輸出

和單元狀態的具體計算方法。

LSTM前向計算

的概念:假設W是該門的權重向量,b是偏置項,則:是sigmoid函式,那麼的值域為0到1之間的實數向量;門的使用,就是用門的輸出向量按元素乘以我們需要控制的那個向量。因為門的輸出是0到1之間的實數向量,那麼,當門輸出為0時,任何向量與之相乘都會得到0向量,這就相當於啥都不能通過;輸出為1時,任何向量與之相乘都不會有任何改變,這就相當於啥都可以通過;這就是門和開關的對應關係。

遺忘門:它決定了上一時刻的單元狀態有多少保留到當前時刻

輸入門:它決定了針對當前輸入的單元狀態有多少儲存到當前時刻的單元狀態;(此處與原部落格理解不一樣,請大家指點)

輸出門

:控制單元狀態有多少輸出到LSTM的當前輸出值

這幾個門與上述的開關相配合來計算當前

 

如上圖所示:這三個門:

輸入都為表示把兩個向量連線成一個更長的向量;我們以為例,權重矩陣都是由兩個矩陣拼接而成的,如上公式一個是,對應著輸入項,一個是,對應著輸入項

針對於當前輸入的單元狀態

則所求的:

LSTM訓練演算法

LSTM的訓練演算法仍然是反向傳播演算法,對於這個演算法,我們已經非常熟悉了。主要有下面三個步驟:

1.前向計算每個神經元的輸出值,對於LSTM來說,即五個向量的值。計算方法已經在上一節中描述過了。

2.反向計算每個神經元的誤差項值。與迴圈神經網路一樣,LSTM誤差項的反向傳播也是包括兩個方向:一個是沿時間的反向傳播,即從當前t時刻開始,計算每個時刻的誤差項;一個是將誤差項向上一層傳播。

3.根據相應的誤差項,計算每個權重的梯度。

誤差項沿時間的反向傳遞

在t時刻,LSTM的輸出值,定義t時刻的誤差項為:;這裡假設誤差項是損失函式對輸出值的導數,而不是對加權輸入的導數。對於這四個加權輸入及他們的誤差項:

,              

推導過程參見部落格,最後得到公式:

,其中:

那麼我們就得到誤差項向前傳遞到任意時刻k的公式:

將誤差傳遞到上一層

我們假設當前為第l層,定義l-1層的誤差項是誤差函式對l-1層加權輸入的導數,即:

,因為在本層下,輸入為:表示l-1層的啟用函式。

推導過程不再多說,得到:

權重梯度計算

對於的權重梯度,我們知道它的梯度是各個時刻梯度之和(迴圈神經網路已經介紹)。

   ,      ,   

以上就是LSTM訓練演算法全部公式。

GRU:

事實上LSTM存在很多變體,在眾多的LSTM變體中,GRU (Gated Recurrent Unit)也許是最成功的一種。它對LSTM做了很多簡化,同時卻保持著和LSTM相同的效果。因此,GRU最近變得越來越流行。GRU對LSTM做了兩個大改動:

  1. 將輸入門、遺忘門、輸出門變為兩個門:更新門(Update Gate)z_{t}和重置門(Reset Gate)r_{t}
  2. 將單元狀態與輸出合併為一個狀態:h

GRU示意圖:

由示意圖可知,GRU前向計算公式為:

z_{t}=\sigma (W_{z}\cdot [h_{t-1},x_{t}])

r_{t}=\sigma (W_{r}\cdot [h_{t-1},x_{t}])

{h}'_{t}=\tanh (W\cdot \cdot [r_{t}\circ h_{t-1},x_{t}])

h=(1-z_{t})\circ h_{t-1}+z_{t}\circ{h}'_{t}