想要上手机器翻译?飞桨教你用Transformer 一战到底

2019-09-26 16:52:51 浏览数 (1)

导读:机器翻译,能够实现多种语言之间的自动翻译,方便人类的沟通和交流,具有重要的研究和应用价值。Transformer是机器翻译领域的一个经典模型,一经问世,便取得了SOTA效果。本文将带领大家一同探秘Transformer,并送上基于飞桨实现 Transformer的实战教程。

1. 机器翻译概述

1.1.机器翻译是什么

机器翻译(Machine Translation, MT)是指用计算机来实现不同语言之间翻译的技术。被翻译的语言称为源语言(Source),翻译成的结果语言称为目标语言(Target)。机器翻译实现了从源语言到目标语言的转换,是自然语言处理领域的重要研究方向之一。

一个中英翻译的示例:

Source:我在周日读了一本书。

Target:I read abook on Sunday.

机器翻译的应用场景非常广泛:

(1)境外旅游:我国是世界上第一大出境旅游客源国,在语言不通的境外,无论是餐馆点餐、商场购物,还是问路打车、酒店咨询,都需要机器翻译的帮助。

(2)外语教育:学习外语对中国人来说是一件难事,借助机器翻译技术,可以做到“哪里不会点哪里”,让外语学习变得简单高效。

(3)文学作品翻译:阅读外国名著等文学作品时,可以借助机器翻译技术,消除语言障碍,带来更流畅的阅读体验。

(4)影视作品翻译:观看外国电影时,如果没有中文字幕,往往不知道剧中的人物都说了些什么,借助机器翻译技术,可以实现人物对话实时翻译,优化观影体验。

1.2.机器翻译的发展历程

机器翻译技术的发展大致经历了三个阶段:

(1)基于规则的机器翻译

早期的机器翻译系统多为基于规则的翻译系统,翻译知识来自人类专家。找人类语言学家来写规则,这一个词翻译成另外一个词。这个成分翻译成另外一个成分,在句子中的出现在什么位置,都用规则表示出来。这种方法的优点是直接用语言学专家知识,准确率非常高。缺点是什么呢?它的成本很高,比如说要开发中文和英文的翻译系统,需要找同时会中文和英文的语言学家。要开发另外一种语言的翻译系统,就要再找懂另外一种语言的语言学家。因此,基于规则的系统开发周期很长,成本很高。

(2)基于统计的机器翻译

大约到了上世纪九十年代出现了基于统计的方法,称之为统计机器翻译。在统计机器翻译技术中,转化规则是由机器自动从大规模的语料中学习得到的,而非人类主动提供规则。因此,它克服了基于规则的翻译系统所面临的知识获取瓶颈的问题,但仍然存在许多挑战:1)人为设计许多特征(feature),但永远无法覆盖所有的语言现象;2)难以利用全局的特征;3)依赖于许多预处理环节,如词语对齐、分词或符号化(tokenization)、规则抽取、句法分析等,而每个环节的错误会逐步累积,对翻译的影响也越来越大。

(3)基于神经网络的机器翻译

近年来,深度学习技术的发展为解决上述挑战提供了新的思路。将深度学习应用于机器翻译任务的方法大致分为两类:

a) 仍以统计机器翻译系统为框架,只是利用神经网络来改进其中的关键模块,如语言模型、调序模型等(见下图的左半部分);

b) 不再以统计机器翻译系统为框架,而是直接用神经网络将源语言映射到目标语言,即端到端的神经网络机器翻译(End-to-End Neural MachineTranslation, End-to-End NMT)(见下图的右半部分),简称为NMT模型。

2. Transformer模型介绍

Transformer是目前神经网络翻译中效果最好的模型,是在论文AttentionIs All You Need[1]中提出的针对序列到序列(sequence to sequence, Seq2Seq)学习任务的一种全新网络结构。

Transformer沿用了 Seq2Seq 任务中典型的编码器-解码器(Encoder-Decoder)的框架结构,但相较于此前广泛使用的循环神经网络(Recurrent Neural Network,RNN),Transformer完全使用注意力(Attention)机制来实现序列到序列的建模。

Transformer整体的网络结构如下:

Encoder部分由若干相同的 layer 堆叠组成,每个layer 主要由多头注意力(Multi-Head Attention)和全连接的前馈(Feed-Forward)网络这两个 sub-layer 构成。

  • Multi-HeadAttention 在这里用于实现 Self-Attention,相比于简单的 Attention 机制,其将输入进行多路线性变换后分别计算 Attention 的结果,并将所有结果拼接后再次进行线性变换作为输出。参见图2,其中 Attention 使用的是点积(Dot-Product),并在点积后进行了 scale 的处理以避免因点积结果过大进入 softmax 的饱和区域。
  • Feed-Forward 网络会对序列中的每个位置进行相同的计算(Position-wise),其采用的是两次线性变换中间加以 ReLU 激活的结构。

此外,每个 sub-layer 后还施以 Residual Connection[2] 和 LayerNormalization[3] 来促进梯度传播和模型收敛。

Decoder 具有和 Encoder 类似的结构,只是相比于组成 Encoder 的 layer ,在组成 Decoder 的 layer 中还多了一个 Multi-Head Attention 的 sub-layer 来实现对 Encoder 输出的 Attention,这个 Encoder-Decoder Attention 在其他 Seq2Seq 模型中也是存在的。

3. 飞桨Transformer快速上手

飞桨开源的Transformer 模型是基于WMT'16 EN-DE 数据集训练的,提供了Base和Big两种版本,在测试集上的评测结果如下:

测试集

newstest2014

newstest2015

newstest2016

Base model

26.35

29.07

33.30

Big model

27.07

30.09

34.38

下面为大家介绍飞桨Transformer的上手教程。

项目地址:

https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/neural_machine_translation/transformer

3.1.环境安装

(1)PaddlePaddle安装

本项目依赖于 PaddlePaddle Fluid 1.3.1 及以上版本。

(2)克隆代码

克隆开源代码库到本地。

代码语言:javascript复制
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/neural_machine_translation/transformer

3.2.数据准备

运行gen_data.sh脚本进行WMT'16 EN-DE 数据集的下载和预处理(时间较长,建议后台运行)。

数据处理过程主要包括Tokenize 和BPE 编码(byte-pair encoding)。运行成功后,将会生成文件夹gen_data,其目录结构如下:

.

├──wmt16_ende_data # WMT16 英德翻译数据

├──wmt16_ende_data_bpe # BPE 编码的 WMT16 英德翻译数据

├──mosesdecoder # Moses 机器翻译工具集,包含了 Tokenize、BLEU评估等脚本

└──subword-nmt # BPE 编码的代码

另外我们也整理提供了一份处理好的 WMT'16 EN-DE 数据以供使用(包含训练所需 BPE 数据和词典以及预测和评估所需的 BPE 数据和 tokenize 的数据)。

3.3.模型下载

我们开源了基于 WMT'16 EN-DE 数据训练好的Base、Big两种配置的Tranformer模型,您可以直接下载使用。

  • Base model 下载链接: https://transformer-res.bj.bcebos.com/base_model.tar.gz
  • Big model下载链接: https://transformer-res.bj.bcebos.com/big_model.tar.gz

3.4.模型预测

使用以上提供的数据和模型,可以按照以下代码进行预测,翻译结果将打印到标准输出。

代码语言:javascript复制
# base model
python -u infer.py 
--src_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
--trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
--special_token'<s>''<e>''<unk>' 
--test_file_patterngen_data/wmt16_ende_data_bpe/newstest2014.tok.bpe.32000.en-de 
--token_delimiter' ' 
--batch_size32 
model_pathtrained_models/iter_100000.infer.model 
beam_size 5 
max_out_len255
 
# big model
python -u infer.py 
--src_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
--trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
--special_token'<s>''<e>''<unk>' 
--test_file_patterngen_data/wmt16_ende_data_bpe/newstest2014.tok.bpe.32000.en-de 
--token_delimiter' ' 
--batch_size32 
model_pathtrained_models/iter_100000.infer.model 
n_head 16 
d_model 1024 
d_inner_hid4096 
prepostprocess_dropout0.3 
beam_size 5 
max_out_len255

3.5.模型评估

预测结果中每行输出是对应行输入的得分最高的翻译,对于使用BPE 的数据,预测出的翻译结果也将是 BPE 表示的数据,要还原成原始的数据(这里指 tokenize 后的数据)才能进行正确的评估。评估过程具体如下(BLEU 是翻译任务常用的自动评估方法指标):

代码语言:javascript复制
# 还原 predict.txt 中的预测结果为tokenize 后的数据
sed -r 's/(@@ )|(@@ ?$)//g' predict.txt > predict.tok.txt
# 若无 BLEU 评估工具,需先进行下载
# git clone https://github.com/moses-smt/mosesdecoder.git
# 以英德翻译 newstest2014 测试数据为例
perl gen_data/mosesdecoder/scripts/generic/multi-bleu.perlgen_data/wmt16_ende_data/newstest2014.tok.

完成后可以看到类似如下的结果:

BLEU = 26.35,57.7/32.1/20.0/13.0 (BP=1.000, ratio=1.013, hyp_len=63903, ref_len=63078)

4. 飞桨Transformer进阶使用

如果您不满足于直接使用训练好的开源模型,而是想尝试训练自己的模型,那么请继续往下阅读。

4.1.目录结构说明

飞桨开源Transformer项目的目录结构和说明如下:

.

├── images # README 文档中的图片

├── config.py # 训练、预测以及模型参数配置

├── infer.py # 预测脚本

├── reader.py # 数据读取接口

├── README.md # 文档

├── train.py # 训练脚本

└── gen_data.sh # 数据生成脚本

4.2.数据格式说明

本示例程序中支持的数据格式为制表符t分隔的源语言和目标语言句子对,句子中的token之间使用空格分隔。如需使用BPE编码,亦可以使用类似WMT'16 EN-DE 原始数据的格式,参照gen_data.sh进行处理。

4.3.训练自己的模型

数据准备完成后,可以使用train,py脚本进行训练。以提供的 WMT'16 EN-DE 数据为例,具体如下:

代码语言:javascript复制
python -u train.py 
  --src_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
  --trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
  --special_token '<s>''<e>''<unk>' 
  --train_file_patterngen_data/wmt16_ende_data_bpe/train.tok.clean.bpe.32000.en-de 
  --token_delimiter ' ' 
  --use_token_batch True 
  --batch_size 4096 
  --sort_type pool 
  --pool_size 200000

上述命令中设置了源语言词典文件路径(src_vocab_fpath)、目标语言词典文件路径(trg_vocab_fpath)、训练数据文件(train_file_pattern,支持通配符)等数据相关的参数和构造 batch 方式(use_token_batch 指定了数据按照 token 数目或者sequence 数目组成 batch)等 reader 相关的参数。有关这些参数更详细的信息可以通过执行以下命令查看:

pythontrain.py --help

更多模型训练相关的参数则在config.py中的ModelHyperParams和TrainTaskConfig内定义:

  • ModelHyperParams定义了embedding 维度等模型超参数;
  • TrainTaskConfig定义了 warmup 步数等训练需要的参数。

这些参数默认使用了 Transformer 论文中 base model 的配置,如需调整可以在该脚本中进行修改。另外这些参数同样可在执行训练脚本的命令行中设置,传入的配置会合并并覆盖config.py中的配置,如可以通过以下命令来训练Transformer论文中的big model :

代码语言:javascript复制
python -u train.py 
  --src_vocab_fpath gen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000
  --trg_vocab_fpathgen_data/wmt16_ende_data_bpe/vocab_all.bpe.32000 
  --special_token '<s>''<e>''<unk>' 
  --train_file_patterngen_data/wmt16_ende_data_bpe/train.tok.clean.bpe.32000.en-de 
  --token_delimiter ' ' 
  --use_token_batch True 
  --batch_size 3200 
  --sort_type pool 
  --pool_size 200000 
  n_head 16 
  d_model 1024 
  d_inner_hid 4096 
  prepostprocess_dropout 0.3

注:如果训练时更改了模型配置,使用infer.py预测时需要使用对应相同的模型配置;另外,训练时默认使用所有GPU,可以通过CUDA_VISIBLE_DEVICES环境变量来设置使用指定的GPU。

赶快自己动手尝试下吧!

想与更多的深度学习开发者交流,请加入飞桨官方QQ群:796771754。

如果您想详细了解更多飞桨PaddlePaddle的相关内容,请参阅以下文档。

官网地址:https://www.paddlepaddle.org.cn/

项目地址:

https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleNLP/neural_machine_translation/transformer

【Reference】

[1]https://arxiv.org/abs/1706.03762

[2]http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf

[3]https://arxiv.org/pdf/1607.06450.pdf

0 人点赞