返回列表

7th place solution

674. Jigsaw - Agile Community Rules Classification | jigsaw-agile-community-rules

开始: 2025-07-23 结束: 2025-10-23 内容安全 数据算法赛
第 7 名解决方案 - Jigsaw Agile Community Rules

第 7 名解决方案

作者: ktr (kcotton21)

发布日期: 2025-10-25

竞赛排名: 第 7 名

副标题: 安全内容审核预训练模型提升集成得分。

感谢举办这场有趣的比赛。
我所在位置的分数非常接近,所以每个人都有机会赢得金牌。
幸运的是,我最终进入了获奖范围。

概述

  • 解决方案完全依赖于测试集训练 (train-on-test) 方法。
  • 安全内容审核预训练模型提升了集成得分。

数据预处理

由于主办方表示子版块 (subreddit) 未参与标注过程,因此完全忽略了它。
https://www.kaggle.com/competitions/jigsaw-agile-community-rules/discussion/591160#3254380

我使用 rule-body-label 作为唯一键移除了所有重复项。
这显著减少了训练时间。此外,完全不考虑子版块带来了更好的得分 (+0.007)。

当通过 rule-body-label 获取唯一值时,我们可以看到标签是不一致的。
为了训练稳定性,我将标签替换为最频繁的标签。
保留多数投票无法决定(平局)的条目略微降低了得分,所以我丢弃了它们。

此过程是在合并的训练和测试数据上执行的。

交叉验证 (CV)

我使用具有 unique rule-body-label 组合的训练集构建了 CV,但与排行榜 (LB) 完全没有相关性。
它主要用于验证模型是否可以正确使用。
由于测试数据量很大,我完全信任排行榜 (LB)。

模型

模型 公开榜 私有榜
Qwen3-14B 0.926 0.919
phi-4 0.924 0.920
gemma-2-9b-it 0.924 0.920
shieldgemma-9b 0.927 0.922
Qwen3-8B-Guard 0.923 0.921

我扫描了 8B-14B 大小的模型,这些模型可以在 T4 (16GB 显存) 上使用 QLoRA 运行。
不幸的是,很少有模型能超过 0.920 的阈值。

将 gemma2-9b-it 添加到集成中极大地提高了得分。
shieldgemma 作为一个变体带来了最佳性能,且是单一最佳模型,超过了 Qwen3-14B。
与此相关,Qwen3-8B-Guard 的表现也优于 vanilla 模型 (0.920 -> 0.923)。

模型使用 Unsloth 框架训练,通过指定不同的 GPU ID 同时训练两个模型。
我尝试使用 QLoRA + DDP 训练 32B 模型,但由于复杂性要求未能实现。

训练和推理时间合计约为 10 小时(针对四个模型)。
第五个模型 Qwen3-8B-Guard 仅用于推理两条规则。

在 vLLM 上解锁 Gemma2

我认为这可能是我解决方案中最独特的方面。
由于数值不稳定,vLLM 不允许以 fp16 推理 Gemma2。
然而,由于这只是硬编码的,很容易通过 sed 重写来解锁。

sed -i '/^_FLOAT16_NOT_SUPPORTED_MODELS = {$/,/^}$/c\
_FLOAT16_NOT_SUPPORTED_MODELS = {}' /usr/local/lib/python3.11/dist-packages/vllm/config.py

(vllm==0.10.0)

即使解锁后,我也能够取得上述合理的得分。
(可能是因为只需要推理 1 个 token 的特殊要求)

未成功的方法

  • 仅使用 Qwen3-32B 推理公开规则
    根据我对指标和实验的理解,每条规则的预测排名不影响得分。
    所以我尝试使用在训练数据上训练的 32B 模型仅推理公开规则,但与其他模型的集成相比,得分明显更差。
    是因为预测分布与通过测试集训练训练的模型不同吗?

  • 合成数据
    添加合成数据恶化了得分,所以我很早就丢弃了这个想法。
    考虑到合成数据的损失在训练期间接近零,我认为它未能模拟测试分布。

同比赛其他方案