深度學習正被廣泛地運用於各項日常任務當中,尤其是涉及到某種程度「 人性化」的領域,例如,影像辨識。與其他機器學習演算法不同,深度網路最突出的特點是隨著獲得資料的增多,其效能可以不斷提高。因此,如果可以獲得更多的數據,那麼預期的效能也會變得更好。
深度網路最擅長的任務之一是機器翻譯。目前,它是能夠完成此任務的最先進的技術,並且具有足夠的可行性,甚至Google翻譯(Google Translate)也在使用它。在機器翻譯中,需要句子層級(sentence-level)的平行資料對模型進行訓練,也就是對於原始語言中的每個句子來說,都需要是目標語言中被翻譯的語言。不難想像為什麼這會成為一個問題。因為,對於一些語言對來說,很難獲得大量的數據(因此可以使用深度學習的這種能力)。
本文是如何建構的
本文是基於Facebook近期發表的一篇名為「僅使用單語語料庫進行的無監督機器翻譯」。本文並沒有完全遵循論文的結構,我加入了一些自己的解讀,進而讓文章更加通俗易懂。
閱讀本篇文章需要具備一些最關於神經網路的基本知識,例如損失函數、自動編碼器等。
機器翻譯的問題
如上所述,在機器翻譯中使用神經網路的最大問題是,它需要兩種語言的句子對資料集。它適用於英語和法語等被廣泛使用的語言,而對於其他語言的句子對則不適用。如果語言對資料可用,那麼這將成為一個受監督性的任務。
解決方案
這篇論文的作者想出瞭如何將這項任務轉換為無監督任務的方法。在這項任務中,唯一需要的是兩種語言中每一種語言的任兩個語料庫,如任何一部英語小說和任何一部西班牙語小說。需要注意的一點是,這兩部小說不一定是相同的。
從最直觀的角度來講,作者發現了該如何學習一種介於兩種語言之間的潛在空間(latent space)的方法。
自動編碼器概述
自動編碼器是一種用於無監督任務的廣泛的神經網路類別。它的工作原理是重新創建一個和最初輸入相同的輸入。完成這項操作的關鍵是網路中間有一個名為瓶頸層(bottleneck layer)的網路層。這個網路層被用來捕捉所有關於輸入的有用信息,並摒棄無用資訊。
概念型自動編碼器,中間模組是儲存壓縮表示的瓶頸層
簡言之,在瓶頸層中,瓶頸層中輸入(現在由編碼器轉換)所在的空間稱為潛在空間(latent space)。
降噪自動編碼器
如果一個自動編碼器被調教成完全按照輸入的方式重建輸入,那麼它可能什麼都做不了。在這種情況下,輸出將得到完美的重建,但是在瓶頸層中沒有任何有用的特性。為了解決這個問題,我們使用了降噪自動編碼器。首先,實際輸入因為增加了一些雜訊而受到輕微幹擾。然後,使用網路重建原始影像(並非含噪版本)。這樣一來,透過學習什麼是雜訊(以及其真正有用的特徵是什麼),網路可以學習影像的有用特徵。
一個降噪自動編碼器的概念實例。利用神經網路對左圖進行重建,產生右圖。在這種情況下,綠色的神經元共同構成了瓶頸層
為什麼要學習一個共同的潛在空間?
潛在空間可以捕捉資料的特徵(在我們所舉的例子中,資料就是句子)。因此,如果有可能獲得一個空間,即當輸入語言A時,就會產生與輸入語言B相同的特徵,那麼我們就有可能在它們之間進行翻譯。由於模型已經擁有了正確的“特徵”,因此由語言A的編碼器進行編碼,由語言B的解碼器進行解碼,這將使二者進行有效的翻譯工作。
或許正如你所想到的那樣,作者利用降噪自動編碼器學習一個特徵空間。他們還想出了該如何使自動編碼器學習一個共同潛在空間的方法(他們將其稱之為一個對其潛在空間(aligned latent space)),進而執行無監督的機器翻譯。
語言中的降噪自動編碼器
作者用降噪編碼器以一種無監督的方式學習特徵。他們定義的損失函數為:
方程式1.0 自動去燥編碼器損失函數
解讀方程式1.0
I是語言(對於這一設定,可能有兩種語言)。 X是輸入,C(x)是為x添加雜訊後的結果。我們很快就會得到噪聲所創建的函數C。 e()是編碼器,d()是解碼器。最後一項Δ(x hat,x)是標記級(token level)的交叉熵誤差值總和。由於我們有一個輸入序列,並且我們得到了一個輸出序列,因此我們要確保每個標記(token)的順序都是正確的。因此使用這種損失函數。我們可以將它視為多標籤分類,其中第i個輸入的標記與第i個輸出標記進行比較。其中,標記(token)是一個不能被進一步破壞的基本單位。在我們的例子中,標記(token)是一個單字。方程式1.0是一個損失函數,使得網路最小化輸出(當給定一個雜訊輸入時)與原始、未受影響的句子之間的差別的損失函數。
□與~的符號表示
□是我們期望的表示,在這種情況下,這意味著輸入的分佈取決於語言l,並且採用損失的平均值。這只是一個數學形式,運算過程中的實際損失(交叉熵總和)將如往常一樣。
這個特殊符號〜意味著「來自機率分佈」。
在本文中我們不詳細討論這個細節,你可以在Deep Learning Book一文的第8.1章中詳細了解這個符號。
如何添加噪聲
對於圖像而言,只需在像素上添加浮點數就可以增加噪聲,而對於語言而言,則需採用其他方法。因此,作者開發了自己的系統來製造噪音。他們把他們的雜訊函數表示為C()。它將句子作為輸入,並輸出該句子的含噪版本。
有兩種不同的方法添加雜訊。
首先,可以簡單地以P_wd的機率從輸入中刪除一個單字。
其次,每個單字都可以使用下面這個限制進行原始位置的移位:
#
##σ表示第i個標記的移位位置。因此,方程式2.0意味著:「一個標記(token)可以最多向左或向右移動k個標記(token)的位置」作者將K值設為3,將P_wd值設為1 。 跨域訓練為了學習兩種語言之間的翻譯,應該透過一些處理將輸入句子(語言A)對應到輸出句子(語言B)。作者將這個過程稱為跨域訓練(cross domain training)。首先,輸入句子(x)被取樣。然後,使用先前迭代中的模型(M())產生翻譯後的輸出(y)。把它們放在一起,我們便得到了y=M(x)。隨後,使用上述相同的雜訊函數C()幹擾y,得到C(y)。語言A的編碼器對這個被幹擾的版本進行編碼,語言B的解碼器對語言A編碼器的輸出進行解碼,並重新建構一個純淨版的C(y)。使用與方程式1.0相同的交叉熵誤差值總和(sum of cross entropy error)對模型進行訓練。 運用對抗式訓練學習一個共同的潛在空間到目前為止,還沒有提到如何學習共同潛在空間。上述的跨域訓練有助於學習一個相似空間,但需要一個更強的限制來推動模型學習一個相似的潛在空間。 作者使用對抗式訓練。他們使用了另一個模型(稱為鑑別器),該模型接受每一個編碼器的輸出,並預測編碼後的句子屬於哪種語言。然後,從鑑別器中提取梯度,並對編碼器進行訓練,以欺騙鑑別器。這在概念上與標準的GAN(生成對抗網路)沒有什麼不同。鑑別器接收每個時間步的特徵向量(因為使用了RNN),並預測它來自哪種語言。 將它們結合在一起將上述3種不同的損失(自編碼器損失、翻譯損失和鑑別器損失)相加,所有模型的權重同時更新。 由於這是一個序列到序列的問題,因此作者使用了一個長短期記憶網絡(LSTM),需要注意的是,這裡存在兩個基於LSTM的自動編碼器,每種語言各含一個。 在較高層級上,訓練這個架構需要三個主要步驟。它們遵循一個迭代訓練過程。訓練循環過程看起來有點像這樣:1.使用語言A的編碼器和語言B的解碼器獲得翻譯。 2.訓練每個自動編碼器,使其能夠在給定一個損壞的句子時重新產生一個未損壞的句子。 3.透過破壞步驟1中獲得的翻譯來改進翻譯並重新建立翻譯。對於這一步,語言A的編碼器和語言B的解碼器一起進行訓練(語言B的編碼器和語言A的解碼器一起訓練)。 值得注意的是,即使步驟2和步驟3被分開列出,權重也會一起更新。 如何啟動這個框架如上所述,該模型使用先前的迭代過程中自身的翻譯來提高其翻譯能力。因此,在循環過程開始之前,擁有一定翻譯能力是很重要的。作者使用FastText來學習詞級雙語字典。請注意,這種方法非常簡單,只需給模型一個起點。
整個框架在下面的流程圖中給出
#整個翻譯框架的高層次工作
本文解讀了一種可以執行無監督機器翻譯任務的新技術。它使用多個不同的損失來改善單一任務,同時使用對抗式訓練來增強對體系結構行為的限制。