DeepSeek-R1 技术解析(二):GRPO 算法是怎么工作的,以及 R1-Zero 的自我进化
上一篇文章提到,DeepSeek-R1-Zero 没有用传统的 PPO 算法,而是用了一种叫 GRPO(Group Relative Policy Optimization) 的算法。
要理解 GRPO 为什么被选中,得先搞清楚 PPO 在训练大模型时到底有什么问题。
PPO 的笨重之处
PPO 是 2017 年由 OpenAI 提出的,在游戏、机器人控制等 RL 场景里表现很好,后来被广泛用来做大模型的 RL 对齐。
PPO 的框架里需要四个模型同时参与:
- 策略模型(Actor):你要训练的那个模型,负责生成回答
- 参考模型(Reference):训练前的策略模型快照,用来约束策略模型别跑偏
- 奖励模型(Reward Model):给策略模型的输出打分
- 价值模型(Critic):估算每一步的期望收益,用来计算"优势函数(Advantage)"
四个模型里,价值模型的规模通常跟策略模型差不多大。DeepSeek-V3 是 671B 参数,光策略模型就吃满了显存。再加一个同样量级的价值模型,训练成本直接翻倍。对于大多数团队来说,这个开销承受不了。
这不是唯一的问题。价值模型在长推理场景下,本身就很难训准。
模型在做推理题的时候,经常写到一半发现自己之前想的思路有问题,又返回去改。前面的输出和最终答案之间的关系非常曲折——前面写的好几段可能在最后被推翻了。在这种情况下,让价值模型从半截的输出来预测最终得分,相当于让它在一个高度不确定的环境里做判断。输出越长,这个问题越严重。
GRPO 怎么省掉价值模型
GRPO 的思路很直接:既然价值模型又贵又不准,不如干脆不用。用组内比较来代替价值估算。
具体做法是:
对于每一道题,让策略模型同时生成一组回答(比如 16 个),每个回答都拿一个奖励分。然后把这组回答的奖励分标准化——减去组内均值,除以组内标准差——得到每个回答的相对优势(Advantage)。
优势为正的回答,说明比组内平均水平好,模型往这个方向学。优势为负的,说明不如平均水平,往反方向推。
这样一来,价值模型就被完全省掉了。不需要额外维护一个跟策略模型一样大的神经网络来做价值估算,直接用每组内部的统计量就能算出每个回答好不好。
它的训练目标用公式写出来就三部分:
第一部分是策略比率项——当前策略和旧策略在生成同一个回答时的概率比,乘以优势值。概率比大的说明当前策略更倾向于生成这类回答,结合优势的正负号,决定模型是加强还是削弱这个倾向。
第二部分是裁剪项(Clipping)——限制策略更新幅度,防止一次更新步子迈太大导致训练不稳定。GRPO 里用的裁剪范围是 0.8 到 1.2,意思是一步更新最多让概率比变化 20%。
第三部分是 KL 散度惩罚项——衡量当前策略跟参考策略之间的差异,防止策略模型跑太远。GRPO 的 KL 项直接加在损失函数里,用的是 Schulman 在 2020 年提出的无偏估计器。PPO 的做法则不同——把 KL 惩罚作为密集奖励加到每个 token 上,而 RL 的优化目标是最大化累计奖励,这会隐式地惩罚回答长度,间接抑制了模型生成长推理链。
GRPO 每 400 步会把参考模型更新为当前策略模型的最新快照。这样既允许策略模型在一定范围内探索,又保证了训练的稳定性。
PPO 和 GRPO 的对比实验
论文里用 DeepSeek-Coder-V2-Lite(16B MoE,2.4B 激活参数)在 MATH 任务上做了对比。
PPO 对超参数很敏感,尤其是 GAE(Generalized Advantage Estimation)里的 λ 系数。用大多数开源实现默认的 λ=0.95 时,PPO 的表现明显不如 GRPO。只有把 λ 调到 1.0 之后,PPO 才勉强追到接近 GRPO 的水平。
GRPO 不需要调 λ,因为根本没有价值模型和 GAE。
R1-Zero 训练细节补充
训练模板
R1-Zero 的训练只做了一个最基础的格式约束——要求模型把推理过程放在 <think> 和 </think> 之间,把最终答案放在 <answer> 和 </answer> 之间。
除此之外,对推理过程的内容不做任何约束。不要指定"你要一步一步推理",不要给任何 few-shot 示例,不要预设模型应该怎么想。
这样做的目的很明确:最大程度地观察模型在纯 RL 压力下的自然演化,而不是看人类预设的行为模式。
训练参数再梳理
上一篇文章已经列了一些关键参数,这里补充几个细节:
- 学习率 3e-6,KL 系数 0.001
- 采样温度 1,保持一定的输出多样性,让模型有空间探索不同的推理路径
- 每题 16 个采样,每步 32 道题,每步批大小 512
- 每次 rollout 生成 8,192 个输出,随机分成 16 个小批次,每个小批次只训一轮
- 参考模型每 400 步更新一次
- 总训练步数约 10,400 步,约 1.6 个 epoch
- 最大输出长度:前 8,200 步为 32,768 token,之后提升到 65,536 token
第 8,200 步增大最大输出长度这个操作,直接导致了一个明显的性能跳跃——pass@1 和平均回答长度同时大幅提升。这从侧面验证了一个直觉:给模型更多"思考空间",能力会跟着涨。
奖励设计的细节
总奖励 = 准确性奖励 + 格式奖励,两个等权重。
举个例子:对于数学题,如果模型给出的最终答案是 42,而标准答案也是 42,准确性奖励得 1 分;如果格式也正确,格式奖励也得 1 分,总分 2 分。
代码题的准确性判定通过编译器跑测试用例来完成。逻辑题的大部分是选择题,直接比对选项即可。
论文特别强调了一件事:没有用任何形式的神经网络奖励模型——不管是过程奖励模型(PRM)还是结果奖励模型(ORM),都没有。原因是神经网络奖励模型在大规模 RL 训练中容易被策略模型钻空子,而且维护和重训奖励模型会大大增加训练管线的复杂度。
模型的自我进化:数据里藏着什么
难度分层分析
论文里把 MATH 数据集按难度分了 5 个等级(Level 1 到 Level 5),分别观察 R1-Zero 在各等级上的表现随训练的变化。
简单题(Level 1-3)在训练早期就很快达到了 90%-95% 的准确率,之后基本维持稳定。Level 4 的题从接近 78% 涨到了 95%。最值得注意的是 Level 5——最难的题,从接近 55% 一路涨到了 90%,提升最大。
这说明 RL 训练对不同难度题目的影响是不对等的——越难的题,RL 带来的提升越明显。 容易的题模型本来就会做,RL 的价值体现在让模型啃下了大量它原本做不出来的难题。
有一个表面看起来反直觉的现象:Level 1(最简单)的准确率在某些阶段反而略低于 Level 3-4。论文解释了原因——Level 1 在整个 MATH 数据集里只有 43 道题(总共 500 道),样本量很小,95%-97% 的准确率意味着就错了一两道题,而且主要是几何题。所以不是因为简单题没学好,而是数据集分布不均导致的统计波动。
另外,MATH 的难度等级是按照人类感知的复杂度标注的,不是按照机器学习难度标注的。人类觉得简单的几何题,对模型来说可能反而是难点。
反思行为的量化分析
上一篇文章提到了"反思类词汇"的增长,这里补充一些定量数据。
三个评审专家每人列了一些自己觉得有代表性的反思词汇,合并起来得到了最终列表:wait、mistake、however、but、retry、error、verify、wrong、evaluate、check。
统计这些词在训练过程中的使用频率,结果是从训练开始到结束,使用量涨了约 5 到 7 倍。
更细致的分析发现,"wait"这个词的增长模式很有意思。训练早期(前 4,000 步),"wait"几乎没出现过。4,000 到 7,000 步之间,偶尔出现几次。8,000 步之后,出现了非常显著的尖峰。
这说明不同的反思行为是在训练的不同阶段出现的,而不是同时发生的。 模型先学会了一些基本的反思模式,然后在某个阶段突然"发现"了更复杂的反思策略——比如在推导过程中主动打断自己,说"等等,这里不对,重新来"。
这就是论文里那个"aha moment"的量化背景。它不是文学修辞,而是训练数据里真实发生的变化。
小结
GRPO 是对 PPO 的一个务实改进——砍掉价值模型,用组内统计量估算优势,KL 惩罚直接放进损失函数而不是加到每个 token 上。这套设计让大规模 MoE 模型的 RL 训练变得可行,而且不容易抑制长推理链的形成。
R1-Zero 在纯 RL 训练中展现出的自我进化——反思、验证、回溯——说明了一个更底层的东西:推理策略不一定需要人类来设计。一个足够强的基座模型加上可靠的奖励信号,可以自己"发现"这些策略。
更多推荐


所有评论(0)