全前饋神經網絡,信息單向傳遞,網絡易學習,但能力被減弱。網絡輸出只依賴於當前的輸入。輸入輸出維數固定。
循環神經網絡,具有
短期記憶 能力。其中的神經元可接收
其他神經元 的信息和
本身 的信息。輸入輸出可不固定。參數學習可通過
隨時間反向傳播算法 學習。輸入序列較長時,錯誤信息向前傳遞過長,存在
梯度爆炸 和
梯度消失 問題,即
長程依賴問題 ,一種有效的改進方式:
門控機制 。
循環神經網絡易拓展到更廣義的記憶網絡模型:
遞歸神經網絡 、
圖網絡 。
1. 給網絡增加記憶能力
時序數據處理需要歷史信息。前饋網絡無記憶能力。介紹三種方法給網絡增加記憶能力 。
1.1 延時神經網絡
延時神經網絡通過在前饋網絡的非輸出層中都添加一個延時器,記錄神經元的最近幾次活性值,增加前饋網絡的短期記憶能力。在 t t t 時刻,第 l l l 層神經元的活性值依賴於第 l − 1 l-1 l − 1 層神經元的最近 K K K 個時刻的活性值:
h t ( l ) = f ( h t ( l − 1 ) , h t − 1 ( l − 1 ) , ⋅ ⋅ ⋅ , h t − K ( l − 1 ) )
\pmb{h}_t^{(l)} = f(\pmb{h}_t^{(l-1)},\pmb{h}_{t-1}^{(l-1)},\cdot\cdot\cdot,\pmb{h}_{t-K}^{(l-1)})
h h h t ( l ) = f ( h h h t ( l − 1 ) , h h h t − 1 ( l − 1 ) , ⋅ ⋅ ⋅ , h h h t − K ( l − 1 ) )
其中 h t ( l ) ∈ R M l \pmb{h}_t^{(l)} \in \mathbb{R}^{ \pmb{M}_l } h h h t ( l ) ∈ R M M M l 表示第 l l l 層神經元在時刻 t t t 的活性值,M l M_l M l 爲第 l l l 層神經元的數量。前饋神經網絡的活性值:
a ( l ) = f l ( W ( l ) a ( l − 1 ) + b ( l ) )
\pmb{a}^{(l)} = f_l(\pmb{W}^{(l)}\pmb{a}^{(l-1)} + \pmb{b}^{(l)})
a a a ( l ) = f l ( W W W ( l ) a a a ( l − 1 ) + b b b ( l ) )
1.2 有外部輸入的非線性自迴歸模型
自迴歸模型 (AutoRegressive Model,AR)統計學上的時間序列模型,用一個變量 y t \pmb{y}_t y y y t 的歷史信息來預測自己:
y t = w 0 + ∑ k = 1 K w k y t − k + ϵ t
\pmb{y}_t = w_0 + \sum_{k=1}^K w_k \pmb{y}_{t-k} + \epsilon_t
y y y t = w 0 + k = 1 ∑ K w k y y y t − k + ϵ t
其中 K K K 爲超參數,w 0 , ⋅ ⋅ ⋅ , w K w_0, \cdot\cdot\cdot, w_K w 0 , ⋅ ⋅ ⋅ , w K 爲可學習參數,ϵ t \epsilon_t ϵ t ~ N ( 0 , σ 2 ) N(0, \sigma^2) N ( 0 , σ 2 ) 爲第 t t t 個時刻的噪聲,方差 σ 2 \sigma^2 σ 2 與時間無關。
有外部輸入的自迴歸模型 (Nonlinear AutoRegressive with Exogenous Inputs Model,NARX),在每個時刻 t t t 都有一個外部輸入 x t \pmb{x}_t x x x t , 產生一個輸出 y t \pmb{y}_t y y y t , NARX 通過一個延時器記錄最近 K x K_x K x 次的外部輸入和最近K y K_y K y 次的輸出,第 t t t 個時刻的輸出y t \pmb{y}_t y y y t 爲:
y t = f ( x t , x t − 1 , ⋅ ⋅ ⋅ , x t − K x , y t − 1 , y t − 2 , ⋅ ⋅ ⋅ , y t − K y )
\pmb{y}_t = f(\pmb{x}_t,\pmb{x}_{t-1},\cdot\cdot\cdot,\pmb{x}_{t-K_x}, \pmb{y}_{t-1},\pmb{y}_{t-2},\cdot\cdot\cdot,\pmb{y}_{t-K_y})
y y y t = f ( x x x t , x x x t − 1 , ⋅ ⋅ ⋅ , x x x t − K x , y y y t − 1 , y y y t − 2 , ⋅ ⋅ ⋅ , y y y t − K y )
其中 f ( ⋅ ) f(\cdot) f ( ⋅ ) 表示非線性函數,可以前饋網絡,K x K_x K x 和 K y K_y K y 爲超參數。
1.3 循環神經網絡
循環神經網絡 (Recurrent Neural Network,RNN)通過使用帶自反饋的神經元 處理任意長度的時序數據。
給定輸入序列 x 1 : T = ( x 1 , x 2 , . . . , x t , . . . , x T ) \pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ... ,\pmb{x_t}, ..., \pmb{x_T}) x x x 1 : T = ( x 1 x 1 x 1 , x 2 x 2 x 2 , . . . , x t x t x t , . . . , x T x T x T ) ,RNN 這樣更新帶反饋邊的隱藏層的活性值 h t \pmb{h}_t h h h t :
h t = f ( h t − 1 , x t )
\pmb{h}_t = f(\pmb{h}_{t-1}, \pmb{x}_t)
h h h t = f ( h h h t − 1 , x x x t )
其中h 0 = 0 \pmb{h}_0 = 0 h h h 0 = 0 , f ( ⋅ ) f(\cdot) f ( ⋅ ) 爲非線性函數。可謂前饋網絡。從數學上來說,該公式可看成動力系統,故隱藏層活性值 h t \pmb{h}_t h h h t 又被成爲狀態(State)或隱狀態(Hidden State)。
2. 簡單循環網絡
簡單循環網絡 (SRN)只有一個隱藏層。在一個兩層的前饋神經網絡 中,連接存在相鄰的層與層之間,隱藏層的節點之間無連接。簡單循環網絡 增加了隱藏層到隱藏層的反饋連接。
假設向量 x t ∈ R M \pmb{x}_t \in \mathbb{R}^M x x x t ∈ R M 表示在時刻t t t 時網絡的輸入, h t ∈ D M \pmb{h}_t \in \mathbb{D}^M h h h t ∈ D M 表示隱藏層狀態(隱藏層神經元活性值), h t \pmb{h}_t h h h t 和當前時刻輸入x t \pmb{x}_t x x x t 、上一時刻隱藏層狀態h t − 1 \pmb{h}_{t-1} h h h t − 1 相關。 SRN在t時刻更新公式爲:
其中z t \pmb{z}_t z z z t 爲隱藏層的淨輸入,U ∈ R D × D \pmb{U} \in \mathbb{R}^{D \times D} U U U ∈ R D × D 是狀態-狀態 權重矩陣,W ∈ R D × D \pmb{W} \in \mathbb{R}^{D \times D} W W W ∈ R D × D 是狀態-輸入 權重矩陣,b ∈ R D \pmb{b} \in \mathbb{R}^{D} b b b ∈ R D 是偏移向量 , 其中 f ( ⋅ ) f(\cdot) f ( ⋅ ) 表示非線性函數,常爲Logistic函數或Tanh函數。
若把每個時刻的狀態都看做前饋神經網絡的一層,循環神經網絡可看做在時間維度上權值共享的神經網絡。按時間展開的循環神經網絡:
2.1 循環神經網絡的計算能力
前饋神經網絡可以模擬任何連續函數,而循環神經網絡可以模擬任何程序。定義一個完全連接 的循環神經網絡。x t \pmb{x}_t x x x t 爲輸入, y t \pmb{y}_t y y y t 爲輸出, h t \pmb{h}_t h h h t 爲隱狀態, f ( ⋅ ) f(\cdot) f ( ⋅ ) 爲非線性激活函數, U \pmb{U} U U U 、W \pmb{W} W W W 、b \pmb{b} b b b 、V \pmb{V} V V V 爲網絡參數:
2.1.1 循環神經網絡的通用近似定理
循環神經網絡的擬合能力也十分強大。一個完全連接的循環網絡是任何非線性動力系統 的近似器。可用通用近似定理解釋:
2.1.2 圖靈完備
圖靈完備 (Turing Completeness)是指一種數據操作規則,比如一種編程語言,可以實現圖靈機 (Turing Machine)的所有功能,解決所有的可計算問題。
故一個完全連接 的循環神經網絡 可以近似解決所有的可計算問題。
3. 應用到機器學習
循環神經網絡可以應用到三種模式的機器學習任務::序列到類別 模式、同步的序列到序列 模式、異步的序列到序列 模式。
3.1 序列到類別模式
序列到類別 模式主要用於序列數據的分類問題。比如文本分類任務,輸入爲單詞序列,輸出爲該文本類別。
假設輸入序列 x 1 : T = ( x 1 , x 2 , . . . , x t , . . . , x T ) \pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ... ,\pmb{x_t}, ..., \pmb{x_T}) x x x 1 : T = ( x 1 x 1 x 1 , x 2 x 2 x 2 , . . . , x t x t x t , . . . , x T x T x T ) ,輸出爲一個類別 y ∈ y \in y ∈ {1, … , C}。可將樣本 x \pmb{x} x x x 按不同時刻輸入到循環神經網絡中,得到不同時刻的隱藏狀態:h 1 \pmb{h}_1 h h h 1 , . . . ... . . . , h T \pmb{h}_T h h h T 。可將 h T \pmb{h}_T h h h T 看做整個序列的最終表示或特徵,輸入分類器 g ( ⋅ ) g(\cdot) g ( ⋅ ) :
y ^ = g ( h T )
\hat{y} = g(\pmb{h}_T)
y ^ = g ( h h h T )
也可以將整個序列的所有狀態進行平均,做爲整個序列的表示:
y ^ = g ( 1 T ∑ t = 1 T h t )
\hat{y} = g(\frac{1}{T}\sum_{t=1}^{T}\pmb{h}_t)
y ^ = g ( T 1 t = 1 ∑ T h h h t )
兩種圖示:
3.2 同步的序列到序列模式
同步的序列到序列 模式主要用於序列標註(Sequence Labeling)任務,即每一時刻都有輸入輸出,輸入輸出序列長度相同。比如在詞性標註 (Part-of-Speech Tagging)中,每一個單詞需要標註其詞性標籤 。
假設輸入序列 x 1 : T = ( x 1 , x 2 , . . . , x t , . . . , x T ) \pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ... ,\pmb{x_t}, ..., \pmb{x_T}) x x x 1 : T = ( x 1 x 1 x 1 , x 2 x 2 x 2 , . . . , x t x t x t , . . . , x T x T x T ) ,輸出序列爲一個類別 y 1 : T = ( y 1 , . . . , y T ) y_{1:T} = (y_1, ... , y_T) y 1 : T = ( y 1 , . . . , y T ) 。樣本 x \pmb{x} x x x 按不同時刻輸入到循環神經網絡中,得到不同時刻的隱含態 h 1 \pmb{h}_1 h h h 1 , …, h T \pmb{h}_T h h h T 。每個時刻的隱含態 h t \pmb{h}_t h h h t 代表了當前時刻和歷史的信息,作爲輸入:
y ^ t = g ( h t ) , ∀ t ∈ [ 1 , T ]
\hat{y}_t = g(\pmb{h}_t), \forall t \in [1, T]
y ^ t = g ( h h h t ) , ∀ t ∈ [ 1 , T ]
3.3 異步的序列到序列模式
異步的序列到序列模式 又稱編碼器-解碼器 (Encoder-Decoder)模型,即輸入序列和輸出序列不需具有嚴格的對應關係,也不需相同長度。比如機器翻譯任務中,輸入爲源語言單詞序列,輸出爲目標語言單詞序列。
假設輸入爲 x 1 : T = ( x 1 , x 2 , . . . , x T ) \pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ..., \pmb{x_T}) x x x 1 : T = ( x 1 x 1 x 1 , x 2 x 2 x 2 , . . . , x T x T x T ) ,輸出爲 y 1 : M = ( y 1 , y 2 , . . . , x M ) \pmb{y}_{1:M} = (\pmb{y_1}, \pmb{y_2}, ... ,\pmb{x_M}) y y y 1 : M = ( y 1 y 1 y 1 , y 2 y 2 y 2 , . . . , x M x M x M ) 異步的序列到序列模式 一般通過先編碼後解碼的方式來實現。先將樣本 x x x 按不同時刻輸入到一個RNN(編碼器)中,得到其編碼 h T \pmb{h}_T h h h T 。然後再使用另外一個RNN(解碼器),得到輸出序列 y ^ 1 : M \hat{y}_{1:M} y ^ 1 : M ,爲建立輸出序列之間的依賴關係,在解碼器中通常使用非線性的自迴歸模型:
其中 f 1 ( ⋅ ) f_1(\cdot) f 1 ( ⋅ ) 和 f 2 ( ⋅ ) f_2(\cdot) f 2 ( ⋅ ) 分別作爲編碼器和解碼器,g ( ⋅ ) g(\cdot) g ( ⋅ ) 爲分類器,y ^ t \hat{\pmb{y}}_t y y y ^ t 爲預測輸出 y ^ t \hat{y}_t y ^ t 的向量表示。
異步的序列到序列模式示例如下圖,其中⟨𝐸𝑂𝑆⟩ 表示輸入序列的結束,虛線表示將上一個時刻的輸出作爲下一個時刻的輸入:
4. 參數學習
可用梯度下降學習RNN中的參數。以隨機梯度下降爲例。給定樣本 ( x , y ) (\pmb{x}, \pmb{y}) ( x x x , y y y ) ,其中輸入爲 x 1 : T = ( x 1 , x 2 , . . . , x T ) \pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ..., \pmb{x_T}) x x x 1 : T = ( x 1 x 1 x 1 , x 2 x 2 x 2 , . . . , x T x T x T ) ,輸出爲 y 1 : T = ( y 1 , y 2 , . . . , x T ) \pmb{y}_{1:T} = (\pmb{y_1}, \pmb{y_2}, ... ,\pmb{x_T}) y y y 1 : T = ( y 1 y 1 y 1 , y 2 y 2 y 2 , . . . , x T x T x T ) 每個時刻t,都有一個監督信息y t y_t y t ,定義時刻 t 的損失函數爲:
L t = L ( y t , g ( h t ) )
L_t = L(y_t, g(\pmb{h}_t))
L t = L ( y t , g ( h h h t ) )
其中 g ( h t ) g(\pmb{h}_t) g ( h h h t ) 爲 t 時刻的輸出,L爲可微分的損失函數,如交叉熵。整個序列的損失函數爲:
L t = ∑ t = 1 T L t
L_t = \sum_{t=1}^{T}{L_t}
L t = t = 1 ∑ T L t
整個序列的損失函數 L 爲關於參數 U 的梯度爲每個時刻損失 L_t 對參數U的偏導數之和:
∂ L ∂ U = ∑ t = 1 T ∂ L t ∂ U
\frac{\partial{L}}{\partial{\pmb{U}}} = \sum_{t=1}^{T}\frac{\partial{L}_t}{\partial{\pmb{U}}}
∂ U U U ∂ L = t = 1 ∑ T ∂ U U U ∂ L t
RNN中存在提個遞歸調用的 f ( ⋅ ) f(\cdot) f ( ⋅ ) ,因此計算參數梯度的方式不同於計算前饋網絡,主要有兩種::隨時間反向傳播 (BPTT)算法和實時循環學習 (RTRL)算法.
4.1 隨時間反向傳播算法
隨時間反向傳播 算法類似前饋網絡的錯誤反向傳播算法 。
BPTT 算法將RNN看做展開的多層前饋網絡,其中的“每一層”對應RNN中的“每個時刻”:
這樣,RNN就可按照前饋網絡中的反向傳播算法計算參數梯度。在展開的前饋網絡中,所有層參數共享,參數的真實梯度是所有“展開層”的參數梯度之和。
計算偏導數∂ L ∂ U \frac{\partial{L}}{\partial{\pmb{U}}} ∂ U U U ∂ L 先計算時刻 t 的損失對參數U的偏導 ∂ L ∂ U \frac{\partial{L}}{\partial{\pmb{U}}} ∂ U U U ∂ L 。
參數 U 和隱藏層淨輸入 z k = U h k − 1 + W x k + b \pmb{z}_k = \pmb{Uh}_{k-1} + \pmb{Wx_k} + b z z z k = U h U h U h k − 1 + W x k W x k W x k + b 有關,故 t 時刻的損失 L t L_t L t 關於參數 u i j u_{ij} u i j 的梯度爲:
其中 ∂ + z k ∂ u i j \frac{\partial^{+}z_k}{\partial{\pmb{u}_{ij}}} ∂ u u u i j ∂ + z k 表示直接偏導數 即 z k = U h k − 1 + W x k + b \pmb{z}_k = \pmb{Uh}_{k-1} + \pmb{Wx}_k + b z z z k = U h U h U h k − 1 + W x W x W x k + b 中保持 h k − 1 \pmb{h}_{k-1} h h h k − 1 不變,對 u i j u_{ij} u i j 進行求偏導,得到:
其中 [ h k − 1 ] j [\pmb{h}_{k-1}]_j [ h h h k − 1 ] j 爲第 k-1 時刻隱狀態的第 j 維;I i ( x ) \mathbb{I}_i(x) I i ( x ) 爲除了第 i 行爲 x 外,其餘部分爲 0 的行向量。
定義誤差項爲第 t 時刻的損失對第 k 時刻隱藏神經層的淨輸入z k \pmb{z}_k z z z k 的導數,則當 1 ≤ k ≤ t 1 \leq k \leq t 1 ≤ k ≤ t 時:
由以上可得到:
其矩陣形式:
參數梯度 得到整個序列的損失函數 L 關於參數 U、權重W、偏置b 的梯度:
計算複雜度 在BPTT 算法中,參數的梯度需要在一個完整的“前向”計算和“反向”計算後才能得到並進行參數更新。
4.2 實時循環學習算法
與反向傳播的BPTT不同,實時循環學習 (Real-Time Recurrent earning,RTRL)是通過前向傳播的方式來計算梯度。
假設RNN的第 t + 1 t+1 t + 1 時刻的狀態 h t + 1 \pmb{h}_{t+1} h h h t + 1 爲:
其中關於參數 u i j u_{ij} u i j 的偏導數爲:
RTRL算法從第1個時刻開始,計算RNN的隱狀態,同時一次向前計算偏導數 ∂ h 1 ∂ u i j \frac{\partial h_1}{\partial{\pmb{u}_{ij}}} ∂ u u u i j ∂ h 1 ,∂ h 2 ∂ u i j \frac{\partial h_2}{\partial{\pmb{u}_{ij}}} ∂ u u u i j ∂ h 2 ,∂ h 3 ∂ u i j \frac{\partial h_3}{\partial{\pmb{u}_{ij}}} ∂ u u u i j ∂ h 3 ,…這樣第 t 時刻,可以實時計算損失 L_t 關於參數 U 的梯度,並更新參數。參數W W W 和 b b b 的梯度同理。
RTRL和BPTT算法比較 兩者都是基於梯度下降算法,分別通過前向模式和後向模式利用鏈式法則計算梯度。RNN中,一般網絡輸出維數原低於輸入維度,因此BPTT算法計算量更小,但要保存所有時刻的中間梯度,空間複雜度高。RTRL不需要梯度回傳,適合在線學習和無限序列任務。
5. 長程依賴問題
RNN在學習過程中主要的問題是梯度消失或梯度爆炸。很難建模長時間間隔 的狀態之間的依賴關係。
將BPTT中的誤差項 展開:
得到:
再定義:
得到:
若 γ > 1 \gamma > 1 γ > 1 , 當 t − k → ∞ t-k \rightarrow \infty t − k → ∞ 時,γ t − k → ∞ \gamma^{t-k} \rightarrow \infty γ t − k → ∞ 。當間隔 t − k t - k t − k 比較大時,梯度也變得很大,會造成系統不穩定,即梯度爆炸問題。
若 γ < 1 \gamma < 1 γ < 1 , 當 t − k → ∞ t-k \rightarrow \infty t − k → ∞ 時,γ t − k → 0 \gamma^{t-k} \rightarrow 0 γ t − k → 0 。當間隔 t − k t - k t − k 比較大時,梯度也變得很小,會出現和深層前饋網絡類似的梯度爆炸問題。
注意:
RNN常使用Logistic或Tanh函數作爲非線性激活函數,其導數值都小於1,權重矩陣 ∣ ∣ U ∣ ∣ ||\pmb{U}|| ∣ ∣ U U U ∣ ∣ 不會太大,故若時間間隔 t − k t - k t − k 過大,δ t , k \delta_{t,k} δ t , k 會趨於0,故出現梯度消失問題。
RNN理論上可以建立長時間間隔的狀態之間的依賴關係,但由於梯度爆炸或消失問題,實際上只能學到短期的依賴關係。這樣,如時刻 t 的輸出 y t y_t y t 依賴於時刻 k 的輸入 x k \pmb{x}_k x x x k ,當間隔 t − k t-k t − k 較大時,簡單RNN難建模長距離依賴關係,成爲長程依賴問題 。
5.1 改進方案
爲避免梯度爆炸或梯度消失,一種直接方式:選取合適參數 ,使用非飽和激活函數 ,儘量使 d i a g ( f ′ ( z ) ) U T ≈ 1 diag(f^{'}(\pmb{z})) \pmb{U}^T \approx1 d i a g ( f ′ ( z z z ) ) U U U T ≈ 1 。這種方式依賴於人工調參經驗,限制模型的廣泛應用。一種有效方式:通過改進模型 或優化方法 。
梯度爆炸 RNN的梯度爆炸更易解決,常通過權重衰減 或梯度截斷 。
權重衰減 通過給參數增加 l 1 l1 l 1 或l 2 l2 l 2 範數的正則化,來限制參數取值範圍,從而使 γ ≤ 1 \gamma \leq 1 γ ≤ 1 。梯度截斷是另一種有效的啓發式方法,梯度的模大於閾值時,將其截斷爲及較小的數。
梯度消失 RNN的主要問題。解決方式:一是用優化技巧;二是改變模型(更有效),如讓 U = I \pmb{U} = \pmb{I} U U U = I I I ,同時令 ∂ h t ∂ h t − 1 = I \frac{\partial \pmb{h}_t}{\partial \pmb{h}_{t-1}} = \pmb{I} ∂ h h h t − 1 ∂ h h h t = I I I 爲單位矩陣,即:
h t = h t − 1 + g ( x t ; θ )
\pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t; \theta)
h h h t = h h h t − 1 + g ( x x x t ; θ )
其中 h t h_t h t 和 h t − 1 h_{t-1} h t − 1 之間爲線性依賴關係,權重係數爲1,不存在梯度爆炸或消失問題,但是,丟失了神經元在反饋邊上的非線性激活的性質,故降低了模型的表示能力。更有效的改進策略:
h t = h t − 1 + g ( x t , h t − 1 ; θ )
\pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)
h h h t = h h h t − 1 + g ( x x x t , h h h t − 1 ; θ )
這樣 h t h_t h t 和 h t − 1 h_{t-1} h t − 1 既有線性關係,也有非線性關係,並可緩解梯度消失問題。仍存在問題:
梯度爆炸:令 z k = U h k − 1 + U x k + b \pmb{z}_k = \pmb{Uh}_{k-1} + \pmb{Ux}_k + \pmb{b} z z z k = U h U h U h k − 1 + U x Ux U x k + b b b 爲 k k k 時刻 g ( ⋅ ) g(\cdot) g ( ⋅ ) 的輸入,在誤差項計算中:
梯度可能過大,存在梯度爆炸問題。
記憶容量:隨着 h t \pmb{h}_t h h h t 不斷累積存儲新的輸入信息,會發生飽和。 假設 g ( ⋅ ) g(\cdot) g ( ⋅ ) 爲 Logistic 函數,則隨着時間 t 的增長,h t \pmb{h}_t h h h t 會變得大,從而導致 h \pmb{h} h h h 變得飽和。即隱狀態h t \pmb{h}_t h h h t 可存儲信息有限,隨着記憶單元存儲內容增多,其丟失信息也增多。
利用門控機制 改進模型,解決這兩個問題。
6. 基於門控的循環神經網絡
爲改善RNN的長程依賴問題 ,在公式:
h t = h t − 1 + g ( x t , h t − 1 ; θ )
\pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)
h h h t = h h h t − 1 + g ( x x x t , h h h t − 1 ; θ )
上引入門控機制 來控制信息積累速度,包括有選擇地加入新的信息,並有選擇地遺忘之前累積的信息。這類網絡叫做 基於門控的循環神經網絡 (Gated RNN)。
6.1 長短期記憶網絡(LSTM)
長短期記憶網絡(Long Short-Term Memory Network,LSTM)是RNN的一變體,可有效解決RNN的梯度爆炸或梯度消失問題。在以下公式上,進行兩方面的改進:
h t = h t − 1 + g ( x t , h t − 1 ; θ )
\pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)
h h h t = h h h t − 1 + g ( x x x t , h h h t − 1 ; θ )
新的內部狀態 LSTM引入新的內部狀態 (internal state)c t ∈ R D \pmb{c}_t \in \mathbb{R}^D c c c t ∈ R D 專門進行線性的循環信息傳遞,同時非線性地輸出信息給隱藏層的外部狀態 h t ∈ R D \pmb{h}_t \in \mathbb{R}^D h h h t ∈ R D 。內部狀態 c t \pmb{c}_t c c c t 這樣計算:
其中 f t ∈ [ 0 , 1 ] D \pmb{f}_t \in [0,1]^D f f f t ∈ [ 0 , 1 ] D 、i t ∈ [ 0 , 1 ] D \pmb{i}_t \in [0,1]^D i i i t ∈ [ 0 , 1 ] D 、o t ∈ [ 0 , 1 ] D \pmb{o}_t \in [0,1]^D o o o t ∈ [ 0 , 1 ] D 爲三個門(gate)來控制信息傳遞的路徑;⨀ \bigodot ⨀ 爲向量元素乘積;c t − 1 \pmb{c}_{t-1} c c c t − 1 爲上一個時刻的記憶單元;c ^ t ∈ R D \hat{\pmb{c}}_t \in \mathbb{R}^D c c c ^ t ∈ R D 是通過非線性函數得到的候選狀態 :
在每個時刻 t ,LSTM 網絡的內部狀態 c t \pmb{c}_t c c c t 記錄了到當前時刻爲止的歷史信息。
門控機制 數字電路中,門爲二值變量 {0,1},0代表關閉,不需信息通過。LSTM引入門控機制 (Gating Mechanism),控制信息傳遞的路徑。公式:
中有三個門:f t ∈ [ 0 , 1 ] D \pmb{f}_t \in [0,1]^D f f f t ∈ [ 0 , 1 ] D 爲遺忘門、i t ∈ [ 0 , 1 ] D \pmb{i}_t \in [0,1]^D i i i t ∈ [ 0 , 1 ] D 爲輸入門、o t ∈ [ 0 , 1 ] D \pmb{o}_t \in [0,1]^D o o o t ∈ [ 0 , 1 ] D 爲輸出門。三個門的作用:
f t ∈ [ 0 , 1 ] D \pmb{f}_t \in [0,1]^D f f f t ∈ [ 0 , 1 ] D 爲遺忘門,控制上一個時刻的內部狀態 c t − 1 \pmb{c}_{t-1} c c c t − 1 需要遺忘多少信息。
i t ∈ [ 0 , 1 ] D \pmb{i}_t \in [0,1]^D i i i t ∈ [ 0 , 1 ] D 爲輸入門,控制當前時刻的候選狀態 c ^ t \hat{\pmb{c}}_t c c c ^ t 需要保存多少信息。
o t ∈ [ 0 , 1 ] D \pmb{o}_t \in [0,1]^D o o o t ∈ [ 0 , 1 ] D 爲輸出門,控制當前時刻的內部狀態 c t \pmb{c}_t c c c t 有多少信息需要輸出給外部狀態 h t \pmb{h}_t h h h t 。
當 f t = 0 , i t = 1 \pmb{f}_t = 0,\pmb{i}_t = 1 f f f t = 0 , i i i t = 1 時,記憶單元將歷史信息清空,將候選狀態寫入,但此時記憶單元 c t \pmb{c}_t c c c t 依然和上一時刻的歷史信息相關。
當 f t = 1 , i t = 0 \pmb{f}_t = 1,\pmb{i}_t = 0 f f f t = 1 , i i i t = 0 時,記憶單元將複製上一時刻的內容,不寫入新的信息。
LSTM的“門”是“軟門”,取值在 (0,1) 之間,並以一定的比例通過信息,三種門的計算如下,其中 σ ( ⋅ ) \sigma(\cdot) σ ( ⋅ ) 爲 Logistic函數,其輸出區間爲 (0,1),x t \pmb{x}_t x x x t 爲當前時刻的輸入,h t − 1 \pmb{h}_{t-1} h h h t − 1 爲上一時刻的外部狀態:
LSTM的循環單元結構如圖:
其計算過程爲:
利用上一時刻的外部狀態 h t − 1 \pmb{h}_{t-1} h h h t − 1 和當前時刻的輸入 x t \pmb{x}_t x x x t ,計算出三個門f t \pmb{f}_t f f f t 、i t \pmb{i}_t i i i t 、o t \pmb{o}_t o o o t ,和候選狀態c ^ t \pmb{\hat{c}}_t c ^ c ^ c ^ t 。
結合遺忘門 f t \pmb{f}_t f f f t 、輸入門 i t \pmb{i}_t i i i t 更新記憶單元 c t \pmb{c}_t c c c t 。
結合輸出門 o t \pmb{o}_t o o o t ,將內部狀態的信息傳遞給外部狀態 h t \pmb{h}_{t} h h h t 。
通過LSTM循環單元,整個網絡可以建立較長距離的時序依賴關係。給出以上LSTM循環單元公式的簡潔描述:
其中 x t ∈ R M \pmb{x}_t \in \mathbb{R}^M x x x t ∈ R M 爲當前時刻的輸入,W ∈ R 4 D × ( D + M ) \pmb{W} \in \mathbb{R}^{4D \times (D+M)} W W W ∈ R 4 D × ( D + M ) 、b ∈ R 4 D \pmb{b} \in \mathbb{R}^{4D} b b b ∈ R 4 D 是網絡參數。
記憶 循環神經網絡的隱狀態 h h h 存儲了歷史信息,可以看做是一種 記憶 。
在簡單RNN中,隱狀態 h h h 每個時刻都會被重寫,看做短期記憶 (Short-Term Memory)。
在神經網絡中,長期記憶 (Long-Term Memory)可看做是網絡參數,隱含從訓練數據中學到的經驗,更新週期遠慢於短期記憶 。
而在LSTM中,記憶單元 c c c 可以在某個時刻捕捉到某個關鍵信息,並有能力將此關鍵信息保存一定的時間。記憶單元c c c 中保存信息的生命週期要長於短期記憶 h h h ,短於長期記憶 ,因此稱爲長短期記憶 (Long Short-Term Memory)。
6.2 LSTM網絡的各種變體
主流的LSTM用三個門動態控制內部狀態 ,遺忘 歷史信息、輸出 信息、輸入 信息的數量。對門控機制 修改,得到LSTM變體。
無遺忘門的LSTM 最早的LSTM是沒有遺忘門的,內部狀態的更新爲:
記憶單元 c c c 會不斷增大。輸入序列很長時,記憶單元容量飽和,大大降低LSTM的性能。
peephole 連接 三種門不但依賴於輸入 x t \pmb{x}_t x x x t 和上一個時刻的隱狀態 h t − 1 \pmb{h}_{t-1} h h h t − 1 ,也依賴於上一個時刻的記憶單元 c t − 1 \pmb{c}_{t-1} c c c t − 1 :
其中 V i 、 V f 、 V o \pmb{V}_i、\pmb{V}_f、\pmb{V}_o V V V i 、 V V V f 、 V V V o 爲對角矩陣。
耦合輸入門和遺忘門 LSTM的輸入門和輸出門有些互補關係,同時使用兩個門較冗餘,爲減少LSTM的計算複雜度,將輸入門輸出門合併,令 f t = 1 − i t \pmb{f}_t = 1 - \pmb{i}_t f f f t = 1 − i i i t ,內部狀態更新方式:
6.3 門控循環單元網絡
門控循環單元 (Gated Recurrent Unit,GRU)網絡比LSTM更簡單。
GRU網絡引入門控機制控制信息更新方式,不同LSTM,GRU不引入額外的記憶單元,在公式:
h t = h t − 1 + g ( x t , h t − 1 ; θ )
\pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)
h h h t = h h h t − 1 + g ( x x x t , h h h t − 1 ; θ )
上,引入一個更新門 控制當前狀態需從歷史狀態中保留多少信息,需從候選狀態中接受多少新信息:
h t = z t ⨀ h t − 1 + ( 1 − z t ) ⨀ g ( x t , h t − 1 ; θ ) z t = σ ( W z x t + U z h t − 1 + b z )
\pmb{h}_t = \pmb{z}_t \bigodot \pmb{h}_{t-1} + (1-\pmb{z}_t) \bigodot g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) \\
\pmb{z}_t = \sigma(\pmb{W}_z \pmb{x}_t + \pmb{U}_z \pmb{h}_{t-1} + \pmb{b}_z)
h h h t = z z z t ⨀ h h h t − 1 + ( 1 − z z z t ) ⨀ g ( x x x t , h h h t − 1 ; θ ) z z z t = σ ( W W W z x x x t + U U U z h h h t − 1 + b b b z )
其中 z t ∈ [ 0 , 1 ] D \pmb{z}_t \in [0,1]^D z z z t ∈ [ 0 , 1 ] D 爲更新門。在LSTM中,輸入輸出互補,具有冗餘性,GRU用更新門平衡輸入和遺忘之間的平衡:
當 z t = 0 \pmb{z}_t = 0 z z z t = 0 時,當前狀態 h t \pmb{h}_t h h h t 和前一時刻的狀態h t − 1 \pmb{h}_{t-1} h h h t − 1 之間爲非線性函數關係;
當 z t = 1 \pmb{z}_t = 1 z z z t = 1 時, h t \pmb{h}_t h h h t 和h t − 1 \pmb{h}_{t-1} h h h t − 1 之間爲線性函數關係。
在GRU中,函數 g ( x t , h t − 1 ; θ ) g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) g ( x x x t , h h h t − 1 ; θ ) 的定義爲:
其中 h ^ t \pmb{\hat{h}_t} h ^ t h ^ t h ^ t 表示當前時刻的候選狀態, r t ∈ [ 0 , 1 ] D \pmb{r}_t \in [0,1]^D r r r t ∈ [ 0 , 1 ] D 爲重置門:
用來控制候選狀態 h ^ t \pmb{\hat{h}_t} h ^ t h ^ t h ^ t 的計算是否依賴上一個時刻的狀態 h t − 1 \pmb{h}_{t-1} h h h t − 1 :
r t = 0 \pmb{r}_t = 0 r r r t = 0 時,候選狀態 h ^ t = t a n h ( W c x t + b ) \pmb{\hat{h}_t} = tanh(\pmb{W}_c\pmb{x}_t + \pmb{b} ) h ^ t h ^ t h ^ t = t a n h ( W W W c x x x t + b b b ) 只和當前輸入 x t \pmb{x}_t x x x t 相關,和歷史狀態無關。
r t = 1 \pmb{r}_t = 1 r r r t = 1 時,候選狀態 h ^ t = t a n h ( W c x t + U h h t − 1 + b ) \pmb{\hat{h}_t} = tanh(\pmb{W}_c\pmb{x}_t + \pmb{U}_h\pmb{h}_{t-1} +\pmb{b} ) h ^ t h ^ t h ^ t = t a n h ( W W W c x x x t + U U U h h h h t − 1 + b b b ) 和當前輸入 x t \pmb{x}_t x x x t 、歷史狀態 h t − 1 \pmb{h}_{t-1} h h h t − 1 相關,和簡單RNN一致。
綜上,GRU網絡的狀態更新方式爲:
h t = z t ⨀ h t − 1 + ( 1 − z t ) ⨀ h ^ t
\pmb{h}_t = \pmb{z}_t \bigodot \pmb{h}_{t-1} + (1-\pmb{z}_t) \bigodot \pmb{\hat{h}}_t
h h h t = z z z t ⨀ h h h t − 1 + ( 1 − z z z t ) ⨀ h ^ h ^ h ^ t
當 z t = 0 , r = 1 \pmb{z}_t = 0,\pmb{r} = 1 z z z t = 0 , r r r = 1 時,GRU退化爲簡單RNN;
當 z t = 0 , r = 0 \pmb{z}_t = 0,\pmb{r} = 0 z z z t = 0 , r r r = 0 時,當前狀態 h t \pmb{h}_t h h h t 和當前輸入 x t \pmb{x}_t x x x t 相關,和歷史狀態h t − 1 \pmb{h}_{t-1} h h h t − 1 無關;
當 z t = 1 \pmb{z}_t = 1 z z z t = 1 時,當前狀態 h t = h t − 1 \pmb{h}_{t} = \pmb{h}_{t-1} h h h t = h h h t − 1 ,和當前輸入 x t \pmb{x}_t x x x t 無關。
GRU網絡的循環單元結構:
7. 深層循環神經網絡
如果將深度定義爲網絡中中信息傳遞路徑長度的話,RNN可以看作是既“深”又“淺”的網絡。因爲,把RNN按時間展開,長時間間隔的狀態之間的路徑很長,RNN可以看作是一個非常深的網絡;而果同一時刻網絡輸入到輸出之間的路徑x t → y t \pmb{x}_t → \pmb{y}_t x x x t → y y y t ,這個RNN網絡是非常淺的。
故,可增加RNN的深度來增強RNN的能力,即增加同一時刻網絡輸入到輸出的路徑x t → y t \pmb{x}_t → \pmb{y}_t x x x t → y y y t ,比如增加隱狀態到輸出的路徑 h t → y t \pmb{h}_t → \pmb{y}_t h h h t → y y y t ,以及輸入x t → h t \pmb{x}_t → \pmb{h}_t x x x t → h h h t 到隱狀態的路徑深度。
7.1 堆疊循環神經網絡
常見的簡單做法,將多個RNN堆疊起來,稱爲堆疊循環神經網絡 (Stacked Recurrent Neural Network,SRNN)。一個堆疊的簡單循環網絡(Stacked SRN) 也稱爲循環多層感知器(Recurrent Multi-Layer Perceptron,RMLP)。按時間展開的SRNN如下:
第 l l l 層網絡的輸入是 l − 1 l-1 l − 1 層網絡的輸出。定義,h t ( l ) \pmb{h}_t^{(l)} h h h t ( l ) 爲在時刻 t t t 時第 l l l 層的隱狀態:
其中U ( l ) \pmb{U}^{(l)} U U U ( l ) 、W ( l ) \pmb{W}^{(l)} W W W ( l ) 、b ( l ) \pmb{b}^{(l)} b b b ( l ) 爲權重矩陣和偏置向量,h t ( 0 ) = x t \pmb{h}_t^{(0)} = \pmb{x}_t h h h t ( 0 ) = x x x t 。
7.2 雙向循環神經網絡
特定任務中,一個時刻的輸出不但和過去時刻的信息有關,也和後續時刻的信息有關。比如給定句子,其中一個詞的詞性由它的上下文決定。因此,在這些任務中,可以增加一個按時間的逆序來傳遞信息的網絡層,以增強網絡的能力。
雙向循環神經網絡(Bidirectional Recurrent Neural Network,Bi-RNN)由兩層循環神經網絡組成,他們的輸入相同,只是信息傳遞的方向不同。
假設第1 層按時間順序,第2 層按時間逆序,在時刻t t t 時的隱狀態定義爲 h t ( 1 ) \pmb{h}_t^{(1)} h h h t ( 1 ) 和 h t ( 2 ) \pmb{h}_t^{(2)} h h h t ( 2 ) ,則:
其中⨁ \bigoplus ⨁ 爲向量拼接操作。
8. 拓展到圖結構
如果將RNN按時間展開,每個時刻的隱狀態h t \pmb{h}_t h h h t 看作一個節點,那麼這些節點構成一個鏈式結構,每個節點t t t 都收到其父節點的消息(Message),更新自己的狀態,並傳遞給其子節點。而鏈式結構是一種特殊的圖結構,我們可以比較容易地將這種消息傳遞(Message Passing)的思想擴展到任意的圖結構上。
8.1 遞歸神經網絡
遞歸神經網絡 (Recursive Neural Network,RecNN)是RNN在有向無循環圖 上的拓展,常爲樹樁層次結構:
三個隱藏層 h 1 \pmb{h}_1 h h h 1 、 h 2 \pmb{h}_2 h h h 2 、 h 3 \pmb{h}_3 h h h 3 ,其中h 1 \pmb{h}_1 h h h 1 由兩個輸入層x 1 \pmb{x}_1 x x x 1 、 x 2 \pmb{x}_2 x x x 2 計算得到。
對一個節點h i \pmb{h}_i h h h i ,他可以接受來自父節點集合 π i \pi_i π i 中所有節點的消息,並更新自己的狀態:
h i = f ( h π i )
\pmb{h}_i = f(\pmb{h}_{\pi_i})
h h h i = f ( h h h π i )
其中h π i \pmb{h}_{\pi_i} h h h π i 表示集合 π i \pi_i π i 中所有節點狀態的拼接,f f f 是一個和節點位置無關的非線性函數,可以爲一個單層的前饋神經網絡。遞歸神經網絡一般結構可以寫成:
當遞歸神經網絡的結構退化爲線性序列結構(圖b),遞歸神經網絡等價於簡單RNN。
遞歸神經網絡主要用來建模自然語言句子的語義。
同樣,可用門控機制 來改進遞歸神經網絡中的長距離依賴問題,比如樹結構的長短期記憶模型 (Tree-Structured LSTM),就是將LSTM模型的思想應用到樹結構的網絡中,來實現更靈活的組合函數。
8.2 圖神經網絡
實際中很多數據是圖結構的,比如知識圖譜、社交網絡、分子網絡等。而前饋網絡和反饋網絡很難處理圖結構的數據。圖神經網絡(Graph Neural Network,GNN)是將消息傳遞的思想擴展到圖結構數據上的神經網絡,可用來處理圖數據。
對一個任意的圖結構 G ( V , ϵ ) G(V,\epsilon) G ( V , ϵ ) 。圖中每個節點 v 都用一組神經元來表示狀態 h ( v ) \pmb{h}^{(v)} h h h ( v ) ,初始狀態可以爲節點 v 的輸入特徵 x ( v ) \pmb{x}^{(v)} x x x ( v ) 。每個節點可收到來自相鄰節點的消息,並更新自己的狀態:
其中 N ( v ) N(v) N ( v ) 表示節點 v 的鄰居,m t ( v ) \pmb{m}_t^{(v)} m m m t ( v ) 表示在第 t 時刻節點 v 收到的信息,e ( u , v ) \pmb{e}^{(u,v)} e e e ( u , v ) 爲邊e ( u , v ) e^{(u,v)} e ( u , v ) 上的特徵。
該公式是同步的更新方式,所有結構同時接受信息並更新自己的狀態。對有向圖,異步更新更有效,如RNN或遞歸神經網絡。整個圖更新後T此後,可通過一個讀出函數 g g g 來得到整個網絡的表示: