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 实现的挑战
在我们最开始的探索中,我们使用过标准的 GRPO 算法(公式 1)直接进行训练:
公式 1:GRPO 优化目标
然而,在训练过程中,我们很快遇到了瓶颈,模型始终无法达到预期的 R1-Zero 性能水平。这些问题包括:
- 数学与代码跨领域的优化冲突:数学问题很容易通过训练诱发较长且细致的推理轨迹(长 CoT),而代码数据这种倾向则弱很多。直接混合这两种类型的数据也会产生冲突,导致模型在两个领域中都表现欠佳。
- 相同的组奖励导致训练效率下降:GRPO 算法依赖于采样组内非零的奖励方差来计算优势。当一个组的 rollout 产生几乎相同的奖励值时,计算得到的优势会接近于零。当一个训练 batch 的大部分数据都表现出这种现象时,有效的梯度贡献会变得极小,大幅降低训练效率。
- 过早的性能饱和:GRPO 训练在 benchmark 评测中较早遇到了性能瓶颈,奖励也遇到饱和平台期。这个问题一定程度上源于数据集的质量不足。当训练数据缺乏足够的复杂性或多样性,特别是简单的问题太多,模型会倾向于保守地维持其在较容易任务中的性能,难以得到解决挑战性问题所需的复杂、深入的推理能力。
阶段训练
为了解决数学和代码之间内在的响应长度冲突问题,我们最终实现了一种两阶段训练范式:
Stage 1 (Eliciting Reasoning Abilities):初始训练阶段仅专注于具有挑战性的数学数据。此阶段的目标是充分激励模型的 test-time scaling,发展出反思性停顿、回溯行为和逐步分解等多种能力。
Stage 2 (Skill Integration):在此阶段,将代码数据引入到训练过程中。利用在阶段 1 中建立的推理基础,进一步提升代码能力,同时逐步强化程序性思维、递归和工具调用能力。
训练策略的比较分析
不同训练数据策略对响应长度的影响
Mixed Training:在数学和代码混合数据上训练的混合训练模型,在响应长度的增长方面表现出局限性,且基准测试性能较差。虽然数学问题会引发一些推理模式,但代码问题经常产生简短、直接的响应,主要集中于即时代码输出,而很少进行初步分析或规划。
Math-Only Training:仅使用数学数据进行训练能够稳定地增加回复长度,并在数学基准测试中表现出色。重要的是,这培养了强大的、能够很好地泛化的推理能力;当面对编程任务时,模型会尝试详细的、逐步的推理。观察到的行为包括在数学问题解决过程中细致的步骤检查和重新审视。这反映了数学数据激发推理能力的特征。
Code-Only Training:尽管在代码基准测试中的表现有所提高,但显式推理行为的发展甚微,并且实现响应长度的显著增加被证明是困难的。与纯数学训练相比,对代码和数学问题的响应都明显较短,代码任务的解决方案通常是直接生成的,缺乏实质性的逐步推理或初步分析。
Staged Training: 我们所提出的两阶段训练在数学和编程领域均表现出优异的结果。该模型在解决数学问题时始终如一地生成详细的逐步推理模式,并在处理编程任务时生成结构化的推理模式。特别地,涌现出一些复杂的行为,例如模型自发地利用写代码来辅助数学推理。对这些响应模式的更详细分析将在后文中介绍。
History Resampling
我们发现在训练的中后期阶段,batch 中近 50% 的采样组产生相同的奖励。这种情况通常发生在模型在较容易的问题上持续成功时,导致奖励的方差极小,梯度更新效果不佳。
在训练期间 batch 内近 50% 的优势函数值为零(蓝色线)
为了解决这种低效性并提高梯度信号的质量,我们引入了历史重采样(History Resampling)。在训练过程中,我们记录每个 epoch 内所有 rollout 奖励的结果。在一个 epoch 结束时,我们按如下方式重建下一个 epoch 的数据集:
- 过滤过于简单的样本:排除所有 rollout 都得到正确答案的样本,它们实际上没有为策略改进提供任何信息信号。
- 保留信息样本:保留结果多样(既有正确又有不正确)或结果全部不正确的样本。这些样本生成正向奖励方差,确保优势非零及梯度信号有效。此外,对于当前 epoch 中所有展开都不正确的困难样本,快手 Kwaipilot 团队也将其保留在数据集中。理由是,这些最初具有挑战性的一些问题,对于更新后的策略而言可能会变得相对容易,从而在后续的训练中产生有效梯度。这种策略的根本思想与课程学习相一致,即逐步将模型暴露于平均而言更具挑战性的样本,以提高训练效率。
Training statistics of History Resampling
与 DAPO 中提出的 Dynamic Sampling 方法相比,History Resampling 显著提高了计算效率,响应长度增长也更加稳定。
数据
我们对社区开源的 Code&Math 数据进行了数据清洗和筛选,通过启发式规则对原始数据进行过滤,清理题目文本中无关的 URL、格式噪声等,确保核心字段(问题和答案真值)完整。参考 PRIME 对数学数据的清洗方法,剔除一题多问、纯证明题、需要图像或表格理解的题目。针对代码数据,剔除依赖特定环境、需要文件 IO 或网络交互的题目,专注于算法逻辑。
在数据入库前,对数学和代码题目进行正确性校验,确保答案的正确性和可解性,剔除答案错误或存在歧义的题目;然后判断题目难度,结合通过率(Pass@k)将题目细分为简单、中等、困难三个等级。
数据清洗过程
奖励设计
为了缓解由奖励模型引起的 hacking 问题,我们使用类似 Deepseek R1 的基于规则的奖励系统设计,将最终奖励分为格式奖励和准确性奖励。
对于格式奖励𝑅𝑓𝑜𝑟𝑚𝑎𝑡,我们要求模型的最终答案严格遵循 "answer" 格式。遵守格式可获得 0.2 的奖励。此外,模型响应中出现的任何代码转换或混合使用多种语言的情况都将导致惩罚项:𝑃𝑒𝑛𝑎𝑙𝑡𝑦mix = -0.1。
对于准确性奖励,我们分别评估数学和编码任务。在数学任务中,我们使用数学验证工具来验证正确性。如果答案完全正确且等价,我们给予满分 1 分。在答案部分正确的情况下(例如,模型在多项选择题中仅选择一个正确选项),我们给予部分分数 0.2 分。完全错误的答案得 0 分。奖励 R 是格式奖励、准确率奖励和负面惩罚的组合结果:
二、实验结果
本节详细介绍使用 SRPO 方法的实验设置与实验结果。包括训练配置和关键超参数,以及相应的优化方法。我们重点观测了训练过程中奖励的变化情况以及响应长度等指标。
实验设置
我们使用 Qwen-2.5-Base-32B 作为初始检查点,并使用 AdamW 优化器(β = [0.9, 0.95]) 以 1e-6 的恒定学习率进行训练,没有设置权重衰减。我们使用 vLLM 作为 rollout 推理框架,每步采样 256 个 prompt,每个 prompt 采样个 32 个 rollout,小批量大小为 8,192 个,用于 on-policy RL 训练。第 1 阶段训练运行 840 个步骤,然后是第 2 阶段。在每个 epoch 之后,通过 History Resampling 实现动态采样。
具体来说,我们应用了 token-level loss,并将超过最大响应长度(10,000 个 token)的 reward 设置为零,以防止长度偏差被裁剪。此外,考虑到推理模式和 base 模型之间的显著分布差异,我们从 GRPO 损失函数中删除了 KL 项以鼓励探索。训练过程
SRPO 的动态训练
上图展示了 SRPO 的训练完整奖励曲线和响应长度曲线。在奖励增长开始趋于平稳后,我们进入了第 2 阶段的训练。在第 2 阶段开始时,由于模型之前未训练编码能力,总体奖励下降,后续训练导致奖励稳步增加。在整合编码数据后,响应长度并没有显著增加,这与我们的预期一致。同时,基准测试结果表明,该模型的数学和编码能力都有持续和稳定的提高,证明了我们方法的有效性。
具体来说,History Resampling 确保了在每个训练步骤中梯度更新始终有效,从而直接提高了信息梯度的比例。这种提升的采样效率带来了稳定的奖励增长,清晰地展现了重采样策略所实现的训练效率提升。
思维行为
我们识别出三种代表性的反思模式。这些模式包括 recheck、hesitation、exploration。我们对包含这种模式的响应进行统计,并记录这几种模式的平均响应长度。在 RL 训练过程中,他们观察到模型的自我反思、纠正和回溯频率逐渐增加。这表明模型展现了“自我验证”能力。我们认为模型在 RL 中涌现出类似人类认知过程的“反思”,是模型在策略优化过程中的适应性行为。
在训练过程中不同的 aha 模式出现的频次变化
如上图所示,在模型训练的早期阶段,模型几乎没有主动检查和反思先前推理步骤。然而,随着训练的进行,模型表现出明显的反思和回溯行为,形成如逐步推理、数值替换、逐一验证和自我优化等响应模式。
自我校正的例子
数值替换(绿色)和逐个验证(红色)
自我优化
同时,他们还发现了有趣的现象:模型在解决数学问题时,学会了自发使用程序代码进行验证。它首先通过数学推理给出解题过程,随后主动编写程序代码验证方案的正确性。这类案例体现了模型会借助程序性思维进行自我纠错和多次尝试。这一现象也进一步表明,在训练后期,模型已经掌握了广泛思考和综合运用多种代码思维进行问题求解的能力。
三、结论与展望
本文介绍了 SRPO,这是首个在数学与代码领域成功复现 DeepSeek-R1-Zero-Qwen-32B 的工作。快手 Kwaipilot 团队提出了一种创新的两阶段训练范式,利用训练过程中的历史重采样策略,同时设计了专为数学与代码联合强化学习(RL)训练定制的数据整理流程(pipeline)。这些方法为社区构建更强大的推理模型提供了重要参考。未来,团队将继续探索更大规模的数据与模型、更加高效的强化学习算法,以及其在更广泛推理场景中的应用潜力。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。