1. 程式人生 > >無需雙語語料庫的無監督式機器翻譯

無需雙語語料庫的無監督式機器翻譯

去年,Facebook 發表論文《Unsupervised Machine Translation Using Monolingual Corpora Only》,提出使用單語語料庫的無監督式機器翻譯。近日 Medium 上一篇文章對該論文進行了解讀,機器之心對此進行了編譯介紹。

深度學習廣泛應用於日常任務中,尤其擅長包含一定「人性」的領域,如影象識別。或許深度網路最有用的功能就是資料越多效能越好,這一點與機器學習演算法不同。

深度網路在機器翻譯任務中做得不錯。它們目前在該任務中是最優的,而且切實可行,連 Google Translate 都在使用。機器翻譯需要語句級別的平行資料來訓練模型,即對於源語言中的每個句子,目標語言中都有對應的譯文。難點在於某些語言對很難獲取大量資料(來使用深度學習的力量)。

機器翻譯的問題

如上所述,神經機器翻譯最大的問題是需要雙語語言對資料集。對於英語、法語這類廣泛使用的語言來說,這類資料比較容易獲取,但是對於其他語言對來說就不一定了。如能獲取語言對資料,則該問題就是一個監督式任務。

解決方案

論文作者指出如何將該任務轉換成無監督式任務。在該任務中,所需的唯一資料是兩種語言中每種語言的任意語料庫,如英語小說 vs. 西班牙語小說。注意兩部小說未必一樣。

也就是說,作者發現如何學習兩種語言之間共同潛在空間(latent space)。

自編碼器簡單回顧

自編碼器是用於無監督任務的神經網路的一種寬泛類別。它們可以重新建立與饋送的輸入相同的輸入。關鍵在於自編碼器中間有一個層,叫作 bottleneck 層。該層可以捕捉所有輸入的有趣資訊,去除無用資訊。

64903640-4.jpeg

自編碼器圖示。中間的模組是儲存壓縮表徵的 bottleneck 層。(圖片來源:https://blog.keras.io/building-autoencoders-in-keras.html)

簡言之,bottleneck 層中的輸入(這裡經過編碼器轉換)所在的空間就是潛在空間。

去噪自編碼器

如果自編碼器可以學會完全按照接收的饋送來重建輸入,那麼它或許什麼都不用學了。這種情況下,輸出可以被完美重建,但是 bottleneck 層中並沒有有用特徵。為了彌補,我們可以使用去噪自編碼器。首先,向輸入新增一些噪聲,然後構建網路用來重建原始影象(不帶噪聲的版本)。用這種方式,通過讓網路學習什麼是噪聲(以及真正有用的特徵)使其學習影象的有用特徵。

91719640-5.jpeg

去噪自編碼器圖示。使用神經網路重建左側影象,生成右側影象。在此示例中,綠色的神經元就是 bottleneck 層。(圖片來源:http://www.birving.com/presentations/autoencoders/index.html#/)

為什麼要學習共同潛在空間?

潛在空間捕捉資料特徵(在機器翻譯中,資料是句子)。如果可以學習對語言 A 和語言 B 饋送的輸入輸出相同特徵的空間,那麼就可以實現這兩種語言之間的翻譯。由於該模型已經學會了正確的「特徵」,那麼利用語言 A 的編碼器來編碼,利用語言 B 的解碼器解碼就可以使該模型完成翻譯。

如你所料,該論文作者利用去噪自編碼器學習特徵空間。他們還指出如何使自編碼器學習共同潛在空間(作者在論文中稱之為對齊潛在空間),以執行無監督機器翻譯。

語言中的去噪自編碼器

作者使用去噪編碼器以無監督的方式學習特徵。其中定義的損失函式為:

27295640-6.jpeg

式 1.0 去噪自編碼器損失函式

式 1.0 的解釋

l 是語言(按其設定,應該有兩種可能的語言),x 是輸入,C(x) 是將噪聲加到 x 之後的結果。e() 是編碼器,d() 是解碼器。等式末尾的 Δ(x_hat ,x) 項是 token 級別的交叉熵誤差總和。由於是通過輸入序列得到輸出序列,我們需要確保每個 token 都以正確的順序排列。因此最終得到了上式中的損失函式。可以將其視為多標籤分類問題,其中輸入中的第 i 個 token 和輸出中的第 i 個 token 對比。一個 token 就是一個單元,不能再繼續分解。在機器翻譯中,一個單詞就是一個 token。

因此,式 1.0 的作用是使網路最小化它的輸出(給定帶噪輸入)和原始語句之間的差異。

如何新增噪聲

影象處理可以通過在畫素中新增浮點數來新增噪聲,而在語言中新增噪聲的方式是不同的。因此,論文作者開發了自己的噪聲生成系統。他們用 C() 表示噪聲函式。C() 以輸入語句為輸入,然後輸出該語句的帶噪聲版本。

有兩種新增噪聲的方法。

一種是,以 P_wd 的概率從輸入中刪除一個單詞;另一種是,每個單詞以下式中的約束從初始位置偏移:

19977640-3.png

這裡,σ是第 i 個 token 偏移後的位置。因此,上式的含義是「一個 token 最多可以偏離原來位置 k 個 token 的距離」。

作者使用的 k 值為 3,P_wd 值為 0.1。

跨域訓練

為了學習兩種語言的互譯,需要構建將輸入序列(語言 A)對映到輸出序列(語言 B)的過程。作者稱該學習過程為跨域訓練。首先,取樣一個輸入語句 x,然後使用前一次迭代後的模型 M() 生成翻譯後的輸出 y,即 y=M(x)。之後,使用上述的噪聲函式 C() 應用到 y 上,得到 C(y)。語言 A 的編碼器將 C(y) 編碼,然後由語言 B 的解碼器將其解碼,重構出 C(y) 的無噪聲版本。訓練模型時使用的是相同的交叉熵誤差總和,類似式 1.0。

通過對抗訓練學習共同潛在空間

論文中並沒有提到如何學習共同潛在空間。上述跨域訓練可能在某種程度上有助於學習類似的空間,但要使模型學習類似的潛在空間需要新增一個更強的約束。

作者使用了對抗訓練。他們使用了另一個稱為鑑別器的模型,以每個編碼器的輸出為輸入,預測被編碼的語句所屬的語言。然後,編碼器也要學習欺騙鑑別器。這在概念上和標準的 GAN 並沒有什麼區別。鑑別器通過每個時間步(由於使用了 RNN)的特徵向量預測輸入所屬的語言種類。

整合所有部分

將上述的三個不同的損失(自動編碼器損失、翻譯損失和鑑別器損失)加在一起,所有的模型權重在一個步驟內更新。

由於這是一個序列到序列問題,作者使用了 LSTM 網路,結合注意力機制,即有兩個基於 LSTM 的自編碼器,每種語言使用一個。

訓練該架構時有三個主要步驟。訓練過程是迭代進行的。訓練迴圈分為以下三步:

1. 使用語言 A 的編碼器和語言 B 的解碼器進行翻譯;

2. 給定一個帶噪語句,訓練每個自編碼器重新生成一個去噪語句;

3. 給步驟 1 中得到的翻譯語句新增噪聲然後重新生成,以提升翻譯能力。這一步中,語言 A 的編碼器和語言 B 的解碼器(以及語言 B 的編碼器和語言 A 的解碼器)需要一起訓練。

注意雖然步驟 2 和步驟 3 是分開的,但權重是同步更新的。

如何快速啟動該框架

如上所述,該模型使用了之前迭代的譯文來提升自己的翻譯能力。因此,在訓練迴圈開始之前,事先具備某些型別的翻譯能力是很重要的。作者使用了 FastText 學習詞級雙語詞典。注意這種方法是很粗糙的,只在模型開始時使用。

框架的完整結構如下流程圖所示:

80108640-7.jpeg

完整翻譯框架的高階流程圖。(圖片來源:http://robertaguileradesign.com/)

結論

本文介紹了一種非常新的無監督機器翻譯技術。它使用多種不同的損失函式來提升各個單獨任務,同時使用對抗訓練為架構行為新增約束。

原文連結:https://buzzrobot.com/machine-translation-without-the-data-21846fecc4c0