AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


聊聊层次多标签分类NLP任务的实践
发布日期:2024-05-03 13:43:50 浏览次数: 1992


概述

目标:基于PaddleNLP库,微调训练一个层次多标签文本分类的领域模型。从现在的趋势来看,算法的实现一般有两种,一种是基于机器学习或传统算法来实现;一种是基于预训练模型等深度学习模型来做。因此在做技术调研时,要注意这两个方向,后者是比较吃硬件资源的,预训练模型微调提供了数据标注-模型训练-模型分析-模型压缩-预测部署全流程,有效减少开发时间,低成本迁移至实际应用场景,尤其是现在的很多算法,都是基于某个预训练模型来做的微调实现的。

为什么要基于PaddleNLP来做?一开始,我在modelscope[1]上找了一些NLP模型,主要的缺点有两个:

  1. 不支持微调或微调文档极度不清晰
  2. 不支持层次多标签文本分类任务

这两点就直接把modelscope给否了,也可能是我没找到吧,但最终的结果是直接否了。

NeuralClassifier[2]库对英语的支持比较好,但文档不太清晰,全是英文,讲的也少,对层次多标签的场景支持不是很到位,因此也否了。

最终找到了PaddleNLP库,虽然这个库的应用不是很广泛,但好在有大厂背书,而且对NLP的各个任务支持很到位,用的人不少,最关键的是,该库是一个工业级别的库。

数据标注平台

环境搭建

doccano[3]是一个数据标注平台,PaddleNLP的训练数据需要借助于该平台生成数据文件。一开始我在阿里云上安装,失败;后来又在centos虚拟机上安装,失败;最终在自己的windows电脑上安装好了。因此,如果环境不对,直接换个环境好了。

安装部署doccano,只需要几个命令即可:

# 安装依赖
pip install doccano==1.6.2

#
 初始化数据库
doccano init

#
 创建用户
doccano createuser --username admin --password pass

#
 开启web服务
doccano webserver --port 8000

#
 在另一个中端启动任务队列
doccano task

在浏览器打开http://127.0.0.1:8000/[4],输入用户名和密码登录,开始使用doccano进行标注。

image.png

上传数据集

点击数据集-操作-导入数据集,开始导入本地待标注数据集:

doccano支持TextFile、TextLine、JSONL和CoNLL四种数据上传格式,文本分类本地数据集定制训练中统一使用TextLine这一文件格式,即上传的文件需要为txt等格式,且在数据标注时,该文件的每一行待标注文本显示为一页内容。上传的文件为txt等格式,每一行为一条待标注文本。

上传数据类型选择TextLine,选择待标注文本或拖拽文本导入doccano项目中,点击导入,导入待标注数据集。

标签构建

点击标签-操作-创建标签,开始添加分类类别标签:

填入分类类别标签,选择标签颜色,建议不同标签选择不同颜色,最后点击保存或保存并添加下一个,保存标签:

对于层次分类任务的分类标签建议使用标签层次结构中叶结点标签路径作为标签,使用##作为分隔符,分隔不同层之间的标签:

任务标注

标注示例,选择对应的分类类别标签,输入回车(Enter)键确认:

数据导出

选择数据集-操作-导出数据集,将标注好的数据导出,我们默认所有数据集已经标注完成且正确:

选择导出的文件类型为JSONL,导出数据,导出文件命名为doccano.jsonl :

数据转换

从doccano中导出的数据集需要做一遍转换处理,才能喂给PaddleNLP训练。

在源码的/PaddleNLP/applications/text_classification路径下,将上述导出的数据文件上传到此目录,根据任务类型,执行对应的脚本;层次多标签分类任务的脚本命令是:

python doccano.py \
    --doccano_file doccano.jsonl \
    --save_dir ./data \
    --splits 0.8 0.2 \
    --task_type "hierarchical"

执行完后,自动会生成data文件夹,其内容如下所示:

image.png

层次分类训练与推理

微调训练

在源码的/PaddleNLP/applications/text_classification/hierarchical路径下执行。

预训练模型微调,默认基于GPU训练,脚本如下:

python train.py \
    --dataset_dir "data" \
    --device "gpu" \
    --max_seq_length 128 \
    --model_name "ernie-3.0-medium-zh" \
    --batch_size 32 \
    --early_stop \
    --epochs 100

训练结束后,将生成的checkpoint文件夹,如下:

问题及解决

如果数据集的格式准备不恰当,那么即使训练时不报错,checkpoint也是空的,并没有生成参数文件,这是我个人经历的,最终还是老老实实通过doccano来生成训练数据。问题详情可见issue[5]

模型评估

可忽略

模型预测

训练结束后,输入待预测数据(data.txt)和类别标签对照列表(label.txt),使用训练好的模型进行,默认在GPU环境下使用:

python predict.py --device "gpu" --max_seq_length 128 --batch_size 32 --dataset_dir "data"

该脚本会将未标注待预测数据文件data.txt根据微调后的模型做预测。

微调模型的导出

将微调的模型导出到指定目录下保存:

python export_model.py --params_path ./checkpoint/ --output_path ./export

微调模型的推理

基于导出的微调模型做推理,即实际的提供给外部接入。模型的执行路径是/PaddleNLP/applications/text_classification/hierarchical/deploy/predictor。脚本如下:

python infer.py \
    --device "gpu" \
    --model_path_prefix "../../export/float32" \
    --model_name_or_path "ernie-3.0-medium-zh" \
    --max_seq_length 128 \
    --batch_size 32 \
    --dataset_dir "../../data"

执行结果如下:

总结

我是基于阿里云的人工智能平台PAI训练的,之前也写过文章如何申请试用,可以在之前的公众号找一下。走完一遍训练推理流程,其实对其实现原理就有了了解了。主要的还是基于预训练模型ERNIE来做微调,不过现在诸多的文本分类任务、NLP任务都是基于预训练模型(BERT等)来微调训练。这也是以后的一个趋势,因此以后要是买新电脑尽量买个显卡够用的。当然,为了数据的准确性,整个流程需要更工程化。

因此,对于很多的NLP任务,如果我们可以识别到可以用NLP来解决的话,建议是用这类NLP算法库来做,这将会是以后的趋势。

Reference
[1]

modelscope: https://modelscope.cn/my/overview

[2]

NeuralClassifier: https://github.com/Tencent/NeuralNLP-NeuralClassifier

[3]

doccano: https://github.com/PaddlePaddle/PaddleNLP/blob/develop/applications/text_classification/doccano.md

[4]

http://127.0.0.1:8000/: http://127.0.0.1:8000/

[5]

issue: https://github.com/PaddlePaddle/PaddleNLP/issues/8286



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询