关于人工智能:中国法研杯司法人工智能挑战赛基于UTC的多标签层次分类小样本文本应用Macro-F1提升13

5次阅读

共计 17758 个字符,预计需要花费 45 分钟才能阅读完成。

“中国法研杯”司法人工智能挑战赛:基于 UTC 的多标签 / 档次分类小样本文本利用,Macro F1 晋升 13%+

相干文章举荐:

小样本文本分类利用:基于 UTC 的医疗用意多分类,训练调优部署一条龙:

本我的项目次要实现基于 UTC 的多标签利用,更多部署细节请参考举荐文章。本我的项目提供了小样本场景下文本多标签分类的解决方案,在 UTC 的根底上利用提醒学习获得比微调更好的分类成果,充分利用标注信息。

我的项目以及码源见文末


  • 我的项目背景:

近年来,大量蕴含了案件事实及其实用法律条文信息的裁判文书逐步在互联网上公开,海量的数据使自然语言解决技术的利用成为可能。事实中的案情盘根错节,案情形容通常波及多个重要事实,以 CAIL2019 数据集中婚姻家庭畛域的案情因素抽取为例:

"2013 年 11 月 28 日原、原告离婚时被迫达成协议,婚生子张某乙由原告李某某抚养,本院以(2013)宝渭法民初字第 01848 号民事调解书对该协定内容予以了确认,该协定具备法律效力,对原、原告单方均有约束力。"

该案件中波及婚后有子女、限度行为能力子女抚养两项因素。接下来咱们将解说在小样本场景下如何利用多标签模型,对输出文本中进行案情重要因素抽取。

利用部署界面展现

1.UTC(Universal Text Classification 介绍

本我的项目提供基于通用文本分类 UTC(Universal Text Classification)模型微调的文本分类端到端利用计划,买通 数据标注 - 模型训练 - 模型调优 - 预测部署全流程,可疾速实现文本分类产品落地。

文本分类是一种重要的自然语言解决工作,它能够帮忙咱们将大量的文本数据进行无效的分类和演绎。实际上,在日常生活中,咱们也常常会用到文本分类技术。例如,咱们能够应用文本分类来对新闻报道进行分类,对电子邮件进行分类,对社交媒体上的评论进行情感剖析等等。然而,文本分类也面临着许多挑战。其中最重要的挑战之一是数据稀缺。因为文本数据往往十分宏大,因而获取足够的训练数据可能十分艰难。此外,不同的文本分类工作也可能面临着畛域多变和工作多样等挑战。为了应答这些挑战,PaddleNLP 推出了一项零样本文本分类利用 UTC。该利用通过对立语义匹配形式 USM(Unified Semantic Matching)来将标签和文本的语义匹配能力进行对立建模。这种办法能够帮忙咱们更好地了解文本数据,并从中提取出有用的特色信息。

UTC 具备低资源迁徙能力,能够反对通用分类、评论情感剖析、语义类似度计算、蕴含推理、多项式浏览了解等多种“泛分类”工作。这使得开发者能够更加轻松高效地实现多任务文本分类数据标注、训练、调优和上线,从而升高文本分类技术门槛。

总之,文本分类是一项重要的自然语言解决工作,它能够帮忙咱们更好地了解和演绎文本数据。只管它面临着许多挑战,然而 通过应用 PaddleNLP 的零样本文本分类利用 UTC,开发者们能够简略高效实现多任务文本分类数据标注、训练、调优、上线,升高文本分类落地技术门槛。

1.1 分类落地面临难度

分类工作看似简略,然而在产业级文本分类落地实际中,面临着诸多挑战:

  • 工作多样:单标签、多标签、档次标签、大规模标签等不同的文本分类工作,须要开发不同的分类模型,模型架构往往特化于具体任务,难以使用对立模式建模;
  • 数据稀缺:局部畛域数据稀缺,难以获取,且畛域专业性使得数据标注门槛高;
  • 标签迁徙:不同畛域的标签多样,并且迁徙难度大,尤其不同畛域间的标签常识很难迁徙。

1.2 UTC 亮点

1.2.1 多任务对立建模

在传统技术计划中,针对不同的分类工作须要构建多个分类模型,模型需独自训练且数据和常识不共享。而在 UTC 计划下,单个模型能解决所有分类需要,包含但不限于单标签分类、多标签分类、档次标签分类、大规模事件标签检测、蕴含推理、语义类似度计算等,升高了开发成本和机器老本。

<div align=”center”>

<img width="600" alt="UTC 模型结构图" src="https://ai-studio-static-online.cdn.bcebos.com/f62973dbe1fc475dbb5e80b51c9ce5c1b7b461d9f01742e0b9f03699d873e94b">

</div>

1.2.2 零样本分类和小样本迁徙能力强

UTC 通过大规模多任务预训练后,能够适配不同的行业畛域,不同的分类标签,仅标注了几条样本,分类成果就获得大幅晋升,大大降低标注门槛和老本。

<div align=”center”>

<img width="550" alt="UTC 模型结构图" src="https://ai-studio-static-online.cdn.bcebos.com/0127eddf063f4c248cb54d11e1735a8dc265241366784be49c304ea4e013e234">

</div>

在医疗、金融、法律等畛域中,无需训练数据的零样本状况下 UTC 成果均匀可达到 70%+(如下表所示),标注少样本也可带来显著的成果晋升:每个标签仅仅标注 1 条样本后,均匀晋升了 10 个点!也就是说,即便在某些场景下体现欠佳,人工标几个样本,丢给模型后就会有大幅的成果晋升。

1.3 UTC 技术思路

UTC 基于百度最新提出的对立语义匹配框架 USM(Unified Semantic Matching)[1],将分类工作对立建模为标签与文本之间的匹配工作,对不同标签的分类工作进行对立建模。具体地说:

  1. 为了实现工作架构对立,UTC 设计了标签与文本之间的词对连贯操作(Label–>CLS-Token Linking),这使得模型可能适应不同畛域和工作的标签信息,并按需要进行分类,从而实现了凋谢域场景下的通用文本分类。
    例如,对于事件检测工作,可将一系列事件标签拼接为 [L] 上映 [L] 夺冠 [L] 下架,而后与原文本一起作为整体输出到 UTC 中,UTC 将不同标签标识符 [L] 与[CLS]进行匹配,可对不同标签类型的分类工作对立建模,间接上图:

<div align=”center”>

<img width="550" alt="UTC 模型结构图" src="https://ai-studio-static-online.cdn.bcebos.com/45bce279599242cf9245641b4e7f73f0b204e7a5771042e693bef054f765887c">

</div>

  1. 为了实现通用能力共享,让不同畛域间的标签常识跨域迁徙,UTC 构建了对立的异质监督学习办法进行多任务预训练,使不同畛域工作具备良好的零 / 少样本迁徙性能。对立的异质监督学习办法次要包含三种不同的监督信号:

    • 间接监督:分类工作间接相干的数据集,如情感分类、新闻分类、用意辨认等。
    • 间接监督:分类工作间接相干的数据集,如选项式浏览了解、问题 - 文章匹配等。
    • 近程监督:标签知识库或层级题目与文本对齐后弱标注数据。

更多内容参考论文见文末链接 or fork 一下我的项目论文已上传

2. 文本分类工作 Label Studio 教程

2.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 文本分类工作标注

  • 2.2.1 我的项目创立

点击创立(Create)开始创立一个新的我的项目,填写项目名称、形容,而后在 Labeling Setup 中抉择Text Classification

  • 填写项目名称、形容

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/210772704-7d8ebe91-eeb7-4760-82ac-f3c6478b754b.png />

</div>

  • 数据上传,从本地上传 txt 格式文件,抉择List of tasks,而后抉择导入本我的项目

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/210775940-59809038-fa55-44cf-8c9d-1b19dcbdc8a6.png  />

</div>

  • 设置工作,增加标签

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/210775986-6402db99-4ab5-4ef7-af8d-9a8c91e12d3e.png />

</div>

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/210776027-c4beb431-a450-43b9-ba06-1ee5455a95c5.png />

</div>

  • 数据上传

我的项目创立后,可在 Project/ 文本分类工作中点击 Import 持续导入数据,同样从本地上传 txt 格式文件,抉择List of tasks

  • 2.2.2 标签构建

我的项目创立后,可在 Setting/Labeling Interface 中持续配置标签,

默认模式为单标签多分类数据标注。对于多标签多分类数据标注,须要将 choice 的值由 single 改为multiple

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/222630045-8d6eebf7-572f-43d2-b7a1-24bf21a47fad.png />

</div>

  • 2.2.3 工作标注

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/210778977-842785fc-8dff-4065-81af-8216d3646f01.png />

</div>

  • 2.2.4 数据导出

勾选已标注文本 ID,抉择导出的文件类型为JSON,导出数据:

<div align=”center”>

<img src=https://user-images.githubusercontent.com/25607475/210779879-7560116b-22ab-433c-8123-43402659bf1a.png />

</div>

参考链接:

  • Label Studio

3. 多标签 / 档次分类数据转换

这里咱们应用 CAIL2019“中国法研杯”司法人工智能挑战赛—婚姻家庭因素提取工作数据集的子集作为示例数据集。该数据集中原始训练集包含 14377 条标注样本,咱们按每条标签随机采样 4 条样本,失去 80 条样本数据作为训练集,残余训练集数据作为测试集。

3.1 多标签源数据格式

data/
├── train.txt  # 训练数据集
├── dev.txt    # 验证数据集
├── test.txt   # 测试数据集(可选)├── data.txt   # 待预测数据(可选)└── label.txt  # 分类标签集
  • 训练 / 验证 / 测试数据

对于训练 / 验证 / 测试数据集文件,每行数据表示一条样本,包含文本和标签两局部,由 tab 符 \t 分隔,多个标签以英文逗号, 分隔。格局如下

< 文本 >'\t'< 标签 >','< 标签 >','< 标签 >
< 文本 >'\t'< 标签 >','< 标签 >

数据集展现

本院认为,涉案屋宇系 2012 年 12 月 4 日原、原告婚姻关系存续期间购买,且涉案楼房的产权注销在原、原告名下,根据法律规定,夫妻在婚姻关系存续期间所得的财产,归夫妻独特所有;不动产宰割, 有夫妻共同财产
原、原告之间的共同财产应依法宰割。有夫妻共同财产
协定不成时,由人民法院裁决”的规定,因为原告前期医治还需大量费用,被告应给与被告必要的经济帮忙。适当帮忙
故被告向法院提起诉讼,要求与原告离婚,婚生女孩随被告生存,原告给付抚养费。婚后有子女, 领取抚养费, 限度行为能力子女抚养
2014 年 12 月 22 日,原通知至本院,要求与原告离婚,后本院裁决不准予原、原告离婚。二次起诉离婚
男到女家生存,2006 年 12 月婚生一女,取名张某甲。婚后有子女
  • 预测数据

对于待预测数据文件,每行蕴含一条待预测样本,无标签。格局如下

< 文本 >
< 文本 >

数据集展现

五松新村屋宇是原告婚前购买的;原告于 2016 年 3 月将车牌号为皖 B×××××发售了 2.7 万元,原告通过被告偿还了齐荷花人民币 2.6 万元,原、原告尚欠齐荷花 2 万元。2、判令原告返还借婚姻索取的现金 33 万元,婚前集体贷款 10 万元;一、裁决被告于某某与原告杨某某离婚;
  • 标签数据

对于分类标签集文件,存储了数据集中所有的标签汇合,每行为一个标签名。如果须要自定义标签映射用于分类器初始化,则每行须要包含标签名和相应的映射词,由 == 分隔。格局如下

< 标签 >'=='< 映射词 >
< 标签 >'=='< 映射词 >

例如,对于婚姻家庭因素提取数据集,原标签字数较多,因而同一个标签依赖的输入也多。为了升高训练难度,咱们能够将其映射为较短的短语

有夫妻独特债权 == 独特债权
存在非婚生子 == 非婚生子
...

Note: 这里的标签映射词定义遵循的规定是,不同映射词尽可能长度统一,映射词和提醒须要尽可能形成通顺的语句。越靠近天然语句,小样本下模型训练成果越好。如果原标签名曾经能够形成通顺语句,也能够不结构映射词,每行一个标签即可,即

3.2 档次分类源数据格式

  • 训练 / 验证 / 测试数据
    对于训练 / 验证 / 测试数据集文件,每行数据表示一条样本,包含文本和标签两局部,由 tab 符 \t 分隔,多个标签以英文逗号, 分隔,同一标签内不同层级以 ## 字符连贯。格局如下
< 文本 >'\t'< 标签 >','< 标签 >','< 标签 >
< 文本 >'\t'< 标签 >','< 标签 >
...

紫光圣果副总经理李明雷辞职  组织关系, 组织关系 ## 辞 / 到职
无理取闹唾骂扶贫干部织金一居民被行拘    司法行为, 司法行为 ## 逮捕
...
  • 标签数据

对于分类标签集文件,存储了数据集中所有的标签门路汇合,每行是一个标签门路,高层的标签指向底层标签,不同层级的标签用 ’##’ 连贯,本项目选择为标签层次结构中的每一个节点生成对应的标签门路,详见档次分类工作介绍,标签门路格局如下

< 一级标签 >
< 一级标签 >'##'< 二级标签 >
< 一级标签 >'##'< 二级标签 >'##'< 三级标签 >
...

如果须要自定义标签映射用于分类器初始化,则每行须要包含标签名和相应的映射词,由 == 分隔。格局如下

< 一级标签 >'=='< 映射词 >
< 一级标签 >'##'< 二级标签 >'=='< 映射词 >
< 一级标签 >'##'< 二级标签 >'##'< 三级标签 >'=='< 映射词 >
...

例如,原标签门路来往 ## 会见中包含特殊符号##,大概率不会在谈话或者写作中应用,因而咱们将其映射为会见或者见面。来往 == 来往
来往 ## 会见 == 会见
...

3.3 转换后格局

三种分类都能够在 UTC 框架下实现,其中 multi-class 2.5 版本须要批改评估代码。multi-label: UTC 默认是 multi-label 模式。

# 多分类数据示例
{"text_a": "、月经期间刮痧拔罐会引起身材什么", "text_b": "","question":"", "choices": ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"], "labels": [5]}
# 多标签数据示例
{"text_a": "多标签分类示例","text_b": "","question":"","choices": ["体育", "时政", "娱乐", "电影"], "labels": [2, 3]}

hierachical: applications/text_classification/*/few-shot 目录下 hierachical 的代码实现和 multi-label 是雷同的,区别是数据层面将多级标签用 ## 分隔符拼接了起来,模式上仍是 multi-label。在 UTC 中也能够应用这种实现,将多级标签间接拼起来,如果只须要分类到细分层级,间接取细分层级成果可能更好。这里就不在反复展现了

# 档次分类数据示例
{"text_a": "多层次分类示例", "text_b": "","question":"","choices": ["环境 资质优",  "环境 资质差", "口味 口感好", "口味 口感差"], "labels": [0, 1]}
  • Note:2.5 版本批改代码局部:原有代码中 compute_metrics 函数的 sigmoid 实现 run_train.py 和 run_eval.py 均改为 softmax

    def compute_metrics(eval_preds):
          labels = paddle.to_tensor(eval_preds.label_ids, dtype="int64")
          preds = paddle.to_tensor(eval_preds.predictions)
          preds = paddle.nn.functional.softmax(preds, axis=-1)
          preds = preds[labels != -100]
          labels = paddle.argmax(labels, axis=-1)
    
          metric = Accuracy()
          correct = metric.compute(preds, labels)
          metric.update(correct)
          acc = metric.accumulate()
          return {"accuracy": acc}
  • 最新版本曾经减少:single_label 超参数

    • 默认 False,即可
    • 二分类时,开启 single_label 时须要将运行脚本中的 metric_for_best_model 参数改为 accuracy

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 单卡训练

# 装置最新版本 paddlenlp
!pip install --upgrade paddlenlp
# 单卡启动:!python run_train.py  \
    --device gpu \
    --logging_steps 100 \
    --save_steps 100 \
    --eval_steps 100 \
    --seed 1000 \
    --model_name_or_path utc-base \
    --output_dir ./checkpoint_1w/model_best \
    --dataset_path ./data/ \
    --max_seq_length 512  \
    --per_device_train_batch_size 32 \
    --per_device_eval_batch_size 32 \
    --gradient_accumulation_steps 8 \
    --num_train_epochs 20 \
    --learning_rate 1e-5 \
    --do_train \
    --do_eval \
    --do_export \
    --export_model_dir ./checkpoint_1w/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

训练样本 80 下后果:

[2023-05-18 18:47:00,108] [INFO] - ***** Running Evaluation *****
[2023-05-18 18:47:00,108] [INFO] -   Num examples = 1611
[2023-05-18 18:47:00,108] [INFO] -   Total prediction steps = 806
[2023-05-18 18:47:00,108] [INFO] -   Pre device batch size = 2
[2023-05-18 18:47:00,108] [INFO] -   Total Batch size = 2
[2023-05-18 18:47:23,035] [INFO] - eval_loss: 2.9577677249908447, eval_micro_f1: 0.9739602731222843, eval_macro_f1: 0.9244269186423556, eval_runtime: 22.9266, eval_samples_per_second: 70.268, eval_steps_per_second: 35.156, epoch: 20.0

二分类时须要留神的问题

  • ModuleNotFoundError: No module named ‘fast_tokenizer’
装置一下 fast tokenizer
pip install --upgrade fast_tokenizer
  • 开启 single_label 时须要将运行脚本中的 metric_for_best_model 参数改为 accuracy
metric_value = metrics[metric_to_check]
KeyError: 'eval_macro_f1'

NOTE:

如需复原模型训练,则能够设置 init_from_ckpt,如 init_from_ckpt=checkpoint/model_state.pdparams。

4.1.2 多卡训练

如果在 GPU 环境中应用,能够指定 gpus 参数进行多卡训练:

!python -u -m paddle.distributed.launch --gpus "0,1,2,3" run_train.py \
   --device gpu \
    --logging_steps 100 \
    --save_steps 100 \
    --eval_steps 100 \
    --seed 1000 \
    --model_name_or_path utc-base \
    --output_dir ./checkpoint_1w/model_best \
    --dataset_path ./data/ \
    --max_seq_length 512  \
    --per_device_train_batch_size 32 \
    --per_device_eval_batch_size 32 \
    --gradient_accumulation_steps 8 \
    --num_train_epochs 20 \
    --learning_rate 1e-5 \
    --do_train \
    --do_eval \
    --do_export \
    --export_model_dir ./checkpoint_1w/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

训练样本 1.4w+ 下后果:

[2023-05-18 19:47:58,379] [INFO] - ***** Running Evaluation *****
[2023-05-18 19:47:58,380] [INFO] -   Num examples = 1611
[2023-05-18 19:47:58,380] [INFO] -   Total prediction steps = 13
[2023-05-18 19:47:58,380] [INFO] -   Pre device batch size = 32
[2023-05-18 19:47:58,380] [INFO] -   Total Batch size = 128
[2023-05-18 19:48:01,395] [INFO] - eval_loss: 1.095533847808838, eval_micro_f1: 0.9833333333333333, eval_macro_f1: 0.9492148827343941, eval_runtime: 3.0153, eval_samples_per_second: 534.28, eval_steps_per_second: 4.311, epoch: 19.9455

该示例代码中因为设置了参数 --do_eval,因而在训练完会主动进行评估。

可配置参数阐明:

  • 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:保留模型进行推理部署

NOTE:

如需复原模型训练,则能够设置 init_from_ckpt,如 init_from_ckpt=checkpoint/model_state.pdparams。

4.2 模型评估

通过运行以下命令进行模型评估预测:

#80 样本
!python run_eval.py \
    --model_path ./checkpoint/model_best \
    --test_path ./data/test.txt \
    --per_device_eval_batch_size 32 \
    --max_seq_len 512 \
    --output_dir ./checkpoint_test

测试后果

test.txt 后果

100%|█████████████████████████████████████████| 879/879 [01:38<00:00, 12.86it/s][2023-05-18 18:52:23,476] [INFO] - ***** test metrics *****
[2023-05-18 18:52:23,477] [INFO] -   test_loss               =     0.7952
[2023-05-18 18:52:23,477] [INFO] -   test_macro_f1           =     0.9491
[2023-05-18 18:52:23,477] [INFO] -   test_micro_f1           =     0.9833
[2023-05-18 18:52:23,477] [INFO] -   test_runtime            = 0:01:39.72
[2023-05-18 18:52:23,477] [INFO] -   test_samples_per_second =      141.0
[2023-05-18 18:52:23,477] [INFO] -   test_steps_per_second   =      8.814
100%|█████████████████████████████████████████| 879/879 [01:48<00:00,  8.09it/s]

dev.txt 后果

100%|█████████████████████████████████████████| 101/101 [00:10<00:00, 13.66it/s][2023-05-18 19:03:14,188] [INFO] - ***** test metrics *****
[2023-05-18 19:03:14,188] [INFO] -   test_loss               =     1.0405
[2023-05-18 19:03:14,188] [INFO] -   test_macro_f1           =      0.934
[2023-05-18 19:03:14,188] [INFO] -   test_micro_f1           =     0.9779
[2023-05-18 19:03:14,188] [INFO] -   test_runtime            = 0:00:11.60
[2023-05-18 19:03:14,188] [INFO] -   test_samples_per_second =    138.821
[2023-05-18 19:03:14,188] [INFO] -   test_steps_per_second   =      8.703
100%|█████████████████████████████████████████| 101/101 [00:11<00:00,  8.56it/s]
#1.4w+ 样本
!python run_eval.py \
    --model_path ./checkpoint_1w/model_best \
    --test_path ./data/dev.txt \
    --per_device_eval_batch_size 16 \
    --max_seq_len 512 \
    --output_dir ./checkpoint_1w_test

测试后果

test.txt 后果

[2023-05-18 19:51:21,323] [INFO] -   test_loss               =     1.0959
[2023-05-18 19:51:21,323] [INFO] -   test_macro_f1           =     0.9576
[2023-05-18 19:51:21,323] [INFO] -   test_micro_f1           =     0.9831
[2023-05-18 19:51:21,323] [INFO] -   test_runtime            = 0:00:01.23
[2023-05-18 19:51:21,323] [INFO] -   test_samples_per_second =     64.911
[2023-05-18 19:51:21,323] [INFO] -   test_steps_per_second   =      4.057

dev.txt 后果

[2023-05-18 19:52:19,646] [INFO] -   test_loss               =     1.0903
[2023-05-18 19:52:19,646] [INFO] -   test_macro_f1           =     0.9492
[2023-05-18 19:52:19,646] [INFO] -   test_micro_f1           =     0.9833
[2023-05-18 19:52:19,646] [INFO] -   test_runtime            = 0:00:10.98
[2023-05-18 19:52:19,646] [INFO] -   test_samples_per_second =    146.627
[2023-05-18 19:52:19,646] [INFO] -   test_steps_per_second   =      9.193

可配置参数阐明:

  • model_path: 进行评估的模型文件夹门路,门路下需蕴含模型权重文件 model_state.pdparams 及配置文件model_config.json
  • test_path: 进行评估的测试集文件。
  • per_device_eval_batch_size: 批处理大小,请联合机器状况进行调整,默认为 16。
  • max_seq_len: 文本最大切分长度,输出超过最大长度时会对输出文本进行主动切分,默认为 512。
  • single_label: 每条样本是否只预测一个标签。默认为False,示意多标签分类。

4.3 模型预测

paddlenlp.Taskflow装载定制模型,通过 task_path 指定模型权重文件的门路,门路下须要蕴含训练好的模型权重文件model_state.pdparams

from pprint import pprint
import json
from paddlenlp import Taskflow

def openreadtxt(file_name):
    data = []
    file = open(file_name,'r',encoding='UTF-8')  #关上文件
    file_data = file.readlines() #读取所有行
    for row in file_data:
        data.append(row) #将每行数据插入 data 中     
    return data

data_input=openreadtxt('/home/aistudio/input/data2.txt')
# print(data_input)


schema = ["婚后生养", "抚养孩子", "共同财产", "付抚养费", "分不动产", "婚后分居", "二次起诉", "按月付费", "批准离婚", "独特债权", "婚前财产",
 "法定离婚", "家庭任务", "非婚生子", "适当帮忙", "忽视协定", "损害赔偿", "分居两年", "子女离开", "个人财产"]

my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema, task_path='/home/aistudio/checkpoint/model_best/plm')
results=my_cls(data_input)

with open("/home/aistudio/output/output.txt", "w+",encoding='UTF-8') as f:    #a :   写入文件,若文件不存在则会先创立再写入,但不会笼罩原文件,而是追加在文件开端
    for result in results:
        print(result)
        line = json.dumps(result, ensure_ascii=False)  #对中文默认应用的 ascii 编码. 想输入真正的中文须要指定 ensure_ascii=False
        f.write(line + "\n")

print("数据后果已导出")
[2023-05-18 19:14:41,567] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'utc-base'.
[2023-05-18 19:14:41,572] [INFO] - Already cached /home/aistudio/.paddlenlp/models/utc-base/utc_base_vocab.txt
[2023-05-18 19:14:41,610] [INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/utc-base/tokenizer_config.json
[2023-05-18 19:14:41,616] [INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/utc-base/special_tokens_map.json
[2023-05-18 19:14:41,622] [INFO] - Assigning ['[O-MASK]'] to the additional_special_tokens key of the tokenizer


{'predictions': [{'label': '适当帮忙', 'score': 0.9990043954170514}], 'text_a': '协定不成时,由人民法院裁决”的规定,因为原告前期医治还需大量费用,被告应给与被告必要的经济帮忙。\t\n'}
{'predictions': [{'label': '婚后生养', 'score': 0.9994037939529928}, {'label': '抚养孩子', 'score': 0.9991192036976089}, {'label': '付抚养费', 'score': 0.9995337863092342}], 'text_a': '故被告向法院提起诉讼,要求与原告离婚,婚生女孩随被告生存,原告给付抚养费。\t\n'}
{'predictions': [{'label': '二次起诉', 'score': 0.9996573067393362}], 'text_a': '2014 年 12 月 22 日,原通知至本院,要求与原告离婚,后本院裁决不准予原、原告离婚。\t\n'}
{'predictions': [{'label': '婚后生养', 'score': 0.9981496013638776}], 'text_a': '男到女家生存,2006 年 12 月婚生一女,取名张某甲。\t'}
数据后果已导出

抽样测试:

  • 协定不成时,由人民法院裁决”的规定,因为原告前期医治还需大量费用,被告应给与被告必要的经济帮忙。适当帮忙
  • 故被告向法院提起诉讼,要求与原告离婚,婚生女孩随被告生存,原告给付抚养费。婚后生养, 付抚养费, 抚养孩子
  • 2014 年 12 月 22 日,原通知至本院,要求与原告离婚,后本院裁决不准予原、原告离婚。二次起诉
  • 男到女家生存,2006 年 12 月婚生一女,取名张某甲。婚后生养

{'predictions': [{'label': '适当帮忙', 'score': 0.9990043954170514}], 'text_a': '协定不成时,由人民法院裁决”的规定,因为原告前期医治还需大量费用,被告应给与被告必要的经济帮忙。\t\n'}
{'predictions': [{'label': '婚后生养', 'score': 0.9994037939529928}, {'label': '抚养孩子', 'score': 0.9991192036976089}, {'label': '付抚养费', 'score': 0.9995337863092342}], 'text_a': '故被告向法院提起诉讼,要求与原告离婚,婚生女孩随被告生存,原告给付抚养费。\t\n'}
{'predictions': [{'label': '二次起诉', 'score': 0.9996573067393362}], 'text_a': '2014 年 12 月 22 日,原通知至本院,要求与原告离婚,后本院裁决不准予原、原告离婚。\t\n'}
{'predictions': [{'label': '婚后生养', 'score': 0.9981496013638776}], 'text_a': '男到女家生存,2006 年 12 月婚生一女,取名张某甲。\t'}

抽样准确率 100%

5. 基于 gradio 可视化展现

6. 总结

6.1 UTC 提醒学习和微调预训练学习模型比照

Macro F1 和 Micro F1 都是评估分类模型性能的指标,然而它们计算形式不同。

  • Macro F1 是每个类别的 F1 值的平均值,不思考类别的样本数。它实用于数据集中各个类别的样本数量相近的状况下,能够更好地反映每个类别的性能。
  • Micro F1 是所有类别的 F1 值的加权均匀,其中权重为每个类别的样本数。它将所有类别的预测后果汇总为一个混同矩阵,并计算出整个数据集的准确率、召回率和 F1 值。Micro F1 实用于多分类问题,尤其是在数据集不均衡的状况下,能够更好地反映整体的性能。

总之,Micro F1 更关注整个数据集的性能,而 Macro F1 更关注每个类别的性能。

model_name 模型构造 Micro F1(%) Macro F1(%)
UTC-base-1.4w+ 样本 12-layer, 768-hidden, 12-heads 98.33 94.92
UTC-base-80 样本 12-layer, 768-hidden, 12-heads 97.79 93.4
ERNIE 1.0 Large Cw 24-layer, 1024-hidden, 20-heads 91.14 81.68
ERNIE 3.0 Base 12-layer, 768-hidden, 12-heads 90.38 80.14
ERNIE 3.0 Medium 6-layer, 768-hidden, 12-heads 90.57 79.36
ERNIE 3.0 Mini 6-layer, 384-hidden, 12-heads 89.27 76.78
ERNIE 3.0 Micro 4-layer, 384-hidden, 12-heads 89.43 77.20
ERNIE 3.0 Nano 4-layer, 312-hidden, 12-heads 85.39 75.07

## 我的项目链接 & 码源链接

“中国法研杯”司法人工智能挑战赛:基于 UTC 的多标签 / 档次分类小样本文本利用,Macro F1 晋升 13%+

正文完
 0