Term重要性任务
更新时间:2022-12-17
term重要性
简介
- term重要性任务是指:给出一个明文文本中每个短语的重要程度。
- 样例:
- 在上述例子中,文本被分为4个短语(后文用term代替),其中白居易这个term重要程度最高,边塞诗人次之,数字相同的term表示重要程度一致。
目录结构
term重要性任务位于/wenxin_appzoo/tasks/term_rank
.
├── data ## 示例数据文件夹,包括各任务所需训练集、测试集、验证集和预测集
│ ├── dev_data
│ │ └── dev.tsv
│ ├── download_data.sh
│ ├── predict_data
│ │ └── infer.tsv
│ ├── test_data
│ │ └── test.tsv
│ └── train_data
│ └── train.tsv
├── examples
## 由于term rank的网络结构有动态shape的输入,所以目前暂不能和其他任务一样支持一套预测代码同时预测静态图模型和动态图模型,所以term rank的模型预测,提供动态图和静态图两个版本。
│ ├── term_rank_ernie_ch_infer_dy.json ## 采用动态图方式进行模型预测的配置文件
│ ├── term_rank_ernie_ch_infer.json ## 采用静态图方式进行模型预测的配置文件
│ └── term_rank_ernie_ch.json ## 基于ERNIE进行fine-tune训练的配置文件
├── inference
│ ├── custom_inference.py ## 静态图方式进行预测
│ ├── dygraph_inference.py ## 动态图方式进行预测
│ └── __init__.py
├
├── model
│ ├── __init__.py
│ └── term_rank_ernie.py
├── reader
│ ├── ernie_term_rank_label_field_reader.py ## 样本中label域对应的reader
│ ├── ernie_term_rank_text_field_reader.py ## 样本中文本域对应的reader
│ └── __init__.py
├── dygraph_run_infer.py ## 动态图模式下的模型预测推理脚本
├── run_infer.py ## 静态图模式下的模型预测推理脚本
├── run_trainer.py ## 模型训练的脚本
└── trainer
├── custom_dynamic_trainer.py ## 动态图模式的trainer,控制训练流程
├── custom_trainer.py ## 静态图模式的trainer,控制训练流程
└── __init__.py
准备工作
- 下载ERNIE-2.0-Base预训练模型
# 在wenxin_appzoo/models_hub/目录下,运行download_ernie_2.0_base_ch.sh脚本,下载管理ERNIE-2.0-Base预训练模型,下载成功会看到名为ernie_2.0_base_ch_dir的目录,里面存放了ERNIE-2.0-Base预训练模型对应的参数文件夹(params)、词表文件(vocab.txt)、模型配置文件(ernie_config.json)、模型meta信息(model.meta)。
# 进入到 models_hub目录
cd wenxin_appzoo/models_hub/
# 执行下载脚本
sh download_ernie_2.0_base_ch.sh
-
准备数据:由于使用ERNIE系列模型进行fine tune,所以不需要用户自己切词和提供词表文件。
- 训练集、测试集和验证集的数据格式相同,每个样本占一行,一行两列(两个key),列之间用\t分隔。第一列为切分好term之后的明文文本,term之间以字符^B(0x02)分隔;第二列为第一列中每个term的重要等级,由int类型数字表示,数字越大表示重要程度越高,数字间同样以字符^B(0x02)分隔。如下所示:
- 预测集数据:每个样本占一行,一行一列(只有一个text)
训练配置
- 参数配置:demo配置文件为./examples/term_rank_ernie_ch.json,用户需要自己配置的参数为:trainer_reader、test_reader、dev_reader这三个reader对应的数据集路径、batch-size、trainer_reader的epoch;trainer、model,如下所示
{
"dataset_reader": {
"train_reader": {
"name": "train_reader",
"type": "BasicDataSetReader",
"fields": [
{
"name": "text_a",
"data_type": "string",
"reader": {
"type": "ErnieTermRankTextFieldReader"
},
"tokenizer": {
"type": "FullTokenizer",
"split_char": " ",
"unk_token": "[UNK]"
},
"need_convert": true,
"vocab_path": "../../models_hub/ernie_2.0_base_ch_dir/vocab.txt",
"max_seq_len": 512,
"truncation_type": 0,
"padding_id": 0,
"embedding": null
},
{
"name": "label",
"data_type": "float",
"reader": {
"type": "ErnieTermRankLabelFieldReader"
},
"tokenizer": null,
"need_convert": false,
"vocab_path": "",
"max_seq_len": 512,
"truncation_type": 0,
"padding_id": 0,
"embedding": null
}
],
"config": {
"data_path": "./data/train_data", ## 填写自己的训练集路径即可,写到文件夹目录。
"shuffle": true, ## 训练过程中是否要打乱数据顺序
"batch_size": 8, ## 可以根据自己的硬件显存或者内存大小进行调整
"epoch": 10, ## 根据需要自己调整
"sampling_rate": 1.0,
"need_data_distribute": true ## 表示数据读取过程中是否需要按卡数进行分发,true表示每张卡在同一个step中读取到的数据是不一样的,false表示每张卡在同一个step中读取到的数据是一样的,训练集默认为true,测试集、验证集、预测集都是false。
"need_generate_examples": false, ## 表示在数据读取过程中除了id化好的tensor数据外,是否需要返回原始明文样本,测试集默认取值为true,训练集、测试集、验证集为false
}
},
"test_reader": {
"name": "test_reader",
"type": "BasicDataSetReader",
....
"config": {
"data_path": "./data/test_data", ## 填写自己的测试集路径即可,写到文件夹目录。
"shuffle": false, ## 不需要打乱数据顺序
"batch_size": 8, ## 可以根据自己的硬件显存或者内存大小进行调整
"epoch": 1,
"sampling_rate": 1.0,
"need_data_distribute": true ## 表示数据读取过程中是否需要按卡数进行分发,true表示每张卡在同一个step中读取到的数据是不一样的,false表示每张卡在同一个step中读取到的数据是一样的,训练集默认为true,测试集、验证集、预测集都是false。
}
},
"dev_reader": {
"name": "dev_reader",
"type": "BasicDataSetReader",
....
"config": {
"data_path": "./data/dev_data", ## 填写自己的测试集路径即可,写到文件夹目录。
"shuffle": false, ## 不需要打乱数据顺序
"batch_size": 8, ## 可以根据自己的硬件显存或者内存大小进行调整
"epoch": 1,
"sampling_rate": 1.0,
"need_data_distribute": false
}
}
},
"model": {
"type": "ErnieTermRank",
"is_dygraph": 1, ## 是否使用动态图模式运行,与trainer中的type字段配合使用
"optimization": {
"learning_rate": 5e-05,
"use_lr_decay": true, ## 是否使用学习率衰减
"warmup_steps": 0,
"warmup_proportion": 0.1,
"weight_decay": 0.01,
"use_dynamic_loss_scaling": false,
"init_loss_scaling": 128,
"incr_every_n_steps": 100,
"decr_every_n_nan_or_inf": 2,
"incr_ratio": 2.0,
"decr_ratio": 0.8
},
"embedding": {
"config_path": "../../models_hub/ernie_2.0_base_ch_dir/ernie_config.json"
},
"margin": 0.15,
"temperature": 0.5
},
"trainer": {
"type": "CustomTrainer",
"PADDLE_PLACE_TYPE": "gpu", ## 运行的硬件环境,可选cpu、gpu
"use_amp": true, ## 是否使用精度混合模式
"PADDLE_IS_FLEET": 0, ## 是否使用fleet运行,多卡或者多机时必须使用fleet。
"train_log_step": 10, ## 训练时打印训练日志的间隔步数。
"is_eval_dev": 1, ## 是否在训练的时候评估验证集,1为需评估,此时必须配置dev_reader。
"is_eval_test": 1, ## 是否在训练的时候评估测试集,1为需评估,此时必须配置test_reader。
"eval_step": 100, ## 进行测试集或验证集评估的间隔步数。
"save_model_step": 500, ## 保存模型时的间隔步数,建议设置为eval_step的整数倍。
"load_parameters": "", ## 加载已训练好的模型的op参数值,不会加载训练步数、学习率等训练参数,可用于加载预训练模型。如需使用填写具体文件夹路径即可。
"load_checkpoint": "", ## 加载已训练好的模型的所有参数,包括学习率等,可用于热启动。如需使用填写具体文件夹路径即可。
"pre_train_model": [
{
"name": "ernie_2.0_base_ch", ## ernie-2.0-base 预训练模型加载时使用的名称,不要修改
"params_path": "../../models_hub/ernie_2.0_base_ch_dir/params" ## ernie-2.0-base预训练模型的参数目录
}
],
"output_path": "./output/term_rank_ernie_2.0_base_fc_ch_static", ## 保存模型的输出路径,若为空则默认。为"./output"
"extra_param": {
"meta":{
"job_type": "term_rank"
}
}
}
}
启动训练
如您使用镜像开发套件,您可直接进入下一步骤。
## 单卡训练或者cpu训练
python run_trainer.py --param_path=./examples/term_rank_ernie_ch.json
## 多卡训练或者多机训练
## 先选定卡号:比如选定0号和1号卡
export CUDA_VISIBLE_DEVICES=0, 1
fleetrun --gpus=0,1 run_trainer.py --param_path=./examples/term_rank_ernie_ch.json
- 训练运行的日志会自动保存在./log/test.log文件中;
- 训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件。
静态图预测配置
- 参数配置:demo配置文件为./examples/termrank_ernie_ch_infer.json,用户需要自己配置的参数为:predict_reader对应的数据集路径、batch-size;inference中的PADDLE_PLACE_TYPE、output_path、inference_model_path,如下图中的json注释所示:
{
"dataset_reader": {
"predict_reader": {
"name": "predict_reader",
"type": "BasicDataSetReader",
"fields": [
{
"name": "text_a",
"data_type": "string",
"reader": {
"type": "ErnieTermRankTextFieldReader"
},
"tokenizer": {
"type": "FullTokenizer",
"split_char": " ",
"unk_token": "[UNK]"
},
"need_convert": true,
"vocab_path": "../model_files/dict/vocab_ernie_2.0_base_ch.txt",
"max_seq_len": 512,
"truncation_type": 0,
"padding_id": 0,
"embedding": null
}
],
"config": {
"data_path": "./data/predict_data", ## 填写你自己的预测数据集路径即可,写到文件夹目录
"shuffle": false,
"batch_size": 8, ## 可以根据自己的硬件显存或者内存大小进行调整
"epoch": 1,
"sampling_rate": 1.0,
"need_data_distribute": false,
"need_generate_examples": true ## 表示在数据读取过程中除了id化好的tensor数据外,是否需要返回原始明文样本,测试集默认取值为true,训练集、测试集、验证集为false。
}
}
},
"inference": {
"output_path": "./output/predict_result.txt", ## 预测结果存放路径
"PADDLE_PLACE_TYPE": "cpu",
"thread_num": 2, ## 线程设置
"inference_model_path": "./output/term_rank_ernie_2.0_base_fc_ch_static/save_inference_model/inference_step_126/", ## 待预测的模型路径。
"extra_param": {
"meta":{
"job_type": "term_rank"
}
}
}
}
启动静态图预测
如您使用镜像开发套件,您可直接进入下一步骤。
python run_infer.py --param_path=./examples/term_rank_ernie_ch_infer.json
预测运行的日志会自动保存在./output/predict_result.txt文件中。预测结果如下所示,对每个term计算出一个得分,得分越高表示越重要,所有term的得分之和为1。
动态图预测配置
如果是动态图训练出来的模型,预测脚本的配置为./examples/term_rank_ernie_ch_infer_dy.json,如下所示:
{
"dataset_reader": {
"predict_reader": {
"name": "predict_reader",
"type": "BasicDataSetReader",
"fields": [
{
"name": "text_a",
"data_type": "string",
"reader": {
"type": "ErnieTermRankTextFieldReader"
},
"tokenizer": {
"type": "FullTokenizer",
"split_char": " ",
"unk_token": "[UNK]"
},
"need_convert": true,
"vocab_path": "../../models_hub/ernie_2.0_base_ch_dir/vocab.txt",
"max_seq_len": 512,
"truncation_type": 0,
"padding_id": 0
}
],
"config": {
"data_path": "./data/predict_data",
"shuffle": false,
"batch_size": 4,
"epoch": 1,
"sampling_rate": 1.0,
"need_data_distribute": false,
"need_generate_examples": true
}
}
},
"model": { ## 动态图的预测必须有model配置
"type": "ErnieTermRank",
"is_dygraph": 1,
"optimization": {
"learning_rate": 5e-05,
"use_lr_decay": true,
"warmup_steps": 0,
"warmup_proportion": 0.1,
"weight_decay": 0.01,
"use_dynamic_loss_scaling": false,
"init_loss_scaling": 128,
"incr_every_n_steps": 100,
"decr_every_n_nan_or_inf": 2,
"incr_ratio": 2.0,
"decr_ratio": 0.8
},
"embedding": {
"config_path": "../../models_hub/ernie_2.0_base_ch_dir/ernie_config.json"
},
"margin": 0.15,
"temperature": 0.5
},
"inference": {
"output_path": "./output/predict_result.txt",
"PADDLE_PLACE_TYPE": "cpu",
"thread_num": 2,
"inference_model_path": "./output/term_rank_ernie_2.0_base_fc_ch_dy/save_checkpoints_0/checkpoints_step_126/wenxin", ## 使用checkpoints文件进行预测
"extra_param": {
"meta":{
"job_type": "term_rank"
}
}
}
}
启动动态图预测
预测命令为:
python dygraph_run_infer.py --param_path=./examples/term_rank_ernie_ch_infer_dy.json