随着神经机器翻译(NMT)技术的不断演进,越来越多的科研机构和公司选择开源自己的项目,让更多人能够开发出自己的 NMT 模型。此前,清华大学开源了神经机器翻译工具包 THUMT,谷歌也推出了基于 TensorFlow 的 NMT 模型搭建教程。作为 MXNet 的支持者,亚马逊也开源了自己的 NMT 框架 Sockeye。在本文中,亚马逊宣称这个基于 MXNet 的工具可以用于构建目前业内表现最佳的神经机器翻译模型。
Sockeye GitHub 链接:https://github.com/awslabs/sockeye 
说明文档:http://sockeye.readthedocs.io/en/latest/
你想使用机器学习做翻译吗?通过 Sockeye 框架,你可以建模机器学习以及其他序列到序列的任务。基于 Apache MXNet 的 Sockeye 架构可为打造、训练和运行当前最优的序列到序列模型承担绝大部分工作
在自然语言处理 (NLP) 中,很多任务是关于序列预测问题。例如,在机器翻译 (MT) 中,任务是在给定输入单词序列的情况下预测已翻译单词的序列。执行这种任务的模型常被称为序列到序列模型。近来,深度神经网络(DNN)显著提升了这些模型的性能。Sockeye 同时提供了一个当前最优的神经机器翻译(NMT)模型的实现和一个开展 NMT 研究的平台。Sockeye 是一个基于 Apache MXNet 的快速而可扩展的深度学习库。Sockeye 代码库具有来自 MXNet 的独特优势。例如,通过符号式和命令式 MXNet API,Sockeye 结合了陈述式和命令式编程风格;它同样可以在多块GPU上并行训练模型。本文中,我们首先对 NMT 作了一个概述,接着展示了如何使用 Sockeye 训练一个带有注意力的最小 NMT 模型。
带有注意力的序列到序列模型如何工作?
为了理解 Sockeye 的内在运行机制,首先让我们看一看学界和业界通常使用的神经网络架构。
神经网络包含三个主要部分:编码器、解码器和注意力机制。编码器一次一词地读取源语句直到读完语句(<EOS>)并生成语句的一个隐表征。编码器经常作为循环神经网络(RNN)被实现,比如一个长短时记忆(LSTM)网络。
解码器,也作为 RNN 被实现,从语句开头的符号(<BOS>)一次一词地生成目标语句。它可以通过生成语境向量的注意力机制获取源语句。解码器可以决定哪个词与生成的下一个目标词最相关。通过这种方式,解码器在所有时间步骤上获得了整个输入句子。
神经网络生成的下一个词成为了解码器的输入。解码器基于生成的词及其隐表征产生了后续词。神经网络持续生成词直到语句结束符 <EOS> 出现。
Sockeye:为使用 MXNet 的机器翻译进行序列到序列建模
Sockeye 实现了 MXNet 上当前最佳的序列到序列模型。它同样为所有序列到序列模型的超参数提供恰当的默认值。对于优化,你无需担心停止标准、指标跟踪或者权重初始化。你可以简单地运行已提供的训练命令行界面(CLI)。
你可以轻易改变基础模型架构,比如:
RNN 单元类型(LSTM 或 GRU)和隐藏状态大小
RNN 层的数量
源序列和目标序列嵌入的大小
应用于源编码的注意力机制的类型
Sockeye 同样有其他更高级的功能,比如:
束搜索推理
多模型的简单集成
RNN 层之间的残差链接
输出层预测的词汇偏倚
门控语境(Context gating)
交叉熵标签平滑
层归一化
为了训练,Sockeye 允许你完全掌控重要的优化参数。例如,你可以设置优化器类型、学习率、动量、权重衰减和提前停止条件。Sockeye 跟踪了训练和验证数据上的多个指标(包括专门针对机器翻译的指标,比如 BLEU)。
我们计划不断扩展 Sockeye 功能集,为研究者提供实验 NMT 新想法的平台。
训练一个最小模型来做翻译
现在,我们先来训练第一个神经机器翻译模型,下列命令需要在类 Unix 操作系统壳层(shell)上运行,如 Linux 或 Mac OS X。
获取数据集
首先,获取一个平行语料库(parallel corpus)。平行语料库是多个原文和译文的集合。Sockeye 需要所有的输入数据是空格分隔开的语言符号。把数据输入到 Sockeye 之前,运行分词器,把词和标点分隔开来。你可以从本文中下载 WMT 2017 新闻翻译任务分词后的训练数据和开发数据。使用以下壳层命令下载新闻文章的德-英平行句对:
curl http://data.statmt.org/wmt17/translation-task/preprocessed/de-en/corpus.tc.de.gz | gunzip | head -n 1000000 > train.de curl http://data.statmt.org/wmt17/translation-task/preprocessed/de-en/corpus.tc.en.gz | gunzip | head -n 1000000 > train.en
这里,我们只需要使用前 100 万句对进行训练。但是实际中,你需要在更大的数据集上训练模型。
为跟踪训练过程中未知句对的质量指数,你需要下载一个验证集:
curl http://data.statmt.org/wmt17/translation-task/preprocessed/de-en/dev.tgz | tar xvzf -
现在,你有了包含训练用平行句对的 train.de 和 train.en 文件、包含未知验证句对的 newstest2016.tc.de 和 newstest2016.tc.en 文件。在未知句对上评估模型质量非常重要,因为这可以帮助正确地评估模型在新句对上的性能表现。
安装 Sockeye
由于模型计算成本高昂,我们通常推荐在一个 GPU 上运行 Sockeye。也就是说,你可以在没有 GPU 的电脑上运行 Sockeye。如果你想在 CPU 上运行 Sockeye,使用下列命令安装 Sockeye: 
pip install sockeye
注意:
在 CPU 上运行 Sockeye 的时候,必须确保在所有命令上添加--use-cpu。否则,Sockeye 将尝试在 GPU 上运行,并失败
如果你有可用的 GPU,那么使用以下命令安装适用于 CUDA 8.0 的 Sockeye:
pip install sockeye --no-deps numpy mxnet-cu80==0.10.0
使用下列命令,安装适用于 CUDA 7.5 的 Sockeye:
pip install sockeye --no-deps numpy mxnet-cu75==0.10.0
训练模型
现在你已经做好训练前的一切准备了。运行下列命令开始训练你的第一个德语英语神经机器翻译模型:
python -m sockeye.train -s train.de \                       -t train.en \                       -vs newstest2016.tc.de \                       -vt newstest2016.tc.en \                       --num-embed 128 \                       --rnn-num-hidden 512 \                       --attention-type dot \                       --dropout 0.5 \                       -o model
上述命令适用于对嵌入 128 和 512 个隐藏单元的模型进行训练。在训练过程中,Sockeye 定期输出验证指数。
在 p2 样例上使用单个 K80 GPU 进行训练大约需要 13 个小时。训练结束后,你可以在 model 文件夹中找到所有伪影(artifact),如模型参数。
翻译
模型训练结束后,你可以输入分词后的句子开始翻译:
echo "Das grüne Haus ." | python -m sockeye.translate -m model 2>/dev/null
这句话的译文是「the green house.」。试着翻译更难的句子。确保输入的句子经过分词处理,即所有标点符号与单词之间均由空格隔开。注意如果该模型不认识某个单词时,就会输出<unk>符号
你还可以实现注意力网络可视化。关于这个,如果没有 matplotlib,你还需要安装 matplotlib 作为额外依赖项:
pip install matplotlib
将输出类型设置成 align_plot,以创建可以看到注意力网络的 align_1.png 文件:
echo "Das grüne Haus ." | python -m sockeye.translate -m model --output-type align_plot
输出结果应该与下图类似:
你可以看到,目标语言中的每一个单词都对应该网络注意到的源语言单词。该注意力机制对于促使该模型输出高质量的翻译结果并不总是奏效。如果句子比较复杂,那么注意力就可能如下图:
你可以看到该模型认为单词「sprechen」对应英语中的「discuss」,尽管这两个单词在句子中的位置并不对应。你还可以看到该网络不认识部分单词,并将它们输出为<unk>符号。
总结
在本文中,你了解了用于神经机器翻译(NMT)的序列到序列模型,也学习了如何使用 Sockeye——一个基于 MXNet 的序列到序列框架——来训练并运行一个最小 NMT 模型。
如何使用 Sockeye
该项目包含 Sockeye,一个基于 Apache MXNet,用于神经机器翻译的序列到序列框架。它可以实现著名的、带有注意力机制的编码器-解码器架构。
系统需求
Sockeye 要求的环境:
Python3
MXNet-0.10.0 (https://github.com/dmlc/mxnet/tree/v0.10.0
numpy
安装
AWS DeepLearning AMI 用户只需运行以下代码即可安装 sockeye:
> sudo pip3 install sockeye --no-deps
对于其他环境,你可以选择通过 PIP 或直接录入源代码。
CPU
> pip install sockeye
GPU
如果你希望在 GPU 上运行 sockeye,你需要确认你的 Apache MXNet 包含了 GPU 的代码。在 CUDA8.0 中,你可以通过以下代码运行:
> wget https://raw.githubusercontent.com/awslabs/sockeye/master/requirements.gpu-cu80.txt> pip install sockeye --no-deps -r requirements.gpu-cu80.txt> rm requirements.gpu-cu80.txt
在 CUDA 7.5 中:
> wget https://raw.githubusercontent.com/awslabs/sockeye/master/requirements.gpu-cu75.txt> pip install sockeye --no-deps -r requirements.gpu-cu75.txt> rm requirements.gpu-cu75.txt
引用
CPU
如果你仅希望使用 sockeye 而不去扩展它,在复制 git 代码后只需如此安装:
> python setup.py install
GPU
如果你希望在 GPU 上运行 sockeye,你需要确定 Apache MXNet 包含了 GPU 代码。如果你的 CUDA 是 8.0 版本,你可以用如下代码运行:
> python setup.py install -r requirements.gpu-cu80.txt
如果 CUDA 为 7.5 版本:
> python setup.py install -r requirements.gpu-cu75.txt
可选项
为了跟踪训练过程中的学习曲线,你可以选择安装 dmlc tensorboard(pip install tensorboard)。如果你希望创建校准图,你可以安装 matplotlib(pip install matplotlib)。一般来说,你可以使用以下方式从 Sockeye 源文件夹中安装所有可选依赖项:
> pip install -e '.[optional]'
AWS DeepLearning AMI 用户需要使用 python3 命令而非 Python。
运行 Sockeye
在安装后,如 sockeye-train、sockeye-translate、sockeye-average、sockeye-embeddings 这样的命令行工具均可使用。此外,如果 sockeye 在你的 PYTHONPATH 目录中,你可以直接使用其中的模组。例如 sockeye-train 可以这样调用:
> python -m sockeye.train <args>
AWS DeepLearning AMI 用户需要使用 python3 命令而非 Python
训练
为训练你的第一个神经机器翻译模型,你需要两个平行的文件:一个用于训练,另一个用于验证。后者将用于在训练期间计算各种指标。每个集合应包含两个文件:一个用于源文件,一个用于目标句子(翻译结果)。两个文件应该有相同的行数,每一行包含一个句子。每个句子应该是一个用空格分隔的表征列表。
例如,如果训练德语-英语翻译模型,你需要如此调用 Sockeye:
> python -m sockeye.train --source sentences.de \                      --target sentences.en \                      --validation-source sentences.dev.de \                      --validation-target sentences.dev.en \                      --use-cpu \                      --output <model_dir>
在训练之后,词典<model_dir>会包含所有模型组件,如参数和模型配置。
翻译
用于翻译的输入数据需要与训练数据格式统一(表征化、经过预处理)。可通过以下方式进行翻译:
> python -m sockeye.translate --models <model_dir> --use-cpu
这将使用训练中得到的最佳参数组,从 STDIN 翻译字符串,将结果写入 STDOUT。
原文链接:https://aws.amazon.com/cn/blogs/ai/train-neural-machine-translation-models-with-sockeye/
sockeye说明文档:http://sockeye.readthedocs.io/en/latest/README.html
举报/反馈

机器之心Pro

15.1万获赞 38.8万粉丝
专业的人工智能媒体和产业服务平台
机器之心官方账号,优质科技领域创作者
关注
0
收藏
分享