(New)进阶任务:Prompt tuning文本匹配
任务简介
近年来,Pretain+Finetuning的训练方式已广泛流行在NLP领域,近期来出现了新的训练方式——Prompt Learning, Prompt Learning是指对输入文本信息按照特定模板进行处理,把任务重构成一个更能充分利用预训练语言模型处理的形式。 Prompt Learning的做法可由Prompt的构造方式分为以下几种方式:
- Hand-crafted,人工模板构造Prompt的方式,需要人工的参与,而且不同的Prompt的构造方式模型的效果差距较大,模型效果不稳定。
- Automate prompt design (离散),该部分工作提出自动Prompt的构造方式,根据任务搜索合适的prompt的token。但因为这些token仍是具体的文字,从深度学习的角度来说,这种方式的效果是次优的。
- Prompt tuning,采用的是连续的Prompt向量,认为参数化的Prompt相对离散的Prompt形式具有更强的表达能力,不关注Prompt的自然语言性,其模型效果更优。 文心ERNIE匹配任务接入Prompt tuning+离散Prompt的训练方式,用户可根据自己的任务需求只需要简单更改json配置即可。我们在FewCLUE的文本匹配任务中进行了效果评测:
Bustm | Ocnli | |
---|---|---|
Finetune | 66.89% | 38.06% |
Prompt相关策略 | 67.45%(Prompt Embedding+CLS) | 45.24%(Prompt Embedding+Verbalizer) |
准备数据
示例数据位于text_matching/data/fewclue
.
├── bustm
│ ├── predict
│ │ └── predict.txt
│ ├── test_public
│ │ └── test_public.txt
│ └── train
│ └── train.txt
└── ocnli
├── dict
│ └── label_map.txt
├── predict
│ └── predict.txt
├── test_public
│ └── test_public.txt
└── train
└── train.txt
其中训练、测试、预测数据集可参考正常的文本匹配数据集格式 若采用Prompt Embedding+Verbalizer策略,需要用户额外准备一份label的词表文件,为语言模型待预测的mask处的值,用\t分割,要求字数一致,如:
并且 0
不是 1
是的 2
模型准备
模型均存放于wenxin_appzoo/wenxin_appzoo/models_hub文件夹下,进入文件夹执行sh download_ernie_2.0_base_ch.sh下载预训练模型参数,字典,模型配置文件。
训练参数配置
- 文心中的各种参数都是在json文件中进行配置的,你可以通过修改所加载的json文件来进行参数的自定义配置。json配置文件主要分为三个部分:dataset_reader(数据部分)、model(网络部分)、trainer(训练任务)或inference(预测部分),在模型训练的时候,json文件中需要配置dataset_reader、model和trainer这三个部分;在预测推理的时候,json文件中需要配置dataset_reader、inference这两个部分。
-
Prompt相关策略的json配置大体与正常的文本分类json配置类似,以下介绍与Prompt策略相关的json配置。
- Prompt Embedding+CLS,以mtch_ernie_prompt_cls_bustm_ch.json为例
{
"dataset_reader": {
"train_reader": {
"name": "train_reader",
"type": "ErnieClassificationDataSetReader",
"fields": [
{
"name": "text_a",
"data_type": "string",
"reader": {
"type": "ErniePromptClassificationFieldReader" # 采用prompt相关的reader
},
...
"is_prompt_tuning": true, # 是否采用prompt相关的组网方式
"prompt_len": 20, # prompt embedding的长度
"is_mask_res": false # 若直接使用cls,不采用Verbalizer方式,此处设为false即可
},
...
],
...
},
...
"model": {
"type": "ErnieMatchingFcPointwise",
"is_prompt_tuning": true, # 是否为prompt tuning训练方式
"prompt_len": 20, # prompt embedding的长度
"use_mlp_prompt": true, # 是否采用mlp网络构造Prompt embedding
"use_lstm_prompt": false, # 是否采用lstm网络构造Prompt embedding
...
},
...
}
- Prompt Embedding+Verbalizer,以mtch_ernie_prompt_verbalizer_ocnli_ch.json为例
{
"dataset_reader": {
"train_reader": {
"name": "train_reader",
"type": "ErnieClassificationDataSetReader",
"fields": [
{
"name": "text_a",
"data_type": "string",
"reader": {
"type": "ErniePromptClassificationFieldReader" # 采用prompt相关的reader
},
"label_map_path": "./data/fewclue/ocnli/dict/label_map.txt", # 需填入label的词表文件
"is_prompt_tuning": true, # 是否采用prompt相关的组网方式
"prompt_len": 20, # prompt embedding的长度
"is_mask_res": true, # 是否采用Verbalizer方式
"mask_res_len": 2, # mask的label长度,如上述示例该值需改为2
"prompt": "text_a?m m,text_b" # 用户可构造人工prompt,其中text_a和text_b分别指代第1句和第2句话,m为[mask]处该预测值用于Verbalizer映射,多个时注意要用空格分开以分词。
},
...
{
"name": "label",
"reader": {
"type": "ScalarVerbalizerFieldReader" # 采用verbalizer的reader
},
"label_map_path": "./data/fewclue/ocnli/dict/label_map.txt", # 需填入label的词表文件
"text_vocab_path": "../../models_hub/ernie_2.0_base_ch_dir/vocab.txt", # 需填入文本对应的词表文件
...
}
],
...
},
...
"save_reader_padding": true # 保存预测模型时需padding,以满足不同数据长度的需求(适配paddle)
},
"model": {
"type": "ErnieMatchingPromptVerbalizer", # 对应的组网类
"need_mask_id": true, # 若采用mask预测的方式,该处需设为true
"is_prompt_tuning": true, # 是否为prompt相关训练方式
"prompt_len": 20, # prompt embedding的长度
"use_mlp_prompt": true, # 是否采用mlp网络构造Prompt embedding
"use_lstm_prompt": false, # 是否采用lstm网络构造Prompt embedding
"is_dygraph": 1, # 仅支持动态图
}
开始训练
请先进行环境配置 Prompt tuning文本匹配任务位于/wenxin/tasks/text_matching,仅支持动态图。
- 指定AUTH的配置路径,找到你自己的auth.txt,获取它的绝对路径,如/home/zhangsang/wenxin/wenxin_appzoo,那么将这个绝对路径设给环境变量WENXIN_AUTH_PATH,如下所示:
export WENXIN_AUTH_PATH=/home/zhangsang/wenxin/wenxin_appzoo
- 进入指定目录
export WENXIN_AUTH_PATH=/home/zhangsang/wenxin/wenxin_appzoo
- 如果是gpu训练,先指定卡号,如下所示指定在0号卡上进行训练
export CUDA_VISIBLE_DEVICES=0
- 模型训练的入口脚本为./run_trainer.py , 通过--param_path参数来传入./examples/目录下的json配置文件。
# Prompt Embedding+CLS训练策略
python run_trainer.py --param_path=./examples/mtch_ernie_prompt_cls_bustm_ch.json
# Prompt Embedding+Verbalizer训练策略
python run_trainer.py --param_path=./examples/mtch_ernie_prompt_verbalizer_ocnli_ch.json
训练运行的日志会自动保存在./log/test.log文件中。 训练中以及结束后产生的模型文件会默认保存在json配置的output_path目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件。
开始预测
- 指定AUTH的配置路径,找到你自己的auth.txt,获取它的绝对路径,如/home/zhangsang/wenxin/wenxin_appzoo,那么将这个绝对路径设给环境变量WENXIN_AUTH_PATH,如下所示:
export WENXIN_AUTH_PATH=/home/zhangsang/wenxin/wenxin_appzoo
- 进入指定目录
cd wenxin_appzoo/wenxin_appzoo/tasks/text_matching
- 如果是gpu训练,先指定卡号,如下所示指定在0号卡上进行训练
export CUDA_VISIBLE_DEVICES=0
- 选定配置好的json文件,把你将要预测的模型对应的inference_model文件路径填入json文件的inference_model_path参数中。(其中网络中gather_nd op,在预测时有限制,目前预测的batch_size需小于等于训练时的batch_size,若用户想开大预测的batch_size,可load训练再save,如有疑问可联系客服同学解决。)
- 模型训练的入口脚本为./run_infer.py , 通过--param_path参数来传入./examples/目录下的json配置文件。
# Prompt Embedding+CLS模型预测
python run_infer.py --param_path=./examples/mtch_ernie_prompt_cls_bustm_ch_infer.json
# Prompt Embedding+Verbalizer模型预测
python run_infer.py --param_path=./examples/mtch_ernie_prompt_verbalizer_ocnli_ch_infer.json
预测运行的日志会自动保存在./output/predict_result.txt文件中。