迴圈和遞迴神經網路 (RNN) 與 長短時記憶 (LSTM)

迴圈和遞迴神經網路 (RNN) 與 長短時記憶 (LSTM)

即使不是 NLPer,現實中依然會面對很多序列問題。

全文內容來自 Ian Goodfellow, Yoshua Bengio 和 Aaron Courville 3位大老爺的作品“Deep Learning”的其中1章“Sequence Modeling: Recurrent and Recursive Nets” 1

1986年 Rumelhart 等人提出迴圈神經網路。迴圈網路與多層網路相比,會共享每層的權重,從而能夠擴充套件和應用網路於不同長度的序列案例,以及泛化這些案例。當1片特定的資訊可以在序列中多處出現時,這樣的共享尤為重要。比如,有兩句話:“I went to Nepal in 2009”和“In 2009, I went to Nepal.”如果要求模型提取敘述者哪一年去的 Nepal,不管是輸入句子的第2處還是第6處,2009 都是應識別的資訊片。傳統全連線前向網路對每處輸入的特徵都有單獨的引數,所以要單獨學習輸入句子每一處的所有語法。相比之下,迴圈網路在不同時間步間共享權重

現在很多“神經網路”的字眼已被“網路”替換。且後面不會涉及神經元的內容,所以一概用“網路”。

相關的想法是1維時間序列間用卷積。卷積方法是延時神經網路的基礎 (1988~1990)。卷積操作允許網路在時間軸上共享引數,但為淺層網路 (輸出序列的每個節點輸出為很多相鄰節點輸入的函式)。每個時間步上用相同的卷積核。

迴圈網路以不同的方式共享引數。節點輸出為前面節點輸出的函式,節點的輸出由前面節點輸出用相同的更新規則產生。通過很深的計算圖來共享權重,從而形成迴圈。

為簡化描述,RNN 看作對1個包含時間步索引tt (從11到τ\tau) 的向量x(t)x^{(t)}的序列的操作。實際上,迴圈網路通常操作小的序列塊 (batch)。這裡簡化表示,剔除塊索引。此外,時間步長的索引僅指序列中的位置,而不一定指現實世界中的時間通道。 RNN 也可以應用於2維空間資料 (如影象) 。甚至當資料涉及時間時,如果提供觀察到的整個序列給網路,那麼網路可能要有及時回顧過去的連線。

迴圈代表某變數的過去值對未來值的影響。用迴圈的計算圖定義迴圈網路。

1. 展開計算圖 (Computational Graph)

計算圖是形成一系列計算結構 (如涉及對映輸入和引數到輸出和損失) 的1種方式。把1個迴圈/遞迴計算展開為1個有重複結構 (對應1連串事件) 的圖,從而實現深度網路結構間的引數共享。

例如,考慮動態系統的經典形式:

s(t)=f(s(t−1);θ)

s^{(t)}=f(s^{(t-1)};\theta)

其中,s(t)s^{(t)}為系統的狀態。

上述系統是迴圈的,因為時刻tt的狀態ss的定義回溯到時刻t−1t-1的狀態ss的定義。

對於有限時間步τ\tau,用定義τ−1\tau – 1次來展開成圖。當τ=3\tau=3 (時間步) 時,有

s(3)=f(s(2);θ)=f(f(s(1);θ);θ)

s^{(3)}=f(s^{(2)};\theta)=f(f(s^{(1)};\theta);\theta)

展開後的表示式可以表示為傳統的有向非迴圈計算圖

這裡寫圖片描述

再舉1例,外部輸入x(t)x^{(t)}驅動的動態系統:

s(t)=f(s(t−1),x(t);θ)

s^{(t)}=f(s^{(t-1)},x^{(t)};\theta)

現在的狀態ss包含所有過去序列的資訊。

迴圈網路可用很多不同方式搭建。幾乎任何函式都可看作1個前向網路,本質上任何涉及迴圈的函式都能當作1個迴圈網路 (RNN)

為表明狀態即為網路的隱藏單元,上述方程重寫為:

h(t)=f(h(t−1),x(t);θ)

h^{(t)}=f(h^{(t-1)},x^{(t)};\theta)

這裡寫圖片描述

典型的 RNN 增加從狀態hh讀取資訊的輸出層來預測。

當訓練迴圈網路來用過去預測未來時,網路通常學習去用狀態h(t)h^{(t)}作為與截止到tt的過去輸入序列的任務相關方面的有損總結 (lossy summary),因為該總結對映任意長度的序列(x(t),x(t−1),x(t−2),…,x(2),x(1))(x^{(t)},x^{(t-1)},x^{(t-2)},…,x^{(2)},x^{(1)})到固定長度的向量h(t)h^{(t)}。取決於訓練要求,該總結可能有選擇地更明確地保持過去序列的某些部分。比如,RNN 用於統計語言建模時,通常給定前面的句子去預測下一個單詞,它可能沒必要儲存截至時間tt的輸入序列的所有資訊,只儲存足夠預測剩下語句的資訊即可。

畫 RNN 有2種方式。

  • 每部分僅包含1個節點。網路定義為1個實時操作的電路,該電路物理部分的當前狀態會影響未來狀態 (如上左圖示)。黑色方塊表示狀態從時間tt到時間t 1t 1發生了1個時間步長的延時。
  • 展開的計算圖。每部分由許多不同的變數表示,每個時間步長1個變數 (該變數表示某時刻該部分的狀態,計算圖中畫成單獨的節點)。展開之意為對映左圖中的電路至右圖帶重複部分的計算圖。展開圖的長度取決於序列長度。

用函式g(t)g^{(t)}表示tt時間步後的展開迴圈:

h(t)=g(t)(x(t),x(t−1),x(t−2),…,x(2),x(1))=f(h(t−1),x(t);θ)

\begin{align}
&h^{(t)}=g^{(t)}(x^{(t)},x^{(t-1)},x^{(t-2)},…,x^{(2)},x^{(1)})
\\&=f(h^{(t-1)},x^{(t)};\theta)
\end{align}

函式g(t)g^{(t)}的輸入為整個過去的序列(x(t),x(t−1),x(t−2),…,x(2),x(1))(x^{(t)},x^{(t-1)},x^{(t-2)},…,x^{(2)},x^{(1)}),輸出為當前狀態,但展開的迴圈結構分解g(t)g^{(t)}為函式ff的重複應用。展開有兩種好處:

  • 不管序列長度,學習到的模型的輸入大小相同,因為它被指定從1個狀態轉到另1個狀態,而不是可變長度狀態的歷史。
  • 每個時間步,引數相同,轉換函式ff相同。

以上好處使得單個模型ff能在所有時間步和所有序列長度上操作。學習單個模型可以泛化到訓練集中未出現的序列長度,引數共享使模型估計用到更少的訓練樣本。

迴圈圖和展開圖各有用途。迴圈圖簡明;展開圖清晰地描述計算過程,並有助於說明隨時間前向 (計算輸出和損失) 和反向 (計算梯度) 的資訊流。

2. 迴圈網路 (Recurrent Neural Networks)

迴圈網路的重要設計模式包括:

  • 1個時間步產生1個輸出,隱含單元之間迴圈連線 (下圖左)。
  • 1個時間步的輸出連入另1時間步的隱含單元 (下圖中)。
  • 隱含單元之間迴圈連線,讀取整個序列,最後1個隱含單元產生1個輸出 (下圖右)。

這裡寫圖片描述

上圖左對應的 RNN 是通用的。理論上的 RNN 被證用 RNN 的啟用函式和權重 (無限精度的有理數) 可模擬1個無限長的堆疊。

假定隱含單元選用雙曲正切啟用函式,輸出為離散值,如預測單詞或字元。離散變數的每個可能值的未歸一化對數概率表示離散變數的輸出oo,輸入給 softmax 迴歸,輸出歸一化的概率向量y^\hat y。前向傳播的起始狀態指定為h(0)h^{(0)}。從時間步t=1t=1~τ\tau,用下面的更新方程:

a(t)=b Wh(t 1) Ux(t)h(t)=tanh(a(t))o(t)=c Vh(t)y^(t)=softmax(o(t))

a^{(t)}=b Wh^{(t 1)} Ux^{(t)}
\\h^{(t)}=tanh(a^{(t)})
\\o^{(t)}=c Vh^{(t)}
\\\hat y^{(t)}=softmax(o^{(t)})

其中,bb和cc為偏置,UU,VV和WW為輸入到隱含單元,隱含單元到輸出,隱含單元到隱含單元的連線權重。這裡,輸入序列與輸出序列的長度相同。全部損失為所有時間步的損失之和。比如,如果給定x(1),…,x(τ)x^{(1)},…,x^{(\tau)},L(t)L^{(t)}為y(t)y^{(t)}的負對數似然損失,則

L({x(1),…,x(τ)},{y(1),…,y(τ)})=∑t=1τL(t)=−∑t=1τlog1pmodel(y(t)|{x(1),…,x(τ)})

\begin{align}
&L\left(\{x^{(1)},…,x^{(\tau)}\},\{y^{(1)},…,y^{(\tau)}\}\right)
\\&=\sum_{t=1}^{\tau}L^{(t)}
\\&=-\sum_{t=1}^{\tau}log \phantom{1}p_{model}\left(y^{(t)}|\{x^{(1)},…,x^{(\tau)}\}\right)
\end{align}

其中,pmodel(y(t)|{x(1),…,x(τ)})p_{model}\left(y^{(t)}|\{x^{(1)},…,x^{(\tau)}\}\right)為模型的輸出向量y^(t)\hat y^{(t)}預測為y(t)y^{(t)}的概率。該損失函式的梯度計算費時。見上圖左,梯度計算涉及展開圖上的從左往右的前向傳播,緊隨從右往左的反向傳播。執行時間為O(τ)O(\tau),因前向傳播圖本質上為序列,所以不能並行減少時間。先計算前1個時間步才能得到後面的每個時間步。前向計算的狀態會被儲存直到反向計算時重用,所以記憶體開銷也為O(τ)O(\tau)。應用於代價為O(τ)O(\tau)的展開圖的反向傳播演算法被稱為穿過時間的反向傳播 (BPTT)。隱含單元間的迴圈網路因此很強大但訓練困難。

(1) 老師強迫 (Teacher Forcing) 與 輸出迴圈的網路

某1時間步的輸出僅迴圈連線到下1時間步的隱含單元的網路是嚴格弱的,因為它缺少隱含單元到隱含單元的迴圈連線。比如,它不能模擬1個通用的圖靈機。因為它缺少隱含層到隱含層間的迴圈,所以網路用於預測未來時,輸出單元要求捕捉過去所有的資訊。顯式訓練輸出單元來匹配訓練集合的目標不太可能捕獲關於輸入過去歷史的必要資訊,除非使用者瞭解系統的全部狀態且把它作為訓練目標的一部分。

對時間步tt的預測與其訓練目標比較的任何損失函式來說,消除隱含單元到隱含單元的迴圈可解耦所有的時間步。單獨計算每個時間步tt的梯度可並行訓練,不必先算前面時間步的輸出,因為訓練集已提供輸出的完美值。

從輸出到狀態的迴圈連線模型可能用“老師強迫”訓練。訓練時,模型接受真實輸出y(t)y^{(t)}為時間步t 1t 1的輸入,老師強迫是遵從最大似然標準的過程。檢查兩個時間步的序列,條件最大似然標準為:

log1p(y(1),y(2)|x(1),x(2))=log1p(y(2)|y(1),x(1),x(2)) log1p(y(1)|x(1),x(2))

\begin{align}
&log\phantom{1}p\left(y^{(1)},y^{(2)}|x^{(1)},x^{(2)}\right)
\\&=log\phantom{1}p\left(y^{(2)}|y^{(1)},x^{(1)},x^{(2)}\right) log\phantom{1}p\left(y^{(1)}|x^{(1)},x^{(2)}\right)
\end{align}

本例中,時間步t=2t=2時,給定訓練資料中的截至tt的xx序列和yy值,訓練模型來最大化y(2)y^{(2)}的條件概率。訓練時指定最大似然,而非輸出自迴圈。

這裡寫圖片描述

隱含單元間缺少連線的模型上用老師強迫可避免穿過時間的反向傳播。老師強迫也能用於輸出與狀態迴圈連線的模型。然而,一旦隱含單元變成1個前面時間步的函式,BPTT演算法是必要的。一些模型同時用老師強迫與 BPTT。

如果網路用於開環模式 (網路輸出反饋給輸入),嚴格老師強迫會出問題。訓練時網路輸入與測試時輸入可以有很大差異。

訓練時,同時用老師強迫的輸入與未來幾個時間步後預測的正確目標作輸入。另外1種緩和訓練與測試輸入間的差異,隨機選擇泛化輸出或實際資料作輸入。該方式用課程學習策略,逐漸用更多的泛化值作輸入。

“老師強迫”原意可這樣理解:假設狀態為學生的學習態度,輸入為學生的作業,輸出為儘可能好的期末考試成績。老師沒辦法讓學渣突然愛上學習,所以,一般會通過強迫學生寫作業這樣的外在手段來提高學生的成績。

(2) 迴圈網路中的梯度計算

迴圈網路的梯度計算比較直接。展開的計算圖上用泛化的反向傳播演算法即可。展開圖上的反向傳播應用被稱為穿過時間的反向傳播 (BPTT) 演算法。反向傳播得到的梯度接著可用作任何通用的基於梯度的技術來訓練 RNN。

BPTT 為 RNN 方程 (上述 RNN 的正向傳播) 計算梯度。以重要設計模式中的左圖為例 (隱含層單元間迴圈連線),計算圖的節點包括U,V,W,b,c,x(t),h(t),o(t),L(t)U,V,W,b,c,x^{(t)},h^{(t)},o^{(t)},L^{(t)}。

a. 沿時間步的正向梯度

遞迴地計算每個節點NN的梯度損失∇NL\nabla_{N}L。首先:

∂L∂L(t)=1

\frac {\partial L}{\partial L^{(t)}}=1

並不是L=L(t)L=L^{(t)},LL為所有時間步的L(t)L^{(t)}的和。

假定 softmax 迴歸輸入o(t)o^{(t)}輸出y^\hat y,且損失是真實目標y(t)y^{(t)}的負對數似然。時間步tt上輸出的梯度∇o(t)L\nabla_{o^{(t)}}L,對所有的i,ti,t:

(∇o(t)L)i=∂L∂L(t)∂L(t)∂y^(t)i∂y^(t)i∂o(t)i=1×⎛⎝−1y^(t)i⎞⎠×y^(t)i×(1−y^(t)i)=y^(t)i−1

(\nabla_{o^{(t)}}L)_i=\frac {\partial L}{\partial L^{(t)}}\frac {\partial L^{(t)}}{\partial \hat y_i^{(t)}}\frac {\partial \hat y_i^{(t)}}{\partial o_i^{(t)}}
=1 \times \left(-\frac{1}{\hat y_i^{(t)}}\right) \times \hat y_i^{(t)} \times \left(1-\hat y_i^{(t)}\right)
=\hat y_i^{(t)}-1

其中,ii為輸出向量o(t)o^{(t)}的第ii個元素。

b. 沿時間步的反向梯度

從序列末端開始,時間步τ\tau,h(τ)h^{(\tau)}僅派生了o(τ)o^{(\tau)} (不存在h(τ 1)h^{(\tau 1)}),有:

∇h(τ)L=VT∇oτL

\nabla _{h^{(\tau)}}L=V^{T}\nabla_{o^{\tau}}L

沿時間軸往回迭代 (從τ−1\tau-1到11) 來反向傳播梯度。注意到h(t)h^{(t)}派生了o(t)o^{(t)}和h(t 1)h^{(t 1)}。所以梯度為:

∇h(t)L=(∂h(t 1)∂h(t))T(∇h(t 1)L) (∂o(t)∂h(t))T(∇o(t)L)=WT(∇h(t 1)L)1diag(1−(h(t 1))2) VT(∇o(t)L)

\begin{align}
\nabla_{h^{(t)}}L&=\left( \frac{\partial h^{(t 1)}}{\partial h^{(t)}} \right)^T(\nabla_{h^{(t 1)}}L) \left( \frac{\partial o^{(t)}}{\partial h^{(t)}} \right)^T(\nabla_{o^{(t)}}L)
\\&=W^T(\nabla_{h^{(t 1)}}L)\phantom{1}diag\left(1-\left(h^{(t 1)}\right)^2\right) V^T(\nabla_{o^{(t)}}L)
\end{align}

其中,diag(1−(h(t 1))2)diag\left(1-\left(h^{(t 1)}\right)^2\right)為包含元素1−(h(t 1)i)21-(h_i^{(t 1)})^2的對角矩陣。這是第ii個隱含單元在時間步t 1t 1的雙曲正切的 Jacobian 矩陣。

h(t 1)=tanh(b Wh(t) Ux(t 1))h^{(t 1)}=tanh(b Wh^{(t)} Ux^{(t 1)})

c. 單個時間步內的引數梯度

獲得計算圖的內部節點的梯度後,可獲得引數節點上的梯度。因引數在許多時間步間共享,所以當微積分操作涉及這些引數時必須小心處理。用反向傳播方法得到計算圖中單個邊 (edge) 的梯度。然而,∇Wf\nabla_W f考慮WW對基於計算圖中所有邊的ff的分佈。為方便解釋,引入偽變數W(t)W^{(t)} (定義為WW在時間步tt的複製)。用∇W(t)\nabla W^{(t)}表示時間步tt的權重分佈的梯度。

{c,V}:o(t)=c Vh(t)\{c,V\}:o^{(t)}=c Vh^{(t)}
{b,W,U}:h(t)=tanh(b Wh(t−1) Ux(t))\{b,W,U\}:h^{(t)}=tanh(b Wh^{(t-1)} Ux^{(t)})

這樣,內部引數的梯度為:

∇cL=∑t=1τ(∂o(t)∂c)T∇o(t)L=∑t=1τ∇o(t)L∇VL=∑t=1τ∑i⎛⎝∂L∂o(t)i⎞⎠∇Vo(t)i=∑t=1τ(∇o(t)L)h(t)T∇bL=∑t=1τ(∂h(t)∂b(t))T∇h(t)L=∑t=1τdiag(1−(h(t))2)∇h(t)L∇WL=∑t=1τ∑i⎛⎝∂L∂h(t)i⎞⎠∇W(t)h(t)i=∑t=1τ((∇h(t)L)T1diag(1−(h(t))2))Th(t−1)T∇UL=∑t=1τ∑i⎛⎝∂L∂h(t)i⎞⎠∇Uh(t)i=∑t=1τ((∇h(t)L)T1diag(1−(h(t))2))Tx(t)T

\begin{align}
&\nabla_cL=\sum_{t=1}^{\tau}\left(\frac{\partial o^{(t)}}{\partial c}\right)^T\nabla_{o^{(t)}}L=\sum_{t=1}^{\tau}\nabla_{o^{(t)}}L
\\&\nabla_VL=\sum_{t=1}^{\tau}\sum_{i}\left(\frac{\partial L}{\partial o_i^{(t)}}\right)\nabla_Vo_i^{(t)}=\sum_{t=1}^{\tau}(\nabla_{o^{(t)}}L){h^{(t)}}^T
\\&\nabla_bL=\sum_{t=1}^{\tau}\left(\frac{\partial h^{(t)}}{\partial b^{(t)}}\right)^T\nabla_{h^{(t)}}L=\sum_{t=1}^{\tau}diag\left(1-(h^{(t)})^2\right)\nabla_{h^{(t)}}L
\\&\nabla_WL=\sum_{t=1}^{\tau}\sum_{i}\left(\frac{\partial L}{\partial h_i^{(t)}}\right)\nabla_{W^{(t)}}h_i^{(t)}=\sum_{t=1}^{\tau}\left((\nabla_{h^{(t)}}L) ^T\phantom{1}diag\left(1-(h^{(t)})^2\right)\right)^T{h^{(t-1)}}^T
\\&\nabla_UL=\sum_{t=1}^{\tau}\sum_{i}\left(\frac{\partial L}{\partial h_i^{(t)}}\right)\nabla_{U}h_i^{(t)}=\sum_{t=1}^{\tau}\left((\nabla_{h^{(t)}}L) ^T\phantom{1}diag\left(1-(h^{(t)})^2\right)\right)^T{x^{(t)}}^T
\end{align}

(3) 迴圈網路視為有向圖模型 (Directed Graphical Models)

a. 圖模型引數化

上例的迴圈網路的損失L(t)L^{(t)}為訓練目標y(t)y^{(t)}與o(t)o^{(t)}間的交叉熵。正如1個前向網路,原則上應使用1個迴圈網路中幾乎所有的損失。應選擇基於任務的損失。通常希望視 RNN 的輸出為1個概率分佈,且與該分佈相關的交叉熵定義為損失。均方差是1個輸出為正態分佈的交叉熵。

訓練 RNN 時,給定過去輸入,最大對數似然來估計下1個序列元素y(t)y^{(t)}的條件分佈:

log1p(y(t)|x(1),…,x(t))

log\phantom{1}p(y^{(t)}|x^{(1)},…,x^{(t)})

若該模型包含從1個時間點到另1個時間點輸出的連線,有:

log1p(y(t)|x(1),…,x(t),y(1),…,y(t−1))

log\phantom{1}p(y^{(t)}|x^{(1)},…,x^{(t)},y^{(1)},…,y^{(t-1)})

當過去的yy值不影響下1時間步的預測時,有向圖模型不包含從過去的y(i)(i=1,…,t−1)y^{(i)}(i=1,…,t-1)到當前y(t)y^{(t)}的邊;否則包含所有這樣的邊。直接引數化該圖模型 (下圖左) 效率低,輸入和引數的數目增長快。RNN 具有相同的全連線,且引數化更高效。

這裡寫圖片描述

考慮 RNN 為1個隨機標量序列Y={y(1),…,y(τ)}Y=\{y^{(1)},…,y^{(\tau)}\},無輸入xx,時間步tt的輸入僅為時間步t−1t-1的輸出 (上圖右)。這樣,RNN 模型定義為1個關於變數yy的有向圖模型。用條件概率的鏈式規則引數化yy的聯合分佈:

P(Y)=P(y(1),…,P(y(τ)))=P(y(τ)|y(τ−1),…,y(1))P(y(τ−1)|y(τ−2),…,y(1))…P(y(2)|y(1))P(y(1))=∏t=1τP(y(t)|y(t−1),…,y(1))

\begin{align}
P(Y)&=P(y^{(1)},…,P(y^{(\tau)}))
\\&=P(y^{(\tau)}|y^{(\tau-1)},…,y^{(1)})P(y^{(\tau-1)}|y^{(\tau-2)},…,y^{(1)})…P(y^{(2)}|y^{(1)})P(y^{(1)})
\\&=\prod_{t=1}^{\tau}P(y^{(t)}|y^{(t-1)},…,y^{(1)})
\end{align}
當t=1t=1時,P(Y)=P(y(1))P(Y)=P(y^{(1)})。因此,{y(1)∗,…,y(τ)∗}\{y^{(1)*},…,y^{(\tau)*}\}的負對數似然為:

L=∑t=1τL(t)=∑t=1τ−log1p(y(t)=y(t)∗|y(t−1)∗,…,y(1)∗)

L=\sum_{t=1}^{\tau}L^{(t)}=\sum_{t=1}^{\tau}-log\phantom{1}p( y^{(t)}=y^{(t)*}|y^{(t-1)*},…,y^{(1)*})

圖模型的邊表明變數與其它變數直接的依賴關係。刪除節點間相互作用弱的邊可使許多圖模型的統計與計算更高效。如 Markov 假設 (圖模型應僅包含{y(t−k),…,y(t−1)}\{y^{(t-k)},…,y^{(t-1)}\}至y(t)y^{(t)}的邊,而非包含所有過去的邊)。然而,所有過去的輸入應對序列的下一個元素有影響。當遙遠過去的某個y(i)y^{(i)}值對y(t−1)y^{(t-1)}無影響,但卻對y(t)y^{(t)}產生影響時,RNN 更有用。

b. 圖模型解釋 RNN

視 RNN 為1個具有完整的圖結構,可表示任意yy值對間的直接依賴的圖模型。排除隱含單元h(t)h^{(t)}的 RNN 模型可解釋為完整的圖。

視隱含單元h(t)h^{(t)}為隨機變數得出 RNN 的概率圖模型結構。概率圖模型中包含隱含單元顯示 RNN 極為有效地引數化觀測值的聯合分佈。假定用表格表示任意1個離散量的聯合分佈 (每個元素給出事件發生的概率),如果yy可取kk個不同值,表格有O(kτ)O(k^\tau)個引數。相比之下,引數共享使 RNN 有O(1)O(1)個引數 (為序列長度的函式)。RNN 引數數目可能會被調整來控制模型容量,而不必按序列長度擴充套件。RNN 每個時間步上迴圈使用相同的ff和θ\theta。圖模型中插入隱含單元h(t)h^{(t)}節點解耦了過去與未來,為它們之間的中間量。遙遠過去的某個變數y(i)y^{(i)}可能通過影響hh來影響y(t)y^{(t)}。

有效引數化後的圖模型難以預測序列中間的丟失值。減少引數數目後迴圈網路卻難以優化引數。

迴圈網路的權重共享的前提是假設相同的引數可用於不同的時間步。給定時間步tt的變數,時間步t 1t 1的變數的條件概率分佈是靜態的,即前後時間步的關係與tt無關。原則上,tt可用作每個時間步的額外輸入,從而學習者能夠在儘可能共享權重的同時發現任何的時變性。這已經強過每個時間步tt對應1個條件概率分佈。但出現新的時間步時,仍要推斷網路新增時間步的時變性。

c. 序列長度

在對模型取樣前,先確定序列長度:

  • 改變模型輸入
  • 改變模型輸出

當輸出yy為單詞中的字元時,加1個特殊標誌來結束1個序列。特殊字元產生時,取樣過程終止。訓練集中,每個訓練樣本的x(τ)x^{(\tau)}後面新增特殊字元輸入

新增二值輸出,決定每個時間步繼續或終止產生序列。該方法更通用,不會侷限於字元序列,還可用於實數序列等。新的輸出單元為交叉熵損失訓練出的 Sigmoid 單元,來最大化每個時間步上繼續還是終止序列正確預測時的對數似然概率。

新增序列長度τ\tau,用模型來預測τ\tau。先取樣τ\tau,再取樣τ\tau長度的序列樣本。該方法要求在每個時間步的迴圈更新處新增額外的輸入,來提示是否接近1個序列的末端。該輸入可以是序列長度τ\tau或者τ−t\tau-t (剩餘的時間步),從而避免 RNN 產生序列結束前突然終止的可能。強行分解序列的聯合概率分佈:

P(x(1),…,P(x(τ)))=P(x(1),…,x(τ)|τ)P(τ)

P(x^{(1)},…,P(x^{(\tau)}))=P(x^{(1)},…,x^{(\tau)}|\tau)P(\tau)

(4) 取決於 RNN 上下文的訓練模型

任何變數為P(y;θ)P(y;\theta)的模型都可解釋為條件分佈為P(y|ω)P(y|\omega) (ω=θ\omega=\theta)的模型。如果ω\omega為輸入xx的函式,那麼P(y|x)P(y|x)能表示與P(y|ω)P(y|\omega)分佈相同的模型。

I. 向量輸入

前面討論過 x(t)x^{(t)} 序列 (t=1,…,τt=1,…,\tau) 為輸入的 RNN。另1種方法,新增單個定長的向量 xx (序列的元素) 為 RNN 的額外輸入。為 RNN 提供額外輸入的常用方法:

  • 作為每個時間步的額外輸入
  • 作為初始狀態h(0)h^{(0)}
  • 兩者結合

這裡寫圖片描述

引入權重矩陣RR,每個時間步上隱含單元的輸入為xTRx^TR。xx的選擇決定了每個隱含單元新的偏置xTRx^TR是否有效。非條件模型 (無輸入xx或x(t)x^{(t)}) 的引數θ\theta變為ω\omega後仍然保持不變,除了ω\omega中的偏置引數現在變為輸入xx的函式。

前面討論的輸入為{x(1),…,x(τ)}\{ x^{(1)},…,x^{(\tau)} \},現在討論的輸入為{xTR,…,xTR}\{ x^TR,…,x^TR \}。

該 RNN 適用於給影象加標題 (輸入為單幅影象,輸出為描述影象的語句)。觀測序列的元素y(t)y^{(t)}既為當前時間步的輸入,也為訓練時前面時間步的目標。

II. 向量序列輸入

RNN 輸入為向量序列{x(1),…,x(τ)}\{x^{(1)},…,x^{(\tau)}\}時,假設輸出y(t)y^{(t)}條件獨立,,則分解為 (見“圖模型引數化”部分):

P(y(1),…,y(τ)|x(1),…,x(τ))=∏t=1τP(y(t)|y(t−1),…,y(1),x(1),…,x(τ))=∏t=1τP(y(t)|x(1),…,x(τ))

P(y^{(1)},…,y^{(\tau)}|x^{(1)},…,x^{(\tau)})=\prod_{t=1}^{\tau}P(y^{(t)}|y^{(t-1)},…,y^{(1)},x^{(1)},…,x^{(\tau)})=\prod_{t=1}^{\tau}P(y^{(t)}|x^{(1)},…,x^{(\tau)})

假設不條件獨立,時間步tt的輸出連到時間步t 1t 1的隱含單元。此時,模型能表示任意序列yy的概率分佈。給定序列xx來描述另1個序列yy分佈的模型時,限制兩個序列長度相同。

這裡寫圖片描述

3. 雙向 RNN

大標題 (“1., 2., 3. …”) 為原作者給的,以 RNN 型別來區分;小標題 (“I., II., III. …”) 是我給的,以 實際問題的輸入型別區分。所以,唯獨這裡的小標題的索引會不連貫。

III. 完整向量序列輸入

許多應用的預測輸出y(t)y^{(t)}可能取決於完整的輸入序列。如語音識別中,當前音位的正確解釋可能因協同發音取決於後幾個音位,且甚至可能因單詞間語境取決於後幾個單詞:須往過去或未來看得更遠來區分當前單詞的兩個聲學相似的解釋。手寫識別和其它序列到序列的學習類似。

1997 年 Schuster 和 Paliwal 發明雙向 RNN。2005~2013 年間在手寫體識別,語音識別和生物資訊等方面的應用取得巨大成功。

這裡寫圖片描述

雙向 RNN 結合正向 RNN 和 反向 RNN。正向 RNN 從序列起點隨時間移動至終點,反向 RNN 從序列終點隨時間移動至起點。正反向 RNN 的狀態分別為h(t)h^{(t)}和g(t)g^{(t)}。過去和未來都會影響輸出單元o(t)o^{(t)},但輸出對時間步tt周圍的輸入最為敏感,且不必指定圍繞時間步tt的固定大小的視窗。

用4個 RNN 可擴充套件至2維輸入 (如影象)。每個 RNN 沿1個方向 (上,下,左和右) 移動。輸入 2D 網格上的每個點(i,j)(i,j),當每個 RNN 的輸入序列足夠長時,輸出O(i,j)O(i,j)能捕獲大部分區域性資訊。與卷積網路相比,RNN 用於影象的計算耗時,但可得到同一特徵圖上特徵間遠端的相互作用。與前者相比,該 RNN 的正向傳播方程改成用卷積來計算每層自底向上的輸入會更好。

4. 編碼-解碼 或 序列到序列的結構

前面討論過從輸入序列到定長向量,從定長向量到輸出序列,從輸入序列到與輸入序列長度相同的輸出序列。

“向量序列輸入”部分提及的 RNN 是長度為τ\tau的 RNN,即定長 RNN。這裡排除輸入和輸出變為相同長度的子序列,因為若子序列可完整描述模型輸入,可重新定義τsub(<τ)\tau_{sub}(<\tau),此時新的 RNN 依然是定長序列的輸入輸出。

IV. 可變向量序列輸入

應用於語音識別,機器翻譯或問答等的 RNN 輸入序列長度不必等於輸出序列長度。輸入語句長度和輸出語句長度通常不相同,儘管兩者可能相關。

RNN 的輸入經常稱為“上下文”。上下文CC為概括輸入序列X=(x(1),…,x(nx))X=(x^{(1)},…,x^{(n_x)})的1個向量或序列。

2014 年 Cho 等人首次提出輸入和輸出為可變長序列的最簡 RNN 結構,同年 Sutskever 等人對該結構擴充套件,首次用該方法取得領先的翻譯效果。前者 (編碼到解碼結構) 排序另1個機器翻譯產生的建議,後者 (序列到序列結構) 用1個單獨的 RNN 完成翻譯。

這裡寫圖片描述

(1) 編碼-解碼結構

編碼 (encoder/reader/input) RNN 處理輸入序列,輸出上下文CC (通常為最後隱含狀態的簡單函式)。
解碼 (decoder/writer/output) RNN 輸入單個定長的向量 (見”向量輸入”部分的xx),輸出語句Y=(y(1),…,y(ny))Y=(y^{(1)},…,y^{(n_y)})。

該結構的創新處為nx和nyn_x和n_y可變,而之前所述的結構有約束nx=ny=τn_x=n_y=\tau。

編碼 RNN 的最後的狀態hnx的h_{nx}的輸出CC為解碼 RNN 的輸入。如果CC為向量,解碼 RNN 僅僅是1個向量到序列的 RNN (見”向量輸入”部分)。

編碼器的隱含單元數目與解碼器的隱含單元數目可以不相等。

2015 年 Bahdanau 等人在機器翻譯的上下文中觀察到,編碼 RNN 的上下文輸出CC的維度太小會難以合適地概括長序列,因此它們把CC從1個定長向量改為變長序列。另外,引入學習關聯序列CC元素至輸出序列元素的注意機制。

(2) 序列到序列的結構

聯合訓練兩個 RNN 來最大化訓練集中所有x−yx-y序列對的log1P(y1,…,yny|x1,…,xnx)log\phantom{1}P(y^{1},…,y^{n_y}|x^{1},…,x^{n_x})均值。

5. 深度迴圈網路

大多數 RNN 計算分解為引數與相關變換的3步:

  • 從輸入到隱含狀態;
  • 從上1個隱含狀態到下1個隱含狀態;
  • 從隱含狀態到輸出。

每部分關聯1個權重矩陣。換句話說,展開網路時,每部分的矩陣對應1個淺變換。深 MLP 中的單層變換稱為淺變換。典型的淺變換用1個學得的仿射變換 (緊隨1個固定的非線性) 表示。

實驗證據強烈建議對淺變換引入深度,一致認為需要足夠的深度來滿足對映要求。

2013 年 Graves 等人首次顯示分解 RNN 狀態進多層的巨大收益。下圖 (a) 中分層的底層可視為轉換原輸入成隱含狀態更高層的更合適的表示。
2014 年 Pascanu 等人讓上述每部分有1個 MLP,如下圖 (b)。根據對每部分分配足夠容量來考慮整體的表示容量,但該方法新增深度後會因優化困難而可能影響訓練。
總的來說,淺層結構優化更容易,新增額外的深度延長了變數從時間步tt到時間步t 1t 1的最短路徑。比如,狀態間用1個單隱含層的 MLP,則與常規 RNN 相比,任意兩個不同時間步間變數的最短路徑變為兩倍。
然而,跳過隱含單元到隱含單元路徑上的連線可緩解路徑延長問題,見下圖 (c)。

這裡寫圖片描述

與圖 (b) 相比,圖 (c) 的隱含單元到隱含單元的路徑上,多出了1個連線與 MLP 的單隱含層並聯

6. 遞迴網路 (Recursive Neural Networks)

遞迴網路是迴圈網路的另1種泛化,但計算圖的結構為1個深層樹,而不是 RNN 的鏈式結構。

1990 年 Pollack 提出遞迴網路。在 NLP 和計算機視覺方面,遞迴網路成功用於處理送入神經網路的資料結構

對序列長度為τ\tau的迴圈網路,遞迴網路的深度 (構成非線性操作的數目) 從τ\tau大幅減少至O(logτ)O(log\tau),有助於處理長期依賴 (long-term dependencies)。最好的樹結構的設計問題尚未解決。1種選擇為採用獨立於資料的樹結構 (如平衡二叉樹)。某些領域中,外在方法能表現出合適的樹結構。比如處理自然語句時,遞迴網路的樹結構可固定為由自然語言解析器提供的語句解析樹。學習器根據給定輸入發現和推斷出的樹結構是理想的樹結構。

遞迴網路的變種很多。1997 和 1998 年 Frasconi 等人用資料關聯樹結構,且用輸入和輸出關聯樹的節點。每個節點的計算不必是傳統的人工神經計算 (所有輸入的仿射變換,緊隨1個單調的非線性)。比如,2013 年 Socher 發現建模概念 (連續向量表示) 間的關係時張量操作和雙線性形式有用。

7. 長期依賴的挑戰

迴圈網路中,學習長期依賴的基本問題為許多層上傳播的梯度往往會消失 (常見) 或爆炸 (少見,優化傷害大)。即使引數穩定 (可儲存記憶,且梯度不爆炸),與短期作用相比,長期作用的權重指數衰減,依然難以解決問題。其它方法用更深的處理 (Hochreiter, 1991; Bengio 等, 1994; Pascanu 等, 2013)。

迴圈網路的多個時間步相同函式組合產生了極強的非線性。

迴圈網路的組成函式類似矩陣乘法。迴圈關係可表示為1個去掉非線性啟用函式和輸入xx的簡單迴圈網路:

h(t)=WTh(t−1)

h^{(t)}=W^Th^{(t-1)}

迴圈關係本質上用次方描述,可簡化為:

h(t)=(Wt)Th(0)

h^{(t)}=(W^t)^Th^{(0)}

若WW可用正交陣QQ分解為:

W=QΛQT

W=Q\Lambda Q^T

則該迴圈可簡化為:

h(t)=((QΛQT)t)Th(0)=(QΛQTQΛQT…QΛQT)Th(0)=(QΛΛ…ΛQT)Th(0)=(QΛtQT)Th(0)=QTΛtQh(0)

\begin{align}
&h^{(t)}=((Q\Lambda Q^T)^t)^Th^{(0)}
\\&=(Q\Lambda Q^TQ\Lambda Q^T…Q\Lambda Q^T)^Th^{(0)}=(Q\Lambda \Lambda …\Lambda Q^T)^Th^{(0)}=(Q\Lambda^t Q^T)^Th^{(0)}
\\&=Q^T \Lambda^t Qh^{(0)}
\end{align}
特徵值提高為它的tt次方後,導致小於1的特徵值衰減至0,大於0的特徵值爆炸。任何h^{(0)}中的非最大特徵值部分都會被丟棄。

迴圈網路中該問題尤為明顯。假設權重ω\omega為標量,權重自乘很多次後會根據ω\omega的幅值消失或爆炸。然而,對每個時間步權重w(t)w^{(t)}不同的非迴圈網路不成立。如果初始狀態給定為1,則tt時刻的狀態為∏tw(t)\prod_tw^{(t)}。假設w(t)w^{(t)}從均值為00,方差為vv的分佈 (獨立同分布) 中隨機產生。則該乘積的方差為O(vn)O(v^{n})。為獲得理想的方差v∗v^*,選擇每個時間步的權重為v=v∗−−√nv=\sqrt[n]{v^*}。因此,小心選擇縮放的很深前向網路可以避免梯度消失或爆炸問題。

有人希望通過保留梯度在不消失和不爆炸的引數空間區域內,不幸的是,為儲存對小擾動魯棒的區域,RNN 一定會進入梯度消失的引數空間區域。具體地,長期作用的梯度指數級地小於短期作用的梯度。這並不意味著梯度不可學,只是要花很長的時間去學長期作用,因為短期作用出現的波動常會隱藏長期作用的訊號。1994 年 Bengio 等人實驗表明擴大捕獲的依賴範圍會使基於梯度的優化難度加大,對長度為10或20的序列,用 SGD 的 傳統 RNN 訓練權重的成功率快速減為0。

8. 迴響狀態網路 (Echo State Networks)

從h(t−1)h^{(t-1)}到h(t)h^{(t)}的迴圈權重與從x(t)x^{(t)}到h(t)h^{(t)}的輸入權重為迴圈網路中最難學的引數。避免該問題的1種方法為讓隱含單元捕獲過去輸入的歷史,僅學習輸出權重。該想法被稱為迴響狀態網路 (ESN) 和 液態機 (liquid state machine)。與前者相比,後者用尖峰神經元 (二值輸出) 替換連續值的隱含單元。兩者都屬於儲備池計算 (reservoir computing),儲備時序特徵的隱含單元可捕捉不同方面的輸入歷史。

儲備池計算迴圈網路與核機器相似:對映1個任意長度的序列 (截止至時間步tt的輸入歷史) 至1個定長的向量 (迴圈狀態h^{(t)}),可以用線性預測器 (典型地,線性迴歸)。訓練標準可設計為輸出權重的凸函式。比如,從隱含單元到輸出的對映用線性迴歸,且訓練標準為均方差,那麼該標準為凸函式且可用簡單的學習演算法求解。

因此,如何設定輸入和迴圈權重使迴圈網路的狀態能夠表示1套豐富的輸入歷史。儲存池計算給出的答案為視迴圈網路為1個動態系統,且設定輸入和迴圈權重使動態系統接近穩定。

使狀態至狀態的轉換函式的 Jacobian 特徵值接近1。(?) 1個迴圈網路的重要特徵是 Jacobians J(t)=∂s(t)∂s(t−1)J^{(t)}=\frac{\partial s^{(t)}}{\partial s^{(t-1)}}的特徵值譜。J(t)J^{(t)}的譜半徑定義為其特徵值絕對值的最大值。

為理解譜半徑的影響,考慮tt不變時的 Jacobian 矩陣 JJ 的反向傳播 (如當網路純線性時)。假設JJ為對應特徵λ\lambda的1個特徵向量vv。用梯度向量gg開始,1步反傳後得到JgJg,nn步反傳得到J(n)gJ^{(n)}g。換為gg的擾動版本g δvg \delta v開始反傳,nn步後得到J(n)(g δv)J^{(n)}(g \delta v)。所以,從g δvg \delta v反傳nn步後多發散J(n)δvJ^{(n)}\delta v。如果vv選為特徵值為λ\lambda的JJ的單位特徵向量,JacobianJacobian 的乘法僅在每步乘以1個常數。兩個反傳的差值為δ|λ|(n)\delta |\lambda|^{(n)}。 當vv對應λ\lambda的最大值時,該擾動得到的差值最大。

當λ>1\lambda >1時,δ|λ(n)|\delta |\lambda^{(n)}|指數增大;當λ<1\lambda <1時,δ|λ(n)|\delta |\lambda^{(n)}|指數減小。

該例假定每步的 Jacobian 相同,對應1個線性的迴圈網路。引入非線性時,非線性的導數經過許多時間步後將接近0,避免大的譜半徑引起的爆炸。

用重複的矩陣乘法的反傳的一切,同樣適用於1個線性網路的正向傳播,狀態h(t 1)=h(t)TWh^{(t 1)}={h^{(t)}}^TW。

當線性對映WTW^T總按L2L^2模縮小hh,那麼該對映是收縮的,每個時間步後都會變小一點。因此,當我們用有限精度來儲存狀態向量時,會使網路容易遺忘歷史資訊。

Jacobian 矩陣告訴我們h(t)h^{(t)}正向迭代或h(t 1)h^{(t 1)}反向迭代時的微小變化。WW和JJ不必為對稱陣 (實數方陣),所以它們可以有複數特徵值和特徵向量,虛部對應潛在的震盪行為 (迭代使用相同的 Jacobian)。儘管h(t)h^{(t)}或反傳中hth^{t}的小變化為實值,但可用複數形式表示。迭代應用 Jacobian 矩陣時,複數絕對值大於1時的特徵值對應指數增長,否則縮小。

帶非線性的 Jacobian 在每個時間步都可無約束地變化,因此具有更復雜的動態特性。然而,1個起始的小差異,若干時間步後仍然會變為大差異。 與純線性相比,非線性網路用諸如tanhtanh這樣壓扁的非線性導致迴圈的動態特性有界。注意到,即使正向傳播的動態特性有界,反向傳播可能會保持動態特性無界。 比如,當tanhtanh單元的序列插入純線性網路的線性區,且用譜半徑大於1的權重矩陣相連。然而,所有tanhtanh單元同時為線性啟用點的狀況很少見。

迴響狀態網路只是修正權重的譜半徑,但因如tanhtanh這樣飽和非線性的穩定效果,使權重不會爆炸。

最近,設定ESN中權重的技術可用於在1個可學習的迴圈網路 (隨時間步反傳的隱含層間的迴圈的權重) 中初始化權重,以便學習長期依賴。其中,結合稀疏初始化模式,譜半徑為1.2時效果不錯。

9. 洩漏單元 (Leaky Units) 和其它多時間尺度的策略

處理長期依賴的1種方式為設計多時間尺度上操作的模型。細粒度時間尺度上操作可處理更多細節,粗粒度時間尺度上操作可更有效將遙遠的歷史資訊轉換為當前資訊。所以針對既細又粗的時間尺度來設計策略:其中包含跨時間步跳過連線,“洩露單元”累積不同時間常數的訊號,刪除某些連線來建立細粒度時間尺度。

(1) 跨時間步跳過連線

為獲取粗粒度,將遙遠過去的變數與當前變數直接相連。受 1988 年 Lang 與 Hinton 在前向神經網路中插入延時的啟發,1996 年 Lin 等人採用直連的方法。

梯度隨時間步數的增加可能會指數地消失或爆炸。為緩解該問題, Lin 等人引入dd個延時進迴圈連線。此時梯度指數消失可看成1個關於τd\frac{\tau}{d} (而非τ\tau) 的函式。

對1個指數規律衰減的量,幅值變為其1e\frac{1}{e}倍所需的時間τ\tau稱為時間常數2 如果為τd\frac{\tau}{d},梯度會消失得更快。所以,應該改為τd{\tau}{d}吧~

因延時和單步連線,梯度依然會按τ\tau指數地爆炸。所以,儘管該方法不可能很好地表示所有的長期依賴,但可捕獲相對更長的依賴。

(2) 洩漏單元和1個不同時間尺度譜

為使路徑上的導數乘積接近1,線性自連線單元和連線權重接近1。

累積某值 v(t)v^{(t)} (?) 的移動平均μ(t)\mu^{(t)}:用μ(t)←αμ(t−1) (1−α)v(t)\mu^{(t)}\leftarrow \alpha \mu^{(t-1)} (1-\alpha)v^{(t)}更新,α\alpha為連線μ(t−1)\mu^{(t-1)}到μ(t)\mu^{(t)}的引數。當α\alpha接近1時,移動平均可記住過去的資訊很長一段時間;當α\alpha接近0時,過去資訊被迅速排除。線性自連線的隱含單元類似於移動平均,被稱為洩露單元

跳過dd個時間步的連線可確保單元總能學習到dd個時間步前的影響。另1種方式為用1個接近1的權重來線性自連線。線性自連線方法通過調整實數值α\alpha (而非調整整型跳過的長度),效果更平滑和靈活。

用洩漏單元設定時間常數有兩種基本策略。一種為手動固定值,比如,初始時刻從某分佈中取樣1次值。另一種為將時間常數設定為自由引數,然後學習它。不同時間尺度上的洩露單元有助於長期依賴。

(3) 刪除連線

解決長期依賴的另1種方式為多時間尺度上組織 RNN 的狀態,讓資訊更容易在緩慢時間尺度上長距離地流動。

與前面跳過時間步的連線不同,刪除連線涉及刪除時間步長度為1的連線,且替換成更長的連線。 修改後的單元只能在更長時間尺度上操作,但也可選擇聚焦到短項連線上。

使迴圈單元在不同的時間尺度上操作的方法很多。1種為令迴圈單元洩漏,但不同組的單元關聯不同的固定時間尺度 (1992 年 Mozer 提出,2013 年 Pascanu 等人成功應用)。另1種為對不同組的單元用不同的更新頻率,在不同的時間步上顯式離散地更新。 這是 1996 年 Bengio 和 2014 年 Koutnik 的方法,在許多 Benchmark 資料集上效果不錯。

10. 長短時記憶 (Long Short-Term Memory) 與其它門控 (gated) RNNs

實際應用中本文最有效的序列模型為門控 RNN,包括長短時記憶和基於門控迴圈單元的網路。

類似洩漏單元,門控 RNN 基於使隨時間的路徑上的導數不消失或爆炸。洩漏單元用手動選擇的常數或引數作為連線權重。門控 RNNs 將連線權重泛化成每個時間步都可能改變。

洩漏單元使網路能夠在很長的時間內累積資訊 (如特定的特徵或型別)。然而,用到累積的資訊後,網路會遺忘過去的狀態。比如,當子序列組成序列,且需要通過設定過去的狀態為0來遺忘它。除了手動決定何時清除狀態,希望網路能學習到何時去決定清除。

(1) LSTM

1997 年 Hochreiter 和 Schmidhuber 最早提出的長短時記憶的主要貢獻是引入自迴圈來建立使資訊長期流動的路徑。

使自迴圈取決於上下文,而非固定不變。通過使自迴圈的權重可門控,累積的時間尺度能動態變化。此時,即使 LSTM 固定引數,累積的時間尺度可隨著輸入序列而改變,因為時間常數為模型的輸出。LSTM 在很多應用中極為成功,如無約束手寫體識別,語音識別,手寫體生成,機器翻譯,影象加標題和解析。

這裡寫圖片描述

LSTM 的框圖見上圖。LSTM 迴圈網路單元間彼此迴圈連線,來替換普通迴圈網路的隱含單元。用1個常規人工神經單元計算輸入特徵。如果 Sigmoid 門允許,輸入的特徵值會累加給狀態。狀態單元有1個由遺忘門控制的線性自迴圈。輸出門可關閉LSTM 迴圈網路的輸出。所有的門單元都用 Sigmoid 非線性,而輸入單元可用壓扁的非線性 (如 tanh)。狀態單元可用作門單元的額外輸入。黑色方塊為1個時間步的延時。

壓扁的非線性的原文為“squashing nonlinearity”。通常指各種非線性的啟用函式 3,這裡用 tanh 為例。

對應的前向傳播方程用淺層迴圈網路結構給出。更深的結構也有成功的應用。每個迴圈單元不再是僅對輸入到迴圈單元的仿射變換按元素應用非線性,除了 RNN 外部迴圈,LSTM 迴圈網路有“LSTM 單元”,每個單元有1個內部自迴圈。每個“LSTM 單元”有與普通 RNN 相同的輸入和輸出,但有更多的引數且有1個控制資訊流的門控單元。

最重要的部分是狀態單元s(t)is^{(t)}_i,具有1個與洩漏單元相似的線性自迴圈。但遺忘門 (forget gate) 單元f(t)if_i^{(t)} (時間步tt的單元ii) 用1個 Sigmoid 單元設定權重至00~11之間,來控制自迴圈的權重 (或相關時間常數):

f(t)i=σ⎛⎝bfi ∑jUfi,jx(t)j ∑jWfi,jh(t−1)j⎞⎠

f_i^{(t)}=\sigma \left(b_i^f \sum_jU_{i,j}^fx_j^{(t)} \sum_jW_{i,j}^fh_j^{(t-1)} \right)

其中,x(t)x^{(t)}為當前輸入向量。h(t)h^{(t)}為當前隱含單元向量,包含所有 LSTM 單元的輸出。且bf,Uf,Wfb^f,U^f,W^f分別為遺忘門的偏置,輸入權重和迴圈權重。

用條件自迴圈權重f(t)i來更新f_i^{(t)}來更新LSTM 單元的內部狀態。

s(t)i=f(t)is(t−1)i g(t)iσ⎛⎝bi ∑jUi,jx(t)j ∑jWi,jh(t−1)j⎞⎠

s_i^{(t)}=f_i^{(t)}s_i^{(t-1)} g_i^{(t)}\sigma \left(b_i \sum_jU_{i,j}x_j^{(t)} \sum_jW_{i,j}h_j^{(t-1)} \right)

其中,b,U,Wb,U,W分別為LSTM 單元的偏置,輸入權重和迴圈權重。外部輸入門 (external input gate) 單元g(t)ig^{(t)}_i與遺忘門單元計算類似,但有自己的引數:

g(t)i=σ⎛⎝bgi ∑jUgi,jx(t)j ∑jWgi,jh(t−1)j⎞⎠

g_i^{(t)}=\sigma \left(b_i^g \sum_jU_{i,j}^gx_j^{(t)} \sum_jW_{i,j}^gh_j^{(t-1)} \right)

輸出門 (output gate) 單元 q(t)iq_i^{(t)}可關閉 LSTM 單元的輸出h(t)ih_i^{(t)}:

q(t)i=σ⎛⎝boi ∑jUoi,jx(t)j ∑jWoi,jh(t−1)j⎞⎠h(t)i=tanh(s(t)i)q(t)i

\begin{align}
&q_i^{(t)}=\sigma \left(b_i^o \sum_jU_{i,j}^ox_j^{(t)} \sum_jW_{i,j}^oh_j^{(t-1)} \right)
\\&h_i^{(t)}=tanh\left(s_i^{(t)}\right)q_i^{(t)}
\end{align}
其中,引數bo,Uo,Wob^o,U^o,W^o分別為輸出門的偏置,輸入權重和迴圈權重。LSTM 的變種中,選擇把單元狀態s(t)is_i^{(t)}送入第ii個單元的3個門作為額外的輸入 (帶權重)。

有上標ff的引數屬於遺忘門,有上標gg的引數屬於外部輸入門,有上標oo的引數屬於輸出門。

與簡單的迴圈結構相比,LSTM 網路在測試長期依賴能力的合成資料集和挑戰性任務處理任務上可學習到更長期的依賴。

(2) 其它門控 RNN

LSTM 哪一部分是必要的?還能設計出其它成功的結構,使網路能動態控制時間尺度和遺忘不同單元的行為?

近期門控 RNN 上的工作,網路單元為門控迴圈單元或 GRUs。與 LSTM 不同之處為僅有1個門單元同時控制遺忘因子和決定是否更新狀態單元。更新方程如下:

h(t)i=u(t−1)ih(t−1)i (1−u(t−1)i)σ⎛⎝bi ∑jUi,jx(t−1)j ∑jWi,jr(t−1)jh(t−1)j⎞⎠

h_i^{(t)}=u_i^{(t-1)}h_i^{(t-1)} (1-u_i^{(t-1)})\sigma\left(b_i \sum_jU_{i,j}x_j^{(t-1)} \sum_jW_{i,j}r_j^{(t-1)}h_j^{(t-1)}\right)

其中,uu為更新門,rr為復位門。它們的值定義為:

u(t)i=σ⎛⎝bui ∑jUui,jx(t)j ∑jWui,jh(t)j⎞⎠r(t)i=σ⎛⎝bri ∑jUri,jx(t)j ∑jWri,jh(t)j⎞⎠

\begin{align}
&u_i^{(t)}=\sigma\left(b_i^u \sum_jU_{i,j}^ux_j^{(t)} \sum_jW_{i,j}^uh_j^{(t)}\right)
\\&r_i^{(t)}=\sigma\left(b_i^r \sum_jU_{i,j}^rx_j^{(t)} \sum_jW_{i,j}^rh_j^{(t)}\right)
\end{align}
更新門和復位門忽略了狀態向量s(t)is_i^{(t)}部分。更新門更像是可線性門控任意維度的條件洩漏積分器,因此選擇複製狀態值 (極端為 Sigmoid 值) 或替換成新的“目標狀態”值 (洩漏積分器收斂的值)。復位門控制哪一部分狀態用來計算下一目標狀態,引入過去狀態和未來狀態關係的1個額外的非線性影響。

該情形下可設計更多的變體。比如,多隱含單元間共享復位門 (或遺忘門) 輸出。此外,1個全域性門 (覆蓋整組單元,如1整個層) 和 1個區域性門 (每個單元) 可用於結合全域性控制和區域性控制。然而,LSTM 和 GRU 的結構變體據調查並未在各項任務中完敗原結構。2015 年 Greff 等人 發現關鍵部分為遺忘門,而同年 Jozefowicz 等人發現對 LSTM 的遺忘門新增偏置1,使 LSTM 成為目前最好的結構變體。

11. 長期依賴的優化

優化 RNN 時,許多時間步後梯度會消失或爆炸。

2011 年 Martens 和 Sutskever 提出1階導數消失的同時,2階導數可能也會消失。若2階導數以與1階導數相似的比率縮小,那麼1階和2階導數的比率可能保持為常數。不幸的是,2階方法缺點很多,包括計算損失高,需要1個大的小塊 (minibatch) 及 易受鞍點吸引。他們用2階方法效果很好。2013 年 Sutskever 等人發現簡單的方法 (謹慎初始化的 Nesterov 動量) 可獲得類似的效果。兩種方法被應用於 LSTM 的 SGD (甚至沒有動量) 取代。機器學習領域中,通常設計1個易優化的模型會比設計1個更強大的優化演算法更容易。

(1) 裁剪梯度

1個迴圈網路的強非線性函式經過許多時間步後的梯度幅值會太大或太小,見下圖。目標函式 (引數的函式) 有“懸崖”地形:寬闊平坦的區域被目標函式快速變化的小區域分開,形成1種懸崖。

困難在於當引數梯度非常大時,梯度下降的引數更新會把引數甩出到很遠的區域,該區域的目標函式更大且與逼近當前解沒什麼關係。梯度告訴我們當前引數周圍的無窮小區域內最陡的下降方向。無窮小區域之外的代價函式可能開始曲率上升。更新步必須足夠小以避免穿越過多的上升曲率。典型的學習率緩慢衰減,緩慢到連續步間的學習率近似相同。適用地形相對線性部分的步長通常不合適,且當下一時間步進入地形曲率更大的部分時,會使目標函式值上升運動。

這裡寫圖片描述

上圖的迴圈網路包含兩個引數ww和bb。梯度裁剪使懸崖附近的梯度下降更合理。懸崖常發生在近似線性行為的迴圈網路中。該懸崖在多個時間步後會指數級的陡,因為每個時間步權重矩陣自乘1次。當它開始攀爬懸崖表面時,限制步長使其不會從解附近的陡峭區域推開來。

多年來1個簡單的解決方法常用:裁剪梯度。2012 年 Mikolov 在引數更新前,對1個小塊按元素裁剪引數梯度。2013 年 Pascanu 等人在引數更新前,裁剪梯度gg的模||g||||g||:

if1||g||>v2g←gv||g||

\begin{align}
&if \phantom{1} ||g||>v
\\& \phantom{2} g\leftarrow \frac{gv}{||g||}
\end{align}
其中,vv為模的閾值,gg為更新引數。因為用單個縮放因子聯合地重新歸一化所有引數 (包括不同組的引數,如引數和偏置) 的梯度。Pascanu 的方法保證了每步依然在梯度方向上,但實驗得到的兩種方式效果相似。儘管引數更新 (裁剪梯度的模) 與真實梯度的方向相同,但引數更新向量的模是受限的。該受限的梯度避免了梯度爆炸時有害的步。實際上,當梯度幅值超過閾值時僅隨機走一步的效果也不錯。如果梯度爆炸使得梯度值為 Inf 或 Nan (無窮大或不是數),然後走大小為vv的1個隨機步,將會從數值不穩定的結構中移出來。對每小塊裁剪梯度的模將不會改變每個小塊的梯度方向。然而,對許多小塊的梯度模裁剪後取平均並不等於實際梯度的模 (所有例子形成的梯度)。大的梯度模的例子和同一小塊出現的例子對最後的梯度方向無貢獻。這和傳統的小塊梯度下降 (真實梯度等於所有小塊梯度的平均) 相反。換句話說,傳統的隨機梯度下降為梯度的無偏估計,而模裁剪的梯度下降引入了1個我們經驗上認為有用的啟發式的偏置。用按元素裁剪,更新的方向與真實梯度或小塊梯度並不一致,但它依然是1個下降的方向。 2013 年 Graves 等人提出裁剪隱含單元間反向傳播的梯度,但變體間並未比較,我們推斷這些方法效果相似。

(2) 正則化來促進資訊流

裁剪梯度幫助解決梯度爆炸問題,但未解決梯度消失問題。為弄清梯度消失且更好地捕捉長期依賴,討論在展開的迴圈結構的計算圖中建立路徑,路徑上用弧接近1的梯度相乘。實現的1種方式為用 LSTM 和 其它自迴圈或門控機制。另1種是正則化或約束引數來促進“資訊流”。我們希望梯度向量∇h(t)L\nabla_{h^{(t)}}L反傳時保持它的幅值不變,即使損失函式僅懲罰序列末端的輸出。我們希望:

(∇h(t)L)∂h(t)∂h(t−1)

(\nabla_{h^{(t)}}L)\frac{\partial h^{(t)}}{\partial h^{(t-1)}}

和∇h(t)L\nabla_{h^{(t)}}L一樣大。

對目標函式,2013 年 Pascanu 等人提出如下正則項:

Ω=∑t⎛⎝⎜||(∇(t)hL∂h(t)∂h(t−1))||||∇h(t)L||−1⎞⎠⎟2

\Omega =\sum_t\left(\frac{||(\nabla_h^{(t)}L \frac{\partial h^{(t)}}{\partial h^{(t-1)}})||}{||\nabla h^{(t)}L||}-1\right)^2

計算該正則項的梯度看似困難,但 Pascanu 等人提出近似反傳向量∇h(t)L\nabla h^{(t)}L為常數 (則該正則項不需要反向傳播)。正則項實驗表明,若與模裁剪的啟發式結合,正則項可擴大 RNN 學習到的依賴範圍。因 RNN 的動態特性接近爆炸梯度,梯度裁剪尤為重要。沒有梯度裁剪,梯度爆炸會阻止學習成功。

該方法關鍵的弱點是當資料充足時,它不如 LSTM 那麼有效,如語言建模。

12. 顯式記憶

智慧需要知識,通過學習獲取知識促進了大規模深度結構的發展。然而,知識包含不同的型別。有些知識是隱式的,潛意識的且很難描述的——如如何行走,或狗如何看起來與貓不同。其它知識是顯式的,宣告性的且相對直接組成語句——常識,如“貓是1種動物”,或你需要知道去完成的當前目標這樣具體的事實,如“下午3點141室銷售團隊開會”。

神經網路擅長儲存隱式知識。然而,它們記憶事實困難。隨機梯度下降在輸入的表示儲存進網路引數前,之後輸入甚至不會特別精確地儲存表示,要求相同輸入的很多表示。2014 年 Graves 等人假設因神經網路缺少工作記憶系統,該系統使人類可顯式地保持和操作與實現目標相關的資訊片段。這樣的顯式記憶允許我們的系統快速有意地儲存和恢復具體的事實,且用它們按序推理。可處理1個序列資訊的神經網路的需求,改變了每步放入網路的輸入方式,長期以來使推理能力比輸入的自動直接響應顯得更為重要 (Hinton, 1990)。

為解決該困難,2014 年 Weston 引入通過定址訪問1堆記憶單元的記憶網路。記憶網路剛開始要求監督訊號來指導網路使用記憶單元。2014 年 Graves 等人引入神經圖靈機,在沒有動作指示的顯式監督時,能學習在記憶單元上讀寫任意內容;用基於內容的軟注意機制,允許無監督地端到端訓練 (Bahdanau, 2015)。該軟定址機制成為其它模仿演算法機制 (仍允許梯度優化) 的相關結構的標準。

每個記憶單元可視為 LSTMs 和 GRUs 的記憶單元的擴充套件。不同之處在於網路輸出讀寫記憶單元的內在狀態,正如在數字計算機上讀取或寫入某個具體地址的記憶訪問。

優化函式難以產生準確的整型地址。為緩和該問題,NTMs 同時從許多記憶單元中讀寫。它們對許多單元加權平均來讀取,修改不同數目的單元來寫入。用非0導數的權重通過梯度下降來控制函式訪問要優化的記憶。這些係數的梯度暗示它們是增加還是減少,但梯度僅當接收到很大系數的記憶地址時會很大。

這些記憶單元被增廣成包含1個向量,而非 LSTM 或 GRU 記憶單元儲存的單個標量。此時,會增加訪問記憶單元的成本,為產生許多單元的1個係數付出了計算成本,但我們希望這些係數可聚類一小部分單元。通過讀取1個向量值而非標量值,也抵消了一些成本。用向量值的記憶單元允許基於內容的定址,用來讀寫單元的權重為單元的函式。若能產生匹配部分而非全部元素的模式,向量值單元可恢復出完整的向量值記憶。類似人們基於一些語句來回憶歌詞。1個基於內容的讀指令就像“已有’黃色潛水艇’副歌,恢復這首歌的歌詞”。當物件恢復量很大時 (如果歌詞的每個字母分散儲存在記憶單元中),基於內容的定址更有用。與基於地址的定址相比,1個基於地址的讀指令就像“恢復位置 347 處的歌詞”。當記憶單元很小時,基於位置的定址通常是完全合理的機制。

如果1個記憶單元的內容在大多數時間步被複制 (未被遺忘),那麼前向和反向傳遞的資訊不會消失或爆炸。

這裡寫圖片描述

顯式記憶方法見上圖,1個“任務神經網路”附帶1個記憶。儘管任務神經網路是前向或迴圈的,但整個系統是迴圈網路。任務網路可選擇讀寫具體的記憶地址。顯式記憶可使模型學習到常規 RNN 或 LSTM 學不到的任務,可能因為資訊和梯度能長期傳播。

為通過記憶單元加權平均反傳,解釋記憶定址係數為概率,且每次隨機讀取1個單元 (Zaremba 和 Sutskever, 2015)。離散決策的模型優化要求特定的優化方法。到目前為止,訓練隨機結構來做離散決定依然難於訓練確定結構來做軟決定。

不管是軟的 (允許反傳) 或隨機的或硬的,定址機制和注意力機制形式上相同。手寫體產生中的注意力機制被約束僅在時間序列上前向傳播。機器翻譯中的注意力在與前面步比較後,可移動到另1個完全不同的位置。

硬的應該是指離散決策的隨機結構。

迴圈網路將深度學習擴充套件到序列資料。它們是我們深度學習工具箱中最後1個主要工具。剩下的問題轉向選擇和使用這些工具,應用它們解決現實任務。

13. 後記

小白隨心譯,遺漏部分內容 (感覺不太重要或有些重複~)。最近一些事情弄得各種前途堪憂狀,心情很煩亂,中間進度斷了不少次。所以理解必然可能存在有誤之處,歡迎新老司機帶路~ ︿( ̄︶ ̄)︽( ̄︶ ̄)︿