本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。
原文链接:Kaggle赛题总结:AI数学奥赛挑战赛
-
赛题名称:AI Mathematical Olympiad - Progress Prize 1
-
赛题类型:大模型、数学奥赛
-
赛题任务:使用大模型解决数学挑战
https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize
比赛背景
数学推理能力是人工智能发展的重要里程碑。数学推理是解决许多复杂问题的基础,从工程奇迹到复杂的金融模型。然而,当前人工智能在这一领域的能力还存在一定限制。
人工智能数学奥林匹克奖(AIMO)是一个新的1000万美元奖金基金,旨在激励开发出能够与国际数学奥林匹克竞赛(IMO)顶尖人类选手表现一样出色的人工智能模型。这个比赛包括110个类似于中级高中数学挑战的问题。这些问题的Gem7B基准值是在公共和私有测试集上分别为3/50。
为了解决这一挑战,本次比赛使用了由国际问题解决团队创建的110个新颖的数学问题数据集,认识到需要一个透明和公平的评估框架。该数据集涵盖了从简单算术到代数思维和几何推理的各种难度级别。这将有助于加强评估人工智能模型数学推理能力的基准,而不会受到训练数据的污染风险。
比赛任务
比赛的目标是创建能够解决 LaTeX 格式下的棘手数学问题的算法和模型。您的参与将有助于推动人工智能模型的数学推理能力,并推动前沿知识的发展。
评价指标
提交的内容将根据其预测标签与地面真相标签之间的准确性进行评估。换句话说,提交内容将根据准确匹配地面真相标签的预测标签的比例进行排名。在这个比赛中,每个地面真相标签都是一个介于0和999之间(包括0和999)的整数。
对于测试集中的每个id,您必须预测一个相应的整数答案。文件应包含一个标题,并具有以下格式:
id,answer
00aa,0
11bb,0
22cc,0
...
赛题赛程
-
2024年6月20日 - 参赛截止日期。您必须在此日期之前接受比赛规则才能参加比赛。
-
2024年6月20日 - 团队合并截止日期。这是参与者加入或合并团队的最后一天。
-
2024年6月27日 - 最终提交截止日期。
赛题数据集
每个问题的答案是一个非负整数,您应该报告模1000的余数。例如,如果您认为一个问题的答案是2034
,您的预测应该是34
。所有问题都是纯文本的,其中的数学符号使用LaTeX表示。请参阅AIMO Prize - Note on Language and Notation.pdf
手册,了解所使用的符号约定。尽管一些问题可能涉及几何,但在任何问题中都不使用图表。
公共测试集包括确切的50个问题,私有测试集包括一个不同的50个问题的集合。我们还提供了一组10个问题作为训练数据使用。两个测试集中的问题都经过了平衡,考虑了难度和主题领域。
由于可用的问题数量有限,我们正在采取特殊预防措施来保护测试集免受探测的影响。在提交期间,测试集将仅包含50个公共集问题。一旦比赛结束,当我们重新运行提交时,测试集将仅包含50个私有集问题。您应尽量确保您的提交能够在50个新的私有集问题上成功完成。这可能意味着确保您的提交对意外输入具有鲁棒性,或管理运行时和内存使用。
-
train.csv - 包含10个问题作为训练数据使用。
-
test.csv - 包含50个问题。请注意,此处可见的问题仅为占位符。在评分期间,您的提交将可以访问完整的问题集。
-
sample_submission.csv - 正确格式的样本提交文件。有关提交格式的更多信息,请参阅评估页面。
数据集字段如下:
-
id
- 每个问题的唯一标识符。 -
problem
- 要解决的问题描述。 -
answer
- 从0到999的整数。
优胜方案总结
第1名
https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize/discussion/519303
Notebook: https://www.kaggle.com/code/lewtun/numina-1st-place-solution
Model: https://huggingface.co/AI-MO/NuminaMath-7B-TIR
Demo: https://huggingface.co/spaces/AI-MO/math-olympiad-solver
我们的解决方案由三个主要部分组成:
-
微调模型作为推理代理:
-
第一阶段:在包含自然语言数学问题和解决方案的大型多样数据集上进行微调,使用Chain of Thought (CoT)模板化解决方案。
-
第二阶段:在合成数据集上进行微调,数据集包含工具集成推理的问题,问题被分解为推理步骤、Python程序及其输出。
-
我们使用 DeepSeekMath-Base 7B 进行微调,创建一个能通过自然语言和Python REPL解决数学问题的推理代理。
-
参考了 MuMath-Code 论文,将训练分为两个阶段:
-
-
解码算法与代码执行反馈:
-
为每个问题生成N个候选项并执行Python代码块。
-
通过多次迭代(深度M)生成推理轨迹。
-
对生成的解决方案候选项进行后处理,并使用多数投票法选择最终答案。
-
开发了一种工具集成推理(TIR)的解码算法,通过代码执行反馈生成解答候选项。
-
采用自一致性与工具集成推理(SC-TIR)算法,该算法包括:
-
内部验证集:
-
-
使用多种内部验证集指导模型选择,避免过拟合公共排行榜。
-
验证集包括AMC、AIME以及MATH的4级和5级问题,涵盖了不同难度级别的问题。
-
训练细节
-
使用TRL、PyTorch、vLLM和DeepSpeed等开源库。
-
在一节点的8 x H100 GPUs上训练模型,训练时间为10小时。
-
两个阶段都进行了全量微调,并使用DeepSpeed ZeRO-3协议确保模型权重、梯度和优化器状态适应VRAM。
-
使用TRL的SFTTrainer的“packing”特性,将多个样本连接到单个2048令牌的块中。
模型评估与优化
-
SC-TIR算法:生成N=48个候选项,深度为M=4,通过多数投票选择最终答案,减少了高方差问题。
-
模型量化:使用8位精度量化模型,提高上传速度并减少VRAM占用。
验证与调优
-
使用了四个内部验证集(AMC、AIME、MATH 4级和5级)进行模型选择。
-
测试不同的超参数和模型,选择最有潜力的模型。
失败的尝试
-
试验了纯CoT模型和MMOS模型,但效果不佳。
-
尝试了Kahneman-Tversky Optimisation (KTO) 和REINFORCE-leave-one-out (RLOO)算法,但效果有限。
-
进行了一些推理加速和模型合并技术的尝试,但未能成功。
第2名
https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize/discussion/518964
策略模型
-
数据集选择:从AMC、AIME和Odyssey-Math中挑选了数据集,重点关注整数答案的问题,并移除了AMC中的多项选择题选项。
-
GPT-4提示:使用少样本示例生成数据集的解决方案,选择正确的解决方案进行训练。
-
训练:使用2e-5的学习率进行3个epoch的微调。
奖励模型
-
问题集:包含来自MATH、AIME、AMC和Odyssey-Math的非负整数答案的问题。
-
奖励数据集收集:
-
观察:指出DeepSeek-MATH-7B RL和Base模型在解答正确性上的差异。
-
插值:通过插值模型参数创建多样化的解决方案。
-
微调:通过不同epoch的微调DeepSeek-Math-RL生成多种解决方案。
-
过滤:确保解决方案具有整数答案并保持1:1的正负标签比例。
-
额外技术
-
去重:删除相似的解决方案。
-
包含错误解决方案:将GPT生成的错误解决方案纳入策略模型训练中。
-
奖励数据集平衡:尝试不同的标签平衡比率。
生成和评估解决方案
-
vLLM:利用vLLM进行高效采样,并使用huggingface transformer进行奖励模型评估。
-
采样:使用特定提示每个问题生成42个解决方案。
-
验证:实现反馈循环以确保结果为整数,如有必要,重试。
加权多数投票
-
ORM评分:使用奖励模型对代码生成的解决方案进行评分。
-
权重计算:采用几何平均数乘以N来平衡评分,并对常见错误答案0进行惩罚。
第3名
https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize/discussion/517206
我们的最终选定方案是基于AbdurRafae的notebook进行改编。我们使用了DeepSeek-Math-7B-RL模型,没有进行任何微调,并通过我们制定的评分规则进行多数投票。
vLLM
我们选择vLLM是因为与Huggingface Transformers相比,它的速度更快。
-
我们生成了大量候选解答(通常在120到160之间)。
-
我们发现将KV缓存设为FP16提高了我们的得分。
生成
我们使用迭代方式在一个批次中生成解决方案。每个需要运行的代码都进行一次迭代。
-
我们发现大于6次的迭代次数有助于提高得分。
-
为了确保模型始终以\boxed{}格式输出答案,我们采用了以下方法。当生成完成但没有答案时,我们在输出末尾附加字符串“最终答案是\boxed{”,并生成更多的tokens。这个提示强制模型正确输出答案。
-
每次迭代我们并行执行所有需要运行的代码。这显著减少了我们在代码执行上花费的时间。
评分规则
关于评分规则,我们发现至少在我们的验证中,模型的最终结果通常有两种类型的错误:
-
小于10的数字,这通常由于代码错误导致。
-
问题陈述中的数字。我们发现这种情况尤为突出,发生的次数超过了问题陈述实际包含答案的几率。
因此,我们将这些结果作为总生成尝试次数的百分比进行处罚。我们观察到,通过惩罚来自问题陈述的数字,我们的得分显著提升。
BF16
我们观察到运行模型在BF16模式下提高了性能,因此我们尝试让我们的解决方案在BF16模式下工作。问题是vLLM默认不支持在T4上运行BF16。但是,可以在FP32中进行计算并回退到BF16。
我们稍微修改了vLLM库代码,移除了对BF16支持的检查,并包装了attention模块,使其在fp32和bf16之间进行转换。
因此,我们有两个版本的库:
-
全BF16版本
-
只有attention和kv缓存是BF16我们对vLLM所做的改动非常小:Github
我们发现将MLP设为bf16使得模型非常慢,因此我们还创建了一个版本,将除了MLP以外的所有部分都设为bf16。使用这些库的模型表现良好,但不够稳定。它们在我们的验证中给出了最高的得分,但在公共排行榜上未超过25分。
在生成过程中执行代码
我们观察到对vLLM进行多次调用耗时较长,此外,无法可靠地通过解决方案的中间结果提前退出。因此,我们制作了一个新的notebook版本,它在生成代码结果时直接将其反馈给模型,而不需要两次vLLM生成调用。
我们通过使用logit处理器来强制模型输出代码结果的tokens。我们还在logit处理器函数中直接实施所有提前中断和修剪规则。
第4名
https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize/discussion/518960
我们的解决方案基于AbdurRafae的杰出工作,Improved Code Interpretation (kaggle.com)。他的早期分享奖实至名归。同样,Anren对这段代码的重组也为我们提供了很大的帮助。
以下是我们解决方案整体过程的简要介绍以及一些独特的技巧。我们的解决方案代码在此:
本地CV策略
我们使用了这个71k的数据集:AIMO-24: Processor (Art Of Problem Solving) (kaggle.com)。从所有的AMC_12A问题中,我们选择了最新的50个作为我们的本地验证(排除了文本中包含[asy]
字符串的问题,稍后会解释原因)。这与公共排行榜的相关性很好。
模型选择
我们使用了deepseek-math-7b-rl
,参数为:温度0.9,top_p为1.0,最大tokens为2048。这个模型配合代码工具,可以在MATH基准测试中达到58.8%的准确率。
我们在两个T4 GPU上并行部署和运行这个模型,以最大化自一致性,从而提高最终预测的准确性。双GPU推理将每个问题的总重复次数从21增加到30-40。
减少难题的尝试次数
我们手动减少了我们认为模型无法解决的问题的尝试次数,为剩余问题提供了更多的尝试次数。具体来说,我们仅允许包含[asy]
符号的问题重复3次。这个符号表示带有图形的几何问题,LaTeX中的[asy]
包围。在我们的本地测试中,模型很少正确回答这些问题,即使正确,我们也怀疑问题可能出现在模型的训练集中。
减少双GPU运行间的等待时间
在使用ThreadPoolExecutor
进行并行推理时,一个GPU通常会更快完成。如果我们看到第一个完成的GPU有足够的候选答案,我们将提前终止较慢的GPU的尝试。然后,将两个GPU生成的候选答案合并。这确保了双GPU的更高效使用,并增加了所有问题的平均重复次数。
候选答案生成
DeepSeekMath初始化为DeepSeek-Coder-v1.5 7B,能够通过编写程序有效地解决和证明数学问题。我们遵循Anren的方法,使用两个提示,让模型使用COT和编写代码方法解决问题。
我们做了一些改进:
-
限制模型的代码修改机会
我们将模型的每次重复代码修改机会限制为3次,因为输入文本过长会显著降低LLM的输出质量。这个功能由参数
while_limit
控制,我们将其设置为6(因为每次代码输入和输出处理需要两个while循环)。 -
候选答案的加权计数排序
我们发现模型在回答错误时倾向于输出0、1、2、3、4、5等小整数。我们将这些数字的权重减少到0.25,而其他数字保留正常的权重1。
-
修正一些错误行为
例如,当代码输出不是有效答案(如错误、小数、复数)时,原方法仍尝试解析文本答案,几乎总是错误的。在这种情况下,我们跳过记录文本答案。
第7名
https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize/discussion/521390
我们的代码使用了DeepSeek-Math-7B-RL模型,没有进行任何微调。相较于早期共享奖的notebook,我们做了一些改动。主要包括:
-
提示词的小改动
-
文本和代码输出的使用方式
-
不同提示词的混合方式
-
重复次数
-
时间管理
CV策略
我们发现了两个非常有用的公共数据集,AIME问题集和MATH数据集(4级和5级问题)。这些都是大型数据集,我发现选择其中的一小部分最为有用。这样,我有了一组固定的50个问题集。我使用公共排行榜作为额外的CV来源,并将其与AIME和MATH问题集等权重使用。
方法、不同方法和发现
我的第一个方法是仔细研究公共notebook中提出的零样本方法(链接)。推荐使用两种提示词来使用DeepSeek-Math-7B-RL。一种是要求编写代码,另一种是直接提供数值答案。有不同的策略,上述notebook使用了代码提示词,使用代码输出,如果代码失败,则使用文本输出。
上述方法及其变体作为基础方法,当早期共享奖的notebook发布后,我使用该notebook中提出的新提示词方法进行了相同的实验。
在使用相同代码和不同种子运行大量实验后,发现正确解答的数量有很大的变异性。对于这些实验,我只使用了代码输出。这种随机性似乎有两种典型来源:有些问题,语言模型以某种概率t1误解问题并解决类似问题,以概率t2解决正确问题。如果t1 < t2,则通过大量重复,多数投票可能给出正确解答;如果t2 < t1,重复次数越多,多数解答越不可能正确。另一种典型情况是代码大部分时间失败,但以小概率t=0.1运行并给出正确答案。在这种情况下,多次运行增加了正确解答的机会。
为了仔细评估不同版本的提示词、代码输出与文本输出,我使用不同种子运行相同代码3到5次并取平均值。这给出了程序期望值的一个不错估计。
-
提示词。我尝试了提示词的改动,发现这对答案有随机影响。一个发现是更长、更详细的提示词往往得分稍差,可能是因为Deepseek模型的训练方式。最终我使用了稍短的提示词。
-
代码与文本答案。如何信任代码答案与文本答案可以作为一个超参数:文本答案值α,而代码答案值1,0<=α<=1。经过大量实验,我只使用代码答案(α=0)。
-
第一个提示词得分较高。最终代码使用了混合策略,使用第一个提示词的概率为W,使用第二个提示词的概率为1-W。W=0.7效果最佳。
-
重复次数。实验中,超过30次重复并未提高结果。在P100上,重复次数=27(结合时间管理)效果较好。
-
时间管理。主要思想(参见早期共享奖notebook)是对困难问题花费更多时间。一个简单的问题是指多数投票早期产生明显赢家的问题。使用新API时需要一些保障,以确保notebook不会超时。程序首先计算每个问题的预计时间T。最简单的解决方案是设置截止时间,即第n个问题在时间nT后完成。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。