REINFORCE++:无 Critic 的全局归一化策略更新#

进阶9 分钟阅读查看源文件 ↗

TL;DR#

本页内容8 个部分

REINFORCE++:回报、全局归一化与 PPO 式更新

1. 无 Critic 条件下的更新信号#

假设四道题各生成一条回答,任务回报为 [0,1,2,3][0,1,2,3]。每道题都没有其他回答可作同题参照,能否在不训练 Critic 的条件下,利用整批回报构造更新权重?

本文的 Actor–Critic PPO 配置用 Critic 预测各状态的期望回报,提供动作的比较参照。训练这个预测器需要额外模型与价值回归。REINFORCE++ 省去 Critic,保留 PPO 的概率比加权与裁剪目标。

2. 全批参照与两种配置#

REINFORCE++ 直接使用采样 return,用整批数据的均值和标准差构造更新权重。基础版跨题共用统计量,因此每题仅采样一个回答时也能计算批次统计量;with baseline 版先减同题组均值,再使用整批尺度。两版采用不同的 KL 正则方式。[1]

用更新前的策略 πold\pi_{\text{old}} 对一批问题生成回答;πθ\pi_\theta 表示更新中的策略,πref\pi_{\text{ref}} 是固定参考策略。按采样回答编号,第 ii 条回答记为 yiy_i,其问题为 qiq_i,任务评分为 RiR_i。同题多条回答的 qiq_i 可以相同。回答包含 TiT_i 个有效生成 token,计入终止 token,排除 prompt 和 padding;第 tt 个位置的状态为 si,t=(qi,yi,<t)s_{i,t}=(q_i,y_{i,<t})。

3. 回报计算、全批归一化与裁剪更新#

3.1 先计算含 KL 的 return#

基础版沿用 PPO 的 KL 奖励塑形:终局任务评分只放在最后一步,各步加入 old/reference 的负 log-ratio。取完整终止、γ=1\gamma=1,从时刻 tt 起累积的 return 为:

G~i,t=Ri−β∑u=tTilog⁡πold(yi,u∣si,u)πref(yi,u∣si,u).\widetilde G_{i,t}=R_i-\beta\sum_{u=t}^{T_i}\log\frac{\pi_{\text{old}}(y_{i,u}\mid s_{i,u})}{\pi_{\text{ref}}(y_{i,u}\mid s_{i,u})}.

β≥0\beta\geq0 控制 reference KL。奖励在采样后、更新前计算,因此奖励中的概率由 old 计算,并在本批优化中固定。任务奖励仅赋予最后一个有效 token,不等于只有末 token 参与训练:此前每个位置都有自己的后续 return。 有逐 token KL 时,同一回答的各位置也不一定共用一个数值。

PPO 会再减去 Critic 的价值预测;这里不训练这个预测器,将采样 return 直接用于全批归一化。[1]

沿用四道题、任务评分 [0,1,2,3][0,1,2,3]。为便于手算,设每条回答都只有一个有效生成 token,该 token 同时终止回答。取 β=0.5\beta=0.5,old/reference 的 log-ratio 分别为 [0,0,0.2,−0.2][0,0,0.2,-0.2],得到:

问题 任务评分 RiR_i Old/reference log-ratio 含 KL 的 return
q1q_1 0 0 0
q2q_2 1 0 1
q3q_3 2 0.2 2−0.5×0.2=1.92-0.5\times0.2=1.9
q4q_4 3 −0.2 3−0.5×(−0.2)=3.13-0.5\times(-0.2)=3.1

这些是手算设定,不是实验结果。每行是不同问题下的一次动作,log-ratio 无须跨行归一化。第四题的采样 log-ratio 为负,因此这一次采样得到正的 KL 奖励;单个样本值的符号不等于分布 KL 的符号。

3.2 用全批统计量构造权重#

把这一批全部有效生成位置记为 B\mathcal B。本文采用有效 token 的统计口径:μB\mu_{\mathcal B} 是这些 G~i,t\widetilde G_{i,t} 的均值,σB\sigma_{\mathcal B} 是它们的总体标准差。取 δ>0\delta>0 防止除零,构造:

A^i,t=G~i,t−μBσB+δ.\hat A_{i,t}=\frac{\widetilde G_{i,t}-\mu_{\mathcal B}}{\sigma_{\mathcal B}+\delta}.

均值和标准差分别提供整批共用的参照与尺度;两者在完整 rollout batch 上计算一次,随后固定用于各 minibatch。

这个 A^\hat A 是算法的采样更新权重,不是精确的 Qπ(s,a)−Vπ(s)Q^\pi(s,a)-V^\pi(s)。 全局均值也不等于每个状态的条件价值 Vπ(s)V^\pi(s)。[1]

按 token 统计时,长回答贡献更多位置;如果改为每条回答只计一次,统计量中的回答权重就会改变。统计时用 mask 排除无效位置。本页的权重算例使用等长回答,避免长度差异同时改变统计量和聚合系数。[2]

3.3 四道题的全批权重计算#

四道题的含 KL 回报为 [0,1,1.9,3.1][0,1,1.9,3.1]。全局均值为 1.51.5,残差为 [−1.5,−0.5,0.4,1.6][-1.5,-0.5,0.4,1.6]。总体方差为 σB2=(2.25+0.25+0.16+2.56)/4=1.305\sigma_{\mathcal B}^2=(2.25+0.25+0.16+2.56)/4=1.305,标准差为 σB=1.305≈1.142366\sigma_{\mathcal B}=\sqrt{1.305}\approx1.142366。忽略很小的 δ\delta:

问题 含 KL 的 return 减全局均值 除全局标准差后的 A^\hat A
q1q_1 00 −1.5-1.5 −1.3131-1.3131
q2q_2 11 −0.5-0.5 −0.4377-0.4377
q3q_3 1.91.9 0.40.4 0.35020.3502
q4q_4 3.13.1 1.61.6 1.40061.4006

每道题虽然没有多个回答可比较,整批仍有相对信号。这也说明全局参照的含义:分数 11 低于本批均值,所以权重为负;它不表示这个回答一定差于该题其他可能的回答。

3.4 裁剪目标与四条回答的计算#

设 NN 为本批回答数、0<ϵ<10<\epsilon<1 为裁剪宽度。每个位置计算自己的 ri,t(θ)=πθ(yi,t∣si,t)/πold(yi,t∣si,t)r_{i,t}(\theta)=\pi_\theta(y_{i,t}\mid s_{i,t})/\pi_{\text{old}}(y_{i,t}\mid s_{i,t})。先在回答内平均,再对回答平均,最大化:

J++(θ)=1N∑i=1N1Ti∑t=1Timin⁡ ⁣(ri,tA^i,t,clip⁡(ri,t,1−ϵ,1+ϵ)A^i,t).J_{++}(\theta)=\frac1N\sum_{i=1}^{N}\frac1{T_i}\sum_{t=1}^{T_i}\min\!\left(r_{i,t}\hat A_{i,t},\operatorname{clip}(r_{i,t},1-\epsilon,1+\epsilon)\hat A_{i,t}\right).

A^\hat A 与 old 概率固定,梯度通过 current 传播。若用梯度下降,Actor loss 为 −J++-J_{++}。基础版已经在 return 中加入 KL,这里不再重复加同一份惩罚。

需要区分两个操作:(1)回答平均决定 loss 怎样汇总;(2)return 归一化改变训练权重。不同长度权重见 Loss 平均。

继续上面的四条回答,令 ϵ=0.2\epsilon=0.2,更新后的 ratio 假设为 [0.7,0.9,1.1,1.3][0.7,0.9,1.1,1.3]:

回答 A^\hat A Ratio 原始项 rA^r\hat A Clipped 目标取值
1 −1.3131-1.3131 0.70.7 −0.9191-0.9191 −1.0505-1.0505
2 −0.4377-0.4377 0.90.9 −0.3939-0.3939 −0.3939-0.3939
3 0.35020.3502 1.11.1 0.38520.3852 0.38520.3852
4 1.40061.4006 1.31.3 1.82081.8208 1.68071.6807

用未四舍五入的数值计算,目标为 J++=0.71/(41.305)≈0.155379J_{++}=0.71/(4\sqrt{1.305})\approx0.155379,Actor loss 为其相反数。任务评分经 KL 奖励修正、全批归一化和裁剪后,得到这一个平均目标。

第一条的负优势项与第四条的正优势项分别越过有利方向的裁剪阈值,均进入常数分支。这里是手算的目标值,不是模型训练结果;在同步采样且 current 尚未更新、ratio 都为 11 时,平均 A^=0\hat A=0,梯度也不必为零,因为各动作的 score 不同。

4. With baseline 的同题参照与独立 KL#

4.1 先减同题均值#

With baseline 版改变两项配置:(1)先减同题组均值,再使用全批尺度;(2)将 KL 从奖励中移出,单列为 loss。

基础版可以跨题共用均值,但题目难度和评分基准可能不同。With baseline 版每题采 K>1K>1 个回答:先减该题的组均值 Rˉ(q)=1K∑j=1KR(q,yj)\bar R(q)=\frac1K\sum_{j=1}^K R(q,y_j),再用全批统计量归一化。

在只有终局任务评分、KL 单列为 loss 的配置中,先得到残差 Ri−Rˉ(qi)R_i-\bar R(q_i),然后:

A^i=Ri−Rˉ(qi)−mean⁡B[R−Rˉ(q)]std⁡B[R−Rˉ(q)]+δ.\hat A_i=\frac{R_i-\bar R(q_i)-\operatorname{mean}_{\mathcal B}[R-\bar R(q)]}{\operatorname{std}_{\mathcal B}[R-\bar R(q)]+\delta}.

整条回答共享这个任务权重。减同题均值确定比较参照,除全局标准差确定题间残差的统一尺度。 中心化与缩放可以分别选择统计范围;本版先在同题内比较,再使用整批共用的尺度。[1]

若每个回答计一次且组内权重一致,减组均值后的全局均值为零;按不等长 token 计权时则未必为零,所以公式保留全局中心化。

4.2 两道题的归一化尺度比较#

先忽略 KL,假设回答等长:第一题回报为 [0,2][0,2],第二题为 [10,16][10,16]。两题的均值为 11、1313;减去各自均值后,残差为 [−1,1,−3,3][-1,1,-3,3]。

方法 第一题的两个权重 第二题的两个权重
同题标准化:再除各题标准差 11、33 [−1,1][-1,1] [−1,1][-1,1]
With baseline:除全局标准差 5\sqrt5 [−0.447,0.447][-0.447,0.447] [−1.342,1.342][-1.342,1.342]

组内标准化把两题不同的回报差都缩成同样大小;全局标准化保留了第二题残差是第一题三倍的关系。这改变了问题之间的优化权重,不能仅用学习率的统一缩放表示。

同题所有回答同分时,组内残差全为零。在上述等长设定下,全批残差均值也为零,所以该题最终的任务权重仍为零。仅除以全局标准差,不会产生新的组内分数差异。若按不等长 token 统计,全批中心化还可能引入共同偏移,不能一概断言最终权重为零。基础版没有同题中心化,需要另行判断。

4.3 单独计算 KL loss#

With baseline 版将 KL 惩罚单独加入 loss,采用 k2k_2 表达式。对固定前缀下的采样 token,定义:

k2(a∣s)=12(log⁡πθ(a∣s)πref(a∣s))2.k_2(a\mid s)=\frac12\left(\log\frac{\pi_\theta(a\mid s)}{\pi_{\text{ref}}(a\mid s)}\right)^2.

它以 −β E^[k2]-\beta\,\widehat{\mathbb E}[k_2] 加到最大化的 clipped 目标中,E^\widehat{\mathbb E} 采用先回答内、再批内平均的口径;作为最小化 loss 时符号为正,current 概率保留梯度。这里的组内任务分数不再混入同一份 KL。

在两道题的等长算例中,任务权重为 [−1,1,−3,3]/5[-1,1,-3,3]/\sqrt5。假设每条回答只有一个有效动作,current/old ratio 为 [0.9,1.1,0.9,1.1][0.9,1.1,0.9,1.1],裁剪宽度为 0.20.2,四项都未进入常数分支。平均任务目标为 Jtask=(−0.9+1.1−2.7+3.3)/(45)=0.2/5≈0.089443J_{\mathrm{task}}=(-0.9+1.1-2.7+3.3)/(4\sqrt5)=0.2/\sqrt5\approx0.089443。

再取 β=0.1\beta=0.1。若前三个所采动作的 current/reference log-ratio 为零,第四个为 0.20.2,四个 k2k_2 就是 [0,0,0,0.02][0,0,0,0.02]。平均惩罚为 0.0050.005,完整 Actor loss 为 LActor=−0.089443+0.1×0.005≈−0.088943L_{\mathrm{Actor}}=-0.089443+0.1\times0.005\approx-0.088943。与基础版不同,这份 KL 不重算任务分数或优势,而是在任务 loss 之外相加;惩罚中的 current 概率保留梯度。

固定前缀、reference 固定、按 current 采样时,k2k_2 直接反传给出 log-ratio 乘 score,其期望是局部 reverse KL 梯度。

这是与 log-ratio 奖励的梯度对应,不要求 k2k_2 的期望数值恰好等于 KL,也不等于两套完整算法相同。 详细推导与 old/current、整条回答的限制见 KL Regularization。[1]

4.4 基础版与 With baseline 的训练流程#

基础版的训练步骤如下:

  1. 保存 current 为 old,采一批回答,记录 old log-prob;每题一个回答即可,也可每题多采。
  2. 评分并计算 reference log-prob,得到含 KL 的逐 token return。
  3. 在完整 rollout batch 上计算均值和标准差,得到并固定 A^\hat A。
  4. 用若干 minibatch 重算 current 概率,最大化 clipped 目标;本批结束后重新采样。

With baseline 版同样交替采样与更新,但每题需要多个回答,任务权重先减同题均值再全批归一化;reference KL 则单列为 k2k_2 loss,不再混入同一份任务评分。

5. 全局统计与训练成本的局限性#

5.1 全局统计与有限样本偏差#

“Global”表示统计范围更大,不是已经知道真实总体均值和标准差。它们仍来自当前这批随机数据,包含样本自身,也会与回报及梯度相关。

即使只减均值、不除标准差,在独立同策略的序列级采样下,自包含的 batch 均值也会使 REINFORCE 梯度估计的期望缩放为 (N−1)/N(N-1)/N。均值中包含当前样本的 Ri/NR_i/N,因此会减去原始期望梯度的 1/N1/N。其他样本的回报与当前回答独立,乘当前回答的 score 后期望为零。

With baseline 的参照来自同题组。若每题组大小固定,仅增加其他题目来扩大 batch,不会消除本题组均值包含当前回答的依赖。

增加独立样本通常可以减小批次统计量的采样误差,但不能使全局均值等于各状态的价值,也不保证归一化后的梯度方差最小。

5.2 省去 Critic 后的成本#

没有价值回归和 Critic 更新。省去价值模型减少了相应的显存和计算,但实际吞吐还受生成、评分、reference 前向和并行配置影响。

参考资料#

  1. REINFORCE++(2025,v9). 原文:基础版、with baseline 与 KL 配置。
  2. OpenRLHF(commit dc2a7ad). 原文:experience_maker.py:组均值、return 与有效位置归一化。

补充比较#

与 PPO 的联系
比较项 本文的 PPO REINFORCE++ 基础版 With baseline 版
状态价值 Critic 训练 无 无
减去的参照 前缀价值 Vϕ(st)V_\phi(s_t) 全批 return 均值 同题组均值,再全批中心化
归一化尺度 可对优势做全批归一化 全批标准差 全批残差标准差
每题回答数 不要求成组 K≥1K\geq1 K>1K>1
本文的 reference KL 正则方式 奖励塑形 奖励塑形 独立 k2k_2 loss
Actor 更新 Ratio 与 clipping Ratio 与 clipping Ratio 与 clipping

在完整终止、折扣因子 γ=1\gamma=1,且 GAE 的混合参数 λ=1\lambda=1 时,PPO 的 GAE 退化为 Monte Carlo return 减状态价值。去掉 Critic 后,再用全批统计量构造权重,即可明确基础版与这一 PPO 配置的对应关系。

With baseline 版还增加同题中心化并换了 KL 正则方式,因此不能将 with baseline 版等同于仅移除 Critic 的 PPO。[1]