快手SRPO:仅用十分之一训练步数复现DeepSeek-R1-Zero数学代码能力

快手SRPO仅用DeepSeek-R1-Zero十分之一训练步数,复现其数学代码能力,秘诀在于两阶段训练和历史重采样策略。

原文标题:业内首次! 全面复现DeepSeek-R1-Zero数学代码能力,训练步数仅需其1/10

原文作者:机器之心

冷月清谈:

快手Kwaipilot团队提出了一种新的强化学习框架——两阶段历史重采样策略优化(SRPO),旨在解决大规模强化学习在训练LLM时遇到的挑战,如跨领域泛化、训练效率低下和性能饱和等问题。SRPO通过两阶段训练(先数学后代码)和历史重采样技术,有效提升了模型的推理能力和训练效率。实验结果表明,SRPO在数学和代码基准测试中均取得了优异成绩,且仅需DeepSeek-R1-Zero十分之一的训练步数。该研究还观察到模型涌现出自我反思、纠正和回溯等类人认知过程,并学会自发使用程序代码进行验证。SRPO的成功为构建更强大的推理模型提供了重要的参考。

怜星夜思:

1、SRPO的两阶段训练,先数学后代码,背后的逻辑是什么?为什么不是先代码后数学,或者同时进行?
2、文章中提到的“历史重采样(History Resampling)”策略,是如何提高训练效率的?它和DAPO中提出的Dynamic Sampling 方法相比有什么优势?
3、从文章来看,SRPO训练后的模型似乎具备了一定的“自我反思”能力。你认为这种“自我反思”能力,对于LLM的未来发展有什么意义?

原文内容

机器之心发布

机器之心编辑部


OpenAI 的 o1 系列和 DeepSeek-R1 的成功充分证明,大规模强化学习已成为一种极为有效的方法,能够激发大型语言模型(LLM) 的复杂推理行为并显著提升其能力。

然而,这些推理模型的核心训练方法在其技术报告中仍然鲜有披露。近期社区的主要工作也仅局限于数学推理领域,使得跨领域泛化这一挑战依然未得到充分探索。此外,GRPO 训练过程中存在多项常见问题,如性能瓶颈、样本利用效率低下,以及在处理混合领域数据集时难以培养专业推理技能等,这些挑战使得强化学习方法的有效扩展变得更加复杂。


针对这些挑战,来自快手Kwaipilot团队的研究者提出了一种创新的强化学习框架——两阶段历史重采样策略优化two-Staged history-Resampling Policy Optimization,SRPO,旨在从多个维度系统性地解决上述训练难题。他们对外发布了SRPO的技术报告,详细披露了该训练方法的技术细节,同时也开源了SRPO-Qwen-32B 模型。



  • 论文标题:SRPO: A Cross-Domain Implementation of Large-Scale Reinforcement Learning on LLM

  • 论文链接:https://arxiv.org/abs/2504.14286

  • 模型开源地址:https://huggingface.co/Kwaipilot/SRPO-Qwen-32B


这是业界首个同时在数学和代码两个领域复现 DeepSeek-R1-Zero 性能的方法。通过使用与 DeepSeek 相同的基础模型 (Qwen2.5-32B) 和纯粹的强化学习训练,SRPO 成功在 AIME24 和 LiveCodeBench 基准测试中取得了优异成绩(AIME24 = 50、LiveCodeBench = 41.6),超越了 DeepSeek-R1-Zero-32B 的表现。


更值得注意的是,SRPO 仅需 R1-Zero 十分之一的训练步数就达到了这一水平。


SRPO AIME24 和 LiveCodeBench 表现,每项为 pass@1 的 32 次平均得分


方法概览


原始 GRPO 实现的挑战


在最开始的探索中,快手 Kwaipilot 团队使用过标准的 GRPO 算法(公式 1)直接进行训练:


公式 1:GRPO 优化目标


然而,在训练过程中,他们很快遇到了瓶颈,模型始终无法达到预期的 R1-Zero 性能水平。这些问题包括:


  1. 数学与代码跨领域的优化冲突:数学问题很容易通过训练诱发较长且细致的推理轨迹(长 CoT),而代码数据这种倾向则弱很多。直接混合这两种类型的数据也会产生冲突,导致模型在两个领域中都表现欠佳。  

  2. 相同的组奖励导致训练效率下降:GRPO 算法依赖于采样组内非零的奖励方差来计算优势。当一个组的 rollout 产生几乎相同的奖励值时,计算得到的优势会接近于零。当一个训练 batch 的大部分数据都表现出这种现象时,有效的梯度贡献会变得极小,大幅降低训练效率。

  3. 过早的性能饱和:GRPO 训练在 benchmark 评测中较早遇到了性能瓶颈,奖励也遇到饱和平台期。这个问题一定程度上源于数据集的质量不足。当训练数据缺乏足够的复杂性或多样性,特别是简单的问题太多,模型会倾向于保守地维持其在较容易任务中的性能,难以得到解决挑战性问题所需的复杂、深入的推理能力。


阶段训练


为了解决数学和代码之间内在的响应长度冲突问题,快手 Kwaipilot 团队最终实现了一种两阶段训练范式:


    • Stage 1 (Eliciting Reasoning Abilities):初始训练阶段仅专注于具有挑战性的数学数据。此阶段的目标是充分激励模型的 test-time scaling,发展出反思性停顿、回溯行为和逐步分解等多种能力。

    • Stage 2 (Skill Integration):在此阶段,将代码数据引入到训练过程中。利用在阶段 1 中建立的推理基础,进一步提升代码能力,同时逐步强化程序性思维、递归和工具调用能力。


    训练策略的比较分析


    不同训练数据策略对响应长度的影响


    Mixed Training在数学和代码混合数据上训练的混合训练模型,在响应长度的增长方面表现出局限性,且基准测试性能较差。虽然数学问题会引发一些推理模式,但代码问题经常产生简短、直接的响应,主要集中于即时代码输出,而很少进行初步分析或规划。



    Math-Only Training:仅使用数学数据进行训练能够稳定地增加回复长度,并在数学基准测试中表现出色。重要的是,这培养了强大的、能够很好地泛化的推理能力;当面对编程任务时,模型会尝试详细的、逐步的推理。观察到的行为包括在数学问题解决过程中细致的步骤检查和重新审视。这反映了数学数据激发推理能力的特征。



    Code-Only Training:尽管在代码基准测试中的表现有所提高,但显式推理行为的发展甚微,并且实现响应长度的显著增加被证明是困难的。与纯数学训练相比,对代码和数学问题的响应都明显较短,代码任务的解决方案通常是直接生成的,缺乏实质性的逐步推理或初步分析。



    Staged Training快手 Kwaipilot 团队提出的两阶段训练在数学和编程领域均表现出优异的结果。该模型在解决数学问题时始终如一地生成详细的逐步推理模式,并在处理编程任务时生成结构化的推理模式。特别地,涌现出一些复杂的行为,例如模型自发地利用写代码来辅助数学推理。对这些响应模式的更详细分析将在后文中介绍。



    History Resampling


    快手 Kwaipilot 团队发现在训练的中后期阶段,batch 中近 50% 的采样组产生相同的奖励。这种情况通常发生在模型在较容易的问题上持续成功时,导致奖励的方差极小,梯度更新效果不佳。


    在训练期间 batch 内近 50% 的优势函数值为零(蓝色线)


    为了解决这种低效性并提高梯度信号的质量,他们引入了历史重采样(History Resampling)。在训练过程中,他们记录每个 epoch 内所有 rollout 奖励的结果。在一个 epoch 结束时,他们按如下方式重建下一个 epoch 的数据集:


    • 过滤过于简单的样本:排除所有 rollout 都得到正确答案的样本,它们实际上没有为策略改进提供任何信息信号。

    • 保留信息样本:保留结果多样(既有正确又有不正确)或结果全部不正确的样本。这些样本生成正向奖励方差,确保优势非零及梯度信号有效。此外,对于当前 epoch 中所有展开都不正确的困难样本,快手 Kwaipilot 团队也将其保留在数据集中。理由是,这些最初具有挑战性的一些问题,对于更新后的策略而言可能会变得相对容易,从而在后续的训练中产生有效梯度。这种策略的根本思想与课程学习相一致,即逐步将模型暴露于平均而言更具挑战性的样本,以提高训练效率。


      Training statistics of History Resampling


      与 DAPO 中提出的 Dynamic Sampling 方法相比,History Resampling 显著提高了计算效率,响应长度增长也更加稳定。


      数据 


      快手 Kwaipilot 团队对社区开源的 Code&Math 数据进行了数据清洗和筛选,通过启发式规则对原始数据进行过滤,清理题目文本中无关的 URL、格式噪声等,确保核心字段(问题和答案真值)完整。参考 PRIME 对数学数据的清洗方法,剔除一题多问、纯证明题、需要图像或表格理解的题目。针对代码数据,剔除依赖特定环境、需要文件 IO 或网络交互的题目,专注于算法逻辑。


      在数据入库前,对数学和代码题目进行正确性校验,确保答案的正确性和可解性,剔除答案错误或存在歧义的题目;然后判断题目难度,结合通过率(Pass@k)将题目细分为简单、中等、困难三个等级。


      实验结果


      本节详细介绍使用 SRPO 方法的实验结果。快手 Kwaipilot 团队重点观测了训练过程中奖励的变化情况以及响应长度等指标。


      训练过程


      SRPO 的动态训练


      上图展示了 SRPO 的训练完整奖励曲线和响应长度曲线。在奖励增长开始趋于平稳后,整体进入了第 2 阶段的训练。在第 2 阶段开始时,由于模型之前未训练编码能力,总体奖励下降,后续训练导致奖励稳步增加。在整合编码数据后,响应长度并没有显著增加,这与他们的预期一致。同时,基准测试结果表明,该模型的数学和编码能力都有持续和稳定的提高,证明了新方法的有效性。


      具体来说,History Resampling 确保了在每个训练步骤中梯度更新始终有效,从而直接提高了信息梯度的比例。这种提升的采样效率带来了稳定的奖励增长,清晰地展现了重采样策略所实现的训练效率提升。


      思维行为


      快手 Kwaipilot 团队识别出了三种代表性的反思模式。这些模式包括 recheck、hesitation、exploration。他们对包含这种模式的响应进行统计,并记录这几种模式的平均响应长度。在 RL 训练过程中,他们观察到模型的自我反思、纠正和回溯频率逐渐增加。这表明模型展现了「自我验证」能力。他们认为模型在RL中涌现出类似人类认知过程的「反思」,是模型在策略优化过程中的适应性行为。


      在训练过程中不同的 aha 模式出现的频次变化


      如上图所示,在模型训练的早期阶段,模型几乎没有主动检查和反思先前推理步骤。然而,随着训练的进行,模型表现出明显的反思和回溯行为,形成如逐步推理、数值替换、逐一验证和自我优化等响应模式。


      自我校正的例子


      数值替换(绿色)和逐个验证(红色)


      自我优化


      同时,他们还发现了有趣的现象:模型在解决数学问题时,学会了自发使用程序代码进行验证。它首先通过数学推理给出解题过程,随后主动编写程序代码验证方案的正确性。这类案例体现了模型会借助程序性思维进行自我纠错和多次尝试。这一现象也进一步表明,在训练后期,模型已经掌握了广泛思考和综合运用多种代码思维进行问题求解的能力。



      结论与展望


      本文介绍了 SRPO,这是首个在数学与代码领域成功复现 DeepSeek-R1-Zero-Qwen-32B 的工作。快手 Kwaipilot 团队提出了一种创新的两阶段训练范式,利用训练过程中的历史重采样策略,同时设计了专为数学与代码联合强化学习(RL)训练定制的数据整理流程(pipeline)。这些方法为社区构建更强大的推理模型提供了重要参考。未来,团队将继续探索更大规模的数据与模型、更加高效的强化学习算法,以及其在更广泛推理场景中的应用潜力。


      © THE END 

      转载请联系本公众号获得授权

      投稿或寻求报道:[email protected]

      从实验数据来看,数学训练确实能提升模型的推理能力,使其在面对编程任务时也能进行详细的推理分析。可能是因为数学对逻辑推理的要求更高,而编程更多是语法和工具的使用。所以,先让模型掌握推理的“底层能力”,再学习编程的“应用技巧”,可能更有效率。

      与其说是“自我反思”,不如说是模型在学习过程中学会了一种“验证”机制。它可以通过不同的方式去验证自己的答案,从而提高正确率。但这并不意味着它真的理解了问题或者答案背后的逻辑。我认为,未来的LLM需要具备真正的理解能力,而不仅仅是验证能力。当然,SRPO在这方面已经迈出了重要的一步。

      我理解的历史重采样有点像“错题本”机制。模型做对的题就相当于已经掌握的知识,不用再练了;做错的题或者模棱两可的题,才是需要重点攻克的。这种针对性训练,当然比眉毛胡子一把抓的训练方式更有效率。DAPO我不太了解,但感觉历史重采样更像是对训练数据的一种精细化管理,思路比较直接。

      如果LLM真的能“自我反思”,那意义可太大了!这意味着LLM不再只是一个简单的“执行者”,而开始具备一定的“思考”能力。它可以自己检查错误、优化方案,甚至发现新的知识。这会让LLM更加可靠、高效,应用场景也会更加广泛。想象一下,一个可以自我调试的AI系统,是不是很酷?

      这问题问到点子上了!我理解是这样:数学训练能更好地激发LLM的推理能力,就像打地基一样。代码能力可以在这个基础上快速搭建。如果先学代码,模型可能就只会“套路”了,缺乏深度思考。同时进行的话,两种数据类型可能会互相干扰,导致效果不佳。

      楼上说的“错题本”很形象!补充一点,历史重采样不仅仅关注错误的样本,还关注那些“有争议”的样本,也就是模型有时做对,有时做错的样本。这些样本可能包含了重要的边界信息,对模型的泛化能力有帮助。相比之下,DAPO可能更侧重于动态调整采样概率,但从文章来看,历史重采样的效果更好。

      个人觉得这个顺序和人类学习过程也比较相似。孩子通常先学习数学的逻辑思维,之后再学习编程。这种方式可能更符合认知规律。而且,数学的训练数据也更容易获取和清洗,可以为后续的代码训练打下基础。

      我觉得这个“自我反思”更多的是一种涌现现象,是模型在大量数据和强化学习的共同作用下产生的。它可能并不像人类的自我意识那么复杂,但确实代表了LLM发展的一个重要方向。如果能进一步研究这种“自我反思”的机制,并加以引导和控制,或许能开发出更智能、更强大的AI系统。