共计 18857 个字符,预计需要花费 48 分钟才能阅读完成。
我的项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/4592515?contributionType=1
如果有图片缺失参考我的项目链接
0. 我的项目背景
CBLUE 又是一个 CLUE 榜单,大家都晓得近年来 NLP 畛域随着预训练语言模型(上面简称 PTLM)的衰亡又迎来了一波迅猛发展,得益于 PTLM 技术的推动,催生出一批多任务的 benchmark 榜单,代表性的工作是 GLUE,在中文畛域也有 CLUE。CBLUE 的全名是 Chinese Biomedical Language Understanding Evaluation,是目前国内首个医疗 AI 方向的多任务榜单,置信这个榜单的推出会促成医疗语言模型的倒退和医疗 NLP 畛域的倒退。榜单的官网介绍如下:
中文医疗信息处理评测基准 CBLUE(Chinese Biomedical Language Understanding Evaluation)是中国中文信息学会医疗衰弱与生物信息处理业余委员会在非法凋谢共享的理念下发动,由阿里云天池平台承办,并由医渡云(北京)技术有限公司、安全医疗科技、阿里夸克、腾讯天衍实验室、北京大学、鹏城实验室、哈尔滨工业大学(深圳)、郑州大学、同济大学、中山大学、复旦大学等发展智慧医疗钻研的单位独特协办,旨在推动中文医学 NLP 技术和社区的倒退。榜单在设计上综合思考了工作类型和工作难度两个维度,指标是建设一个工作类型笼罩广、同时也要保障工作的难度的 benchmark,因而榜单在排汇往届 CHIP/CCKS/CCL 等学术评测工作的同时也适当减少了业界数据集,业务数据集的特点是数据实在且有乐音,对模型的鲁棒性提出了更高的要求。CBLUE 评测基准 2.0 包含医学文本信息抽取(实体辨认、关系抽取、事件抽取)、医学术语归一化、医学文本分类、医学句子关系断定和医疗对话了解与生成共 5 大类工作 14 个子工作。
blog.csdnimg.cn/ef2cb516bcfa481ab30b0f345c4bf11a.png)
中文畛域也有 CLUE:
https://www.cluebenchmarks.co…
英文
https://gluebenchmark.com/
官网介绍榜单一共蕴含了 4 大类 8 细类工作,上面别离介绍:
- 医学信息抽取:
次要蕴含了实体辨认 NER 工作和关系抽取 RE 两个数据集:
CMeEE(Chinese Medical Entity Extraction):是由“北京大学”、“郑州大学”、“鹏城实验室”和“哈尔滨工业大学(深圳)”联结提供。共包含 9 大类实体:疾病 (dis),临床表现(sym),药物(dru),医疗设施(equ),医疗程序(pro),身材(bod),医学测验我的项目(ite),微生物类(mic) 和科室(dep),其中“临床表现”实体类别中容许嵌套,该实体外部容许存在其余八类实体。嵌套实体一贯是 NER 工作中一个难点。
CMeIE(Chinese Medical Information Extraction):和 CMeEE 工作一样,也是由“北京大学”、“郑州大学”、“鹏城实验室”和“哈尔滨工业大学(深圳)”联结提供的。共包含 53 类关系类型(具体类型参见官网介绍),这个工作须要打榜选手实现端对端的模型预测,即输出是原始的句子,选手须要实现实体辨认和关系抽取两个工作。从关系品种的数量 53 类来看,且标注标准中有提及到关系可能是跨句子散布的(“Combined”字段为 false),这是一个比拟难的工作。
- 医学术语归一化:
这个工作依照我的了解是应该归属到信息抽取这个大类的,都属于常识图谱结构的关键技术,不晓得官网为什么独自划分为一类,可能是有其余思考。包含了一个数据集:
CHIP-CDN(CHIP – Clinical Diagnosis Normalization dataset):CHIP 这个名字一开始比拟困惑,Google 上查找了半天也没有找到是什么,起初认真看官网文档才发现 CHIP 就是这个榜单的发动单位组织的业余会议(历史教训通知咱们任何时候都要认真读文档),CHIP 示意中国衰弱信息处理会议,全称是 China Health Information Processing Conference,是中国中文信息学会医疗衰弱与生物信息处理业余委员会主办的对于医疗、衰弱和生物信息处理和数据挖掘等技术的年度会议,是中国衰弱信息处理畛域最重要的学术会议之一,这个会议曾经间断举办了六届,最近几届都公布了医疗方向的学术评测工作,这个榜单很多以 CHIP 结尾的数据集就是来源于大会上公布的评测工作。言归正传,CHIP-CDN 数据集是由北京医渡云公司提供的,这是一个规范的实体标准化/归一化工作,将给定的医学症状实体映射到医学规范字典(ICD-10)上。这是一个很有实际意义的工作,医生在书写病历的时候,同一个术语往往有多种不同的写法,甚至一个症状可能是多个规范症状的叠加(如官网中的例子:“右肺结节转移可能大”->“肺占位性病变 ##肺继发恶性肿瘤## 转移性肿瘤”),十分的简单。这类工作个别不能只靠模型来解决,须要联合具体的行业常识来做断定。
- 医学文本分类:
包含两个工作:
CHIP-CTC(CHiP – Clinical Trial Criterion dataset):是由同济大学生命科学与技术学院提供,次要针对临床试验筛选规范进行分类,所有文本数据均来自于实在临床试验,也是一个有实在意义的工作。从技术上看,这是一个典型的短文本多分类问题,共有 44 个类别(具体类别请参照官网),分类工作钻研绝对较多,个别须要留神的是类别比例的散布。
KUAKE-QIC(KUAKE-Query Intention Classification dataset),是由夸克浏览器提供。这也是一个文本分类问题,共有 11 种分类(具体分类请查看官网),和 CHIP-CTC 数据集的区别是这个工作的输出均来自于实在的用户 query,数据存在大量的乐音。
- 医学句子关系断定 / 医学 QA:
包含 3 个数据集:
CHIP-STS(CHIP – Semantic Textual Similarity dataset):是由安全医疗科技公司提供。是一个典型的语义类似度判断问题,数据集共蕴含 5 大类疾病,输入后果是 0 / 1 两类标签。这个工作应该不算太难,其中疾病的类别信息也是一个输出,模型在设计的时候要把这个 feature 思考进去。
KUAKE-QTR(KUAKE-Query Title Relevance dataset):也是由夸克公司提供,搞搜寻举荐算法的小伙伴们一看就晓得是一个 QT match 的问题,相比 CHIP-STS,这个数据集是一个 4 分类问题(共 0~3 分 4 档)。官网给的例子还是挺有难度辨别的,感觉模型不太容易跑出高性能。
KUAKE-QQR(KUAKE-Query Query Relevance dataset):也是由夸克公司提供。和 KUAKE-QTR 相似,是一个典型的 Query-Query match 问题,是一个 3 分类问题(共 0~2 分 3 档)。难点同 QTR。
1. 数据集加载 & 装置环境
KUAKE-QIC(KUAKE-Query Intention Classification dataset),是由夸克浏览器提供。这也是一个文本分类问题,共有 11 种分类(具体分类请查看官网),和 CHIP-CTC 数据集的区别是这个工作的输出均来自于实在的用户 query,数据存在大量的乐音。
!wget https://paddlenlp.bj.bcebos.com/datasets/KUAKE_QIC.tar.gz
!tar -zxvf KUAKE_QIC.tar.gz
!mv KUAKE_QIC data
!rm KUAKE_QIC.tar.gz
!pip install --upgrade paddlenlp
!pip install scikit-learn
数据集展现
心肌缺血如何医治与调养呢?医治计划
19 号来的月经,25 号服用了紧急避孕药本月 5 号,怎么办?医治计划
什么叫痔核脱出?什么叫外痔?疾病表述
您好,请问一岁三个月的孩子能够服用复方锌布颗粒吗?其余
多发乳腺结节中药能治愈吗 疾病表述
有了中风怎么样治最好 医治计划
输卵管粘连的根本查看 其余
尖锐湿疣吃什么中草药好 医治计划
细胞病理学诊断非典型鳞状细胞,意义不明确。什么意思 指标解读
性生活后白带有酸味是怎么回事?病情诊断
会是胎动么?其余
常常干呕恶心,这是生病了吗 其余
标签合集:
病情诊断
医治计划
病因剖析
指标解读
就医倡议
疾病表述
结果表述
注意事项
效用作用
医疗费用
其余
2 预训练模型微调
2.1 知识点:学习率 warm-up
因为神经网络在刚开始训练的时候是十分不稳固的,因而刚开始的学习率该当设置得很低很低,这样能够保障网络可能具备良好的收敛性。然而较低的学习率会使得训练过程变得十分迟缓,因而这里会采纳以较低学习率逐步增大至较高学习率的形式实现网络训练的“热身”阶段,称为 warmup stage。然而如果咱们使得网络训练的 loss 最小,那么始终应用较高学习率是不适合的,因为它会使得权重的梯度始终来回震荡,很难使训练的损失值达到全局最低谷。
在理论中,因为训练刚开始时,训练数据计算出的梯度 grad 可能与冀望方向相同,所以此时采纳较小的学习率 learning rate,随着迭代次数减少,学习率 lr 线性增大,增长率为 1/warmup_steps;迭代次数等于 warmup_steps 时,学习率为初始设定的学习率;
另一种起因是因为刚开始训练时, 模型的权重 (weights) 是随机初始化的,此时若抉择一个较大的学习率, 可能带来模型的不稳固(振荡),抉择 Warmup 预热学习率的形式,能够使得开始训练的几个 epoches 内学习率较小, 在预热的小学习率下,模型能够缓缓趋于稳定, 等模型绝对稳固后再抉择事后设置的学习率进行训练, 使得模型收敛速度变得更快,模型成果更佳。
迭代次数超过 warmup_steps 时,学习率逐渐衰减,衰减率为 1 /(total-warmup_steps),再进行微调。
常见的 warmup 形式有三种:constant,linear 和 exponent。
- constant:在 warmup 期间,学习率。ResNet 论文中就应用了这种形式,在 cifar10 上训练 ResNet 101 时,先用 0.01 的学习率训练直到训练误差低于 80%(大略训练了 400 个 steps),而后应用 0.1 的学习率进行训练。
<p align=”center”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/d8343e86cd19469ca1fa587074dab5488417ebe56f1d48c4aa4de16eb0a74eb7″ width=”500″ alt=”PaddleX” align=”middle” />
- linear:constant 的不足之处在于从一个很小的学习率一下变为比拟大的学习率可能会导致训练误差忽然增大。linear 形式能够防止这种问题,在 warmup 期间,学习率从 线性增长到。
<p align=”center”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/7a85a5b1ef064bccba65290da4bc9d43bae00aac97dd44fc8a3c51e9e458f1fb” width=”500″ alt=”PaddleX” align=”middle” />
- exponent:在 warmup 期间,学习率从 指数增长到。
<p align=”center”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/2716b4c3500e45dbb165d2149ceaccba215fe09f10a94dd59db74d8b5907b234″ width=”500″ alt=”PaddleX” align=”middle” />
参考链接:https://zhuanlan.zhihu.com/p/…
warmup 办法的劣势:
有助于减缓模型在初始阶段对 mini-batch 的提前过拟合景象,放弃散布的安稳
有助于放弃模型深层的稳定性
paddlenlp 参考文档:
https://www.paddlepaddle.org….
<p align=”center”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/c7f862eff9834fc1bbce4f49a7a44e5a3021a383160941bea24984a80e1c4afe” width=”500″ alt=”PaddleX” align=”middle” />
<p align=”center”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/88c3f77e16e043b3aada4a0bdd7fd58fcc92208fd4464b55afcaa6ade392b5df” width=”500″ alt=”PaddleX” align=”middle” />
2.2 模型训练和预测
!python train.py \
--dataset_dir "data/KUAKE_QIC" \
--device "gpu" \
--save_dir "./checkpoint" \
--max_seq_length 256 \
--model_name "ernie-3.0-xbase-zh" \
--batch_size 32 \
--learning_rate 3e-5 \
--early_stop \
--early_stop_nums 5 \
--epochs 20 \
--warmup \
--warmup_steps 1000 \
--weight_decay 0.01 \
--logging_steps 50 \
--valid_steps 100
save_dir:保留训练模型的目录;默认保留在当前目录 checkpoint 文件夹下。
- train_file:本地数据集中训练集文件名;默认为 ”train.txt”。
- dev_file:本地数据集中开发集文件名;默认为 ”dev.txt”。
- label_file:本地数据集中标签集文件名;默认为 ”label.txt”。
device: 选用什么设施进行训练,抉择 cpu、gpu、xpu、npu。如应用 gpu 训练,可应用参数 –gpus 指定 GPU 卡号;默认为 ”gpu”。
dataset_dir::本地数据集门路,数据集门路中应蕴含 train.txt,dev.txt 和 label.txt 文件; 默认为 None。
<font color=”red”>dataset_dir:本地数据集门路,数据集门路中应蕴含 train.txt,dev.txt 和 label.txt 文件; 默认为 None。</font>
max_seq_length:分词器 tokenizer 应用的最大序列长度,ERNIE 模型最大不能超过 2048。请依据文本长度抉择,通常举荐 128、256 或 512,若呈现显存有余,请适当调低这一参数;默认为 128。
<font color=”red”>model_name:抉择预训练模型, 可选 ”ernie-1.0-large-zh-cw”,”ernie-3.0-xbase-zh”, “ernie-3.0-base-zh”, “ernie-3.0-medium-zh”, “ernie-3.0-micro-zh”, “ernie-3.0-mini-zh”, “ernie-3.0-nano-zh”, “ernie-2.0-base-en”, “ernie-2.0-large-en”,”ernie-m-base”,”ernie-m-large”;默认为 ”ernie-3.0-medium-zh”。</font>
batch_size:批处理大小,请联合显存状况进行调整,若呈现显存有余,请适当调低这一参数;默认为 32。
learning_rate:Fine-tune 的最大学习率;默认为 3e-5。
weight_decay:管制正则项力度的参数,用于避免过拟合,默认为 0.0。能够设置小点 如 0.01 等
epochs: 训练轮次,应用早停法时能够抉择 100;默认为 10。
early_stop:抉择是否应用早停法(EarlyStopping);模型在开发集通过肯定 epoch 后精度体现不再回升,训练终止;默认为 False。
<font color=”red”>early_stop_nums:在设定的早停训练轮次内,模型在开发集上体现不再回升,训练终止;默认为 4。</font>
<font color=”red”>warmup:是否应用学习率 warmup 策略,应用时应设置适当的训练轮次(epochs);默认为 False。</font>
warmup_proportion:学习率 warmup 策略的比例数,如果设为 0.1,则学习率会在前 10%steps 数从 0 缓缓增长到 learning_rate, 而后再迟缓衰减;默认为 0.1。
warmup_steps:学习率 warmup 策略的比例数,如果设为 1000,则学习率会在 1000steps 数从 0 缓缓增长到 learning_rate, 而后再迟缓衰减;默认为 0。
logging_steps: 日志打印的距离 steps 数,默认 5。
init_from_ckpt: 模型初始 checkpoint 参数地址,默认 None。
seed:随机种子,默认为 3。
训练后果:
[2022-09-24 23:46:42,282] [INFO] - global step 2900, epoch: 14, batch: 79, loss: 0.08345, speed: 4.60 step/s
[2022-09-24 23:46:47,353] [INFO] - eval loss: 1.06234, acc: 0.80102
[2022-09-24 23:46:47,355] [INFO] - Current best accuracy: 0.81330
[2022-09-24 23:46:58,502] [INFO] - global step 2950, epoch: 14, batch: 129, loss: 0.00550, speed: 3.09 step/s
[2022-09-24 23:47:10,650] [INFO] - global step 3000, epoch: 14, batch: 179, loss: 0.00378, speed: 4.12 step/s
[2022-09-24 23:47:15,735] [INFO] - eval loss: 1.13159, acc: 0.80767
[2022-09-24 23:47:15,737] [INFO] - Current best accuracy: 0.81330
[2022-09-24 23:47:23,969] [INFO] - Early stop!
[2022-09-24 23:47:23,969] [INFO] - Final best accuracy: 0.81330
<p align=”left”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/3ca0cf6c93ff49ebaf81dc940f35631f1f90cd6366a7465d9cbd00de9628fedd” width=”350″ alt=”PaddleX” align=”middle” />
<img src="https://ai-studio-static-online.cdn.bcebos.com/a689350fd03f4004b61a87f94cb5441af847ebc7df8b4b3fb494e108b2b996fc" width="350" alt="PaddleX" align="middle" />
<img src="https://ai-studio-static-online.cdn.bcebos.com/37dbb084fe0e4c51a7ec07c3c78ae1bc077afeaf2f994fa19b50fc35be4dd82c" width="350" alt="PaddleX" align="middle" />
!python predict.py \
--device "gpu" \
--max_seq_length 128 \
--batch_size 32 \
--dataset_dir "data/KUAKE_QIC" \
--params_path "./checkpoint/" \
--output_file "output.txt"
预测后果
text label
黑苦荞茶的效用与作用及食用方法 效用作用
接壤痣会凸起吗 疾病表述
查看是否能怀孕挂什么科 就医倡议
鱼油怎么吃咬破吃还是间接咽下去 其余
幼儿挑食的生理起因是 病因剖析
3. 小样本学习
提醒学习(Prompt Learning)实用于标注老本高、标注样本较少的文本分类场景。在小样本场景中,相比于预训练模型微调学习,提醒学习能获得更好的成果。
提醒学习的次要思维是将文本分类工作转换为结构提醒中掩码 [MASK] 的分类预测工作,也即在掩码 [MASK]向量后接入线性层分类器预测掩码地位可能的字或词。提醒学习应用待预测字的预训练向量来初始化分类器参数(如果待预测的是词,则为词中所有字的预训练向量平均值),充分利用预训练语言模型学习到的特色和标签文本,从而升高样本需要。提醒学习同时提供 R-Drop 和 RGL 策略,帮忙晋升模型成果。
.
├── train.py # 模型组网训练脚本
├── utils.py # 数据处理工具
├── infer.py # 模型部署脚本
└── README.md
## 3.1 知识点:Rdrop 技术(Regularized Dropout)
比照学习 RDrop: Regularized Dropout for Neural Networks
每个数据样本反复通过带有 Dropout 的同一个模型,再应用 KL 散度束缚两次的输入,使得尽可能统一,而因为 Dropout 的随机性,能够近似把输出 X 走过两次的门路网络当作两个略有不同的模型,如下图所示:
R-Dropout 的原理
简略地说,就是模型中退出 dropout,训练阶段的预测预测两次,要求两次的后果尽可能靠近,这种靠近体现在损失函数上。
那么,这个“靠近”用的是什么呢?作者用的是 KL 散度。数学上的 KL 散度是用来比照两个散布是否雷同,其连续型和离散型的公式别离是:
OK,有这个根底,来持续看 R -Dropout 就更清晰了,咱们要让两次预测后果的 KL 散度尽可能小,那么这部分的损失函数就能够结构进去了:
KL 散度自身是不具备自反性的,所以要用第一次预测对第二次的 KL 散度和第二次预测对第一次预测的 KL 散度的均值来进行计算。
这部分损失能够退出到整体损失外面作为最终优化的一部分,例如是 log loss(当然,其余工作能够用其余的损失):
为什么 R -Dropout 会有用
其实 dropout 的实质就是给模型加一些扰动,而 R -dropout 就是要扰动,更要保障这种扰动对后果尽可能小,毕竟这里还优化了两次预测的 KL 散度,所以其实这种训练就让模型的稳定性大幅晋升。最近是遇到一些问题,一句话改一两个字意思还一样然而后果差距很大,这个 r -dropout 应该能够缓解这个问题,甚至说解决。
然而留神,这里是稳定性晋升,我的感觉是并没有拉高模型自身的下限,甚至可能拉低下限。咱们晓得模型是存在不稳定性的,同一套数据的不同程序,参数的不同初始化,不同的 dropout 都会导致模型成果存在稳定,而且这个稳定还不小,R-dropout 实质上即便管制这种稳定对后果的影响,从而保障了稳定性。而无关拉低下限,我的解释是最终的参数估计预测,相比不带有新的 loss 子项,这应该是一个有偏预计,还是可能肯定水平拉低下限的。
为什么用 KL 散度
KL 散度实质上是一个比照散布的函数,这与 R -Dropout 的初衷统一的,要求两次预测尽可能雷同,这里是指完全相同,例如多分类下要求的是所有预测的对应概率也是统一的,相比于穿插熵的只针对最优值的 prob,这个比照会更加全面和残缺。
知识点参考链接:
https://blog.csdn.net/Jiana_F…
https://blog.csdn.net/baidu_2…
https://zhuanlan.zhihu.com/p/…
3.2 模型训练与预测
!python few-shot/train.py \
--device gpu \
--data_dir ./data/KUAKE_QIC \
--output_dir ./checkpoints_shot/ \
--prompt "这个分类是" \
--max_seq_length 128 \
--learning_rate 3e-5 \
--ppt_learning_rate 3e-4 \
--do_train \
--do_eval \
--use_rdrop \
--num_train_epochs 20 \
--eval_steps 200 \
--logging_steps 50 \
--per_device_eval_batch_size 32 \
--per_device_train_batch_size 32 \
--load_best_model_at_end \
--weight_decay 0.01 \
--save_steps 600 \
--warmup_ratio 0.15
# --warmup_steps 1000 \
#warm_up_ratio = 0.1 # 定义要预热的 step
#num_warmup_steps = warm_up_ratio * total_steps, num_training_steps = total_steps
# --max_steps 5000 \ 能够抉择 epochs or steps
# --do_predict \
# --do_export
# --save_steps 500 #默认 500
#--warmup_ratio
#--warmup_steps
#--weight_decay
model_name_or_path: 内置模型名,或者模型参数配置目录门路。默认为 ernie-3.0-base-zh。
data_dir: 训练数据集门路,数据格式要求详见数据筹备。
output_dir: 模型参数、训练日志和动态图导出的保留目录。
prompt: 提醒模板。定义了如何将文本和提醒拼接联合。
soft_encoder: 提醒向量的编码器,lstm 示意双向 LSTM, mlp 示意双层线性层, None 示意间接应用提醒向量。默认为 lstm。
use_rdrop: 应用 R-Drop 策略。
use_rgl: 应用 RGL 策略。
encoder_hidden_size: 提醒向量的维度。若为 None,则应用预训练模型字向量维度。默认为 200。
max_seq_length: 最大句子长度,超过该长度的文本将被截断,有余的以 Pad 补全。提醒文本不会被截断。
learning_rate: 预训练语言模型参数根底学习率大小,将与 learning rate scheduler 产生的值相乘作为以后学习率。
ppt_learning_rate: 提醒相干参数的根底学习率大小,当预训练参数不固定时,与其共用 learning rate scheduler。个别设为learning_rate 的十倍。
do_train: 是否进行训练。
do_eval: 是否进行评估。
do_predict: 是否进行预测。
do_export: 是否在运行完结时将模型导出为动态图,保留门路为 output_dir/export。
max_steps: 训练的最大步数。此设置将会笼罩 num_train_epochs。
eval_steps: 评估模型的距离步数。
device: 应用的设施,默认为 gpu。
logging_steps: 打印日志的距离步数。
per_device_train_batch_size: 每次训练每张卡上的样本数量。可依据理论 GPU 显存适当调小 / 调大此配置。
per_device_eval_batch_size: 每次评估每张卡上的样本数量。可依据理论 GPU 显存适当调小 / 调大此配置。
局部训练后果展现:
跑了两次: 最优 acc 为 0.81279-3400steps
<p align=”left”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/a83e0daf883c470faf9dae2dd29ea45c0995bf0d848d483b817e67879fa1efc3″ width=”400″ alt=”PaddleX” align=”middle” />
<img src="https://ai-studio-static-online.cdn.bcebos.com/16e2dcb28c7247f8abb4b3d7e6ba4e5cb50895d601864a2c85d378a9a00ff0e6" width="400" alt="PaddleX" align="middle" />
4. 模型优化:TrustAI、数据加强
训练后的模型咱们能够应用 模型剖析模块 对每个类别别离进行评估,并输入预测谬误样本(bad case),默认在 GPU 环境下应用,在 CPU 环境下批改参数配置为 –device “cpu”:
模型体现经常受限于数据品质,在 analysis 模块中 基于 TrustAI 的稠密数据筛选、脏数据荡涤、数据加强 三种优化计划助力开发者晋升模型成果,更多模型评估和优化计划细节详见训练评估与模型优化指南。
<p align=”center”>
<img src=”https://ai-studio-static-online.cdn.bcebos.com/86b1ceae9d4643568cc56b2203a1c652efdd2a09786d4a0790fa814b2530bd2a” width=”500″ alt=”PaddleX” align=”middle” />
analysis/
├── evaluate.py # 评估脚本
├── sparse.py # 稠密数据筛选脚本
├── dirty.py # 脏数据荡涤脚本
├── aug.py # 数据加强脚本
└── README.md # 多分类训练评估与模型优化指南
参考链接:
多分类训练评估与模型优化指南:
https://github.com/PaddlePadd…
Data Augmentation API:
https://github.com/PaddlePadd…
TrustAI:
https://github.com/PaddlePadd…
4.1 模型评估
应用训练好的模型计算模型的在开发集的准确率,同时打印每个类别数据量及体现:
!python analysis/evaluate.py \
--device "gpu" \
--max_seq_length 128 \
--batch_size 32 \
--bad_case_path "./bad_case.txt" \
--dataset_dir "data/KUAKE_QIC" \
--params_path "./checkpoint"
验证后果局部展现:
[2022-09-24 23:54:13,923] [INFO] - -----Evaluate model-------
[2022-09-24 23:54:13,923] [INFO] - Train dataset size: 6931
[2022-09-24 23:54:13,923] [INFO] - Dev dataset size: 1955
[2022-09-24 23:54:13,923] [INFO] - Accuracy in dev dataset: 81.38%
[2022-09-24 23:54:13,924] [INFO] - Top-2 accuracy in dev dataset: 92.02%
[2022-09-24 23:54:13,925] [INFO] - Top-3 accuracy in dev dataset: 97.19%
[2022-09-24 23:54:13,925] [INFO] - Class name: 病情诊断
[2022-09-24 23:54:13,925] [INFO] - Evaluation examples in train dataset: 877(12.7%) | precision: 97.65 | recall: 99.43 | F1 score 98.53
[2022-09-24 23:54:13,925] [INFO] - Evaluation examples in dev dataset: 288(14.7%) | precision: 82.26 | recall: 88.54 | F1 score 85.28
[2022-09-24 23:54:13,925] [INFO] - ----------------------------
[2022-09-24 23:54:13,925] [INFO] - Class name: 医治计划
[2022-09-24 23:54:13,926] [INFO] - Evaluation examples in train dataset: 1750(25.2%) | precision: 98.48 | recall: 99.77 | F1 score 99.12
[2022-09-24 23:54:13,926] [INFO] - Evaluation examples in dev dataset: 676(34.6%) | precision: 88.86 | recall: 93.20 | F1 score 90.97
[2022-09-24 23:54:13,926] [INFO] - ----------------------------
…………..
能够看出不同类别辨认难度不一:
预测谬误的样本保留在 bad_case.txt 文件中:
0.98 病情诊断 其余 最近如同有感冒,身上感觉不定位不定时的痛特地的右边背上还长了一个大包,右眼酸胀。我这样重大吗
0.98 注意事项 其余 月经来后是否持续用月经前用的药
0.97 医治计划 其余 外阴骚痒,每次跟老公做完预先就有点痒,起初老公说是以前大腿内侧得过皮炎,请问是不是这个造成的,该如何..
0.99 结果表述 其余 雌二醇在排卵期会怎么?1.00 病情诊断 其余 白带变黄异味重,怎么会事
0.76 病情诊断 指标解读 孕酮低是不是更年期到了要绝经了
0.98 疾病表述 其余 喉癌的高发人群与前兆
0.99 疾病表述 注意事项 忧郁症的体现及留神点
0.79 效用作用 其余 医师您好:VE 是什么,VE 真的能够除去黑...
0.53 注意事项 医治计划 如何预防春天感冒
0.92 病情诊断 其余 四个月大的宝宝喜爱反手抓人失常吗?
能够看到有 364 条预测谬误,占比不少有待改良
4.2 TrustAI:稠密数据筛选计划
总结为样本多样性丰盛度不够!
稠密数据:指不足足够训练数据反对导致低置信度的待预测数据,简略来说,因为模型在训练过程中没有学习到足够与待预测样本类似的数据,模型难以正确预测样本所属类别。
本我的项目中稠密数据筛选基于 TrustAI(可信 AI)工具集,利用基 于特色类似度的实例级证据分析方法,抽取开发集中样本的反对训练证据,并计算反对证据平均分(通常为得分前三的反对训练证据均分)。分数较低的样本表明其训练证据不足,在训练集中较为稠密,试验表明模型在这些样本上体现也绝对较差。
稠密数据筛选旨在开发集中开掘不足训练证据反对的稠密数据,通常能够采纳数据加强或大量数据标注的两种低成本形式,晋升模型预测成果。
实例级证据剖析:
https://github.com/PaddlePadd…
实例级证据剖析旨在从训练数据中找出对以后预测起重要作用的若干条实例数据。开发者基于实例级证据可对训练数据中的问题进行剖析,如辨认训练集中的脏数据、辨认数据稠密等。
本工具蕴含多种实例级证据分析方法,如示意点办法、基于梯度的类似度办法、基于特色的类似度办法等。
- 示意点办法
- 基于梯度的类似度办法
- 基于特色的类似度办法
示意点办法【脏数据荡涤】
示意点办法 (Representer Point) 将训练数据对以后预测数据的重要度影响(即表征值),合成为训练数据对模型的影响和训练数据与预测数据的语义相关度。对于一条给定的测试数据和测试后果,表征值为正的训练数据表示反对该预测后果,相同,表征值为负的训练数据表示不反对该预测后果。同时,表征值的大小示意了训练数据对测试数据的影响水平。
在真实情况下,众包标注的语料通常掺杂乐音(标注谬误),易烦扰模型预测。示意点办法偏向于召回梯度较大的训练数据,因而开发者不仅能够应用实例级证据分析方法理解模型行为,也能够通过人工检测标注数据谬误,晋升模型成果。
基于梯度的类似度办法
基于梯度的类似度办法 (Grad-Cosin, Grad-Dot) 通过模型的梯度筛选对以后测试数据产生正影响和负影响的数据。
基于梯度的类似度办法召回了在梯度意义上对测试数据有正影响和负影响的实例数据。召回的正影响数据往往是与测试数据语义上比拟类似且标签统一的数据,负影响数据通常可能是标注谬误的、类别含糊的甚至是存在抵触的数据。
基于特色的类似度办法【稠密数据辨认】
基于特色的类似度办法 (Feature-Cosin, Feature-Dot, Feature-Euc) 通过模型的特色筛选对以后测试数据有正影响和负影响的数据。
基于特色的类似度办法召回了在特色意义上对测试数据有正影响和负影响的实例数据。召回的正影响数据与 GC 办法类似,负影响数据更偏向于召回和测试数据字面不类似的数据。
具体 demo 见参考文档
4.2.1 稠密数据辨认 – 数据加强
这里咱们将介绍稠密数据辨认 – 数据加强流程,
- 首先应用数据加强脚本开掘开发集中的稠密数据
- 而后筛选训练集中对稠密数据的反对数据进行数据加强,
- 最初将失去的数据加强后的反对数据退出到训练集中进行训练。
当初咱们进行稠密数据辨认 – 数据加强,失去新增训练数据:
4.2.2 稠密数据辨认 – 数据标注
这里咱们将介绍稠密数据辨认 – 数据标注流程,
- 首先应用数据加强脚本开掘开发集中的稠密数据,
- 而后筛选对稠密数据反对的未标注数据,
- 最初将失去反对数据进行标注后退出到训练集中进行训练。
当初咱们进行稠密数据辨认 – 数据标注,失去待标注数据:
annotate:抉择稠密数据辨认 – 数据标注模式;默认为 False。
unlabeled_file: 本地数据集中未标注数据文件名;默认为 ”data.txt”。
[2022-09-25 20:52:35,898] [INFO] - Sparse data saved in ./data/KUAKE_QIC/sparse.txt
[2022-09-25 20:52:35,898] [INFO] - Accuracy in sparse data: 41.00%
[2022-09-25 20:52:35,898] [INFO] - Average score in sparse data: 0.7830
[2022-09-25 20:52:35,902] [INFO] - We are using <class 'paddlenlp.transformers.ernie.modeling.ErnieForSequenceClassification'> to load './checkpoint/'.
[2022-09-25 20:52:40,282] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load './checkpoint/'.
Extracting feature from given dataloader, it will take some time...
[2022-09-25 20:52:40,878] [ERROR] - The index is out of range, please reduce support_num or increase support_threshold. Got 1 now.
[2022-09-25 20:52:40,879] [INFO] - support data saved in ./data/KUAKE_QIC/support.txt
[2022-09-25 20:52:40,879] [INFO] - support average scores: 0.7153
简略来讲就是标注一些困哪样本
4.3 脏数据荡涤计划
训练数据标注品质对模型成果有较大影响,但受限于标注人员程度、标注工作难易水平等影响,训练数据中都存在肯定比例的标注较差的数据(脏数据)。当标注数据规模较大时,数据标注查看就成为一个难题。
本我的项目中脏数据荡涤基于 TrustAI(可信 AI)工具集,利用基于示意点办法的实例级证据分析方法,计算训练数据对模型的影响分数,分数高的训练数据表明对模型影响大,这些数据有较大概率为脏数据(标注谬误样本)。
当初咱们进行脏数据辨认,脏数据保留在 ”train_dirty.txt”, 残余训练数据保留在 ”train_dirty_rest.txt”:
4.4 数据加强策略计划
在数据量较少或某些类别样本量较少时,也能够通过数据加强策略的形式,生成更多的训练数据,晋升模型成果。
Data Augmentation API:https://github.com/PaddlePadd…
词级别数据加强策略
- 词替换
- 词插入
- 词删除
- 词替换
采取替换就好:
同义词替换、同音词替换、本地词表替换、随机词替换
上下文替换:上下文替换是随机将句子中单词进行掩码,利用中文预训练模型 ERNIE 1.0,依据句子中的上下文预测被掩码的单词。相比于依据词表进行词替换,上下文替换预测出的单词更匹配句子内容,数据加强所需的工夫也更长。
基于 TF-IDF 的词替换:TF-IDF 算法认为如果一个词在同一个句子中呈现的次数多,词对句子的重要性就会减少;如果它在语料库中呈现频率越高,它的重要性将被升高。咱们将计算每个词的 TF-IDF 分数,低的 TF-IDF 得分将有很高的概率被替换。
train_path:待加强训练数据集文件门路;默认为 ”../data/train.txt”。
aug_path:加强生成的训练数据集文件门路;默认为 ”../data/train_aug.txt”
。
aug_strategy:数据加强策略,可选 ”mix”, “substitute”, “insert”, “delete”, “swap”,”mix” 为多种数据策略混合应用;默认为 ”substitute“。
aug_type:词替换 / 词插入加强类型,可选 ”synonym”, “homonym”, “mlm”,倡议在 GPU 环境下应用 mlm 类型;默认为 ”synonym”。同义词、同音词、mlm: 上下文替换
create_n:生成的句子数量,默认为 2。
aug_percent:生成词替换百分比,默认为 0.1。
device: 选用什么设施进行加强,抉择 cpu、gpu、xpu、npu,仅在应用 mlm 类型有影响;默认为 ”gpu”。
WordSubstitute 参数介绍:aug_type(str or list(str)):词替换加强策略类别。能够抉择 "synonym"、"homonym"、"custom"、"random"、"mlm" 或者
前三种词替换加强策略组合。custom_file_path (str,* 可选 *):本地数据加强词表门路。如果词替换加强策略抉择 "custom",本地数据加强词表门路不能为 None。默认为 None。create_n(int):数据加强句子数量。默认为 1。aug_n(int):数据加强句子中被替换词数量。默认为 None
aug_percent(int):数据加强句子中被替换词数量占全句词比例。如果 aug_n 不为 None,则被替换词数量为 aug_n。默认为 0.02。aug_min (int):数据加强句子中被替换词数量最小值。默认为 1。aug_max (int):数据加强句子中被替换词数量最大值。默认为 10。tf_idf (bool):应用 TF-IDF 分数确定哪些词进行加强。默认为 False。tf_idf_file (str,* 可选 *):用于计算 TF-IDF 分数的文件。如果 tf_idf 为 True,本地数据加强词表门路不能为 None。默认为 None。
4.5 数据加强后进行预训练 + 小样本训练
把 final_data 放回到 data 进行训练
5. 总结
本我的项目次要解说了再支流中文医疗信息处理评测基准 CBLUE 榜单的一个多分类工作,并对 warmup、Rdrop 等技术进行简略介绍,应用预训练,小样本学习并通过 AITrust 可信剖析晋升模型性能,后果如下:
| 模型 | acc |
| ——– | ——– |
| 预训练 ernie3.0 | 0.81330 |
| 小样本 ernie3.0 | 0.81279 |
| 预训练 ernie3.0 + 数据加强(aitrust)| 0.81688 |
| 小样本 ernie3.0+ 数据加强(aitrust)| 0.81764 |
能够看出在样本量还算大的状况下,预训练形式更有劣势(准确率略高一点且训练更快一些),通过 AITrust 可信剖析:稠密数据筛选、脏数据荡涤、数据加强等计划看到模型性能都有晋升;
这里晋升不显著的起因是,这边没有对筛选进去数据集进行标注:因为没有特定背景常识就不花工夫操作了,会导致仍会有噪声存在。置信标注完后能晋升 3 -5% 点
- 对于大多数工作,咱们应用预训练模型微调作为首选的文本分类计划:准确率较高,训练较快
- 提醒学习(Prompt Learning)实用于标注老本高、标注样本较少的文本分类场景。在小样本场景中,相比于预训练模型微调学习,提醒学习能获得更好的成果。对于标注样本短缺、标注老本较低的场景,举荐应用短缺的标注样本进行文本分类预训练模型微调
为了减少性能 — 能够做成继续学习: 参考如下图
[外链图片转存失败, 源站可能有防盗链机制, 倡议将图片保留下来间接上传(img-GxqipqCM-1664249547079)(https://ai-studio-static-onli…)]
我的项目链接:
https://aistudio.baidu.com/aistudio/projectdetail/4592515?contributionType=1
如果有图片缺失参考我的项目链接
具体代码 fork 我的项目即可