让小型模型在自身错误中训练:它在HumanEval上达到80%,并在数学上超越GPT-3.5

Reddit r/LocalLLaMA 论文

摘要

一位研究人员让小型语言模型在自己生成的编程错误和修正上进行训练,在HumanEval上达到80%,并在数学上超越GPT-3.5,展示了在极少资源下的有效自我改进。

几个月前,我在DeepSeek-R1论文中的一行话上卡住了。它说模型可以通过可验证的奖励来改进。这对我来说几乎像是魔法。不是因为不可能,而是因为它让我思考一个非常简单的问题:如果模型可以自学编程,而无需人类编写训练数据,会怎样?我没有实验室。我没有资金。我只有一台24GB的MacBook、一个RunPod账户里的一些积分和一个Python解释器。所以我试了。 # 计划 用大白话说。我会让一个基础模型自己编一个编程问题,并为其写几个小测试。然后让同一个模型多次解决它自己的问题。有时答对,有时答错。我会保存(错误尝试,正确尝试)这样的配对,然后让模型在自己的修正上进行微调。没有任何人类编写的内容。Python解释器是循环中唯一的评判者。 [](https://x.com/UsmanReads/article/2055056973075472880/media/2055052500726931456) https://preview.redd.it/l5c80d0vm61h1.png?width=1200&format=png&auto=webp&s=5474f9a3f0ae632b663db47245c4701dc2d0ff43 # 计划之外的意外 我从Qwen 2.5 7B基础模型开始。用它自己挖掘的配对进行训练。运行HumanEval(一个包含164个编程问题的标准测试集)。基础模型做对了25道。训练后,2道——我让模型变得更差了。第二天我一整天都在用Claude Code和Codex进行配对调试。模型在日志中输出看起来正确的代码。但评分器一直拒绝。我们在凌晨2点左右找到了bug:评分器过早停止,在给模型函数打分之前将其截断了一半。模型写的是完整正确的函数。评分器打分的却是截断的一半。 # 有效的那部分 一旦我修复了它并重新运行,Qwen 2.5 7B基础模型从HumanEval的25题提升到112题。增加了87题。而且这个模型是在零人类编写代码的训练下做到的。所以我尝试了更大的模型。Qwen 2.5 14B基础模型。挖掘了它自己的100个配对。训练。95分钟的H100运行时间,花费3.50美元的云积分。 https://preview.redd.it/dyyuocezm61h1.png?width=1200&format=png&auto=webp&s=30bd5008daffd6e1f690db9d7daf9c45281f2115 [](https://x.com/UsmanReads/article/2055056973075472880/media/2055052295122108416) 这个仅凭自身错误训练的基础模型,与该公司同系列的RLHF版本仅差4分。 [](https://x.com/UsmanReads/article/2055056973075472880/media/2055053685940740096) https://preview.redd.it/6bbb5x12n61h1.png?width=1200&format=png&auto=webp&s=2ff3f3c53649a3eaf13109d4014e6c1956cbda6d 我不相信。所以我运行了一个测试,如果失败就会推翻整个结论。如果模型只是通过以这种格式训练任何数据而变得更聪明呢?我构建了与真实配对相同长度和形状的虚假训练配对,但里面是随机垃圾代码,什么测试都通不过。在这些数据上训练。得分:164题中25题。和基础模型一样。零提升。所以模型并不是因为泛泛的训练而变得更聪明。它变聪明是因为专门在自己的错误和修正上训练。信号是真实的。 现在我更好奇了。这只适用于Qwen,还是也适用于其他模型家族?我试了Meta的Llama 3.2 3B。不同的架构、不同的分词器、不同的训练语料。在自我挖掘32个配对并训练后,HumanEval从39提升到43。提升虽小,但方向正确。这个配方在不同家族间可迁移。 我试了Qwen 2.5 Coder 7B基础模型,它已经是代码专用模型了。自我挖掘后:HumanEval从83到87,MBPP从122到124。即使已经针对代码优化的模型也获得了小幅提升。 我试了Qwen 3,比我一直使用的更新一代。具体是Qwen 3 4B基础模型。应用配方后:HumanEval从79到106(+27题),MBPP从135到148。 https://preview.redd.it/sdufx1a7n61h1.png?width=1200&format=png&auto=webp&s=a122a7ad505bf96a217354433e688f267b318692 [](https://x.com/UsmanReads/article/2055056973075472880/media/2055053974533976064) 不同的架构、不同的世代、不同的供应商。这个配方并非Qwen独有。 # 另一个计划外的意外 然后我更好奇它是否适用于数学。关键在于评判者。Python检查代码。SymPy可以检查数学。同样的循环应该适用。第一次尝试失败了。当我让基础模型自己编数学题时,它生成了简单的算术题。这无法迁移到GSM8K(需要多步推理的小学应用题)。所以我加了一个变通。当模型每次都能解决自己编的题时,下一题必须更难。当它一直失败时,下一题必须更简单。模型逐渐漂移到其能力边缘的问题上。 https://preview.redd.it/uubxde4cn61h1.png?width=1200&format=png&auto=webp&s=4922a14f233814224a9d0da7d3cc2a36739f25ab [](https://x.com/UsmanReads/article/2055056973075472880/media/2055054322338263041) 一个3B模型,在它自己编写的13道数学题上训练后,击败了2022年引爆互联网的ChatGPT版本。 # 然后,是我最引以为豪的发现。 改进模型有两种方式。一种是训练:改变模型本身。另一种是测试时采样:不改变模型,只是多次提问并保留通过测试的答案。我本以为它们会叠加。训练应该让模型变得更好。采样应该给更好的模型更多机会。因此训练加采样应该超过单独采样。但情况并非总是如此。 [](https://x.com/UsmanReads/article/2055056973075472880/media/2055055338848808960) https://preview.redd.it/mmlkmh7fn61h1.png?width=1199&format=png&auto=webp&s=89361ebd350ca17317b5b2902816447c02a6ba10 在100个挖掘配对时,训练和采样相互增强。在36个配对时,它们相互对抗。训练使模型输出多样性大大降低,以至于采样失去了使其有用的多样性。存在一个阈值。我在任何地方都没见过这个结论。如果你的数据集很小,也许不微调而直接对基础模型进行采样效果更好。标准建议(“只要能微调就微调”)在阈值以下是不正确的。这是我最希望其他研究者测试并试图推翻的发现。 以下是不起作用的列表,因为该领域隐藏了这些而本不该: * 在数学上训练(错误答案,然后改正后的答案)毁掉了模型。Qwen 3 4B在MATH-500上从60%跌到14%。只训练修正让模型学会总是怀疑自己,即使它是对的。修复方法:混合一些正确答案保持正确的例子。 * 在代码上训练的配方在数学上几乎无效。GSM8K只提升2题。信号不能跨领域传递。 * 迭代(用训练好的模型挖掘更多,再训练)在第二轮后达到平台期。 * 配方对已经很强的模型无效。Qwen 3 8B、Qwen 3 14B、Qwen 2.5 72B都略有变差。没有足够的错误尝试可供挖掘。 * 配方对太弱的模型也无效。OLMo 2 7B在HumanEval上只有3%,无法产生足够多的正确答案来挖掘。 * HumanEval风格的问题不能迁移到使用如pandas等库的真实世界Python中。完全不同的世界。 [](https://x.com/UsmanReads/article/2055056973075472880/media/2055055753699065856) https://preview.redd.it/1pzr1isgn61h1.png?width=1200&format=png&auto=webp&s=dc7e8153a73d38057ca3ef7925fdb4c867bdea66 # 最难的部分(Coldplay的歌) 整个过程中最难的部分不是数学或代码。而是学会在庆祝之前先怀疑自己的结果。停止标记的bug差点在第一天就毁了整个项目。没有导师来提醒我,我不得不学会做那个提醒自己的人。 一切都是开放的: * 代码和复现指南:[github.com/ranausmanai/tinyforge-zero](https://github.com/ranausmanai/tinyforge-zero) * 14B适配器权重:[huggingface.co/ranausmans/tinyforge-zero-qwen25-14b-lora](https://huggingface.co/ranausmans/tinyforge-zero-qwen25-14b-lora) * 论文:arXiv链接(待审核通过后放出)。
查看原文

相似文章

评估在代码上训练的大型语言模型

OpenAI Blog

OpenAI 推出了 Codex,这是一个在 GitHub 代码上微调的 GPT 模型,在 HumanEval(一个用于从文档字符串进行代码合成的新基准)上实现了 28.8% 的功能正确性,远超 GPT-3(0%)和 GPT-J(11.4%)。该论文表明重复采样可以将性能提升至 70.2%(采样 100 次),并讨论了代码生成系统的局限性和更广泛的影响。

用 GPT-4 发现 GPT-4 的错误

OpenAI Blog

OpenAI 推出了 CriticGPT,这是一个基于 GPT-4 的模型,旨在捕捉 ChatGPT 代码输出中的错误。当人类训练员使用 CriticGPT 进行代码审查时,他们的成功率比没有辅助工具的训练员高 60%,解决了随着模型能力不断提升,RLHF 面临的根本局限。

解决数学应用题

OpenAI Blog

OpenAI 训练了一个使用验证器的系统来解决小学数学应用题,准确率达到儿童水平的 90%,性能几乎是微调后的 GPT-3 的两倍。该方法通过训练验证器来评估候选解决方案并选择最佳方案,解决了语言模型在多步推理中的弱点。