573. Kaggle - LLM Science Exam | kaggle-llm-science-exam
嗨,各位Kagglers,
我们是"Contextual Kagglers"团队: Alex、 Giba、 Olya 和 Dima。 我们在私有排行榜上获得0.916分(第21名),在公共排行榜上获得0.928分(第11名)。 是的,我们在公共排行榜上曾获得金牌,但在私有排行榜上却失去了奖牌位置 - 令人遗憾的消息 🙁
我们在此披露解决方案,并分享关于数据和比赛本身的有趣见解。特别要提到的是, 大部分创意和工作由Olya和 Dima完成, 他们对最终成绩做出了巨大贡献。同时祝贺Olya 获得Kaggle竞赛专家等级。
我们的解决方案结构如下所示:
(示意图:包含检索策略、单模型、组合策略的完整流程图)
它包含两种不同的上下文检索策略:
all-MiniLM-L6-V2 以及 GTE-base 构建的FAISS量化索引(使用IVF, PQ64索引)。
我们使用了两种变体(仅提示词和提示词+所有答案)来寻找最佳上下文,因此这部分共有4种上下文:
all-MiniLM-L6-V2 仅使用提示词all-MiniLM-L6-V2 使用提示词和所有答案GTE-base 仅使用提示词GTE-base 使用提示词和所有答案sublinear_tf=True 参数,根据我们的验证这是最佳选择。
这部分提供另外2种上下文变体:分别针对20万和27万数据集。
关于单模型,我们使用了两种常见架构作为微调基础:
我们使用6万个@cdeotte数据集和我们生成的3.9万个STEM数据集进行微调。
为丰富3.9万自定义数据集的多样性,我们使用GTE-base索引生成优化上下文(分别使用仅提示词和提示词+所有答案两种方式)。
对于DeBERTa架构,我们训练了 ckpt-3850、ckpt-7200 和 ckpt-8750 三个检查点,
每个阶段都对置信度最低的样本重新标注(即微调模型将正确答案排在最后的位置)。
由于推理时间限制,LongFormer仅使用最后一个检查点。推理时DeBERTa使用2300字符限制的上下文,
LongFormer无限制(我们在500样本数据集上对2000-2500字符限制进行网格搜索,2300在推理时间和MAP@3指标上达到最佳平衡)。
mean(prompt + A + B + C + D + E, prompt + E + A + B + C + D...)
在500个样本上表现完全相同,mean(prompt + A, prompt + B...) 的MAP@3更低
为了创建最佳组合,我们测试了大量疯狂变体,包括混合、堆叠和备份策略 -
所有方案都在公开可用的500行数据(200+300行)上进行了比较测试。
最终最佳方案是:混合基于第一种检索策略的同一DeBERTaV3检查点的4个预测结果,
得到 blend_7200 和 blend_8500,
同时对 DeBERTa_3850 预测使用LongFormer预测进行平均备份。
最终公式为:0.58 * blend_7200 + 0.42 * blend_8500 + TF-IDF_backups
关于混合的重要发现:
0.5 * DeBERTa_3850 + 0.5 * LongFormer 混合替代LongFormer本身,
在 max_probability < 0.514 时进行TF-IDF检索备份效果更佳
由于我们的笔记本最多只能运行9小时,需要监控每次提交耗时。
这帮助我们确定还能添加多少模型,以及OOM/异常发生在哪个环节。
我们创建了特殊脚本在tmux会话中以 while True 循环每分钟检查提交状态。
最佳提交耗时8小时52分43秒 - 相当充分的利用,对吧?🙂
由于这不会是最后的内核竞赛,我们在此分享监控脚本,
大家可以在未来比赛中使用:
https://www.kaggle.com/code/alexryzhkov/submissions-timer-script/notebook
(可调整 GMT_OFFSET 变量适配时区)
我们还尝试使用伪标签技术使预测更接近测试数据分布。 基本方法是在500个OOF数据集基础上添加4000个测试样本并运行ML模型, 但效果不如简单的加权平均方法。
感谢Kaggle和其他参赛者带来的精彩比赛。即使12年后的今天, 对我而言这仍然充满学习和乐趣。