選自machinelearningmastery
作者:Jason Brownlee
機器之心編譯
參與:Panda
神經機器翻譯已經成為了當前表現最好的機器翻譯方法,這在很大程度上得益于編碼器-解碼器架構的應用。Jason Brownlee 近日發表文章對論文《Massive Exploration of Neural Machine Translation Architectures》的研究成果進行了介紹,給出了為神經機器翻譯配置編碼器-解碼器模型的方法和一些實用的建議。
編碼器-解碼器架構的循環神經網絡在當前的標準機器翻譯基準上實現了最佳的結果,并且也已經在業界的翻譯服務核心得到了應用。
這種模型很簡單,但由于訓練該模型需要大量的數據,為了處理你的問題可能需要在模型中對大量設計決策進行調整,對我們來說這實際上很難辦到。幸好那些研究科學家可以使用谷歌提供那種大規模硬件設備來為我們完成這項工作,這也為我們了解如何為神經機器翻譯以及一般意義上的序列預測任務配置編碼器-解碼器模型提供了一些啟發。
在這篇文章中,你將讀到如何為神經機器翻譯以及其它自然語言處理任務最好地配置編碼器-解碼器循環神經網絡。
在讀完這篇文章之后,你將了解:
谷歌為了隔離編碼器-解碼器模型中每個模型設計決策的影響而對它們進行的研究。
用于詞嵌入、編碼器和解碼器深度以及注意機制的設計決策的結果和建議。
可用于開啟你自己的序列到序列項目的一組基本的模型設計決策。
讓我們開始吧!
用于神經機器翻譯的編碼器-解碼器模型
具有編碼器-解碼器架構的循環神經網絡已經超越了傳統的基于短語的統計機器翻譯系統,實現了當前最佳的結果。
給個證據,谷歌在 2016 年發表了論文《Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation》,參閱機器之心文章《重磅 | 谷歌翻譯整合神經網絡:機器翻譯實現顛覆性突破》;該論文稱谷歌現在已經將這種技術用在了他們的谷歌翻譯服務中。
這種架構面臨著一個問題:模型很大,這反過來又需要非常大的數據集來進行訓練。這可能會導致模型需要耗費數天乃至數周的時間,而且通常也還需要成本高昂的計算資源。因此,在模型的不同設計選擇的影響方面的研究還很少。
Denny Britz 等人在他們 2017 年的論文《Massive Exploration of Neural Machine Translation Architectures》中明確解決了這一問題。在這篇論文中,他們設計了一種用于標準英德翻譯任務的基準模型,并且列出了一組不同的模型設計選擇,然后描述了它們對模型的能力的影響。他們宣稱完整的整套實驗消耗了 250,000 小時的 GPU 計算時間,可以說這是非常了不起的。
我們報告了數百次實驗運行的實驗結果和方差數,相當于在標準的 WMT 英德翻譯任務上 250,000 小時的 GPU 計算時間。我們的實驗能為開發和擴展 NMT 架構提供全新的見解和實用的建議。
在這篇文章中,我們將介紹這篇論文的一些發現,并且我們可以將這些發現用于調節我們自己的神經機器翻譯模型以及廣義上的序列到序列模型。
更多有關編碼器-解碼器架構和注意機制的背景信息可參閱:
編碼器-解碼器長短期記憶網絡:https://goo.gl/b38cb2
長短期記憶循環神經網絡中的注意機制:https://goo.gl/7Z5Wha
基準模型
我們首先介紹一下用作所有實驗的起點的基準模型。
所選擇的基準模型配置應該要在翻譯任務上有足夠好的表現。
嵌入:512 維
RNN 單元:門控循環單元(GRU)
編碼器:雙向
編碼器深度:2 層(每個方向各 1 層)
解碼器深度:2 層
注意:Bahdanau 風格的
優化器:Adam
dropout:在輸入上 dropout 20%
每個實驗都是從基準模型開始的,為了隔離設計決策對模型能力的影響,一次只改變一個元素;在這里所用的評估標準是 BLEU 分數。
用于神經機器翻譯的編碼器-解碼器模型,來自論文《Massive Exploration of Neural Machine Translation Architectures》
嵌入的大小
詞嵌入的作用是表示用于編碼器的詞輸入。
這是一種分布式的表征,其中每個詞都被映射成了一個連續值構成的固定大小的向量。這種方法的優勢在于具有相似含義的不同詞將會具有相似的表征。
這種分布式表征通常是在訓練數據上擬合模型的過程中學習到的。嵌入的大小定義了用于表征詞的向量的長度。一般而言,更大的維數能得到表達能力更好的表征,由此模型的能力也會更好。
有意思的是,結果表明使用了最大嵌入的測試也確實得到了最佳的結果,但整體上增加大小所帶來的增益較小。
(結果表明)2048 維的嵌入得到了整體上最好的結果,但只是更好一點點。即使較小的 128 維嵌入也表現得非常好,同時收斂速度還差不多快了一倍。
建議:從較小的嵌入開始,比如 128,也許之后可以為了較小的能力提升而增大嵌入。
RNN 單元類型
有三種常用的循環神經網絡單元類型:
簡單 RNN
長短期記憶(LSTM)
門控循環單元(GRU)
LSTM 是為解決簡單 RNN 的梯度消失問題而開發的,因為這個問題會限制深度 RNN 的訓練。GRU 則是為簡化 LSTM 而開發的。
結果表明 GRU 和 LSTM 都比簡單 RNN 顯著更優,但一般來說 LSTM 總體上更好。
在我們的實驗中,LSTM 單元的表現一直優于 GRU 單元。
建議:在你的模型中使用 LSTM RNN 單元。
編碼器-解碼器深度
一般而言,更深的網絡會表現得比更淺的網絡更好。
關鍵在于找到網絡深度、模型能力和訓練時間之間的平衡。因為我們訓練非常深度的網絡的資源并不是無限的,所以如果對模型能力的提升不大,就不必那么深。
那篇論文的作者研究了編碼器和解碼器模型的深度以及它們對模型能力的影響。
在編碼器方面,他們發現深度對模型能力的影響并不是很大,更讓人驚訝的是,有一個 1 層的雙向模型比 4 層的雙向模型的表現還稍微好一點。有一個 2 層的雙向編碼器也比測試中其它配置的表現都稍好一些。
我們沒發現任何證據表明超過 2 層的編碼器深度是必要。
建議:使用 1 層的雙向編碼器,然后擴展成 2 層可以讓模型能力得到少量提升。
解碼器方面也有類似的情況。1、2 和 4 層的解碼器的表現差異不大,其中 4 層的表現稍好一些。8 層的解碼器在該測試條件下不能收斂。
在解碼器方面,更深度的模型的表現比更淺的模型稍好一些。
建議:使用 1 層的解碼器作為開始,然后使用 4 層的解碼器得到更好的結果。
編碼器輸入的方向
提供給編碼器的源文本的序列順序可以有多種方式:
前向(或普通方向)
反向
同時前向和反向
該論文比較了多種單向和雙向配置,探索了輸入序列的順序對模型能力的影響。
總體而言,他們證實了之前的發現,即反向序列比前向序列更好,雙向序列又比反向序列稍微好些。
……雙向編碼器一般優于單向編碼器,但超出不多。具有反向源的編碼器總是比對應的非反向源更優。
建議:使用反向順序的輸入序列或采用雙向的方式以在模型能力上得到少量提升。
注意機制
樸素的編碼器-解碼器模型存在一個問題:其編碼器將輸入映射成長度固定的內部表征,編碼器又必須使用這些內部表征來得到整個輸出序列。
注意是針對模型的一種改進,可以讓模型在得到輸出序列中的每個詞時「關注」輸入序列中的不同詞。
該論文調查了簡單注意機制的幾種變體。結果表明使用注意能極大地提升模型的表現。
盡管我們確實能夠預料基于注意的模型的表現會顯著超越沒使用注意機制的模型,但無注意模型的表現之差還是讓人驚訝。
Bahdanau 等人在 2015 年的論文《Neural machine translation BY jointly learning to align and translate》中描述了一種簡單的加權平均式的注意,事實證明這種方法的表現是現在最好的。
建議:使用注意,最好是 Bahdanau 那種加權平均式的注意。
推理
神經機器翻譯系統經常使用波束搜索來采樣模型輸出的序列中詞的概率。
波束的寬度越大,搜索就越詳盡,結果就應該越好。
研究結果表明,適中的 3 到 5 的波束寬度的表現最好,通過使用長度懲罰項(length penalty)只能在上面帶來少許改善。一般而言,作者建議針對具體問題調整波束寬度。
我們發現經過良好調節的波束搜索對實現優良的結果而言是很重要的,其能帶來超過 1 個 BLEU 分數的增益。
建議:從貪婪搜索(波束=1)開始,然后根據你的具體問題進行調節。
最終的模型
該論文將他們的發現總結成了一個單一的「最佳模型」,并且將這個模型與其它表現良好的模型以及當前最佳模型進行了比較。
這個模型的具體配置情況如下表所示,該表取自原論文。當你在為 NLP 應用開發自己的編碼器-解碼器模型時,可以使用這些參數作為開始,這能提供一個相當好或最好的起點。
最終的 NMT 模型配置總結,來自論文《Massive Exploration of Neural Machine Translation Architectures》
該系統的表現非常出色,使用一個更簡單的模型就達到了接近當前最佳的水平——實現當前最佳并不是該論文的目標。
……我們的研究表明經過仔細的超參數調節和優良的初始化,在標準的 WMT 基準上實現當前最佳的表現是可能的。
而且,該論文的作者還在 tf-seq2seq 項目中開源了他們所有的代碼。因為其中兩位作者是谷歌大腦 Residency 項目的成員,所以谷歌研究博客也曾介紹過他們的研究成果,參閱機器之心的引介《資源 | 谷歌官方開源 tf-seq2seq:一種通用編碼器-解碼器框架》。