笔记日期: 2026-06-02
笔记作者: Zhongzhu Zhou
论文标题: REINFORCE++: Stabilizing Critic-Free Policy Optimization with Global Advantage Normalization
作者: Jian Hu, Jason Klein Liu, Haotian Xu, Wei Shen 等
arXiv: 2501.03262(v9,2025 年 11 月)
状态: 预印本 — 已被 OpenRLHF、TRL、Seed1.5-Thinking、DAPO、ScaleRL 等广泛采用
一句话总结
REINFORCE++ 证明了 GRPO 家族的局部优势归一化是有偏估计量(分子与分母统计相关),用覆盖整个训练批次的全局批次归一化替代它,从而消除偏差、稳定训练、防止 prompt 级别过拟合,在复杂推理任务上超越了包含完整批评家网络的 PPO。
前置知识
什么是 RLHF?为什么需要它?
预训练语言模型通过预测下一个 token 来学习互联网文本的分布。这个分布既包含有帮助的内容,也包含有害、错误、不友好的内容。监督微调(SFT)可以部分解决这个问题,但受限于标注数据的质量和覆盖范围。
人类反馈强化学习(RLHF)的思路是:训练一个奖励模型 (用人类偏好数据训练的神经网络,评分”对 prompt 的回复 有多好”),然后用强化学习优化语言模型策略 ,让它生成奖励模型评分更高的回复。
RLHF 的三个关键阶段:
- 预训练 → 大型语言模型
- 奖励模型训练 → 在人类偏好对 上训练( 优于 ),使用 Bradley-Terry 模型:
- RL 微调 → 最大化
KL 散度惩罚防止策略”奖励黑客”——找到奇怪的输出骗取奖励模型高分,但偏离了正常语言分布。
策略梯度定理
理解优势函数估计方法,需要先理解策略梯度定理。
对于参数化策略 ,期望奖励关于 的梯度是:
其中 是从第 步起的累积回报(在 LLM RLHF 中,奖励只在最后给出,所以 对所有 成立)。
用对数导数技巧:,可以把期望转化为从样本估计的形式。
方差缩减——基线减法: 可以从 中减去任意常数基线 而不引入偏差(因为 ):
就是优势函数 :实际回报比基线高多少?
近端策略优化(PPO)
PPO 是 RLHF 的主流 RL 算法,使用演员-批评家架构:策略网络 (演员)和价值/批评家网络 (估计未来期望回报)。
PPO 的代理目标函数:
其中 是新旧策略的概率比。
clip 函数限制更新幅度:如果 偏离 1 太远(策略变化过大),就裁剪目标函数,防止过大更新。
优势 通过广义优势估计(GAE) 计算,使用批评家网络 :
其中 是时序差分误差, 是折扣因子, 是偏差-方差权衡参数。
GAE 的直觉: 是单步 TD 估计(低方差,高偏差); 是完整蒙特卡洛回报(无偏差,高方差);中间值 平衡两者。
批评家的代价: 批评家网络参数量与策略网络相当,意味着显存翻倍、计算量大幅增加,在百亿参数级别的 LLM RLHF 中代价极高。
免批评家方法:ReMax、RLOO、GRPO
为避免批评家的开销,这类方法直接用奖励估计优势函数。
REINFORCE(Williams, 1992): 最基础的策略梯度,优势 = 总回报 - 固定基线 :
无偏但方差高。
ReMax(Li et al., 2023): 对每个 prompt 额外做一次贪心解码得到 ,作为基线:
直觉:采样回复比贪心回复好就强化它,否则抑制它。
RLOO(Ahmadian et al., 2024): 每个 prompt 采样 个回复,以其余回复的均值作为留一法基线:
GRPO(Shao et al., 2024): DeepSeekMath 和 DeepSeek-R1 使用的算法。每个 prompt 采样 个回复,用组内均值和标准差做 z-score 归一化:
GRPO 在 DeepSeek-R1 的推理训练中大放异彩,但 REINFORCE++ 证明它存在根本性的数学缺陷。
这篇论文做了什么?
REINFORCE++(arXiv 2501.03262,2025 年 1 月首发,v9 2025 年 11 月)有三个核心贡献:
- 定理证明(附录 A): GRPO 的逐 prompt 局部归一化对任意有限组大小 都是有偏估计量。
- REINFORCE++ 算法: 用全局批次归一化替代局部归一化;(通用 RLHF,最大效率)和 (推理任务,同一全局归一化原则)均支持。
- REINFORCE++w/Baseline 算法: 针对 的复杂任务,在全局归一化前先做组均值减法(奖励重塑),并使用理论上正确的 KL 估计量。
方法深入解析
GRPO 局部归一化的三大缺陷
图 1:PPO 与免批评家 RLHF 方法架构对比
flowchart LR
subgraph PPO["PPO(演员-批评家)"]
A1[策略模型 π_θ] -->|采样回复 o| B1[奖励模型 R]
A1 --> C1["批评家网络 V_φ\n(参数量≈策略模型)\n⚠️ 显存翻倍!"]
B1 --> D1["GAE 优势 Eq.2\nA_t = Σ(γλ)^l δ_{t+l}"]
C1 --> D1
D1 --> A1
end
subgraph GRPO["GRPO(局部归一化)"]
A2[策略模型 π_θ] -->|"每个 prompt 采\n样 k 个回复"| B2[奖励模型 R]
B2 -->|"同一 prompt 的\nr_1...r_k"| C2["局部归一化 Eq.3\nA_i = (r_i - mean_组) / std_组\n⚠️ 有偏估计量!"]
C2 --> A2
end
subgraph RF["REINFORCE++(全局归一化)"]
A3[策略模型 π_θ] -->|"采样 1+ 回复\n每个 prompt"| B3[奖励模型 R]
B3 -->|"批次内所有\nprompt 的奖励"| C3["全局归一化 Eq.5\nA_i = (r_i - mean_批次) / std_批次\n✅ 有效无偏"]
C3 --> A3
end
缺陷一:理论有偏性。 优势估计量 是有偏的,因为分子(中心化奖励)和分母 (局部组标准差)统计不独立——二者都依赖于同一 prompt 的同一组 个奖励。下文给出完整证明。
缺陷二:数值不稳定性。 当同一 prompt 的 个回复奖励相近时(简单 prompt 上很常见),局部 ,优势爆炸,训练崩溃。
缺陷三:prompt 级别过拟合。 策略被优化为”比同一 prompt 的其他回复更好”,而非”全局更好”。在小数据集上导致灾难性过拟合:训练集上 95% 的准确率,测试集上 0%(见 Table 2 实验)。
证明:GRPO 的局部优势估计量是有偏的
这是论文附录 A 中 Theorem 1 的完整推导,是整篇论文最核心的理论贡献。
问题设置:
假设我们对某一个 prompt 观测到 个奖励,真实基线为 ,奖励满足:
定义样本均值、样本标准差和优势估计量:
定理 1: 对任意有限 :
即 是有偏估计量。
证明——第一步:分子偏差
改写分子:
在给定 的条件下取期望,利用 时 独立且 :
分子的期望是 的缩放版本,缩放因子 。对 (典型 GRPO 组大小),缩放因子是 。
证明——第二步:分母依赖于
由 ,计算 。
由于 ,展开后:
(交叉项因独立性和零均值消失),以及:
整理得:
关键发现: 中有 这一项——分母 依赖于 !
证明——第三步:相关的分子和分母意味着有偏
由于分子 和分母 都是同一 样本组的函数,且都依赖于 ,它们相关,因此:
(当分子分母相关时,比值的期望不等于期望之比——这是经典的比值估计量偏差。)
偏差的定量感受:
对 较大的极端样本(组内最好或最差的回复),分母 随 增大(由 P4),所以优势 低估了这些极端样本的真实优势。
| 组大小 | 标准化优势 | 偏差比(真实估计量/无偏目标) |
|---|---|---|
| 4 | 0(均值回复) | 1.00(零优势无偏差) |
| 4 | 1(高出 1 个标准差) | ≈ 0.866(低估 13%) |
| 4 | 2(高出 2 个标准差) | ≈ 0.655(低估 35%) |
| 8 | 1 | ≈ 0.935(低估 6.5%) |
| 8 | 2 | ≈ 0.798(低估 20%) |
| 64(全局批次) | 1 | ≈ 0.992(低估 <1%) |
结论: 对典型的 GRPO,组内最优回复(高出均值 2 个标准差)的优势被低估 35%——这意味着最有信息量的训练样本反而接受了最少的梯度强化,严重影响训练质量。全局批次归一化()将偏差降至 1% 以下。
为什么全局归一化修复了问题: 当归一化覆盖 个不同 prompt 时,批次均值 和标准差 是独立 prompt 样本的统计量,与任何单个奖励 渐近独立。因此:
REINFORCE++:全局优势归一化
图 2:REINFORCE++ 训练循环(k=1 变体)
sequenceDiagram
participant D as 数据集 D
participant Policy as 策略模型 π_θ
participant Ref as 参考模型 π_ref
participant Reward as 奖励模型 R
participant Norm as 全局归一化器
loop 每个训练步
D->>Policy: 采样 B 个 prompt {q_1...q_B}
Policy->>Policy: 复制 π_old ← π_θ
Policy->>Reward: 对每个 q_i 生成一个回复 o_i(在 π_old 下)
Reward->>Norm: 计算 r_i = R(o_i, q_i)
Policy->>Norm: 计算逐 token KL: log[π_ref(o_t|...) / π_old(o_t|...)]
Norm->>Norm: A_i = r_i - β·ΣKL(t) [式4 原始优势]
Norm->>Norm: μ = mean(所有token的A_i), σ = std(所有token的A_i)
Norm->>Policy: A_norm = (A_i - μ) / (σ + ε) [式5 全局归一化]
Policy->>Policy: 用 A_norm 通过 PPO 裁剪目标更新 θ
end
REINFORCE++ 的每个 token 的原始优势为:
其中 是逐 token KL 散度, 是 KL 惩罚系数。
设计选择分析: KL 惩罚被直接融入奖励(k1 风格),而非添加为独立损失项。这将 KL 惩罚变成优势信号的一部分,简化目标函数——最终 PPO 更新只需处理一个目标。
然后应用全局批次归一化:
其中 包含批次内所有 prompt 所有 token 的优势。取 ,平均回复长度 512,则共归一化约 52 万个优势值——远胜于 GRPO 每组 4–8 个。
算法 1:REINFORCE++(k=1 完整伪代码)
REINFORCE++(k=1)算法
────────────────────────────────────────────────────────────────
输入:
π_ref — 冻结参考策略(SFT 模型)
R — 奖励模型(Bradley-Terry 或规则型)
D — 训练 prompt 数据集
超参数:
B — 批大小(每步 prompt 数,建议 ≥ 512)
β — KL 惩罚系数(如 0.01–0.1)
ε — 归一化数值稳定常数(如 1e-8)
ε_clip — PPO 裁剪阈值(如 0.2)
k_ppo — 每次 rollout 的 PPO 更新迭代次数(如 1)
M — 总训练步数
初始化:π_θ ← π_ref
for step = 1, 2, ..., M:
─── 数据采集阶段 ───────────────────────────────
1. 采样批次:{q_1,...,q_B} ← 从 D 无放回采样 B 个 prompt
(无放回保证 prompt 多样性)
2. 快照旧策略:π_old ← π_θ
(必须在生成 rollout 前冻结 π_old)
3. 对每个 q_i:
o_i ~ π_old(·|q_i) ← 每个 prompt 只生成一个回复!
(k=1 意味着无组采样——最大化 prompt 多样性)
4. 计算原始优势:
对每个 (q_i, o_i):
r_i = R(o_i, q_i) ← 完整回复的奖励
对每个 token 位置 t = 1...|o_i|:
KL_t = log π_ref(o_t|q_i,o<t) - log π_old(o_t|q_i,o<t)
A_raw(q_i,o_t) = r_i - β × Σ_{s=t}^T KL_s [式4]
(从当前 token 起到序列末尾的未来 KL 累加)
─────────────────────────────────────────────
─── 全局归一化阶段 ──────────────────────────────
5. 将所有原始优势收集到 D_batch:
D_batch = {A_raw(q_i,o_t):所有 i,所有 t}
(大小 ≈ B × 平均长度,如 1024×512 = 52 万个值)
6. 计算全局统计量:
μ = mean(D_batch) ← 标量,对大 B 高度稳定
σ = std(D_batch) ← 标量,对大 B 高度稳定
7. 对每个优势归一化:
A_norm(q_i,o_t) = (A_raw(q_i,o_t) - μ) / (σ + ε) [式5]
─────────────────────────────────────────────
─── PPO 更新阶段 ─────────────────────────────
8. for ppo_iter = 1,...,k_ppo:
对每个 (q_i,o_t):
ratio_t = π_θ(o_t|q_i,o<t) / π_old(o_t|q_i,o<t)
L_t = min(ratio_t × A_norm, clip(ratio_t,1±ε_clip) × A_norm)
L_total = mean(所有 token 和 prompt 的 L_t)
θ ← θ + α × ∇_θ L_total ← 梯度上升(最大化奖励)
─────────────────────────────────────────────
────────────────────────────────────────────────────────────────
逐行解析:
- 第 3 行(k=1): 每个 prompt 只生成一个回复,使批次覆盖 个不同 prompt——最大化 prompt 多样性,防止对特定 prompt 的过拟合。
- 第 4 行(逐 token KL): KL 惩罚在 token 级别计算,确保策略在 token 生成层面靠近参考模型,而非只在回复层面。
Σ_{s=t}^T KL_s表示未来 KL 的累加,用 flip-cumsum-flip 技巧高效实现。 - 第 5–7 行(全局统计): 均值和标准差在批次内所有 token 优势上计算——数十万个值,远比每组 4–8 个稳定。
REINFORCE++w/Baseline:面向复杂推理任务
当任务具有稀疏 0/1 奖励(数学正确性、代码通过率)时, 采样会产生大量零奖励样本,梯度信号很弱。每个 prompt 采样 个回复并用组均值减法过滤无效样本会更有效。
图 3:REINFORCE++w/Baseline 的两步优势计算
flowchart TD
A["采样 k 个回复:o^(1), o^(2), ..., o^(k) ~ π_old"] --> B
B["计算奖励:R^(1), R^(2), ..., R^(k)"] --> C
C["第一步:组均值减法\n(奖励重塑 / 无效样本过滤)\n\nA'_i = R^(i) - mean_组(R^(1)...R^(k))\n\n若所有 R^(j) 相等(无效样本):\n A'_i = 0 → 零梯度,自动过滤!"] --> D
D["第二步:全局批次归一化\n(稳定性 + 有效无偏性)\n\nA_norm_i = (A'_i - mean_批次) / (std_批次 + ε)\n\n使用全局统计量而非组内统计量\n→ 修复 GRPO 的偏差!"] --> E
E["PPO 更新(使用 A_norm_i)\n+\n独立 k2 KL 损失:J_k2 = E[½(log π_θ/π_ref)²]"]
第一步——组均值减法(式 6):
这一步的目的是奖励重塑,而非归一化:
- 无效样本过滤: 如果组内 个回复全部奖励 = 0(没有解出问题),则 ,所有 → 零梯度 → 该 prompt 不影响参数更新。这是正确的:我们没有信息指导策略往哪个方向改进。
- 奖励尺度归一化: 无论奖励在 还是 ,组均值减法后都产生以 0 为中心的优势,使算法对两种奖励格式都有效。
第二步——全局批次归一化(式 7):
组均值减法之后,用全局批次统计归一化。关键在于:这里除以 (由批次内数千个 token 优势计算,高度稳定),而非 (由单个 prompt 的 或 8 个值计算,极不稳定且有偏)。
k2 KL 估计量(式 8):
REINFORCE++w/Baseline 使用独立的 KL 损失项而非将 KL 融入奖励,采用 估计量:
为什么 k2 优于 GRPO 的 k3?
GRPO 使用的 估计量:
这是反向 KL 散度 的一阶泰勒近似。问题: 在 的某些范围内可以为负值,产生不稳定梯度。
估计量 :
- 始终非负 ✓
- 梯度有界且平滑 ✓
- 对反向 KL 提供无偏梯度估计 ✓
- 类似对数比的平方误差损失,与偏差成比例惩罚 ✓
与 PPO 的关系:简化视角
REINFORCE++w/Baseline 等价于去掉批评家网络、用两步全局归一化替换 GAE 的 PPO:
图 4:从 PPO 到 REINFORCE++w/Baseline 的化简步骤
graph TD
A["完整 PPO"] --> B["演员 π_θ\n+ 批评家 V_φ(参数量相当)\n+ GAE:A_t = Σ(γλ)^l δ_{t+l}"]
B --> C["化简步骤:"]
C --> D["1. 移除批评家:V_φ ← 0\n 此时:δ_t = r_t(无自举)"]
D --> E["2. 设 γ=1:不折扣未来\n (RLHF 中奖励只在序列末给出)"]
E --> F["3. 设 λ=1:完整 MC 回报\n A_t = Σ_{l=0}^∞ δ_{t+l} = R(总奖励)"]
F --> G["4. 用全局批次归一化替代学习的价值函数\n 作为更精确、更稳定的基线"]
G --> H["REINFORCE++w/Baseline\n= PPO with V=0, γ=λ=1,\n 全局归一化替代价值函数"]
这个等价关系很有启发性:PPO 的批评家网络估计 (从状态 出发的期望未来回报)。在 RLHF 中,奖励只在序列末给出,所以 ——这基本上就是一个均值基线,而全局批次归一化更准确地估计了这个均值(通过批次统计),而无需训练一个参数量相当的批评家网络。
各方法对比总结
图 5:所有免批评家 RLHF 方法横向对比
graph LR
subgraph Compare["免批评家方法横向对比"]
direction TB
R1["REINFORCE\nA_t = R - b(常数基线)\n偏差:无 方差:高 k=1"]
R2["ReMax\nA_t = R(o) - R(o_贪心)\n偏差:无 方差:中 k=1+1"]
R3["RLOO\nA_t = R(o_i) - mean_其余\n偏差:轻微(有限 k) k≥2"]
R4["GRPO\nA_t = (R - mean_组) / std_组\n偏差:是(已证明)\n稳定性:std→0 爆炸风险\n倾向过拟合"]
R5["REINFORCE++\nA_t = (R + KL) 全局归一化\n偏差:渐近无 稳定:高\nk=1 或 k>1 均可"]
R6["REINFORCE++w/Baseline\nA_t = (R-mean_组+KL)/std_批次\nk2 KL 损失 k>1\n无效过滤:有"]
end
实验
实验一:通用 RLHF——Chat-Arena-Hard
设置: Llama-3-8B-SFT 在 2 万条多样 prompt 上,使用约 70 万条人类偏好对训练的 Bradley-Terry 奖励模型进行训练。评估指标:Chat-Arena-Hard 归一化得分(基于 LLM Judge 的对比排名)。
表 1:通用 RLHF 对比(Chat-Arena-Hard)
| 算法 | 归一化类型 | 每 prompt 样本数 | 得分 | 长度(token) | 每 token 得分 |
|---|---|---|---|---|---|
| REINFORCE++(k=1) | 全局 | 1 | 46.7 | 832 | 0.0561 |
| GRPO(k=4) | 局部 | 4 | 46.8 | 860 | 0.0544 |
| RLOO(k=4) | 留一法 | 4 | 44.6 | 866 | 0.0515 |
| ReMax(k=1+1) | 固定基线 | 1+1 | 45.1 | 805 | 0.0560 |
分析要点:
-
得分与效率的对比: REINFORCE++ (k=1) 以 4 倍更少的样本匹配 GRPO (k=4) 的得分(46.7 vs 46.8),直接意味着 4 倍更低的奖励模型推理成本。
-
长度与奖励黑客: GRPO 产生更长回复(860 vs 832 token)。长度增加是奖励黑客的经典信号——模型学会了”越长越高分”的捷径。全局归一化的稳定性避免了这种行为。
-
KL 动态: REINFORCE++ 在训练过程中 KL 散度显著更低,说明训练后的策略更靠近参考模型——在获得任务收益的同时更好地保留了模型质量。
实验二:小数据集上的灾难性过拟合(AIME-24)
这是最有说服力的实验,直接展示了局部归一化偏差的实际危害。
设置: 仅在 30 条 AIME-24 数学题上训练,在未见过的 AIME-25 题目上评估。
表 2:过拟合实验(训练集 30 道题,测试 AIME-25)
| 算法 | AIME-24 训练 Pass@1 | AIME-25 测试 Pass@1 | AIME-25 测试 Pass@16 |
|---|---|---|---|
| GRPO(局部归一化) | 95.0% | 0.0% | 0.4% |
| REINFORCE++(全局归一化) | 71.0% | 2.5% | 40.0% |
GRPO 发生了什么: 局部归一化让策略优化”比同一 prompt 的其他回复更好”,仅在 30 道训练题上迅速记住解题模式——训练集 95% 的准确率。但底层推理能力没有提升:在未见过的 AIME-25 题目上 0% Pass@1——完全没有泛化。
Pass@16 的差距(0.4% vs 40%)尤其说明问题: GRPO 训练后模型的多样性崩溃——给 16 次机会解一道 AIME-25 题目仍然几乎失败,因为所有 16 个回复都高度相似(模型收敛到了针对训练 prompt 的极度特化策略)。REINFORCE++ 保持了解法多样性,Pass@16 远高于 Pass@1。
机制分析: 局部归一化隐含了一个”与同 prompt 其他回复竞争”的目标,这与”学习可迁移推理技能”不同。全局归一化迫使策略同时在整个批次的多样 prompt 上提升——必须构建真正可迁移的推理能力,而非记忆特定问题的解法模式。
实验三:分布外泛化——K&K 逻辑谜题
Knights and Knaves (K&K) 谜题测试演绎推理。难度随谜题中”人物”数量自然增加(更多人 = 更多约束 = 更难)。测试设置:训练 2–5 人谜题,测试对 6–8 人谜题的泛化。
结果:GRPO 在简单任务(2–3 人)上有竞争力,但在更难的分布外任务(6–8 人)上性能崩溃。REINFORCE++ 在 4 人以上的所有难度级别上都超过 GRPO,平均得分高出 6.4 点(62.1 vs 55.7)。
局部归一化导致策略针对训练题目中的特定难度级别优化,而非构建可扩展到更高难度的通用推理启发。
实验四:复杂长时序工具使用——ZeroTIR
最高难度测试:Qwen-2.5-Base-7B 从零开始(无 SFT 热身,直接 RL)学习使用 Python 工具解决数学问题,涉及多轮工具调用和长时序信用分配。
训练数据来自 ORZ 和 DAPO 数据集。评估:AIME 2024/2025、HMMT Feb 2024/2025、CMIMC,使用 average@32 指标。
表 4:复杂工具使用基准(average@32)
| 算法 | AIME’24 | AIME’25 | HMMT’25 | HMMT’24 | CMIMC | 均值 |
|---|---|---|---|---|---|---|
| GRPO(局部归一化,k>1) | 31.66 | 21.87 | 16.97 | 17.70 | 24.68 | 22.58 |
| PPO(完整批评家) | 30.20 | 21.66 | 15.00 | 18.43 | 23.95 | 21.85 |
| REINFORCE++w/Baseline | 30.83 | 27.18 | 17.91 | 18.95 | 25.62 | 24.10 |
核心结论:
-
REINFORCE++w/Baseline 超越了 PPO(均值 +2.25),且无需批评家网络。这是最核心的标题结论:更简单的算法打败了更重的算法。
-
最大收益在 AIME-2025(最难、最 OOD):比 GRPO 高 +5.31,比 PPO 高 +5.52。证明了全局归一化对困难、泛化任务的特殊价值。
-
无效样本过滤的关键作用: 在从零开始的 RL 训练初期,大量回复完全失败(奖励 = 0)。组均值减法自动给这些无效样本赋予零优势,保持训练稳定——在 GRPO 中,这些无效样本可能产生数值不稳定的非零梯度。
何时使用哪个变体?
图 6:REINFORCE++ 变体选择指南
flowchart TD
A["任务类型"] --> B{"有离散可验证奖励?\n(RLVR:0/1 正确性,\n代码通过率,规则检查)"}
A --> C{"通用 RLHF?\n(Bradley-Terry 奖励模型,\n连续分数,多样 prompt)"}
B -- 是 --> D["REINFORCE++w/Baseline\n- k>1 采样\n- 两步:组均值减法 → 全局归一化\n- k2 KL 估计量\n- 0/1 和 -1/1 均支持\n- 自动无效样本过滤"]
B -- 否 --> C
C -- 是 --> E["REINFORCE++(k=1)\n- 每 prompt 一个回复\n- 仅全局批次归一化\n- KL 融入奖励(k1 风格)\n- 最大化 prompt 多样性\n- 对称 -1/1 奖励效果最佳"]
D --> F["最适合:数学推理、代码、工具使用、\n长时序任务、多轮 agent"]
E --> G["最适合:对话对齐、指令跟随、\nPRM 训练、在线实时 RL"]
经验推荐(来自第三方验证):
- 批次大小 ,建议 以获得稳定全局统计量
- w/Baseline 变体:组大小 –
- KL 系数 –(RLVR 任务用较小值,对话对齐用较大值)
- KL 损失系数 –
限制与边界条件
-
批次大小依赖: 全局归一化依赖大批次()来稳定均值/标准差估计。在 70B+ 参数规模下,每 GPU 批次大小很小,全局统计量可能需要跨多个梯度累积步骤计算,增加实现复杂度。
-
异构奖励尺度: 全局归一化假设批次内所有奖励尺度相当。多任务训练时(如混合数学+代码+安全奖励),若不同任务奖励尺度差异大,可能需要先对各任务奖励单独归一化。
-
k=1 对稀疏奖励不一定最优: 当通过率极低时(如 0.1% 的极难题),k=1 可能产生过多零奖励样本。w/Baseline 的无效样本过滤机制在这种情况下更有效。
-
没有与 Online DPO/SimPO/DAPO 的对比: 论文聚焦于 REINFORCE/PPO 家族,未与 DAPO 等近期方法直接比较(后者也针对 GRPO 不稳定性提出了修复方案)。
批判性分析:不足与可改进之处
不好的地方
(a) 过拟合实验是极端人工场景: Table 2 仅在 30 道 AIME 题上训练——现实 RLHF 部署使用数万到数百万条 prompt。GRPO 的 95%→0% 崩溃令人震惊,但在现实规模下局部归一化的过拟合问题有多严重?论文完全没有给出数据规模缩放实验,使这个结果更像是刻意构造的极端 case,而非代表性场景。
(b) 有效无偏性的量化分析缺失: 论文声称全局归一化”渐近无偏”,但从未测量:在实际常用的 批次大小下,偏差剩余多少?没有偏差-批次大小消融曲线,实践者无法知道需要多大批次才能获得有意义的偏差缩减。
(c) w/Baseline 变体的两个改进未被解耦: REINFORCE++w/Baseline 同时引入了(1)全局标准差替代局部标准差,和(2)k2 KL 估计量替代 GRPO 的 k3。没有 2×2 消融表格分别验证两个改动的贡献。k3→k2 的切换可能贡献了相当大比例的改进,这个问题没有答案。
(d) 对比基线不够全面: 未与 DAPO 直接比较——后者在几乎同期独立发现了 GRPO 类似问题并提出了 token 级别优势裁剪的修复方案。两篇论文都声称修复了 GRPO 的不稳定性,理应直接对比,但两边都回避了这一对比。
作者淡化或回避的局限
(e) 全局 vs. 局部的对立被过度简化: 论文将局部归一化的偏差定性为缺陷,将全局归一化定性为修复。但局部归一化其实做了一件有意义的事:它比较的是”同一问题的不同解法”(苹果比苹果)。全局归一化则是比较”完全不同问题的解法”(苹果比橙子)。当不同 prompt 的内在难度差异很大时,全局统计量的标准差会被难度方差放大,优势信号被稀释。这种权衡没有被讨论。
(f) k=1 效率声明需要细化: 论文称 k=1 比 k=4 GRPO “效率高 4 倍”,但这只计算了奖励模型调用次数。REINFORCE++ (k=1) 需要 4 倍更多的不同 prompt 来维持全局统计量的稳定性(你需要覆盖 个不同 prompt 而非 个 prompt × 4 个回复)。从数据集规模和多样性要求的角度,效率对比并不总是 4 倍。
可以改进的地方
-
添加批次大小消融实验: 在 下训练,测量最终性能。这是最重要的缺失实验,能直接给出最小批次大小的实践指导。
-
2×2 消融表格隔离 w/Baseline 的两个改动: (局部/全局归一化)×(k2/k3 KL 估计量)四组配置在 ZeroTIR 上对比,确定每个改动的独立贡献。
-
数据规模缩放实验: 在 30、100、500、2000、10000 条训练 prompt 下对比 GRPO 与 REINFORCE++,绘制测试准确率-训练集大小曲线,明确局部归一化过拟合在何种规模下变得不重要。
-
与 DAPO 等比较: 在相同计算预算下对比 DAPO、REINFORCE++、GRPO,给出性能-计算量帕累托曲线,让实践者了解什么条件下各算法最优。
-
分析 prompt 难度分布对全局归一化的影响: 混合简单和困难 prompt 时全局统计量的稳定性如何?提出按难度分层的奖励归一化方案。
总结
REINFORCE++ 提出了一个干净的理论论点并配以扎实的实证支持。核心洞见——GRPO 的逐 prompt 归一化创造了有偏、不稳定的优势估计量,全局批次归一化修复了它——简单易懂、易于实现、实际有效。
两变体设计很有针对性:REINFORCE++ (k=1) 针对通用对齐训练,REINFORCE++w/Baseline (k>1) 针对复杂推理任务,覆盖了两种最常见的 RLHF 应用场景。论文清楚地解释了为什么组采样在稀疏奖励下有帮助、在密集连续奖励下可能反而不必要。
该算法已被 OpenRLHF、TRL(HuggingFace 训练库)、Seed1.5-Thinking 和 ScaleRL 的 16,000 GPU 时实验独立验证采用——这种大规模工业采用是对论文核心贡献最有力的现实背书。
主要不足是批次大小消融缺失、KL 估计量贡献未被隔离验证。但核心理论结果正确,方法在实践中有效。对于今天(2025–2026)构建 RLHF 系统的任何人而言,REINFORCE++ 是对 GRPO 的一个简单、有理论保证的直接替代,额外带来稳定性和泛化性,没有任何代价。
参考文献
- REINFORCE++(2025): Jian Hu 等,arXiv:2501.03262v9
- PPO(2017): Schulman 等,arXiv:1707.06347
- GAE(2018): Schulman 等,arXiv:1506.02438
- GRPO / DeepSeekMath(2024): Shao 等,arXiv:2402.03300
- RLOO(2024): Ahmadian 等
- ReMax(2023): Li 等,arXiv:2310.10505
- InstructGPT / RLHF(2022): Ouyang 等,arXiv:2203.02155
- DPO(2023): Rafailov 等,NeurIPS 2023
- DAPO(2025): Yu 等,arXiv:2503.14476
- OpenRLHF(2024): Hu 等,arXiv:2405.11143
- ScaleRL(2025): Khatri 等,arXiv:2510.13786
- DLER(2025): Liu 等,arXiv:2510.15110
- LitePPO(2025): Liu 等,arXiv:2508.08221
- VAPO(2025): Yue 等,arXiv:2504.05118
- DeepSeek-R1(2025): Guo 等,arXiv:2501.12948
- KL 正则化分析(2025): Liu 等,arXiv:2510.01555
- Agent RL 规模法则(2025): Mai 等,arXiv:2505.07773
可复现性说明
REINFORCE++ 已在 OpenRLHF(arXiv 2405.11143)和 TRL(HuggingFace 训练库)中开源实现,两者都是业界广泛使用的 RLHF 框架。代码可以直接运行,无需重新实现。
想快速上手的读者建议从 OpenRLHF 入手:设置 advantage_normalize=global 并将 num_generations 调为 1 即可体验最基本的 REINFORCE++ (k=1) 变体。
OpenRLHF 中的关键配置项:
| 配置项 | 默认值 | REINFORCE++ 推荐值 | 说明 |
|---|---|---|---|
advantage_normalize | local(GRPO 风格) | global | 核心改动 |
kl_estimator | k3 | k2 | 仅 w/Baseline 变体 |
num_generations | 4 | 1(基础)或 4–8(w/Baseline) | 每 prompt 采样数 |
train_batch_size | 256 | ≥ 512 | 全局统计量稳定性 |
kl_coef | 0.1 | 0.01–0.1(任务相关) | KL 惩罚强度 |
复现 Table 1(通用 RLHF)的关键信息:
- 基础模型:Llama-3-8B-SFT
- 奖励模型:Bradley-Terry,~70 万条偏好对训练
- 训练集:2 万条多样 prompt
- 框架:OpenRLHF
- 评估:Chat-Arena-Hard(LLM Judge 比较排名)
- 关键区别:k=1(无组采样)+ 全局批次归一化
复现 Table 4(ZeroTIR 工具使用)的关键信息:
- 基础模型:Qwen-2.5-Base-7B(无 SFT 初始化,RL from Zero)
- 训练数据:ORZ(arXiv:2503.24290)+ DAPO 数据集
- 环境:ZeroTIR(Python 工具调用,数学解题)
- 评估:average@32(32 次独立采样的平均准确率)
- 框架:OpenRLHF,使用 REINFORCE++w/Baseline 配置
附录:偏差量化计算
前置定义同正文证明,这里给出偏差比的完整推导。
对于 GRPO 优势估计量 ,近似偏差比(真实估计期望 / 无偏归一化目标 ):
这个公式揭示了偏差的两个关键特性:
-
偏差随 增大而增大: 越好(或越差)的回复,优势被低估得越严重。最有信息量的训练样本受影响最大。
-
偏差随组大小 增大而减小: 在分母上,所以组越大偏差越小。全局批次大小为 时,等效 ,偏差接近于零。
Batch Normalization 类比: 这个全局归一化与有监督学习中的批归一化(Batch Normalization, Ioffe & Szegedy, 2015)数学上完全类似——都是在更大的分母统计量(批次均值/方差)上归一化。BN 通过稳定激活分布大幅稳定了神经网络训练;全局优势归一化通过稳定梯度信号大幅稳定了策略梯度训练。这不是巧合,而是同一个稳定训练原则在两个学习范式中的体现。
附录 B:REINFORCE++ PyTorch 实现要点
这里给出在 PyTorch 中实现全局归一化的核心代码注释。
# REINFORCE++ 全局归一化核心实现(伪代码)
def compute_raw_advantages(rewards, kl_penalties, beta=0.05):
"""
计算原始优势(式 4)。
参数:
rewards: 每个回复的标量奖励 r(o, q)
kl_penalties: (序列长度,) 逐 token KL 散度
KL_t = log π_ref(o_t|...) - log π_old(o_t|...)
beta: KL 惩罚系数
返回:
raw_adv: (序列长度,) 每个 token 的原始优势
"""
T = len(kl_penalties)
# 计算从每个 token 位置到序列末尾的 KL 累积和
# future_kl[t] = Σ_{s=t}^{T} KL_s
future_kl = kl_penalties.flip(0).cumsum(0).flip(0) # 高效翻转累加翻转
# 式 4:A_{q,o_t} = r - β · future_kl[t]
raw_adv = rewards - beta * future_kl
return raw_adv
def global_normalize(all_advantages, eps=1e-8):
"""
全局批次归一化(式 5)。
关键:必须在所有 prompt 的优势都计算完毕后才能调用!
不能逐 prompt 归一化(那样就退化为局部归一化)。
参数:
all_advantages: (总 token 数,) 批次内所有 token 的优势
eps: 数值稳定常数
返回:
normalized_adv: 零均值、单位方差的优势
"""
mean = all_advantages.mean() # 全局均值(标量)
std = all_advantages.std() # 全局标准差(标量)
return (all_advantages - mean) / (std + eps)
# 训练循环核心逻辑
def rl_training_step(policy, ref_policy, reward_model, batch_prompts):
"""
REINFORCE++ 单个训练步(k=1 变体)的伪代码。
"""
# ────── 数据采集 ──────
policy_old = copy.deepcopy(policy) # 快照旧策略
all_raw_advantages = []
all_responses = []
for q in batch_prompts:
# 采样单个回复(k=1)
o = policy_old.generate(q)
r = reward_model(q, o)
kl = compute_kl_per_token(policy_old, ref_policy, q, o)
raw_adv = compute_raw_advantages(r, kl)
all_raw_advantages.append(raw_adv)
all_responses.append((q, o, raw_adv))
# ────── 全局归一化(关键步骤)──────
# 将所有 prompt 的所有 token 优势拼接成一个大向量
flat_advantages = torch.cat(all_raw_advantages) # (所有批次 token 数,)
# 用全局统计量归一化——这是 REINFORCE++ 与 GRPO 的核心区别!
flat_normalized = global_normalize(flat_advantages)
# 将归一化后的优势重新分配给各 prompt
ptr = 0
for i, (q, o, _) in enumerate(all_responses):
L = len(o)
norm_adv = flat_normalized[ptr:ptr+L]
ptr += L
all_responses[i] = (q, o, norm_adv)
# ────── PPO 更新 ──────
total_loss = 0.0
for q, o, norm_adv in all_responses:
for t, (o_t, adv_t) in enumerate(zip(o, norm_adv)):
log_prob_new = policy.log_prob(o_t, q, o[:t])
log_prob_old = policy_old.log_prob(o_t, q, o[:t])
ratio = torch.exp(log_prob_new - log_prob_old)
clipped_ratio = ratio.clamp(1 - eps_clip, 1 + eps_clip)
ppo_loss = -torch.min(ratio * adv_t, clipped_ratio * adv_t)
total_loss += ppo_loss
total_loss /= sum(len(o) for _, o, _ in all_responses)
total_loss.backward()
optimizer.step()
实现中容易犯的错误(来自开源社区经验):
-
❌ 逐 prompt 归一化: 在每个 prompt 的回复循环内立即归一化——这等同于局部归一化,GRPO 的缺陷依然存在。必须先收集所有优势,再统一归一化。
-
❌ 用无偏标准差(Bessel 校正):
torch.std(unbiased=True)除以 ,在大 batch 下影响不大,但在小 batch 下会产生略大的值,建议用unbiased=False(除以 )以与论文一致。 -
❌ 分布式训练中忘记 all-reduce: 多 GPU 训练时,每张 GPU 只看到部分批次。必须对均值和方差做 all-reduce 才能获得真正的全局统计量。
附录 C:第三方验证摘要
REINFORCE++ 的核心原则——全局批次归一化优于局部组归一化——已被多个独立大规模系统验证:
LitePPO(Liu et al., 2025,arXiv:2508.08221): 将 REINFORCE++w/Baseline 与 token 级别损失结合,实验结果表明全局标准差优于局部标准差——“训练更稳定,泛化更好”,与本文结论完全一致。
ScaleRL(Khatri et al., 2025,arXiv:2510.13786): 在 16,000 GPU 时规模实验中直接对比了 REINFORCE++ 的批次级归一化与 GRPO 的 prompt 级归一化,结论是批次级归一化”在计算效率和最终性能上略优”。这是迄今规模最大的独立验证。
DLER(Liu et al., 2025,arXiv:2510.15110): 研究了在用截断控制 LLM 输出长度时,批次归一化(全局)保持稳定而组归一化(局部)准确率下降。进一步证明全局归一化在各种训练条件和奖励格局变化下更鲁棒。
Seed1.5-Thinking(ByteDance Seed team, 2025): Seed 团队的超大规模推理模型训练中采用了 REINFORCE++ 家族算法,模型在多项推理基准上达到了与 o1/o3 相当的水平。
这种跨团队、跨规模、跨应用场景的一致性验证,是算法实用性最可靠的佐证。
附录 D:与 DeepSeek-R1 训练流程的关系
DeepSeek-R1 的成功让 GRPO 广为人知。有必要理解 REINFORCE++ 与 DeepSeek-R1 的关系。
DeepSeek-R1(Guo et al., 2025)使用 GRPO 进行推理训练,取得了令人印象深刻的推理能力。论文本身也承认 GRPO 存在奖励崩溃等问题,并通过 DAPO 中的 clip-higher 等技巧缓解。
REINFORCE++ 的视角:DeepSeek-R1 的成功尽管有 GRPO 的局部归一化偏差,而非因为它。GRPO 的总体 RLVR 框架(使用可验证奖励训练基础模型推理)是关键创新;局部归一化偏差是一个可修复的实现细节。REINFORCE++ 提供了这个修复,且在多项任务上证明可以超越原始 GRPO。
从实践角度看:
- 如果你在重现 DeepSeek-R1 风格的训练,可以直接将 GRPO 替换为 REINFORCE++w/Baseline,保持其他所有设计不变(RLVR 框架、数学推理任务设置、Qwen/LLaMA 基础模型),预期会得到更好的泛化性能。
- 关键变化:用全局 std 替换局部 std,用 k2 KL 估计量替换 k3,其余不变。
- 需要注意批次大小:建议 ,否则全局统计量可能不够稳定。