Sequence to Sequence Learning with Neural Networks論文閱讀

  • 2020 年 3 月 13 日
  • 筆記

論文下載

作者(三位Google大佬)一開始提出DNN的缺點,DNN不能用於將序列映射到序列。此論文以機器翻譯為例,核心模型是長短期記憶神經網路(LSTM),首先通過一個多層的LSTM將輸入的語言序列(下文簡稱源序列)轉化為特定維度的向量,然後另一個深層LSTM將此向量解碼成相應的另一語言序列(下文簡稱目標序列)。我個人理解是,假設要將中文翻譯成法語,那麼首先將中文作為輸入,編碼成英語,然後再將英語解碼成法語。這種模型與基於短語的統計機器翻譯(Static Machine Translation, SMT)相比,在BLUE(Bilingual Evaluation Understudy)演算法的評估下有著更好的性能表現。同時,作者發現,逆轉輸入序列能顯著提升LSTM的性能表現,因為這樣做能在源序列和目標序列之間引入許多短期依賴,使得優化更加容易

1 Introduction

深度神經網路(Deep Nerual Networks)是一種性能強大的模型,在處理各種難題,如語音識別、影像識別上有著近乎完美的表現。這種模型之所以這麼強大,是因為它能在有限的步驟內實現任意並行計算。只要有足夠的訓練數據集,它就能訓練出神經網路的參數,從而DNN能產生很好的效果

雖然DNN有著很強的能力,但只能將源序列和目標序列都編譯為固定維度的向量。這是一個致命的問題,因為很多問題都無法提前預知被表示序列的長度,例如語音識別與機器翻譯

解決問題的思路就是先用一層LSTM讀入源序列,逐步獲得大量維度固定的表示向量,然後用另一層LSTM從向量中提取出目標序列。第二層LSTM本質上是一個語言模型。由於輸入和輸出之間存在相當大的時間延遲,所以使用LSTM對具有長期時間依賴性的數據進行訓練是相當好的選擇

第二段作者介紹了其他人的一些工作,這裡就不多敘述了

從圖中我們可以簡要了解LSTM模型的解決思路,先讀入源序列"ABC",遇到結束符""停止,然後輸出目標序列"WXYZ"。其中有一個小策略,LSTM是反過來讀取輸入語句的,因為這樣做可以引入更多的短期依賴,從而使優化更容易

上面的內容主要意思就是作者和其它各種模型進行了比較,比別人的效果都要好,有一些效果很接近

令人驚訝的是,LSTM訓練很長的句子也沒什麼問題,因為作者顛倒了訓練集和測試集中源序列的單詞順序

LSTM另一個重要特質是它能夠學會將不同長度的句子映射在一個維度固定的向量。常規的翻譯傾向於逐字逐句翻譯,但LSTM傾向於理解句子的含義,因為同樣的句子在不同的語境中的含義有所不同。一項定性評估支援了作者的理論,表明其模型知道單詞順序,並且相對於主動和被動語態均保持不變

2 The model

循環神經網路是一前饋神經網路對於序列的一種自然泛化。即給定一個輸入序列(x_1,…,x_T),RNN可以用通過以下公式迭代得到輸出序列(y_1,…,y_T)
[ begin{align*} h_t&=sigma(W^{hx}x_t+W^{hh}h_{t-1})\ y_t&=W^{yh}h_t end{align*} ]
只要提前知道輸入和輸出序列長度相同,RNN就可以輕鬆地將序列映射到序列。但是,還不清楚如何應用到輸入和輸出序列長度不同且具有複雜和非單調關係的問題

通用的序列學習方法最簡單的策略是使用一個RNN將源序列映射到固定大小的向量,然後是用另一個RNN將該向量映射為目標序列。雖然它原則上是可行的,但由於向RNN提供了所有相關資訊,產生了長期依賴性,因此RNN變得很難訓練。不過,總所周知,LSTM可以學習具有長期時間依賴性的問題,因此LSTM在這種情況下可能會成功

LSTM的目標是估計出條件概率(P(y_1,…,y_{T'}|x_1,…,x_T)),其中((x_1,…,x_T))是輸入序列,((y_1,…,y_T))是相應的輸出序列,並且長度(T)(T')允許不相同。LSTM首先獲得最後一個隱藏狀態給出的固定維度向量(v)。然v用一個標準的LSTM-LM公式計算(y_1,…,y_T)的概率。此方程的最終隱藏狀態是((x_1,…,x_T))表示的(v)
[ P(y_1,…,y_T|x_1,…,x_T)=prod_{t=1}^{T'}P(y_t|v,y_1,…,y_{t-1}) ]
在這個等式中,每個(P(y_t|v,y_1,…,y_{t-1}))分布用辭彙表中所有單詞的softmax表示。同時需要在每個句子的結尾用""來標識,這使得模型能夠定義所有可能長度序列的分布

但作者的實際模型與以上描述有三個方面不同

  1. 使用了兩個不同的LSTM,一個用於輸入序列,一個用於輸出序列。因為這樣能在小刀幾乎可以忽略的計算消耗下增加更多的模型參數
  2. 作者發現深層LSTM的表現顯著優於淺層LSTM,所以最終選用四層LSTM
  3. 顛倒輸入句子的單詞順序非常有用。舉例來說,不是把句子a,b,c映射為句子(alpha,beta,gamma),而是把c,b,a映射為(alpha,beta,gamma)。這樣做使得a非常靠近(alpha),b非常靠近(beta),以此SGD就很容易在輸入和輸出之間"建立通訊",這種簡單的數據轉換大大提高了LSTM的性能

3 Experiments

作者使用兩種方式將它們的方法應用於WMT’14英語→法語的機器翻譯任務中,我們使用它來直接翻譯句子,而不是使用SMT(SMT, Statistical Machine Translation)

3.1 Dataset details

我們將模型訓練在一個由3.48億個法語單詞和3.04億個英語單片語成的1200萬個句子的子集上,這是一個乾淨的精心挑選的子集。之所以選擇此次翻譯的任務和訓練集,是因為它們作為標記化訓練的廣范實用性,並且這些數據都是來自STM baseline中的1000個最佳列表

由於典型的神經網路模型需要將每個單詞轉換為向量表示,所以我們對兩種語言都使用了固定的辭彙。我們對源語言使用了160000個最頻繁出現的單詞,對目標語言使用了80000個最頻繁出現的單詞。每個不在這個辭彙表中的單詞都被特殊標記為"UNK"

3.2 Decoding and Rescoring

我們實驗的核心是在許多句子對上訓練一個大而深的LSTM。通過最大化一個對數概率來訓練這個網路,其中的概率是在給定源句子S上的正確翻譯T
[ frac{1}{|S|}sum_{(T,S)in S}log p(T|S) ]
此處S是訓練集,訓練完成後,根據LSTM找出最可能的翻譯作為結果
[ hat{T}=mathop{argmax}limits_{T} p(T|S) ]

3.3 Reversing the Source Sentences

雖然LSTM能夠解決具有長期依賴關係的問題,但是我們發現,當源語句被反轉(目標語句沒有反轉)時,LSTM的表現更好

雖然我們對這一現象沒有一個完整的解釋,但我們認為這是由於對數據集引入了許多短期依賴關係造成的。通常,當我們把源序列與目標序列鏈接時,原序列中的每個詞語在目標序列中的對應單詞相差很遠。因此,該問題具有"最小時間延遲"的問題。通過顛倒源序列中的單詞,源序列中對應單詞與目標序列中詞語的平均距離不變,但源序列中的最初幾個詞已經非常接近目標序列中的詞了,所以"最小時間延遲"問題就能減小許多。因此,反向傳播能夠更輕鬆地在源序列和目標序列中建立聯繫,並且改善整體的性能表現

這裡的"最小時間延遲",我個人深有體會,不是在NLP領域,而是我自己用LSTM做時間序列預測的時候發現的一個問題,預測值總是比真實值看上去要延遲1到3個單位,整體輪廓是如此的相似,可惜就是橫坐標對不上

作者起初認為逆轉源序列只會對句子的前半部分取得良好的表現,對後半部分的優化會較差。然而實際表現都很好。為什麼有這樣的奇效呢?其實可以這麼理解,當我們將輸入句子倒序後,輸入句子與輸出句子之間的平均距離其實並沒有改變,而在倒序前,輸入與輸出之間的最小距離是很大的,並且每個詞與其對應的翻譯詞的間隔是相同的,而倒序後,前面的詞(與其翻譯詞)之間的間隔變小,後面的詞(與其翻譯詞)間隔變大,但前面間隔小的詞所帶來的性能提升非常大,以至於能夠使得後面的翻譯效果不降反增

3.4 Training details

作者使用了4層的深度LSTMs,每層有1000個單元,1000維的單詞嵌入,輸入辭彙為160000,輸出辭彙為80000。我們發現深層LSTMs明顯優於淺層LSTMs,淺層LSTMs每增加一層,perplexity就減少10%,這可能是因為它們的隱藏狀態更大。完整的訓練詳情如下:

  • 使用(-0.08,0.08)之間的均勻分布初始化所有的LSTM參數
  • 使用無動量的SGD optimization,初始lr=0.7,五個epoch後,每半個epoch將學習率減半。總共使用7.5個epoch訓練模型
  • batchsize=128
  • 雖然LSTM沒有梯度消失的問題,但是可能會發生梯度爆炸,所以使用範數進行約束,對於每個batch,計算(s=|g|_2),其中(g)是梯度除以128,如果(s>5),則設置(g=frac{5g}{s})
  • 不同的句子有不同的長度,大多數句子很短(長度為20-30),但是有一些句子長度又很長(長度大於100),因此由128個隨機選擇的訓練句子組成的minibatch將具有許多短句和很少長句,結果就是minibatch中大部分計算都是白費的。為了解決這個問題,確保在一個minibatch中的所有句子長度大致相同,最終速度提高了2倍

3.5 Parallelization

3.6 Experimental Results

下表是與其他模型在機器翻譯上的效果對比,上面兩行是其他模型的效果,下面六行是作者模型在不同參數設置時的效果

此外,作者還嘗試將自己的模型與傳統的STM系統進行結合,效果顯著,BLEU最好的達到了37.0,超過Baseline System將近4個點

3.7 Performance on long sentences

在長句子上的表現也很好

3.8 Model Analysis

我們模型其中一個吸引力十足的特點就是有能力將一個序列映射為固定維度的向量,上圖就是學習過程的可視化表示。每個短語根據其含義而聚類分布,從中我們可以看出其對單詞的順序非常敏感,而對被動語態替換主動語態則相當不敏感

左圖展示了LSTM的表現與句子長度的函數關係,其中x軸代表相應句子整理後的長度(Test Sentences Sorted By their Length)。對於少數35字的句子,效果沒有下降,只有在最長的句子中有略微的縮減。右圖展示了LSTM的表現與句子中詞語的稀有度之間的關係,其中x軸代表整理後句子的平均詞語頻率(Test Sentences Sorted By Average word Frequency Rank)

這一部分主要是作者講述了目前其他人的一些工作以及成果,有興趣自己閱讀即可

5 Conclusion

在本論文中,我們發現一個基於有限辭彙,具有深層結構的LSTM的性能表現能夠勝過一個基於統計機器翻譯的系統,基於LSTM的機器翻譯的成功說明了它只要在擁有足夠的訓練數據的前提下,同樣能在解決其他問題上發揮出色

我們對逆轉源序列後的性能提升程度感到驚訝。同時我們也推斷出,找到一個問題具有最大數量的短期相關性是非常重要的,因這樣可以簡化問題的解決。我們相信一個標準的RNN在逆轉源序列後能夠更加容易被訓練

個人總結

這篇文章在當年看來可能非常驚艷,但是我讀完這盤文章之後很無感,"不就是兩個LSTM拼接嗎?"。甚至我覺得作者這篇文章的重點在於逆轉源序列進行訓練,因為作者在許多地方都提到了,實在是讓人印象深刻