凯发娱乐 - 亚马逊开源神经机器翻译框架Sockeye:基于Apache MXNet的NMT平台

${website.getHeaderOriginal(${article.taxonomyName})}


随着神经机器翻译(NMT)技术的不断演进··|,越来越多的科研机构和公司选择开源自己的项目··|,让更多人能够开发出自己的 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 的内在运行机制··|,首先让我们看一看学界和业界通常使用的神经网络架构··|--。




神经网络包含三个主要部分:编码器、解码器和注意力机制··|--。编码器一次一词地读取源语句直到读完语句( )并生成语句的一个隐表征··|--。编码器经常作为循环神经网络(RNN)被实现··|,比如一个长短时记忆(LSTM)网络··|--。


解码器··|,也作为 RNN 被实现··|,从语句开头的符号( )一次一词地生成目标语句··|--。它可以通过生成语境向量的注意力机制获取源语句··|--。解码器可以决定哪个词与生成的下一个目标词最相关··|--。 通过这种方式··|,解码器在所有时间步骤上获得了整个输入句子··|--。


神经网络生成的下一个词成为了解码器的输入··|--。解码器基于生成的词及其隐表征产生了后续词··|--。神经网络持续生成词直到语句结束符   出现··|--。


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.」··|--。试着翻译更难的句子··|--。确保输入的句子经过分词处理··|,即所有标点符号与单词之间均由空格隔开··|--。注意如果该模型不认识某个单词时··|,就会输出 符号··|--。


你还可以实现注意力网络可视化··|--。关于这个··|,如果没有 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」··|,尽管这两个单词在句子中的位置并不对应··|--。你还可以看到该网络不认识部分单词··|,并将它们输出为 符号··|--。


总结


在本文中··|,你了解了用于神经机器翻译(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


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


在训练之后··|,词典 会包含所有模型组件··|,如参数和模型配置··|--。


翻译


用于翻译的输入数据需要与训练数据格式统一(表征化、经过预处理)··|--。可通过以下方式进行翻译:


> python -m sockeye.translate --models --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



本文为机器之心编译··|,转载请联系本公众号获得授权··|--。

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:editor@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com


点击阅读原文··|,查看机器之心官网↓↓↓

${website.getFooterOriginal(${article.taxonomyName})}

发布者 :凯发娱乐_凯发娱乐官网_凯发K8娱乐手机版 - 分类 凯发娱乐

(必填)