返回列表

41th Place Solution

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

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

第41名方案

作者: KhanhVD (Grandmaster) & TDL (Expert)

首先,感谢 Kaggle 和竞赛主办方举办了这场充满挑战的比赛 —— Google AI4Code:理解 Python Notebook 中的代码,预测代码与注释之间的关系。这篇文章总结了我们团队的努力,能与队友合作是一次很棒的经历!这是我们团队集体努力的成果总结。

概述

基于 Khôi 的初步想法,我们做了一些修改以获取更多的全局上下文信息。我们采样了 45 个单元格,并使用较短的代码单元格长度(10 个 token)。如果 notebook 中的单元格少于 45 个,我们会根据代码单元格的数量动态调整代码单元格的最大长度。

集成来自两种训练设置的模型(我们的设置和 Khoi Nguyen 的设置 —— 20 个代码单元格,每个 23 个 token)也提升了 CV 和 LB 的分数(具体数字我们记不清了)。

  • 模型:一些 Point-wise 模型的加权平均,例如:Distilbert-base-uncased, Deberta-v3-base 和 Codebert-base。
  • 数据:所有竞赛训练数据,无外部数据。交叉验证分割比例:90/10。
  • 硬件:两块 A6000-48GB。最大的模型训练了 3-4 天,轻量级模型如 distilbert 训练了 1-2 天。

本地 CV 的一些结果详情见下图:

初始实验

初始实验没有打败 Khoi 的基线:

初始实验1

基于代码单元格数量的动态 tokenizer 和 FGM 训练帮助提升了本地 CV 和 LB 的分数:

初始实验2

最终 & 最佳实验

在本地 CV 和 LB 上表现最好的模型是 Deberta-v3-base。

最终实验

推理代码: Inference Ensemble Final Submission

有效的方法

[高影响力] 想法

  • 基于代码单元格数量的动态 tokenizer:本地 CV +0.007,LB +0.005。
  • 本地 tokenizer 以提升训练速度。

[中等影响力] 想法

  • MLM 预训练(15% 概率随机 mask token),在除 1000 个验证样本外的所有数据上进行:本地和 LB +0.002(提升不大,且预训练耗时较长)。
  • FGM 训练:提升本地和 CV +0.002,但训练时间翻倍。

无效的方法

  • 更大的模型:Deberta-v3-large, Deberta-v3-xlarge。
  • AWP/Fast AWP 训练:未提升本地 CV 和 LB 分数。
  • EMA 训练。
  • 自定义头部:
    • mean/max pooling
    • concat mean-max pooling
    • concat last 4 layers
    • Attention pooling
    • LSTM/ Bi-LSTM

补充背景(没时间尝试的想法):

我们真的很想测试以下论文中的想法,但我们确实没有足够的时间和计算资源。

  • Deep Attentive Ranking Networks for Learning to Order Sentences - 论文链接
  • Efficient Relational Sentence Ordering Network - 论文链接
  • Neural Sentence Ordering Based on Constraint Graphs - 论文链接
  • Is Everything in Order? A Simple Way to Order Sentences - 论文链接
  • Sentence Ordering and Coherence Modeling using Recurrent Neural Networks - 论文链接
  • 知识蒸馏
  • 增强技术:Mixup, Random mask
同比赛其他方案