前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >想要上手机器翻译?飞桨教你用Transformer 一战到底

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

作者头像
用户1386409
发布2019-09-26 16:52:51
1.1K0
发布2019-09-26 16:52:51
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 机器翻译概述
    • 1.1.机器翻译是什么
      • 1.2.机器翻译的发展历程
      • 2. Transformer模型介绍
      • 3. 飞桨Transformer快速上手
        • 3.1.环境安装
          • 3.2.数据准备
            • 3.3.模型下载
              • 3.4.模型预测
                • 3.5.模型评估
                • 4. 飞桨Transformer进阶使用
                  • 4.1.目录结构说明
                    • 4.2.数据格式说明
                      • 4.3.训练自己的模型
                      相关产品与服务
                      机器翻译
                      机器翻译(Tencent Machine Translation,TMT)结合了神经机器翻译和统计机器翻译的优点,从大规模双语语料库自动学习翻译知识,实现从源语言文本到目标语言文本的自动翻译,目前可支持十余种语言的互译。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档