使用機器學習翻譯語言:神經網路和seq2seq為何效果非凡?

機器之心發表於2016-08-25

此篇是系列文章 machine learning is fun 的第五部分,講解了深度學習和 sequence-to-sequence 在機器翻譯中的應用。此係列之前的文章機器之心也做過傳播(如何掌握Facebook自動人臉識別技術?這篇文章為你提供生動指南)。


我們都知道而且喜歡谷歌翻譯(Google Translate),這個網站可以幾乎實時地在 100 多種不同的人類語言之間互相翻譯,就好像是一種魔法。我們還可以通過手機和智慧手錶使用谷歌翻譯:

谷歌翻譯背後的技術被稱為機器翻譯(Machine Translation),它已經在通過幫助人們互相交流而改變了世界。


但我們知道 15 年來,高中學生已經使用谷歌翻譯……呃……輔助他們的西班牙語作業。這還算什麼新鮮事嗎?

事實上,過去兩年來,深度學習已經改寫了我們進行機器翻譯的方法。對語言翻譯一竅不通的深度學習研究者拿出的相對簡單的機器學習解決方案正在擊敗由最好的人類專家打造的語言翻譯系統。

這種突破背後的技術被稱為序列到序列學習(sequence-to-sequence learning)。這是一種可被用來解決許多型別問題的非常強大的技術。在我們瞭解了該技術可以如何被用於翻譯之後,我們也將理解該演算法如何被用於編寫人工智慧聊天機器人和描述圖片。

那就開始吧!

讓機器做翻譯

所以為了讓計算機能翻譯人類語言,我們該如何對其程式設計呢?


最簡單的方法是使用目標語言中對應的詞替換要翻譯的句子中的每個詞。下面是一個西班牙語到英語的逐詞翻譯的簡單例子:


我們只是簡單地將每個西班牙語詞用對應的英語詞替換了。


這是很容易做到的,因為這麼做只需要一本可以查詢每個詞的翻譯的詞典。但得到的結果非常糟糕,因為其沒有考慮任何語法和上下文。


所以下一步可能就是新增一些特定語言的規則以改善所得到的結果。比如說,也許需要將常見的 2 詞短語作為單個片語進行翻譯。另外你也許還要交換名詞和形容詞的順序,因為它們在西班牙語中的順序和在英語中的是相反的:


這種方法有用!如果我們不斷增加更多規則,直到我們可以處理語言的每一部分,那我們的程式應該就能夠翻譯任何句子了,對嗎?


這就是最早期的機器翻譯系統的工作方式:語言學家想出複雜的規則,然後將它們逐一程式設計到系統中。在冷戰期間,為了創造出能夠更輕鬆地解讀蘇聯通訊的翻譯系統,世界上一些最聰明的語言學家辛苦工作了很多年。


不幸的是,這種方法只對天氣報導這樣簡單的和結構平直的文件有效。對於真實世界文件,它沒法可靠地工作。


其問題在於人類語言並不遵循一組固定的規則。人類語言中充滿了特例、地區差異、以及純粹的打破規則。比起坐下來定義語法規則的人,影響我們說英語方式更多的是幾百年前入侵英國的人。


使用統計學讓計算機更好地翻譯

在基於規則的系統失敗之後,人們開始使用基於概率和統計學(而非語法規則)的模型開發新的翻譯技術。


打造一個基於統計學的翻譯系統需要大量訓練資料,其中包含了同樣的文字在至少兩種語言中的表達。這種對應的翻譯文字被稱為平行語料庫(parallel corpora)。與 1800 年代科學家使用羅塞塔石碑(Rosetta Stone)根據希臘語解讀古埃及象形文字的方法類似,計算機可以使用平行語料庫猜測將一種語言的文字轉換成另一種語言的方式。


幸運的是,在很多奇怪的地方存在著大量這種幾種語言的對應文字。比如說,歐洲議會(European Parliament)會將他們的程式( proceedings)翻譯成 21 種語言。所以研究者可以使用這些資料來幫助開發翻譯系統。


訓練資料這麼激動人心!但這不過是幾萬億行枯燥的政府公文而已……

以概率的方式思考

使用統計翻譯系統的根本不同之處在於它們不會嘗試生成一個確切的翻譯。相反,它們會生成數千個可能的翻譯,然後根據它們正確的可能性對這些翻譯進行排序。它們通過檢查翻譯與訓練資料的相似程度來確定其的「正確」程度。下面是它的工作方式:


第 1 步:將原句子分解成塊(chunk)

首先,我們將我們的句子分解成簡單的塊,其中每一塊都可以簡單地翻譯出來:

第 2 步:找到每一塊的所有可能的翻譯

接下來,我們會檢查訓練資料中人類對這一詞塊的所有翻譯,然後翻譯每一塊。


有必要強調我們不僅是在簡單的翻譯詞典中查詢這些塊,我們還會看真實的人是如何翻譯真實世界中的這些同樣的詞塊的。這可以幫助我們獲取它們在不同上下文中的不同使用方式:

即使最常見的短語也有很多可能的翻譯方式


其中一些可能的翻譯比另一些更常用。基於我們的訓練資料集中每種翻譯出現的頻率,我們可以對其進行評分。


比如說,當人們說「Quiero」時,表達「I want」的意思比「I try」的意思要常見得多。這樣我們就可以根據訓練資料中「Quiero」表示「I want」的頻率給予這種翻譯更高的權重( weight)。

第 3 步:生成所有可能的句子,然後找到其中最有可能的一個

接下來,我們將使用這些塊的每種可能的組合來生成一堆可能的句子。光是從第 2 步我們列出的塊翻譯中,我們就可以通過不同的塊組合方式生成近 2500 個不同的句子變體!下面是一些例子:


I love | to leave | at | the seaside | more tidy.
   I mean | to be on | to | the open space | most lovely.
   I like | to be |on | per the seaside | more lovely.
   I mean | to go | to | the open space | most tidy.


但在真實世界系統中,塊的可能組合方式甚至會更多,因為我們也會嘗試不同的詞序和句子中不同的詞塊劃分方式:


I try | to run | at | the prettiest | open space.
   I want | to run | per | the more tidy | open space.
   I mean | to forget | at | the tidiest | beach.
   I try | to go | per | the more tidy | seaside.


現在需要掃描所有生成的句子以找到其中看起來「最人類」的翻譯。


要做到這一點,我們需要將生成的句子和來自英語書籍和新聞故事的數百萬個真實句子進行比較。我們所能獲取的英語文字越多,效果就會越好。


以下面這個可能的翻譯為例:


I try | to leave | per | the most lovely | open space.


很可能之前從沒有人用英語寫過這樣的句子,所以它與我們資料集中的任何句子都不會非常相似。我們給予這個可能的翻譯一個較低的概率得分。


但再看下面這個可能的翻譯:


I want | to go | to | the prettiest | beach.


這個句子將與我們的訓練集中的一些東西很相似,所以它會得到一個高概率得分。


在嘗試了所有可能的句子之後,我們選出的句子將既包含最有可能的塊翻譯,也在整體上與真實的英語句子最相似。


我們最後的翻譯結果將會是「I want to go to the prettiest beach.」還不錯!


統計機器翻譯是一個巨大的里程碑


如果有足夠的訓練資料,統計機器翻譯系統的表現就將遠遠優於基於規則的系統。Franz Josef Och 改進了這些思想,並在 2000 年代早期使用它們開發出了谷歌翻譯。這個世界終於可以使用機器翻譯了!


這種基於概率的「愚蠢的」翻譯方法效果比語言學家設計的基於規則的系統更好,在早期時所有人都對此感到驚訝。這帶來了 80 年代在研究者之間廣為流傳的一句話:


每次我開除一個語言學家,我的準確度就會上升。


    — Frederick Jelinek 

統計機器翻譯的侷限

統計機器翻譯系統效果很好,但它們的開發和維護卻相當複雜。你想翻譯的每一組語言對都需要專家對一個新的多步驟翻譯流程進行調整和優化。


因為開發這些不同的翻譯流程所需的工作實在太多了,所以必須要做出一些權衡。如果你想讓谷歌將喬治亞語翻譯成泰盧固語,它必須先在內部將其翻譯成英語作為中間步驟,因為世界上並沒有那麼多的喬治亞語到泰盧固語的翻譯,在這個語言對的互相翻譯上投入巨資是不明智的。而如果你想做的是更常見的法語到英語的翻譯,你所使用的翻譯流程就可能會更簡單一點。


如果我們讓計算機把所有這些煩人的開發工作都做了,不是很贊嗎?

讓計算機更好地翻譯——不再需要所有這些昂貴的人

機器翻譯的聖盃是能自己學習如何翻譯的黑箱系統(black box system)——只需要檢視訓練資料。即使有了統計機器翻譯,還是需要人類來開發和調整多步驟統計模型(multi-step statistical model)。


2014年,Kyung Hyun Cho 的團隊取得了突破。他們發現了一種運用深度學習來建立黑箱系統的方法。他們的深度學習模型利用了一個平行語料庫來學習如何在沒有人的介入下翻譯兩種語言。


該方法的背後有兩個關鍵思路——迴圈神經網路和編碼。我們可以結合這兩種方法建立一種自學習翻譯系統。


迴圈神經網路

我們在第 2 部分已經討論過迴圈神經網路,現在快速回顧一下。


一個常規的(非迴圈)神經網路是一種通用的機器學習演算法——輸入一個數字列表,並計算出結果(基於之前的訓練)。神經網路能作為一個黑箱來解決大量問題。比如,我們可以用它來基於一座房子的屬性計算房子的大概價值。


但是像大多數機器學習演算法一樣,神經網路不會儲存使用資訊。你讓輸入一條數字列表,然後這個神經網路就能計算出結果。如果你在給它看同樣的數字,它還會計算出同樣的結果。這不是對之前的結果的記憶,換句話說,2+2 總是等於4。


一個迴圈神經網路(RNN)是一種稍稍調整過的神經網路,在RNN 中,之前的網路狀態是下一次計算的輸入之一  ,也就是說之前的計算會改變未來的計算結果。


人類討厭他:一種讓機器更聰明的奇怪小把戲!


為什麼我們想要這麼做?難道說不論我們最後計算的是什麼,2+2不應該總是等於 4 嗎?


這種技巧能讓神經網路學習資料序列中的模式。例如,你能用它來基於一句話中前面幾個詞來預測後面最有可能的那個詞。


這是智慧手機鍵盤應用實現「自動更正」的一種方式。


任何時間你都可以用 RNN 來學習資料中的模式。因為人類語言就是一個大且複雜的模式,RNN 被越來越多地用於自然語言處理的多個領域。


編碼(Encodings)

另一個需要回顧的是編碼,我們在 Part 4 中的臉部識別中討論過。要解釋編碼,讓我們先繞道看看如何用一臺計算機來分辨兩個人。


當你用計算機區分兩個不同的人時,你可以收集每張臉的不同度量,並使用這些度量來對臉進行比較。例如,我們可以測量每隻耳朵的大小、眼間距,然後比較測量結果來判定他們是否是同一個人。


你可能已經在《犯罪現場調查》這種熱播偵探節目中熟悉了這個方法:


我非常喜歡這個來自《犯罪現場調查》的蠢蠢的 gif,所以我還會使用它,因為它能清楚的證明這個方法,雖然完全可能沒有道理。


將一張臉轉變成測量的方法是一種編碼的方法。我們輸入原始資料(一張臉的影像)然後將它轉換成一系列測量資料來表示它(編碼)。


但是就像我們在 Part4 中看到的那樣,我們沒必要拿出一個特定的面部特徵列表來測量自己,用一個神經網路從一張臉上生成測量資料就可以了。在找出哪種測量能最好地區分兩個長相相似的人方面,計算機比我們做的更好。


經過訓練的神經網路生成的面部特徵測量可以用於確保不同的人臉生成不同的測量數字。


這就是編碼(encoding)。用簡單的事物(128 個數字)來表徵非常複雜的東西(一張人臉圖)。現在比較兩張不同的臉更加容易了,因為我們只要去比較每張臉的 128 個數字就行了,不需要比較整張影像。


猜猜這種方式還能做什麼?我們可以同樣的方式來處理句子!我們也可以生成一系列獨特數字的編碼來表徵每可能的不同句子:


這個數字列表表示英文句子 「Machine learning is Fun!」不同的句子可以表示成不同的資料集合。


為了生成這個編碼,我們會把這條句子放入這個 RNN 中,一次放入一個詞。最後一個詞處理後的最終結果將是代表整個句子的值:

因為這個 RNN 對通過它的每個詞都會形成一種「記憶」,它計算出來的最後編碼表徵了一條句子中的所有詞。


好,現在我們有了一種方法能夠將整個句子表示為一系列獨特的數字!我們不知道編碼中每個數字的意義, 但這並不重要。只要每個句子能夠根據自己的數字集合被識別出來,我們不需要知道這些數字具體是怎麼生成的。


讓我們開始翻譯!

我們知道了如何使用一個 RNN 將一個句子編碼為一系列獨特的數字,這對我們有什麼幫助?這裡事情才開始變得有趣!


如果我們採用兩個 RNN 並將它們端到端的連線起來會怎樣?第一個 RNN 會生成代表句子的編碼。然後,第二個 RNN 會採用這些編碼,並對這同樣的邏輯進行反向,從而再次解碼原始句子:


當然,能夠編碼且再次解碼原始語句不是非常有幫助。但如果我們能夠訓練第二個 RNN 將原英語解碼成西班牙語會怎樣呢?我們可以使用平行語料庫訓練資料對它們進行訓練:


就像這樣,我們有了一個將英語詞序列轉換為對應的西班牙語的通用方法。


這是一個有用的想法:

  • 這一方法最大的限制是你擁有的訓練資料的數量以及你所能投入的計算能力。機器學習研究者僅在兩年前才創造出了這種方法,但其表現就已經能夠比肩已經發展了 20 年的統計機器翻譯系統了。

  • 這種方法並不依賴於對人類語言規則的瞭解。演算法自己能搞清楚這些規則。這意味著你不需要專家調整翻譯流程中的每一步,計算機就能做到這些。

  • 這種方法幾乎對所有型別的序列到序列(sequence-to-sequence)問題都有效!而且事實上很多有趣的難題都是序列到序列問題。

注意我們沒有談到一些使其能在真實世界資料上有效的工作。例如,還有一項額外的工作就是處理不同長度的輸入和輸出句子。另外還有翻譯罕見詞的問題。


打造你自己的序列到序列翻譯系統

如果你想要建立自己的語言翻譯系統,這是一篇使用 TensorFlow 做英法翻譯的講解文章:https://www.tensorflow.org/versions/r0.10/tutorials/seq2seq/index.html。然而,這裡面的內容不適合於新手或者預算有限的人,該技術還很新並且需要資源。即使你有一個帶有高階視訊卡的超快計算機,可能也要花費一個月的處理時間訓練自己的語言翻譯系統。


同樣,序列到序列機器翻譯技術進展迅速,讓人難以跟上。很多近期取得的進展(像增加一個 attention mechanism 或 tracking context)極大的改進了結果,但也因為成果太新以至於連維基百科頁面都還沒有。如果你確實想使用序列到序列學習,你需要時刻與這些新研究保持同步。

序列到序列模型的強大能力

所以,我們還能使用序列到序列模型做什麼呢?


大約一年前,谷歌的研究者表示你能使用序列到序列模型開發人工智慧 bot。想法很簡單,但驚人的是它竟然有效。


首先,他們抓取了谷歌員工和谷歌技術支援團隊間的聊天日誌。然後,他們訓練一個序列到序列模型,把員工的問題作為輸入句,技術支援團隊的回答作為輸入句的「譯文」。


當使用者與該 bot 互動時,他們可以使用該系統「翻譯」使用者的每條訊息,從而得到 bot 的應答。

最終結果是一個半智慧的 bot,它可以(有時)回答真正的技術支援難題。下面是來自他們論文(https://arxiv.org/pdf/1506.05869.pdf)的一個對話樣本:


人:連線拒絕或者類似的事情
   機器:我可以知道你連線的網路連線的版本嗎?
   人:我不太確信版本是多少
   機器:網路連線是否提示需要任何使用者證書?
   人:是的
   機器:當時你是在家還是在工作?在辦公室嗎?
   人:我在家
   機器:試下這個。轉到頁,並輸入你的使用者名稱和密碼
   人:完成
   機器:試著輸入,檢查現在是否正常
   人:yes,能工作了
   機器:很好。還需要幫你做什麼嗎?


他們也嘗試基於數百萬條電影字幕建立一個聊天機器人。其思路是使用字幕間的對話訓練 bot ,使其能像人一樣講話。輸入句是一個角色的講白,「譯文」是下個角色的對白:


產生的結果真的很有趣。不只是 bot 像人一樣交談,它也展現出了一些智慧:


人:我的名字是 David,我的名字是什麼?
   機器:David
   人:我的名字是 John,我的名字是什麼?
   機器:John
   人:你是領導者還是追隨者?
   機器:領導者
   人:你是追隨者還是領導者?
   機器:領導者


這只是一切可能的開始。我們並不限制於將一個句子轉化為另一個句子。你也可以做一個 image-to-sequence(影像到序列)模型,將一個影像轉換為文字。


谷歌的另一個團隊使用卷積神經網路取代第一個 RNN 就做到了這一點。這使得輸入可以是一張圖片而非句子。剩下的工作基本一樣:


就像這樣,我們能將圖片轉化為文字內容(只要我們有大量的訓練資料)!


通過單獨處理一張圖片的多個不同區域,Andrej Karpathy 對這些思路進行了擴充,建立了一個能夠極其具體地描述圖片內容的系統。


這使得建立圖片搜尋引擎成為了可能,能夠找到匹配搜尋查詢的圖片:


也有研究者在研究其反向的問題——基於文字描述生成一張完整圖片。


從這些例子中,你就可以想象未來的可能有多大。如今,從語音識別到計算機視覺,都有著序列到序列的應用。我敢說明年將會有大量更多的應用出現。

瞭解更多

相關文章