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

2020-12-11 量子位

本文轉載自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 訓練一個詞向量模型。
  • 基於PaddlePaddle的詞向量實戰 | 深度學習基礎任務教程系列(二)
    詞向量是自然語言處理中常見的一個操作,是搜尋引擎、廣告系統、推薦系統等網際網路服務背後常見的基礎技術。在這些網際網路服務裡,我們經常要比較兩個詞或者兩段文本之間的相關性。為了做這樣的比較,我們往往把詞表示成計算機適合處理的方式。最自然的方式莫過於向量空間模型(vector space model)。
  • PaddlePaddle深度學習開源平臺:等待眾人划槳的中國AI大船
    一、 PaddlePaddle是什麼 我們說了很多歷史,也提到了一些舞臺上正興的機器學習平臺,而這篇文字,是想介紹一下一個新的選擇:來自百度的paddlepaddle。Paddle(Parallel Distributed Deep Learning,並行分布式深度學習)。
  • 【深度學習系列】關於PaddlePaddle的一些避「坑」技巧
    ,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。博客專欄:https://www.cnblogs.com/charlotte77/前文傳送門:【好書推薦&學習階段】三個月教你從零入門深度學習【深度學習系列】PaddlePaddle之手寫數字識別【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理【深度學習系列】PaddlePaddle之數據預處理
  • 深度學習與PaddlePaddle的應用-個性化推薦
    作者:沈克強 來源:人工智慧學習圈I 研究背景推薦系統(Recommender System)是向用戶建議有用物品的軟體工具和技術,它運用數據分析、數據挖掘等技術,實現對用戶瀏覽信息或商品進行智能推薦,是機器學習,尤其是深度學習算法的重要應用場景。
  • 深度學習系列:PaddlePaddle之手寫數字識別
    上周在搜索關於深度學習分布式運行方式的資料時,無意間搜到了paddlepaddle,發現這個框架的分布式訓練方案做的還挺不錯的,想跟大家分享一下。不過呢,這塊內容太複雜了,所以就簡單的介紹一下paddlepaddle的第一個「hello word」程序----mnist手寫數字識別。下一次再介紹用PaddlePaddle做分布式訓練的方案。
  • 【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡GoogLeNet
    點擊上圖,立即開啟AI急速修煉作者:Charlotte    高級算法工程師 ,博客專家;擅長用通俗易懂的方式講解深度學習和機器學習算法
  • 教程| 如何用百度深度學習框架PaddlePaddle做數據預處理
    機器之心經授權轉載 作者:胡曉曼 本文主要介紹了百度的深度學習開源框架PaddlePaddle的數據預處理過程,創建一個reader讀取數據,一行代碼搞定數據的輸入、混洗和批量讀取。本文作者胡曉曼是一名高級算法工程師,熱衷寫通俗易懂的深度學習入門文章。
  • 基於飛槳PaddlePaddle的語義角色標註任務全解析
    基於語塊(chunk)的 SRL 方法基於語塊的 SRL 方法將 SRL [1] 作為一個序列標註問題來解決。序列標註任務一般都會採用 BIO 表示方式來定義序列標註的標籤集,我們先來介紹這種表示方法。
  • 【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡AlexNet
    ,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。博客專欄:https://www.cnblogs.com/charlotte77/前文傳送門:【好書推薦&學習階段】三個月教你從零入門深度學習【深度學習系列】PaddlePaddle之手寫數字識別【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理【深度學習系列】PaddlePaddle之數據預處理
  • 教程 | 如何用百度深度學習框架PaddlePaddle做數據預處理
    本文主要介紹了百度的深度學習開源框架PaddlePaddle的數據預處理過程,創建一個reader讀取數據,一行代碼搞定數據的輸入、混洗和批量讀取
  • 乘風破浪的Paddle之LSTM
    作者:劉凱旋 來源:人工智慧學習圈本文未經授權,嚴禁轉載,轉載請聯繫作者本人。自然語言處理(NLP)主要是研究實現人與計算機之間用自然語言進行有效通信的各種理論和方法。基於神經網絡的深度學習技術具有強大的表達能力、端到端解決問題的能力,因而在NLP任務的應用上越來越廣泛和有效。
  • 雲腦科技-實習僧文本匹配模型及基於百度PaddlePaddle的應用
    在深度學習中,基於詞向量和循環神經網絡 (RNN) 的語言模型很好的解決了這些問題。但普通的 RNN,受限於梯度消失和梯度飽和,在訓練時更新信息可能傳播不到序列所有的位置上。因此對於較長的語句,RNN 並不能很好的整合上文信息。GRU 和 LSTM 這兩種特殊的 RNN,在每一個循環單元內引入了「門」的結構,如輸入門,輸出門,遺忘門,等等。
  • 23個系列分類網絡,10萬分類預訓練模型,這是飛槳PaddleClas百寶箱
    MobileNetV3 是一種基於 NAS 的新的輕量級網絡,與其他網絡相比,在相同的預測速度下,MobileNetV3 系列網絡的精度更有競爭力。而這些工具大都以圖像分類為例,提供示例教程和進行優化。因此如果用戶使用 PaddleClas 訓練的模型,通過參考文檔教程中的實用工具章節,就可以很方便的把模型集成到自己的服務中,完成相應的圖像分類任務。
  • PaddlePaddle升級解讀 | PaddleHub輕鬆完成遷移學習
    遷移學習(Transfer Learning)是屬於深度學習的一個子研究領域,該研究領域的目標在於利用數據、任務、或模型之間的相似性,將在舊領域學習過的知識,遷移應用於新領域中。遷移學習吸引了很多研究者投身其中,因為它能夠很好的解決深度學習中的以下幾個問題:為了讓開發者更便捷地應用遷移學習,百度PaddlePaddle開源了預訓練模型管理工具PaddleHub。開發者用使用僅僅十餘行的代碼,就能完成遷移學習。本文將為讀者全面介紹PaddleHub並介紹其應用方法。
  • PaddlePaddle入門:從對話系統中的情感分析談起
    但無論學習什麼框架或者工具,如果不了解它是如何解決某個具體問題進而幫助提高業務,那無異於捨本逐末。本文將從智能對話系統中一個基礎的問題——情感分析(Sentiment Analysis)——談起,詳細闡述如何「step-by-step」地運用百度開源的深度學習框架(PaddlePaddle)來解決情感分析,並最終如何提升整個對話系統的質量。
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    機器視覺領域的核心問題之一就是目標檢測 (object detection),它的任務是找出圖像當中所有感興趣的目標 (物體),確定其位置和大小。作為經典的目標檢測框架 Faster R-CNN,雖然是 2015 年的論文,但是它至今仍然是許多目標檢測算法的基礎,這在飛速發展的深度學習領域十分難得。
  • 從零學Paddle系列-1 Paddle框架CNN相關API詳解
    前言前面我們對Paddle做了個大致的介紹,這一次我們來詳細學習一下cv相關函數的使用paddle.fluid.dygraph
  • 重磅| PaddlePaddle中文文檔強勢來襲!
    在發布三年之後,百度深度學習框架PaddlePaddle有了官方中文版文檔。文檔地址:http://www.paddlepaddle.org/documentation/docs/zh/1.2/beginners_guide/index.html 在剛開始接觸百度深度學習框架PaddlePaddle的時候