返回列表

14th place solution

475. Jigsaw Rate Severity of Toxic Comments | jigsaw-toxic-severity-rating

开始: 2021-11-08 结束: 2022-02-07 内容安全 数据算法赛
第14名解决方案

第14名解决方案

作者:Adam Montgomerie
排名:第14名

概述

公共排行榜似乎不太有用,所以我的策略就是最大化我的验证集分数。我的最终提交是6个(5折)Transformer模型的加权平均。这既是我最高的CV分数,也是最高的Private LB分数,所以我很高兴这次我选择信任我的CV。

数据

我尝试包含尽可能多的不同数据集。在训练中我使用了:

交叉验证策略

我使用了 @columbia2131 的 Union-Find 方法来生成折,确保折之间没有任何文本泄露。我没有使用多数投票或任何其他消除数据分歧的方法,因为我认为这只会人为地使验证集变得更容易,并且与测试数据的相似度降低。

训练

损失函数

我使用Margin Ranking Loss来训练验证数据,并尝试了Margin Ranking和MSE来处理其他数据集。从额外数据集中创建大量排序配对数据相当容易,但我发现这并没有比直接使用MSE损失在标签上训练提高性能,而且还需要较小的批次大小。

评估

在额外数据集上进行微调时,我在每次评估时计算验证集上与标注者的平均一致性,并使用早停。我在小数据集(jigsaw 1 和 ruddit)上训练了多个epoch,每个epoch评估一次。对于大数据集(offenseval 和 jigsaw 2),我通常只训练1个epoch,每完成该epoch进度的10%评估一次。

在验证数据上训练时,我训练了5个模型,每个模型使用4/5折进行训练,剩下的1折作为验证集。我在每个epoch计算CV,并使用CV最高的那个epoch的模型权重。

我最初使用的是折级早停,但我发现这会导致CV分数过于乐观

多阶段微调

我发现采用一个已经微调过的模型,并在另一个数据集上再次微调,可以提高性能。这在多个微调阶段都有效。效果最好的顺序是先在较大、分数较低的数据集上微调,然后再在较小的数据集上微调。

例如:

  1. 在offenseval上微调预训练模型(验证分数:~0.68)
  2. 使用#1的模型在jigsaw 2上微调(验证分数 ~0.695)
  3. 使用#2的模型在jigsaw 1上微调(验证分数 ~0.7)
  4. 使用#3的模型在ruddit上微调(验证分数 ~0.705)
  5. 使用#4的模型在验证数据上微调5折(CV: 0.71+)

超参数

在早期的微调阶段,我大多以1e-5的学习率开始训练base-sized模型,在后续阶段降至1e-6。对于更大的模型,我使用了1e-6然后是5e-7。在每个阶段,我还使用了5%的预热和线性学习率衰减。即使使用混合精度训练,我的GPU上大模型也只能放下批次大小8,所以我使用了梯度累积来模拟批次大小64。

模型

以下是模型结果表。

基础模型 折数 CV 最终提交
deberta-v3-base 5 0.715