shuaihhx的小屋

一个小博客....

Toxic Comment Classification Challenge 总结

shuaihhx shuaihhx
2019-11-16 11:28
11
0

前段时间参加了一个kaggle竞赛,虽然成绩不算很好,也算是一次尝试了。正好领导让写一下简单总结,就顺便把总结拷贝到这里,充充数,毕竟这里已经荒废了差不多有半年了。 难受

竞赛链接点击

Overview

本次竞赛是一个文本分类问题,要求对Toxic Comment进行分类识别。竞赛给出的数据集中除了comment text和toxic label外,还给出了一些额外的toxicity subtype attributes(如:severe_toxicity、obscene、threat等,竞赛不要求对这些子类进行识别),以及一些identity attributes,如(male、female、homosexual_gay_or_lesbian、christian等)。

过程简单记录

Summary

整体的过程与大部分任务基本相似,包括数据预处理、建模与模型集成。模型主要使用了LSTM、BERT和GPT2,最后进行了集成。

数据集的预处理(Pre-Processing)

首先,从结果上看,基于预处理的数据集在LSTM模型上有较好的效果,对BERT和GPT2模型没有明显的效果。可能是BERT和GPT2模型本身就是在未经处理的大语料上训练出的语言模型,具有比较强的泛化能力。

数据预处理部分首先参考了这个kernel,后续根据效果进行了一些取舍,主要包括特殊字符与符号的处理,拼写格式上的统一,文字长度统一等。经过处理,可以使词向量对数据集的覆盖更加全面。

训练模型

本次竞赛所使用的模型包括LSTM、BERT和GPT2。

LSTM模型

LSTM模型主要参考了https://www.kaggle.com/bminixhofer/simple-lstm-pytorch-versionhttps://www.kaggle.com/christofhenkel/how-to-preprocessing-for-glove-part2-usage

LSTM模型从结构上来说比较简单,其输入为文本的词向量embedding,这里使用了开放的crawl和glove词向量的concatenate。经过双层双向LSTM以及线性层的叠加,最终输出结果。这里我把认为比较重要的几点记录如下:

  • 由于数据集的不平衡,在计算loss时使用了加权的loss计算,权重计算时使用label值和identity_ attributes的值,同时,由于toxicity subtype attributes的存在,训练时可以做subtype和toxic label的联合训练。
  • 在本次任务中,将最终目标当作分类任务和当作回归任务可以达到相当的效果,在后续BERT模型的训练中,就有部分模型是回归方式训练出来的。
  • 在保存模型进行第二阶段的预测时,重新建立embedding matrix不仅能极大的减小模型大小,且理论上会有更好的泛化能力。https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification/discussion/93230
  • 使用n-fold和不同random seed的ensemble对结果有提升作用。

实验中也进行过一些其他的尝试,例如在模型中增加Attention层,使用GRU代替LSTM,改变loss方式等,但没有起到很好的效果。

BERT模型

BERT模型的训练和预测主要参考了https://www.kaggle.com/yuval6967/toxic-bert-plain-vanilahttps://www.kaggle.com/abhishek/pytorch-bert-inference。对BERT模型进行的改进不多,主要是加入了在LSTM中使用的custom loss,起到了比较好的提升效果;将任务作为回归任务进行处理也在BERT单模型上取得了更好的结果;改变超参数进行第二轮训练也对最后的融合结果产生了提升(从讨论区看,继续训练应该是能够产生更好的效果,但由于在模型调参等方面的经验较少,我们的训练未达到预期的效果)。这个讨论对提升训练速度比较有帮助,可以使BERT模型在kaggle kernel上完成整个epoch的训练。 另外,也进行了一些其他尝试,比如增加数据预处理、重写最后的线性输出层、改变优化方式等,但未达到理想的效果。BERT_large model同样未达到预期效果。

GPT2模型

GPT2模型从使用上与BERT模型基本一致,主要参考了https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification/discussion/95220开源代码现在已经比较完整的加入了几种比较流行的语言模型,GPT2在当时还是由https://github.com/pronkinnikita/pytorch-pretrained-BERT另外加入的。 在GPT2模型的调整上,其实并没有达到很好的效果(相对BERT模型,结果稍差一些),但在融合后对最终结果产生了一些提升。 另外在截止前的最后几天,XLNET模型开放出来,但由于时间原因,未进行相关测试。

模型集成

模型集成方面虽然也做了一些尝试,但最终还是简单的加和平均的方式取得的效果最佳。最终是使用了6个BERT model,6个LSTM model和1个GPT2 model的集成。

PS: 从赛后的一些结果看https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification/discussion/100661https://www.kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification/discussion/103280,loss function的改进和多个语言模型的集成还是提升结果的较好的方式。