574. CommonLit - Evaluate Student Summaries | commonlit-evaluate-student-summaries
我训练了一个deberta-v3-xsmall模型,运行约20分钟,加上额外步骤共4分钟。我的解决方案与效率排行榜第一名的方法非常相似,详见Shochoshi的总结。核心思想是在不显著增加token数量的前提下,尽可能多地将原文信息提供给模型。我的做法是识别提示文本中出现在原文的序列(至少3-gram),并用花括号标记它们,相关代码和示例见此处。如果早知道可选的token_type_ids,我可能会改用这种方式而非花括号(会额外消耗少量token)。因此我需专注于更长序列(至少3-gram),而第一名特别关注短序列。如果用我的方法标记"the"这类单字重叠会浪费大量token。我还使用了多进程处理并尝试了许多技巧,但多数未保留下来。
在看到序列长度缩减的效果后,我也转向了性能赛道,希望能通过快速迭代和大规模集成获得好成绩。我本就没期待赢得奖金,且效率赛道不设奖牌,因此重心转向了更稳妥的性能赛道。最终我提交了2次性能赛道和1次效率赛道,分别获得性能赛道第32名和效率赛道第3名。关于性能赛道的总结(聚焦集成等主题)见此处。
训练过程相当标准:嵌入层和第一层冻结。
我尝试了许多方案:最初观察不同分数摘要的示例(相关笔记本);查阅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部分层以改善时间-性能权衡,还想尝试剪枝和蒸馏。
特别感谢@tsunotsuno的优秀基线。也感谢许多中途阅读的优质内容,如层冻结的原理。感谢竞赛中给予我启发的所有人,以及无私分享模型性能和设置的朋友。最后衷心感谢社区,近几个月在Kaggle收获颇丰!