揭秘谷歌翻譯背后的技術突破:序列到序列學習

jopen 8年前發布 | 26K 次閱讀 Google

我們都知道并且喜歡使用 Google 翻譯,這個網站可以瞬時翻譯 100 種不同的人類語言,就好像有魔法一樣。他甚至存在于我們的手機和智能手表上面

Google 翻譯背后的科技被稱為機器翻譯。它改變了世界,在本來根本不可能的情況下讓(不同語言的)人們完成了溝通。

但我們都知道,在過去的 15 年里,高中學生已經使用 Google 翻譯...額 ... 協助他們完成他們的西班牙語作業。這已經不是新聞了…?

揭秘谷歌翻譯背后的技術突破:序列到序列學習

事實證明,在過去兩年,深度學習已經完全改寫了我們的機器翻譯方法。那些對語言翻譯一無所知的深度學習研究人員正在利用一個個相對簡單的機器學習解決方案,來打敗世界上最好的專家建造的語言翻譯系統。

這一突破背后的技術被稱為序列到序列學習sequence to sequence learning。這是一項非常強大的技術,被用于解決許多種類的問題。在我們看到它如何被用于翻譯之后,我們還將學習這個算法是怎樣用來編寫 AI 聊天機器人和描述圖片的。

我們開始吧!

讓計算機翻譯

那么我們該如何編寫代碼,才能讓計算機翻譯人類的語言呢?

最簡單的方法,就是把句子中的每個單詞,都替換成翻譯后的目標語言單詞。這里有一個簡單的例子,把西班牙語逐字翻譯成英語:揭秘谷歌翻譯背后的技術突破:序列到序列學習

我們只是用匹配的英語單詞替換每個西班牙單詞。

這很容易實現,因為你所需要是一本字典來查找每個單詞的翻譯。但結果并不好,因為它忽略了語法和上下文的聯系。因此,下一件你可能要做的事,就是開始添加特定語言規則以改進結果。例如,你可能將兩個常用詞翻譯為詞組。你可能互換名詞和形容詞的順序,因為他們在西班牙語中以相反的順序出現:揭秘谷歌翻譯背后的技術突破:序列到序列學習

這真的有效!如果我們就繼續添加更多的規則,直到我們可以應對每一部分語法,我們的程序應該就能夠翻譯任何句子了,對吧?這就是最早的機器翻譯系統的工作原理。語言學家提出了許多復雜的規則,并逐一編程實現。一些世界上最聰明的語言學家在冷戰期間辛勤努力了多年,才創建出了一些更容易理解俄羅斯人交流的翻譯系統。

不幸的是,這種套路只對簡單問題適用,比如說像天氣預報這樣結構簡單的文檔。它對于真實世界的文字來說并不可靠。問題是,人類語言并不總是遵循固定的規則。人類語言充滿了各種特殊情況,區域差異,或者干脆就不按套路出牌(#‵′)凸。我們說英語的方式更多地受到幾百年前入侵的人的影響,而不是由坐下來定義語法規則的人。

利用統計數據使計算機更好地翻譯

在基于規則的系統失效之后,一些新的翻譯方法被開發出來了,他們基于概率和統計的模型而不是語法規則。建造一個基于統計的翻譯系統需要大量的訓練數據,其中完全相同的文本被翻譯成至少兩種語言。這種雙重翻譯的文本稱為平行語料庫 parallel corpora。18 世紀的科學家以同樣的方式在羅塞塔石碑上面從希臘語中找出埃及象形文字。(譯者注:羅塞塔石碑,高 1.14 米,寬 0.73 米,制作于公元前 196 年,刻有古埃及國王托勒密五世登基的詔書。石碑上用希臘文字、古埃及文字和當時的通俗體文字刻了同樣的內容,這使得近代的考古學家得以有機會對照各語言版本的內容后,解讀出已經失傳千余年的埃及象形文之意義與結構,而成為今日研究古埃及歷史的重要里程碑)以同樣的方式,計算機可以使用平行語料庫猜測如何將文本從一種語言轉換為另一種語言。

幸運的是,有很多雙重翻譯的文本已經存在在世界的各個角落。例如,歐洲議會將其訴訟程序翻譯成 21 種語言。因此,研究人員經常使用這些數據來幫助建造翻譯系統。

揭秘谷歌翻譯背后的技術突破:序列到序列學習

訓練數據通常令人興奮!但這只是無數條政府文件而已...

用概率的思維思考

統計翻譯系統的根本不同,在于它們試圖生成不止一個精確的翻譯。相反,他們生成成千上萬種可能的翻譯,然后他們按照可能最正確的給這些翻譯排名。他們通過與訓練數據的相似性來估計有多“正確”。以下是它的工作原理:

第 1 步:將原始句子分成塊

首先,我們將我們的句子分成簡單的塊,每一塊都可以輕松翻譯:揭秘谷歌翻譯背后的技術突破:序列到序列學習

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

接下來,我們將翻譯每塊文字,我們將通過尋找我們數據庫中所有人類翻譯過的相同詞塊來完成我們的翻譯。

要著重注意的是,我們不只是在一本簡簡單單的翻譯字典中查找這些詞塊。相反,我們看到是真實的人在真實的句子中如何翻譯這些相同的詞。這有助于我們捕獲到在不同語境中所有不同的表達方式:揭秘谷歌翻譯背后的技術突破:序列到序列學習

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

這些可能的翻譯中的有一些會比其他翻譯更頻繁地使用。根據我們訓練數據中每個翻譯出現的頻率,我們可以給它設定一個分數。例如,有人說“Quiero”更多的時候是指“我想要”而不是“我嘗試”。所以,我們可以使用我們訓練數據中 “Quiero”被翻譯成“我想要”的頻率,給“我想要”這個翻譯更多的權重。

第 3 步:生成所有可能的句子,找到最有可能的那句

接下來,我們將使用這些詞塊的每種可能翻譯來組合生成一堆可能的句子。

從第二步中列出的翻譯過的詞塊中,我們可以通過不同組合方式生成將近2,500 個不同的句子。下面是一些例子:

揭秘谷歌翻譯背后的技術突破:序列到序列學習

但在真實世界中,因為有不同的語序和詞塊分解方法,所以實際上有更多可能的詞塊組合:

揭秘谷歌翻譯背后的技術突破:序列到序列學習

現在需要掃描所有這些生成的句子,找到那個聽起來“最像人話”的句子。

為此,我們將每個生成的句子與來自英語書籍和新聞故事的數百萬個真實句子進行比較。我們擁有的英語文本越多越好。

我們采用這種可能的翻譯:

揭秘谷歌翻譯背后的技術突破:序列到序列學習

很可能沒有人用英語寫過這樣的句子,所以它不會與我們的數據庫任何句子非常相似。我們給這個可能的翻譯設定一個低概率的得分。

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

揭秘谷歌翻譯背后的技術突破:序列到序列學習

這個句子和我們的訓練集中的句子很類似,所以它將獲得一個高概率的得分。

在嘗試過所有可能的句子之后,我們會選擇那個,既是最有可能的詞塊翻譯,又與真實英語句子最相似,的句子。

我們最后的翻譯將是“

揭秘谷歌翻譯背后的技術突破:序列到序列學習

我想去最漂亮的海灘。”不錯!

有里程碑意義的統計機器翻譯

當有足夠多的訓練數據的時候,統計機器翻譯系統的性能要優于基于語言規則的系統。 Franz Josef Och 基于這些想法并做出了改進,并在 21 世紀初使用它們構建了 Google 翻譯。機器翻譯終于可以被全世界使用。

早期的時候,基于概率翻譯的“愚蠢”方法居然比語言學家設計規則系統做的更好,這讓每個人都感到驚訝。這導致了 80 年代的時候,研究人員會(有點刻薄的)說:“每當我炒了一個語言學家魷魚的時候,我的翻譯準確度就會上升。” Frederick Jelinek

統計機器翻譯的局限性

雖然統計機器翻譯系統效果還不錯,但是他們難于構建和維護。每一對需要翻譯的新語言,都需要專業人士對一個全新的多步驟“翻譯流水線”進行調試和修整。

因為構建這些不同的流水線需要做太多工作,所以我們必須進行權衡。如果你要用 Google 翻譯把格魯吉亞語翻譯成泰盧固語(印度東部德拉維拉語言),那么作為一個中間步驟,它必須先翻譯成英語。因為并沒有太多格魯吉亞到泰盧固語的翻譯需求,所以在這一對語言上投入太多并沒有太大意義。相比于英語翻譯到法語,它可能會使用一個更低級的“翻譯流水線”。

如果我們能讓計算機為我們做所有令人討厭的開發工作,這不更好么?

讓電腦翻譯的更好——無需昂貴的專家們

機器翻譯的核心是一個黑盒系統,它通過查看訓練數據,自己就可以學習如何翻譯。使用統計機器翻譯,人們仍然需要建立和調整多步驟的統計模型。

2014 年,KyungHyun Cho 的團隊取得了突破。他們發現了一種應用深度學習來構建這種黑盒系統的方法。他們的深度學習模型采用平行語料庫,并使用它來學習如何在無任何人為干預的情況下在這兩種語言之間進行翻譯。

兩個宏偉的方法使這成為可能 - 循環神經網絡和編碼。通過巧妙地結合這兩個想法,我們可以建立一個能夠自學的翻譯系統。

循環神經網絡

我們已經在第 2 章討論過了循環神經網絡,讓我們快速回顧一下。

一個常規(非循環)神經網絡是泛型機器學習算法,接收一序列數字并計算結果(基于先前的訓練)。神經網絡可以用作一個黑盒子,來解決很多問題。例如,我們可以基于房子的屬性,使用神經網絡來計算房屋的近似價格:揭秘谷歌翻譯背后的技術突破:序列到序列學習

但是像大多數機器學習算法一樣,神經網絡是無狀態(Stateless)的。你輸入一序列數字,神經網絡計算并輸出結果。如果再次輸入相同的數字,它總是計算出相同的結果。它沒有進行過的計算的記憶。換句話說,2 + 2 總是等于4。

一個循環神經網絡(Recurrent Neural Network 或簡稱 RNN)是一個稍微改進過的神經網絡的版本,區別是 RNN 先前的狀態是可以被當做輸入,再次帶入到下一次計算中去。這意味著之前的計算結果會更改未來計算的結果!揭秘谷歌翻譯背后的技術突破:序列到序列學習

人類痛恨他:一個黑科技就讓機器變得更聰明!

我們為什么要這樣做?無論我們上次計算結果是什么,2 + 2 不應該總是等于 4 么?

這個技巧允許神經網絡學習數據序列中的規律。例如,基于句子的前幾個詞,你可以使用它來預測句子中下一個最有可能的單詞是什么:揭秘谷歌翻譯背后的技術突破:序列到序列學習

實現智能手機輸入法的“自動更正”的方法之一…

當你想要學習數據中的規律時,RNN 將會非常有用。因為人類語言其實只是一個大而復雜的“規律”,自然語言處理的各個領域越來越多地使用 RNN。

如果你想了解更多關于 RNN,你可以閱讀第 2 章,我們使用了 RNN 來生成一本海明威寫作風格的假書,然后使用同一個 RNN 生成了超級馬里奧兄弟的游戲關卡。

編碼

我們需要回顧的另一個想法是編碼 Encoding。在第 4 章中作為臉部識別的一部分,我們談到了編碼。為了解釋編碼,讓我們稍作調整,了解一下如何用電腦區分兩個人。

當你試圖用電腦區分兩張臉時,你從每張臉收集不同的測量值,并與其他臉部比較這些測量值。例如,我們可以測量耳朵的大小或眼間的間距,比較兩個圖片的測量值以確定他們是否是同一個人。

你可能已經從觀看熱門影視劇 CSI 當中對這個想法耳熟能詳了。

把面部特征轉換為一系列測量值的想法就是編碼的例子之一。我們獲取到原始數據(面部圖片),并將其轉換為代表這張臉的一系列測量值(編碼)。

但是像我們在第 4 章中看到的,我們不必提出一個具體的面部特征列表來測量我們自己。相反,我們可以使用神經網絡,讓它自動從面部生成測量值。找出哪些測量值能夠區分兩個相似的人,計算機在這方面比我們做的更好:

揭秘谷歌翻譯背后的技術突破:序列到序列學習

這些是由神經網絡產生的面部特征測量值,訓練后的該神經網絡可以保證不同的數字代表了不同人的面部。

這是我們的編碼。它讓我們用簡單的東西(128 個數字)代表非常復雜的東西(一張臉的圖片)。現在比較兩張臉更加容易了,因為我們只需要比較這 128 個數字而不是比較整張臉的圖像。

你猜怎么著?我們可以用句子做同樣的事情!我們可以把任何一個句子表達成一系列獨特的編碼:這一序列數字代表的是英語句子“有趣的機器學習!”。不同的句子將由不同的數字集表示。

為了生成這個編碼,我們將句子輸入到 RNN 中,一次一個詞。最后一個詞處理之后的最終結果,就將是表示整個句子的數值:揭秘谷歌翻譯背后的技術突破:序列到序列學習

因為 RNN 具有記憶功能,能夠記住處理過得每個詞,所以它計算的最終編碼表示句子中的所有詞。

棒極了,所以現在我們有一種方法來把一個整個句子表示成一組獨特的數字!我們不知道編碼中的每個數字是什么意思,但這并不重要。只要每一句話都能由一組獨特的數字標識出來,那么我們就不需要準確地知道這些數字是如何生成的。

讓我們開始翻譯吧!

好的,所以我們知道怎樣使用 RNN 去個一句話編碼并生成一組獨特的數字。它有什么用呢?事情從這兒開始變得酷炫了!

如果我們使用兩個 RNNs 并將它們首尾相連呢?第一個 RNN 可以給句子生成編碼。然后,第二 RNN 遵循相反的邏輯,解碼得到原始句子:揭秘谷歌翻譯背后的技術突破:序列到序列學習

當然,編碼然后再解碼并得到原始語句并沒有太大用處。但是如果(這里是問題的關鍵),我們訓練第二個 RNN,使它解碼成西班牙語而不是英語,這會怎樣?我們可以使用平行語料庫訓練數據來訓練它:揭秘谷歌翻譯背后的技術突破:序列到序列學習

就像這樣,我們有一個通用的方法,將一序列英語單詞轉換成同樣的西班牙語單詞序列!

這是一個強有力的想法l這種方法主要受限于你擁有的訓練數據量和你可以投入的計算機生產力。機器學習研究人員僅僅在在兩年前發明了這個方法,但它已經表現的和統計機器翻譯系統一樣好了,而后者花了 20 年時間才開發完善。

l 這不依賴于任何關于人類語言規則的了解。算法自己計算出這些規則。這意味著你不需要專業人士來調整“翻譯流水線”的各個步驟,計算機為你把這個做好了。

l 這種方法適用于幾乎任何種類的序列到序列 sequence-to-sequence 問題!而且事實證明,許多有趣的問題都實際上是序列到序列的問題。繼續閱讀了解其他你可以做的酷炫的事!

注意,我們忽略了一些處理真實數據會碰到的問題。例如,如何處理不同長度的輸入和輸出?這還需要一些額外的工作(請參見 bucketing 和 padding)。非常用詞翻譯也是一個問題。

構建你自己的序列到序列翻譯系統

如果你想建立自己的語言翻譯系統,這兒有一個包括可以在英語和法語之間翻譯的 TensorFlow 的 demo。然而,這并不是給膽小鬼或預算有限的人準備的。這仍然是一項新技術,并且資源有限。即使你有一臺帶有高級顯卡的高級電腦,可能也需要連續一個月的時間來訓練你自己的語言翻譯系統。

此外,序列到序列語言翻譯技術正在及快速地改進,以至于難以跟上。許多最近的改進(如添加注意機制 attention mechanism 或上下文跟蹤 tracking context)顯著改善了翻譯結果,但這些發展太過前沿,以至于他們甚至還沒有維基百科頁面。如果你想做認真的去做任何序列到序列學習,隨著技術的發展,你需要持續保持更新。

序列到序列模型的無窮力量

那么,我們還能用序列到序列模型做什么呢?

大約一年前,Google 的研究人員表示,你可以使用序列到序列模型來建造 AI 機器人。這個想法是如此簡單,并且令人震驚的是,它真的有效。

首先,他們獲取了一些 Google 員工和 Google 技術支持小組之間的聊天記錄。然后他們訓練了序列到序列模型,其中輸入的句子就是雇員的問題,而技術支持團隊的回復是該句子的“翻譯”。揭秘谷歌翻譯背后的技術突破:序列到序列學習

當用戶與機器人進行交互時,他們將使用該系統“翻譯”每個用戶的消息以獲得機器人的響應。

他們最終得到的是一個半智能機器人,(有時)可以回答真正的技術支持問題。下面是一部分用戶和機器人之間的對話示例:

人:連接被拒絕或類似的東西

機器:我可以知道你連接的網絡連接的版本嗎?

人:我不確定我知不知道

機器:是網絡連接提示任何用戶證書?

人類:是的

機器:你現在在家還是在工作?辦公室?

人:我在家

機器:試試這個。 goto <URL redacted>頁面,然后輸入您的姓名和密碼

人類:完成

機器:嘗試使用<NAME redacted>登錄,然后檢查其是否正常工作

人類:是的,現在它在工作!

機器:棒極了。還有什么我可以幫助你的?

他們還試圖建立一個基于數百萬部電影字幕的聊天機器人。他們的想法是,使用電影角色之間的對話作為一種訓練機器人像人一樣說話的方式。輸入句子是一名角色的一句話,“翻譯”是另一名角色在對話里回應他的內容:

揭秘谷歌翻譯背后的技術突破:序列到序列學習

他們得到了很有意思的結果。機器人不僅僅像一個人,更是顯示出了一點點智能化:

人類:我的名字是 david。我的名字是什么?

機器:david。

人:我的名字是約翰。我的名字是什么?

機器:約翰。

人類:你是領導還是追隨者?

機器:我是領導者。

人類:你是追隨者還是領導者?

機器:我是領導者。

這只是可能性的開始。我們將不局限于將一個句子轉換成另一個句子,同樣,我們制作一個圖像到序列的模型,它可以將圖像轉換為文本!

Google 的另一個團隊通過將第一個 RNN 替換為卷積神經網絡(如我們在第 3 章中所了解的那樣)。這允許輸入是圖片而不是句子,其余的工作基本相同:揭秘谷歌翻譯背后的技術突破:序列到序列學習

就像這樣,(只要我們有很多很多的訓練數據)我們就可以把圖片變成單詞!

Andrej Karpathy 把這個想法進行了拓展,以構建一個通過分別處理圖像的多個區域,來詳細描述圖像的系統:揭秘谷歌翻譯背后的技術突破:序列到序列學習

Andrej Karpathy 論文中的圖片

這個想法使得我們可以構建一個,能夠按照奇怪的要求找到特定圖片的圖片搜索引擎,甚至有研究人員正在研究相反的問題,僅僅基于文本描述產生一個完整的圖片!

從這些例子,你可以開始想象的各種可能性。 到目前為止,序列到序列應用在從語音識別到計算機視覺各個領域。 我猜,明年會有更多的應用。

來自: 混沌巡洋艦

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!