基於PaddlePaddle的機器翻譯教程 | 深度學習基礎任務系列

2021-01-19 量子位

本文轉載自PaddlePaddle量子位 編輯 | 公眾號 QbitAI

機器翻譯(machine translation, MT)是用計算機來實現不同語言之間翻譯的技術。需要翻譯的語言通常稱為源語言(source language),翻譯成的結果語言稱為目標語言(target language)。機器翻譯即實現從源語言到目標語言轉換的過程,是自然語言處理的重要研究領域之一。

本文將帶領大家了解經典的端到端神經網絡機器翻譯Seq2Seq模型,以及如何用PaddlePaddle來訓練。如果想要實踐效果更佳的翻譯模型,請參考GitHub模型庫中Transformer實現。

Seq2Seq項目地址:https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/README.cn.md

Transformer項目地址:https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/neural_machine_translation/transformer

背景介紹

早期機器翻譯系統多為基於規則的翻譯系統,需要由語言學家編寫兩種語言之間的轉換規則,再將這些規則錄入計算機。該方法對語言學家的要求非常高,而且我們幾乎無法總結一門語言會用到的所有規則,更何況兩種甚至更多的語言。因此統計機器翻譯(Statistical Machine Translation, SMT)技術應運而生。

在統計機器翻譯技術中,轉化規則是由機器自動從大規模的語料中學習得到的,而非我們人主動提供規則。因此,它克服了基於規則的翻譯系統所面臨的知識獲取瓶頸的問題,但仍然存在許多挑戰:

人為設計許多特徵(feature),但永遠無法覆蓋所有的語言現象;難以利用全局的特徵;依賴於許多預處理環節,如詞語對齊、分詞或符號化(tokenization)、規則抽取、句法分析等,而每個環節的錯誤會逐步累積,對翻譯的影響也越來越大。近年來,深度學習技術的發展為解決上述挑戰提供了新的思路。將深度學習應用於機器翻譯任務的方法大致分為兩類:

仍以統計機器翻譯系統為框架,只是利用神經網絡來改進其中的關鍵模塊,如語言模型、調序模型等(見圖1的左半部分);不再以統計機器翻譯系統為框架,而是直接用神經網絡將源語言映射到目標語言,即端到端的神經網絡機器翻譯(End-to-EndNeuralMachineTranslation,End-to-EndNMT)(見圖1的右半部分),簡稱為NMT模型。作為經典模型的實現,可以幫助大家更好的理解機器翻譯。

圖1:基於神經網絡的機器翻譯系統效果展示

以中英翻譯(中文翻譯到英文)的模型為例,當模型訓練完畢時,如果輸入如下已分詞的中文句子:

如果設定顯示翻譯結果的條數為3,生成的英語句子如下:

左起第一列是生成句子的序號;左起第二列是該條句子的得分(從大到小),分值越高越好;左起第三列是生成的英語句子。

另外有兩個特殊標誌:

模型概覽

本節依次介紹雙向循環神經網絡(Bi-directional Recurrent Neural Network),NMT模型中典型的編碼器-解碼器(Encoder-Decoder)框架以及柱搜索(beam search)算法。

雙向循環神經網絡

我們這裡介紹Bengio團隊在論文[2,4]中提出的另一種結構。該結構的目的是輸入一個序列,得到其在每個時刻的特徵表示,即輸出的每個時刻都用定長向量表示到該時刻的上下文語義信息。

具體來說,該雙向循環神經網絡分別在時間維以順序和逆序——即前向(forward)和後向(backward)——依次處理輸入序列,並將每個時間步RNN的輸出拼接成為最終的輸出層。這樣每個時間步的輸出節點,都包含了輸入序列中當前時刻完整的過去和未來的上下文信息。下圖展示的是一個按時間步展開的雙向循環神經網絡。該網絡包含一個前向和一個後向RNN,其中有六個權重矩陣:輸入到前向隱層和後向隱層的權重矩陣(W1,W3),隱層到隱層自己的權重矩陣(W2,W5),前向隱層和後向隱層到輸出層的權重矩陣(W4,W6)。注意,該網絡的前向隱層和後向隱層之間沒有連接。

圖2:按時間步展開的雙向循環神經網絡

編碼器-解碼器框架

編碼器-解碼器(Encoder-Decoder)[2]框架用於解決由一個任意長度的源序列到另一個任意長度的目標序列的變換問題。即編碼階段將整個源序列編碼成一個向量,解碼階段通過最大化預測序列概率,從中解碼出整個目標序列。編碼和解碼的過程通常都使用RNN實現。

圖3:編碼器-解碼器框架

編碼器

編碼階段分為三步:

one-hotvector表示:將源語言句子x={x1,x2,…,xt}的每個詞xi表示成一個列向量

,i=1,2,…,T。這個向量Wi的維度與詞彙表大小|V|相同,並且只有一個維度上有值1(該位置對應該詞在詞彙表中的位置),其餘全是0。映射到低維語義空間的詞向量:one-hotvector表示存在兩個問題,1)生成的向量維度往往很大,容易造成維數災難;2)難以刻畫詞與詞之間的關係(如語義相似性,也就是無法很好地表達語義)。因此,需再one-hotvector映射到低維的語義空間,由一個固定維度的稠密向量(稱為詞向量)表示。記映射矩陣為

,用

表示第i個詞的詞向量,K為向量維度。用RNN編碼源語言詞序列:這一過程的計算公式為

,其中h0是一個全零的向量,θ是一個非線性激活函數,最後得到的h={h1,…,hT}就是RNN依次讀入源語言T個詞的狀態編碼序列。整句話的向量表示可以採用h在最後一個時間步T的狀態編碼,或使用時間維上的池化(pooling)結果。第3步也可以使用雙向循環神經網絡實現更複雜的句編碼表示,具體可以用雙向GRU實現。前向GRU按照詞序列(

x

1

,…,

x

T

)的順序依次編碼源語言端詞,並得到一系列隱層狀態

。類似的,後向GRU按照(

x

T

,…,

x

1

)的順序依次編碼源語言端詞,得到

。最後對於詞

x

i

,通過拼接兩個GRU的結果得到它的隱層狀態,即

h

i

=

圖4:使用雙向GRU的編碼器

解碼器

機器翻譯任務的訓練過程中,解碼階段的目標是最大化下一個正確的目標語言詞的概率。思路是:

每一個時刻,根據源語言句子的編碼信息(又叫上下文向量,context vector)c、真實目標語言序列的第i個詞ui和i時刻RNN的隱層狀態zi,計算出下一個隱層狀態zi+1。計算公式如下:

其中θ』是一個非線性激活函數;c是源語言句子的上下文向量,在不使用注意力機制時,如果編碼器的輸出是源語言句子編碼後的最後一個元素,則可以定義c=ht ;ui是目標語言序列的第i個單詞,u0是目標語言序列的開始標記<s>,表示解碼開始;zi是i時刻解碼RNN的隱層狀態,z0是一個全零的向量。

將zi+1通過softmax歸一化,得到目標語言序列的第i+1個單詞的概率分布pi+1。概率分布公式如下:

其中WsZi+1+bz是對每個可能的輸出單詞進行打分,再softmax歸一化就可以得到第i+1個詞的概率pi+1。根據pi+1和ui+1計算代價。重複步驟1~2,直到目標語言序列中的所有詞處理完畢。機器翻譯任務的生成過程,通俗來講就是根據預先訓練的模型來翻譯源語言句子。生成過程中的解碼階段和上述訓練過程的有所差異,具體介紹請見柱搜索算法。

柱搜索算法

柱搜索(beam search)是一種啟發式圖搜索算法,用於在圖或樹中搜索有限集合中的最優擴展節點,通常用在解空間非常大的系統(如機器翻譯、語音識別)中,原因是內存無法裝下圖或樹中所有展開的解。如在機器翻譯任務中希望翻譯「<s>你好<e>」,就算目標語言字典中只有3個詞(<s>,<e> , hello),也可能生成無限句話(hello循環出現的次數不定),為了找到其中較好的翻譯結果,我們可採用柱搜索算法。

柱搜索算法使用廣度優先策略建立搜索樹,在樹的每一層,按照啟發代價(heuristic cost)(本教程中,為生成詞的log概率之和)對節點進行排序,然後僅留下預先確定的個數(文獻中通常稱為beam width、beam size、柱寬度等)的節點。只有這些節點會在下一層繼續擴展,其他節點就被剪掉了,也就是說保留了質量較高的節點,剪枝了質量較差的節點。因此,搜索所佔用的空間和時間大幅減少,但缺點是無法保證一定獲得最優解。

使用柱搜索算法的解碼階段,目標是最大化生成序列的概率。思路是:

每一個時刻,根據源語言句子的編碼信息cc、生成的第ii個目標語言序列單詞ui和i時刻RNN的隱層狀態zi,計算出下一個隱層狀態zi+1。將zi+1通過softmax歸一化,得到目標語言序列的第i+1個單詞的概率分布pi+1。根據pi+1採樣出單詞ui+1。重複步驟1~3,直到獲得句子結束標記<e>注意:zi+1和pi+1的計算公式同解碼器中的一樣。且由於生成時的每一步都是通過貪心法實現的,因此並不能保證得到全局最優解。

數據介紹

本教程使用WMT-14數據集中的bitexts(after selection)作為訓練集,dev+test data作為測試集和生成集。

數據預處理

我們的預處理流程包括兩步:

將每個源語言到目標語言的平行語料庫文件合併為一個文件:

合併每個XXX.src和XXX.trg文件為XXX。

XXX中的第i行內容為XXX.src中的第i行和XXX.trg中的第i行連接,用’t』分隔。

創建訓練數據的「源字典」和「目標字典」。每個字典都有DICTSIZE個單詞,包括:語料中詞頻最高的(DICTSIZE - 3)個單詞,和3個特殊符號<s>(序列的開始)、<e>(序列的結束)和<unk>

示例數據

因為完整的數據集數據量較大,為了驗證訓練流程,PaddlePaddle接口paddle.dataset.wmt14中默認提供了一個經過預處理的較小規模的數據集。

該數據集有193319條訓練數據,6003條測試數據,詞典長度為30000。因為數據規模限制,使用該數據集訓練出來的模型效果無法保證。

模型配置說明

下面我們開始根據輸入數據的形式配置模型。首先引入所需的庫函數以及定義全局變量。

然後如下實現編碼器框架:

再實現訓練模式下的解碼器:

實現推測模式下的解碼器:

進而,我們定義一個train_program來使用inference_program計算出的結果,在標記數據的幫助下來計算誤差。我們還定義了一個optimizer_func來定義優化器。

訓練模型

定義訓練環境

定義您的訓練環境,可以指定訓練是發生在CPU還是GPU上。

定義數據提供器

下一步是為訓練和測試定義數據提供器。提供器讀入一個大小為 BATCH_SIZE的數據。paddle.dataset.wmt.train 每次會在亂序化後提供一個大小為BATCH_SIZE的數據,亂序化的大小為緩存大小buf_size。

構造訓練器(trainer)

訓練器需要一個訓練程序和一個訓練優化函數。

提供數據

feed_order用來定義每條產生的數據和paddle.layer.data之間的映射關係。比如,wmt14.train產生的第一列的數據對應的是src_word_id這個特徵。

事件處理器

回調函數event_handler在一個之前定義好的事件發生後會被調用。例如,我們可以在每步訓練結束後查看誤差。

開始訓練

最後,我們傳入訓練循環數(num_epoch)和一些別的參數,調用 trainer.train 來開始訓練。

應用模型

定義解碼部分

使用上面定義的 encoder 和 decoder 函數來推測翻譯後的對應id和分數。

定義數據

我們先初始化id和分數來生成tensors來作為輸入數據。在這個預測例子中,我們用wmt14.test數據中的第一個記錄來做推測,最後我們用」源字典」和」目標字典」來列印對應的句子結果。

測試

現在我們可以進行預測了。我們要在feed_order提供對應參數,放在executor上運行以取得id和分數結果。

總結

端到端的神經網絡機器翻譯是近幾年興起的一種全新的機器翻譯方法。在本文中,我們介紹了NMT中典型的「編碼器-解碼器」框架。由於NMT是一個典型的Seq2Seq(Sequence to Sequence,序列到序列)學習問題,因此,Seq2Seq中的query改寫(query rewriting)、摘要、單輪對話等問題都可以用本教程的模型來解決。

參考文獻

Koehn P. Statistical machine translation[M]. Cambridge University Press, 2009.Cho K, Van Merrinboer B, Gulcehre C, et al. Learning phrase representations using RNN encoder-decoder for statistical machine translation[C]//Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP), 2014: 1724-1734.Chung J, Gulcehre C, Cho K H, et al. Empirical evaluation of gated recurrent neural networks on sequence modeling[J]. arXiv preprint arXiv:1412.3555, 2014.Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[C]//Proceedings of ICLR 2015, 2015.Papineni K, Roukos S, Ward T, et al. BLEU: a method for automatic evaluation of machine translation[C]//Proceedings of the 40th annual meeting on association for computational linguistics. Association for Computational Linguistics, 2002: 311-318.

相關焦點

  • 深度學習系列:PaddlePaddle之手寫數字識別
    上周在搜索關於深度學習分布式運行方式的資料時,無意間搜到了paddlepaddle,發現這個框架的分布式訓練方案做的還挺不錯的,想跟大家分享一下。不過呢,這塊內容太複雜了,所以就簡單的介紹一下paddlepaddle的第一個「hello word」程序----mnist手寫數字識別。下一次再介紹用PaddlePaddle做分布式訓練的方案。
  • 基於PaddlePaddle的官方NLP模型總覽
    基於神經網絡的深度學習技術具有強大的表達能力、端到端解決問題的能力,因而在NLP任務的應用上越來越廣泛和有效。近日,百度PaddlePaddle開源了語義表示模型ERNIE,在多個中文NLP任務上表現超越了谷歌的BERT(請參考連結),展示了百度在NLP技術的領先能力,同時也表明PaddlePaddle作為國內目前唯一功能完備的深度學習平臺,在不斷得夯實框架能力, 並引領技術進步。
  • 134個預訓練模型,百度視覺算法最強基石PaddleClas全新升級
    機器之心發布機器之心編輯部百度 PaddlePaddle 團隊開發的 PaddleClas 是一個適用於業界和學界的圖像分類任務工具集,可以幫助用戶訓練更好的計算機視覺模型並應用於真實場景中。圖像分類任務作為深度學習視覺領域的「基石」,幾乎是每一位視覺方向開發者最先要學習的基礎本領。眾所周知,圖像分類已廣泛應用在智慧零售、智慧交通、智慧醫療、智慧安防等等各行各業。不僅如此,圖像目標檢測、圖像分割、圖像檢索、OCR、人臉識別等高階視覺任務也常將圖像分類網絡作為骨幹網絡。
  • PaddlePaddle 2.0.0 Beta 發布,API 體系升級,命令式編程完善
    訓練框架基礎API兼容性說明 Paddle 2.x版本推薦用戶使用位於paddle根目錄下的API,同時在paddle.fluid目錄下保留了所有的Paddle 1.x版本的API。 paddle.optimizer 優化算法相關API,比如:SGD,Adagrad, Adam等 paddle.optimizer.lr_scheduler 學習率衰減相關API paddle.metric
  • 深度學習CPU加速方案,飛槳全流程開發工具PaddleX 打通OpenVINO...
    飛槳全流程開發工具PaddleX,在打通深度學習全流程開發的基礎上,為產業開發者提供了多種高性能部署方案及詳細的示例工程。  事不宜遲,讓我帶您快速了解一下這套方案吧!  首先,飛槳(PaddlePaddle)以百度多年的深度學習技術研究和業務應用為基礎,是中國首個開源開放、技術領先、功能完備的產業級深度學習平臺,集深度學習核心訓練和推理框架、基礎模型庫、端到端開發套件和豐富的工具組件於一體。目前,飛槳已凝聚超230萬開發者,服務企業9萬家,基於飛槳開源深度學習平臺產生了31萬個模型 。
  • 520禮包 | 情感分析算法從原理到PaddlePaddle實戰全解
    在下文中,我們將以情感分析為例,介紹使用深度學習的方法進行端對端的短文本分類,並使用PaddlePaddle完成全部相關實驗。應用背景在自然語言處理中,情感分析屬於典型的文本分類問題,即把需要進行情感分析的文本劃分為其所屬類別。文本分類涉及文本表示和分類方法兩個問題。
  • 十行代碼就能搞定深度學習?飛槳框架高層API,一起輕鬆玩轉AI
    機器之心發布機器之心編輯部嚮往深度學習技術,可是深度學習框架太難學怎麼辦?百度傾心打造飛槳框架高層 API,零基礎也能輕鬆上手深度學習,一起來看看吧?為了簡化深度學習的學習過程、降低深度學習的開發難度,百度飛槳框架歷經近一年的打磨,不斷地優化深度學習 API,並針對開發者的使用場景進行封裝,在飛槳框架的最新版本中,推出了高低融合、科學統一的飛槳全新 API 體系。飛槳框架將 API 分為兩種,基礎 API 和高層 API。
  • 百度AI攻堅戰:PaddlePaddle中國突圍
    在原有的工具組件基礎上,還全新發布3項深度學習前沿技術工具組件:聯邦學習PaddleFL、圖神經網絡PGL和多任務學習PALM。 全新發布EasyDL專業版為算法工程師提供一站式AI開發平臺。PaddleHub 則支持飛槳Master模式。
  • PaddlePaddle 1.8.4 發布
    PaddlePaddle (PArallel Distributed Deep LEarning,並行分布式深度學習)是百度研發的深度學習平臺,具有易用、高效、靈活和可伸縮等特點,為百度內部多項產品提供深度學習算法支持。PaddlePaddle 也是一個易學、易用的開源深度學習框架, 能夠讓開發者和企業安全、高效地實現自己的 AI 想法。
  • 百度再放「必殺技」 為開發者提供PaddlePaddle最全教程
    有意向成為深度學習教育聯盟的合作夥伴可以在線申請加入百度AI開放平臺生態夥伴計劃。據了解,首期深度學習視頻課程是由深度學習教育聯盟合作夥伴University AI製作完成,並率先推出包含原理、算法和實戰等乾貨內容。University AI以百度PaddlePaddle深度學習框架為基礎,針對普通工程師向算法工程師轉型,全方位打造從入門到進階的人工智慧課程。
  • 零基礎入門深度學習(六):圖像分類任務之LeNet和AlexNet
    :0001 導讀本課程是百度官方開設的零基礎入門深度學習課程,主要面向沒有深度學習技術基礎或者基礎薄弱的同學,幫助大家在深度學習領域實現從0到1+的跨越。>個性化推薦算法的原理、實踐本周為開講第四周,百度深度學習技術平臺部資深研發工程師孫高峰,開始講解計算機視覺中圖像分類任務。
  • 俚語Paddle your own canoe.不是說獨木舟的事,而是要你自力更生
    canoe最早指的是樹幹挖空了心製成的木船,paddle是一種形狀短寬的槳。paddle one's own canoe指「劃自己的船」,有自立立、不依賴別人的意思,另外還有不多管別人閒事的意思。表示後一種意思的時候相當於mind one's own business.
  • 大話卷積神經網絡CNN,小白也能看懂的深度學習算法教程,全程乾貨...
    來源 | 程式設計師管小亮本文創作的主要目的,是對時下最火最流行的深度學習算法的基礎知識做一個簡介,作者看過許多教程,感覺對小白不是特別友好,尤其是在踩過好多坑之後,於是便有了寫這篇文章的想法。一、簡介百度百科中對深度學習的定義是深度學習(DL, Deep Learning)是機器學習(ML, Machine Learning)領域中一個新的研究方向,它被引入機器學習使其更接近於最初的目標——人工智慧(AI, Artificial Intelligence)。
  • PaddlePaddle 中文名「飛槳」重磅公布,百度發布一億元免費算力計劃
    雷鋒網 AI 科技評論按,今日,首屆 WAVE SUMMIT 2019 深度學習開發者峰會在北京舉辦,會上,來自工業界的多家展商展示了基於 PaddlePaddle 訓練的包括瓷器質檢、遙感影像目標檢測與語義分割、軸承外觀缺陷檢測等多個系統,百度高級副總裁、深度學習技術及應用國家工程實驗室主任王海峰,百度深度學習技術平臺部總監馬豔軍均上臺發言,分別闡述了深度學習在智能時代的重要意義以及推進
  • 模型壓縮高達75%,推理速度超20%,Paddle Lite v2.3正式發布
    如今,諸如計算機視覺、智能語音交互等基於深度學習的AI技術,在滿足日常應用層面上已經非常成熟。比如,人臉識別閘機在機場、地鐵、辦公樓、學校等地方隨處可見。什麼都不用帶,只要刷個臉就行,方便快捷又省事!目前深度學習在各個領域輕鬆碾壓傳統算法,不過真正用到實際項目中卻面臨兩大問題:計算量巨大;模型佔用很高的內存(深度學習模型可能會高達幾百M)。
  • 基於DeepSpeech2實現中文語音識別,實施全流程講解,拿來即用
    DeepSpeech2由百度矽谷AI實驗室在2015年發布,是一個採用PaddlePaddle深度學習框架實現的端到端自動語音識別系統,它能通過簡單學習算法較準確的識別英語和中文。百度在DeepSpeech2之前發布過DeepSpeech,可通過pip直接安裝,但它用於主要用於識別英文。
  • 來自谷歌大腦工程師的RNN系列教程 | RNN的基本介紹
    上周,我們分享了一篇來自矽谷工程師的TensorFlow教程,有讀者反饋希望了解更多關於RNN的相關內容。因此,在接下來的幾周中,科技行者為大家準備了一套RNN系列的入門教程,供大家參考。 上周,我們分享了一篇來自矽谷工程師的TensorFlow教程《來自矽谷工程師的Google TensorFlow教程:開始訓練你的第一個RNN吧》,有讀者反饋希望了解更多關於RNN的相關內容。因此,在接下來的幾周中,科技行者為大家準備了一套RNN系列的入門教程,供大家參考。
  • 搜狗機器翻譯團隊獲得 WMT 2017 中英機器翻譯冠軍
    其中,在中文到英文翻譯任務的八項評價標準中(其中四項為 BLEU 及 BLEU 的變體),獲得了七項第一。Sogou NMT 的模型主體採用了業界主流的神經機器翻譯模型:基於循環神經網絡(recurrent neural network, RNN)的多層編碼器-解碼器(encoder-decoder)結構,並帶有注意力(attention)模塊。
  • 瀏覽器中實現深度學習?有人分析了7個基於JS語言的DL框架
    機器之心分析師網絡作者:仵冀穎編輯:H4O本文中,作者基於WWW』19 論文提供的線索,詳細解讀了在瀏覽器中實現深度學習的可能性、可行性和性能現狀。具體而言,作者重點分析了 7 個最近出現的基於JavaScript 的 DL 框架,並對比了具體框架支持哪些 DL 任務。深度學習(Deep Learning,DL)是一類利用多層非線性處理單元(稱為神經元)進行特徵提取和轉換的機器學習算法。每個連續層使用前一層的輸出作為輸入。近十年來,深度學習技術的進步極大地促進了人工智慧的發展。