返回列表

3rd Place Solution

515. Google AI4Code – Understand Code in Python Notebooks | AI4Code

开始: 2022-05-11 结束: 2022-11-10 基础软件 数据算法赛
第3名解决方案
作者: yufuin (MASTER) | 比赛排名: 第3名

概述

主要特征

  1. 基于余弦相似度的分类模型,用于预测给定的 markdown 单元格应该放置在哪两个连续的代码单元格之间。
  2. 后处理步骤,用于弥合预测的概率分布与任务指标之间的差距。
  3. 从 Kaggle 爬取的额外 notebooks 作为外部训练数据集。

次要特征

  1. MLM 的额外预训练。
  2. 当多个 markdown 单元格放置在相同的代码对之间时使用的 Markdown 排序模型(见下图中的“Markdown sorting model”)。
  3. 一些加速推理的技术。

以下是我的模型概述。

模型概述图

有效的方法

  1. 主模型: 分类模型,用于预测给定的 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 个子词 + 特殊标记。
  2. 后处理

    • 结果:开发集上 +0.8~1%。
    • 本次比赛的任务得分 Kendall’s tau 有一个特性,即与理想分数(=100%)的差值与预测 markdown 位置与正确位置的总偏差成正比(如果我们忽略由 markdown 单元格顺序不正确引起的差值)。
    • 我的模型输出 markdown 位置的概率分布。根据预测的概率,我们可以估计每个位置的预期偏差。
    • 选择最小预期偏差位置是比简单地通过概率 argmax 更好的策略,可以最大限度地减少任务得分的下降。
  3. 外部数据集

    • 结果:Private LB 上 >+0.
同比赛其他方案