还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】

目录

  • 一、前言
  • 二、多分类场景简介
  • 三、前期准备阶段
    • 3.1 运行环境准备
    • 3.2 文心ERNIE系列模型介绍
    • 3.3 预训练模型加载
    • ⬜3.4 加载项目代码
  • 四、数据准备阶段
    • 4.1 数据处理流程
    • 4.2 加载内置数据集
    • 4.3 加载自定义数据集
    • 3.4 训练数据格式
  • 五、模型训练阶段
    • ⬛5.1 预训练模型微调
      • 5.1.1 CPU/GPU配置
      • 5.1.2 模型主要参数配置
      • 5.1.3 注意事项
    • 5.2 训练评估与模型优化
    • 5.3 模型预测
  • 七、总结
  • 八、参考文献

还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第1张图片

一、前言

    文本分类任务是自然语言处理中最常见的任务之一。文本分类简单定义来说就是对给定的文本,可以是一句话、一段文本、一篇文章利用文本分类器进行分类和打标签。文本分类任务广泛应用于长短文本、情感分析、新闻分类、事件类型分类、政务信息分类、商品类型分类、文章类型分类、论文类别、专利领域、案件描述、罪名分类、意图分类、论文专利分类、邮件自动分类、评论类型分类、药物反应分类、对话分类、税收分类、投诉分类、广告检测、敏感违禁内容分类、内容安全检测、预情分析、话题分类等等日常或者专业领域中。
本文内容简介:本文主要是根据PaddleNLP框架,利用中医疗搜索检索词意图分类数据集为样例,来介绍多分类场景实例。本文会全流程介绍文本分类场景的建模流程,包括从前期准备阶段、数据准备阶段、模型训练与评估阶段。


二、多分类场景简介

    文本分类任务可以根据标签类型分为多分类(multi class)、多标签(multi label)、层次分类(hierarchical)等三类任务,从以下新闻文本分类样例中就可以知道三种分类任务的区别。文本分类具体方案可以参考文本分类方案,飞浆PaddleNLP涵盖了所有!
还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第2张图片
     多分类(multi class)任务定义:二分类/多分类数据集的标签集含有两个或两个以上的类别,所有输入句子/文本有且只有一个标签。在文本多分类场景中,我们需要预测输入句子/文本最可能来自 n 个标签类别中的哪一个类别。例如上图中的多分类样例,第一个场景中说明了新闻分类 游戏 是输出的标签。
     多分类任务方案介绍:
     
(1)效果领先:
使用在中文领域内模型效果和模型计算效率有突出效果的ERNIE 3.0 预训练语言模型作为训练基座,ERNIE 3.0 轻量级系列提供多种尺寸的预训练模型满足不同需求,具有广泛成熟的实践应用性。
     (2)高效调优: 文本分类应用依托TrustAI可信增强能力和数据增强API,提供模型分析模块助力开发者实现模型分析,并提供稀疏数据筛选、脏数据清洗、数据增强等多种解决方案。
     (3)简单易用: 开发者无需机器学习背景知识,仅需提供指定格式的标注分类数据,一行命令即可开启文本分类训练,轻松完成上线部署,不再让技术成为文本分类的门槛。


三、前期准备阶段

3.1 运行环境准备

  • python >= 3.6
  • paddlepaddle >= 2.3
  • paddlenlp >= 2.4
  • scikit-learn >= 1.0.2

     安装PaddlePaddle:环境中paddlepaddle-gpu或paddlepaddle版本应大于或等于2.3, 请参见飞桨快速安装根据。


     安装PaddleNLP:安装PaddleNLP默认开启百度镜像源来加速下载,如果您使用 HTTP 代理可以关闭(删去 -i https://mirror.baidu.com/pypi/simple),更多关于PaddleNLP安装的详细教程请查见PaddleNLP快速安装。

pip install --upgrade paddlenlp -i https://mirror.baidu.com/pypi/simple

     安装sklearn:直接通过pip来安装即可,只需要注意一下版本。

pip install scikit-learn==1.0.2

3.2 文心ERNIE系列模型介绍

     最新开源ERNIE 3.0系列预训练模型:

  • 110M参数通用模型ERNIE 3.0 Base
  • 280M参数重量级通用模型ERNIE 3.0 XBase
  • 74M轻量级通用模型ERNIE 3.0 Medium
    还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第3张图片
    文档链接: https://github.com/PaddlePaddle/ERNIE
    ERNIE模型汇总
    ERNIE模型汇总

    还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第4张图片
         目前直接定义name就可以调用的主要为下面几类:目开源 ERNIE 3.0 Base 、ERNIE 3.0 Medium 、 ERNIE 3.0 Mini 、 ERNIE 3.0 Micro 、 ERNIE 3.0 Nano 五个模型:

         ERNIE 3.0-Base (12-layer, 768-hidden, 12-heads)
         ERNIE 3.0-Medium (6-layer, 768-hidden, 12-heads)
         ERNIE 3.0-Mini (6-layer, 384-hidden, 12-heads)
         ERNIE 3.0-Micro (4-layer, 384-hidden, 12-heads)
         ERNIE 3.0-Nano (4-layer, 312-hidden, 12-heads)

3.3 预训练模型加载

     PaddleNLP内置了ERNIE、BERT、RoBERTa、Electra等40多个的预训练模型,并且内置了各种预训练模型对于不同下游任务的Fine-tune网络。用户可以使用PaddleNLP提供的模型,完成问答、序列分类、token分类等任务。查阅 预训练模型 了解更多。这里以ERNIE 3.0模型为例,介绍如何将预训练模型Fine-tune完成文本分类任务。PaddleNLP采用AutoModelForSequenceClassification,AutoTokenizer提供了简单易用的接口,可以用过from_pretrained() 方法来加载不同的预训练模型,在输出层上叠加一层线性层,且相应预训练模型权重下载速度快、稳定。下面以ERNIE 3.0中文base模型为基础,演示如何添加预训练语言模型和分词器:

from paddlenlp.transformers import AutoModelForSequenceClassification,AutoTokenizer
num_classes = 10
model_name = 'ernie-3.0-base-zh'
model = AutoModelForSequenceClassification.from_pretrained(model_name,num_classes=num_classes))
tokenizer = AutoTokenizer.from_pretrained(model_name)

⬜3.4 加载项目代码

     首先,克隆paddlenlp对应的想项目代码:

git clone https://github.com/PaddlePaddle/PaddleNLP.git
checkout release/2.4
cd PaddleNLP/applications/text_classification/multi_class/

     然后可以看到整个项目的代码结构,代码结构如下:

multi_class/
├── deploy # 部署
│   └── predictor # 离线部署
│   │   ├── infer.py # 测试脚本
│   │   ├── predictor.py 离线部署脚本
│   │   └── README.md # 离线部署使用说明
│   ├── paddle_serving # PaddleServing在线服务化部署
│   │   ├──config.yml # 服务端的配置文件
│   │   ├──rpc_client.py # 客户端预测脚本
│   │   ├──service.py # 服务端的脚本
│   │   └── README.md # 在线服务化部署使用说明
│   └── triton_serving # Triton在线服务化部署
│       ├── README.md # Triton部署使用说明
│       ├── seqcls_grpc_client.py # 客户端预测脚本
│       └── models
├── train.py # 训练评估脚本
├── predict.py # 预测脚本
├── export_model.py # 静态图模型导出脚本
├── utils.py # 工具函数脚本
├── prune.py # 裁剪脚本
└── README.md # 多分类使用说明

四、数据准备阶段

4.1 数据处理流程

     通过使用PaddleNLP提供的 load_datasetMapDatasetIterDataset ,可以方便的自定义属于自己的数据集。
     目前PaddleNLP的通用数据处理流程如下:
          1. 加载数据集(内置数据集或者自定义数据集,数据集返回 原始数据)。
          2. 定义 trans_func() ,包括tokenize,token to id等操作,并传入数据集的 map() 方法,将原始数据转为 feature 。
          3. 根据上一步数据处理的结果定义 batchify 方法和 BatchSampler 。
          4. 定义 DataLoader , 传入 BatchSampler 和 batchify_fn() 。


还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第5张图片
     PaddleNLP提供了以下数据集的快速读取API,实际使用时请根据需要添加splits信息,PaddleNLP Datasets API:供参考:

还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第6张图片

4.2 加载内置数据集

     快速加载内置数据集 目前PaddleNLP内置20余个NLP数据集,涵盖阅读理解,文本分类,序列标注,机器翻译等多项任务。目前提供的数据集可以在 数据集列表 中可以找到。
以 cola 数据集为例:load_dataset() 方法会从 paddlenlp.datasets 下找到cola数据集对应的数据读取脚本(默认路径:paddlenlp/datasets/cola.py),并调用脚本中 DatasetBuilder 类的相关方法生成数据集。load_dataset() 方法提供了一个 name 参数用来指定想要获取的子数据集。使用方法如下:

from paddlenlp.datasets import load_dataset
train_ds, dev_ds = load_dataset("glue", name="cola", splits=("train", "dev"))
for i in range(3):
    print(train_ds[i])

4.3 加载自定义数据集

     通过使用PaddleNLP提供的 load_dataset() , MapDataset 和 IterDataset 。任何人都可以方便的定义属于自己的数据集。从本地文件创建数据集 从本地文件创建数据集时,我们 推荐 根据本地数据集的格式给出读取function并传入 load_dataset() 中创建数据集。
     以 中医疗搜索检索词意图分类 任务中的数据为例:


def read_local_dataset(path, label_list=None, is_test=False):
    """
    Read dataset
    """
    with open(path, 'r', encoding='utf-8') as f:
        for line in f:
            if is_test:
                items = line.strip().split('\t')
                sentence = ''.join(items)
                yield {'text': sentence}
            else:
                items = line.strip().split('\t')
                sentence = ''.join(items[:-1])
                label = items[-1]
                yield {'text': sentence, 'label': label_list[label]}

# data_path为read()方法的参数
map_ds = load_dataset(read_local_dataset, data_path='数据集/data1/dev.txt', label_list=label_list, lazy=False)

注解:
     1. 需要注意的是,只有PaddleNLP内置的数据集具有将数据中的label自动转为id的功能(详细条件参见 创建DatasetBuilder)。
     2. 像上例中的自定义数据集需要在自定义的convert to feature方法中添加label转id的功能。
     3. 自定义数据读取function中的参数可以直接以关键字参数的的方式传入 load_dataset() 中。而且对于自定义数据集,lazy 参数是必须传入的。

3.4 训练数据格式

     训练需要准备指定格式的本地数据集,如果没有已标注的数据集,可以参考可以借助一些开源文本分类数据标注工具进行标注。
     本文将以CBLUE数据集中医疗搜索检索词意图分类(KUAKE-QIC)任务为例进行介绍,如何加载本地固定格式数据集进行训练,指定格式本地数据集目录结构:

data/
├── train.txt # 训练数据集文件
├── dev.txt # 开发数据集文件
├── test.txt # 可选,测试数据集文件
├── label.txt # 分类标签文件
└── data.txt # 待预测数据文件
!wget https://paddlenlp.bj.bcebos.com/datasets/KUAKE_QIC.tar.gz
!tar -zxvf KUAKE_QIC.tar.gz
!mv KUAKE_QIC data

     训练、开发、测试数据集:文本与标签类别名用tab符’\t’分隔开,文本中避免出现tab符’\t’。

  • train.txt/dev.txt/test.txt 文件格式:

<文本>‘\t’<标签>
<文本>‘\t’<标签>

  • train.txt/dev.txt/test.txt 文件样例:

25岁已经感觉脸部松弛了怎么办 治疗方案
小孩的眉毛剪了会长吗? 其他
172的身高还能长高吗? 其他
冻疮用三金冻疮酊有效果么? 功效作用

**分类标签:**label.txt(分类标签文件)记录数据集中所有标签集合,每一行为一个标签名。

  • label.txt 文件格式:

<标签>
<标签>

  • label.txt 文件样例:

病情诊断
治疗方案
病因分析
指标解读
就医建议

**待预测数据:**data.txt(待预测数据文件),需要预测标签的文本数据。

  • data.txt 文件格式:

<文本>
<文本>

  • data.txt 文件样例:

黑苦荞茶的功效与作用及食用方法
交界痣会凸起吗
检查是否能怀孕挂什么科
鱼油怎么吃咬破吃还是直接咽下去


五、模型训练阶段

⬛5.1 预训练模型微调

5.1.1 CPU/GPU配置

     如果使用CPU训练,只需将设备参数配置改为 –device cpu;同时可以设置多核训练,只需将多核训练参数配置成 –nproc_per_node 8,说明是8核训练;

python -m paddle.distributed.launch --nproc_per_node 8 --backend gloo train.py \
  --model_name ernie-3.0-medium-zh \
  --dataset_dir ./data/ \
  --save_dir checkpoint \
  --device cpu \
  --learning_rate 3e-5 \
  --epochs 100 \
  --max_seq_length 128 \
  --batch_size 32 \
  --early_stop True

     如果使用GPU训练,可以指定gpus参数进行单卡/多卡训练。使用多卡训练可以指定多个GPU卡号,例如 –gpus 0,1。如果设备只有一个GPU卡号默认为0,可使用nvidia-smi命令查看GPU使用情况:

unset CUDA_VISIBLE_DEVICES
python -m paddle.distributed.launch --gpus 0,1 train.py \
  --model_name ernie-3.0-medium-zh \
  --dataset_dir ./data/ \
  --save_dir checkpoint \
  --device gpu \
  --learning_rate 3e-5 \
  --epochs 100 \
  --max_seq_length 128 \
  --batch_size 32 \
  --early_stop True 

5.1.2 模型主要参数配置

     数据集定义: 以公开数据集CBLUE数据集中医疗搜索检索词意图分类(KUAKE-QIC)任务为示例,在训练集上进行模型微调,并在开发集上使用准确率Accuracy评估模型表现。数据集默认为:默认为"cblue"。
     主要的配置的参数为:

  • model_name: 内置模型名,或者模型参数配置目录路径。默认为ernie-3.0-base-zh。
  • data_dir: 训练数据集路径,数据格式要求详见数据标注。本地数据集路径,数据集路径中应包含train.txt,dev.txt和label.txt文件;默认为None。
  • save_dir:保存训练模型的目录,包括参数、训练体制和静态图;默认保存在当前目录checkpoint文件夹下。
  • max_seq_length: 最大句子长度,超过该长度的文本将被截断,不足的以Pad补全。提示文本不会被截断。ERNIE模型使用的最大序列长度,最大不能超过512, 若出现显存不足,请适当调低这一参数;默认为128。
  • device: 选用什么设备进行训练,可选cpu、gpu、xpu、npu。如使用gpu训练,可使用参数gpus指定GPU卡号。
  • learning_rate: 预训练语言模型参数基础学习率大小,默认为6e-5。将与learning rate scheduler产生的值相乘作为当前学习率。
  • batch_size:批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;默认为32。
  • early_stop:选择是否使用早停法(EarlyStopping);默认为False。
  • **num_train_epochs: **训练轮次,使用早停法时可以选择100。
  • weight_decay:控制正则项力度的参数,用于防止过拟合,默认为0.01。
  • early_stop_nums:在设定的早停训练轮次内,模型在开发集上表现不再上升,训练终止;默认为4。 epochs: 训练轮次,默认为100。
  • warmup:是否使用学习率warmup策略;默认为False。
  • warmup_proportion:学习率warmup策略的比例数,如果设为0.1,则学习率会在前10%steps数从0慢慢增长到learning_rate, 而后再缓慢衰减;默认为0.1。
  • logging_steps: 日志打印的间隔steps数,默认5。
  • init_from_ckpt: 模型初始checkpoint参数地址,默认None。
  • seed:随机种子,默认为3。

5.1.3 注意事项

     (1)程序运行时将会自动进行训练,评估。同时训练过程中会自动保存开发集上最佳模型在指定的 save_dir 中,保存模型文件结构如下所示:

checkpoint/
├── model_config.json
├── model_state.pdparams
├── tokenizer_config.json
└── vocab.txt

     (2)如需恢复模型训练,则可以设置 init_from_ckpt , 如 init_from_ckpt=checkpoint/model_state.pdparams 。
     (3)如需训练英文文本分类任务,只需更换预训练模型参数 model_name 。英文训练任务推荐使用"ernie-2.0-base-en"、“ernie-2.0-large-en”。
     (4)英文和中文以外语言的文本分类任务,推荐使用基于96种语言(涵盖法语、日语、韩语、德语、西班牙语等几乎所有常见语言)进行预训练的多语言预训练模型"ernie-m-base"、“ernie-m-large”。

5.2 训练评估与模型优化

     训练评估主要是借助模型在测试集中的表现,具体表现就是看在测试集上评价指标。如果指标已经达到要求,那就不需要再进行效果调优工作了。
     如果模型效果不佳,可以从数据层面、模型层面进行分析。
     (1)数据层面可以做bad case分析,筛选数据,提高数据质量;此外,还可以做数据增强,解决数据长尾问题,增加数据数量。
     (2)模型层面上可以做参数调优,尝试不同的模型参数,进行优化。比如说learning_ratebatch_size、max_seq_length。

5.3 模型预测

     训练结束后,输入 待预测数据 和 类别标签对照列表,使用训练好的模型进行,默认在GPU环境下使用,在CPU环境下修改参数配置为–device “cpu”:

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

     可支持配置的参数:
     params_path:待预测模型参数文件夹;默认为"./checkpoint/"。
     dataset_dir:本地数据集路径,数据集路径中应包含data.txt和label.txt文件;默认为None。
     max_seq_length:ERNIE模型使用的最大序列长度,最大不能超过512, 若出现显存不足,请适当调低这一参数;默认为512。
     batch_size:批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;默认为32。
     device: 选用什么设备进行训练,可选cpu、gpu、xpu、npu;默认为gpu。

七、总结

     本文内容回顾:本文着重讲解了多分类场景的原理以及实例,并且以paddleNLP代码来实现了建模流程。具体实例是标准的数据–中医疗搜索检索词意图分类数据集。
     后期还会继续讲解文本分类相关的场景、案例、模型调优方法、数据标注等内容,敬请期待。
     如果觉得文章对您有帮助,请给博主点赞、收藏、关注,博主会不断推出优质的文章。
还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_第7张图片

     本博主内相关文章:
     1.文本分类方案,飞浆PaddleNLP涵盖了所有!
     2.用深度学习解决大规模文本分类问题
     3.基于深度学习的文本分类方法库(NLP)
     4.word2vec的应用----使用gensim来训练模型
     5.NLP大赛冠军总结:300万知乎多标签文本分类任务(附深度学习源码)

八、参考文献

  • https://github.com/PaddlePaddle/PaddleNLP/tree/release/2.4/applications/text_classification/multi_class
  • https://paddlenlp.readthedocs.io/zh/latest/get_started/quick_start.html
  • https://aistudio.baidu.com/aistudio/projectdetail/4362154?spm=a2c6h.12873639.article-detail.10.68784bb6FMvsSX&contributionType=1

你可能感兴趣的:(自然语言处理(NLP),python,自然语言处理,paddlepaddle,nlp,多分类)