前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >互联网新闻情感分析比赛,复赛第8名(8/2745)解决方案及总结

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

作者头像
double
发布2020-02-21 18:25:40
1.8K0
发布2020-02-21 18:25:40
举报
文章被收录于专栏:算法channel算法channel

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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Introduction
  • Data
  • Model
  • Ensemble
    • Averaging
      • Voting
        • Stacking
        • Tricks
          • 1.Pseudo-Label(伪标签)
            • 2. Hyper Parameters
              • 3.Data Augmentation
                • TTA
                • EDA
            • Conclusion & Acknowledgment
            • Open Source
            • More Competitions Solutions
              • Model设计
                • 1. 提取bert模型内部隐藏层第一状态位输出
                • 2. 利用bert模型最后一个隐含层所有状态位信息
                • 3. BERT-CNN-Pooling模型
              • 评价指标
              • Reference
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档