返回列表

[9th solution] Ensemble of 5 external dataset transformers

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

开始: 2021-11-08 结束: 2022-02-07 内容安全 数据算法赛
[第9名方案] 5个外部数据集Transformer模型的集成

[第9名方案] 5个外部数据集Transformer模型的集成

作者: Andrei Papou | 比赛排名: 第9名

首先,非常感谢比赛组织者和所有参与者。我学到了很多东西,也更加坚定了我对“相信你的交叉验证(CV)”原则的信念 🙂

总体概述

集成中使用的模型列表:

  1. CV: 0.7356, LB: 0.786 - 在 CCC 2017 数据集上训练的 roberta-base,使用了自定义注意力头、交叉熵和边际排名损失,采用多阶段预测(首先在不知道6个标签的情况下预测毒性,然后将该预测和6个标签聚合为最终预测)。
  2. CV: 0.7450, LB: 0.747 - 在 CCC 2017 数据集上训练的 roberta-base,使用边际排名和二元交叉熵损失的加权平均值。
  3. CV: 0.7403, LB: 0.790 - 在 Ruddit 数据集上训练的 roberta-base 回归模型。
  4. CV: 0.7448, LB: 0.751 - 在 Ruddit 数据集上微调的 unitary/unbiased-toxic-roberta,使用2层DNN作为回归器。
  5. CV: 0.7429, LB: 从未提交 - 在 Wiki Talk Labels 数据集上训练的 roberta-base 回归模型。

集成后的 CV 为 0.7605,LB 为 0.779。所有这些模型都是通过 rankdata + mean(排名数据取平均)的方式进行集成的。

验证策略

所有模型都在通过多数投票聚合的 validation_data.csv 上进行了验证。
起初,我习惯将最终的 CV 分数定义为 CV * 0.65 + LB * 0.35。这些权重代表了我个人对分数值的信心。在某个时刻,我注意到公共 LB 分数存在巨大的波动性,微小的模型变化(CV 上 0.001 的分数差异)会导致 LB 分数 0.05-0.1 的变化。我假设只有少量的独特评论被用于 more_toxicless_toxic 角色。关于这一点的更多信息请见 此处。所以我放弃了 LB,只坚持使用本地 CV 分数。

集成策略

起初,我想集成 14 个模型(在 UBTC, Offenseval, C3, Hate Speech Measurement 上训练),而不是 5 个。但在排名任务中,更多的模型并不一定能带来更好的分数。不同模型的分数分布差异很大,不同数据集(例如 Ruddit 和 Offenseval)对毒性的定义也大相径庭。为了从集成中获得最大收益,我生成了 14 个模型的所有子集,并对使用 rankdata + mean 混合的结果运行验证。通过这种方式,我发现上述 5 个模型的子集获得了最高分。

我还尝试了很多其他的集成策略:仅取最接近分数的平均值、编写自定义比较器函数并基于投票对评论进行排序、排名 + 人工分布生成(泊松、正态分布)等。不幸的是,在 CV 上,所有这些方法的效果都略逊于 rankdata + mean。

通用 Transformer 技巧

训练所有模型时使用了以下技巧:

  1. 分层学习率:骨干层的学习率较低(2e-5),DNN 或最终注意力头的学习率较高(最高 1e-3)。
  2. 高且动态的验证频率:通常模型训练 1-2 个 epoch,至少每 10% 的批次进行一次验证。准确率越高,验证频率越高。
  3. 优化器与调度器:AdamW 优化器和带预热的余弦退火调度器,预热通常占用 1 个验证周期。

未奏效的方法

  • MLM 预训练
  • 数据增强 / TTA(测试时增强):虽然我只尝试了一些基本方法,但它们似乎显著改变了评论的含义或毒性,从而降低了分数。此外,我在比赛快结束时才开始研究这些,可能只是因为时间不够。
  • unitary/toxic-bert 骨干网络:它的性能优越,但它是在整个 CCC 2017 数据集上训练的,这就是为什么 validation_data.csv 中的一部分评论之前已经接触过它。我认为它存在数据泄露问题,因此改用了 roberta-base 和 unitary/unbiased-toxic-roberta。
同比赛其他方案