循環和遞歸神經網絡 (RNN) 與 長短時記憶 (LSTM)

即便不是 NLPer,現實中依然會面對不少序列問題。html

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

1986年 Rumelhart 等人提出循環神經網絡。循環網絡與多層網絡相比,會共享每層的權重,從而可以擴展和應用網絡於不一樣長度的序列案例,以及泛化這些案例。當1片特定的信息能夠在序列中多處出現時,這樣的共享尤其重要。好比,有兩句話:「I went to Nepal in 2009」和「In 2009, I went to Nepal.」若是要求模型提取敘述者哪一年去的 Nepal,無論是輸入句子的第2處仍是第6處,2009 都是應識別的信息片。傳統全鏈接前向網絡對每處輸入的特徵都有單獨的參數,因此要單獨學習輸入句子每一處的全部語法。相比之下,循環網絡在不一樣時間步間共享權重算法

如今不少「神經網絡」的字眼已被「網絡」替換。且後面不會涉及神經元的內容,因此一律用「網絡」。設計模式

相關的想法是1維時間序列間用卷積。卷積方法是延時神經網絡的基礎 (1988~1990)。卷積操做容許網絡在時間軸上共享參數,但爲淺層網絡 (輸出序列的每一個節點輸出爲不少相鄰節點輸入的函數)。每一個時間步上用相同的卷積核。數組

循環網絡以不一樣的方式共享參數。節點輸出爲前面節點輸出的函數,節點的輸出由前面節點輸出用相同的更新規則產生。經過很深的計算圖來共享權重,從而造成循環。網絡

爲簡化描述,RNN 看做對1個包含時間步索引 t (從 1 τ ) 的向量 x(t) 的序列的操做。實際上,循環網絡一般操做小的序列塊 (batch)。這裏簡化表示,剔除塊索引。此外,時間步長的索引僅指序列中的位置,而不必定指現實世界中的時間通道。 RNN 也能夠應用於2維空間數據 (如圖像) 。甚至當數據涉及時間時,若是提供觀察到的整個序列給網絡,那麼網絡可能要有及時回顧過去的鏈接。數據結構

循環表明某變量的過去值對將來值的影響。用循環的計算圖定義循環網絡。機器學習

1. 展開計算圖 (Computational Graph)

計算圖是造成一系列計算結構 (如涉及映射輸入和參數到輸出和損失) 的1種方式。把1個循環/遞歸計算展開爲1個有重複結構 (對應1連串事件) 的圖,從而實現深度網絡結構間的參數共享。svg

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

s(t)=f(s(t1);θ)

其中, s(t) 爲系統的狀態。

上述系統是循環的,由於時刻 t 的狀態 s 的定義回溯到時刻 t1 的狀態 s 的定義。

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

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

展開後的表達式能夠表示爲傳統的 有向非循環計算圖

這裏寫圖片描述

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

s(t)=f(s(t1),x(t);θ)

如今的狀態 s 包含全部過去序列的信息。

循環網絡可用不少不一樣方式搭建。幾乎任何函數均可看做1個前向網絡,本質上任何涉及循環的函數都能看成1個循環網絡 (RNN)

爲代表狀態即爲網絡的隱藏單元,上述方程重寫爲:

h(t)=f(h(t1),x(t);θ)

這裏寫圖片描述

典型的 RNN 增長從狀態 h 讀取信息的輸出層來預測。

當訓練循環網絡來用過去預測將來時,網絡一般學習去用狀態 h(t) 做爲與截止到 t 的過去輸入序列的任務相關方面的有損總結 (lossy summary),由於該總結映射任意長度的序列 (x(t),x(t1),x(t2),...,x(2),x(1)) 到固定長度的向量 h(t) 。取決於訓練要求,該總結可能有選擇地更明確地保持過去序列的某些部分。好比,RNN 用於統計語言建模時,一般給定前面的句子去預測下一個單詞,它可能不必保存截至時間 t 的輸入序列的全部信息,只保存足夠預測剩下語句的信息便可。

畫 RNN 有2種方式。

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

用函數 g(t) 表示 t 時間步後的展開循環:

h(t)=g(t)(x(t),x(t1),x(t2),...,x(2),x(1))=f(h(t1),x(t);θ)

函數 g(t) 的輸入爲整個過去的序列 (x(t),x(t1),x(t2),...,x(2),x(1)) ,輸出爲當前狀態,但展開的循環結構分解 g(t) 爲函數 f 的重複應用。展開有兩種好處:

  • 無論序列長度,學習到的模型的輸入大小相同,由於它被指定從1個狀態轉到另1個狀態,而不是可變長度狀態的歷史。
  • 每一個時間步,參數相同,轉換函數 f 相同。

以上好處使得單個模型 f 能在全部時間步和全部序列長度上操做。學習單個模型能夠泛化到訓練集中未出現的序列長度,參數共享使模型估計用到更少的訓練樣本。

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

2. 循環網絡 (Recurrent Neural Networks)

循環網絡的重要設計模式包括:

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

這裏寫圖片描述

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

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

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

其中, b c 爲偏置, U V W 爲輸入到隱含單元,隱含單元到輸出,隱含單元到隱含單元的鏈接權重。這裏, 輸入序列與輸出序列的長度相同。所有損失爲全部時間步的損失之和。好比,若是給定 x(1),...,x(τ) L(t) y(t) 的負對數似然損失,則
L({x(1),...,x(τ)},{y(1),...,y(τ)})=t=1τL(t)=t=1τlogpmodel(y(t)|{x(1),...,x(τ)})

其中, pmodel(y(t)|{x(1),...,x(τ)}) 爲模型的輸出向量 y^(t) 預測爲 y(t) 的機率。該損失函數的梯度計算費時。見上圖左,梯度計算涉及展開圖上的從左往右的前向傳播,緊隨從右往左的反向傳播。運行時間爲 O(τ) ,因前向傳播圖本質上爲序列,因此不能並行減小時間。先計算前1個時間步才能獲得後面的每一個時間步。前向計算的狀態會被保存直到反向計算時重用,因此內存開銷也爲 O(τ) 應用於代價爲 O(τ) 的展開圖的反向傳播算法被稱爲穿過期間的反向傳播 (BPTT)。隱含單元間的循環網絡所以很強大但訓練困難。

(1) 老師強迫 (Teacher Forcing) 與 輸出循環的網絡

某1時間步的輸出僅循環鏈接到下1時間步的隱含單元的網絡是嚴格弱的,由於它缺乏隱含單元到隱含單元的循環鏈接。好比,它不能模擬1個通用的圖靈機。由於它缺乏隱含層到隱含層間的循環,因此網絡用於預測將來時,輸出單元要求捕捉過去全部的信息。顯式訓練輸出單元來匹配訓練集合的目標不太可能捕獲關於輸入過去歷史的必要信息,除非用戶瞭解系統的所有狀態且把它做爲訓練目標的一部分。

對時間步 t 的預測與其訓練目標比較的任何損失函數來講,消除隱含單元到隱含單元的循環可解耦全部的時間步。單獨計算每一個時間步 t 的梯度可並行訓練,沒必要先算前面時間步的輸出,由於訓練集已提供輸出的完美值。

從輸出到狀態的循環鏈接模型可能用「老師強迫」訓練。訓練時,模型接受真實輸出 y(t) 爲時間步 t+1 的輸入,老師強迫是聽從最大似然標準的過程。檢查兩個時間步的序列,條件最大似然標準爲:

logp(y(1),y(2)|x(1),x(2))=logp(y(2)|y(1),x(1),x(2))+logp(y(1)|x(1),x(2))

本例中,時間步 t=2 時,給定訓練數據中的截至 t x 序列和 y 值,訓練模型來最大化 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)

a. 沿時間步的正向梯度

遞歸地計算每一個節點 N 的梯度損失 NL 。首先:

LL(t)=1

並非 L=L(t) L 爲全部時間步的 L(t) 的和。

假定 softmax 迴歸輸入 o(t) 輸出 y^ ,且損失是真實目標 y(t) 的負對數似然。時間步 t 上輸出的梯度 o(t)L ,對全部的 i,t

(o(t)L)i=LL(t)L(t)y^(t)iy^(t)io(t)i=1×1y^(t)i×y^(t)i×(1y^(t)i)=y^(t)i1

其中, i 爲輸出向量 o(t) 的第 i 個元素。

b. 沿時間步的反向梯度

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

h(τ)L=VToτL

沿時間軸往回迭代 (從 τ1 1 ) 來反向傳播梯度。注意到 h(t) 派生了 o(t) 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)diag(1(h(t+1))2)+VT(o(t)L)

其中, diag(1(h(t+1))2) 爲包含元素 1(h(t+1)i)2 的對角矩陣。這是第 i 個隱含單元在時間步 t+1 的雙曲正切的 Jacobian 矩陣。

h(t+1)=tanh(b+Wh(t)+Ux(t+1))

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

得到計算圖的內部節點的梯度後,可得到參數節點上的梯度。因參數在許多時間步間共享,因此當微積分操做涉及這些參數時必須當心處理。用反向傳播方法獲得計算圖中單個邊 (edge) 的梯度。然而, Wf 考慮 W 對基於計算圖中全部邊的 f 的分佈。爲方便解釋,引入僞變量 W(t) (定義爲 W 在時間步 t 的複製)。用 W(t) 表示時間步 t 的權重分佈的梯度。

{c,V}:o(t)=c+Vh(t)
{b,W,U}:h(t)=tanh(b+Wh(t1)+Ux(t))

這樣,內部參數的梯度爲:

cL=t=1τ(o(t)c)To(t)L=t=1τo(t)LVL=t=1τiLo(t)iVo(t)i=t=1τ(o(t)L)h(t)TbL=t=1τ(h(t)b(t))Th(t)L=t=1τdiag(1(h(t))2)h(t)LWL=t=1τiLh(t)iW(t)h(t)i=t=1τ((h(t)L)Tdiag(1(h(t))2))Th(t1)TUL=t=1τiLh(t)iUh(t)i=t=1τ((h(t)L)Tdiag(1(h(t))2))Tx(t)T

(3) 循環網絡視爲有向圖模型 (Directed Graphical Models)

a. 圖模型參數化

上例的循環網絡的損失 L(t) 爲訓練目標 y(t) o(t) 間的交叉熵。正如1個前向網絡,原則上應使用1個循環網絡中幾乎全部的損失。應選擇基於任務的損失。一般但願視 RNN 的輸出爲1個機率分佈,且與該分佈相關的交叉熵定義爲損失。均方差是1個輸出爲正態分佈的交叉熵。

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

logp(y(t)|x(1),...,x(t))

若該模型包含從1個時間點到另1個時間點輸出的鏈接,有:
logp(y(t)|x(1),...,x(t),y(1),...,y(t1))

當過去的 y 值不影響下1時間步的預測時,有向圖模型不包含從過去的 y(i)(i=1,...,t1) 到當前 y(t) 的邊;不然包含全部這樣的邊。直接參數化該圖模型 (下圖左) 效率低,輸入和參數的數目增加快。RNN 具備相同的全鏈接,且參數化更高效。

這裏寫圖片描述

考慮 RNN 爲1個隨機標量序列 Y={y(1),...,y(τ)} ,無輸入 x ,時間步 t 的輸入僅爲時間步 t1 的輸出 (上圖右)。這樣,RNN 模型定義爲1個關於變量 y 的有向圖模型。用條件機率的鏈式規則參數化 y 的聯合分佈:

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(t1),...,y(1))

t=1 時, P(Y)=P(y(1)) 。所以, {y(1),...,y(τ)} 的負對數似然爲:
L=t=1τL(t)=t=1τlogp(y(t)=y(t)|y(t1),...,y(1))

圖模型的邊代表變量與其它變量直接的依賴關係。刪除節點間相互做用弱的邊可以使許多圖模型的統計與計算更高效。如 Markov 假設 (圖模型應僅包含 {y(tk),...,y(t1)} y(t) 的邊,而非包含全部過去的邊)。然而,全部過去的輸入應對序列的下一個元素有影響。當遙遠過去的某個 y(i) 值對 y(t1) 無影響,但卻對 y(t) 產生影響時,RNN 更有用。

b. 圖模型解釋 RNN

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

視隱含單元 h(t) 爲隨機變量得出 RNN 的機率圖模型結構。機率圖模型中包含隱含單元顯示 RNN 極爲有效地參數化觀測值的聯合分佈。假定用表格表示任意1個離散量的聯合分佈 (每一個元素給出事件發生的機率),若是 y 可取 k 個不一樣值,表格有 O(kτ) 個參數。相比之下,參數共享使 RNN 有 O(1) 個參數 (爲序列長度的函數)。RNN 參數數目可能會被調整來控制模型容量,而沒必要按序列長度擴展。RNN 每一個時間步上循環使用相同的 f θ 圖模型中插入隱含單元 h(t) 節點解耦了過去與將來,爲它們之間的中間量。遙遠過去的某個變量 y(i) 可能經過影響 h 來影響 y(t)

有效參數化後的圖模型難以預測序列中間的丟失值。減小參數數目後循環網絡卻難以優化參數。

循環網絡的權重共享的前提是假設相同的參數可用於不一樣的時間步。給定時間步 t 的變量,時間步 t+1 的變量的條件機率分佈是靜態的,即先後時間步的關係與 t 無關。原則上, t 可用做每一個時間步的額外輸入,從而學習者可以在儘量共享權重的同時發現任何的時變性。這已經強過每一個時間步 t 對應1個條件機率分佈。但出現新的時間步時,仍要推斷網絡新增時間步的時變性。

c. 序列長度

在對模型採樣前,先肯定序列長度:

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

當輸出 y 爲單詞中的字符時,加1個特殊標誌來結束1個序列。特殊字符產生時,採樣過程終止。訓練集中,每一個訓練樣本的 x(τ) 後面添加特殊字符輸入

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

添加序列長度 τ ,用模型來預測 τ 。先採樣 τ ,再採樣 τ 長度的序列樣本。該方法要求在每一個時間步的循環更新處添加額外的輸入,來提示是否接近1個序列的末端。該輸入能夠是序列長度 τ 或者 τt (剩餘的時間步),從而避免 RNN 產生序列結束前忽然終止的可能。強行分解序列的聯合機率分佈:

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

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

任何變量爲 P(y;θ) 的模型均可解釋爲條件分佈爲 P(y|ω) ( ω=θ )的模型。若是 ω 爲輸入 x 的函數,那麼 P(y|x) 能表示與 P(y|ω) 分佈相同的模型。

I. 向量輸入

前面討論過 x(t) 序列 ( t=1,...,τ ) 爲輸入的 RNN。另1種方法,添加單個定長的向量 x (序列的元素) 爲 RNN 的額外輸入。爲 RNN 提供額外輸入的經常使用方法:

  • 做爲每一個時間步的額外輸入
  • 做爲初始狀態 h(0)
  • 二者結合

這裏寫圖片描述

引入權重矩陣 R ,每一個時間步上隱含單元的輸入爲 xTR x 的選擇決定了每一個隱含單元新的偏置 xTR 是否有效。非條件模型 (無輸入 x x(t) ) 的參數 θ 變爲 ω 後仍然保持不變,除了 ω 中的偏置參數如今變爲輸入 x 的函數。

前面討論的輸入爲 {x(1),...,x(τ)} ,如今討論的輸入爲 {xTR,...,xTR}

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

II. 向量序列輸入

RNN 輸入爲向量序列 {x(1),...,x(τ)} 時,假設輸出 y(t) 條件獨立,,則分解爲 (見「圖模型參數化」部分):

P(y(1),...,y(τ)|x(1),...,x(τ))=t=1τP(y(t)|y(t1),...,y(1),x(1),...,x(τ))=t=1τP(y(t)|x(1),...,x(τ))

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

這裏寫圖片描述

3. 雙向 RNN

大標題 (「1., 2., 3. …」) 爲原做者給的,以 RNN 類型來區分;小標題 (「I., II., III. …」) 是我給的,以 實際問題的輸入類型區分。因此,惟獨這裏的小標題的索引會不連貫。

III. 完整向量序列輸入

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

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

這裏寫圖片描述

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

用4個 RNN 可擴展至2維輸入 (如圖像)。每一個 RNN 沿1個方向 (上,下,左和右) 移動。輸入 2D 網格上的每一個點 (i,j) ,當每一個 RNN 的輸入序列足夠長時,輸出 O(i,j) 能捕獲大部分局部信息。與卷積網絡相比,RNN 用於圖像的計算耗時,但可獲得同一特徵圖上特徵間遠程的相互做用。與前者相比,該 RNN 的正向傳播方程改爲用卷積來計算每層自底向上的輸入會更好。

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

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

「向量序列輸入」部分說起的 RNN 是長度爲 τ 的 RNN,即定長 RNN。這裏排除輸入和輸出變爲相同長度的子序列,由於若子序列可完整描述模型輸入,可從新定義 τsub(<τ) ,此時新的 RNN 依然是定長序列的輸入輸出。

IV. 可變向量序列輸入

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

RNN 的輸入常常稱爲「上下文」。上下文 C 爲歸納輸入序列 X=(x(1),...,x(nx)) 的1個向量或序列。

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

這裏寫圖片描述

(1) 編碼-解碼結構

編碼 (encoder/reader/input) RNN 處理輸入序列,輸出上下文 C (一般爲最後隱含狀態的簡單函數)。
解碼 (decoder/writer/output) RNN 輸入單個定長的向量 (見」向量輸入」部分的 x ),輸出語句 Y=(y(1),...,y(ny))

該結構的創新處爲 nxny 可變,而以前所述的結構有約束 nx=ny=τ

編碼 RNN 的最後的狀態 hnx 輸出 C 爲解碼 RNN 的輸入。若是 C 爲向量,解碼 RNN 僅僅是1個向量到序列的 RNN (見」向量輸入」部分)。

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

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

(2) 序列到序列的結構

聯合訓練兩個 RNN 來最大化訓練集中全部 xy 序列對的 logP(y1,...,yny|x1,...,xnx) 均值。

5. 深度循環網絡

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

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

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

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

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

這裏寫圖片描述

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

6. 遞歸網絡 (Recursive Neural Networks)

遞歸網絡是循環網絡的另1種泛化,但計算圖的結構爲1個深層樹,而不是 RNN 的鏈式結構。

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

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

遞歸網絡的變種不少。1997 和 1998 年 Frasconi 等人用數據關聯樹結構,且用輸入和輸出關聯樹的節點。每一個節點的計算沒必要是傳統的人工神經計算 (全部輸入的仿射變換,緊隨1個單調的非線性)。好比,2013 年 Socher 發現建模概念 (連續向量表示) 間的關係時張量操做和雙線性形式有用。

7. 長期依賴的挑戰

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

循環網絡的多個時間步相同函數組合產生了極強的非線性。

循環網絡的組成函數相似矩陣乘法。循環關係可表示爲1個去掉非線性激活函數和輸入 x 的簡單循環網絡:

h(t)=WTh(t1)

循環關係本質上用次方描述,可簡化爲:
h(t)=(Wt)Th(0)

W 可用正交陣 Q 分解爲:
W=QΛQT

則該循環可簡化爲:
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)

特徵值提升爲它的 t 次方後,致使小於1的特徵值衰減至0,大於0的特徵值爆炸。任何h^{(0)}中的非最大特徵值部分都會被丟棄。

循環網絡中該問題尤其明顯。假設權重 ω 爲標量,權重自乘不少次後會根據 ω 的幅值消失或爆炸。然而,對每一個時間步權重 w(t) 不一樣的非循環網絡不成立。若是初始狀態給定爲1,則 t 時刻的狀態爲 tw(t) 。假設 w(t) 從均值爲 0 ,方差爲 v 的分佈 (獨立同分布) 中隨機產生。則該乘積的方差爲 O(vn) 。爲得到理想的方差 v ,選擇每一個時間步的權重爲 v=vn 。所以,當心選擇縮放的很深前向網絡能夠避免梯度消失或爆炸問題。

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

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

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

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

所以,如何設置輸入和循環權重使循環網絡的狀態可以表示1套豐富的輸入歷史。存儲池計算給出的答案爲視循環網絡爲1個動態系統,且設置輸入和循環權重使動態系統接近穩定。

使狀態至狀態的轉換函數的 Jacobian 特徵值接近1。(?) 1個循環網絡的重要特徵是 Jacobians J(t)=s(t)s(t1) 的特徵值譜。 J(t) 的譜半徑定義爲其特徵值絕對值的最大值。

爲理解譜半徑的影響,考慮 t 不變時的 Jacobian 矩陣 J 的反向傳播 (如當網絡純線性時)。假設 J 爲對應特徵 λ 的1個特徵向量 v 。用梯度向量 g 開始,1步反傳後獲得 Jg n 步反傳獲得 J(n)g 。換爲 g 的擾動版本 g+δv 開始反傳, n 步後獲得 J(n)(g+δv) 。因此,從 g+δv 反傳 n 步後多發散 J(n)δv 。若是 v 選爲特徵值爲 λ J 的單位特徵向量, Jacobian 的乘法僅在每步乘以1個常數。兩個反傳的差值爲 δ|λ|(n) v 對應 λ 的最大值時,該擾動獲得的差值最大。

λ>1 時, δ|λ(n)| 指數增大;當 λ<1 時, δ|λ(n)| 指數減少。

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

用重複的矩陣乘法的反傳的一切,一樣適用於1個線性網絡的正向傳播,狀態 h(t+1)=h(t)TW

當線性映射 WT 總按 L2 模縮小 h ,那麼該映射是收縮的,每一個時間步後都會變小一點。所以,當咱們用有限精度來保存狀態向量時,會使網絡容易遺忘歷史信息。

Jacobian 矩陣告訴咱們 h(t) 正向迭代或 h(t+1) 反向迭代時的微小變化。 W J 沒必要爲對稱陣 (實數方陣),因此它們能夠有複數特徵值和特徵向量,虛部對應潛在的震盪行爲 (迭代使用相同的 Jacobian)。儘管 h(t) 或反傳中 ht 的小變化爲實值,但可用複數形式表示。迭代應用 Jacobian 矩陣時,複數絕對值大於1時的特徵值對應指數增加,不然縮小。

帶非線性的 Jacobian 在每一個時間步均可無約束地變化,所以具備更復雜的動態特性。然而,1個起始的小差別,若干時間步後仍然會變爲大差別。 與純線性相比,非線性網絡用諸如 tanh 這樣壓扁的非線性致使循環的動態特性有界。注意到,即便正向傳播的動態特性有界,反向傳播可能會保持動態特性無界。 好比,當 tanh 單元的序列插入純線性網絡的線性區,且用譜半徑大於1的權重矩陣相連。然而,全部 tanh 單元同時爲線性激活點的情況不多見。

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

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

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

處理長期依賴的1種方式爲設計多時間尺度上操做的模型。細粒度時間尺度上操做可處理更多細節,粗粒度時間尺度上操做可更有效將遙遠的歷史信息轉換爲當前信息。因此針對既細又粗的時間尺度來設計策略:其中包含跨時間步跳過鏈接,「泄露單元」累積不一樣時間常數的信號,刪除某些鏈接來創建細粒度時間尺度。

(1) 跨時間步跳過鏈接

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

梯度隨時間步數的增長可能會指數地消失或爆炸。爲緩解該問題, Lin 等人引入 d 個延時進循環鏈接。此時梯度指數消失可當作1個關於 τd (而非 τ ) 的函數。

對1個指數規律衰減的量,幅值變爲其 1e 倍所需的時間 τ 稱爲時間常數2 若是爲 τd ,梯度會消失得更快。因此,應該改成 τd 吧~

因延時和單步鏈接,梯度依然會按 τ 指數地爆炸。因此,儘管該方法不可能很好地表示全部的長期依賴,但可捕獲相對更長的依賴。

(2) 泄漏單元和1個不一樣時間尺度譜

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

累積某值 v(t) (?) 的移動平均 μ(t) :用 μ(t)αμ(t1)+(1α)v(t) 更新, α 爲鏈接 μ(t1) μ(t) 的參數。當 α 接近1時,移動平都可記住過去的信息很長一段時間;當 α 接近0時,過去信息被迅速排除。線性自鏈接的隱含單元相似於移動平均,被稱爲泄露單元

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

用泄漏單元設置時間常數有兩種基本策略。一種爲手動固定值,好比,初始時刻從某分佈中採樣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)i ,具備1個與泄漏單元類似的線性自循環。但遺忘門 (forget gate) 單元 f(t)i (時間步 t 的單元 i ) 用1個 Sigmoid 單元設置權重至 0 ~ 1 之間,來控制自循環的權重 (或相關時間常數):

f(t)i=σbfi+jUfi,jx(t)j+jWfi,jh(t1)j

其中, x(t) 爲當前輸入向量。 h(t) 爲當前隱含單元向量,包含全部 LSTM 單元的輸出。且 bf,Uf,Wf 分別爲遺忘門的偏置,輸入權重和循環權重。

用條件自循環權重 f(t)i LSTM 單元的內部狀態。

s(t)i=f(t)is(t1)i+g(t)iσbi+jUi,jx(t)j+jWi,jh(t1)j

其中, b,U,W 分別爲LSTM 單元的偏置,輸入權重和循環權重。 外部輸入門 (external input gate) 單元 g(t)i 與遺忘門單元計算相似,但有本身的參數:
g(t)i=σbgi+jUgi,jx(t)j+jWgi,jh(t1)j

輸出門 (output gate) 單元 q(t)i 可關閉 LSTM 單元的輸出 h(t)i
q(t)i=σboi+jUoi,jx(t)j+jWoi,jh(t1)jh(t)i=tanh(s(t)i)q(t)i

其中,參數 bo,Uo,Wo 分別爲輸出門的偏置,輸入權重和循環權重。LSTM 的變種中,選擇把單元狀態 s(t)i 送入第 i 個單元的3個門做爲額外的輸入 (帶權重)。

有上標 f 的參數屬於遺忘門,有上標 g 的參數屬於外部輸入門,有上標 o 的參數屬於輸出門。

與簡單的循環結構相比,LSTM 網絡在測試長期依賴能力的合成數據集和挑戰性任務處理任務上可學習到更長期的依賴。

(2) 其它門控 RNN

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

近期門控 RNN 上的工做,網絡單元爲門控循環單元或 GRUs。與 LSTM 不一樣之處爲僅有1個門單元同時控制遺忘因子和決定是否更新狀態單元。更新方程以下:

h(t)i=u(t1)ih(t1)i+(1u(t1)i)σbi+jUi,jx(t1)j+jWi,jr(t1)jh(t1)j

其中, u 爲更新門, r 爲復位門。它們的值定義爲:
u(t)i=σbui+jUui,jx(t)j+jWui,jh(t)jr(t)i=σbri+jUri,jx(t)j+jWri,jh(t)j

更新門和復位門忽略了狀態向量 s(t)i 部分。更新門更像是可線性門控任意維度的條件泄漏積分器,所以選擇複製狀態值 (極端爲 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種懸崖。

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

這裏寫圖片描述

上圖的循環網絡包含兩個參數 w b 。梯度裁剪使懸崖附近的梯度降低更合理。懸崖常發生在近似線性行爲的循環網絡中。該懸崖在多個時間步後會指數級的陡,由於每一個時間步權重矩陣自乘1次。當它開始攀爬懸崖表面時,限制步長使其不會從解附近的陡峭區域推開來。

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

if||g||>vggv||g||

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

(2) 正則化來促進信息流

裁剪梯度幫助解決梯度爆炸問題,但未解決梯度消失問題。爲弄清梯度消失且更好地捕捉長期依賴,討論在展開的循環結構的計算圖中建立路徑,路徑上用弧接近1的梯度相乘。實現的1種方式爲用 LSTM 和 其它自循環或門控機制。另1種是正則化或約束參數來促進「信息流」。咱們但願梯度向量 h(t)L 反傳時保持它的幅值不變,即便損失函數僅懲罰序列末端的輸出。咱們但願:

(h(t)L)h(t)h(t1)

h(t)L
相關文章
相關標籤/搜索