長短時記憶網絡(LSTM)


長短時記憶網絡

循環神經網絡很難訓練的原因導致它的實際應用中很處理長距離的依賴。本文將介紹改進后的循環神經網絡:長短時記憶網絡(Long Short Term Memory Network, LSTM)

原始RNN的隱藏層只有一個狀態,即h,它對於短期的輸入非常敏感。那么如果我們再增加一個狀態,即c,讓它來保存長期的狀態,這就是長短時記憶網絡

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

可以看到在t時刻,LSTM的輸入有三個:當前時刻網絡的輸出值$x_t$、上一時刻LSTM的輸出值$h_{t-1}$、以及上一時刻的單元狀態$c_{t-1}$;LSTM的輸出有兩個:當前時刻LSTM輸出值$h_t$、和當前時刻的單元狀態$x_t$。注意$x、h、c$都是向量。

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

接下來我們要描述一下,輸出h和單元狀態c的具體計算方法。

長短時記憶網絡的前向計算

我們引入“門(gate)”的概念。門實際上就是一層全連接層,它的輸入是一個向量,輸出是一個0到1之間的實數向量。假設W是門的權重向量,$b$是偏置項,那么門可以表示為:

$$g(x)=\sigma (Wx+b)$$

  門的輸出是0到1之間的實數向量,用門向量的輸出向量按元素乘以我們需要控制的那個向量,當門輸出為0時,任何向量與之相乘都會得到0向量,這就相當於啥都不能通過;輸出為1時,任何向量與之相乘都不會有任何改變,這就相當於啥都可以通過。因為$\sigma$(也就是sigmoid函數)的值域是(0,1),所以門的狀態都是半開半閉的。

LSTM用兩個門來控制單元狀態c的內容,一個是遺忘門,它決定了上一時刻的單元狀態$c_{t-1}$有多少保留到當前時刻$c_t$;另外一個是輸出門,他決定了當前時刻網絡的輸入$x_t$有多少保存到單元狀態$c_t$。LSTM用輸出門來控制單元狀態$c_t$有多少輸出到LSTM的當前輸出值$h_t$。LSTM用輸出門來控制單元狀態$c_t$有多少輸出到LSTM的當前輸出值$h_t$。

遺忘門的表達式是:

$$athbf{f}_t=\sigma(W_f\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_f)\qquad\quad(式1)$$

上式中,$W_f$是遺忘門的權重矩陣,$h_{t-1,x_t}$表示把兩個向量連接成一個更長的向量,$b_f$是遺忘門的偏置項,$\sigma$是sigmoid函數。如果輸入的維度是$d_x$,隱藏層的維度是$d_h$,單元狀態的維度是$d_c$(d_c=d_h),則遺忘門的權重矩陣$W_f$維度是$d_c x (d_h+d_x)$。事實上,權重矩陣$W_f$都是兩個矩陣拼接而成的:一個是$W_{fh}$,它對應着輸入項$h_{t-1}$,其維度為$d_cxd_h$;一個是$W_{fx}$,它對應着輸入項$x_t$,其維度為$d_c x d_x$。$W_f$可以寫為:

$$\begin{align}
\begin{bmatrix}W_f\end{bmatrix}\begin{bmatrix}\mathbf{h}_{t-1}\\
\mathbf{x}_t\end{bmatrix}&=
\begin{bmatrix}W_{fh}&W_{fx}\end{bmatrix}\begin{bmatrix}\mathbf{h}_{t-1}\\
\mathbf{x}_t\end{bmatrix}\\
&=W_{fh}\mathbf{h}_{t-1}+W_{fx}\mathbf{x}_t
\end{align}$$

下圖顯示了遺忘門的計算:

接下來看看輸入門:

$$\mathbf{i}_t=\sigma(W_i\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_i)\qquad\quad(式2)$$

上式中,$W_i$是輸入門的權重矩陣,$b_i$是輸入門的偏置項。下圖表示了輸入門的計算:

接下來,我們計算用於描述當前輸入的單元狀態$\tilde{c}_t$,它是根據上一次的輸出和本次輸入來計算的:

$$\mathbf{\tilde{c}}_t=\tanh(W_c\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_c)\qquad\quad(式3)$$

下圖是$\tilde{c}_t$的計算:

現在,我們計算當前時刻的單元狀態$c_t$。它是由上一次的單元狀態$c_{t-1}$按元素乘以遺忘門$f_t$,再用當前輸入的單元狀態$\tilde{c}_t$按元素乘以輸入門$i_t$,再將兩個積加和產生的:

$$\mathbf{c}_t=f_t\circ{\mathbf{c}_{t-1}}+i_t\circ{\mathbf{\tilde{c}}_t}\qquad\quad(式4)$$

符號O表示按元素乘。下圖是$c_t$的計算:

這樣,我們就把LSTM關於當前的記憶$\tilde{c}_t$和長期的記憶$c_{t-1}$組合在一起,形成了新的單元狀態$c_t$。由於遺忘門的控制,它可以保存很久很久之前的信息,由於輸入門的控制,它又可以避免當前無關緊要的內容進入記憶。下面,我們要看看輸出門,它控制了長期記憶對當前輸出的影響:

$$\mathbf{o}_t=\sigma(W_o\cdot[\mathbf{h}_{t-1},\mathbf{x}_t]+\mathbf{b}_o)\qquad\quad(式5)$$

下面表示輸出門的計算:

LSTM最終的輸出,是由輸出門和單元狀態共同確定的:

$$\mathbf{h}_t=\mathbf{o}_t\circ \tanh(\mathbf{c}_t)\qquad\quad(式6)$$

下圖表示LSTM最終輸出的計算:

式1到式6就是LSTM前向計算的全部公式。至此,我們就把LSTM前向計算講完了。

長短時記憶網絡的訓練

LSTM訓練算法框架

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

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

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

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

關於公式和符號的說明

我們設定gate的激活函數為sigmoid函數,輸出的激活函數為tanh函數。他們的導數分別為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM