基于paddleNLP的文本二分类任务

1、环境构建

具体环境如下
在这里插入图片描述

1.1、Label Studio安装

以下标注示例用到的环境配置:

  • Python 3.8+
  • label-studio == 1.7.2
    在终端(terminal)使用pip安装label-studio:
pip install label-studio==1.7.2

安装完成后,运行以下命令行:

label-studio start

在浏览器打开http://localhost:8080/,输入用户名和密码登录,开始使用label-studio进行标注。

2、文本分类任务标注

2.1、项目创建

点击创建(Create)开始创建一个新的项目,填写项目名称、描述,然后在Labeling Setup中选择Text Classification。

  • 填写项目名称、描述
    在这里插入图片描述
  • 数据上传,从本地上传txt格式文件,选择
    List of tasks
    在这里插入图片描述
  • 设置任务,添加标签
    在这里插入图片描述
    在这里插入图片描述
  • 数据上传
    项目创建后,可在Project/文本分类任务中点击Import继续导入数据,同样从本地上传txt格式文件,选择List of tasks 。

2.2、标签构建

项目创建后,可在Setting/Labeling Interface中继续配置标签,
默认模式为单标签多分类数据标注。对于多标签多分类数据标注,需要将choice的值由single改为multiple。
在这里插入图片描述

2.3 任务标注

在这里插入图片描述
2.4 数据导出
勾选已标注文本ID,选择导出的文件类型为JSON,导出数据:
在这里插入图片描述
参考链接:
Label Studio(https://labelstud.io/)

3、数据转换

将导出的文件重命名为label_studio.json后,放入./data目录下。通过label_studio.py脚本可转为UTC的数据格式。
在数据转换阶段,还需要提供标签候选信息,放在./data/label.txt文件中,每个标签占一行。例如在医疗意图分类中,标签候选为
在这里插入图片描述

3.1、 生成训练/验证集文件

python label_studio.py  --label_studio_file ./data/label_studio.json  --save_dir ./data  --splits 0.8 0.1 0.1  --options ./data/label.txt
  • label_studio_file: 从label studio导出的数据标注文件。
  • save_dir: 训练数据的保存目录,默认存储在data目录下。
  • splits:划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.1, 0.1]表示按照的比例将数据划分为训练集、验证集和测试集。
  • options:: 指定分类任务的类别标签。若输入类型为文件,则文件中每行一个标签。
  • is_shuffle:: 是否对数据集进行随机打散,默认为True。
  • seed: 随机种子,默认为1000。

备注:

  • 默认情况下 label_studio.py
  • 每次执行 label_studio.py
  • 对于从label_studio导出的文件,默认文件中的每条数据都是经过人工正确标注的。
    使用Label Studio 数据标注工具进行标注,如果已有标注好的本地数据集,我们需要将数据集整理为文档要求的格式,

4.模型训练预测

多任务训练场景可分别进行数据转换再进行混合:通用分类、评论情感分析、语义相似度计算、蕴含推理、多项式阅读理解等众多“泛分类”任务

##代码结构
├── deploy/simple_serving/ # 模型部署脚本
├── utils.py               # 数据处理工具
├── run_train.py           # 模型微调脚本
├── run_eval.py            # 模型评估脚本
├── label_studio.py        # 数据格式转换脚本
├── label_studio_text.md   # 数据标注说明文档
└── README.md

4.1 模型微调

推荐使用 PromptTrainer API 对模型进行微调,该 API 封装了提示定义功能,且继承自 Trainer API 。只需输入模型、数据集等就可以使用 Trainer API 高效快速地进行预训练、微调等任务,可以一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能,Trainer API 还针对训练过程的通用训练配置做了封装,比如:优化器、学习率调度等。
使用下面的命令,使用 utc-base 作为预训练模型进行模型微调,将微调后的模型保存至output_dir:

4.1.1 单卡训练

python run_train.py --device cpu --logging_steps 10 --save_steps 10 --eval_steps 10 --seed 1000 --model_name_or_path utc-base --output_dir ./checkpoint/model_best --dataset_path ./data/ --max_seq_length 512 --per_device_train_batch_size 2 --per_device_eval_batch_size 2 --gradient_accumulation_steps 8 --num_train_epochs 20 --learning_rate 1e-5 --do_train --do_eval --do_export --export_model_dir ./checkpoint/model_best --overwrite_output_dir --disable_tqdm True --metric_for_best_model macro_f1 --load_best_model_at_end  True --save_total_limit 1 --save_plm
  • single_label: 每条样本是否只预测一个标签。默认为False,表示多标签分类。
  • device: 训练设备,可选择 ‘cpu’、‘gpu’ 其中的一种;默认为 GPU 训练。
  • logging_steps: 训练过程中日志打印的间隔 steps 数,默认10。
  • save_steps: 训练过程中保存模型 checkpoint 的间隔 steps 数,默认100。
  • eval_steps: 训练过程中保存模型 checkpoint 的间隔 steps 数,默认100。
  • seed:全局随机种子,默认为 42。
  • model_name_or_path:进行 few shot 训练使用的预训练模型。默认为 “utc-base”, 可选"utc-xbase", “utc-base”, “utc-medium”, “utc-mini”, “utc-micro”, “utc-nano”, “utc-pico”。
  • output_dir:必须,模型训练或压缩后保存的模型目录;默认为 None 。
  • dataset_path:数据集文件所在目录;默认为 ./data/ 。
  • train_file:训练集后缀;默认为 train.txt 。
  • dev_file:开发集后缀;默认为 dev.txt 。
  • max_seq_len:文本最大切分长度,包括标签的输入超过最大长度时会对输入文本进行自动切分,标签部分不可切分,默认为512。
  • per_device_train_batch_size:用于训练的每个 GPU 核心/CPU 的batch大小,默认为8。
  • per_device_eval_batch_size:用于评估的每个 GPU 核心/CPU 的batch大小,默认为8。
  • num_train_epochs: 训练轮次,使用早停法时可以选择 100;默认为10。
  • learning_rate:训练最大学习率,UTC 推荐设置为 1e-5;默认值为3e-5。
  • do_train:是否进行微调训练,设置该参数表示进行微调训练,默认不设置。
  • do_eval:是否进行评估,设置该参数表示进行评估,默认不设置。
  • do_export:是否进行导出,设置该参数表示进行静态图导出,默认不设置。
  • export_model_dir:静态图导出地址,默认为None。
  • overwrite_output_dir: 如果 True,覆盖输出目录的内容。如果 output_dir 指向检查点目录,则使用它继续训练。
  • disable_tqdm: 是否使用tqdm进度条。
  • metric_for_best_model:最优模型指标, UTC 推荐设置为 macro_f1,默认为None。
  • load_best_model_at_end:训练结束后是否加载最优模型,通常与metric_for_best_model配合使用,默认为False。
  • save_total_limit:如果设置次参数,将限制checkpoint的总数。删除旧的checkpoints 输出目录,默认为None。
  • save_plm:保存模型进行推理部署

4.1.2 模型预测

from paddlenlp import Taskflow
schema = ["正常言论", "异常言论"]
my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema,
                  task_path='./checkpoint/model_best/plm')
text='联合国秘书长古特雷斯16日通过发言人发表声明,谴责塞赫万地区的袭击事件,敦促尽快将袭击者绳之以法。 '
cls_result = my_cls(text)
print(cls_result)
label = cls_result[0]['predictions'][0]['label']
score = cls_result[0]['predictions'][0]['score']

输出:

[{'text_a': '联合国秘书长古特雷斯16日通过发言人发表声明,谴责塞赫万地区的袭击事件,敦促尽快将袭击者绳之以法。 ', 'predictions': [{'label': '正常言论', 'score
': 0.8308192192139073}]}]