無需雙語語料庫的無監督式機器翻譯
選自Medium
作者:Harshvardhan Gupta
機器之心編譯
參與:劉曉坤、路雪
去年,Facebook 發表論文《Unsupervised Machine Translation Using Monolingual Corpora Only》,提出使用單語語料庫的無監督式機器翻譯。近日 Medium 上一篇文章對該論文進行了解讀,機器之心對此進行了編譯介紹。
深度學習廣泛應用於日常任務中,尤其擅長包含一定「人性」的領域,如圖像識別。或許深度網路最有用的功能就是數據越多性能越好,這一點與機器學習演算法不同。
深度網路在機器翻譯任務中做得不錯。它們目前在該任務中是最優的,而且切實可行,連 Google Translate 都在使用。機器翻譯需要語句級別的平行數據來訓練模型,即對於源語言中的每個句子,目標語言中都有對應的譯文。難點在於某些語言對很難獲取大量數據(來使用深度學習的力量)。
機器翻譯的問題
如上所述,神經機器翻譯最大的問題是需要雙語語言對數據集。對於英語、法語這類廣泛使用的語言來說,這類數據比較容易獲取,但是對於其他語言對來說就不一定了。如能獲取語言對數據,則該問題就是一個監督式任務。
解決方案
論文作者指出如何將該任務轉換成無監督式任務。在該任務中,所需的唯一數據是兩種語言中每種語言的任意語料庫,如英語小說 vs. 西班牙語小說。注意兩部小說未必一樣。
也就是說,作者發現如何學習兩種語言之間共同潛在空間(latent space)。
自編碼器簡單回顧
自編碼器是用於無監督任務的神經網路的一種寬泛類別。它們可以重新創建與饋送的輸入相同的輸入。關鍵在於自編碼器中間有一個層,叫作 bottleneck 層。該層可以捕捉所有輸入的有趣信息,去除無用信息。
自編碼器圖示。中間的模塊是存儲壓縮表徵的 bottleneck 層。(圖片來源:https://blog.keras.io/building-autoencoders-in-keras.html)
簡言之,bottleneck 層中的輸入(這裡經過編碼器轉換)所在的空間就是潛在空間。
去噪自編碼器
如果自編碼器可以學會完全按照接收的饋送來重建輸入,那麼它或許什麼都不用學了。這種情況下,輸出可以被完美重建,但是 bottleneck 層中並沒有有用特徵。為了彌補,我們可以使用去噪自編碼器。首先,向輸入添加一些雜訊,然後構建網路用來重建原始圖像(不帶雜訊的版本)。用這種方式,通過讓網路學習什麼是雜訊(以及真正有用的特徵)使其學習圖像的有用特徵。
去噪自編碼器圖示。使用神經網路重建左側圖像,生成右側圖像。在此示例中,綠色的神經元就是 bottleneck 層。(圖片來源:http://www.birving.com/presentations/autoencoders/index.html#/)
為什麼要學習共同潛在空間?
潛在空間捕捉數據特徵(在機器翻譯中,數據是句子)。如果可以學習對語言 A 和語言 B 饋送的輸入輸出相同特徵的空間,那麼就可以實現這兩種語言之間的翻譯。由於該模型已經學會了正確的「特徵」,那麼利用語言 A 的編碼器來編碼,利用語言 B 的解碼器解碼就可以使該模型完成翻譯。
如你所料,該論文作者利用去噪自編碼器學習特徵空間。他們還指出如何使自編碼器學習共同潛在空間(作者在論文中稱之為對齊潛在空間),以執行無監督機器翻譯。
語言中的去噪自編碼器
作者使用去噪編碼器以無監督的方式學習特徵。其中定義的損失函數為:
式 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 的概率從輸入中刪除一個單詞;另一種是,每個單詞以下式中的約束從初始位置偏移:
這裡,σ是第 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 學習詞級雙語詞典。注意這種方法是很粗糙的,只在模型開始時使用。
框架的完整結構如下流程圖所示:
完整翻譯框架的高級流程圖。(圖片來源:http://robertaguileradesign.com/)
結論
本文介紹了一種非常新的無監督機器翻譯技術。它使用多種不同的損失函數來提升各個單獨任務,同時使用對抗訓練為架構行為添加約束。
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
?------------------------------------------------
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:機器之心 |