第五届“达观杯”自然语言处理算法竞赛——基于大规模预训练模型的风险事件标签识别已于0月中旬在第十届CCF自然语言处理与中文计算国际会议现场落下帷幕。
本届大赛达观数据提供了72G、上亿条通用领域经过脱敏的资讯信息用来支持预训练模型。训练集有条样本,数据来自于金融、政务、*事等多个领域,不均匀分布在35个类别里面,采用macroF作为评价方案。
从获奖选手的方案中,发现选手使用最多的模型是bert,其次是nezha,方案基本是多模型融合。预训练模型很大程度上缓解了样本标注数量过少的问题。优化策略也比较集中,FGM解决鲁棒性问题、通过数据增强解决样本不均衡问题。也有部分同学通过SimCSE增强向量的表达能力,对于本次的短文本分类问题效果提升不错。综上所述,选手从几个方面针对数据集的样本不均衡问题以及标注数据不足的问题,为工程实践的文本分类问题提供了很好的思路。
就读于桂林电子科技大学研二的左玉晖同学与同队的队员在本届历时2个月的赛事中脱颖而出,最终在激烈的比赛中获得三等奖的好成绩。
以下是复盘解题思路:
目录
·赛题任务
·预训练模型
·模型结构
·提分技巧
o面对不均衡dicelossfocallosscrossentropyloss
o对比学习
o对抗训练
oMulti-Exit
oflooding洪泛法
oMulti-sampleDropout
o伪标签
·模型融合
ostacking
o投票+rank/概率平均
赛题任务
此次比赛名为:基于大规模预训练模型的风险事件标签识别,在技术层面上可以提取为两个任务,一个是预训练一个是文本分类。
针对预训练赛题方给了一个70g的无标注预训练文本,训练集有条,测试集条(包含AB榜数据)
赛题全部为脱敏数据(所有文字都转换成了数字表达)脱敏前的数据样例为:
在标签列可以看到样本有一级和二级标签之分,共有0个一级,35个二级标签。评价指标为macroF。
我们尝试过一级标签和二级标签的联合预测,效果不好。
标签类别很多而且不平衡,多的类别上千条,少的类别只有十几个:
接下来我将分别从预训练模型、模型结构、提分技巧、模型融合复盘整个比赛过程。
预训练模型
运行过程处理数据process_data--构建词表build_vocab--runpretrain
我们在无标注数据中根据cosine距离选择了四万条和训练集中样本相似的数据进行预训练。
分别预训练了bert-base模型nezha-base模型,nezha与bert的区别主要是
nezha相比于google开源中文bert使用了更大的预训练语料,还使用了相对位置编码是一种有效的位置编码方案,全字掩蔽策略,混合精度训练和LAMB优化器。
nezha首次将函数型的相对位置编码加入了模型中。好处:主要是因为它可以使模型外推到比训练中遇到的序列长的序列长度。Bert针对每个位置合并了绝对位置编码,该绝对位置编码是嵌入向量,并且直接添加到tokenembedding。
我们对每种模型保存不同训练步数的checkpoint,可以用于后面的模型融合。
其实预训练策略可以做很多花样的文章,但由于机器有限,我们将主要的精力放在了微调方面。预训练策略只是遵循mlm和nsp。
我们主要使用过的预训练模型有:
·Bert-base-wwm-ext:哈工大开源版本
·Nezha-wwm-base:哪吒官方开源版本
·Bert20k:预训练2万step
·Bert50k:预训练5万step
·Bert80k:预训练8万step
·Nezha80k:预训练8万step
·Nezha0k:预训练万step
·Nezha50k:预训练5万step
最一开始是使用了word2vec在语料库上进行训练,线上第一次提交是48点多分排了七十多名。
然后开始使用bert等开源的权重,那么问题来了脱敏数据里词都是那样的,bert词表用不了怎么办?
·统计脱敏数据的词频,将对应词频与开源词表上的词频进行对换(最开始使用的是这种)线上可达50分左右
·将word2vec训练好的embedding替换到bert上
虽然无法还原句子,但频率估计可以还原一部分词,两个频率高的文本,在同一种语境下出现的概率更大,从语义相关性角度来说,可能会有一些语义相关性,改用明文后就可以随便用预训练语言模型了。
模型结构
我们最终的模型结构大致是:
Bert--BiLSTM层--BiGRU层--bert_pooler+胶囊网络--Multi-SampleDropout预测输出
同时加BiLSTM和BiGRU大概有接近一个点的提高。胶囊网络有的预训练模型有一点点提高,但有的有负效果。
还尝试过用max_pooling+avg_pooling+胶囊网络+bert_pooling等组合,效果均不如直接使用bert_pooler和胶囊网络。
提分技巧
面对不均衡dicelossfocallosscrossentropyloss
样本不均衡会带来什么问题呢?
模型训练的本质是最小化损失函数,当某个类别的样本数量非常庞大,损失函数的值大部分被样本数量较大的类别所影响,导致的结果就是模型分类会倾向于样本量较大的类别。
通过类别加权Loss解决,下图截自香侬科技的论文《DiceLossforData-imbalancedNLPTasks》,分别列举了加权loss,Focalloss(FL)和他们提出的diceloss。我们的实验效果是:FLWeigthCEdiceloss。所以主要采用了weightce和diceloss。
WeightCE通过基于类别的加权的方式可以从不同类别的样本数量角度来控制Loss值,从而一定程度上解决了样本不均衡的问题。
基于类别加权Loss虽然在一定程度上解决了样本不均衡的问题,但是实际的情况是不仅样本不均衡会影响Loss,而且样本的难易区分程度也会影响Loss。
何恺明在论文《FocalLossforDenseObjectDetection》中提出了的FocalLoss,上图第三个公式。对于模型预测为正例的样本也就是p0.5的样本来说,如果样本越容易区分那么(-p)的部分就会越小,相当于乘了一个系数很小的值使得Loss被缩小,也就是说对于那些比较容易区分的样本Loss会被抑制,同理对于那些比较难区分的样本Loss会被放大,这就是FocalLoss的核心:通过一个合适的函数来度量简单样本和困难样本对总的损失函数的贡献。
diceloss香侬科技的这篇论文可以参考:DiceLossforData-imbalancedNLPTasks
交叉熵“平等”地看待每一个样本,无论正负,都尽力把它们推向(正例)或0(负例)。但实际上,对分类而言,将一个样本分类为负只需要它的概率<0.5即可,完全没有必要将它推向0。DiceLoss的自适应损失——DSC,在训练时推动模型更加