第3名解决方案
作者: yufuin (MASTER) | 比赛排名: 第3名
概述
主要特征
- 基于余弦相似度的分类模型,用于预测给定的 markdown 单元格应该放置在哪两个连续的代码单元格之间。
- 后处理步骤,用于弥合预测的概率分布与任务指标之间的差距。
- 从 Kaggle 爬取的额外 notebooks 作为外部训练数据集。
次要特征
- MLM 的额外预训练。
- 当多个 markdown 单元格放置在相同的代码对之间时使用的 Markdown 排序模型(见下图中的“Markdown sorting model”)。
- 一些加速推理的技术。
以下是我的模型概述。

有效的方法
-
主模型: 分类模型,用于预测给定的 markdown 单元格应该放置在哪两个连续的代码单元格之间。
- 结果:开发集上 88.5%(单个 deberta-v3-large 模型,无 {MLM, 后处理, 外部数据集})。
- 该模型构建每两个连续代码单元格和每个 markdown 单元格的表示,然后根据代码和 markdown 表示之间的余弦相似度预测概率分布。
- 损失函数:CrossEntropyLoss。
- 用于编码 markdown 和代码的 BERT 权重是共享的。
- 模型架构中最重要的部分是代码编码处的 LSTM。没有 LSTM,我的开发集得分只有 86~87%。
- 我为最佳提交训练了三个检查点。
- 一个由 deberta-v3-large 初始化,另外两个由 distilroberta 初始化。
- 它们都使用了相同的训练-开发集划分。
- 集成是通过加权平均输出概率分布来完成的。集成权重是通过在开发集上进行网格搜索调整的。
- 我对 deberta-v3-large 使用了 EMA(指数移动平均)检查点集成,对 distilroberta 使用了严格平均。
- 事实上,即使是 deberta-v3-large,严格平均的结果也总是比 EMA 好。
- 然而,收敛时间比 EMA 长得多(长 2~3 倍),不幸的是,我在比赛结束前一周发现训练有问题,截止日期前无法完成 deberta-v3-large 的严格平均重新训练,所以我提交了 deberta-v3-large 的 EMA 版本。
- 为了防止训练期间内存不足,我对 markdown 和代码单元格进行了采样。
- 每个单元格的子词最大序列长度为 128。
- 由于代码对由两个单元格构成,它可能有 256 个子词 + 特殊标记。
-
后处理
- 结果:开发集上 +0.8~1%。
- 本次比赛的任务得分 Kendall’s tau 有一个特性,即与理想分数(=100%)的差值与预测 markdown 位置与正确位置的总偏差成正比(如果我们忽略由 markdown 单元格顺序不正确引起的差值)。
- 我的模型输出 markdown 位置的概率分布。根据预测的概率,我们可以估计每个位置的预期偏差。
- 选择最小预期偏差位置是比简单地通过概率 argmax 更好的策略,可以最大限度地减少任务得分的下降。
-
外部数据集