返回列表

5th place solution

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

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

第5名解决方案

作者:Alexander | 比赛排名:第5名

在比赛的最后一个月,我决定专注于最大化验证集分数。公共排行榜(Public LB)似乎不太有用,因为它只包含 5% 的数据,而且验证集分数与公共排行榜分数之间没有相关性。

我使用了 2 个数据集来训练模型:Ruddit 数据集和有毒评论数据集。我尝试过其他数据集,但它们完全没有提高我的验证分数。

我只使用 “validation_data.csv” 进行验证。

Ruddit 数据集 / 模型

Ruddit 数据集包含元组 (A, B, C, D),其中 “A” 毒性最小,“D” 毒性最大。因此,我利用这些元组创建了样本对 (X, Y),其中 X 的毒性小于 Y。

然后我使用 MarginRankingLoss 训练了 2 个模型:

  1. 带有线性层的 “roberta-large”
  2. 带有线性层的 “unitary/unbiased-toxic-roberta”

我使用了分层学习率衰减(从 1e-5 到 1e-4)。训练采用 5 折交叉验证。每个模型训练 3 个 epoch,每个 epoch 结束后保存准确率最高的模型。

有毒评论数据集 / 模型

我使用该数据集训练回归模型。数据准备步骤:

  1. 移除与 validation_data.csv 中文本相同的项目
  2. 计算毒性目标值 (y = toxic*0.32 + severe_toxic*1.82 + obscene*0.16 + threat*1.5 + insult*0.64 + identity_hate*1.5)
  3. 创建包含正毒性目标值和负毒性目标值的训练数据集。

数据准备完成后,我训练了 3 个模型:

  1. TfIdf + Ridge。 我使用了清理后的文本和 4 个额外特征:长度、文本中标点符号的比例、文本中大写字符的比例、脏话数量(这些特征略微提高了 validation_data 上的分数)。我在 8 个折上训练模型,通过网格搜索超参数(“ngram_range”、“alpha”、“fit_intercept”),并选择在 validation_data 上得分最高的模型。
  2. 基于 “unitary/unbiased-toxic-roberta” 的回归模型(带自定义线性层和 MSELoss)。 我使用 5 折交叉验证训练该模型,共 5 个 epoch。保存在验证折上损失最小的模型。模型训练采用了分层学习率。
  3. 基于 “unitary/unbiased-toxic-roberta” 的回归模型(带自定义注意力层和 MSELoss)。 我使用 5 折交叉验证训练该模型,共 5 个 epoch。保存在验证折上损失最小的模型。模型训练采用了分层学习率。

模型集成

训练模型后,我使用 Optuna 来权衡集成中的模型权重。步骤:

  1. 使用最小-最大缩�放归一化模型的 logits
  2. 使用 0 或 1 的权重对模型进行加权。

经过一些实验,我获得了最大验证分数 0.709,公共排行榜分数为 0.819。

最终集成 – 模型汇总:

序号 模型 数据集 模型数量
1 roberta-large (MarginRankingLoss) Ruddit 2
2 unitary/unbiased-toxic-roberta (MarginRankingLoss) Ruddit 3
3 Tfidf + RIDGE Toxic comments 3
4 unitary/unbiased-toxic-roberta (自定义线性层, MSELoss) Toxic comments 3
5 unitary/unbiased-toxic-roberta (自定义注意力层, MSELoss) Toxic comments 2

代码笔记本