674. Jigsaw - Agile Community Rules Classification | jigsaw-agile-community-rules
感谢举办这场有趣的比赛。
我所在位置的分数非常接近,所以每个人都有机会赢得金牌。
幸运的是,我最终进入了获奖范围。
由于主办方表示子版块 (subreddit) 未参与标注过程,因此完全忽略了它。
https://www.kaggle.com/competitions/jigsaw-agile-community-rules/discussion/591160#3254380
我使用 rule-body-label 作为唯一键移除了所有重复项。
这显著减少了训练时间。此外,完全不考虑子版块带来了更好的得分 (+0.007)。
当通过 rule-body-label 获取唯一值时,我们可以看到标签是不一致的。
为了训练稳定性,我将标签替换为最频繁的标签。
保留多数投票无法决定(平局)的条目略微降低了得分,所以我丢弃了它们。
此过程是在合并的训练和测试数据上执行的。
我使用具有 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 不允许以 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 模型仅推理公开规则,但与其他模型的集成相比,得分明显更差。
是因为预测分布与通过测试集训练训练的模型不同吗?
合成数据
添加合成数据恶化了得分,所以我很早就丢弃了这个想法。
考虑到合成数据的损失在训练期间接近零,我认为它未能模拟测试分布。