翻譯:@胡楊([email protected]) && @胥可([email protected])
校對調整:寒小陽 && 龍心塵
時間:2016年7月
出處:http://blog.csdn.net/han_xiaoyang/article/details/51932536
說明:本文爲斯坦福大學CS224d課程的中文版內容筆記,已得到斯坦福大學課程@Richard Socher教授的授權翻譯與發表
1.語言模型
語言模型用於對特定序列的一系列詞彙的出現概率進行計算。一個長度爲
公式1在語音識別和機器翻譯系統中對判定一組詞序列是否爲相應輸入序列的正確生成結果有着極爲重要的作用。在一個給定的機器翻譯系統中,針對各個短語或句子的翻譯任務,軟件通常被要求生成一組替代詞序列(例如:“我已經”;“我曾有”;“我有”;“被我已經”;“被我佔有”)以及它們的得分以判定它們是否能組成最優的翻譯序列。
在機器翻譯任務中,模型通過計量和比較各個替換輸出詞序列之間的得分優劣,從它們中爲輸入短語尋找最佳的答案詞序列。爲了完成這項工作,模型需要經常在詞排序和詞選擇兩個任務模型之間切換。而上面提到的目標將通過爲所有的候選詞序列設置概率計算函數而達成,這個函數將比較這些候選詞序列各自的得分。獲得最高得分的候選詞序列就是機器翻譯任務的輸出。例如:相比例句“小的這隻貓真是”,機器會給例句“這隻貓真小”更高的評分,相比“放學後步行去房子”,“放學後步行回家”會得到更高的得分。爲了計算這些概率,將比較統計n元語言模型和詞頻模型的效果。比如,如果選擇2元語言模型,語義2元組的詞頻通過統計當前詞和其前面一個詞,這就需要與1元語法模型的詞頻計算方法區分開來。公式2和3分別展示了2元語義模型和3元語義模型在處理這種關係時的做法。
公式3中表現出來的關係集中於基於上下文中固定窗口內容(例如:
然而,在所有傳統的語言模型中,由於包含
圖1
2.遞歸神經網絡(RNN)
不同於傳統的機器翻譯模型僅僅考慮有限的前綴詞彙信息作爲語義模型的條件項,遞歸神經網絡(RNN)有能力將語料集中的全部前序詞彙納入模型的考慮範圍。
圖2展示了RNN模型的架構,其中各個垂直矩形框代表每輪迭代的隱層,
圖2
網絡中各個參數的設置細節及含義如下:
x1,…,xt−1,xt,xt+1,…,xT :表示擁有T 數量詞彙的語料中各個詞彙對應的詞向量。ht=σ(W(hh)ht−1+W(hx)xt) :每一輪迭代t 中用於計算隱層輸出特徵的傳遞邊
—xt∈ℝd :在時刻t 的輸入詞向量。
—Whx∈ℝDh×d :利用輸入詞向量xt 作爲條件計算得到的權重矩陣
—Whh∈ℝDh×Dh :利用前一輪迭代的輸出作爲條件計算得到的權重矩陣
—ht−1∈ℝDh :在前一輪迭代t−1 中非線性函數的輸出結果。並且h0∈ℝDh 爲當迭代輪次爲t=0 時的初始化隱層輸出向量。
—σ() :爲非線性分類函數(這裏使用sigmoid分類函數)ŷ t=softmax(W(S)ht) :每一輪迭代t 針對全部詞彙的輸出概率分佈。基本上,ŷ t 就是當前迭代時,給定文檔全部前序文本權值以及觀測詞向量x(t) 後預測得到的後續詞。在這裏,W(S)∈ℝ|V|×Dh 和ŷ ∈ℝ|V| 中的變量|V| 代表全體語料的詞典規模。
在遞歸神經網絡中,損失函數通常被設定爲之前提到的交叉熵錯誤率。公式7展示了在迭代
在規模爲
圖3
公式9用於表示困惑度關係;它的計算基於2的指數,指數值爲公式8中顯示的交叉熵錯誤率函數負對數。困惑度用於衡量在進行序列後續詞預測時考慮更多條件項對低值函數的擾亂程度(相較於真實結果來說)
執行一層RNN網絡所需要的內存與語料中的詞彙數量成正比。例如,一個擁有k個詞的句子將在內存中佔用k個詞向量的空間。另外,RNN網絡將維護兩對
圖4是一些出版物中對RNNs神經網絡模型的另外一種表示。它將RNN神經網絡的每個隱層表示爲一個環。
圖4
2.1 剃度彌散及梯度爆炸問題
從依次進行的步驟中得到循環神經網絡中的傳播權值矩陣,RNN模型確保了實現的目標是通過多次迭代步長來傳播內容信息的。通過以下的兩個例句可以更深入的理解:
句1:“簡走進了房間。約翰也走近了房間。簡對___說你好”
句2:“簡走進了房間。約翰也走近了房間。因爲天色太晚了,人們在工作了一天後都回家了。簡對___說你好”
上面的兩個例子中,依據上下文,在空白處大部分都知道答案爲“約翰”。第二個人在上下文中出現的相對詞距對RNN模型中預測下一個詞爲“約翰”是非常重要的。通過我們對RNNs的瞭解,理論上該部分需要被給出。然而實驗證明,RNNs模型中句1空白部分的預測準確率要比句2的高。這是因爲在後向傳播階段,梯度貢獻值在初期的步長傳播中逐步遞減。因此對於長句,隨着內容越長識別“約翰”爲空白處詞的概率越低。以後我們將討論梯度遞減問題背後的數學推理。
在某輪迭代
通過對公式5、6的結果進行鏈式規則求導而得到每一個迭代步長的錯誤率。式11展示了對應的求導過程。
式12展示了每次計算
由於
聯立公式10、11和12,得到如下所示:
公式15爲式13的Jacobian矩陣範數。其中,
利用
當
在實驗過程中,一旦梯度值增長很大,就會很容易探測到其引起的溢出(如:無窮與非數值);這就是梯度爆炸問題。然而,當梯度值接近於零時。對於語料集中詞距較遠的詞,它將大大降低模型的學習質量並且梯度還會不斷衰減;這就是剃度彌散問題。
如果想要獲取梯度消失問題的實際問題,你可以訪問下面的實例網站。
2.2 解決梯度爆炸和彌散
上文介紹瞭解了一些在深度神經網絡中的梯度彌散和梯度爆炸的情況,我們現在開始嘗試用一些啓發性的手段解決這些問題。
爲了解決梯度爆炸問題,Thomas Mikolov首先提出了一個簡單的啓發性的解決方案,就是當梯度大於一定閾值的的時候,將它截斷爲一個較小的數。具體如算法1所述:
算法1:當梯度爆炸時截斷梯度(僞代碼)
if
圖5可視化了梯度截斷的效果。它展示了一個小的rnn(其中W爲權值矩陣,b爲bias項)的決策面。這個模型是一個一小段時間的rnn單元組成;實心箭頭表明每步梯度下降的訓練過程。當梯度下降過程中,模型的目標函數取得了較高的誤差時,梯度將被送到遠離決策面的位置。截斷模型產生了一個虛線,它將誤差梯度拉回到離原始梯度接近的位置。
圖5:梯度爆炸,梯度截斷可視化
爲了解決梯度彌散的問題,我們介紹了兩種方法。第一種方法是將隨機初始化
2.3 深度雙向RNNs
如之前所說,在一個詞序列中我們利用RNNs技術和過去的詞來預測下一個詞。其實同理我們也可以依據未來的詞來做預測。Irsoy等人設計了一個雙向深度神經網絡,在每一個時間節點t,這個網絡有兩層神經元,一層從左向右傳播,另一層從右向左傳播。爲了保證任何時刻t都有兩層隱層,這個網絡需要消耗兩倍的存儲量來存儲權重和偏置等參數。最終的分類結果
圖6:一個雙向RNN模型
圖7展示了一個從較低層傳播到下一層的多層雙向RNN。如圖所示,在網絡結構中,第t個時間裏每一箇中間神經元接受到前一個時間(同樣的RNN層)傳遞過來的一組參數,以及之前RNN層傳遞過來的兩組參數。這兩組參數一個是從左到右的RNN輸入,另一個是從右到左的RNN輸入。
圖7:一個深度雙向3層的RNN
爲了構建一個L層的RNN,上述的關係將會參照公式20和公式21所修改,其中每一箇中間神經元(第i層)的輸入是RNN網絡中同樣的t時刻第i-1層的輸出。其中輸出
2.4 應用:RNN翻譯模型
傳統的翻譯模型十分複雜,他們由許多的應用在語言翻譯流程的不同階段的機器學習算法組成。在這一章,我們討論RNNs代替傳統機器翻譯模塊的潛在應用。考慮如圖8所示的RNN例子。這裏,德語Echt dicke Kiste被翻譯爲英語中的Awesome sauce。首先3個時刻的隱層網絡將德語編碼爲一些語言的特徵(
圖8:一個RNN翻譯模型。首先3個RNN隱層屬於資源語言模型編碼器,最後兩個屬於目標語言模型解碼器。
採用交叉熵函數的RNN模型(如公式26所示)在翻譯結果上有很高的精度。在實踐中,利用一些擴展方法到模型上可以提高翻譯的準確率。
擴展1:編碼器和解碼器訓練不同的RNN權重。這個將使得兩個單元解耦,同時兩個RNN模塊都會有更高的準確率。這意味着公式23和公式24的
擴展2:使用3個不同的輸入來計算編碼過程中每一個隱層狀態:
• 之前的隱層狀態(標準)
• 上一個編碼器的隱層(圖9中,
• 之前預測的輸出詞,
圖9:帶有3個解碼神經元的輸入
結合上述3種輸入將公式24中的解碼階段的f函數變爲公式27中的1個。圖9展示了這個模型。
擴展3:如之前章節所討論的那,使用多個RNN層來訓練深層循環神經網絡。因爲深層次能學習到更多東西,因此往往能提升預測的準確率,當然,這也意味着必須使用大的語料庫來訓練模型。
擴展4:如這一章之前提到的那樣,訓練雙向編碼器來提高精度。
擴展5:給一個德語中的詞序列ABC,在英語中翻譯爲XY,我們這裏使用CBA->XY而不是ABC->XY來訓練RNN。這麼做的目的是,因爲A最有可能被翻譯爲X,再加上考慮之前提到的梯度彌散的問題,翻轉輸入詞的順序能夠減少輸出階段的誤差比例。
3 門限循環單元(Gated Recurrent Units)
除了上述討論的那些擴展方法,我們還可以使用更復雜的激活單元來提升RNNs的性能。到目前爲止,我們介紹了使用了放射變換和逐點非線性,使得隱層狀態從
GRU的4個基本運算狀態如上述公式所述。通過上面的公式可以對整個模型有個清晰的認識(如圖10)。
新記憶產生:一個新的記憶
h̃ t 是由過去的隱含狀態ht−1 和新的輸入xt 共同得到的。也就是說,這個階段能夠對新觀察到的信息(詞)和歷史的隱層狀態ht−1 進行合理合併,根據語境向量h̃ t 總結這個新詞以何種狀態融合。重置門:重置信號
rt 會判定ht−1 對結果h̃ t 的重要程度。如果ht−1 和新的記憶的計算不相關,那麼重置門能夠完全消除過去的隱層信息(狀態)。更新門:更新信號
zt 會決定以多大程度將ht−1 向下一個狀態傳遞。比如,如果zt≈1 ,則ht−1 幾乎完全傳遞給ht 。相反的,如果zt≈0 ,新的h̃ t 前向傳遞給下一層隱層。隱層狀態:使用過去隱層輸入
ht−1 最終產生了隱層狀態ht 。新的記憶會根據更新門的判定區產生h̃ t 。
圖10:GRU詳細結構圖
需要注意的是,訓練GRU時,我們需要學習不同的參數,W, U,
4 長短期記憶神經網絡LSTM
長短期記憶是另外一種和GRUs不同的複雜的激活單元。它的作用是GRUs相似,但是在單元的結構上有一些不一樣。在深入介紹LSTM設計之前,首先讓我們來看一看它的數學方程。
圖11:LSTM詳細結構圖
我們來按照下面的步驟理解LSTM結構以及它背後的意義:
新記憶產生:這個狀態和GRUs中的新記憶產生狀態是一樣的。我們必須使用輸入詞
xt 和過去隱層狀態ht−1 來產生新的記憶c̃ t ,包括了新詞x(t) .輸入門:在產生新記憶之前,我們需要判定一下我們當前看到的新詞到底重不重要,這就是輸入門的作用。輸入門根據輸入詞和過去隱層狀態共同判定輸入值是否值得保留,從而判定它以何種程度參與生成新的記憶(或者說對新的記憶做一個約束)。因此,它可以作爲輸入信息更新的一個指標。
遺忘門:這個門和輸入門很類似。但是它不能決定輸入詞有效,它能對過去記憶單元是否對當前記憶單元的計算有用做出評估。
最終記憶產生:這個階段會根據遺忘門的作用結果,合理地忘記部分過去的記憶
ct−1 。再根據輸入門it 的作用結果,產生新記憶c̃ t 。它將這兩個結果加融合起來產生了最終的記憶ct 。輸出門:這是一個GRUs裏沒有顯性存在的門。它的目的是從隱層狀態分離最終的記憶。最終記憶
ct 包含了大量不必需要保存在隱層狀態的信息,這個門限能夠評估關於記憶ct 哪部分需要顯示在隱層狀態ht 中。用於評估這部分信息的中間信號叫做ot ,它和tanh(ct) 的點乘組成最後的ht 。