From 1a6ea9924ae75fcc854d186fbbf8c25ba133ccf4 Mon Sep 17 00:00:00 2001 From: Zeyu Chen Date: Mon, 1 Feb 2021 09:38:23 +0800 Subject: [PATCH] Update exmaple's README --- .../examples/language_model/rnnlm/README.md | 21 +-- .../language_model/transformer-xl/README.md | 1 + .../machine_translation/transformer/README.md | 126 +++++++----------- 3 files changed, 53 insertions(+), 95 deletions(-) diff --git a/PaddleNLP/examples/language_model/rnnlm/README.md b/PaddleNLP/examples/language_model/rnnlm/README.md index 8ffc4635..8f50c9f0 100644 --- a/PaddleNLP/examples/language_model/rnnlm/README.md +++ b/PaddleNLP/examples/language_model/rnnlm/README.md @@ -46,6 +46,7 @@ ### 训练或fine-tune + 任务训练启动命令如下: ``` @@ -80,24 +81,6 @@ mr. is chairman of n.v. the dutch publishing group 特殊说明:ptb的数据比较特殊,ptb的数据来源于一些文章,相邻的句子可能来源于一个段落或者相邻的段落,ptb 数据不能做shuffle。 - -## 4. 目录结构 - -```text -. -├── README.md # 文档 -├── train.py # 训练代码 -├── model.py # 模型定义文件 -├── args.py # 参数读取 -``` - -## 5. 如何组建自己的模型 +## 4. 如何组建自己的模型 + **自定义数据:** 关于数据,如果可以把自己的数据先进行分词(或者tokenize),通过`--data_path`来指定本地数据集所在文件夹,并需要在`train.py`中修改对应的文件名称。 + **网络结构更改:** 网络只实现了基于lstm的语言模型,用户可以自己的需求更换为gru等网络结构,这些实现都是在`model.py`中定义。 - - -# 其他 - -## 如何贡献代码 - -如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。 diff --git a/PaddleNLP/examples/language_model/transformer-xl/README.md b/PaddleNLP/examples/language_model/transformer-xl/README.md index 703f79b8..d82c3ced 100644 --- a/PaddleNLP/examples/language_model/transformer-xl/README.md +++ b/PaddleNLP/examples/language_model/transformer-xl/README.md @@ -125,4 +125,5 @@ python eval.py --config ./configs/wt103.yaml 完成推断之后,会将显示在验证集和测试集上的 loss 的结果。 ## 参考文献 + [Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context](http://arxiv.org/abs/1901.02860) diff --git a/PaddleNLP/examples/machine_translation/transformer/README.md b/PaddleNLP/examples/machine_translation/transformer/README.md index e233b709..c747370f 100644 --- a/PaddleNLP/examples/machine_translation/transformer/README.md +++ b/PaddleNLP/examples/machine_translation/transformer/README.md @@ -1,46 +1,64 @@ -## Transformer - -以下是本例的简要目录结构及说明: - -```text -. -├── images/ # README 文档中的图片 -├── predict.py # 预测脚本 -├── reader.py # 数据读取接口 -├── README.md # 文档 -├── train.py # 训练脚本 -└── configs/ # 配置文件 -``` +# Machine Translation using Transformer -## 模型简介 +机器翻译(Machine Translation)是利用计算机将一种自然语言(源语言)转换为另一种自然语言(目标语言)的过程,输入为源语言句子,输出为相应的目标语言的句子。 -机器翻译(machine translation, MT)是利用计算机将一种自然语言(源语言)转换为另一种自然语言(目标语言)的过程,输入为源语言句子,输出为相应的目标语言的句子。 +本项目是机器翻译领域主流模型 Transformer 的 PaddlePaddle 实现,包含模型训练,预测以及使用自定义数据等内容。用户可以基于发布的内容搭建自己的翻译模型。 -本项目是机器翻译领域主流模型 Transformer 的 PaddlePaddle 实现, 包含模型训练,预测以及使用自定义数据等内容。用户可以基于发布的内容搭建自己的翻译模型。 +## 模型介绍 +Transformer 是论文 [Attention Is All You Need](https://arxiv.org/abs/1706.03762) 中提出的用以完成机器翻译(Machine Translation)等序列到序列(Seq2Seq)学习任务的一种全新网络结构,其完全使用注意力(Attention)机制来实现序列到序列的建模[1]。 +

+
+图 1. Transformer 网络结构图 +

-## 快速开始 +相较于此前 Seq2Seq 模型中广泛使用的循环神经网络(Recurrent Neural Network, RNN),使用Self Attention进行输入序列到输出序列的变换主要具有以下优势: -### 安装说明 +- 计算复杂度小 + - 特征维度为 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 中任何两个位置都直接相连;路径越短信号传播越容易。 -1. paddle安装 +Transformer 中引入使用的基于 Self-Attention 的序列建模模块结构,已被广泛应用在 Bert [2]等语义表示模型中,取得了显著效果。 - 本项目依赖于 PaddlePaddle 2.0rc1 及以上版本或适当的develop版本,请参考 [安装指南](https://www.paddlepaddle.org.cn/install/quick) 进行安装 +### 模型特点 -2. 下载代码 +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 激活的结构。 - 克隆代码库到本地 +此外,每个 sub-layer 后还施以 Residual Connection [3]和 Layer Normalization [4]来促进梯度传播和模型收敛。 -3. 环境依赖 +

+
+图 2. Multi-Head Attention +

+ +Decoder 具有和 Encoder 类似的结构,只是相比于组成 Encoder 的 layer ,在组成 Decoder 的 layer 中还多了一个 Multi-Head Attention 的 sub-layer 来实现对 Encoder 输出的 Attention,这个 Encoder-Decoder Attention 在其他 Seq2Seq 模型中也是存在的。 + +## 安装说明 + + * PaddlePaddle安装 - 该模型使用PaddlePaddle,关于环境依赖部分,请先参考PaddlePaddle[安装说明](https://www.paddlepaddle.org.cn/documentation/docs/zh/install/index_cn.html)关于环境依赖部分的内容。 - 此外,需要另外涉及: - * attrdict - * pyyaml + 本项目依赖于 PaddlePaddle 2.0 及以上版本或适当的develop版本,请参考 [安装指南](https://www.paddlepaddle.org.cn/install/quick) 进行安装 +* PaddleNLP安装 +```shell +pip install paddlenlp>=2.0.0rc +``` + +* 环境依赖 + - attrdict + - pyyaml + +```shell +pip install attrdict pyyaml +``` -### 数据准备 +## 数据准备 公开数据集:WMT 翻译大赛是机器翻译领域最具权威的国际评测大赛,其中英德翻译任务提供了一个中等规模的数据集,这个数据集是较多论文中使用的数据集,也是 Transformer 论文中用到的一个数据集。我们也将[WMT'14 EN-DE 数据集](http://www.statmt.org/wmt14/translation-task.html)作为示例提供。 @@ -53,14 +71,14 @@ transform_func = WMT14ende.get_default_transform_func(root=root) dataset = WMT14ende.get_datasets(mode="train", transform_func=transform_func) ``` -### 单机训练 +## 单机训练 ### 单机单卡 以提供的英德翻译数据为例,可以执行以下命令进行模型训练: ``` sh -# setting visible devices for training +# Setting visible devices for training export CUDA_VISIBLE_DEVICES=0 python train.py --config ./configs/transformer.base.yaml ``` @@ -78,7 +96,7 @@ python -m paddle.distributed.launch --gpus "0,1,2,3,4,5,6,7" train.py --config . 与上面的情况相似,可以在 `configs/transformer.big.yaml` 和 `configs/transformer.base.yaml` 文件中设置相应的参数。如果执行不提供 `--config` 选项,程序将默认使用 big model 的配置。 -### 模型推断 +## 模型推断 以英德翻译数据为例,模型训练完成后可以执行以下命令对指定文件中的文本进行翻译: @@ -93,7 +111,7 @@ python predict.py --config ./configs/transformer.base.yaml 需要注意的是,目前预测仅实现了单卡的预测,原因在于,翻译后面需要的模型评估依赖于预测结果写入文件顺序,多卡情况下,目前暂未支持将结果按照指定顺序写入文件。 -### 模型评估 +## 模型评估 预测结果中每行输出是对应行输入的得分最高的翻译,对于使用 BPE 的数据,预测出的翻译结果也将是 BPE 表示的数据,要还原成原始的数据(这里指 tokenize 后的数据)才能进行正确的评估。评估过程具体如下(BLEU 是翻译任务常用的自动评估方法指标): @@ -111,50 +129,6 @@ perl mosesdecoder/scripts/generic/multi-bleu.perl ~/.paddlenlp/datasets/machine_ BLEU = 27.48, 58.6/33.2/21.1/13.9 (BP=1.000, ratio=1.012, hyp_len=65312, ref_len=64506) ``` -## 进阶使用 - -### 背景介绍 - -Transformer 是论文 [Attention Is All You Need](https://arxiv.org/abs/1706.03762) 中提出的用以完成机器翻译(machine translation, MT)等序列到序列(sequence to sequence, Seq2Seq)学习任务的一种全新网络结构,其完全使用注意力(Attention)机制来实现序列到序列的建模[1]。 - -相较于此前 Seq2Seq 模型中广泛使用的循环神经网络(Recurrent Neural Network, RNN),使用(Self)Attention 进行输入序列到输出序列的变换主要具有以下优势: - -- 计算复杂度小 - - 特征维度为 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 中任何两个位置都直接相连;路径越短信号传播越容易。 - -Transformer 中引入使用的基于 Self-Attention 的序列建模模块结构,已被广泛应用在 Bert [2]等语义表示模型中,取得了显著效果。 - - -### 模型概览 - -Transformer 同样使用了 Seq2Seq 模型中典型的编码器-解码器(Encoder-Decoder)的框架结构,整体网络结构如图1所示。 - -

-
-图 1. Transformer 网络结构图 -

- -可以看到,和以往 Seq2Seq 模型不同,Transformer 的 Encoder 和 Decoder 中不再使用 RNN 的结构。 - -### 模型特点 - -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 激活的结构。 - -此外,每个 sub-layer 后还施以 Residual Connection [3]和 Layer Normalization [4]来促进梯度传播和模型收敛。 - -

-
-图 2. Multi-Head Attention -

- -Decoder 具有和 Encoder 类似的结构,只是相比于组成 Encoder 的 layer ,在组成 Decoder 的 layer 中还多了一个 Multi-Head Attention 的 sub-layer 来实现对 Encoder 输出的 Attention,这个 Encoder-Decoder Attention 在其他 Seq2Seq 模型中也是存在的。 - ## FAQ **Q:** 预测结果中样本数少于输入的样本数是什么原因 -- GitLab