當前位置:
首頁 > 最新 > 無需雙語語料庫的無監督式機器翻譯

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

選自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/)

結論

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

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

?------------------------------------------------


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

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


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

TAG:機器之心 |