第36名 - deberta-large-1024/longformer-large-1536 集成与阈值处理方案
第36名 - deberta-large-1024/longformer-large-1536 集成与阈值处理方案
作者:AlexeyK | 排名:第36名
首先,我要感谢组织者创建了这场精彩的比赛,也要感谢整个 Kaggle 社区在比赛期间分享了大量富有成效的想法。我学到了很多用于分析长文本的现代 NLP 技术。
特别感谢 @cdeotte 提供的详尽的 入门内核,这真的帮我入门;感谢 @abhishek 提供的强有力的 基线,这可能是本次比赛中大多数顶尖队伍所使用的方案;以及 @hengck23,我使用了他 模型集成 的思路,他也慷慨地分享了许多实验结果。请给他们的内核点赞!
我的方案使用了 5 个模型的集成:2 个 deberta-large-1024,2 个 deberta-v3-large-1024 和 1 个 longformer-large-1536,每个模型都在 5 折数据上进行训练。
- 我使用了 Abhishek 的 5 折划分,并使用 max_len=1024 训练了所有的 deberta-large 模型,因为由于 GPU 内存限制,我无法设置更高的长度,而且 deberta 模型似乎开箱即不支持梯度检查点。对于 longformer-large,我使用了 max_len=1536。
- OOF(样本外)验证分数与公共排行榜分数显示出良好的相关性,这非常令人欣慰,也让我对建模方法充满信心。
- Deberta-large-1024 模型表现最好。我没有通过 LB 提交来验证这一点,但我认为使用原始的 Abhishek 代码配合适当调整的阈值,简单集成两个 deberta-large 模型就足以获得银牌。我估计公共 LB 分数可以达到 0.702-0.703,私有 LB 分数可以达到 0.713-0.714。
- 加入 2 个 deberta-v3-large-1024 和 longformer-large-1536 让我获得了约 +0.004 的提升,公共 LB 分数达到 0.707(私有 LB 为 0.719)。这个集成看起来相当稳健,因为在震荡后我在 LB 上上升了 11 个名次。
- 我使用 Abhishek 的代码训练模型,设置 batch_size=1,并添加了 gradient_accumulation=4(所以实际上我使用了 batch_size=4)以适应我的 15GB GPU。我使用了半周期余弦退火计划,预热 0.1,共 5 个 epoch,优化器为 AdamW。大部分训练在 3-4 个 epoch 后收敛。
- 我观察到稍微大一点的 hidden_dropout=0.15 比 hidden_dropout=0.1 能带来更好的验证分数,尽管我在 deberta 的最终集成中包含了这两种情况。我还使用了 LR=2e-5,但在有几折训练未收敛的情况下,我在后续尝试中将 LR 降至 1e-5。
- 对于不同模型的集成,我使用了 @hengck23 的思路:预测文本中每个符号的概率,然后在预测话语之前对不同模型的概率进行平均。
- 我使用 OOF 数据调整了不同话语类别的概率和长度阈值,并计算了 5 折的平均阈值,这比公开内核中发布的阈值带来了 +0.004 的提升。
- 在 Kaggle 内核中,对 5 个模型(每个 5 折)进行推理花费了大约 8 个多小时。
- 我尝试了不同的集成组合,加入了 BigBird-Large、Funnel-Large 和中等大小的 deberta 模型,但这并没有提高分数。
- 我也尝试在平均之前对概率应用排序,以纠正任何系统性的模型预测偏移,但这反而让分数变差了。
- 不幸的是,由于时间不够,我没机会尝试自己构建更好的二级后处理模型,但我目前正在研究顶尖团队的惊人方案。感谢分享!