當前位置:
首頁 > 科技 > 萬字「全文」詳解谷歌神經網路機器翻譯NMT

萬字「全文」詳解谷歌神經網路機器翻譯NMT

GIF/1.7M

圖:pixabay

原文來源:Google Research Blog、GitHub

作者:Thang Luong、Eugene Brevdo、Rui Zhao

「機器人圈」編譯:BaymaxZ、嗯~阿童木呀、多啦A亮

機器翻譯作為自動翻譯語言之間的任務,是機器學習社區中最活躍的研究領域之一。在機器翻譯的眾多方法中,序列到序列(「seq2seq」)模型最近取得了巨大的成功,並已成為大多數商業翻譯系統中的標準。然而,雖然seq2seq模型(如OpenNMT或tf-seq2seq)上有大量的材料,但是缺乏教學人員知識和技能的材料,可以輕鬆構建高質量的翻譯系統。

近日,TensorFlow在GitHub上宣布一個新的神經機器翻譯(NMT)教程,讓讀者能夠充分了解seq2seq模型,並展示如何從零開始構建翻譯模型。

?簡介

?基礎

oNMT背景知識

o安裝教程

o訓練 – 如何構建首個NMT系統

?降維

?編碼

?解碼

?損失

?梯度計算和優化

o實踐——讓我們來訓練NMT模型l

o推理——如何生成翻譯

?中級

o注意力機制背景知識

o注意力包裝器 API

o實踐——建立基於注意力的NMT模型

?提示和技巧

o建立訓練、評估和推理圖

o數據輸入流水線

o其他細節

?雙向循環神經網路

?集束搜索

?超參數

?多GPU訓練

?測試基準

oIWSLT 英語到越南語

oWMT 德文到英文

oWMT 英文到德文 — 完全比較

?其他資源

?聲明

?參考

簡介

序列到序列(seq2seq)模型在諸如機器翻譯、語音識別和文本概括等各項任務中,取得了巨大的成功。本教程為讀者提供了對seq2seq模型的全面介紹,並展示了如何從頭構建一個seq2seq模型。我們專註於神經機器翻譯(NMT)的任務,這是第一個成功的seq2seq模型的測試平台。包含的代碼是輕量級的、高質量的、生產就緒的,並與最新的研究思想結合在一起。我們通過以下方式實現此目標:

1.使用最新的解碼器/注意力包裝器API,TensorFlow 1.2數據迭代器;

2.結合了我們在建立循環和seq2seq模型方面的專長;

3.提供提示和技巧,以構建最好的NMT模型,並複製Google的NMT(GNMT)系統;

我們認為重要的是,提供人們可以輕鬆複製的基準。因此,我們提供了完整的實驗結果,並對以下公開數據集的模型進行了預先訓練:

1.小規模:由IWSLT評估組織提供的平行語料庫,包含TED談話中的英語到越南語的133000個句子對;

2.大規模:WMT評估組織提供的德語到英語的平行語料庫(450萬個句子對);

我們首先介紹關於NMT的seq2seq模型的一些基本知識,說明如何構建並訓練vanilla NMT模型。第二部分將詳細介紹建立一個高效的NMT模式的注意力機制。然後,我們將討論提示和技巧,以構建最佳的NMT模型(包括速度和翻譯質量),例如TensorFlow最佳實踐(批處理、降級),雙向RNN和集束搜索。

基礎

?NMT背景知識

回到過去,傳統的基於短語的翻譯系統將源語句分解成多個組,然後逐句翻譯。這導致翻譯產品不一致性,而且翻譯的水平跟人類相比差異很大。人類通讀整個源句,理解它的含義,然後再翻譯。而神經機器翻譯(NMT)正是這麼模擬的!

圖1.編碼器-解碼器架構。NMT一般方法的示例。編碼器將源句子轉換成通過解碼器傳遞以生成翻譯的「含義」向量。

具體來說,首先,NMT系統使用編碼器,讀取源語句,以構建「思想」向量,表示句子意義的數字序列;然後,解碼器處理句子向量,以發出翻譯,如圖1所示。這通常被稱為編碼器-解碼器架構。以這種方式,NMT解決了傳統的、基於短語的方法中的本地翻譯問題:它可以捕獲語言的長期依賴性,例如語法結構等等,併產生更流暢的翻譯。

NMT模型因具體結構而有所不同。順序數據的自然選擇是大多數NMT模型使用的循環神經網路(RNN)。通常,RNN用於編碼器和解碼器。然而,RNN模型在以下方面會不同:(a)方向性——單向或雙向; (b)深度——單層或多層;(c)類型——通常是vanilla RNN、長短期記憶網路(LSTM)或門控循環單元(GRU)。有興趣的讀者可以在這篇博文上找到有關RNN和LSTM的更多信息。

在本教程中,我們將一個深度多層RNN視為單向,並將LSTM作為循環單元。我們在圖2中展示了一個模型的例子。在這個例子中,我們建立一個模型,將源句子「我是一個學生」翻譯成一個目標句子「Je suisétudiant」。NMT模型由兩個循環神經網路組成:編碼器RNN簡單地處理輸入源句子,而不進行任何預測;另一方面,解碼器在預測下一個單詞的同時,處理目標句子。

有關更多信息,請參閱本教程的作者Luong於2016年撰寫的文章。

圖2.神經機器翻譯將源語句「我是一名學生」翻譯成一個目標句子「Je suisétudiant」,展示一個深度循環架構。這裡,「」表示解碼處理的開始,而「」告訴解碼器停止。

安裝教程

要安裝本教程,你需要在系統上安裝TensorFlow。本教程需要安裝最新版本的TensorFlow(版本1.2.1)。要安裝TensorFlow,請按照安裝說明進行操作。

一旦安裝了TensorFlow,你便可以通過運行以下方式,下載本教程的源代碼:

git clone https://github.com/tensorflow/nmt/

訓練-如何構建你的第一個NMT系統

我們先來看看,構建一個具體代碼片段的NMT模型的核心,我們將更詳細的解釋圖2。數據準備和完整的代碼將稍後介紹。這部分可參考文件model.py。

在底層,編碼器和解碼器RNN作為輸入接收以下內容:首先,源語句,然後指示從編碼到解碼模式的轉換的邊界標記「」和目標句子。對於訓練,我們將為系統提供以下張量,包含單詞索引:

encoder_inputs [max_encoder_time,batch_size]:源輸入字。

decode_inputs [max_decoder_time,batch_size]:目標輸入字。

decode_outputs [max_decoder_time,batch_size]:目標輸出字,這些是decode_inputs向左移動一個時間段,右邊附加一個句末尾標記。

為了提高效率,我們一次訓練多個句子(batch_size)。測試略有不同,所以我們稍後再討論一下。

降維

考慮到詞語的分類性質,模型必須首先查找源和目標降維,以檢索相應的詞表示。為了使降維層可以工作,首先要為每種語言選擇一個辭彙表。通常,選擇辭彙大小V,並且只有最頻繁的V被視為唯一的。所有其他單詞都轉換為「未知」令牌,並且都獲得相同的降維。通常,降維權重在訓練期間學習,每種語言一套。

同樣,我們可以構建embedding_decoder和decode_emb_inp。請注意,可以選擇使用預訓練的單詞表示(如word2vec或Glove向量)初始化降維權重。一般來說,考慮到大量的訓練數據,我們可以用scratch來學習這些降維。

編碼器

一旦檢索到,則將詞語降維作為輸入饋送到主網路中,該主網路由兩個多層RNN組成——源語言的編碼器以及用於目標語言的解碼器。這兩個RNN原則上可以共享相同的權重; 然而,在實踐中,我們經常使用兩種不同的RNN參數(這些模型在擬合大型訓練數據集時做得更好)。編碼器RNN使用零向量作為其起始狀態,建立過程如下:

請注意,句子具有不同的長度,以避免浪費計算,我們通過source_seqence_length告訴dynamic_rnn確切的源句長度。由於我們的輸入是基於時間的,我們設置time_major = True。 在這裡,我們只構建一個單層LSTM,encoder_cell。我們將介紹如何構建多層LSTM,添加dropout,並在後面的部分中使用注意力。

解碼

解碼器還需要訪問源信息,一個簡單的方法就是用編碼器的最後一個隱藏狀態(encode_state)來初始化它。在圖2中,我們將源代碼「學生」的隱藏狀態傳遞到解碼器端。

這裡,這個代碼的核心部分是BasicDecoder的對象,解碼器,它接收decode_cell(類似於encoder_cell),一個幫助器,和作為輸入的encoder_state。通過分離解碼器和幫助器,我們可以重用不同的代碼庫,例如,可以用GreedyEmbeddingHelper替代TrainingHelper進行貪婪解碼。了解更多請查閱helper.py。

最後,我們還沒有提到projection_layer,它是一個密集矩陣,將頂部隱藏狀態轉換為維度V的對數向量。我們在圖2的最上面說明這一過程。

損失

鑒於上述情況,我們現在可以計算我們的訓練損失:

這裡,target_weights是與decode_outputs相同大小的零矩陣。它掩蓋了值為0的目標序列長度之外的填充位置。

重要的注意事項:值得指出的是,我們用batch_size來劃分損失,所以我們的超參數對batch_size是「不變的」。有些人將損失除以(batch_size * num_time_steps),它可以減少短句所造成的錯誤。更巧妙的是,我們的超參數(以前的方式應用)不能用於後一種方式。例如,如果兩種方法都使用學習1.0的SGD(隨機梯度下降),則後一種方法有效地使用了更小的1 / num_time_steps的學習速率。

梯度計算和優化

我們現在已經定義了我們的NMT的前進模式。計算反向傳播傳遞只是幾行代碼的問題:

訓練RNN的重要步驟之一是梯度剪切。在這裡,我們按照規範剪輯。最大值max_gradient_norm通常設置為5或1的值。最後一步是選擇優化器。Adam優化器是常見的選擇,我們也選擇學習率,學習率的值通常在0.0001到0.001之間;隨著訓練的進行,可以減少。

在我們自己的實驗中,我們使用標準SGD(tf.train.GradientDescentOptimizer),具有降低的學習率調度,從而產生更好的性能。 參見基準。

實踐——讓我們來訓練NMT模型

我們訓練我們的第一個NMT模型,從越南語翻譯成英語! 我們的代碼的入口是nmt.py。

我們將使用一個小型平行語言的TED談話(133000個訓練示例)來進行此練習。我們在這裡使用的所有數據都可以在以下網址找到:https://nlp.stanford.edu/projects/nmt/。我們將使用tst2012作為我們的dev數據集,tst2013作為測試數據集。

運行以下命令下載培訓NMT模型的數據:

nmt/scripts/download_iwslt15.sh /tmp/nmt_data

運行以下命令開始訓練:

上述命令在12個周期內,訓練了一個具有128個隱藏單元和降維的2層LSTM seq2seq模型。 我們使用的dropout值為0.2(保持概率為0.8)。如果沒有錯誤的話,我們應該在我們訓練時看到類似於下面的日誌。

查看train.py獲取更多信息

我們可以在訓練期間啟動Tensorboard查看對模型的總結:

tensorboard --port 22222 --logdir /tmp/nmt_model/

從英語和越南語訓練反向翻譯可以簡單地實現:

--src=en --tgt=vi

推理——如何生成翻譯

當你訓練你的NMT模型(一旦你擁有訓練模型),你可以獲得以前不可見的源語句的翻譯。而這個過程就稱為推理。訓練和推理(測試)之間有明確的區別:在推理時,我們只能訪問源語句,即編碼器輸入,而執行解碼的方法有很多種。解碼方法包括貪婪演算法、採樣和波束搜索解碼。在這裡,我們將討論貪婪解碼策略。

這個想法很簡單,我們將圖3中進行闡述:

1.我們依然使用與訓練期間相同的方式對源語句進行編碼從而獲得encoder_state,並使用該encoder_state來初始化解碼器。

2.一旦解碼器接收到起始符號"" (參見我們代碼中的tgt_sos_id),解碼(翻譯)過程就開始了。

3.對於解碼器端的每個時間步長,我們將RNN的輸出視為一組邏輯。我們選擇最可能的單詞,id與最大邏輯值相關聯,將其作為發出的單詞(這就是「貪婪」行為)。例如在圖3中,在第一解碼步驟中,單詞「moi」具有最高的翻譯概率。然後,我們將這個詞作為輸入提供給下一個時間步長。

4.該過程將一直繼續,直到生成句尾標記"" 作為輸出符號產生(參見我們代碼中的tgt_eos_id)。

圖3.貪婪解碼——訓練好的NMT模型如何使用貪婪搜索生成源語句「Je suisétudiant」的翻譯。

第3步,是什麼使推理與訓練如此不同。推理使用的是模型預測的單詞,而並非總是將正確的目標單詞作為輸入,以下是實現貪婪解碼的代碼。它與訓練解碼器非常相似。

在這裡,我們使用的是GreedyEmbeddingHelper而不是TrainingHelper。由於我們預先不知道目標序列長度,所以我們使用maximum_iterations來限制翻譯的長度。思路是將源句長度的兩倍作為解碼最大長度。

訓練了一個模型後,我們現在可以創建一個推理文件並翻譯一些句子:

注意,即使模型仍在訓練中,但只要存在訓練檢查點,就可以運行上述命令。有關詳細信息,請參閱inference.py。

中級

既然已經知曉最基本的seq2seq模型,那就來進一步完善!為了建立最先進的神經機器翻譯系統,我們將需要更多的「秘密武器」:注意力機制,這是Bahdanau等人於2015年首次提出的,然後由Luong等人於2015年完善。注意力機制的關鍵在於,在翻譯過程中通過對相關源文件內容進行「注意」,從而建立起目標文件與源文件之間的直接連接。注意力機制的一個很好的附加作用就是源句和目標句之間有個可便捷查看的對齊矩陣(如圖4所示)。

圖4.注意力可視化——源句和目標句之間的對齊示例。圖像摘自(Bahdanau 等人在2015年發表的論文)。

請記住,在vanilla seq2seq模型中,當開始解碼過程時,我們將最後的源狀態從編碼器傳遞到解碼器中。這對於較短和中等長度的句子來說效果很好;但是,對於長句,單個固定大小的隱藏狀態就成了信息瓶頸。注意力機制不是放棄在源RNN中計算的所有隱藏狀態,而是提供了允許解碼器窺視它們的方法(將它們視為源信息的動態存儲器)。通過這樣做,注意力機制改進了較長句子的翻譯效果。現如今,注意力機制是一種流行的標準,並已經成功應用於許多其他任務中(包括圖像字幕生成,語音識別和文本自動摘要)。

注意力機制的背景

我們現在在描述Luong等人在2015提出的注意力機制的一個實例,它已被用於包括像OpenNMT這樣的開源工具包在內的多個最先進的系統,以及本教程中的TF seq2seq API中。我們還將提供與注意力機制其他變體的連接。

圖5.注意力機制——(Luong等人於2015所著論文)中描述的基於注意力的NMT系統的示例。我們詳細介紹了注意力計算的第一步。為了清晰起見,我們不在圖(2)中顯示降維和投影層。

如圖5所示,注意力計算髮生在每個解碼器的時間步長中。它包括以下階段:

1.將當前目標隱藏狀態與所有源狀態進行比較,以獲得注意力權重(如圖4所示)。

2.基於注意力權重,我們計算上下午矢量作為源狀態的加權平均值。

3.將上下文矢量與當前目標隱藏狀態相結合,產生最終的注意力向量。

4.注意向量作為輸入饋送到下一個時間步長(輸入饋送)。前三個步驟可以通過以下等式來總結:

在這裡,函數score用於將目標隱藏狀態$$h_t$$ 與每個源隱藏狀態$$overline_s$$進行比較,並將結果歸一化以產生注意權重(源位置的分布)。評分函數有多種選擇;通用的評分函數包括方程式中(4)給出的乘法和加法形式。一旦計算,注意力矢量 $$a_t$$ 用於導出softmax logit和loss。這類似於vanilla seq2seq模型中頂層的目標隱藏狀態。函數f也可以採取其他形式。

注意力機制的各種實現可以在attention_wrapper.py中找到。

?注意力機制中有什麼是重要的?

如上述方程式所示,有許多不同的注意事項。這些變體取決於評分函數和注意力函數的形式,以及在評分函數中是否使用的是先前的狀態$$h_$$, 而不是Bahdanau等人在2015年提出的的 $$h_t$$。根據經驗來說,我們發現只有某些選擇是很重要的。首先,注意力的基本形式,即目標和來源之間的直接關係。其次,將注意力向量向下饋送到下一個時間步長,以便通知網路關於過去的注意決定,正如Luong等人在2015年論文中所演示的那樣。最後,評分函數的選擇往往會導致不同的表現。參見基準測試結果部分。

注意力包裝器 API

在執行注意力包裝器時,我們借鑒了(本論文)在內存網路方面的一些術語。本教程中介紹的注意力機制是只讀內存,而不是具有可讀寫的內存。具體來說,引用一組源隱藏狀態(或其轉換版本,例如,Luong評分方式中的$$Woverline_s$$或者Bahong評分方式中的 $$W_2overline_s$$)來作為「記憶」。在每個時間步長中,我們使用當前目標隱藏狀態作為「查詢」來決定要讀取內存的哪個部分。通常,查詢需要與對應於各個內存插槽的keys進行比較。在上述注意力機制的介紹中,我們恰好將源隱藏狀態(或其轉換版本,例如Bahdanau評分風格中的$$W_1h_t$$ )用作「keys」。這是一個可以從這種記憶網路術語中得到啟發,以獲得其他形式的注意的機制!

得益於注意力包裝器,延長我們的vanilla seq2seq代碼的注意力就變得微不足道了。這部分可參考文件attention_model.py

首先,我們需要定義注意力機制,例如(Luong等人在2015所著論文中那樣):

在以前的編碼器部分中,encoder_outputs是頂層所有源隱藏狀態的集合,其形狀為[max_time,batch_size,num_units](因為我們將dynamic_rnn與time_major設置為True以達到高效的效果)。對於注意力機制來說,我們需要確保傳遞的「記憶」是批處理的,所以我們需要轉置attention_states。我們將source_sequence_length傳遞給注意力機制,以確保注意權重正確歸一化(僅在非填充位置上)。

定義了注意力機制後,我們使用AttentionWrapper來包裝解碼單元格:

代碼中的其餘部分與Section Decoder中的代碼幾乎相同!

動手實踐——建立以注意力為基礎的NMT模型

為了確保能夠維持注意力,我們需要使用

luong

,

scaled_luong

,

bahdanau

normed_bahdanau

中的一個作為訓練期間的attention標誌的值。該標誌指定了我們將要使用的注意力機制。此外,我們需要為注意力模型創建一個新的目錄,所以我們不用重複使用以前訓練過的基本NMT模型。

運行以下命令從而開始訓練:

訓練後,我們可以使用相同的具有新的model_dir的推理命令,進行推理:

提示與技巧

?建立訓練、評估和推理圖形

在TensorFlow中構建機器學習模型時,最好建立三個獨立的圖形:

?訓練圖,其中:

批處理、降級操作和可能的子樣本從一組文件/外部輸入中輸入數據。

包括正向和反向操作。

構建優化器,並添加訓練操作。

?評估圖,其中:

從一組文件/外部輸入中輸入數據進行批處理和降級操作。

包括正向訓練操作和不用於訓練的其他評估操作。

?推理圖,其中:

可能不會批量輸入數據。

不會對數據進行子採樣或者降級處理。

從佔位符讀取輸入數據(數據可以通過feed_dict或C ++ TensorFlow服務二進位文檔直接提供給圖表)。

包括模型正向操作的一個子集,以及可能的用於存儲session.run調用之間狀態的附加特殊輸入/輸出。

構建單獨的圖表有幾個好處:

?推理圖通常與其他兩個不同,因此分開構建是有意義的。

?評估圖變得更簡單,因為它不再具有所有額外的反向運算。

?可以為每個圖分別實現數據饋送。

?可變重用簡單得多。例如,在評估圖中,不需要重新打開具有reuse = True的可變範圍,因為訓練模型已經創建了這些變數。因此,相同的代碼可以重用,而無需在任何地方都使用reuse = arguments。

?在分布式訓練中,工作人員分別進行訓練,評估和推理是很平常的。這些都需要建立自己的圖形。因此,以這種方式構建系統將為你進行分布式訓練做好準備。

複雜性的主要來源在於如何在單個機器設置中的三個圖表中共享變數。這通過在每個圖形中使用單獨的會話來解決。訓練會話定期保存檢查點,並且評估會話,並推斷會話會從檢查點中恢復參數。下面的例子顯示了兩種方法的主要區別。

之前:三個模型在單個圖表中共享單個會話

之後:三個模型在三個圖表中,三個會話共享相同的變數

請注意後一種方法如何「準備」轉換為分布式版本。

新方法的另一個區別在於,我們使用有狀態的迭代器對象,而不是使用feed_dicts來在每個session.run調用(從而執行我們自己的批處理、降級和操作數據)中提供數據。這些迭代器使輸入流水線在單機和分布式設置中都容易得多。我們將在下一節中介紹新的輸入數據流水線(在TensorFlow 1.2中介紹)。

數據輸入流水線

在TensorFlow 1.2之前,用戶有兩種方式將數據提供給TensorFlow訓練和評估流水線:

1.直接通過feed_dict使用每個訓練session.run讀取數據。

第一種方法對於不熟悉TensorFlow的用戶來說更容易,或者只需要在Python中完成非同步輸入修改(即自己的小型排隊)即可。第二和第三種方法更加標準,但靈活性稍差一些,他們還需要啟動多個python線程(隊列運行器)。此外,如果使用不正確的隊列可能會導致死鎖或不透明的錯誤消息。然而,隊列比使用feed_dict更有效,並且是單機和分布式訓練的標準。

可以從批量數據Tensor,文件名或包含多個文件名的Tensor創建數據集。例如:

所有數據集可以通過輸入過程進行相似的處理。這包括讀取和清理數據、降級(在訓練和評估的情況下)、過濾和批處理。

要將每個句子轉換成字串的向量,例如,我們使用數據集映射轉換:

我們可以將每個句子向量切換成一個包含向量和它的動態長度的元組:

最後,我們可以對每個句子執行辭彙查找。給定一個查找表對象表,該映射將第一個元組元素從字元串向量轉換為整數向量。

連接兩個數據集也很容易。如果兩個文件包含彼此的逐行翻譯,並將每個文件讀入其自身的數據集,則可以通過以下方式創建一個包含壓縮行元組的新數據集:

可變長度句子的分批是很直接明確的。以下轉換從source_target_dataset批處理batch_size元素,並將源和目標向量分別貼到每個批次中最長源和目標向量的長度。

從此數據集發出的值將是嵌套元組,其張量具有最大尺寸為batch_size的尺寸。 結構將是:

1.迭代器[0] [0]具有批量和填充的源句子矩陣。

2.迭代器[0] [1]具有批量的源大小向量。

3.迭代器[1] [0]具有批量和填充的目標句子矩陣。

4.迭代器[1] [1]具有批量的目標大小向量。

最後,也可以將類似大小的源句子批量化在一起。有關詳細信息和完整實現,請參閱utils / iterator_utils.py文件。

從數據集讀取數據需要三行代碼:創建迭代器,獲取其值並初始化它。

一旦迭代器被初始化,訪問源或目標張量的每個session.run調用將從基礎數據集請求下一個小型數據。

更好的NMT模型的其他細節

?雙向RNN

編碼器側的雙向性通常會提供更好的性能(隨著使用更多的層,速度有一些降低)。 在這裡,我們給出一個簡單的例子,說明如何用單個雙向層構建編碼器:

變數encoder_outputs和encoder_state可以與編碼器一樣使用。 請注意,對於多個雙向層,我們需要對編碼器_state進行一些操作,有關詳細信息,請參閱model.py,更多細節請運行_build_bidirectional_rnn()。

集束搜索

雖然貪婪解碼可以給我們相當合理的翻譯質量,但是集束搜索解碼器可以進一步提高性能。集束搜索的想法是通過在我們翻譯的同時,保留一小堆頂級候選來更好地探索所有可能的翻譯的搜索空間。集束的大小稱為波束寬度;大小為10的最小波束寬度通常是足夠的。有關更多信息,請參閱Neubig的第7.2.3節(2017)。 以下是集束搜索如何完成的示例:

請注意,使用相同的dynamic_decode()API調用,類似於Section解碼器。一旦解碼,我們可以訪問如下的翻譯:

有關詳細信息,請參閱model.py,或_build_decoder()。

超參數

有幾個超參數可以導致額外的性能。在這裡,我們根據自己的經驗列出一些[免責聲明:其他人可能不會同意我們寫的內容!]。

優化器:雖然Adam可以導致「陌生」體系結構的合理化,但如果你可以使用SGD訓練,一般會導致更好的性能。

注意力:Bahdanau方式的注意力往往要求編碼器方面的雙向性運作良好; 而Luong方式的注意力往往適用於不同的設置。對於本教程代碼,我們建議使用Luong&Bahdanau方式的注意力的兩個改進的變體:scaling_luong和normed bahdanau。

多GPU訓練

訓練NMT模型可能需要幾天時間。 在不同的GPU上放置不同的RNN層可以提高訓練速度。 以下是在多個GPU上創建RNN圖層的示例。

此外,我們需要在tf.gradients中啟用colocate_gradients_with_ops選項來並行化梯度計算。

你可能會注意到,隨著GPU數量的增加,基於NMT模型的注意力的速度提高非常小。標準注意力架構的一個主要缺點是在每次步驟中使用頂層(最終)層的輸出來查詢注意力。這意味著每個解碼步驟必須等待其前一步驟完成;因此,我們無法通過簡單地將RNN層放置在多個GPU上來並行化解碼過程。

基準

IWSLT英語到越南語

練習:133000個案例, dev=tst2012, test=tst2013,下載腳本。

訓練細節:我們用雙向編碼器(即編碼器的1個雙向層)訓練512單位的2層LSTM,降維dim為512. LuongAttention(scale = True),dropout keep_prob=0.8。所有參數都是一致的。我們使用學習率1.0的SGD如下:訓練12000步(?12個周期); 經過8000步,我們每1000步開始減半學習率。

結論:TODO(rzhao):添加從英文到越南語訓練模型的URL。

以下是2個模型(模型1、模型2)的平均結果。

我們用BLEU評分來衡量翻譯質量(Papineni 等人於2002年提出)。

訓練速度: TitanX上K40m的(0.37s步進時間,15.3K wps)(0.17s步進,32.2K wps)。

這裡,步進時間是指運行一個小批量(大小128)所需的時間。 對於wps,我們計算源和目標上的單詞。

WMT:從德語到英語

訓練:450萬個樣例,dev = newstest2013,test = newstest2015

下載腳本

訓練細節:我們訓練超參數的過程與英語到越南語的實驗類似,但以下細節除外。使用BPE https://github.com/rsennrich/subword-nmt(32000個操作)將數據拆分為子字單元。我們用雙向編碼器(即編碼器的2個雙向層)訓練1024單位的4層LSTM,降維dim為1024。我們訓練350000步(?10個周期);在170000步之後,我們每17000步開始減半學習率。

結論:TODO(rzhao):添加德文到英文訓練模型的URL。

前2行是2個模型(模型1、模型2)的平均結果。 第三行的結果是使用GNMT注意力([model](LINK))在4個GPU上運行結果。

這些結果表明我們的代碼為NMT建立了強大的基準系統。(請注意,WMT系統通常會使用我們目前沒有的大量單語數據。)

訓練速度:Nvidia K40m(2.1s步進時間、3.4K wps),Nvidia TitanX(0.7s步進、8.7K wps)。

我們僅對K40m進行了基準測試:

這些結果表明,沒有GNMT注意力,使用多個GPU的收益是最小的。

如果有GNMT注意力,我們從多個GPU獲得了50%-100%的加速。

WMT:英語到德語——完全比較

前兩行是我們的GNMT注意力模型:模型1(4層)、模型2(8層)。

上述結果表明,我們的模型在類似架構的模型中具有很強的競爭力。

[注意,OpenNMT使用較小的模型,目前的最佳結果(截至本文中)為28.4,由Transformer network(Vaswani等人於2017年提出)獲得,其具有明顯不同的架構。

其他資源

為了深入了解神經機器翻譯和序列模型,我們強烈推薦以下材料:Luong,Cho,Manning(2016)、luong(2016),以及Neubig(2017)。

很多工具可以構建seq2seq模型,所以我們可以選擇其中一種語言:

Stanford NMT https://nlp.stanford.edu/projects/nmt/ [Matlab]

tf-seq2seq https://github.com/google/seq2seq [TensorFlow]

Nemantus https://github.com/rsennrich/nematus [Theano]

OpenNMT http://opennmt.net/ [Torch]

聲明

我們要感謝Denny Britz、Anna Goldie、Derek Murray和Cinjon Resnick為TensorFlow和seq2seq庫帶來了全新功能。另外感謝Lukasz Kaiser對seq2seq代碼庫的初步幫助; Quoc Le為複製GNMT提出的建議; Yonghui W和Zhifeng Chen對於GNMT系統的細節貢獻, 以及谷歌大腦團隊的支持和反饋!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

Chainer-GAN庫發布,實現多種GAN及特徵匹配去噪
谷歌與CMU聯合發文,審視數據對深度學習的重要性
深度學習被「神化」!如何「客觀」看待深度學習的應用場合及作用
科沃斯旺寶3首次亮相 詮釋「是機器人,更是工作夥伴」
國際「智造」時代來襲,四川準備好了么?

TAG:機器人圈 |

您可能感興趣

進化演算法+AutoML,谷歌提出新型神經網路架構搜索方法
谷歌、HTC出席VR網路研討會
進化演算法 + AutoML,谷歌提出新型神經網路架構搜索方法
Via瀏覽器 v谷歌市場版 簡單的網頁瀏覽器!
谷歌大腦AutoML最新進展:用進化演算法發現神經網路架構
谷歌演化AutoML自動發現神經網路新架構
谷歌YouTube推薦系統的深度神經網路應用
利用「可進化」的 AutoML,谷歌提出新型神經網路架構搜索方法
超越標準 GNN !DeepMind、谷歌提出圖匹配網路| ICML最新論文
谷歌和OpenAI宣稱解密了神經網路黑盒屬性:好像遊戲地圖
AI早報:FB挖谷歌晶元開發主管;科學家研製出完全DNA構成的人工神經網路
業界 | 進化演算法 + AutoML,谷歌提出新型神經網路架構搜索方法
谷歌大腦開源多種新型神經網路優化器,AutoML探索新架構
自然語言處理頂會NAACL最佳論文出爐!谷歌BERT獲最佳長論文
谷歌最強 NLP 模型 BERT 解讀
2分鐘論文 | 用 谷歌「AI可解釋性」 看懂機器學習
谷歌安全團隊報告macOS文件系統高危漏洞
用生成對抗網路解決NLP問題:谷歌大腦提出MaskGAN
被谷歌槍斃的社交網路Google+:用戶寥寥 變成教師樂園
谷歌高管視頻拜年秀中文 成語、網路語都用上了