【下载】PyTorch实现的神经网络翻译框架——机器翻译工具包 nmtpytorch
【导读】机器翻译是自然语言处理的重要组成部分,其目的是使用计算机自动将文本翻译成其他语言的形式。近年来,端到端的神经机器翻译发展迅速,已经成为机器翻译系统的新主流。近日,法国勒芒大学发布了基于pytorch的机器翻译工具包 nmtpytorch,为业内人士的研究和开发工作提供了便利。
Neural Machine Translation Framework in PyTorch
nmtpytorch是nmtpy的一个PyTorch分支,而起初是dl4mt-tutorial的一个分支。它基于序列到序列的框架(sequence-to-sequence framework)的神经网络翻译模型。
Nmtpy:https://github.com/lium-lst/nmtpy
dl4mt-tutorial:https://github.com/nyu-dl/dl4mt-tutorial
nmtpytorch的核心部分依赖numpy, torch 和 tqdm。Nmtpytorch依赖Python 3.6,目前并不支持Python 2.x。
- 安装
我们将subword-nmt和METEOR作为子模块,以便根据需要进行跟踪更新。另外,METEOR v1.5 JAR、multi-bleu.perl以及COCO评价工具cocoeval都直接包含在源文件中。
运行以下命令以获取包含这些子模块的代码仓库:
git clone --recursive https://github.com/lium-lst/nmtpytorch.git
安装develop模块:
python setup.py develop
- 使用案例
用一个英文-德文的Multi30k示例,来演示NMT的配置,其中涵盖了NMT中[train]和[model]的具体选项配置。
当你为你的数据集创建一个配置文件之后,你可以使用下面的命令开始训练:
nmtpy train -C <config file>
可以通过命令行来覆盖所有的配置选项:
nmtpy train -C <config file> train.<opt>:<val> model.<opt>:<val> ...
- 版本注释
- 安装版本v1.0(18/12/2017)
最初的版本旨在(尽可能)与最新的nmtpy兼容,并做出一些重要的变化。
- 新的TensorBoard支持
如果你想监控训练过程,你可以先安装tensorboard-pytorch。请注意,你还需要安装Tensorflow中的实际TensorBoard服务器以启动可视化服务器。
tensorboard-pytorch:https://github.com/lanpa/tensorboard-pytorch
当依赖项安装完成之后,你需要在实验的配置文件中为TensorBoard定义一个日志目录,以记录TensorBoard日志。记录频率与终端记录频率相同,其由train.disp_freq选项定义(默认为30个批次)。
[train]
..
tensorboard_dir: ~/tb_dir
- 一个统一的命令行接口
我们提供了一个统一的命令行接口——nmtpy,它实现了三个子命令包括:训练,翻译和重新开始。而不是先前的使用多个命令来实现训练,重新评分,翻译等。
nmtpy train
usage: nmtpy train [-h] -C CONFIG [-s SUFFIX] [overrides [overrides ...]]
positional arguments:
overrides (section).key:value overrides for config
optional arguments:
-h, --help show this help message and exit
-C CONFIG, --config CONFIG
Experiment configuration file
-s SUFFIX, --suffix SUFFIX
Optional experiment suffix.
nmtpy translate
usage: nmtpy translate [-h] [-n] -s SPLITS [-b BATCH_SIZE] [-k BEAM_SIZE]
[-m MAX_LEN] [-p] [-u] [-d DEVICE] [-e]
models [models ...]
positional arguments:
models Saved model/checkpoint file(s)
optional arguments:
-h, --help show this help message and exit
-n, --disable-filters
Disable text filters given in config.
-s SPLITS, --splits SPLITS
Comma separated splits to translate
-b BATCH_SIZE, --batch-size BATCH_SIZE
Batch size for beam-search
-k BEAM_SIZE, --beam-size BEAM_SIZE
Beam size for beam-search
-m MAX_LEN, --max-len MAX_LEN
Maximum sequence length
-p, --avoid-double Suppress previous token probs
-u, --avoid-unk Suppress <unk> generation
-d DEVICE, --device DEVICE
Select GPU device(s)
-e, --ensemble Enable ensembling for multiple models.
- 实验配置
对INI风格(INI-style)的实验配置文件格式稍作更新,以便根据数据描述在将来进行多任务、多语言设置。
模型未知的选项在[train]部分中定义,而模型本身使用的选项在[model]中定义。
可以在[data]中定义任意数量的且多种语言的并行语料库。请注意,您至少需要在本节中定义train_set和val_set数据集,以便训练和提前停止。
我们建议您查看我们提供的示例配置,以便了解文件格式。
- 训练一个模型
我们仍然提供一个单一的、模型未知的mainloop,以便处理模型中一切必要的训练,验证和提前停止操作。
- 定义一个模型
你需要在nmtpytorch/models目录下创建一个新文件,定义一个从nn.Module派生出的类。新的class的名字是model_type,需要写在你的配置文件中。接下来的步骤是:
- 从配置文件中解析模型的选项__init__();
- 在setup()中定义层:每一个nn.Module对象应该是模型的一个属性(例如,self.encoder = …),以确保PyTorch正确的工作;
- 在load_data()中创建和存储相关的数据集对象;
- 定义一个get_iterator()方法,以获取数据迭代器并计算它的损失。这个方法被用于dev设置的困惑度;
- 当你想增加一个额外的loss项的时候就定义一个aux_loss(),如果不想使用这个方法就return 0;
- 定义forward()方法,以带有键的字典作为数据源,并返回批量训练损失。这是mainloop在训练中调用的方法。
- 定义beam_search()方法,它使用定向搜索来获取数据迭代器和生成假设。NMT中的默认实现是GPU的批量(batched)版本。
如果您不需要做修改,可以随意复制NMT中的方法。
- 提出的模型
我们现在旨在解码器中提供一个Bahdanau风格注意力(Bahdanau-style attention)的条件GRU NMT (Conditional GRU NMT)的实现。
注意:我们建议通过在配置文件的[model]中定义max_trg_len来限制目标词汇表中tokens的数量,以避免在处理超大型词汇表出现GPU out of memory errors。这是由于在计算梯度的时候占用大量的内存造成的,如果要避免该错误,除非loss层的实现不同。
参考文献:
https://github.com//lium-lst/nmtpytorch
- Progressive Web Apps入门
- IDEA入门级使用教程
- 掌握Docker命令-Docker for Web Developers(4)
- InfoPath中repeating section中赋值操作
- 百布(baibu.la)完成1.65亿B+轮融资
- 八大排序算法总结与java实现
- Angular企业级开发(5)-项目框架搭建
- 如何让nginx显示文件夹目录
- Facebook Graph API(2)--读取数据之picture
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
- 2018年程序员的出路有哪些
- CSS魔法堂:不得不说的Containing Block
- Facebook Graph API(1)—介绍
- MongoDB学习系列(1)--入门介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法