在网络上讨论你关心的事情可能很困难,我们经常会遇到充满攻击性的评论甚至骚扰,许多人因此不再表达自己,也听不到更多不同的意见。各大平台努力地促进交流对话,导致很多社区对评论进行了限制,甚至关闭了评论。
AI对话团队(Conversation AI)是谷歌和Jigsaw的合作项目,他们致力于开发一些工具来改善在线交流。其中一个研究方向是网络上的消极行为,例如恶意的有毒评论(即粗鲁、不尊重人或可能让人不爽的言论)。目前为止,他们已经通过Perspective API构建了一系列公开可用的模型,例如toxicity。但是目前的模型仍存在错误,而且他们不支持用户选择他们想要查找的“有毒”评论的类型(例如某些平台可能允许亵渎言论的存在,但不能容忍其他类型的消极评论)。
于是,Jigsaw和谷歌在Kaggle上举办了一场挑战赛,要求选手建立一个多头(multi-headed)模型,能够检测出多种恶意评论,例如威胁、猥亵、攻击性话语以及实名人身攻击等话语,且性能要优于目前的模型,数据来源于维基百科讨论区。
比赛公布后,共有4551个团队参加了此次挑战赛,最终获胜者是来自卡内基梅隆大学的Chun Ming Lee团队,他们将解决方案在Kaggle上公布了出来,以下是论智对其进行的大致编译。
首先要感谢Jigsaw和Kaggle提供这次数据科学挑战赛,并且恭喜每位完成的参与者们,这是一场马拉松,绝不是短跑比赛!
我们提出的方案总结起来共有四个要点:
多样的预训练嵌入(基础public LB为0.9877)
将翻译当做训练/测试时间增强(train/test-time augmentation,TTA)(将LB从0.9877提升至0.9880)
Rough-bore伪标签(pseudo-labelling,PL)(将LB从0.9880提升至0.9885)
强大的CV和stacking框架(将LB从0.9885提升至0.9890)
由于我们并没有NLP相关的知识背景,所以我们的总体策略是以系统的方式测试针对该问题的标准机器学习和深度学习技术。我们很高兴看到TTA和伪标签等技术在这里有效地发挥作用。
关于硬件,我们有6个GPU,经过优化的代码能让我们在一百多万个样本中(TTA+PL)训练处理约80%的OOF数据,每个模型用2小时。
多样的预训练嵌入
由于模型90%的复杂性都在于嵌入层,我们决定把注意力放在嵌入层上,而非后嵌入层。对于后者,我们将两个BiGru层输入两个最终密集层(Dense layer)。对于前者,我们在网络中搜索可预先训练的词嵌入,并将其设置在FastText和Glove的高维嵌入上,它们经过了Common Crawl、维基百科和Twitter的预训练。
将翻译当做训练/测试时间增强(TTA)
我们借鉴了Pavel Ostyakov的机器翻译理念,利用翻译成英语的法语、德语和西班牙语训练和测试数据集以进行增强。考虑到有可能造成信息泄露,我们确保将翻译保留在train-val split的同一边作为原始评论。对于预测,我们简单的对四种评论做了平均预测概率(英语,德语,法语,西班牙语)。
这对我们模型的性能产生了巨大的影响。例如,
Vanilla Bi-GRU模型:0.9862 LB
“ (w/ train-time augments): 0.9867 LB
“ (w/ test-time augments): 0.9865 LB
“ (w/ both train/test-time augments): 0.9874 LB
换句话说,只需要一个TTA模型就能打败大多数团队。
然而我们在想这一技术是否只对于“修正”非英文评论有效——我们测试了直接将原始评论翻译成英语(非英文评论会有一些干扰),导致模型的性能不如完全的增强形式。
Rough-bore伪标签(PL)
我们尝试了好几种伪标签变体:规范化每批更新、改变损失函数等。表现最好的变体是利用表现最好的整体对测试样本进行简单标记,将它们添加到训练集中,并进行收敛训练。
稳定的CV和stacking框架
对于堆叠,我们使用了算术平均和堆叠的加权平均,这比任何一种方法的效果都好(〜.0001)。们主要使用LightGBM,比XGBoost更快,并能通过贝叶斯优化达到更好地CV分数。
我们在贝叶斯优化运行的250次实验中选择了最佳参数;参数中的关键点是深度较小且强L1正则化的小型树。我们用不同的seed对6次运行DART和GBDT的过程进行打包(bagged),已解决堆叠过程中的潜在差异。
对于CV,我们记录了准确性、log loss和AUC。如果将模型添加到我们的栈中,除了能提高public board的分数,还可以改善CV-log loss和CV-AUC。我们丢弃了堆栈+混合中的很多模型,因为担心过度拟合而无法达到上述三个标准的任何一个。
在思考解决方案的过程中,我们尝试了不同的方法,也都成功了。我们认为有帮助的地方有以下几点:
由于模型大多是因为预训练嵌入而变得复杂,所以架构带来微小的变化对分数的影响很小。更多的密集层、高斯与空间dropout、密集层次上多余的dropout层、注意力、时间分布的密集层以及其他因素也不会对模型的整体分数产生较大影响。
预处理也不是特别有效,虽然会在某些模型的嵌入中留下标点符号,这有助于堆叠。
许多评论只在最后一句话有攻击性,所以除了起始的200—300个字符模型之外,还要增加训练最后徐25—50个字符的模型。
一些方法在处理单词“排序”的问题上有困难。由两个单词组成的短语交换位置后意思可能完全不一样,这意味着CNN方法很难使用,因为它们将最大池化作为支持。我们最好的CNN比最好的RNN得分低了0.0015。
总的来说,其他结构很难达到与RNN相同水平的表现力。唯一达到RNN标准的架构是Attention Is All You Need,然而它的训练时间更长。
另外,TensorFlow在很多方面都优于Keras——可以试着在Keras中安装Attention Is All You Need或者可扩展的模型以进行实际演示。也就是说,Keras也很棒,尤其是对快速迭代。
原文地址:www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/discussion/52557