REINFORCE++ is a critic-free policy-gradient method for language models that keeps PPO's machinery (clipped ratio, minibatch updates, KL control) but replaces the learned value function with a single statistical step: normalise the advantages across the whole training batch rather than within each prompt's group. It comes in two forms. Plain REINFORCE++ samples one response per prompt and folds a KL penalty into the reward, which suits general RLHF against a reward model. REINFORCE++ with baseline samples several responses per prompt, subtracts the group mean, then divides by the batch-wide standard deviation, and adds a separate KL loss; it targets reasoning and agent tasks with verifiable rewards. Both sit where GRPO, RLOO and PPO sit, after SFT, and both ship as advantage estimators in OpenRLHF and verl.
Origin and the problem it targets#
REINFORCE++ was introduced by Jian Hu, with Jason Klein Liu, Haotian Xu and Wei Shen, in a paper first posted in January 2025 as REINFORCE++: A Simple and Efficient Approach for Aligning Large Language Models and revised several times; the current version (v9, November 2025) is titled REINFORCE++: Stabilizing Critic-Free Policy Optimization with Global Advantage Normalization. Hu is also the lead author of OpenRLHF, where the method was first implemented, and the paper should be read with that context: it is as much a set of implementation choices distilled from running RLHF at scale as it is a new estimator.
The starting point is the family of methods that dropped PPO's critic: ReMax (a greedy-decoding baseline), RLOO (leave-one-out mean) and GRPO (group mean and standard deviation). The REINFORCE++ paper argues that the last of these has three problems, all caused by computing statistics from a handful of responses to one prompt. The group-standardised advantage is biased, because the numerator and the denominator are computed from the same few rewards and are not independent. It is unstable, because when a group's rewards happen to be nearly equal the standard deviation is tiny and the advantages blow up to full size. And it overfits, because the policy is rewarded for beating its siblings on the same prompt rather than for being good. The fix is to use statistics from the whole batch, typically a thousand responses or more, which are close to constants.
The empirical support is mixed in scale but consistent in direction. On general RLHF (Llama-3-8B-SFT, a Bradley-Terry reward model trained on about 700K preference pairs, 20K prompts), REINFORCE++ with one sample per prompt scored 46.7 on Arena-Hard versus GRPO's 46.8 with four samples, with shorter responses and a slower-rising KL. Trained on just 30 AIME-24 questions, GRPO reached 95.0% on the training set and 0.0 pass@1 on AIME-25, while REINFORCE++ reached 71.0% and 2.5 pass@1 (40.0 pass@16). On a multi-turn tool-use benchmark suite, REINFORCE++ with baseline averaged 24.10 versus 22.58 for GRPO and 21.85 for PPO. The paper also cites later independent ablations, including ScaleRL (Khatri et al., 2025), which found batch-level normalisation slightly better than prompt-level in compute efficiency and final performance.
The objective and the two advantage estimators#
Both variants optimise PPO's clipped surrogate. For prompt , a response sampled from , and token ratio :
Everything that distinguishes REINFORCE++ is in .
REINFORCE++ (one sample per prompt)
The advantage is the outcome reward minus the KL penalty accumulated from token to the end, the standard PPO-for-RLHF reward shaping with :
Then the whole batch is standardised at once:
The batch mean is the baseline. It is a weak baseline, because it does not know how hard each prompt is, but it costs nothing and with one sample per prompt the batch covers as many distinct prompts as possible.
REINFORCE++ with baseline (k samples per prompt)
Sample responses per prompt. Subtract the group mean first, which removes prompt difficulty and makes the method indifferent to whether rewards are or ; then standardise with batch statistics:
The KL is no longer in the reward. It becomes a separate loss term using the estimator:
Side by side with its neighbours, for response of prompt with group rewards :
| Method | Advantage | KL handling |
|---|---|---|
| PPO | GAE from a learned critic | in the per-token reward |
| RLOO | in the reward | |
| GRPO | as a loss | |
| REINFORCE++ | , includes KL | in the reward |
| REINFORCE++ w/ baseline | as a loss |
REINFORCE++ with baseline is literally GRPO with the denominator swapped from a per-group to a per-batch statistic, plus a different KL estimator. The paper also describes it as PPO with the critic removed, GAE set to , and the value baseline replaced by group-mean subtraction followed by batch normalisation.
Why the local standard deviation is biased
The paper's argument (its Appendix A) models a group's rewards as with independent , and the GRPO advantage as with the group's population standard deviation. Conditional on response 's own noise,
so the denominator grows with : the more a response stands out, the more it inflates the very standard deviation it is divided by. That makes a nonlinear, compressed function of rather than a scaled copy of it. With a batch of a thousand responses, the batch standard deviation barely depends on any one of them and the distortion vanishes. The more practical problem is the other end. A group whose rewards differ only by reward-model noise gets standardised to unit scale anyway, so noise is presented to the optimiser as if it were signal. Our toy run below shows that this is the effect that matters.
Which KL estimator, and why it matters as a loss
All three estimators come from Schulman's note on approximating KL. With samples and : , , . As estimators of the value of , and are unbiased. But when you differentiate them as a loss, holding the sampled fixed as every LLM trainer does, you get different gradients:
So as a loss does nothing in expectation (it belongs inside the reward, where REINFORCE++ puts it), gives exactly the reverse-KL gradient, and , GRPO's choice, gives the forward-KL gradient, with an importance weight that explodes when the policy has pushed a token the reference likes towards zero. We verified all three on a 5-token categorical distribution with exact expectations: 's expected gradient matched the reverse-KL gradient with cosine 1.0000 and norm ratio 1.0000 at every distance tested; 's matched the forward-KL gradient exactly and the reverse one only approximately (cosine 0.995 to 0.965, norm ratio up to 1.84 when the policy was far from the reference); 's was zero to machine precision (). Far from the reference, the single-sample variance of the gradient was 3.83 against 0.51 for .
Worked example: three normalisations of the same batch#
Take a batch of two prompts, four responses each, with 0/1 rewards. Prompt A is hard, ; prompt B is medium, .
GRPO. Group A has mean 0.25 and standard deviation , so the success gets and each failure . Group B has mean 0.5 and standard deviation 0.5, giving .
REINFORCE++ with baseline. Subtract group means: A becomes , B becomes . The batch mean of these is 0; the batch standard deviation is . Dividing: A's success gets 1.603, its failures ; B's responses get .
REINFORCE++ (batch mean only). Treat all eight rewards as one pool: mean 0.375, standard deviation 0.484. Every success gets and every failure , regardless of prompt.
With binary rewards the differences are modest: relative to GRPO, the baseline variant shifts weight from the hard prompt to the medium one by about 7%. Now make the rewards continuous, as a reward model's would be. Prompt A's four responses score , differences that are within the reward model's noise; prompt B's score . GRPO gives A's responses advantages , the same size as B's real differences . REINFORCE++ with baseline gives A and B . The batch scale lets a prompt with nothing to learn contribute almost nothing.
Toy run: noise amplification and the KL estimators#
To test that last point beyond one batch, we built a tabular bandit: 256 prompts with 10 candidate answers each. On half the prompts every answer has true quality 0, so there is nothing to learn; on the other half qualities are drawn from . Each reward is the true quality plus noise, mimicking a learned reward model. Every method gets the same 256 samples per step: GRPO and REINFORCE++ with baseline use 32 prompts with ; REINFORCE++ uses 256 prompts with . We swept the learning rate over {3, 10, 30, 100} and ran 5 seeds of 100 steps. We report the average true quality on informative prompts (starting at 0.00; the best achievable is about 1.54) and policy entropy on the flat prompts (starting at ), where any loss of entropy is overfitting to noise.
| Learning rate | GRPO quality / flat entropy | RF++ w/ baseline | RF++ (k = 1) |
|---|---|---|---|
| 10 | 0.353 / 2.296 | 0.567 / 2.302 | 0.560 / 2.302 |
| 30 | 1.105 / 2.234 | 1.297 / 2.300 | 1.205 / 2.287 |
| 100 | 1.409 / 1.516 | 1.422 / 2.048 | 1.392 / 1.880 |
At every learning rate, GRPO spends part of its update budget on noise. At a learning rate of 30, where nothing has saturated, REINFORCE++ with baseline reaches a true quality of 1.297 against GRPO's 1.105 while leaving the flat prompts essentially untouched (2.300 versus 2.234 nats). At a learning rate of 100 all three approach the ceiling on informative prompts, but GRPO has collapsed the flat prompts from 2.303 to 1.516 nats, against 2.048 for the baseline variant and 1.880 for single-sample REINFORCE++. In an LLM, those flat prompts are the ones where the reward model cannot tell responses apart, and the entropy you lose there is diversity you lose everywhere, because parameters are shared.
Two caveats. In a separate run with binary rewards and no reward noise (10 answers per prompt, one correct, 60 steps), GRPO, REINFORCE++ with baseline and RLOO all finished at the same 73.9% pass rate once the learning rate was tuned, and single-sample REINFORCE++ at 70.7%, so the advantage of batch normalisation is a robustness property, not a free accuracy gain. And the tabular model has no shared parameters, so it cannot reproduce the generalisation results (the AIME overfitting experiment) in the paper.
The training loop#
for step in range(num_steps):
prompts = sample_batch(dataset, n_prompts) # e.g. 128 prompts
with no_grad():
outs = [policy.generate(q, n=k) for q in prompts] # k = 1 or k = 8
r = reward(prompts, outs) # (n_prompts * k,)
logp_old = token_logprobs(policy, prompts, outs)
logp_ref = token_logprobs(ref, prompts, outs)
if variant == "reinforce++": # KL folded into the reward
kl = logp_old - logp_ref # k1 per token
A = r[:, None] - beta * reverse_cumsum(kl * mask) # return-to-go, gamma = 1
else: # "with baseline"
A = (r - group_mean(r, k))[:, None].expand_as(mask)
A = masked_whiten(A, mask) # mean/std over ALL tokens in batch
for mb in minibatches(prompts, outs, A, logp_old, logp_ref):
logp = token_logprobs(policy, mb)
ratio = exp(logp - mb.logp_old)
pg = -minimum(ratio * mb.A, clip(ratio, 1 - eps, 1 + eps) * mb.A)
loss = masked_mean(pg, mb.mask)
if variant != "reinforce++":
loss += lam * masked_mean(0.5 * (logp - mb.logp_ref) ** 2, mb.mask) # k2 loss
loss.backward(); optimizer.step(); optimizer.zero_grad()
Two implementation details matter. First, "batch" means the global batch across all data-parallel ranks, not the per-GPU microbatch; whitening per device reintroduces small-sample statistics. Second, normalisation happens over tokens in the reference implementations (verl's masked_whiten and OpenRLHF's estimator both whiten the token-level advantage tensor under the response mask), so long responses carry more weight in the statistics than short ones. For outcome rewards without per-token KL, token-level and response-level whitening differ only through that length weighting.
Data
Prompts only, plus a reward function. For the single-sample variant, prompt diversity is the point, so use large, varied prompt sets (the paper's general-RLHF run used 20,000 prompts). For the baseline variant with verifiable rewards, the same filtering advice as GRPO applies: prompts the model always or never solves give zero group-centred advantage and are wasted, although under batch normalisation they no longer distort anyone else's scale.
Hyperparameters#
| Parameter | Starting value | Notes |
|---|---|---|
| Samples per prompt | 1 for RLHF with a reward model; 4 to 16 for RLVR | OpenRLHF's baseline example uses 128 prompts with 8 samples, a 1,024-response batch. |
| Global batch size | 1,024 responses or more | The statistics must be close to constants; below a few hundred the argument weakens. |
| Actor learning rate | 5e-7 (full fine-tuning, 7B to 8B) | OpenRLHF example value; LoRA needs roughly 10 times more. |
| KL coefficient | about 0.01 in the reward (k = 1); 1e-5 as a loss (baseline) | 0.01 is OpenRLHF's README value for reward-model RLHF, 1e-5 its baseline-variant example. Raise it when the reward is a learned model you can exploit. |
| Clip | 0.2 | Only active with several minibatch steps per batch. |
| Reward clipping | on | The paper clips and normalises rewards before computing advantages. |
The paper's own guidance is to choose the variant by task. REINFORCE++ with one sample per prompt for general-domain RLHF, for process reward models, and wherever several rewards per prompt are expensive; it works best with symmetric rewards such as . REINFORCE++ with baseline for reasoning and agent tasks, where it tolerates both 0/1 and rewards and helps when many rollouts are uninformative.
Compute and memory#
Memory is the same as GRPO: a trainable policy (about 16 bytes per parameter with Adam in mixed precision), a frozen reference for the KL term (2 bytes per parameter in bf16), a generation engine and a reward model or verifier. There is no critic, which saves roughly another 16 bytes per parameter of a same-sized value model compared with PPO:
Compute differs by variant. With , each prompt is generated and scored once, so for the same number of responses the generation cost equals GRPO's, but coverage is times wider. Global normalisation itself requires one all-reduce of two scalars per step. Against DPO, both variants cost what online RL costs: generation dominates, and a run is one to two orders of magnitude more expensive than an offline preference pass over a similar number of examples.
Failure modes#
Weak baseline with k = 1. The batch mean ignores prompt difficulty, so on a mixture of easy and hard prompts every response to an easy prompt looks good and every response to a hard prompt looks bad. Gradient variance is higher than with a per-prompt baseline. Signs: noisy reward curve, slow progress on the hard subset. Fix: move to the baseline variant, or stratify batches by difficulty.
Asymmetric 0/1 rewards with k = 1. With 0/1 rewards and a low pass rate, the batch-centred advantage of a failure is small and negative while a rare success is large and positive; this is fine in expectation but noisy. The paper recommends for the single-sample variant.
Per-device normalisation. If your framework whitens per microbatch, you have GRPO-like small-sample statistics again. Check the code path, not the config name.
KL drift with the wrong estimator. If you port the baseline variant into a GRPO codebase, make sure the KL loss uses , not . A loss on a policy that has pushed reference-favoured tokens near zero produces huge, rare gradients; watch the maximum of over the batch.
Reward hacking against a learned RM. The paper reports GRPO's KL rising much faster than REINFORCE++'s against a Bradley-Terry reward model, read as reward hacking. Batch normalisation slows it but does not prevent it. Track KL to the reference, response length and a held-out preference evaluation.
When to use REINFORCE++#
| Situation | Use | Reason |
|---|---|---|
| General RLHF with a learned reward model, large diverse prompt set | REINFORCE++ (k = 1) | Maximum prompt coverage per rollout; KL in the reward as in classic PPO-RLHF. |
| RLVR on maths or code, group sampling affordable | REINFORCE++ w/ baseline, or GRPO / Dr. GRPO | Group mean handles difficulty; batch std avoids noise amplification. |
| Small training set that you fear overfitting | REINFORCE++ w/ baseline | The paper's 30-question experiment is the clearest evidence for it. |
| Multi-turn tool use, many uninformative rollouts | REINFORCE++ w/ baseline | Best average in the paper's agentic suite. |
| Need per-token credit over very long chains | PPO with a calibrated critic, VAPO | REINFORCE++ assigns one outcome-based advantage per response. |
| Off-policy minibatches on MoE models | Combine with GSPO's sequence ratio | Advantage estimation and ratio level are independent choices (OpenRLHF exposes both). |
| Only offline preference pairs | DPO or KTO | No sampling or reward function needed. |
Minimal implementation#
import torch
import torch.distributed as dist
def global_whiten(x, mask, eps=1e-8):
"""Mean/std over all masked entries across every data-parallel rank."""
s = torch.stack([(x * mask).sum(), (x * x * mask).sum(), mask.sum()])
if dist.is_initialized():
dist.all_reduce(s)
mean = s[0] / s[2]
var = s[1] / s[2] - mean ** 2
return (x - mean) * torch.rsqrt(var.clamp(min=0) + eps) * mask
def rfpp_advantages(rewards, mask, k, logp_old=None, logp_ref=None, beta=0.0):
"""rewards: (N,) prompt-major; mask: (N, T). k == 1 gives REINFORCE++, k > 1 the baseline variant."""
if k == 1:
A = rewards[:, None].expand_as(mask).clone()
if beta > 0:
kl = (logp_old - logp_ref) * mask # k1 per token
A = A - beta * kl.flip(1).cumsum(1).flip(1) # sum_{i >= t} KL(i)
else:
centred = rewards.view(-1, k) - rewards.view(-1, k).mean(1, keepdim=True)
A = centred.view(-1, 1).expand_as(mask).clone()
return global_whiten(A, mask)
def k2_kl_loss(logp, logp_ref, mask):
return (0.5 * (logp - logp_ref) ** 2 * mask).sum() / mask.sum()
Plug the advantages into any PPO-style clipped loss. In OpenRLHF the estimators are --algo.advantage.estimator reinforce and reinforce_baseline, with --algo.kl.use_loss --algo.kl.estimator k2 for the baseline variant; in verl, algorithm.adv_estimator=reinforce_plus_plus or reinforce_plus_plus_baseline. TRL approximates REINFORCE++ in RLOOTrainer via normalize_advantages=True. In POFE, REINFORCE++ with baseline is available as an advantage option on the GRPO recipe, so the two can be compared on the same prompt set and reward function.
Further reading#
Hu et al. (2025) is the primary source; read the current version, whose framing differs from the January 2025 original. Andrychowicz et al. (2020), cited for global advantage normalisation, is the large-scale study of on-policy RL implementation choices outside language models. Ahmadian et al. (2024) is the case for REINFORCE-style methods over PPO in RLHF, and Li et al. (2023) introduces ReMax. Khatri et al. (2025) and Liu et al. (2025, "Tricks or Traps") are the independent ablations that compare batch-level and group-level normalisation. Hu et al. (2024) describes OpenRLHF, where the reference implementation lives.
Frequently asked questions#
What is the difference between REINFORCE++ and GRPO?
GRPO standardises each response's reward with the mean and standard deviation of its own group of responses to the same prompt. REINFORCE++ with baseline keeps the group-mean subtraction but divides by the standard deviation of the whole training batch, and uses a k2 KL loss instead of GRPO's k3. Plain REINFORCE++ samples one response per prompt and normalises with batch statistics only.
Why normalise advantages over the whole batch?
With 4 to 16 responses per prompt, the group standard deviation is noisy and correlated with each response's own reward. When a group's rewards differ only by noise, GRPO still scales them to unit size. Batch statistics over a thousand or more responses are nearly constant, so groups with little real signal contribute little.
Which KL estimator should I use as a loss?
k2, half the squared log-ratio. Differentiated with the sampled tokens held fixed, its expected gradient equals the true reverse-KL gradient. k3 gives the forward-KL gradient with an importance weight that can explode, and k1 gives zero gradient in expectation, so it belongs inside the reward rather than in the loss.
When should I use one sample per prompt?
For general RLHF against a reward model with a large, diverse prompt set, where prompt coverage matters more than a per-prompt baseline, and where several rewards per prompt are expensive, for example with process reward models. The paper recommends symmetric rewards such as plus and minus one for this variant.
How do I run REINFORCE++ in open-source frameworks?
OpenRLHF: --algo.advantage.estimator reinforce or reinforce_baseline, with --algo.kl.use_loss --algo.kl.estimator k2 for the baseline variant. verl: algorithm.adv_estimator=reinforce_plus_plus or reinforce_plus_plus_baseline. TRL approximates it with RLOOTrainer and normalize_advantages=True.
References#
- Jian Hu, Jason Klein Liu, Haotian Xu, Wei Shen (2025). REINFORCE++: Stabilizing Critic-Free Policy Optimization with Global Advantage Normalization (first version: REINFORCE++: A Simple and Efficient Approach for Aligning Large Language Models). arxiv.org/abs/2501.03262
- Jian Hu, Xibin Wu, Wei Shen, Jason Klein Liu, Zilin Zhu, et al. (2024). OpenRLHF: An Easy-to-use, Scalable and High-performance RLHF Framework. arxiv.org/abs/2405.11143
- Zhihong Shao, Peiyi Wang, Qihao Zhu, et al. (2024). DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arxiv.org/abs/2402.03300
- Arash Ahmadian, Chris Cremer, Matthias Gallé, Marzieh Fadaee, Julia Kreutzer, Olivier Pietquin, Ahmet Üstün, Sara Hooker (2024). Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs. arxiv.org/abs/2402.14740
- Ziniu Li, Tian Xu, Yushun Zhang, Zhihang Lin, Yang Yu, Ruoyu Sun, Zhi-Quan Luo (2023). ReMax: A Simple, Effective, and Efficient Reinforcement Learning Method for Aligning Large Language Models. arxiv.org/abs/2310.10505
- John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, Oleg Klimov (2017). Proximal Policy Optimization Algorithms. arxiv.org/abs/1707.06347
- Marcin Andrychowicz, Anton Raichuk, Piotr Stańczyk, et al. (2020). What Matters In On-Policy Reinforcement Learning? A Large-Scale Empirical Study. arxiv.org/abs/2006.05990
- John Schulman (2020). Approximating KL Divergence. joschu.net/blog/kl-approx.html
- Devvrit Khatri, Lovish Madaan, Rishabh Tiwari, Rachit Bansal, Sai Surya Duvvuri, Manzil Zaheer, Inderjit S. Dhillon, David Brandfonbrener, Rishabh Agarwal (2025). The Art of Scaling Reinforcement Learning Compute for LLMs. arxiv.org/abs/2510.13786
- Zihe Liu, Jiashun Liu, Yancheng He, Weixun Wang, et al. (2025). Part I: Tricks or Traps? A Deep Dive into RL for LLM Reasoning. arxiv.org/abs/2508.08221
- ByteDance Seed and verl contributors (2024). verl: Volcano Engine Reinforcement Learning for LLMs. github.com/volcengine/verl