CCF BDCI 2019 互联网新闻情感分析大赛TOP 1% 收获

第一次参加算法类竞赛总结

参赛起因

2019年暑假,很有幸在DeeCamp认识了ringotc同学,并与他一起参加了CCF-BDCI-2019-互联网情感分析大赛,作为一个第一次参加算法类竞赛的小白,只能全程紧紧抱住ringotc的大腿。

赛前插曲

由于NLP比赛目前一直被强大的Bert所垄断,因此一个高性能的GPU服务器必不可少。ringotc的V100服务器坚持了半个月最终还是到期了,我向导师借到了一台两张1080Ti,22GB显存的服务器。但是服务器的nvidia和cuda版本太低,PyTorch不支持该环境。本以为简单的更新居然把服务器搞崩了= =。

在一次次的搜索资料,在tty界面下进行调试,最终赶在导师发现电脑被玩坏之前解决了问题,将nvidia驱动升级成435.21,cuda版本更新为10.1.

赛题简介

背景

随着各种社交平台的兴起,网络上用户的生成内容越来越多,产生大量的文本信息,如新闻、微博、博客等,面对如此庞大且富有情绪表达的文本信息,完全可以考虑通过探索他们潜在的价值为人们服务。因此近年来情绪分析受到计算机语言学领域研究者们的密切关注,成为一项进本的热点研究任务。
本赛题目标为在庞大的数据集中精准的区分文本的情感极性,情感分为正中负三类。面对浩如烟海的新闻信息,精确识别蕴藏在其中的情感倾向,对舆情有效监控、预警及疏导,对舆情生态系统的良性发展有着重要的意义。

任务

参赛者需要对我们提供的新闻数据进行情感极性分类,其中正面情绪对应0,中性情绪对应1以及负面情绪对应2。根据我们提供的训练数据,通过您的算法或模型判断出测试集中新闻的情感极性。

比赛链接

CCF BDCI 2019 互联网新闻情感分析大赛

比赛初期

在还没有Baseline之前,我们尝试了LSTM, Text CNN等做法,效果并不理想。

认识到“只有Bert才能救中国”,我们又尝试通过对Bert进行finetune,把title和content拼接到一起,送入Bert中,分数已经可以达到79,这使得我们在比赛初期取得了不错的名次。

比赛中期

随着各种Baseline的放出,我们的排名已经掉出了TOP 100.因此之后的工作我们都是在guoday开源的一份baseline上进行改进。

数据清洗

我们发现,本次比赛的训练集Label比例约为1:3:5,样本较为不均衡。与此同时,每个文本的长度相差也很大,文本字数普遍集中于0-500,但仍有部分文本长度达到了7000(如下图)

除此以外,赛题中的文本内容也很脏。有重复标注却label各不相同的,有携带大量html代码的……我们试了许多种常用的数据清洗的手段,并将非中文字符的内容都删去,但效果反而变得更差。因此之后我们主要采取未清洗过的原始数据进行训练。

单模型探索

整理网络结构上,我们采取guoday的Bert+GRU的思路,将文本截成k段,分别输入语言模型,然后顶层用GRU拼接起来。我们尝试了bert-base,bert-wwm,xlnet,albert,roberta-wwm,roberta-large等预训练模型。经过比较,roberta-wwm和roberta-large在单模型上效果最佳。我们凭借如下的参数在比赛中期取得了TOP 20的成绩.

部分Tricks的尝试

Focal Loss

Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。考虑到样本的不均衡问题,我们团队认为引入Focal Loss替代原先的交叉熵损失函数可能会有很好的效果。
于是我们修改训练码将损失函数改为Focal Loss,但单模的分数并没有取得很好的提升。

伪标签

我们在训练过程中还采用了伪标签的策略防止训练样本过少,我们尝试了将不同比例的伪标签加入训练集,但线上效果并不很理想。比赛结束后,我阅读了一份TOP 8的比赛总结,他们将所有的伪标签都加入到原始训练集中,取得了不错的提升。因此这种做法应该是可行的。

比赛后期

新大佬加入

我们在比赛的中后期有幸拉到了华为云工作的xiong大佬以及在DeeCamp结识的林夕巨巨。他们给我们提供了许多宝贵的建议,教会了我们许多神仙tricks。

模型融合

投票法

比赛中期,我们保存了许多模型和提交结果,因此很容易就想到用加权投票的方式进行上分。事实证明这次比赛投票上分真的有奇效。先是用2:1:1:1的权重让我们躺进了TOP 50进入决赛圈,接着我的队友ringotc提出了观察提交文件的kendall相关系数,并取相关系数最低的几个作为加权投票的文件。最终我们通过如下四个文件取得了第十名左右的成绩(当时的具体排名有些忘记了)。

Blending+Stacking

由于当时家中出了一些事情,这部分内容基本都是ringotc大佬在做。我们借鉴了美团刚刚开源的WSDM 2019的方案,他们采用Stacking of stacking的策略,仅使用bert-base和一些传统模型就取得了第二的成绩。

我们尝试了一层Stacking以及美团开源的两层Stacking的做法,却始终没能超过之前的投票法的效果,可能这种方法在本次比赛中过拟合较为严重,我们没能很好地解决这一问题。

总结

本次比赛是我第一次参加数据挖掘类的算法比赛。还是要感谢ringotc大佬的全程带飞以及xiong大神和林夕巨巨提供的神仙trick。比赛中我收获了很多教科书上无法教会我的知识,让我对NLP,至少是文本分类领域前沿研究有了更深的认识。

比赛最后,我们的成绩还是不是很理想,决赛B榜仅排名29/2745.赛后,我也仔细阅读许多TOP10的大佬们的比赛总结,发现大家的Trick其实都差不多,可能都是靠的“神仙调参”完成的上分。这也反应了我们的比赛经验还不是很足,在调参和一些trick的正确使用上还有许多需要去学习的地方。

文章目录
  1. 1. 参赛起因
  2. 2. 赛前插曲
  3. 3. 赛题简介
    1. 3.1. 背景
    2. 3.2. 任务
    3. 3.3. 比赛链接
  4. 4. 比赛初期
  5. 5. 比赛中期
    1. 5.1. 数据清洗
    2. 5.2. 单模型探索
    3. 5.3. 部分Tricks的尝试
      1. 5.3.1. Focal Loss
      2. 5.3.2. 伪标签
  6. 6. 比赛后期
    1. 6.1. 新大佬加入
    2. 6.2. 模型融合
      1. 6.2.1. 投票法
    3. 6.3. Blending+Stacking
  7. 7. 总结