機器翻譯:用 Open-NMT 訓練翻譯模型

做者:@DataTurks

翻譯:瘋狂的技術宅python

原文:https://hackernoon.com/neural...git

學習在任意兩種語言之間翻譯的完整指南

本文經過手把手的教程,幫你學習怎樣把給定語言翻譯爲任意目標語言。咱們當前的工做任務徹底受到一個開源庫的啓發,該庫的 pyTorch 實現可經過 python 語言(稱爲Open-NMT(Open-Source Neural Machine Translation))得到。它的設計目的是方便深度學習愛好者研究,使其可以在機器翻譯、摘要、圖像到文本轉換、詞法學等領域中實現他們的想法。github

儘管有 Google Translate,Microsoft 等提供的諸多高效翻譯系統,但它們不是開源的,或者是在限制性許可下不可用的。同時還有其餘的庫,例如 tensorflow-seq2seq 模型,但其僅僅做爲研究代碼。web

Open-NMT 不只是開源的,並且還提供大量文檔化、模塊化和易讀的代碼,可以快速訓練並有效地運行模型。api

img

我將會進一步詳細說明怎樣對庫進行設置,和怎樣使用該工具包來訓練你本身的翻譯系統。本文介紹如何從給定的英語文本生成印地語翻譯。bash

Open-NMT架構概述

開放式 NMT 基於 Guillaume Klein 等人的研究,相關資料能夠在這裏找到:http://aclweb.org/anthology/P...網絡

img

該白皮書中揭示了有關其體系結構的詳細信息:架構

OpenNMT 是完整的用於訓練和部署神經機器翻譯模型庫。該系統是哈佛開發的 seq2seq-attn 的後繼產品,而且已經徹底重寫,提升了效率、可讀性和通用性。它包括原生 NMT 模型以及對注意力、gating,stacking, input feeding,正則化、集束搜索以及所需的其餘支持。

主系統在 Lua/Torch 數學框架中實現,而且可使用 Torch 的內部標準神經網絡組件輕鬆擴展。 Facebook Research 的 Adam Lerer 還對其進行了擴展,用相同的 API 可以支持 Python/PyTorch 框架。框架

所需模塊的設置

要訓練你本身的定製翻譯系統,所需的主要軟件包本質上是 pyTorch,在其中已實現了 Open-NMT 模型。ide

固然,首先要克隆 OpenNMT-py 存儲庫:

git clone https://github.com/OpenNMT/OpenNMT-py
cd OpenNMT-py

這是一個 require.txt 文件,用於收集全部必需的軟件包:

six
tqdm
torch>=0.4.0
git+https://github.com/pytorch/text
future

因爲 PyTorch 一直在不斷髮展,所以咱們建議 fork PyTorch v0.4 以確保代碼庫的穩定性能。

運行如下命令來自動收集必備的依賴項:

pip install -r requirements.txt

收集數據集

數據集由包含源語言和目標語言文件的平行語料庫組成,每行包含一個句子,每一個標記用空格進行分隔。

對於本教程,咱們使用存儲在單獨文件中的英語和印地語句子的平行語料庫。數據是從各類來源收集併合並的。而後從新整理數據,建立以下文件集:

  • src-train.txt :包含 10000 條英語(源語言)的訓練文件
  • sentencestgt-train.txt:包含10000 條印地語(目標語言)的訓練文件
  • sentencessrc-val.txt:包含 1000 條英語的驗證數據(源語言)
  • sentencestgt-val.txt:包含 1000 條印地語(目標語言)的驗證數據
  • sentencessrc-test.txt:測試評估數據,由 1000 條英文句子(源語言)組成
  • sentencestgt-test.txt:測試評估數據,包含 1000 條印地語(目標語言)句子

以上全部文件都放在 /data 目錄中。

注意:在本教程中,咱們僅使用了少許數據進行解釋和實驗。可是建議使用帶有數百萬個句子的大型語料庫,以確保有大量詞彙可以更好地學習獨特單詞的和獲得接近人類的翻譯

驗證數據用於在每一個步驟中評估模型以識別收斂點。它一般最多包含 5000 個句子。

這是顯示文本數據在相應文件中的排列方式的例子:

Source Files :
They also bring out a number of Tamil weekly newspapers.

They are a hard — working people and most of them work as labourers.
Tamil films are also shown in the local cinema halls.
There are quite a large number of Malayalees living here.

Target Files :तमिल भाषा में वे अनेक समाचार पत्र व पत्रिकाएं भी निकालते हैं .
ये लोग काफी परिश्रमी हैं , अधिकांश लोग मजदूरी करते हैं .
स्थानीय सिनेमा हालों में तमिल चलचित्रों का प्रदर्शन अक्सर किया जाता है .
मलयालम लोगों की बहुत बडी संख्या है .

預處理文本數據

經過執行如下命令來預處理訓練和驗證數據,並提取訓練特徵,爲模型生成詞彙文件。

python preprocess.py 
-train_src data/src-train.txt 
-train_tgt data/tgt-train.txt 
-valid_src data/src-val.txt 
-valid_tgt data/tgt-val.txt 
-save_data data/demo
python preprocess.py -train_src data/src-train.txt -train_tgt data/tgt-train.txt -valid_src data/src-val.txt -valid_tgt data/tgt-val.txt -save_data data/demo

訓練翻譯器模型

用於訓練的主命令很是容易使用。實際上它是把數據文件和保存文件做爲輸入。

使用的默認模型的摘要以下:

NMTModel(
  (encoder): RNNEncoder(
    (embeddings): Embeddings(
      (make_embedding): Sequential(
        (emb_luts): Elementwise(
          (0): Embedding(20351, 500, padding_idx=1)
        )
      )
    )
    (rnn): LSTM(500, 500, num_layers=2, dropout=0.3)
  )
  (decoder): InputFeedRNNDecoder(
    (embeddings): Embeddings(
      (make_embedding): Sequential(
        (emb_luts): Elementwise(
          (0): Embedding(20570, 500, padding_idx=1)
        )
      )
    )
    (dropout): Dropout(p=0.3)
    (rnn): StackedLSTM(
      (dropout): Dropout(p=0.3)
      (layers): ModuleList(
        (0): LSTMCell(1000, 500)
        (1): LSTMCell(500, 500)
      )
    )
    (attn): GlobalAttention(
      (linear_in): Linear(in_features=500, out_features=500, bias=False)
      (linear_out): Linear(in_features=1000, out_features=500, bias=False)
      (softmax): Softmax()
      (tanh): Tanh()
    )
  )
  (generator): Sequential(
    (0): Linear(in_features=500, out_features=20570, bias=True)
    (1): LogSoftmax()
  )
)
python train.py -data data/demo -save_model demo-model

上面的命令將會運行一個默認模型,包括一個兩層 LSTM,該 LSTM 擁有 500 個隱藏單元,分別用於編碼器和解碼器。要指定 GPU 來提升訓練的效率,請在上述命令中指定 -gpuid 參數(例如,-gpuid 1 用於指定 GPU 1 )。

一般默認模型會持續 100000 個迭代,因此每 5000 個迭代後會保存一個檢查點。所以,若是模型收斂而且驗證精度較早達到穩定點,則能夠中止進一步的訓練並使用之前保存的檢查點。

翻譯你本身的數據

img

能夠經過執行如下命令來對源語言(英語)中看不見的文本執行推理步驟,並生成預測的相應翻譯:

python translate.py -model demo-model_XYZ.pt -src data/src-test.txt -output pred.txt -replace_unk -verbose

命令將會生成轉換後的輸出,並把預測結果保存到名爲 pred.txt 的文件中。

該模型在 NVIDIA GEFORCE 2GB GPU 上訓練了 10000 個迭代。在 CPU 上進行訓練將須要很高的計算成本,建議使用高端 GPU 以更快的速度訓練具備大量數據的模型。

模型的樣本預測

下面顯示了在訓練模型以後,爲相應英語句子生成的印地語翻譯的幾個例子。

Trees are capable of absorbing more of carbon dioxide, 
thus maintaining equilibrium in the air composition
PREDICTED : पेडों में कार्बन डाईआक्साइड के बुरे लोग 
इस प्रकार पेड - पौधे का प्रयोग करने के लिए मौजूद हैं.
He has hope that the gods will throw good things from the heavens, 
upon them 
PREDICTED :वे उमीद है कि वे घर से कुछ नहीं बची हैं
The Buddhist temple , 
the Dalai Lama Palace and dispensary of Tibet are tourist attractions here 
PREDICTED :यहां का बौद्ध मंदिर दलाई लामा का आवास तथा तिब्बती औषधालय स्थानिय लोगो में मिलता है .
He lets the hair grow long.
PREDICTED : वह अपने बढा लेता है .

如上所示,預測還不夠好,這是由於訓練數據較少。爲了在接近真實世界的狀況下執行翻譯,必須在大量詞彙和大約一百萬個句子的基礎上訓練模型,但這會致使在硬件需求和訓練時間方面的成本大大提升。

評估你的訓練模型

BLEU 評估(Bilingual Evaluation Understudy Score)是一種經過將生成的句子與參考句子進行比較來評估機器翻譯系統的評估指標。

在評估中,若是可以徹底匹配, 則 BLEU 得分爲1.0,而徹底不匹配的 BLEU 得分爲0.0。

BLEU 評估是一種通用的度量標準,用於評估翻譯模型,由於它獨立於語言,易於解釋而且與手動評估有着高度相關性。

BLEU 得分是由 Kishore Papineni 等人在進行的一項研究中提出的。 「 BLEU:一種自動評估機器翻譯的方法」。

BLEU 得分是在對候選譯文中的n-gram與參考文本中的 n-gram 進行匹配以後生成的。在此比較中不考慮詞序。

那麼咱們如何定義一個 n-gram 呢?假設 1-gram 或 uni-gram 表示每一個單獨的標記,而 bi-gram 則表示每對單詞。

用於預測的候選文件、GitHub 存儲庫中給出的參考文件和計算 BLEU 分數的代碼會在本文末尾提供連接。

這是咱們評估模型的方式:

python calculatebleu.py "pred.txt" "tgt-test.txt"

其中 pred.txt 是候選預測翻譯文件,而 tgt-test.txt 是包含目標語言的實際翻譯的文件。

因爲咱們用 1 萬個句子生成的數據詞彙表中僅由幾千個單詞組成,所以在預測中得到的 BLEU 分數至關差(0.025)。

注意:因爲咱們的主要目標是專一於詳細說明 Open-NMT 的使用,所以僅使用了一個很小的數據集,這就是爲何對翻譯結果進行評估時 BLEU 評分不好的緣由。 BLEU 得分爲 0.5 左右時就意味着翻譯效果不錯。能夠經過添加幾千個示例來提升分數,從而增長訓練詞彙量。

可是,Open-NMT 容許咱們在任何兩種語言之間訓練本身的定製翻譯器模型,而且使用起來很是方便。

這裏提供了用於生成 BLEU 分數的代碼和訓練模型用的數據集。


image.png

相關文章
相關標籤/搜索