The anchor problem in offline alignment
Alignment starts from a bargain: make the model produce what people prefer, but keep it close to a trusted starting point. The classic objective maximizes reward under a KL penalty, , where the reference is usually the supervised fine-tuned model. Offline methods fold the reward away and train directly on preference pairs.
DPO is the workhorse of that family. For a prompt with a preferred completion and a rejected one , it pushes the policy's preference margin past the reference's:
IPO and KTO reshape the same ingredients, and all three share one convention: stays frozen for the entire run. All three also share a failure mode. Model quality rises, then falls, as the KL divergence from the reference grows, even though no reward model exists to hack. Rafailov and colleagues traced this offline overoptimization to probability mass escaping onto out-of-domain text.
Why a frozen reference stalls training
The DPO gradient is scaled by , where measures how far the policy's log-preference margin has moved past the reference's. At the start and updates are strong. As training widens the margin, drifts negative and decays toward zero, and we show the Hessian decays with it. The loss landscape flattens exactly where the model has moved furthest.
Here is the trap. In practice the probabilities of chosen and rejected completions both fall during DPO training, an effect Pal and colleagues documented. A probability distribution has to put that mass somewhere, so it flows onto sequences the training data never mentions. Once the curvature has vanished, there is no force left to pull it back.
Where the probability goes
Toy MDP, 100 seedsWe can watch this happen in a system small enough to enumerate: a depth-three MDP with three actions per state and an RNN policy. We fine-tune on three trajectories, then align with the single pair , averaging 100 seeds. DPO steadily inflates the seven trajectories neither dataset contains. The same run with an updated reference inflates the chosen trajectory instead.
Let the anchor walk
Our fix is to move the reference during training, the way trust-region optimizers re-center their constraint on the current iterate. The soft variant merges the policy into the reference at every step, , under a stop-gradient. The hard variant simply copies, , every steps. Setting recovers the vanilla method exactly.
Three ways to hold the reference
The mechanismThe recipe applies to any offline method that keeps an implicit closeness constraint, so we get TR-DPO, TR-IPO, and TR-KTO for free. The price is small: keeping and refreshing the reference adds between 2.9 and 7.4 percent to training time across the three methods, with hard updates the cheaper option.
The update rate has a cliff on each side
How fast should the anchor walk? We swept and with Pythia 2.8B on Anthropic-HH, judging side-by-side against the frozen-reference baseline with GPT-4. We report the net preference margin, wins minus losses, so zero means no better than the vanilla method.
Net preference vs the frozen baseline, sweeping α
-100 to 16| 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | |
|---|---|---|---|---|---|---|---|---|
| TR-DPO | +2.2 | +1.4 | +1.8 | +5.4 | +7.4 | +10.0 | +6.6 | -2.4 |
| TR-IPO | +4.8 | +8.6 | +9.0 | +13.4 | +14.0 | +8.8 | +14.6 | -13.6 |
| TR-KTO | -67.6 | -61.8 | -62.0 | +0.6 | -1.2 | +3.0 | -61.2 | -80.0 |
Net preference vs the frozen baseline, sweeping τ
-100 to 16| 64 | 128 | 256 | 512 | 1024 | |
|---|---|---|---|---|---|
| TR-DPO | -21.4 | -0.2 | +6.0 | +7.6 | +8.2 |
| TR-IPO | -21.8 | +11.6 | +10.2 | +13.2 | +7.6 |
| TR-KTO | -85.4 | -19.4 | -4.4 | +6.8 | -67.2 |
Both extremes fail for a reason. Update too often and the leash chases the policy so closely that nothing constrains it, which is where TR-KTO posts its worst number, a margin of at . Update too rarely and you are back to the frozen anchor. We found and outright unstable, and the gains at of 0.5 to 0.6 and are the statistically significant ones under probability-of-improvement analysis.
It transfers to real assistants
The sweep used a 2.8B model and one dialogue dataset, so the test that matters is a modern assistant setup. On Llama3-Base 8B, trained on UltraChat and aligned on UltraFeedback, the Trust Region versions beat every vanilla method on AlpacaEval 2 length-controlled win rate, with and chosen for this setting.
AlpacaEval 2 on Llama3-Base, length-controlled
LC win rate, %Llama3-Instruct 8B, both benchmarks
| Method | AlpacaEval 2 LC % | Arena-Hard WR % |
|---|---|---|
| SFT | 24.9 | 19.1 |
| DPO | 40.3 | 32.6 |
| TR-DPO, soft | 43.5 | 34.7 |
| TR-DPO, hard | 42.8 | 32.4 |
| IPO | 35.6 | 30.5 |
| TR-IPO, soft | 43.6 | 33.8 |
| TR-IPO, hard | 42.6 | 34.5 |
| KTO | 33.1 | 26.4 |
| TR-KTO, soft | 37.9 | 29.2 |
| TR-KTO, hard | 41.3 | 30.9 |
Task-specific results agree. On Reddit TL;DR with Pythia 6.9B, updating the reference improves side-by-side win rates by 8.4 points for DPO, 14.3 for IPO, and 15 for KTO. And the overoptimization analysis closes the loop: at matched KL divergence from the SFT policy, our variants score higher on coherence, correctness, detail, helpfulness, and harmlessness, and hold that advantage at matched generation diversity as well.
What it costs and where it bends
The honest reading of the sweeps is that and are real hyperparameters. Good defaults exist, near and for the task-specific runs, but the optimum shifted to and on Llama3, and KTO punishes a bad setting harshly. Tuning bought us further gains; skipping the tuning can cost more than the method gives.
Two caveats frame the result. Very large means few updates on small datasets, so the hard variant may not scale down gracefully, and adaptive schedules look like the natural next step. And all our judgments flow through GPT-4 as a proxy evaluator, on AutoSxS, AlpacaEval 2, and Arena-Hard alike, so the field's open question about judge reliability applies to us too.
The reference policy works better as a moving trust region than as a frozen anchor: walk it forward at the right pace and offline alignment stops fighting itself.