作者:@DataTurks翻译:疯狂的技术宅
学习在任意两种语言之间翻译的完整指南
本文通过手把手的教程,帮你学习怎样把给定语言翻译为任意目标语言。我们当前的工作任务完全受到一个开源库的启发,该库的 pyTorch 实现可通过 python 语言(称为Open-NMT(Open-Source Neural Machine Translation))获得。它的设计目的是方便深度学习爱好者研究,使其能够在机器翻译、摘要、图像到文本转换、词法学等领域中实现他们的想法。
尽管有 Google Translate,Microsoft 等提供的诸多高效翻译系统,但它们不是开源的,或者是在限制性许可下不可用的。同时还有其他的库,例如 tensorflow-seq2seq 模型,但其仅仅作为研究代码。
Open-NMT 不仅是开源的,而且还提供大量文档化、模块化和易读的代码,能够快速训练并有效地运行模型。
我将会进一步详细说明怎样对库进行设置,和怎样使用该工具包来训练你自己的翻译系统。本文介绍如何从给定的英语文本生成印地语翻译。
Open-NMT架构概述
开放式 NMT 基于 Guillaume Klein 等人的研究,相关资料可以在这里找到:http://aclweb.org/anthology/P...。
该白皮书中揭示了有关其体系结构的详细信息:
OpenNMT 是完整的用于训练和部署神经机器翻译模型库。该系统是哈佛开发的 seq2seq-attn 的后继产品,并且已经完全重写,提高了效率、可读性和通用性。它包括原生 NMT 模型以及对注意力、gating,stacking, input feeding,正则化、集束搜索以及所需的其他支持。主系统在 Lua/Torch 数学框架中实现,并且可以使用 Torch 的内部标准神经网络组件轻松扩展。 Facebook Research 的 Adam Lerer 还对其进行了扩展,用相同的 API 能够支持 Python/PyTorch 框架。
所需模块的设置
要训练你自己的定制翻译系统,所需的主要软件包本质上是 pyTorch,在其中已实现了 Open-NMT 模型。
当然,首先要克隆 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 个迭代后会保存一个检查点。因此,如果模型收敛并且验证精度较早达到稳定点,则可以停止进一步的训练并使用以前保存的检查点。
翻译你自己的数据
可以通过执行以下命令来对源语言(英语)中看不见的文本执行推理步骤,并生成预测的相应翻译:
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 分数的代码和训练模型用的数据集。