互联网新闻情感分析复赛top8(8/2745)解决方案及总结

Introduction

本次比赛的任务是 对给定文本进行情感极性分析 ,情感极性包括 正中负 三类。这次比赛我的成绩是复赛第8名(共2745支参赛队伍,实际有效提交851个提交)。借助分享本次参赛方案总结,希望能和大家共同交流交流。

自从BERT出现后,现在的比赛baseline基本就是BERT之类的模型,其他仅限基于CNN/RNN的模型不堪一击,因此借此次比赛的机会,将我的代码整理出来做成一个支持BERT/XLNet/ALBERT等基于transformer模型的 文本分类工具 ,支持transformer接CNN/LSTM/GRU等, 和本次比赛的代码一起开源Github地址见文尾

赛题链接:https://www.datafountain.cn/competitions/350

Data

这里只对数据的分析进行一些介绍,数据的基本情况就不介绍了。

数据来源:

数据多来自新闻网、微信、博客、贴吧等,因此数据中多包含非正式文本。所以, 该比赛可能更适合使用ERNIE模型来微调,因为ERNIE多使用微博、网页等数据进行预训练得到的,而谷歌的原始中文BERT使用维基百科等正式文本进行预训练得到。

文本长度:

将每行title和content拼接在一起,最长的长度为33772个字,最短的只有4个字。我将文本长度排序后,得到下图。下图中纵坐标为文本长度,横坐标为每行文本index,共有7340行,可以看到大部分文本长度都集中在5000字以下,且接近5000字都很少。

文本长度统计图

样本平衡情况:

从下图中可看出,很明显样本不平衡,样本为"1"的数量最多,为"0"的最少。

样本分布饼状图

Model

我使用的模型有 BERT、BERT-wwm、ERNIE、XLNet、RoBERTa 。具体使用的代码是基于郭达雅的开源Baseline上进行修改。在该Baseline中,主要就是将BERT的输出之一pooled_output接入原本为FC层现在为GRU层,对于XLNet也是这样。后来我在Transformers_for_Text_Classification实验中,发现 BERT后面还是接LSTM或者GRU效果比较好,优于接FC或者CNN层

在模型的具体使用中,我采用 十折交叉验证 对数据进行充分迭代,但很多人一般是将交叉验证的预测结果取平均,实际上,在我的实验过程中, 如果是对这十个预测结果采用等权重投票的融合方法的话,会得到更好的单模型效果

复赛中单模型最好效果如下表格所示:

Ensemble

Averaging

取平均法也能得到一定的提升,但是效果不如投票的方法。

Voting

投票的方法很爽,简单暴力上分很快。同时,也可以采用非等权重投票方法,可对最好的三个模型设置4、3、2这样的权值,或 5、2、2、2 也能取得不错的效果。

不幸的是,这里的融合并没有效果,反而相对于最佳的模型0.81564105有了下降。这在整个比赛过程中是时有发生的,不仅仅5、2、2、2的权值是这样,设置4、3、2的权值也会发生这种导致融合结果下降的情况。那么看下4、3、2权值的效果:

Stacking

尝试失败,效果不稳定。原因主要应该是stacking在融合的第一阶段需要的模型很多很多才行,而我这里最多能提供10个基模型。

Tricks

1.Pseudo-Label(伪标签)

伪标签对模型的提升非常大,其具体做法简单来说就是, 把预测结果中多数模型都一致认为的类别当做其正确的标签,然后将该标签及其对应的内容增加到原始训练集中再进行训练 。这个过程可以反复迭代,单模型效果越好,伪标签的准确性越高,后面再训练效果会更好。在实际使用中,我将所有的伪标签数据都加到原始训练集中,也实验了仅加其的10%,但是很多时候前者效果更好。另外,值得一提的是, 伪标签对于保证切榜时成绩的稳定性具有重要作用

对于roberta_wwm_large_ext模型,加入伪标签后的F1值变化是:0.80959302->0.81564105,在这里我加入了6574个伪标签到原始训练集中。

2. Hyper Parameters

在预训练模型微调中,模型的 初始学习率 可谓是 最重要的超参数 ,比赛时设置一个比较好的初始学习率,就能得到一个不错的结果。那么,在分类任务中,我这里推荐针对不同模型所使用的可能最佳初始学习率:

3.Data Augmentation

TTA

这里TTA指的就是互译。但我并没有实验成功。原因有两个:一是因为代码中用的是Google翻译API,学校Google用不了,后来我又通过某些众所周知的方法准备使用Colab来运行这个代码,但是产生了新问题:API调用次数太多频繁,被Google禁用了。后来我又试图采用国内的一些翻译API,但是问题均是API调用太多频繁,翻译到一半不到就停止翻译了。

另外听说如果采用互译的方法,那么就算是引入了外部数据,是本次比赛规则所不允许的,因此后来在这里就放弃了。实现代码见比赛开源代码中的TTA文件夹。

EDA

EDA的做法是对原始句子进行 同义词替换、随机插入、随机交换、随机删除 四种操作,增加训练集的多样性,防止过拟合,见:EDA for Chinese( https://github.com/zhanlaoban/EDA_NLP_for_Chinese )。这里并没有实验成功,效果会有下降,在交流群里也是这个情况。在BERT中,比如我们想把同义词、emoji表情、HTML标记等去掉,可能都会造成模型微调效果的下降,原因可能是,首先这些同义词、emoji表情、HTML标记等本身就包含一定的语义信息,去掉的话肯定会影响效果,其次,在模型预训练的时候,就包含了很多这样的数据,这些预训练模型中已经学习到了同义词、emoji表情、HTML标记等的语义信息。

因此,结论是, 在使用BERT类的预训练模型微调时,由于这些预训练模型能学习到非常深层次的语义信息,进行数据清洗的过程往往是得不偿失的

Conclusion & Acknowledgment

虽然这次比赛最后的名次并不是很好(举办方承诺的进复赛的奖品也没有给...),不过,通过这次比赛我还是学习到了相当多的内容。

首先,让自己通过这样一个理论与实践的过程,跟进上了NLP的前沿内容(NLP预训练语言模型),在理论上对预训练模型有了更深刻的理解,在实践上对预训练模型的相关代码掌握的更好;其次,学习到了相当有用的比赛tricks,这些tricks不仅在这次比赛有用,下次比赛也会起到作用,相当于积累了经验;最后,还认识了一些有趣的小伙伴( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ。

最后,感谢这次比赛中的队友小郭同学、洪大有及大师兄,没有他们的帮助我不可能取得这样的成绩。

Open Source

  1. Transformers_for_Text_Classification( https://github.com/zhanlaoban/Transformers_for_Text_Classification ):基于Transformers的文本分类

  2. 互联网新闻情感分析复赛top8(8/2745)开源代码( https://github.com/zhanlaoban/CCF_BDCI_2019_datafountain350 )

More Competitions Solutions

这里列出一些本比赛中和其他相似比赛中的优秀解决方案中有效的trick:

Model设计

这部分是我十分喜欢的改网络结构环节。首先,我自己的做法是将BERT的last_hidden_state接入一个BiGRU。然后在本次比赛中,第一名的大佬也有一些更有意思的改进(参考引用6):

1. 提取bert模型内部隐藏层第一状态位输出

通过提取最后2层或最后3层的第一个状态输出向量,与原先的提取bert模型内部隐藏层第一状态位输出。通过提取最后2层或最后3层的第一个状态输出向量,与原先的bert模型pooler_output拼接,最后进行分类。下图是三种不同的拼接方式。

2. 利用bert模型最后一个隐含层所有状态位信息

这些状态信息可以连接更深层的网络模型,如双向LSTM、双向GRU。通过更深层的网络模型提取文本的更高维度特征,然后通过提取隐含层状态、平均池化、最大池化等操作聚合双向GRU输出和隐含层状态特征,最后拼接bert模型的pooler_output进行分类。

3. BERT-CNN-Pooling模型

该模型来自参考引用7,其改进也让我觉得十分有意思,这位大佬采用BERT模型提取出字向量(不Finetune),然后结合腾讯词向量,作为最终的词向量输入到1维卷积网络中。在池化过程中同时选择最大池化和平均池化,最后将其结果相加,接入一个Dense层中得到结果。

评价指标

(来自参考引用7)比赛中很多用的是Macro-F1值作为评价指标,而Macro-F1是关于P和R的调和平均,F1与P或R均为正相关,而精准率P在验证结果中均高于F1,所以在交叉验证中以选择较高的召回率为指标来选择每折中的模型(不同epoch时召回率不同)。

Reference

  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  2. XLNet: Generalized Autoregressive Pretraining for Language Understanding

  3. RoBERTa: A Robustly Optimized BERT Pretraining Approach

  4. Pre-Training with Whole Word Masking for Chinese BERT

  5. How to Fine-Tune BERT for Text Classification( https://arxiv.org/abs/1905.05583 ) (来自邱锡鹏老师组)

  6. CCF BDCI 2019 互联网新闻情感分析 复赛top1解决方案( https://github.com/cxy229/BDCI2019-SENTIMENT-CLASSIFICATION )

  7. 基于BERT和CNN的多模型虚假新闻分类( https://www.biendata.com/models/category/3529/L_notebook )

  8. NLP_competitions( https://github.com/zhanlaoban/NLP_competitions )

本文转载自公众号: NLP太难了,作者小占同学

推荐阅读

AINLP年度阅读收藏清单

清华THUNLP多标签分类论文笔记:基于类别属性的注意力机制解决标签不均衡和标签相似问题

“原子”因果常识图谱

Transformer详解《attention is all your need》论文笔记

征稿启示| 让更多的NLPer看到你的文章

AINLP-DBC GPU 云服务器租用平台建立,价格足够便宜

我们建了一个免费的知识星球:AINLP芝麻街,欢迎来玩,期待一个高质量的NLP问答社区

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章