ORPO (Odds-Ratio Preference Optimization) is a single-stage alignment method introduced by Hong, Lee, and Thorne in 2024 that combines supervised fine-tuning and preference optimization into one training pass. Unlike DPO, which requires a separate SFT stage followed by preference optimization, ORPO achieves both simultaneously — and does so without needing a reference model.
The standard alignment pipeline for LLMs involves at least two stages: first, supervised fine-tuning (SFT) on high-quality instruction data to teach the model to follow instructions, then a preference alignment stage (RLHF or DPO) to align outputs with human preferences. ORPO’s key insight is that SFT alone already teaches the model some notion of quality through the training data distribution, so the preference signal can be incorporated directly into the SFT loss rather than requiring a separate step.
For engineering teams, ORPO represents a significant simplification of the alignment pipeline. By eliminating both the reference model requirement and the multi-stage training process, ORPO reduces GPU memory needs, training time, and implementation complexity while achieving competitive results with state-of-the-art methods.
In the standard two-stage pipeline (SFT + DPO), the SFT stage maximizes the likelihood of generating good responses but does not explicitly penalize bad ones. The model learns what good outputs look like but doesn’t learn to distinguish between good and bad. The preference alignment stage then provides this contrastive signal, but requires a frozen copy of the SFT model as a reference — doubling GPU memory requirements.
ORPO addresses both issues by adding a penalty term for rejected responses directly into the SFT loss. This means the model simultaneously learns to generate preferred outputs and avoid dispreferred ones, all in a single training step.
ORPO uses the odds ratio as its preference signal. For a given response y to a prompt x, the odds of the model generating that response are defined as:
odds_theta(y|x) = P_theta(y|x) / (1 - P_theta(y|x))
The odds represent how much more likely the model is to generate a response than not. The ratio of odds between preferred and rejected responses measures preference strength.
In practice, for autoregressive models generating token-by-token, the log-probability of a full sequence is computed as the average of per-token log-probabilities:
log P_theta(y|x) = (1/|y|) * sum(log P_theta(y_t | x, y_<t)) for t = 1...|y|
The ORPO loss combines two components:
L_ORPO = L_SFT + lambda * L_OR
Where L_SFT is the standard negative log-likelihood loss on chosen responses, L_OR is the odds ratio loss, and lambda controls the strength of the preference signal.
The SFT component is the standard cross-entropy loss applied to the preferred response:
L_SFT = -log P_theta(y_w | x)
The odds ratio loss compares how strongly the model prefers the chosen response over the rejected one:
L_OR = -log sigma(log(odds_theta(y_w|x) / odds_theta(y_l|x)))
The sigmoid wrapper ensures the loss is minimized when the odds of generating the preferred response are much higher than the odds of generating the rejected response.
A natural question is why ORPO uses odds ratios rather than simple probability ratios. The odds ratio has several desirable mathematical properties:
ORPO training uses preference data in the same format as DPO — (prompt, chosen, rejected) triplets — but feeds them into a single training loop:
from trl import ORPOTrainer, ORPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("base-model")
tokenizer = AutoTokenizer.from_pretrained("base-model")
training_args = ORPOConfig(
output_dir="./orpo-output",
beta=0.1, # lambda weight for odds ratio loss
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=8e-6,
num_train_epochs=3,
max_length=2048,
max_prompt_length=512,
)
# No ref_model needed!
trainer = ORPOTrainer(
model=model,
args=training_args,
train_dataset=preference_dataset,
tokenizer=tokenizer,
)
trainer.train()
Notice the absence of a ref_model parameter — ORPO does not need a reference model, saving significant GPU memory.
beta (lambda) — Weight of the odds ratio loss relative to the SFT loss. Typical values range from 0.05 to 0.5. Higher values emphasize preference alignment more strongly.ORPO’s biggest practical advantage is resource efficiency. By eliminating the reference model, ORPO reduces peak GPU memory by roughly 30-40% compared to DPO. For teams training 7B parameter models, this can mean the difference between needing 2 GPUs vs. 4 GPUs. The single-stage approach also halves the total training time compared to SFT + DPO pipelines.
The ORPO paper demonstrated strong results across multiple model sizes. Fine-tuning Phi-2 (2.7B), Llama-2 (7B), and Mistral (7B) with ORPO on the UltraFeedback dataset produced models that surpassed many larger models on standard benchmarks. On MT-Bench, ORPO-tuned Mistral-7B achieved scores competitive with models trained via the full SFT + DPO pipeline.
Understanding when to choose each method:
ORPO is particularly effective when:
L_ORPO = L_SFT + lambda * L_OR, where the SFT term teaches generation quality and the odds ratio term teaches preference discrimination.ORPOTrainer, making it straightforward to integrate into existing training workflows.