返回列表

3rd Place Efficiency Solution

574. CommonLit - Evaluate Student Summaries | commonlit-evaluate-student-summaries

开始: 2023-07-12 结束: 2023-10-11 智能评测 数据算法赛
第三名效率解决方案

第三名效率解决方案

1. 总结与魔法

我训练了一个deberta-v3-xsmall模型,运行约20分钟,加上额外步骤共4分钟。我的解决方案与效率排行榜第一名的方法非常相似,详见Shochoshi的总结。核心思想是在不显著增加token数量的前提下,尽可能多地将原文信息提供给模型。我的做法是识别提示文本中出现在原文的序列(至少3-gram),并用花括号标记它们,相关代码和示例见此处。如果早知道可选的token_type_ids,我可能会改用这种方式而非花括号(会额外消耗少量token)。因此我需专注于更长序列(至少3-gram),而第一名特别关注短序列。如果用我的方法标记"the"这类单字重叠会浪费大量token。我还使用了多进程处理并尝试了许多技巧,但多数未保留下来。

2. 转向性能赛道

在看到序列长度缩减的效果后,我也转向了性能赛道,希望能通过快速迭代和大规模集成获得好成绩。我本就没期待赢得奖金,且效率赛道不设奖牌,因此重心转向了更稳妥的性能赛道。最终我提交了2次性能赛道和1次效率赛道,分别获得性能赛道第32名和效率赛道第3名。关于性能赛道的总结(聚焦集成等主题)见此处

3. 方法

  1. 清理摘要和提示中的空白字符
  2. 在原文中出现且n-gram≥3的序列周围添加花括号
  3. 使用相同的deberta-v3-xsmall预测内容和表达(仅1个模型)
    3.1 使用Ray多进程充分利用4个核心

训练过程相当标准:嵌入层和第一层冻结。

4. 历程

我尝试了许多方案:最初观察不同分数摘要的示例(相关笔记本);查阅CommonLit网站,思考学生年级如何影响指标均分;从讨论帖和代码中吸收信息;分析效率评分实现,理解时间与性能的权衡。

我的权衡基于以下假设:基线0.84,最佳得分约0.42,因此效率指标第一部分的除数也是0.420。运行时间9小时/540分钟贡献1分,故假设0.008分约等于10分钟。

随后实现简单基线:仅用摘要长度的线性和非线性模型。分析最大误差源发现,大部分是学生大段复制原文(这些摘要长且被简单方法高估,但教师评分特别是表达分很低)。仅移除常见3-gram后,用剩余文本长度构建指数公式,大幅降低了表达RMSE。然后切换到LGBM,添加相对复制词数、N-gram计数等特征。此时内容预测已较好,但表达预测仍很差,因此仅为表达添加了一个小型BERT模型。

我想使用更大的Transformer,尝试了许多提效方法:Torch转ONNX、静态/动态量化、Ray多进程。最终只有Ray保留下来。量化在我的CPU上提速25%,但提交服务器仅10%,性能下降使权衡不划算。或许量化感知训练能解决,但这与早期冻结层冲突(至少我未找到标准权重已量化的证据)。总共只有约15天时间,此时已消耗大部分。

我还尝试了拼写纠正、多模型权重平均(完全无效)、变化token长度、对超长序列添加分数修正。也尝试用LGBM后处理(轻量且低计算量),但初期效果差,最后一日才用技巧实现,仅用于最终性能提交(详见性能总结)。工作一段时间后,几乎所有内容都切换到deberta-v3-xsmall预测。后续错误分析发现含大量制表符的文本被误分类,通过将所有空白字符替换为单空格解决。

模型 本地CV分数 公开分数 私有分数 推理时间
0-提交 1.030 0.840 0.985 <1分钟
仅摘要长度 0.677 0.596 0.610 <1分钟
截断3-gram 0.621 0.535 0.565 1分钟
LGBM+tiny-bert ? 0.471 0.515 31分钟
v3-xsmall全技巧 ? 0.455 0.491 25分钟

还有许多未完成:刚在赛前让LGBM配合强Transformer工作,想完全移除deberta-v3-xsmall部分层以改善时间-性能权衡,还想尝试剪枝和蒸馏。

5. 致谢

特别感谢@tsunotsuno的优秀基线。也感谢许多中途阅读的优质内容,如层冻结的原理。感谢竞赛中给予我启发的所有人,以及无私分享模型性能和设置的朋友。最后衷心感谢社区,近几个月在Kaggle收获颇丰!

同比赛其他方案