README.md 8.8 KB
Newer Older
Z
Zeyu Chen 已提交
1
# Machine Translation using Transformer
Z
Zeyu Chen 已提交
2

Z
Zeyu Chen 已提交
3
机器翻译(Machine Translation)是利用计算机将一种自然语言(源语言)转换为另一种自然语言(目标语言)的过程,输入为源语言句子,输出为相应的目标语言的句子。
Z
Zeyu Chen 已提交
4

Z
Zeyu Chen 已提交
5
本项目是机器翻译领域主流模型 Transformer 的 PaddlePaddle 实现,包含模型训练,预测以及使用自定义数据等内容。用户可以基于发布的内容搭建自己的翻译模型。
Z
Zeyu Chen 已提交
6

Z
Zeyu Chen 已提交
7 8
## 模型介绍
Transformer 是论文 [Attention Is All You Need](https://arxiv.org/abs/1706.03762) 中提出的用以完成机器翻译(Machine Translation)等序列到序列(Seq2Seq)学习任务的一种全新网络结构,其完全使用注意力(Attention)机制来实现序列到序列的建模[1]。
Z
Zeyu Chen 已提交
9

Z
Zeyu Chen 已提交
10 11 12 13
<p align="center">
<img src="images/transformer_network.png" height=400 hspace='10'/> <br />
图 1. Transformer 网络结构图
</p>
Z
Zeyu Chen 已提交
14

Z
Zeyu Chen 已提交
15
相较于此前 Seq2Seq 模型中广泛使用的循环神经网络(Recurrent Neural Network, RNN),使用Self Attention进行输入序列到输出序列的变换主要具有以下优势:
Z
Zeyu Chen 已提交
16

Z
Zeyu Chen 已提交
17 18 19 20 21 22
- 计算复杂度小
  - 特征维度为 d 、长度为 n 的序列,在 RNN 中计算复杂度为 `O(n * d * d)` (n 个时间步,每个时间步计算 d 维的矩阵向量乘法),在 Self-Attention 中计算复杂度为 `O(n * n * d)` (n 个时间步两两计算 d 维的向量点积或其他相关度函数),n 通常要小于 d 。
- 计算并行度高
  - RNN 中当前时间步的计算要依赖前一个时间步的计算结果;Self-Attention 中各时间步的计算只依赖输入不依赖之前时间步输出,各时间步可以完全并行。
- 容易学习长程依赖(long-range dependencies)
  - RNN 中相距为 n 的两个位置间的关联需要 n 步才能建立;Self-Attention 中任何两个位置都直接相连;路径越短信号传播越容易。
Z
Zeyu Chen 已提交
23

Z
Zeyu Chen 已提交
24
Transformer 中引入使用的基于 Self-Attention 的序列建模模块结构,已被广泛应用在 Bert [2]等语义表示模型中,取得了显著效果。
Z
Zeyu Chen 已提交
25

Z
Zeyu Chen 已提交
26
### 模型特点
Z
Zeyu Chen 已提交
27

Z
Zeyu Chen 已提交
28 29 30
Transformer 中的 Encoder 由若干相同的 layer 堆叠组成,每个 layer 主要由多头注意力(Multi-Head Attention)和全连接的前馈(Feed-Forward)网络这两个 sub-layer 构成。
- Multi-Head Attention 在这里用于实现 Self-Attention,相比于简单的 Attention 机制,其将输入进行多路线性变换后分别计算 Attention 的结果,并将所有结果拼接后再次进行线性变换作为输出。参见图2,其中 Attention 使用的是点积(Dot-Product),并在点积后进行了 scale 的处理以避免因点积结果过大进入 softmax 的饱和区域。
- Feed-Forward 网络会对序列中的每个位置进行相同的计算(Position-wise),其采用的是两次线性变换中间加以 ReLU 激活的结构。
Z
Zeyu Chen 已提交
31

Z
Zeyu Chen 已提交
32
此外,每个 sub-layer 后还施以 Residual Connection [3]和 Layer Normalization [4]来促进梯度传播和模型收敛。
Z
Zeyu Chen 已提交
33

Z
Zeyu Chen 已提交
34 35 36 37 38 39 40 41 42 43
<p align="center">
<img src="images/multi_head_attention.png" height=300 hspace='10'/> <br />
图 2. Multi-Head Attention
</p>

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

## 安装说明

 * PaddlePaddle安装
Z
Zeyu Chen 已提交
44

Z
Zeyu Chen 已提交
45
    本项目依赖于 PaddlePaddle 2.0 及以上版本或适当的develop版本,请参考 [安装指南](https://www.paddlepaddle.org.cn/install/quick) 进行安装
Z
Zeyu Chen 已提交
46

Z
Zeyu Chen 已提交
47
* PaddleNLP安装
Z
Zeyu Chen 已提交
48

Z
Zeyu Chen 已提交
49 50 51 52 53 54 55 56 57 58 59
```shell
pip install paddlenlp>=2.0.0rc
```

* 环境依赖
  - attrdict
  - pyyaml

```shell
pip install attrdict pyyaml
```
Z
Zeyu Chen 已提交
60

Z
Zeyu Chen 已提交
61
## 数据准备
Z
Zeyu Chen 已提交
62 63 64

公开数据集:WMT 翻译大赛是机器翻译领域最具权威的国际评测大赛,其中英德翻译任务提供了一个中等规模的数据集,这个数据集是较多论文中使用的数据集,也是 Transformer 论文中用到的一个数据集。我们也将[WMT'14 EN-DE 数据集](http://www.statmt.org/wmt14/translation-task.html)作为示例提供。

65 66 67 68 69 70 71 72 73
同时,我们提供了一份已经处理好的数据集,可以编写如下代码,对应的数据集将会自动下载并且解压到 `~/.paddlenlp/datasets/machine_translation/WMT14ende/`

``` python
# 获取默认的数据处理方式
transform_func = WMT14ende.get_default_transform_func(root=root)
# 下载并处理 WMT14.en-de 翻译数据集
dataset = WMT14ende.get_datasets(mode="train", transform_func=transform_func)
```

Z
Zeyu Chen 已提交
74
## 单机训练
Z
Zeyu Chen 已提交
75 76 77 78 79

### 单机单卡

以提供的英德翻译数据为例,可以执行以下命令进行模型训练:

L
liu zhengxi 已提交
80
``` sh
Z
Zeyu Chen 已提交
81
# Setting visible devices for training
Z
Zeyu Chen 已提交
82
export CUDA_VISIBLE_DEVICES=0
83
python train.py --config ./configs/transformer.base.yaml
Z
Zeyu Chen 已提交
84 85
```

L
liu zhengxi 已提交
86
可以在 `configs/transformer.big.yaml``configs/transformer.base.yaml` 文件中设置相应的参数。如果执行不提供 `--config` 选项,程序将默认使用 big model 的配置。
Z
Zeyu Chen 已提交
87 88 89 90 91

### 单机多卡

同样,可以执行如下命令实现八卡训练:

L
liu zhengxi 已提交
92
``` sh
Z
Zeyu Chen 已提交
93
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
94
python -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" train.py --config ./configs/transformer.base.yaml
Z
Zeyu Chen 已提交
95 96
```

L
liu zhengxi 已提交
97
与上面的情况相似,可以在 `configs/transformer.big.yaml``configs/transformer.base.yaml` 文件中设置相应的参数。如果执行不提供 `--config` 选项,程序将默认使用 big model 的配置。
Z
Zeyu Chen 已提交
98

Z
Zeyu Chen 已提交
99
## 模型推断
Z
Zeyu Chen 已提交
100 101 102

以英德翻译数据为例,模型训练完成后可以执行以下命令对指定文件中的文本进行翻译:

L
liu zhengxi 已提交
103
``` sh
Z
Zeyu Chen 已提交
104 105
# setting visible devices for prediction
export CUDA_VISIBLE_DEVICES=0
L
liu zhengxi 已提交
106
python predict.py --config ./configs/transformer.base.yaml
Z
Zeyu Chen 已提交
107 108
```

L
liu zhengxi 已提交
109 110 111
`predict_file` 指定的文件中文本的翻译结果会输出到 `output_file` 指定的文件。执行预测时需要设置 `init_from_params` 来给出模型所在目录,更多参数的使用可以在 `configs/transformer.big.yaml``configs/transformer.base.yaml` 文件中查阅注释说明并进行更改设置。如果执行不提供 `--config` 选项,程序将默认使用 big model 的配置。

 需要注意的是,目前预测仅实现了单卡的预测,原因在于,翻译后面需要的模型评估依赖于预测结果写入文件顺序,多卡情况下,目前暂未支持将结果按照指定顺序写入文件。
Z
Zeyu Chen 已提交
112 113


Z
Zeyu Chen 已提交
114
## 模型评估
Z
Zeyu Chen 已提交
115 116 117

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

L
liu zhengxi 已提交
118
``` sh
Z
Zeyu Chen 已提交
119 120 121
# 还原 predict.txt 中的预测结果为 tokenize 后的数据
sed -r 's/(@@ )|(@@ ?$)//g' predict.txt > predict.tok.txt
# 若无 BLEU 评估工具,需先进行下载
122
git clone https://github.com/moses-smt/mosesdecoder.git
Z
Zeyu Chen 已提交
123
# 以英德翻译 newstest2014 测试数据为例
124
perl mosesdecoder/scripts/generic/multi-bleu.perl ~/.paddlenlp/datasets/machine_translation/WMT14ende/WMT14.en-de/wmt14_ende_data/newstest2014.tok.de < predict.tok.txt
Z
Zeyu Chen 已提交
125
```
L
liu zhengxi 已提交
126 127

执行上述操作之后,可以看到类似如下的结果,此处结果是 big model 在 newstest2014 上的 BLEU 结果:
Z
Zeyu Chen 已提交
128
```
129
BLEU = 27.48, 58.6/33.2/21.1/13.9 (BP=1.000, ratio=1.012, hyp_len=65312, ref_len=64506)
Z
Zeyu Chen 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
```

## FAQ

**Q:** 预测结果中样本数少于输入的样本数是什么原因  
**A:** 若样本中最大长度超过 `transformer.yaml``max_length` 的默认设置,请注意运行时增大 `--max_length` 的设置,否则超长样本将被过滤。

**Q:** 预测时最大长度超过了训练时的最大长度怎么办  
**A:** 由于训练时 `max_length` 的设置决定了保存模型 position encoding 的大小,若预测时长度超过 `max_length`,请调大该值,会重新生成更大的 position encoding 表。


## 参考文献
1. Vaswani A, Shazeer N, Parmar N, et al. [Attention is all you need](http://papers.nips.cc/paper/7181-attention-is-all-you-need.pdf)[C]//Advances in Neural Information Processing Systems. 2017: 6000-6010.
2. Devlin J, Chang M W, Lee K, et al. [Bert: Pre-training of deep bidirectional transformers for language understanding](https://arxiv.org/abs/1810.04805)[J]. arXiv preprint arXiv:1810.04805, 2018.
3. He K, Zhang X, Ren S, et al. [Deep residual learning for image recognition](http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf)[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.
4. Ba J L, Kiros J R, Hinton G E. [Layer normalization](https://arxiv.org/pdf/1607.06450.pdf)[J]. arXiv preprint arXiv:1607.06450, 2016.
5. Sennrich R, Haddow B, Birch A. [Neural machine translation of rare words with subword units](https://arxiv.org/pdf/1508.07909)[J]. arXiv preprint arXiv:1508.07909, 2015.