From a55ba4757abb8dc30c84d9acf554816be3f372a2 Mon Sep 17 00:00:00 2001 From: Xiaoyao Xi <24541791+xixiaoyao@users.noreply.github.com> Date: Mon, 4 Nov 2019 20:50:15 +0800 Subject: [PATCH] Update README.md --- README.md | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index bd6636a..1dbd9c5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,8 @@ PaddlePALM (Paddle for Multi-task) 是一个强大快速、灵活易用的NLP大 - [进阶篇](#进阶篇) - [配置广播机制](#配置广播机制) - [reader、backbone与paradigm的选择](#readerbackbone与paradigm的选择) - - [训练终止条件与预期训练步数](#训练终止条件与预期训练步数) + - [多目标任务下的训练终止条件与预期训练步数](#多目标任务下的训练终止条件与预期训练步数) + - [多个目标任务](#多个目标任务) - [训练终止条件](#训练终止条件) - [任务采样概率与预期训练步数](#任务采样概率与预期训练步数) - [多个目标任务时预期训练步数的计算](#多个目标任务时预期训练步数的计算) @@ -49,7 +50,7 @@ cd PALM && python setup.py install **环境依赖** -- Python >= 2.7 (暂不支持python3) +- Python >= 2.7 (即将支持python3) - cuda >= 9.0 - cudnn >= 7.0 - PaddlePaddle >= 1.6.1 (请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装) @@ -79,14 +80,16 @@ paddlepalm框架的运行原理图如图所示 ### 预训练模型 -我们提供了BERT、ERNIE等主干网络的相关预训练模型。为了加速模型收敛,获得更佳的测试集表现,我们强烈建议用户在多任务学习时尽量在预训练模型的基础上进行(而不是从参数随机初始化开始)。用户可通过运行`script/download_pretrain_models `下载需要的预训练模型,例如,下载预训练BERT模型的命令如下 +#### 下载 +我们提供了BERT、ERNIE等主干网络的相关预训练模型。为了加速模型收敛,获得更佳的测试集表现,我们强烈建议用户在多任务学习时尽量在预训练模型的基础上进行(而不是从参数随机初始化开始)。用户可通过运行`script/download_pretrain_models `下载需要的预训练模型,例如,下载预训练BERT模型(uncased large)的命令如下 ```shell bash script/download_pretrain_backbone.sh bert ``` -脚本会自动在当前文件夹中创建一个pretrain_model目录,并在其中创建bert子目录,里面存放预训练模型(`params`文件夹内)、相关的网络参数(`bert_config.json`)和字典(`vocab.txt`)。 +脚本会自动在当前文件夹中创建一个pretrain_model目录,并在其中创建bert子目录,里面存放预训练模型(`params`文件夹内)、相关的网络参数(`bert_config.json`)和字典(`vocab.txt`)。除了BERT模型,脚本还提供了ERNIE预训练模型(uncased large)的一键下载,将``改成`ernie`即可。全部可用的预训练模型列表见[paddlenlp/lark](https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/PaddleLARK) +#### 转换 注意,预训练模型不能直接被框架使用。我们提供了转换脚本可以将其转换成paddlepalm的模型格式。如下,通过运行`script/convert_params.sh`可将预训练模型bert转换成框架的模型格式。 ```shell @@ -104,7 +107,7 @@ bash script/recover_params.sh pretrain_model/bert/params ### DEMO1:单任务训练 -框架支持对任何一个内置任务进行传统的单任务训练。接下来我们启动一个复杂的机器阅读理解任务的训练,我们在`data/mrqa`文件夹中提供了[EMNLP2019 MRQA机器阅读理解评测](https://mrqa.github.io/shared)的部分比赛数据。 +框架支持对任何一个内置任务进行传统的单任务训练。接下来我们启动一个复杂的机器阅读理解任务的训练,我们在`data/mrqa`文件夹中提供了[EMNLP2019 MRQA机器阅读理解评测](https://mrqa.github.io/shared)的部分比赛数据。下面我们利用该数据尝试完成一个基于BERT的机器阅读理解任务MRQA的单任务学习。 用户可通过运行如下脚本一键开始本节任务的训练 @@ -194,7 +197,7 @@ mrqa: inference model saved at output_model/firstrun/mrqa/infer_model ### DEMO2:多任务辅助训练与目标任务预测 -本节我们考虑更加复杂的学习目标,我们引入一个掩码语言模型(Mask Language Model,MLM)问答匹配(QA Match)任务来辅助MRQA任务的学习。在多任务训练结束后,我们希望使用训练好的模型来对MRQA任务的测试集进行预测。 +本节我们考虑更加复杂的学习目标,我们引入一个掩码语言模型(Mask Language Model,MLM)问答匹配(QA Match)任务来辅助上一节MRQA任务的训练,相关训练数据分别位于`data/mlm4mrqa`和`data/match4mrqa`。并且我们这里换用ERNIE模型作为主干网络,来获得更佳的效果。在多任务训练结束后,我们使用训练好的模型来对MRQA任务的测试集进行预测。 用户可通过运行如下脚本直接开始本节任务的训练 @@ -325,13 +328,9 @@ mrqa: inference model saved at output_model/secondrun/mrqa/infer_model ### DEMO3:多目标任务联合训练与任务层参数复用 -框架内支持设定多个目标任务,当全局配置文件的`task_instance`字段指定超过一个任务实例时,**这多个任务实例默认均为目标任务(即`target_tag`字段被自动填充为全1)**。对于被设置成目标任务的任务实例,框架会为其计算预期的训练步数(详情见下一节《进阶篇》)并在达到预期训练步数后为其保存预测模型。 +本节我们考虑一个更加复杂的大规模多任务学习场景。假如手头有若干任务,其中每个任务都可能将来被用于预测(即均为目标任务),且鉴于这若干个任务之间存在一些相关性,我们希望将其中一部分任务的任务层参数也进行复用。分类数据集位于`data/cls4mrqa`内。 -当框架存在多个目标任务时,全局配置文件中的`num_epochs`(训练集遍历次数)仅会作用于第一个出现的目标任务,称为主任务(main task)。框架会根据主任务的训练步数来推理其他目标任务的预期训练步数(可通过`mix_ratio`控制,详情见下一节《进阶篇》)。**注意,除了用来标记`num_epochs`的作用对象外,主任务与其他目标任务没有任何不同。** - -*注意:在多目标任务训练时,依然可以使用DEMO2中的辅助任务来提升所有目标任务的测试集表现,但是要注意使用target_tag为引入的辅助任务打上辅助标记「0」* - -例如我们有6个分类任务(CLS1 ~ CLS6),均为目标任务(每个任务的模型都希望未来拿来做预测和部署),且我们希望任务1,2,5的任务输出层共享同一份参数,任务3、4共享同一份参数,任务6自己一份参数,即希望对6个任务实现如图所示的参数复用关系。 +具体来说,例如我们有6个分类任务(CLS1 ~ CLS6),均为目标任务(每个任务的模型都希望未来拿来做预测和部署),且我们希望任务1,2,5的任务输出层共享同一份参数,任务3、4共享同一份参数,任务6自己一份参数,即希望对6个任务实现如图所示的参数复用关系。 ![image2](https://tva1.sinaimg.cn/large/006y8mN6ly1g8issdoli5j31ow08ogxv.jpg) @@ -344,7 +343,7 @@ task_reuse_tag: 0, 0, 1, 1, 0, 2 ``` 同时,这6个任务均为目标任务,因此我们不需要手动设置`target_tag`了(任务默认即为目标任务)。不过,**设置多个目标的情况下,依然可以添加辅助任务陪同这些目标任务进行训练**,这时候就需要引入`target_tag`来区分目标任务和辅助任务了。 - +而后我们像DEMO1和DEMO2一样创建`Controller`启动多任务训练,可以看到如下日志输出。 ``` Global step: 1. Task: cls4, step 1/15 (epoch 0), loss: 1.344, speed: 0.50 steps/s @@ -368,6 +367,7 @@ cls3: train finished! cls3: inference model saved at output_model/thirdrun/infer_model ``` +对本DEMO更深入的理解可以参考[多目标任务下的训练终止条件与预期训练步数](#多目标任务下的训练终止条件与预期训练步数)。 ## 进阶篇 本章节更深入的对paddlepalm的使用方法展开介绍,并提供一些提高使用效率的小技巧。 @@ -420,7 +420,15 @@ reader、backbone和paradigm是实现各类任务的三大基础组件,其中r 当用户创建任务实例时,只需要保证每个组件的输入对象是包含在上游组件的输出内的,那么这些组件就可以搭配在一起使用。其中,backbone的上游组件是reader,paradigm的上游组件同时包含reader和backbone。 -### 训练终止条件与预期训练步数 +### 多目标任务下的训练终止条件与预期训练步数 + +#### 多个目标任务 +框架支持设定多个目标任务,当全局配置文件的`task_instance`字段指定超过一个任务实例时,**这多个任务实例默认均为目标任务(即`target_tag`字段被自动填充为全1)**。对于被设置成目标任务的任务实例,框架会为其计算预期的训练步数并在达到预期训练步数后为其保存预测模型。 + +当框架存在多个目标任务时,全局配置文件中的`num_epochs`(训练集遍历次数)仅会作用于第一个出现的目标任务,称为主任务(main task)。框架会根据主任务的训练步数来推理其他目标任务的预期训练步数(可通过`mix_ratio`控制,详情见下一节)。**注意,除了用来标记`num_epochs`的作用对象外,主任务与其他目标任务没有任何不同。** + +*注意:在多目标任务训练时,依然可以使用辅助任务来提升所有目标任务的测试集表现,但是要注意使用target_tag为引入的辅助任务打上辅助标记「0」* + #### 训练终止条件 在训练开始前,`Controller`会为所有每个目标任务计算出预期的训练步数。当某个目标任务的完成预期的训练步数后,`Controller`保存该任务的预测模型,而后继续按照设定的各任务的采样概率进行多任务训练。当所有目标任务均达到预期的训练步数后,多任务学习终止。需要注意的是,`Controller`不会为辅助任务计算预期训练步数,也不会为其保存预测模型,其仅仅起到“陪同目标任务训练”的作用,不会影响到多任务学习的终止与否。 -- GitLab