機(jī)器翻譯通常利用深度學(xué)習(xí)技術(shù)來實(shí)現(xiàn),而實(shí)現(xiàn)這一過程往往需要借助大量數(shù)據(jù)模型進(jìn)行訓(xùn)練,這在一定程度上限制了小語種翻譯的發(fā)展。針對(duì)這一困境,F(xiàn)acebook提出了無監(jiān)督機(jī)器人翻譯。本文通過深入淺出的講解,詳細(xì)闡述這一方法背后的工作原理。
深度學(xué)習(xí)正在被廣泛地運(yùn)用于各項(xiàng)日常任務(wù)當(dāng)中,尤其是涉及到一定程度“人性化”的領(lǐng)域,例如,圖像識(shí)別。與其他機(jī)器學(xué)習(xí)算法不同,深度網(wǎng)絡(luò)最突出的特點(diǎn)是隨著獲得數(shù)據(jù)的增多,其性能可以不斷提高。因此,如果可以獲得更多的數(shù)據(jù),那么預(yù)期的性能也會(huì)變得更好。
深度網(wǎng)絡(luò)最擅長的任務(wù)之一是機(jī)器翻譯。目前,它是能夠完成此項(xiàng)任務(wù)的最先進(jìn)的技術(shù),并且具有足夠的可行性,甚至谷歌翻譯(Google Translate)也在使用它(https://en.wikipedia.org/wiki/Google_Neural_Machine_Translation)。在機(jī)器翻譯中,需要句子級(jí)(sentence-level)的并行數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練,即對(duì)于源語言中的每個(gè)句子來說,都需要是目標(biāo)語言中被翻譯的語言。不難想象為什么這會(huì)成為一個(gè)問題。因?yàn)?,?duì)于一些語言對(duì)來說,很難獲得大量的數(shù)據(jù)(因此可以使用深度學(xué)習(xí)的這種能力)。
本文是如何構(gòu)建的
本文是基于Facebook近期發(fā)表的一篇名為“僅使用單語語料庫進(jìn)行的無監(jiān)督機(jī)器翻譯”(Unsupervised Machine Translation Using Monolingual Corpora Only)(https://arxiv.org/abs/1711.00043)的文章而撰寫的。本文并沒有完全遵循論文的結(jié)構(gòu),而是添加了一些自己的解讀,進(jìn)而讓文章更加通俗易懂。
閱讀本篇文章需要具備一些關(guān)于神經(jīng)網(wǎng)絡(luò)的基本知識(shí),比如損失函數(shù)、自動(dòng)編碼器等。
機(jī)器翻譯的問題
如上所述,在機(jī)器翻譯中使用神經(jīng)網(wǎng)絡(luò)的最大問題是,它需要兩種語言的句子對(duì)數(shù)據(jù)集。它適用于英語和法語等被廣泛使用的語言,而對(duì)于其他語言的句子對(duì)則不適用。如果語言對(duì)數(shù)據(jù)可用,那么這將成為一個(gè)受監(jiān)督性的任務(wù)。
解決方案
這篇論文的作者想出了如何將這一任務(wù)轉(zhuǎn)換為無監(jiān)督任務(wù)的方法。在這一任務(wù)中,唯一需要的是兩種語言中每一種語言的任意兩個(gè)語料庫,如任意一部英語小說和任意一部西班牙語小說。需要注意的一點(diǎn)是,這兩部小說不一定是相同的。
從最直觀的角度來講,作者發(fā)現(xiàn)了該如何學(xué)習(xí)一種介于兩種語言之間的潛在空間(latent space)的方法。
自動(dòng)編碼器概述
自動(dòng)編碼器是一種用于無監(jiān)督任務(wù)的廣泛的神經(jīng)網(wǎng)絡(luò)類別。它的工作原理是重新創(chuàng)建一個(gè)和最初輸入相同的輸入。完成這一操作的關(guān)鍵是網(wǎng)絡(luò)中間有一個(gè)名為瓶頸層(bottleneck layer)的網(wǎng)絡(luò)層。該網(wǎng)絡(luò)層被用以捕捉所有關(guān)于輸入的有用信息,并摒棄無用信息。
簡而言之,在瓶頸層中,輸入(現(xiàn)在由編碼器轉(zhuǎn)換)所在的空間被稱為潛在空間(latent space)。
降噪自動(dòng)編碼器
如果一個(gè)自動(dòng)編碼器被調(diào)教成完全按照輸入的方式重建輸入,那么它可能什么都做不了。在這種情況下,輸出將得到完美的重建,但是在瓶頸層中沒有任何有用的特性。為了解決這一問題,我們使用了降噪自動(dòng)編碼器。首先,實(shí)際輸入因?yàn)樵黾恿艘恍┰肼暥艿捷p微干擾。然后,使用網(wǎng)絡(luò)重建原始圖像(并非含噪版本)。這樣一來,通過學(xué)習(xí)什么是噪聲(以及其真正有用的特征是什么),網(wǎng)絡(luò)可以學(xué)習(xí)圖像的有用特征。
為什么要學(xué)習(xí)一個(gè)共同的潛在空間?
潛在空間可以捕捉數(shù)據(jù)的特征(在我們所舉的例子中,數(shù)據(jù)就是句子)。因此,如果有可能獲得一個(gè)空間,即當(dāng)輸入語言A時(shí),就會(huì)產(chǎn)生與輸入語言B相同的特征,那么我們就有可能在它們之間進(jìn)行翻譯。由于該模型已經(jīng)擁有了正確的“特征”,因此由語言A的編碼器進(jìn)行編碼,由語言B的解碼器進(jìn)行解碼,這將使二者進(jìn)行有效的翻譯工作。
或許正如你想到的那樣,作者利用降噪自動(dòng)編碼器學(xué)習(xí)一個(gè)特征空間。他們還想出了該如何使自動(dòng)編碼器學(xué)習(xí)一個(gè)共同潛在空間的方法(他們將其稱之為一個(gè)對(duì)其潛在空間,aligned latent space),進(jìn)而執(zhí)行無監(jiān)督的機(jī)器翻譯。
語言中的降噪自動(dòng)編碼器
作者用降噪編碼器以一種無監(jiān)督的方式學(xué)習(xí)特征。他們所定義的損失函數(shù)為:
解讀方程1.0
I是語言(對(duì)于這一設(shè)定,可能有兩種語言)。X是輸入,C(x)是給x添加噪聲后的結(jié)果。我們將很快得到噪聲所創(chuàng)建的函數(shù)C。e()是編碼器,d()是解碼器。最后一項(xiàng)Δ(x hat,x)是標(biāo)記級(jí)(token level)的交叉熵誤差值之和。由于我們有一個(gè)輸入序列,并且我們得到了一個(gè)輸出序列,因此我們要確保每個(gè)標(biāo)記(token)的順序都是正確的。因此使用這種損失函數(shù)。我們可以將它視為多標(biāo)簽分類,其中將第i個(gè)輸入的標(biāo)記與第i個(gè)輸出標(biāo)記進(jìn)行比較。其中,標(biāo)記(token)是一個(gè)不能被進(jìn)一步破壞的基本單位。在我們的例子中,標(biāo)記(token)是一個(gè)單詞。方程1.0是一個(gè)損失函數(shù),使得網(wǎng)絡(luò)最小化輸出(當(dāng)給定一個(gè)噪聲輸入時(shí))與原始、未受影響的句子之間的差別的損失函數(shù)。
與~的符號(hào)表示
是我們期望的表示,在這種情況下,這意味著輸入的分布取決于語言l,并且采用損失的平均值。這只是一個(gè)數(shù)學(xué)形式,運(yùn)算過程中的實(shí)際損失(交叉熵之和)將如往常一樣。
這個(gè)特殊符號(hào)~意味著“來自概率分布”。
在本文中我們不詳細(xì)討論這個(gè)細(xì)節(jié),可以在Deep Learning Book(http://www.deeplearningbook.org/contents/optimization.html)一文的第8.1章中詳細(xì)了解這個(gè)符號(hào)。
如何添加噪聲
對(duì)于圖像而言,只需在像素上添加浮點(diǎn)數(shù)就可以增加噪聲,而對(duì)于語言而言,則需采用其他方法。因此,作者開發(fā)了自己的系統(tǒng)來制造噪聲。他們把他們的噪聲函數(shù)表示為C()。它將句子作為輸入,并輸出該句子的含噪版本。
有兩種不同的方法添加噪聲。
首先,可以簡單地以P_wd的概率從輸入中刪除一個(gè)單詞。
其次,每個(gè)單詞都可以使用下面這個(gè)約束進(jìn)行原始位置的移位:
作者將K值設(shè)為3,將P_wd值設(shè)為1。
跨域訓(xùn)練
為了學(xué)習(xí)兩種語言之間的翻譯,應(yīng)該通過一些處理將輸入句子(語言A)映射到輸出句子(語言B)。作者將這個(gè)過程稱為跨域訓(xùn)練(cross domain training)。首先,輸入句子(x)被采樣。然后,使用先前迭代中的模型(M())生成翻譯后的輸出(y)。把它們放在一起,我們便得到了y=M(x)。隨后,使用上述相同的噪聲函數(shù)C()干擾y,得到C(y)。語言A的編碼器對(duì)這一被干擾的版本進(jìn)行編碼,語言B的解碼器對(duì)語言A編碼器的輸出進(jìn)行解碼,并重新構(gòu)建一個(gè)純凈版的C(y)。使用與方程1.0中相同的交叉熵誤差值之和(sum of cross entropy error)對(duì)模型進(jìn)行訓(xùn)練。
運(yùn)用對(duì)抗式訓(xùn)練學(xué)習(xí)一個(gè)共同的潛在空間
到目前為止,還沒有提到如何學(xué)習(xí)共同潛在空間。上面提到的跨域訓(xùn)練有助于學(xué)習(xí)一個(gè)相似空間,但需要一個(gè)更強(qiáng)的約束來推動(dòng)模型學(xué)習(xí)一個(gè)相似的潛在空間。
作者使用對(duì)抗式訓(xùn)練。他們使用了另一個(gè)模型(稱為鑒別器),該模型接受每一個(gè)編碼器的輸出,并預(yù)測編碼后的句子屬于哪一種語言。然后,從鑒別器中提取梯度,并對(duì)編碼器進(jìn)行訓(xùn)練,以欺騙鑒別器。這在概念上與標(biāo)準(zhǔn)的GAN(生成對(duì)抗網(wǎng)絡(luò))沒有什么不同。鑒別器接收每個(gè)時(shí)間步的特征向量(因?yàn)槭褂昧薘NN),并預(yù)測它來自哪種語言。
將它們結(jié)合在一起
將上述3種不同的損失(自編碼器損失、翻譯損失和鑒別器損失)相加,所有模型的權(quán)重同時(shí)更新。
由于這是一個(gè)序列到序列的問題,因此作者使用了一個(gè)長短期記憶網(wǎng)絡(luò)(LSTM),需要注意的是,這里存在兩個(gè)基于LSTM的自動(dòng)編碼器,每種語言各含一個(gè)。
在較高級(jí)別上,訓(xùn)練這個(gè)架構(gòu)需要三個(gè)主要步驟。它們遵循一個(gè)迭代訓(xùn)練過程。訓(xùn)練循環(huán)過程看起來有點(diǎn)像這樣:
1.使用語言A的編碼器和語言B的解碼器獲得翻譯。
2.訓(xùn)練每個(gè)自動(dòng)編碼器,使其能夠在給定一個(gè)損壞的句子時(shí)重新生成一個(gè)未損壞的句子。
3.通過破壞步驟1中獲得的翻譯來改進(jìn)翻譯并重新創(chuàng)建翻譯。對(duì)于這一步,語言A的編碼器和語言B的解碼器一起進(jìn)行訓(xùn)練(語言B的編碼器和語言A的解碼器一起訓(xùn)練)。
值得注意的是,即使步驟2和步驟3被分開列出,權(quán)重也會(huì)一起進(jìn)行更新。
如何啟動(dòng)這個(gè)框架
如上所述,該模型使用之前的迭代過程中自身的翻譯來提高其翻譯能力。因此,在循環(huán)過程開始之前,擁有一定翻譯能力是很重要的。作者使用FastText來學(xué)習(xí)詞級(jí)雙語詞典。請(qǐng)注意,這種方法非常簡單,僅需要給模型一個(gè)起點(diǎn)即可。
整個(gè)框架在下面的流程圖中給出。
本文解讀了一種可以執(zhí)行無監(jiān)督機(jī)器翻譯任務(wù)的新技術(shù)。它使用多個(gè)不同的損失改進(jìn)單個(gè)任務(wù),同時(shí)使用對(duì)抗式訓(xùn)練增強(qiáng)對(duì)體系結(jié)構(gòu)行為的約束。