天天看點

Artetxe - 2018ICLR - Unsupervised Neural Machine TranslationUnsupervised Neural Machine Translation

無監督神經機器翻譯二(2)

  • Unsupervised Neural Machine Translation
    • 技術點
    • 整體流程
    • 設計細節
      • 原文重構
      • 譯文重構
      • 加噪&降噪
    • 類比結果

Unsupervised Neural Machine Translation

文章連結:

Unsupervised Neural Machine Translation

本文介紹無監督翻譯的另一篇文章,其實這篇文章跟我介紹的《無監督機器翻譯二》的那篇文章撞車了,兩篇文章中的思路大體相同,隻是具體的細節有些不同,兩篇還都中了ICML,應該是不同的審稿人吧,不然這篇我估計會被pass掉。由于兩篇的思想類似,很多地方我就不詳細介紹了,仔細看前一篇文章就可以了解了,上一篇文章的連結為:

無監督機器翻譯Unsupervised Machine Translation Using Monolingual Corpora Only

技術點

本文的關鍵技術主要由以下幾點:

  1. 使用了預訓練的跨語言詞嵌入,并且後續不更新,跟普通的詞嵌入不同。
  2. 不同語言共享編碼器,但解碼器不同。
  3. 同樣分為原文重構和譯文重構。
  4. 同樣引入了噪聲。

整體流程

Artetxe - 2018ICLR - Unsupervised Neural Machine TranslationUnsupervised Neural Machine Translation

整體流程很簡單,兩種語言共享一個encoder,每種語言都有各自的decoder。文中說encoder部分的詞嵌入用的是已經訓練好的跨語言詞嵌入,沒有說decoder部分的詞嵌入,難道兩部分的詞嵌入不一樣?還是我看花眼了沒看到?有待考究。

文章做的實驗都是基于英法或者英德的,都是比較接近的語言,在這些語言對之間共享 encoder 可能是合理的,因為可能存在一個統一的語義空間;對于差異較大的語言,比如說中阿翻譯,這麼做可能是不行的。從 GNMT 的經驗來看,多對一翻譯是沒問題的,多對一可以訓練出一個更好的目智語言的語言模型;但是一對多經常會損害翻譯品質,因為每個語言對對 encoder 提特征的方式的要求會有一些沖突。這篇文章卻對兩種語言使用同一個 shared encoder,在相差較大的語言上可能會難以學習;

設計細節

原文重構

看過我介紹的上一篇無監督博文的應該應該已經了解具體流程,本文中原文重構也是用了自編碼器,假設有L1、L2兩個語種,從L1中随機取一個單詞x1輸入到編碼器,編碼器得到的結果再輸入到L1 decoder,最後生成單詞x1^ ,x1^也是L1語種中的單詞,那麼這就是原文重構。L2語種類似。

譯文重構

還是上面的例子,有L1、L2兩個語種,從L1中随機取一個單詞x1,先用上一輪疊代生成的翻譯器把X1翻譯為X2(即利用共享編碼器和另一種語言的解碼器),X2為L2中的句子。然後将X2輸入到編碼器,編碼器得到的結果再輸入到L1 decoder,最後生成單詞x1^ 。x1^是L1語種中的單詞,那麼這就是譯文重構。簡單的說就是先将原句子翻譯為目标句子,然後再反向翻譯回原句子。

加噪&降噪

跟另一篇文章類似,也加入了噪聲,二者加噪聲的目的應該是相同的,隻是加噪聲的方法略有不同,本文通過在連續單詞之間進行随機交換來更改輸入句子的單詞順序。對于一個長度為N的單詞序列,共做N/2次交換。

原文重構過程中從噪聲輸入中回譯為原單詞即為降噪。

類比結果

由于兩篇文章想法類似,那麼可以做一下簡單的比較:

上一篇博文為P1,這篇文章為P2。

  1. P1中使用了fastText來生成詞嵌入,而且訓練的過程中詞嵌入不斷的更新。P2中使用訓練好的跨語言詞嵌入,訓練過程中詞嵌入不更新。
  2. P1中M1(第一輪翻譯模型)使用以前的工作中訓練好的翻譯模型(詞級别的翻譯模型),可以給模型一個好的起點,使模型更快收斂。而P2中整個過程中都使用論文中設計的翻譯模型,模型學習時間更長且效果可能沒有P1中的好,不過它固定了詞向量,應該可以引導 shared encoder 快速建構語義空間。
  3. 兩篇文章雖然都包括原文重構和譯文重構,但具體的結構不同。P2直接讓兩種語言共用一個 encoder 和共享的詞嵌入矩陣(不同語言所生成的詞嵌入不同); 而P1是兩種語言各有一個 encoder 和 decoder,兩個 encoder 共享隐層參數,兩個 decoder 共享隐層和 attention 參數,輸入和輸出層則不共享,但是用一個判别器分辨 encoder 編碼的結果來自哪種語言,通過對抗的方法讓兩個 encoder 編碼的語義空間重合到一塊兒去,進而詞向量不會在訓練過程中跑偏。
  4. 兩篇文章在輸入資料中都加了噪聲,但加噪聲的方法不同,很明顯P1中的方法更好些。
  5. 在訓練的時候,P1是兩個翻譯方向的圖中所有 loss 加起來訓一個 batch,然後判别器 D 訓一個 batch,這樣交錯下去,所有子產品一起慢慢收斂。而P2是L1原文重構子產品、L2原文重構子產品、L1到L2的回譯子產品、L2到L1的回譯子產品、四個子產品交替訓練,每次隻訓練一個子產品。
  6. 收斂條件,P1中讓 s1 翻譯到 s2 再翻譯回 s1’,計算 s1 和 s1’ 的 BLEU 來做交叉驗證,決定訓練什麼時候停止,并且說明這個名額跟真正平行語料上測出來的 BLEU 相關性很高。而P2文中沒有講,難道是看損失函數?

繼續閱讀