Unsupervised Neural Machine Translation: 誰說翻譯一定要平行語料庫?

導讀

近年來機器翻譯在深度學習的發展下獲得了不少進展,這種由深度學習為技術基底的機器翻譯系統,我們稱之為 "Neural Machine Translation (NMT)",像是在 2016 年 11 月,Google 翻譯從過往的 "Phrased-based Machine Translation" 改成以 RNN 為基礎的 NMT 之後獲得了大幅改善 [1];在 2017 年 5 月,Facebook 以 CNN 為基礎的 NMT-Fairseq [2],不僅在效能上能夠媲美 RNN-based NMT,在速度上更是它的十倍;而後 Google 又發表了不用 RNN 也不用 CNN,改以 attention 機制為主的 model 來回擊,達到了 state-of-the-art [3]。

綜合上述,我們知道深度學習在目前已儼然成為機器翻譯研究的主流,不過目前還是得依賴大量的 "平行語料庫 (parallel corpora)" 來讓 model 去學習怎麼翻譯,例如,如果要從英文 (source language) 翻譯至中文 (target language),我們會需要準備一堆中英文互為翻譯的句子來讓 model 學習,更具體來說,我們的 model 基本上會是一個 encoder-decoder 的架構,也就是 encoder 輸入 source language,我們要讓 decoder 輸出 target language [4]。但是問題來了,在平行語料很少或是沒有的狀況下,我們是否可以只拿一堆 source lanugage 的單語語料庫 (monolingual corpora) 跟一堆 target language 的單語語料庫,就可以讓 model 學習怎麼翻譯呢?答案是:Yes you can!(注意:這兩種語言的語料庫不需要互為翻譯!)

在本篇文章中,我們要介紹的是正於 ICLR 2018 審查中的論文-"Unsupervised Neural Machine Translation",這篇論文提出了不需要平行語料庫,只需要單語語料庫,就能夠做翻譯的方法,而且在一開始就聲稱他們的論文在 unsupervised NMT 的研究中是一大突破呢!那就讓我們來看看他們是怎麼做的吧!

背景知識

由於本篇文有許多背景知識,小編在這裡簡單對一些關鍵字做解釋,讓閱讀門檻能降低一些。
- Sequence-to-sequence model (seq2seq): 如同在導讀中所介紹的,目前基於深度學習的機器翻譯大部分都是採用這種 model 架構,坦白講就是一個 autoencoder,只是你有一個 encoder 將輸入的 source sequence encode 成 vector,而 decoder 要從這 encoded vector 輸出 target sequence,因此稱作 seq2seq。在機器翻譯的設定之下,source 與 target sequence 就是不同語言的句子,而 encoder 與 decoder 都是神經網路,目標是可以學到兩個語言之間的轉換。
- Cross-lingual embeddings: 首先,我們要知道 word embeddings 就是將字詞用 vector 來表示,而在該 vector space 之中能夠用 cosine similarity 做字詞間語意相遇度的衡量,而 cross-lingual embeddings 就是兩種不同的語言能夠一起 share 同一個 vector space,例如:vector("狗") 跟 vector("dog") 要在同樣的 vector space 中距離很相近。這方面的研究仍然是一項熱門的基礎研究,欲知詳情可參閱完整的 survey [5]。

系統架構

本篇論文所採用的是 word-level seq2seq,其中以 2-layer bi-GRU 作為 encoder,2-layer GRU 作為 decoder,再配上 attention 機制,是典型的 baseline model,但是有三點與典型的 seq2seq 不一樣的地方,如下圖所示:

註:Language 1 簡稱為 L1,Language 2 簡稱為 L2。L1 跟 L2 是我們要讓 model 學習互為翻譯的語言。

  • Dual structure: 典型的 seq2seq 架構只能處理單向的翻譯順序,例如只能中翻英或只能英翻中,在這邊他們簡單增加一個以上的 language-dependent 的 decoder,就能夠處理雙向的翻譯順序。
  • Shared encoder: 這是一個 language-independent 的 encoder,可以理解成不管輸入何種語言的句子,只要句子語意相近,輸出的句子 vector 也會是相似的。
  • Fixed embeddings in the encoder: 使用 pretrained cross-lingual embeddings 並且在訓練之中不被更新參數。注意:即使我們說 embeddings 是 cross-lingual 的,但不同語言的 vocabulary 是不一樣的,避免像是在英文跟法文都有 "chair" 這個 vocabulary 但在英文是「椅子」、在法文是「肉」的意思,因此 vector_en("chair") 與 vector_fr("chair") 要在 shared vector space 中距離很遠。

註:在 pretrained cross-lingual embeddings 的部分,他們先拿 Mikolov et al (2013) 提出的 word2vec 分別對不同語言訓練 word embeddings,再使用 Artetxe et al. (2017) 開源的 vecmap 將不同語言的 word embeddings mapping 到同一個 vector space。

訓練框架

由於提出的 model 架構與典型 seq2seq 的不一樣,因此可以藉由以下兩個重要的步驟來做訓練:
1. Denoising (reconstruction): Encoder 輸入含有 noise 的 L1 句子,L1 decoder 輸出原先正確 (不含 noise) 的 L1 句子。Noise 在這邊是指的是我們將原先已知正確的 L1 句子做詞序上的隨機變換。這基本上就是一般 denoising autoencoders 在做的事情。
2. Back-translation: Encoder 輸入已知不含 noise 的 L1 句子,L2 decoder 輸出 L2 句子,因此我們得到了 "pseudo-parallel corpus" (L1, L2)(注意,這是預測階段,L2 decoder 可能會輸出錯誤的 L2 句子,或者我們可以理解為含有 noise 的 L2 句子)。我們拿 L2 decoder 輸出的這個 L2 句子,拿去給 encoder 當作輸入,並訓練 L1 decoder 要輸出已知不含 noise 的 L1 句子。整個過程基本上就是 L1 先翻譯成 L2 再翻譯回 L1,示意圖如下:

註:上圖為拿 L1 做 back-translation 的示意圖,若是拿 L2 做 back-translation 也只是把 input 與 output 換個順序而已。

在訓練的每個 iteration 中,我們有 L1, L2 以 batch 為單位的訓練句子,接著:
1. 拿 L1 做 denoising,此步驟 encoder 與 L1 decoder 的參數會被更新。
2. 拿 L2 做 denoising,此步驟 encoder 與 L2 decoder 的參數會被更新。
3. 拿 L1 做 back-translation,此步驟 encoder 與 L1 decoder 的參數會被更新。
4. 拿 L2 做 back-translation,此步驟 encoder 與 L2 decoder 的參數會被更新。

雖然說整個過程是 unsupervised training,但事實上,同樣的一個訓練框架也可以適用在有平行語料+單語語料的狀況下做 semi-supervised training,或是你高興的話也可以只拿平行語料庫做 supervised training 喔!

最後,對此篇論文有近一步興趣的讀者們,可以去讀他們的論文以及參考以下連結噢!

參考

Share the joy
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

近期文章

近期迴響

彙整

分類

其它

Howard Lo Written by:

Be First to Comment

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *