参赛经历

CCF BDCI 2019 是我参加的第一次数据挖掘竞赛。从一开始就和 Mogic 同学一起做,全程的服务器资源都是蹭的他们学校的🤣。最终取得了 Top 1% 的成绩,也还行,虽然没有达到自己的目标😢。因为过了蛮久才想起来写这样的一篇博客,所以里面我们更换方法带来的收益并没有准确的数值记载…

赛题介绍

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

其实很简单,就是让我们对一段话去输出其情感倾向,是一个很典型的情绪判定问题。
数据格式为:

$$
<id,title,content,label>
$$

探索与尝试

数据探索

本赛题的数据其实是挺脏的,里面有各种的前端代码,也存在不少的冲突数据。我们尝试清洗数据,把其中的代码全部去掉或者是把所有的非汉字字符全部去掉,效果都不如未清洗来得好。并非发现,文本往往很长。而BERT最长仅能处理512个字符。

单模型

我们的所有模型都是基于预训练模型,也尝试过 bilstm、textcnn等方法,但 f1 只有70不到,而未调参的 bert-base 就能达到 79。于是我们果断放弃了不使用预训练模型的方法。阅读过本赛道 Top 5 的报告,大家也都是这样选择的。

使用 BERT 的分类

我们首先尝试了直接使用BERT的分类功能。把title和content拼接到一起,送入bert中。直接使用分类,我们可以得到 79 的f1分数。使用K-fold方法可以产生一定的收益。同时,我们发现:content取 head + tail 最好。我们猜想:一篇长文章,首尾部分往往是观点最集中表达的部分,这两个部分往往含有更大的情绪信息量。

使用 BERT + GRU

在后期,guoday开源了一份baseline。我们发现,这份baseline里使用的并非分类的方法,而是匹配。阅读chineseGLUE的代码,我们发现其中SA任务也使用匹配来做。虽然不知道为什么匹配的分数会更高,我们还是放弃掉了分类的思路。

guoday的baseline里,通过多个BiGRU把文段拼接起来,使得模型可以处理更长的信息。后期,我们发现guoday的这份baseline实际上是清博在幽默度分析赛题后开源的方案。

在这个阶段,我们尝试了若干预训练模型:roberta-wwm、roberta-large、bert-base、bert-wwm、xlnet…..
最后发现,最优的模型还是roberta-wwm。

我们把dropout调得更大,可以理解为某种意义上的数据增强。本来打算使用Google的uda,可惜主办方不允许使用第三方数据。所以回译的方法用不了,Google uda也用不了。

模型融合

在模型融合阶段,我们尝试了投票法、Stacking法和Blending+Stacking法。
一开始我们就使用了加权投票法,把若干预训练模型的结果进行加权投票,线上分数高的模型就给予更高的权重。在比赛过程中,美团开源了他们在 WSDM 2019 的方案。我们发现其中的模型融合方法可能会带来更大的收益。

美团在WSDM 2019里,仅仅使用了基本的bert-base和分类模型,加上此融合方法就取得了第二名的好成绩。我们本来期望,这个方法同样可以在我们的数据集上奏效,可是我们把25个模型的结果放进去融合,效果却是出奇的差,甚至差于单模型的分数。

和美团不同,我们使用了多个不同的预训练模型进行融合。在美团的方案里,他们只选择了bert-base模型。也有可能是赛题的数据集问题,不适合Stacking方法。

我们也试过普通的一层、两层Stacking。Stacking往往可以在线下表现非常好,但是在线上却始终不尽人意。

最终我们提交的方案还是按照投票法做的。在初赛时,我们直接对提交文件进行融合(因为没有保存每一份提交文件对应的概率文件)。在复赛时,我们在概率文件上进行融合。我们进行投票的原则是好而不同。让高分的结果有更高的权重,并且让参与投票的结果的相关系数尽可能小。

不过人为指定权重实在是太玄学,我们在初赛时就差点因为参数没有选择好,进入不了复赛。

总结

CCF BDCI 2019是我第一次参加数据挖掘竞赛。有很多思路、方法都很值得去学习。在期间也的确学到了不少东西,比如以前对bert模型毫无了解、对stacking方法仅仅是跑过几个demo……

这次比赛的结果并不是特别好。现在回顾起来,发现我们并没有在模型或者数据上有太大的改进。例如本赛题 Top 5 的队伍里有的使用对抗训练的方法增加模型的鲁棒性、也有的使用启发式的方法自动搜寻合适的投票权重、还有的从分类的模型上进行改进……

说实话,比赛过程中做得是有一点痛苦的… 因为发现自己很难在模型上去进行改进,在模型融合上stacking方法不奏效也只能手动去指定参数。参数调得好,排名就靠前。

回顾起来,还是发现自己关于自然语言处理和机器学习的知识积累有限。比如上文提到的对抗训练,我对此并没有任何了解。