返回列表

1st Place Solution

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

开始: 2022-05-11 结束: 2022-11-10 基础软件 数据算法赛
第一名解决方案

第一名解决方案

作者:hyd (Grandmaster) | 排名:第 1 名

概述

我使用了在所有比赛数据上训练的单个列表式(list-wise)deberta-v3-large 模型。输入文本是由 [SEP] 和 [CLS] 标记分隔的单元格内容。

代码

有效的方法

  • MLM(掩码语言模型)
  • 预处理
    • 理由和背景:它使文本更短,因此我们可以处理更长的文本。
  • 使用 DeBERTa 而不是 CodeBERT
  • +LSTM 头
  • 更大的 cell_cnt(单元格数量)和 seq_length(序列长度)
    • 理由和背景:评估指标更关注长文本。
  • +后处理:同时预测代码和 Markdown,然后按基本真值对代码进行排序。
    • 理由和背景:比仅预测 Markdown 然后与代码单元格拼接更合理。

无效的方法

  • 翻译:facebook/mbart-large-50-many-to-one-mmt
    • 理由和背景:大多数笔记本是英文的。或者是我操作有误。
  • 将代码排名加入全连接层(+code rank to dense layers)
    • 理由和背景:我应该尝试将文本与排名信息拼接。模型会学得更好。
  • 提取嵌入,然后训练 Transformer 模型
    • 理由和背景:我应该先预训练提取模型。
  • xlm-robert-large 或 mdeberta-v3-base
    • 理由和背景:效果比 deberta-v3-large 差很多,所以无法直接进行集成。

重要参考

补充信息

  • 损失函数为 MAE。
  • 在训练数据上进行 MLM 15 个 epoch,max_length 为 1024。耗时 3 天。
  • 训练 10 个 epoch,max_length 为 2048。耗时 7 天。我认为将 max_length 设置为 5120 会大大提高模型性能,但我没有足够的 A100~
  • 推理:max_length 为 5120。耗时 6 小时。
  • 我在最后两周使用了 1 * A100(80GB),在早期阶段使用了 1 * 3090(24GB)。
  • 未来工作:
    • 将文本与排名信息拼接:flag + rank_1 + cell_1 + flag+ rank_2 + cell_2 + … + flag+ rank_n + cell_n
    • 多语言支持
    • 额外的训练数据
    • 对抗权重扰动(AWP),但太耗时

致谢

感谢竞赛组织者举办如此精彩的 NLP 竞赛。也感谢优秀的 Notebooks 和讨论,我学到了很多。

团队成员

同比赛其他方案