Target Policy Optimization

Jean Kaddour

TL;DR. GRPO-style RL samples a few answers per prompt, scores them, and nudges the model toward the good ones. TPO splits that nudge into two explicit steps. First, write down where probability should go: a target distribution qq over the sampled answers. Then fit the model to it with cross-entropy. The gradient is pqp - q, so the update switches itself off once the model reaches the target. It takes a few lines of code, matches GRPO when reward is dense, and wins clearly when reward is sparse.

Learning curves: TPO, GRPO and DG on MNIST and on sparse-reward token reversal
TPO (blue) against GRPO (orange) and DG (red). Left: with dense reward on MNIST, TPO learns fastest. Right: with reward only at the end of a sequence, DG never gets going and GRPO still fails half the time after 2,000 episodes, while TPO gets below 10% error. 20 seeds, mean ± standard error.

One prompt, a handful of answers

Here is the loop behind most RL on language models today. Take a prompt. Sample KK answers from the current model. Score each one with a verifier: right or wrong. Then update the model so the right answers become more likely.

GRPO, the current workhorse, turns the rewards into advantages by standardizing them within the group, Ai=(RimeanR)/stdRA_i = (R_i - \text{mean}\,R) / \text{std}\,R, then moves each answer’s log-probability up or down in proportion to its advantage:

Δθ    1Ki=1KAiθlogπθ(yix)\Delta\theta \;\propto\; \frac{1}{K}\sum_{i=1}^{K} A_i\,\nabla_\theta \log \pi_\theta(y_i \mid x)

That one line answers two different questions at once:

  1. What should change? Which answers should gain probability, and how much?
  2. How should the weights move to make that change happen?

The advantages set a direction. But how far the model actually travels depends on the learning rate, on how many times the batch is reused, and on where the clip kicks in. Travel too little and a rare success is wasted. Travel too far and the model overfits one lucky batch.

TPO answers the two questions separately. First decide where the probability should go. Then move the model there.

Step 1: decide where the probability should go

TPO needs two numbers per answer. The first is how likely the model was to write it, pioldp_i^{\text{old}}, renormalized over the KK sampled answers so they sum to one. The second is its standardized score AiA_i, the same one GRPO uses. The target reweights the old probabilities by the exponentiated score:

qi  =  pioldeAi/ηjpjoldeAj/ηq_i \;=\; \frac{p_i^{\text{old}}\, e^{A_i/\eta}}{\sum_j p_j^{\text{old}}\, e^{A_j/\eta}}

Start from what the model already does, scale the good answers up and the bad ones down, and renormalize. η\eta is a temperature; the paper uses η=1\eta = 1 everywhere.

Build a target
Drag a bar to change p_old · click a reward to flip it
pold (model now)q (target)
y
A = −1.00
0.700.25
y
A = +1.00
0.150.40
y
A = +1.00
0.130.34
y
A = −1.00
0.020.01
q = 0.15 × e+1.00/1.00 ÷ 1.03 = 0.40
Correct answers go from 28% to 74% of the group’s mass. In total, 46% of the mass moves.

A few things to try:

  • All wrong. Every answer has the same reward, so every Ai=0A_i = 0 and q=poldq = p^{\text{old}}. No signal, no update.
  • Lone breakthrough. The only correct answer had 3% of the mass. The target gives it 24%: an eightfold boost, but not a takeover. One batch is evidence, not proof.
  • Common vs rare mistake. Both wrong answers get the same score. Yet the target takes 45 points of mass from the 70% mistake and barely touches the 2% one. We’ll come back to this.
  • Turn η down and the target gets greedier; turn it up and it stays closer to poldp^{\text{old}}.

Why standardize? Scores of (1, 0, −1) and (100, 0, −100) rank the answers identically. But exponentiating the second makes the target essentially one-hot, while the first gives a gentle tilt. Standardizing within the group makes the target depend only on how answers compare with each other, which is why a single η\eta works across tasks.

The target is a trade-off

The formula for q isn’t arbitrary. It is the exact solution of a small optimization problem:

q  =  argmaxr    Er[A]be good    ηKL(rpold)stay closeq \;=\; \arg\max_{r}\;\; \underbrace{\mathbb{E}_{r}[A]}_{\text{be good}} \;-\; \eta\, \underbrace{\mathrm{KL}(r \,\|\, p^{\text{old}})}_{\text{stay close}}

over distributions rr on the sampled answers. Collect as much advantage as you can without drifting too far from what the model already does. With three answers, every distribution is a point in a triangle, so you can watch this trade-off directly.

Where the target sits
Drag the gray dot · flip rewards · slide η
yyy
y y y
pold: the model nowq: TPO’s target (★), and where it moves as η changes (dashed)GRPO: a direction, no endpoint
Expected advantage: −0.28+0.73
Cost, η·KL(q ‖ pold): 0.53
q = (0.68, 0.20, 0.12)

The dashed curve traces the target for every η\eta. When η\eta is large, the target sits on top of poldp^{\text{old}}. As η\eta shrinks, it slides toward the correct corner. The orange arrow is GRPO’s first step on the same group. It points the same way, but it is only a direction: where GRPO ends up depends on the learning rate, the number of epochs and the clip. TPO’s target is a place.

Step 2: fit the target

Now make the model match qq. TPO uses the plainest loss there is, cross-entropy with qq as soft labels:

LTPO  =  i=1Kqilogpiθ\mathcal{L}_{\text{TPO}} \;=\; -\sum_{i=1}^{K} q_i \log p_i^{\theta}

where piθp_i^\theta is the current model’s probability of answer ii, again renormalized over the group. Its gradient with respect to each answer’s log-probability is

LTPOlogπθ(yix)  =  piθqi\frac{\partial \mathcal{L}_{\text{TPO}}}{\partial \log \pi_\theta(y_i \mid x)} \;=\; p_i^\theta - q_i

which is zero exactly when the model matches the target. The update switches itself off. That matters as soon as you reuse a batch for several gradient steps, which PPO and GRPO routinely do.

Reuse one batch for many steps
Press play · change the learning rate
TPOGRPO surrogate, no clip or KLtarget
0%25%50%75%100%0102030gradient steps on the same batchmass on correct answerstarget q: 24%
The group after step 30 (green = correct)
TPO
y₁ 24%
y₂ 39%
y₃ 24%
y₄ 13%
GRPO, no clip
y₁ 100%
Gradient size at step 30: TPO 1.4e-3, GRPO surrogate 2.5e-2

TPO settles on its target whatever the learning rate; a bigger step only gets there sooner. GRPO’s surrogate, stripped of its clip and KL penalty, has no such stopping point. It keeps going until the model is certain of this one batch’s winners. That is why PPO and GRPO need a clip and a KL penalty. TPO’s stopping point comes with the loss.

The whole method fits in a few lines:

def tpo_target(log_scores, adv, eta=1.0):
    return F.softmax(
        F.log_softmax(log_scores, -1)
        + adv / eta, -1)

q = tpo_target(
    log_scores, adv).detach()
log_p = F.log_softmax(log_scores, -1)
loss = -(q * log_p).sum(-1).mean()

log_scores holds the model’s log-probabilities of the KK sampled answers, and adv their standardized scores. The only subtlety is detaching qq: the target is a label, not something to optimize. When a batch is reused for more epochs, qq stays frozen at its rollout-time value.

What the target changes

Why would this beat GRPO? Here are three places where GRPO’s one-number-per-answer advantages leave signal on the table. The first two are diagnostics from Ian Osband’s Delightful Policy Gradient.

1. Hard prompts get their share

Take the simplest possible setting: many prompts, each with one correct answer out of ten, and exact updates. Every method then pushes each prompt in the same direction, toward its correct answer. They differ only in how hard they push: a weight β(p)\beta(p) that depends on the prompt’s current pass rate pp. With the total step size fixed, β\beta decides how the step is split between prompts.

How the step is split across prompts
Drag the markers, or use the sliders
GRPO: β = √(p / (1 − p))TPOequal split (supervised learning)
0123450%25%50%75%100%prompt’s current pass rate pupdate weight β(p)hard promptGRPO 0.23 · TPO 0.57easy promptGRPO 4.36 · TPO 0.96
Share of one normalized step: hard prompt (dark) vs easy prompt (light)
GRPO
95%
easy gets 19×
TPO
37%
63%
easy gets 1.7×

GRPO’s weight vanishes on hard prompts and blows up on easy ones. A prompt the model solves 95% of the time gets 19× the update of one it solves 5% of the time. That is backwards if the point is to learn what the model can’t do yet. Supervised learning would split the step evenly. TPO stays close to even, at 1.7×, because its target multiplies the correct answer’s odds by the same factor (about 28 here) on every prompt, so hard prompts still get a large update.

2. A common mistake is not a rare one

Back to the four answers from the first widget. GRPO sees two wrong answers with the same reward and gives them the same advantage. So it pushes both of their logits down equally hard, whether the model makes that mistake 70% of the time or 2%. TPO’s push on each answer is qipioldq_i - p_i^{\text{old}}: how much probability actually has to move.

answerpoldrewardGRPO push, A / KTPO push, q − pold
common mistake
0.70
✗ 0
−0.25
−0.45
correct
0.15
✓ 1
+0.25
+0.25
another correct
0.13
✓ 1
+0.25
+0.21
rare mistake
0.02
✗ 0
−0.25
−0.01
Push on each answer’s logit at the first step (bars scaled per method). Same numbers as the “Common vs rare mistake” example above.

TPO pushes 35× harder on the habit than on the slip. GRPO spends as much of its update on a 2% slip as on the mistake the model actually keeps making.

3. Every group gets its own stopping point

PPO and GRPO stop a reused batch with a clip. Each answer’s probability ratio πθ/πold\pi_\theta / \pi_{\text{old}} may only move within [1ε,1+ε][1-\varepsilon,\, 1+\varepsilon], typically with ε=0.2\varepsilon = 0.2. That is the same band for every answer. Once a breakthrough the model finds 1% of the time reaches 1.2%, the clip stops pushing it, while an easy answer at 90% can coast all the way to 100%. DAPO’s “clip-higher” trick exists for this reason. TPO has no clip. Its stopping point is qq, set for each group by the evidence: a lone success at 1% in a group of eight gets a target of 17%.

Does it work?

The paper tests TPO on everything from tabular bandits to 1.7B-parameter LLMs. It matches GRPO, PPO and DG when reward is dense, and pulls away when reward is sparse.

Sparse reward. A small transformer learns to reverse a binary sequence of length HH, and is rewarded only if the whole sequence is right. Longer sequences make a correct rollout rarer: at H=10H = 10, a random guess is right one time in 1,024.

Sparse reward: reversing a sequence of length H
Error, lower is better
TPO
7.4%
GRPO
50.4%
GRPO (no KL)
above 95%: no learning
PPO
above 95%: no learning
DG
above 95%: no learning
Exact-match error after 2,000 episodes, with K = 8 rollouts per prompt. “Same prompts”: every method sees the same prompts, so grouped methods use 8× more rollouts. “Same rollouts”: every method gets the same number of rollouts. Without its KL penalty GRPO falls apart, so under sparse reward the KL term does most of GRPO’s stabilizing.

Stale rollouts. Large RL systems generate rollouts with slightly outdated weights. In an MNIST bandit where actors use parameters from DD steps ago, TPO’s error doesn’t move from D=0D = 0 to D=1000D = 1000.

Stale rollouts: actors lag D steps behind
Error, lower is better
TPO
2.3%
DG
2.5%
PPO
5.4%
PG (importance-weighted)
9.8%
REINFORCE
78.1%
Final error on the MNIST contextual bandit, from the talk.

LLMs. On Qwen3-1.7B and DeepSeek-R1-Distill-Qwen-1.5B with 16 rollouts per prompt, swapping only the loss:

Accuracy curves for TPO and GRPO on GSM8K, graph coloring and Knights and Knaves, for two small LLMs
On GSM8K, TPO learns faster and both methods end near the same accuracy. On Reasoning Gym graph coloring with Qwen3-1.7B, GRPO peaks early and then degrades, while TPO keeps climbing to about 0.96.

A team at Tencent independently arrived at a closely related objective, Listwise Policy Optimization, which also treats group-based RLVR as projecting onto a target on the response simplex.

An old idea, in closed form

Reweight-then-fit is not new. It goes back at least to Dayan and Hinton’s EM for RL in 1997 and runs through REPS, MPO and SPU. Each had to work around something expensive. Group-based RL removes the obstacle: with a finite group of scored answers, the target is a softmax. No critic, no dual.

EM for RL
Dayan & Hinton, 1997
sums over all actions
REPS
Peters et al., 2010
solves a dual problem
MPO
Abdolmaleki et al., 2018
needs a learned Q-function
SPU
Vuong et al., 2019
runs an inner optimization
TPO
2026
finite group, so q is a softmax

Limitations

  • TPO can only move probability among the answers it sampled. If all KK are bad in the same way, the target has nothing to say. It also still needs KK rollouts per prompt, just like GRPO.
  • Standardizing makes tiny score differences look sharp when a group has little variance: one answer scoring 0.001 and the rest 0 produces a very confident target. This is the same difficulty bias that has been studied for GRPO.
  • The LLM experiments stop at 1.7B parameters. Whether the gains hold at 7B and beyond, on MATH or AIME, is still open.

Cite

@article{kaddour2026tpo,
  title   = {Target Policy Optimization},
  author  = {Kaddour, Jean},
  journal = {arXiv preprint arXiv:2604.06159},
  year    = {2026}
}