深度學習與自然語言處理(7)_斯坦福cs224d 語言模型,RNN,LSTM與GRU

翻譯:@胡楊([email protected]) && @胥可([email protected])
校對調整:寒小陽 && 龍心塵
時間:2016年7月
出處:http://blog.csdn.net/han_xiaoyang/article/details/51932536

說明:本文爲斯坦福大學CS224d課程的中文版內容筆記,已得到斯坦福大學課程@Richard Socher教授的授權翻譯與發表

1.語言模型

語言模型用於對特定序列的一系列詞彙的出現概率進行計算。一個長度爲m 的詞彙序列{w1,,wm} 的聯合概率被表示爲P(w1,,wm) 。由於在得到具體的詞彙之前我們會先知道詞彙的數量,詞彙wi 的屬性變化會根據其在輸入文檔中的位置而定,而聯合概率P(w1,,wm) 的計算通常只考慮包含n 個前綴詞的詞窗口而非考慮全部的前綴詞:

P(w1,,wm)=i=1i=mP(wi|w1,,wi1)i=1i=mP(wi|wi(n1),,wi1)(1)

公式1在語音識別和機器翻譯系統中對判定一組詞序列是否爲相應輸入序列的正確生成結果有着極爲重要的作用。在一個給定的機器翻譯系統中,針對各個短語或句子的翻譯任務,軟件通常被要求生成一組替代詞序列(例如:“我已經”;“我曾有”;“我有”;“被我已經”;“被我佔有”)以及它們的得分以判定它們是否能組成最優的翻譯序列。

在機器翻譯任務中,模型通過計量和比較各個替換輸出詞序列之間的得分優劣,從它們中爲輸入短語尋找最佳的答案詞序列。爲了完成這項工作,模型需要經常在詞排序和詞選擇兩個任務模型之間切換。而上面提到的目標將通過爲所有的候選詞序列設置概率計算函數而達成,這個函數將比較這些候選詞序列各自的得分。獲得最高得分的候選詞序列就是機器翻譯任務的輸出。例如:相比例句“小的這隻貓真是”,機器會給例句“這隻貓真小”更高的評分,相比“放學後步行去房子”“放學後步行回家”會得到更高的得分。爲了計算這些概率,將比較統計n元語言模型和詞頻模型的效果。比如,如果選擇2元語言模型,語義2元組的詞頻通過統計當前詞和其前面一個詞,這就需要與1元語法模型的詞頻計算方法區分開來。公式2和3分別展示了2元語義模型和3元語義模型在處理這種關係時的做法。

p(w2|w1)=count(w1,w2)count(w1)(2)

p(w3|w1,w2)=count(w1,w2,w3)count(w1,w2)(3)

公式3中表現出來的關係集中於基於上下文中固定窗口內容(例如:n 個前綴詞範圍)對後續詞的預測。在某些情況下,僅僅抽取n 個前綴詞作爲窗口範圍可能不足以很好地捕捉上下文信息。例如,當一篇文章在後段着重描寫西班牙與法國的歷史,而在前文中,當你讀到“這兩個國家走向了戰爭”這句話時,僅有此句的前文顯然不能夠讓我們識別出這兩個國家的命名實體。Bengio等人提出了第一個大規模的深度學習自然語言處理框架,此框架能夠通過學習得到詞彙的分佈化表徵捕捉上面提到的這種上下文關係;圖1展示了這種神經網絡的框架。在這個模型中,輸入詞向量在隱層和輸出層均得到使用。公式4展示了引入標準tanh()函數的softmax()分類函數中的各個參數,這個函數起到線性分類器的作用,W(3)x+b(3) ,這一組短式代表全體前綴詞的輸入詞向量。

ŷ =softmax(W(2)tanh(W(1)x+b(1))+W(3)x+b(3))(4)

然而,在所有傳統的語言模型中,由於包含n 長窗口的語言記憶信息規模會隨着系統的運行呈指數式的增長,所以面對較大型的詞窗口,如果不將記憶信息單獨抽離處理,上面的任務幾乎是不可能完成的。


圖1

2.遞歸神經網絡(RNN)

不同於傳統的機器翻譯模型僅僅考慮有限的前綴詞彙信息作爲語義模型的條件項,遞歸神經網絡(RNN)有能力將語料集中的全部前序詞彙納入模型的考慮範圍。
圖2展示了RNN模型的架構,其中各個垂直矩形框代表每輪迭代的隱層,t. 每個這樣的隱層都擁有若干神經元,每個神經元都對輸入向量執行線性矩陣操作而通過非線性操作輸出結果(例如,tanh()函數)。在每一輪迭代中,前一步迭代的輸出隨着文檔中下一條詞彙的詞向量而變化,xt ,是隱層的輸入且隱層將產生預測輸出值ŷ  和提供給下一層隱層的輸出特徵向量ht (見公式5和公式6)。單獨每個神經元的輸入和輸出情況如圖3所示。



圖2

ht=σ(W(hh)ht1+W(hx)x[t])(5)

ŷ t=softmax(W(S)ht)(6)

網絡中各個參數的設置細節及含義如下:
  • x1,,xt1,xt,xt+1,,xT :表示擁有T 數量詞彙的語料中各個詞彙對應的詞向量。
  • ht=σ(W(hh)ht1+W(hx)xt) :每一輪迭代t 中用於計算隱層輸出特徵的傳遞邊
    xtd :在時刻t 的輸入詞向量。
    WhxDh×d :利用輸入詞向量xt 作爲條件計算得到的權重矩陣
    WhhDh×Dh :利用前一輪迭代的輸出作爲條件計算得到的權重矩陣
    ht1Dh :在前一輪迭代t1 中非線性函數的輸出結果。並且h0Dh 爲當迭代輪次爲t=0 時的初始化隱層輸出向量。
    σ() :爲非線性分類函數(這裏使用sigmoid分類函數)
  • ŷ t=softmax(W(S)ht) :每一輪迭代t 針對全部詞彙的輸出概率分佈。基本上,ŷ t 就是當前迭代時,給定文檔全部前序文本權值以及觀測詞向量x(t) 後預測得到的後續詞。在這裏,W(S)|V|×Dhŷ |V| 中的變量|V| 代表全體語料的詞典規模。

在遞歸神經網絡中,損失函數通常被設定爲之前提到的交叉熵錯誤率。公式7展示了在迭代t 中此函數在整個詞庫上的求和。

J(t)(θ)=j=1|V|yt,j×log(ŷ t,j)(7)

在規模爲T 的語料集上,交叉熵錯誤率計算如下:
J=1Tt=1TJ(t)(θ)=1Tt=1Tj=1|V|yt,j×log(ŷ t,j)(8)



圖3

公式9用於表示困惑度關係;它的計算基於2的指數,指數值爲公式8中顯示的交叉熵錯誤率函數負對數。困惑度用於衡量在進行序列後續詞預測時考慮更多條件項對低值函數的擾亂程度(相較於真實結果來說)

Preplexity=2J(9)

執行一層RNN網絡所需要的內存與語料中的詞彙數量成正比。例如,一個擁有k個詞的句子將在內存中佔用k個詞向量的空間。另外,RNN網絡將維護兩對Wb 矩陣。儘管矩陣W 的規模可能非常大,但其大小不會隨着語料的規模而變化(不同於傳統的模型)。對一個迭代1000 輪的RNN網絡,W 將是個1000×1000 的矩陣而和語料規模無關。
圖4是一些出版物中對RNNs神經網絡模型的另外一種表示。它將RNN神經網絡的每個隱層表示爲一個環。



圖4

2.1 剃度彌散及梯度爆炸問題

從依次進行的步驟中得到循環神經網絡中的傳播權值矩陣,RNN模型確保了實現的目標是通過多次迭代步長來傳播內容信息的。通過以下的兩個例句可以更深入的理解:

句1:“簡走進了房間。約翰也走近了房間。簡對___說你好”

句2:“簡走進了房間。約翰也走近了房間。因爲天色太晚了,人們在工作了一天後都回家了。簡對___說你好”

上面的兩個例子中,依據上下文,在空白處大部分都知道答案爲“約翰”。第二個人在上下文中出現的相對詞距對RNN模型中預測下一個詞爲“約翰”是非常重要的。通過我們對RNNs的瞭解,理論上該部分需要被給出。然而實驗證明,RNNs模型中句1空白部分的預測準確率要比句2的高。這是因爲在後向傳播階段,梯度貢獻值在初期的步長傳播中逐步遞減。因此對於長句,隨着內容越長識別“約翰”爲空白處詞的概率越低。以後我們將討論梯度遞減問題背後的數學推理。
在某輪迭代t 中考慮公式5、6,用於計算RNN錯誤率dE/dW ,我們對每一步迭代計算錯誤率總和。那麼每一步t 的錯誤率dEt/dW 均可通過前面所列的計算出來。

EW=t=1TEtW(10)

通過對公式5、6的結果進行鏈式規則求導而得到每一個迭代步長的錯誤率。式11展示了對應的求導過程。dht/dhk 爲對之前k 次迭代的偏導數。
EtW=k=1tEtytythththkhkW(11)

式12展示了每次計算dht/dhk 的關聯關係;它是在[k,t] 時間段內對所有潛在層的鏈式規則求導。
hthk=j=k+1thjhj1=j=k+1tWT×diag[f(jj1)](12)

由於hDn ,故對於h ,Jacobian矩陣中的hj/hj1 爲:
hjhj1=[hjhj1,1hjhj1,Dn]=hj,1hj1,1hj,Dnhj1,1hj,1hj1,Dnhj,Dnhj1,Dn(13)

聯立公式10、11和12,得到如下所示:
EW=t=1Tk=1tEtytytht(j=k+1thjhj1)hkW(14)

公式15爲式13的Jacobian矩陣範數。其中,βWβh 爲兩個矩陣範數的上邊界。依據公式15來計算每次迭代t 中的部分梯度範數。
hjhj1WTdiag[f(hj1)]βWβh(15)

利用L2 -範數來對以上兩個矩陣進行範數計算。對於給定的sigmoid非線性函數,範數f(hj1) 的值只能是1。
hthk=j=k+1thjhj1(βWβh)tk(16)

tk 足夠大且βWβh 比1小或比1大時,指數(βWβh)tk 很容易爲較小或較大的值。由於詞距較遠的交叉熵誤差通過tk 來評估。當梯度消失時,在迭代t 中詞距較遠的詞對於預測下一個詞的貢獻度將會逐漸下降。
在實驗過程中,一旦梯度值增長很大,就會很容易探測到其引起的溢出(如:無窮與非數值);這就是梯度爆炸問題。然而,當梯度值接近於零時。對於語料集中詞距較遠的詞,它將大大降低模型的學習質量並且梯度還會不斷衰減;這就是剃度彌散問題。
如果想要獲取梯度消失問題的實際問題,你可以訪問下面的實例網站

2.2 解決梯度爆炸和彌散

上文介紹瞭解了一些在深度神經網絡中的梯度彌散和梯度爆炸的情況,我們現在開始嘗試用一些啓發性的手段解決這些問題。

爲了解決梯度爆炸問題,Thomas Mikolov首先提出了一個簡單的啓發性的解決方案,就是當梯度大於一定閾值的的時候,將它截斷爲一個較小的數。具體如算法1所述:

算法1:當梯度爆炸時截斷梯度(僞代碼)


ĝ EW

if ĝ threshold then

ĝ threasholdĝ ĝ 


圖5可視化了梯度截斷的效果。它展示了一個小的rnn(其中W爲權值矩陣,b爲bias項)的決策面。這個模型是一個一小段時間的rnn單元組成;實心箭頭表明每步梯度下降的訓練過程。當梯度下降過程中,模型的目標函數取得了較高的誤差時,梯度將被送到遠離決策面的位置。截斷模型產生了一個虛線,它將誤差梯度拉回到離原始梯度接近的位置。


1.png
圖5:梯度爆炸,梯度截斷可視化

爲了解決梯度彌散的問題,我們介紹了兩種方法。第一種方法是將隨機初始化W(hh) 改爲一個有關聯的矩陣初始化。第二種方法是使用ReLU(Rectified Linear Units)代替sigmoid函數。ReLU的導數不是0就是1.因此,神經元的梯度將始終爲1,而不會當梯度傳播了一定時間之後變小。

2.3 深度雙向RNNs

如之前所說,在一個詞序列中我們利用RNNs技術和過去的詞來預測下一個詞。其實同理我們也可以依據未來的詞來做預測。Irsoy等人設計了一個雙向深度神經網絡,在每一個時間節點t,這個網絡有兩層神經元,一層從左向右傳播,另一層從右向左傳播。爲了保證任何時刻t都有兩層隱層,這個網絡需要消耗兩倍的存儲量來存儲權重和偏置等參數。最終的分類結果ŷ t 是由兩層RNN隱層組合來產生最終的結果。圖6展示了雙向網絡結構,公式17和18表示雙向RNN隱層的數學含義。在這兩個關係中唯一不同點是循環的方向不一樣。公式19展示了通過總結過去和未來詞的表示,使用類別的關係來預測下一個詞預測。


2.png
圖6:一個雙向RNN模型

h⃗ t=f(W⃗ xt+V⃗ h⃗ t1+b⃗ )(17)
ht=f(Wxt+Vht+1+b)(18)
ŷ t=g(Uht+c)=g(U[h⃗ t;ht]+c)(19)

圖7展示了一個從較低層傳播到下一層的多層雙向RNN。如圖所示,在網絡結構中,第t個時間裏每一箇中間神經元接受到前一個時間(同樣的RNN層)傳遞過來的一組參數,以及之前RNN層傳遞過來的兩組參數。這兩組參數一個是從左到右的RNN輸入,另一個是從右到左的RNN輸入。


3.png
圖7:一個深度雙向3層的RNN

爲了構建一個L層的RNN,上述的關係將會參照公式20和公式21所修改,其中每一箇中間神經元(第i層)的輸入是RNN網絡中同樣的t時刻第i-1層的輸出。其中輸出ŷ  ,在每一個時刻值爲通過所有隱層的輸入參數傳播的結果(如公式22所示)。

h⃗ (i)t=f(W⃗ (i)h(i1)t+V⃗ (i)h⃗ (i)t1+b⃗ (i))(20)
h(i)t=f(W(i)h(i1)t+V(i)h(i)t+1+b(i))(21)
ŷ t=g(Uht+c)=g(U[h⃗ (L)t;h(L)t]+c)(22)

2.4 應用:RNN翻譯模型

傳統的翻譯模型十分複雜,他們由許多的應用在語言翻譯流程的不同階段的機器學習算法組成。在這一章,我們討論RNNs代替傳統機器翻譯模塊的潛在應用。考慮如圖8所示的RNN例子。這裏,德語Echt dicke Kiste被翻譯爲英語中的Awesome sauce。首先3個時刻的隱層網絡將德語編碼爲一些語言的特徵(h3 )。最後兩個時刻將h3 解碼爲英語作爲輸出。公式23展示了編碼階段,公式24和公式25展示瞭解碼階段。


4.png
圖8:一個RNN翻譯模型。首先3個RNN隱層屬於資源語言模型編碼器,最後兩個屬於目標語言模型解碼器。

ht=ϕ(ht1,xt)=f(W(hh)ht1+W(hx)xt)(23)
ht=ϕ(ht1)=f(W(hh)ht1)(24)

yt=softmax(W(s)ht)(25)

採用交叉熵函數的RNN模型(如公式26所示)在翻譯結果上有很高的精度。在實踐中,利用一些擴展方法到模型上可以提高翻譯的準確率。

maxθ1Nn=1N×log(pθ(y(n)|x(n)))(26)

擴展1:編碼器和解碼器訓練不同的RNN權重。這個將使得兩個單元解耦,同時兩個RNN模塊都會有更高的準確率。這意味着公式23和公式24的ϕ() 函數有不同的W(hh) 矩陣。

擴展2:使用3個不同的輸入來計算編碼過程中每一個隱層狀態:

• 之前的隱層狀態(標準)

• 上一個編碼器的隱層(圖9中,c=hT )

• 之前預測的輸出詞,ŷ t1


5.png
圖9:帶有3個解碼神經元的輸入(ht1,c,yt1) 的語言模型

結合上述3種輸入將公式24中的解碼階段的f函數變爲公式27中的1個。圖9展示了這個模型。

ht=ϕ(ht1,c,yt1)(27)

擴展3:如之前章節所討論的那,使用多個RNN層來訓練深層循環神經網絡。因爲深層次能學習到更多東西,因此往往能提升預測的準確率,當然,這也意味着必須使用大的語料庫來訓練模型。

擴展4:如這一章之前提到的那樣,訓練雙向編碼器來提高精度。

擴展5:給一個德語中的詞序列ABC,在英語中翻譯爲XY,我們這裏使用CBA->XY而不是ABC->XY來訓練RNN。這麼做的目的是,因爲A最有可能被翻譯爲X,再加上考慮之前提到的梯度彌散的問題,翻轉輸入詞的順序能夠減少輸出階段的誤差比例。

3 門限循環單元(Gated Recurrent Units)

除了上述討論的那些擴展方法,我們還可以使用更復雜的激活單元來提升RNNs的性能。到目前爲止,我們介紹了使用了放射變換和逐點非線性,使得隱層狀態從ht1ht 。在這一節中,我們將討論修改RNN的結構,使用門限激活函數的用法。我們知道雖然RNNs能夠理論上支持很長的序列,但是訓練這個網絡十分的困難。門限循環單元可以使得RNNs擁有更多持久的記憶從而可以支持更長的序列。接下來我們會分析GRU使用ht1xt 來產生下一個隱層狀態ht 。我們將深入理解這個結構背後的意義。

zt=σ(W(z)xt+U(z)ht1)(Update gate)

rt=σ(W(r)xt+U(r)ht1)(Reset gate)

h̃ t=tanh(rtUht1+Wxt)(New memory)

ht=(1zt)h̃ t+ztht1(Hidden state)

GRU的4個基本運算狀態如上述公式所述。通過上面的公式可以對整個模型有個清晰的認識(如圖10)。

  1. 新記憶產生:一個新的記憶 h̃ t 是由過去的隱含狀態ht1 和新的輸入xt 共同得到的。也就是說,這個階段能夠對新觀察到的信息(詞)和歷史的隱層狀態ht1 進行合理合併,根據語境向量h̃ t 總結這個新詞以何種狀態融合。

  2. 重置門:重置信號rt 會判定ht1 對結果h̃ t 的重要程度。如果ht1 和新的記憶的計算不相關,那麼重置門能夠完全消除過去的隱層信息(狀態)。

  3. 更新門:更新信號zt 會決定以多大程度將ht1 向下一個狀態傳遞。比如,如果zt1 ,則ht1 幾乎完全傳遞給ht 。相反的,如果zt0 ,新的h̃ t 前向傳遞給下一層隱層。

  4. 隱層狀態:使用過去隱層輸入ht1 最終產生了隱層狀態ht 。新的記憶會根據更新門的判定區產生h̃ t


6.png
圖10:GRU詳細結構圖

需要注意的是,訓練GRU時,我們需要學習不同的參數,W, U, W(r) , U(r) , W(z) , U(z) 。我們在上文看到,他們遵循同樣的後向傳播過程。

4 長短期記憶神經網絡LSTM

長短期記憶是另外一種和GRUs不同的複雜的激活單元。它的作用是GRUs相似,但是在單元的結構上有一些不一樣。在深入介紹LSTM設計之前,首先讓我們來看一看它的數學方程。

it=σ(W(i)xt+U(i)ht1)(Input gate)

ft=σ(W(f)xt+U(f)ht1)(Forget gate)

ot=σ(W(o)xt+U(o)ht1)(Output/Exposure gate)

c̃ t=tanh(W(c)xt+U(c)ht1)(New memory cell)

ct=ftct1+itc̃ t(Final memory cell)

ht=ottanh(ct)


7.png
圖11:LSTM詳細結構圖

我們來按照下面的步驟理解LSTM結構以及它背後的意義:

  1. 新記憶產生:這個狀態和GRUs中的新記憶產生狀態是一樣的。我們必須使用輸入詞xt 和過去隱層狀態ht1 來產生新的記憶c̃ t ,包括了新詞x(t) .

  2. 輸入門:在產生新記憶之前,我們需要判定一下我們當前看到的新詞到底重不重要,這就是輸入門的作用。輸入門根據輸入詞和過去隱層狀態共同判定輸入值是否值得保留,從而判定它以何種程度參與生成新的記憶(或者說對新的記憶做一個約束)。因此,它可以作爲輸入信息更新的一個指標。

  3. 遺忘門:這個門和輸入門很類似。但是它不能決定輸入詞有效,它能對過去記憶單元是否對當前記憶單元的計算有用做出評估。

  4. 最終記憶產生:這個階段會根據遺忘門的作用結果,合理地忘記部分過去的記憶ct1 。再根據輸入門it 的作用結果,產生新記憶c̃ t 。它將這兩個結果加融合起來產生了最終的記憶ct

  5. 輸出門:這是一個GRUs裏沒有顯性存在的門。它的目的是從隱層狀態分離最終的記憶。最終記憶ct 包含了大量不必需要保存在隱層狀態的信息,這個門限能夠評估關於記憶ct 哪部分需要顯示在隱層狀態ht 中。用於評估這部分信息的中間信號叫做ot ,它和tanh(ct) 的點乘組成最後的ht

發佈了121 篇原創文章 · 獲贊 2015 · 訪問量 299萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章