模型選擇:驗證集(1480條)損失先下降后上升,訓練集損失一直下降,驗證集最低損失所在模型沒有驗證集損失最低所在模型好,即取訓練集損失最低處所在模型,只是對應的提升、下降只有0.5%左右,故任需測試
bert_config.josn 模型中参数的配置
{
“attention_probs_dropout_prob”: 0.1, #乘法attention时,softmax后dropout概率
“hidden_act”: “gelu”, #激活函数
“hidden_dropout_prob”: 0.1, #隐藏层dropout概率
“hidden_size”: 768, #隐藏单元数
“initializer_range”: 0.02, #初始化范围
“intermediate_size”: 3072, #升维维度
“max_position_embeddings”: 512,#一个大于seq_length的参数,用于生成position_embedding
“num_attention_heads”: 12, #每个隐藏层中的attention head数
“num_hidden_layers”: 12, #隐藏层数
“type_vocab_size”: 2, #segment_ids类别 [0,1]
“vocab_size”: 30522 #词典中词数
}
1、数据不平衡是一个非常常见的问题,尤其见于序列标注任务中。比如,对词性标注任务来说,我们一般使用BIEOS,如果我们把O视为负例,其他视为正例,那么负例数和正例数之比是相当大的。
查看曲线图:tensorboard --logdir="E:\20220711171059\eval"
2、在程序运行过程中
3、基础概念
正例:BIE 负利:O
TP(True Positive, TP):真实为正例且被预测为正例的样本数为真正例;正样本 ==> 正类
TN(True Negative, TN):真实为负例且被预测为负例的样本数为真负例;负样本 ==> 负类
FP(False Positive, FP):真实为负例但被误预测为正例的样本数为假正例;负样本 ==> 正类
FN(False Negative, FN):真实为正例但被误预测为负例的样本数为假负例;正样本 ==> 负类
1)准确率(Accuracy)和错误率(Error Rate)
准确率Accuracy = (TP+TN)/(TP+TN+FP+FN) = 预测正确的样本数 / 总样本数
错误率Error Rate = 1-Accuracy
2)正确率(Precision)、召回率(Recall)、选择率(Selectivity)
Precision查准率 = TP/(TP+FP)
Recall查全率 = TPR = TP/(TP+FN) = 预测正确的正例数 / 实际正例数
Selectivity = TNR = TN/(TN+FP)
3)F1值
F1 = (2Precision x Recall)/(Precision + Recall)
4)困惑度越大,效果越差
5)Micro-F1 vs Macro-F1
Micro-F1(微观F1)和Macro-F1(宏观F1)都是F1值合并后的结果,主要用于多分类任务的评价。是分类任务的一个衡量指标,用于权衡Precision和Recall。换句话说,F1-Score是精确率
和召回率的调和平均数
micro F1:通过 计算所有分类的准确率P、召回率R,将它们代入F1方程中,再得出总的F1。更适用于数据分布不平衡的情况。但是在这种情况下,数量较多的类别对Micro-F1的影响会较大。
macro F1:通过计算所有分类的F1,再通过简单平均,得到总的F1。平等的看待每一类,高precision和高recall类的对结果影响较大
weighted-f1:考虑了不同类别的重要性,也就是把每个类别的样本数量作为权重,计算加权f1
详细:https://blog.csdn.net/qq_27668313/article/details/125570210
6)F1选择总结:
数据量越多,对weight-F1, micro-F1影响越大。此情况下,一般就用macroF1来评估多分类模型了。
macro-F1、micro-F1、weightF1都是在多分类下用来评估模型好坏的指标。具体选用哪个应该取决于你的任务数据情况:
1. 通常情况下,若数据集各类别数据量是不平衡的且所有类别都是同样重要,那用macroF1就好了,因为它是按类别计算,再取平均的F1作为最后值。大多数应该就是这种情况了,
micro在极度不平衡数据下会≈数据量大的那一类f1。
2.若是在一个非平衡的数据集上,你个人希望侧重于一些类,那当然是weighted F1 了。
3.若是平衡的数据集,且是忽略类别的情况那就用microF1好了
【数据优化-调参】
1、crf-lr单独设置学习率,3e-5的100倍以上时,可解决无开始和结束标签
1)损失(F1)阶梯氏下降或上下波动太大,(原因:学习率太高,crf学习率超过其它学习率1倍以上),但是学习率在3e-5以下时“元”提成了金额、标签约束不好==>过拟合?
2)宏观F1和微观F1差不多时,不用单独设置crf学习率???
3)打乱训练顺序不容易过拟合、波动小一些
4)批次降低,学习率也要降低
5)任意损失呈 下降-上升-下降,效果不好
2、crf-lr 增加,各损失上下波动更厉害(从3e-5的100倍提升到133倍,其他不变;结论来自宏观F1和微观F1差不多的模型训练)
3、损失走势
train loss 不断下降,test loss也不断下降:网络仍在学习,让他继续学;
train loss 不断下降,test loss趋于不变或上升:说明网络过拟合;
train loss 趋于不变,test loss不断下降:不用想数据集250%有问题;
train loss 趋于不变,test loss趋于不变:说明学习遇到瓶颈,需要减小学习率或批量数目;或者是数据集有问题(数据集标注错误数据比较多)
train loss 不断上升,test loss不断上升:说明网络结构设计不当、训练超参数设置不当、数据集经过清洗、学习率太高、batch size太小等问题。
4、学习率用于控制梯度下降中参数更新的幅度(速度)。学习率过小,能保证收敛性,但会大大降低模型的优化速度,需要更多轮的迭代才能达到比较理想的优化效果。如果幅度过大,可能导致参数的“摆动”特性。
5、说明Bert模型更多的是记住实体,而非关注到上下文信息。
6、其它调参:下兩者需在常規參數訓練后視情況再選擇調整
1)训练损失一直下降,验证损失先下降后上升。找到验证集损失最小值b,设置训练集loss=abs(loss-b)+b;https://cloud.tencent.com/developer/beta/article/1685956
2)训练损失先下降后上升。设置warmup_step=1000(整数)左右;https://www.jianshu.com/p/c8583867677e
7、模型不收斂,loss一會很高一會又很低:https://blog.csdn.net/kyle1314608/article/details/107099807?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170597669616800215091806%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170597669616800215091806&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-24-107099807-null-null.nonecase&utm_term=nlp&spm=1018.2226.3001.4450
【优化思路】
1、说明模型更多的是记住实体,而非关注到上下文信息。
2、鲁棒性:RoChBERT预训练模型
2.1 相同的上下文 + 不同的实体;
2.2 对抗训练方式:使用对抗训练,其效率较低。因其需要迭代来产生对抗样本,能否不产生对抗样本,同时也能够达到对抗训练的能力?
2.3 Flooding方法:借助CV领域的flooding方法。在正常情况下,随着训练的迭代,其损失会越来越小,而flooding方法,会让loss先像往常一样梯度下降到“flooding level”(一个超参,是训练损失的底线,下图中的b)附近, 但当训练损失低于这个值时,就进行梯度上升。这个方法实现简单,且在NLP领域也已经被证明有效。初始的b值一般设为 验证集loss开始上扬的值的一半。https://zhuanlan.zhihu.com/p/438196460
2.4 Multi-sample Dropout:dropout目前是NLP任务中很流行的数据扩充手段。Multi-Sample Dropout是对Dropout方法的一种改进,是2019年的一篇工作。Multi-Sample Dropout相比于dropout加快了模型训练过程的收敛速度和提高了泛化能力。dropout_rate设置0.2不能设置太大,否则0.4的比例在bert上会出现F1为零的情况。https://gitee.com/jtay/text_similarity/tree/submit/code
2.5 伪标签:
2.6 投票+rank/概率平均:几个模型预测结果投票
2.7 损失选择:面对不均衡 dice loss & focal loss & cross entropy loss。最后说一下实践下来的经验,由于不同数据集的数据分布特点各有不同,dice loss 以及 GHM loss 会出现些抖动、不稳定的情况。当不想挨个实践的时候,首推 focal loss,dice loss。