中文预训练模型泛化能力挑战赛(下):上分技巧

中文预训练模型泛化能力挑战赛(下):上分技巧

一、比赛改进思路

  1. 修改 calculate_loss.py 改变loss的计算方式,从平衡子任务难度以及各子任务类别样本不均匀入手;
  2. 修改 net.py 改变模型的结构,加入attention层,或者其他层;
  3. 使用 cleanlab 等工具对训练文本进行清洗;
  4. 做文本数据增强,或者在预训练时候用其他数据集pretrain;
  5. 对训练好的模型再在完整数据集(包括验证集和训练集)上用小的学习率训练一个epoch;
  6. 调整bathSize和a_step,变更梯度累计的程度,当前是batchSize=16,a_step=16;
  7. 用 chinese-roberta-wwm-ext 作为预训练模型;

二、BERT模型的改进

  有关BERT的论文介绍看:https://blog.csdn.net/weixin_42691585/article/details/108956159

  对BERT模型提出了四个改进,以期在更小的参数量和更快的预训练速度的前提下得到较好的结果。

  1、相对位置嵌入。词与词的相对位置信息对于理解自然语言的重要程度远远大于词的绝对位置信息,并且模型为了学习绝对位置信息需要大量额外的参数和时间。BERT模型既考虑了绝对位置,也考虑了相对位置。也就是说BERT模型理论上要捕捉每一个词在每一个位置时对所有词在所有位置的影响,这一共是22种分布模式(为词总数,为序列长度)。而如果仅考虑相对位置的话,模型只需要学习22种分布模式,这一定程度上可以减少模型的参数和训练时间,并且可以提高模型的泛化性。所以,通过相对位置嵌入方法,使模型忽略掉绝对位置信息而保留更重要的相对位置信息。

  2、独立双向多头自注意力机制。多头自注意力层是BERT模型中的核心结构,它对准确提取语句含义起到了决定性作用。词与词之间的相互影响是应该考虑词序的,即词A分别出现在词B前后时,对词B的意义应该是不同的。然而在BERT模型中,并没有在词层面实现这个影响,而是用绝对位置嵌入的方法间接实现。这个设计需要模型去学习冗余的绝对位置和词之间的关系,从而造成参数量大而训练时间长的后果。为了直接捕捉这种关键信息,通过独立双向多头自注意力机制,即分别使用两个“多头”独立处理前文词和后文词,使得词A分别出现在词B前后时被表示为不同的实数向量。

  3、层级密集连接网络。密集连接指在不同网络层之间建立密集的额外数据通路。这可以使梯度更好的向深层传导,同时提高每层网络所提取特征的利用率,并且使总体损失函数更加“光滑”,从而在优化网络时可以更快更好地收敛。在BERT模型中,只在每个注意层内部有残差网络连接,但层与层之间并无额外数据通路。BERT模型的网络深度较大,梯度传导困难,从而导致训练时间较长。另外,每个注意力层所提取的特征只能为下一层所用,效率较低。所以,通过在注意力层之间建立层级密集连接网络,以期减少模型的训练时间,并提高每个注意层所提取特征的利用率,从而提高模型性能。

  4、新的预训练任务——乱序判断。BERT模型在词序的捕捉上可解释性不足,位置嵌入机制说服力不强。通过预训练来使模型对于语序更加敏感,所以提出乱序判断预训练任务,即随机打乱语句中的部分词序或保持不变,再使用模型判断该语句词序是否合理。

三、其他改进思路

  1、结合BERT与GRU模型的优势,改进得到一种新的多标准中文分词模型。在传统多标准分词模型中只使用了Bi-LSTM模型,但是随着数据集的增大训练时间也会增加,因此通过使用更简单的Bi-GRU模型来加快模型的训练速度。同时为了从文本中提取出更丰富的语义特征,使用BERT预训练模型作为语义特征提取层加入到模型中,以此提升模型分词效果。根据上面两项改进得到一种新的多标准中文分词模型,并设置相关实验,从训练时间以及分词效果两个方面的提升证明改进的有效性。

  2、在短文分类模型中加入计算机视觉领域的混合域注意力模块,改进得到一种新的短文本分类模型。传统短文本分类中的卷积神经网络在提取特征时对所有特征一视同仁,为了增强模型对关键特征的提取能力,仿照计算机视觉中的做法,将混合域注意力模块加入短文本分类模型中。通过设置与原模型的对照实验,证明了加入混合域注意力模块对文本关键特征的提取确实很有帮助。

  3、在层次Attention模型中应用多通道机制,改进得到一种适合中文长文本数据的多通道层次Attention分类模型。使用层次Attention模型进行中文文本分类任务时,长文本增加了分词错误的概率继而产生信息的丢失,于是加入对字粒度文本表示的特征提取通道来补充词粒度文本表示带来的损失。同样设置与原模型的对照实验,通过分类效果的提升证明了加入字粒度文本表示后提取的特征更加全面。

  4、通过将上面中文分词技术以及文本分类技术的改进进行结合,设计并实现了一个简易的中文长短文本混合分类系统,并利用该系统测试上述两种关键技术的改进在结合后,整体上对中文文本分类效果的影响。

四、经验

  理论和实践之间的Gap往往差异巨大,学术paper更关注的是模型架构设计的新颖性等,更重要的是新的思路;而实践最重要的是在落地场景的效果,关注的点和方法都不一样。这部分简单梳理实际做项目过程中的一点经验教训。

  1、模型显然并不是最重要的:不能否认,好的模型设计对拿到好结果的至关重要,也更是学术关注热点。但实际使用中,模型的工作量占的时间其实相对比较少。虽然再第二部分介绍了5种CNN/RNN及其变体的模型,实际中文本分类任务单纯用CNN已经足以取得很不错的结果了,我们的实验测试RCNN对准确率提升大约1%,并不是十分的显著。最佳实践是先用TextCNN模型把整体任务效果调试到最好,再尝试改进模型。

  2、理解你的数据:虽然应用深度学习有一个很大的优势是不再需要繁琐低效的人工特征工程,然而如果你只是把他当做一个黑盒,难免会经常怀疑人生。一定要理解你的数据,记住无论传统方法还是深度学习方法,数据 sense 始终非常重要。要重视 badcase 分析,明白你的数据是否适合,为什么对为什么错。

  3、关注迭代质量 - 记录和分析你的每次实验:迭代速度是决定算法项目成败的关键,学过概率的同学都很容易认同。而算法项目重要的不只是迭代速度,一定要关注迭代质量。如果你没有搭建一个快速实验分析的套路,迭代速度再快也只会替你公司心疼宝贵的计算资源。建议记录每次实验,实验分析至少回答这三个问题:为什么要实验?结论是什么?下一步怎么实验?

  4、超参调节:超参调节是各位调参工程师的日常了,推荐一篇文本分类实践的论文 A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification,里面贴了一些超参的对比实验。

  5、一定要用 dropout:有两种情况可以不用:数据量特别小,或者你用了更好的正则方法,比如bn。实际中我们尝试了不同参数的dropout,最好的还是0.5,所以如果你的计算资源很有限,默认0.5是一个很好的选择。

  6、fine-tuning 是必选的:上文聊到了,如果只是使用word2vec训练的词向量作为特征表示,我赌你一定会损失很大的效果。

  7、未必一定要 softmax loss: 这取决与你的数据,如果你的任务是多个类别间非互斥,可以试试着训练多个二分类器,也就是把问题定义为multi lable 而非 multi class,我们调整后准确率还是增加了>1%。

  8、类目不均衡问题:基本是一个在很多场景都验证过的结论:如果你的loss被一部分类别dominate,对总体而言大多是负向的。建议可以尝试类似 booststrap 方法调整 loss 中样本权重方式解决。

  9、避免训练震荡:默认一定要增加随机采样因素尽可能使得数据分布iid,默认shuffle机制能使得训练结果更稳定。如果训练模型仍然很震荡,可以考虑调整学习率或 mini_batch_size。

  10、没有收敛前不要过早的下结论:玩到最后的才是玩的最好的,特别是一些新的角度的测试,不要轻易否定,至少要等到收敛吧。

PS:电脑太低配了,无法跑出来ε=(´ο`)))唉*

参考资料

[1] 王楠禔. 基于BERT改进的文本表示模型研究[D].西南大学,2019.
[2] 王晓明. 基于深度学习的中文文本分类的关键技术研究[D].电子科技大学,2020.
[3] https://zhuanlan.zhihu.com/p/25928551

猜你喜欢

转载自blog.csdn.net/weixin_42691585/article/details/114107729