Open-Reasoner-Zero 强化学习训练解析:推理模型的 PPO/GRPO 实现与快速上手
【免费下载链接】FactoryBluePrints游戏戴森球计划的**工厂**蓝图仓库项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints
Open-Reasoner-Zero 是一个开源推理强化学习训练系统,它用 PPO 和 GRPO 两种策略优化算法训练大模型做数学、科学问答这类推理任务。下面把它的训练流程、算法差异和实验配置讲清楚,帮你看完一遍源码后不再迷路。
为什么推理任务需要强化学习训练
做推理的模型输出的是"思考过程 + 答案",而答案对不对是一个结果信号,没法像微调那样逐 token 监督。这时候奖励信号的作用类似工厂质检:工人不知道哪一步工序出了错,只知道这批产品过没过检,质检结果反过来调整生产方式。强化学习干的就是这件事——让模型自己生成回答,用奖励分数告诉它"这次答得怎么样",再据此调整策略。Open-Reasoner-Zero 把这个闭环完整实现了,并且支持从 7B 到 32B 的模型规模。
一次训练走一圈:actor 采集、奖励计算、trainer 更新、buffer 回放
读这个项目的源码,最好先跟一遍一次迭代的数据流,而不是按文件顺序看。
- 采集数据:策略(actor)拿着 prompt 去环境里生成回答。相关逻辑在 orz/ppo/actors.py,
BasePPORole负责策略执行与环境交互,是产出训练样本的源头。 - 计算奖励:回答被打分,得到每道题的分数。这些分数在 GRPO 分支下还会做归一化,后面专门讲。
- 更新策略:orz/ppo/trainer.py 里的
RayPPOTrainer是总调度,数据收集、模型更新、评估都归它管。更新时具体改哪些参数,由 orz/ppo/models.py 中定义的策略网络和价值网络决定,模型规模从 14M 一路覆盖到 32B。 - 经验回放:采到的轨迹不会用完即弃,而是先进 orz/ppo/replay_buffer.py 存着,之后按采样规则重新利用,提高每份数据的学习效率。
整套东西跑在多卡上靠的是 orz/exp_engine/parallels/orz_distributed_c10d.py 的分布式封装,组件之间的通信都从这里走。
PPO 与 GRPO 的差别:两种不同的"防翻车"机制
PPO 是这套系统的基础算法,核心手段是给策略更新装一个"安全阀":clip_eps(默认 0.2)限制每次参数更新的幅度,防止新策略和旧策略差太远导致训练崩掉。
def __init__(self, clip_eps: float = 0.2) -> None: self.clip_eps = clip_eps翻译成人话:每一步更新都先跟旧策略比一比,改得超过 20% 的"步子"会被削回边界内,更新稳但慢。
GRPO 的思路不同,它动的是奖励本身:对同一道 prompt 采出的多个回答,先减去均值再除以标准差,把奖励拉回同一尺度。这段逻辑在 playground/orz_7b_ppo.py 里:
scores[i] -= np.mean(pass_at_n_dict[prompt]) if std := np.std(pass_at_n_dict[prompt]) > 0: scores[i] /= std也就是说,一道题上"比同题的平均表现好多少"才是信号,而不是绝对分数——难一点的题分数天然低,归一化后不会把它的信号淹没掉。
| PPO | GRPO | |
|---|---|---|
| 稳定训练的手段 | clip_eps限制策略更新幅度 | 按 prompt 归一化奖励(减均值、除标准差) |
| 干预的对象 | 参数更新这一步 | 奖励信号本身 |
| 解决的问题 | 新策略偏离旧策略太远 | 不同题目奖励尺度不一 |
| 开关方式 | 默认开启 | 配置里use_grpo控制,同时记录grpo_raw_reward原始奖励 |
两者不冲突,可以看作从两个方向同时压住训练方差:一个管"步子别迈大",一个管"尺子先校准"。
数据说了什么:准确率与训练曲线的两层读法
官方在 figure/teaser.png 里放了 7B 和 32B 模型在 AIME2024、AIME2025、MATH500、GPQA Diamond 四个数据集上的准确率对比。图上能看到的是:四个数据集的曲线都随训练步数持续上行,且 32B 的曲线整体压在 7B 之上。这说明两件事——一是 RL 训练本身在稳定涨点而不是震荡,二是推理任务上更大的模型能吃到更多强化学习的红利,规模优势没有被算法抵消。
训练曲线(figure/train_curve.png)左图是奖励变化,右图是响应长度。能看到 32B(ORZ-32B)的奖励值和回答长度都明显高于小模型。这里要留意一点:奖励涨和回答变长往往同时出现,说明模型学到的不只是"更会答",也包括"愿意多推理几步"——长度本身不是目标,但它是策略在探索更复杂推理路径的副作用。
如何配置并运行 7B 模型训练:三步跑起来
第一步,拿代码。
git clone https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints第二步,选实验脚本。playground/ 下按模型规模和算法分好了入口:
- playground/orz_7b_ppo.py:7B 模型 + PPO,日常调参首选,GRPO 开关也在同一套配置里
- playground/orz_7b_grpo.py:7B 模型 + GRPO,验证奖励归一化的效果
- playground/orz_32b_ppo.py:32B 模型 + PPO,需要更多显存和更长的训练时间
第三步,直接跑。以 7B 的 PPO 为例:
python playground/orz_7b_ppo.py脚本自带默认配置,先把这一轮跑通看曲线是否如预期上行,再去改clip_eps、采样数这些超参,比一上来就调参省很多排查时间。
收尾与延伸
Open-Reasoner-Zero 把推理 RL 的两条主线都摆在明面上:PPO 用 clip 限制更新幅度保稳定,GRPO 用奖励归一化让不同难度的题目贡献均衡的信号;组件按"采集—打分—更新—回放"各司其职,分布式封装支撑大模型规模。一个值得动手验证的问题留给你:把 7B 的 PPO 和 GRPO 各训同样的步数,观察原始奖励(grpo_raw_reward)和归一化后奖励的走势差多少,你预期归一化在哪个阶段收益最大——是训练初期还是奖励曲线进入平台期之后?
【免费下载链接】FactoryBluePrints游戏戴森球计划的**工厂**蓝图仓库项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考