导读:机器翻译,能够实现多种语言之间的自动翻译,方便人类的沟通和交流,具有重要的研究和应用价值。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