Facebook AI发布新版本FairSeq序列到序列(Seq2Seq)学习工具,可生成故事与快速推断

【导读】Facebook AI Research发布(PyTorch)序列到序列学习工具集fairseq新版本:实现“Scaling Neural Machine Translation”论文描述的分布式训练、增加迁移学习、快速推断、故事生成等。


编译 | 专知

整理| Quan


1. 导读

Fairseq(-py)是一个序列建模工具包,允许研究人员和开发人员为翻译、摘要、语言建模和其他文本生成任务训练自定义模型。它提供了各种序列到序列模型的参考实现,包括:


  • 卷积神经网络 Convolutional Neural Networks (CNN)

    • Dauphin et al. (2017): Language Modeling with Gated Convolutional Networks

      简介:本文介绍了一种基于卷积网络CNN的语言模型建模方法,引入一种新的gate机制来简化梯度传播,这种gate机制执行效果比目前的LSTM效果好,而且效率明显提升。

      论文地址:

      http://www.zhuanzhi.ai/document/4f8dc853faa15ed8d68c247aec496956

    • Gehring et al. (2017): Convolutional Sequence to Sequence Learning

      简介:提出了完全使用CNN来构成Seq2Seq模型,用于机器翻译,超越了谷歌创造的基于LSTM机器翻译的效果。

    • 论文地址:

      http://www.zhuanzhi.ai/document/1694803e358b33e6575a694edbf2adb7

    • New Edunov et al. (2018): Classical Structured Prediction Losses for Sequence to Sequence Learning

      简介:序列学习Loss评估

      论文地址:

      http://www.zhuanzhi.ai/document/a935ada9ca22ffcc8341759033d1e407

    • New Fan et al. (2018): Hierarchical Neural Story Generation

      简介:论文使用层次话结构做故事生成,解决长依赖性问题。少信息->多信息,decoder self-attention + model fusion,decoder 时 word 从 word prob top10 中随机选取,可减少生成重复文本。

    • 论文地址:http://www.zhuanzhi.ai/document/3dcc0fdfbb9a370fb7ced8a2ce8f7fbb

  • 长短时记忆神经网络 Long Short-Term Memory (LSTM) networks

    • Luong et al. (2015): Effective Approaches to Attention-based Neural Machine Translation

      论文地址:https://arxiv.org/abs/1508.04025

    • Wiseman and Rush (2016): Sequence-to-Sequence Learning as Beam-Search Optimization

      简介:Sequence-to-Sequence(seq2seq)建模已经成为了一种重要的多用途自然语言处理工具,它已被证明在很多文本生成和排序任务中被证明有效。Seq2seq 建立在深度神经语言建模之上,并在局部的下一个词分布的估计中延续了其良好的精确度。在本研究中,我们介绍了一种模型和训练方式,基于 Daum'e III 和 Marcu(2005)的成果,同时扩展了 seq2seq 方式,使它可以学习全局序列分数。这种结构方式在证明了已有 seq2seq 模型架构能够进行有效训练的情况下,避免了传统方式上局部训练(local training)的常见偏差,同时通过测试使用时间使训练损失一致。我们发现与高度优化的基于注意的 seq2seq 系统以及其他系统相比,在三种不同的 sequence to sequence 任务中(词序,解析和机器翻译),我们的系统存在明显优势。

      论文地址:

      http://www.zhuanzhi.ai/document/5f19ee9b8a1073ab890b3db0b432fcaa

  • 变换(自注意力)网络Transformer (self-attention) networks

    • Vaswani et al. (2017): Attention Is All You Need

      简介:提出一种完全基于 attention 的翻译架构 Transformer,实现了机器翻译的新突破


      论文地址:

      http://www.zhuanzhi.ai/document/ac149a21f618b62539a0c6e7b1c0c79a

    • New Ott et al. (2018): Scaling Neural Machine Translation

      论文地址:

      http://www.zhuanzhi.ai/document/22ed668b95fb1580664fe6767afa42b8


Fairseq 特性:

  • 单机或多机的多GPU分布式训练

  • GPU与CPU上的快速集束搜索

  • 通过延迟更新进行大型小型批处理培训(即使是在单个GPU上)

  • 快速半精度浮点(FP16)训练

在开源的数据中,FairSeq提供了英译法和英译德的预训练模型。

2. 要求和安装

  • Pytorch安装

  • 为了训练新模型,你需要NVIDIA GPU和NCCL(https://github.com/NVIDIA/nccl)

  • Python 3.6

当前fairseq需要PyTorch的版本>= 0.4.0. 请按照如下进行安装: 

https://github.com/pytorch/pytorch#installation.

如果你使用Docker,请确保增加共享内存容量,使用--ipc=host 或者 --shm-size作为命令行 nvidia-docker run.

在PyTorch安装后,,可以使用如下命令安装fairseq:

pip install -r requirements.txt python setup.py build python setup.py develop


3. 快速开始

你将需要使用到如下的命令:

  • python preprocess.py: 数据预处理: 构造词汇和二进制训练数据

  • python train.py: 在一个或多个GPU上训练新的模型

  • python generate.py: 用训练好的模型翻译预处理之后的数据

  • python generate.py -i:用训练好的模型翻译新的文本

  • python score.py: 通过与参考译文对比,给出生成译文的BLEU分数

评估预训练模型:

首先,下载预训练好的模型和词汇:

$ curl https://s3.amazonaws.com/fairseq-py/models/wmt14.en-fr.fconv-py.tar.bz2 | tar xvjf -

模型中用的是BPE词汇(https://arxiv.org/abs/1508.07909),用户必须在翻译之前将编码应用到源文本。可以用apply_bpe.py 脚本中的wmt14.en-fr.fconv-cuda/bpecodes文件。@@是延续标记,原始文本可以通过sed s/@@ //g来恢复,此外把 --remove-bpe 标记传递到generate.py也有同样的作用。在生成BPE词汇之前。输入文本需要用mosesdecoder中的tokenizer.perl来标记。

下面是利用python interactive.py -i产生翻译的例子, beam size为5:

$ MODEL_DIR=wmt14.en-fr.fconv-py $ python interactive.py \ --path $MODEL_DIR/model.pt $MODEL_DIR \ --beam 5 | loading model(s) from wmt14.en-fr.fconv-py/model.pt | [en] dictionary: 44206 types | [fr] dictionary: 44463 types | Type the input sentence and press return: > Why is it rare to discover new marine mam@@ mal species ? O       Why is it rare to discover new marine mam@@ mal species ? H       -0.06429661810398102    Pourquoi est-il rare de découvrir de nouvelles espèces de mammifères marins ? A       0 1 3 3 5 6 6 8 8 8 7 11 12


4. 训练新模型

数据预处理

fairseq-py工具包中包含用于IWSLT 2014德转英语料库的一个预处理脚本样例。先将数据进行预处理和二进制编码:

$ cd examples/translation/ $ bash prepare-iwslt14.sh $ cd ../.. $ TEXT=data/iwslt14.tokenized.de-en $ python preprocess.py --source-lang de --target-lang en \  --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test \  --destdir data-bin/iwslt14.tokenized.de-en

这将会得到能够用于训练模型的二进制数据。

训练

用python train.py来训练新的模型,下面是能很好的适于 IWSLT 2014数据集中的一些样例设置。

$ mkdir -p checkpoints/fconv $ CUDA_VISIBLE_DEVICES=0 python train.py data-bin/iwslt14.tokenized.de-en \  --lr 0.25 --clip-norm 0.1 --dropout 0.2 --max-tokens 4000 \  --arch fconv_iwslt_de_en --save-dir checkpoints/fconv

默认情况下,python train.py会占用电脑中所有可用的GPU,可以用CUDA_VISIBLE_DEVICES环境来选择特定的GPU,或者改变使用的GPU数目。

有一点需要注意,batch大小是基于每个batch的最大token数来设置的,你需要基于系统中可用的GPU内存,选取一个稍小的值。

生成翻译

模型训练好之后就能利用python generate.py(用于二进制数据)或python generate.py -i(用于未处理文本)生成翻译了。

$ python generate.py data-bin/iwslt14.tokenized.de-en \  --path checkpoints/fconv/checkpoint_best.pt \  --batch-size 128 --beam 5  | [de] dictionary: 35475 types  | [en] dictionary: 24739 types  | data-bin/iwslt14.tokenized.de-en test 6750 examples  | model fconv  | loaded checkpoint trainings/fconv/checkpoint_best.pt  S-721   danke .  T-721   thank you .  ...

如果只想用一个CPU,加入--cpu标记。可以通过--remove-bpe移除掉BPE标记。


5. 预训练好的模型

目前开源的全卷积序列到序列模型如下:

  • wmt14.en-fr.fconv-py.tar.bz2(https://s3.amazonaws.com/fairseq-py/models/wmt14.en-fr.fconv-py.tar.bz2): 用于WMT14英译法的模型,包含词汇

  • wmt14.en-de.fconv-py.tar.bz2(https://s3.amazonaws.com/fairseq-py/models/wmt14.en-de.fconv-py.tar.bz2): 用于WMT14英译德的模型,包含词汇

针对以上模型,已经预处理和编码过的测试集如下:

  • wmt14.en-fr.newstest2014.tar.bz2(https://s3.amazonaws.com/fairseq-py/data/wmt14.en-fr.newstest2014.tar.bz2): 用于WMT14英译法的newstest2014测试集

  • wmt14.en-fr.ntst1213.tar.bz2(https://s3.amazonaws.com/fairseq-py/data/wmt14.en-fr.ntst1213.tar.bz2): 用于WMT14英译法的newstest2012和newstest2013测试集

  • wmt14.en-de.newstest2014.tar.bz2(https://s3.amazonaws.com/fairseq-py/data/wmt14.en-de.newstest2014.tar.bz2): 用于WMT14英译德的newstest2014测试集

下面是在一块GTX-1080ti上利用测试集产生结果的样例(英译德),运行在batch模式下:

$ curl https://s3.amazonaws.com/fairseq-py/models/wmt14.en-fr.fconv-py.tar.bz2 | tar xvjf - -C data-bin
$ curl https://s3.amazonaws.com/fairseq-py/data/wmt14.en-fr.newstest2014.tar.bz2 | tar xvjf - -C data-bin
$ python generate.py data-bin/wmt14.en-fr.newstest2014  \
 --path data-bin/wmt14.en-fr.fconv-py/model.pt \
 --beam 5 --batch-size 128 --remove-bpe | tee /tmp/gen.out
...
| Translated 3003 sentences (95451 tokens) in 81.3s (1174.33 tokens/s)
| Generate test with beam=5: BLEU4 = 40.23, 67.5/46.4/33.8/25.0 (BP=0.997, ratio=1.003, syslen=80963, reflen=81194)

# Scoring with score.py:

$ grep ^H /tmp/gen.out | cut -f3- > /tmp/gen.out.sys
$ grep ^T /tmp/gen.out | cut -f2- > /tmp/gen.out.ref
$ python score.py --sys /tmp/gen.out.sys --ref /tmp/gen.out.ref
BLEU4 = 40.23, 67.5/46.4/33.8/25.0 (BP=0.997, ratio=1.003, syslen=80963, reflen=81194)



6. 引用

如果你的论文中用了FAIR的相关代码,可以这样引用:

@inproceedings{

    gehring2017convs2s,
    author = {Gehring, Jonas, and Auli, Michael and Grangier, David and Yarats, Denis and Dauphin, Yann N},
     title = "{Convolutional Sequence to Sequence Learning}",
     booktitle = {Proc. of ICML},
     year = 2017,
}

via:GitHub(https://github.com/facebookresearch/fairseq-py)


-END-

专 · 知

人工智能领域26个主题知识资料全集获取加入专知人工智能服务群: 欢迎微信扫一扫加入专知人工智能知识星球群,获取专业知识教程视频资料和与专家交流咨询!


请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请加专知小助手微信(扫一扫如下二维码添加),加入专知主题群(请备注主题类型:AI、NLP、CV、 KG等)交流~

关注专知公众号,获取人工智能的专业知识!

点击“阅读原文”,使用专知

展开全文
Top
微信扫码咨询专知VIP会员