Skip to content

DPO Math: Bradley-Terry → Loss Function Derivation — Why No Reward Model?

DPO (Rafailov et al. 2023) — mathematical equivalent of RLHF, but SINGLE-stage. Bradley-Terry preference model → KL-constrained RL objective → closed-form policy gradient → SFT-like loss. β hyperparameter's effect on gradient, DPO TRL DPOTrainer Lab on RTX 4090.

Şükrü Yusuf KAYA
38 min read
Advanced
DPO Math: Bradley-Terry → Loss Function Derivation — Niye Reward Model Gerekmez?

1. DPO Loss'unun Derivation'ı#

Adım 1 — Bradley-Terry preference model:#

İki cevap (
y_w
= chosen,
y_l
= rejected) verildiğinde:
P(y_w ≻ y_l | x) = σ(r*(x, y_w) - r*(x, y_l))
r*
= optimal reward function.

Adım 2 — KL-constrained RL objective:#

max_π E[r(x, y)] - β · KL(π || π_ref)
Closed-form solution (analytical, no PPO needed):
π*(y | x) = (1/Z(x)) · π_ref(y | x) · exp(r*(x, y) / β)

Adım 3 — Solve for r* in terms of π* and π_ref:#

r*(x, y) = β · log(π*(y | x) / π_ref(y | x)) + β · log Z(x)

Adım 4 — Substitute into BT:#

Z(x)
her iki tarafta var, cancel olur:
P(y_w ≻ y_l | x) = σ(β · log(π*(y_w|x)/π_ref(y_w|x)) - β · log(π*(y_l|x)/π_ref(y_l|x)))

Adım 5 — DPO loss:#

L_DPO = -E[ log σ(β · log(π_θ(y_w|x)/π_ref(y_w|x)) - β · log(π_θ(y_l|x)/π_ref(y_l|x))) ]
Sonuç: Reward model'i hesaplamadan, doğrudan policy'yi preference data ile train et. Tek aşamada.

2. β Hyperparameter — Pratik Rehber#

βAnlamPratik etki
0.01Çok zayıf KL constraintPolicy SFT'den agresif uzaklaşır, riskli
0.1Cookbook defaultDengeli, çoğu use-case için
0.3-0.5Güçlü constraintPolicy SFT'ye yakın, az değişim
1.0+Çok güçlüDPO etkili olmaz, neredeyse SFT
β'yı pratikte nasıl seçersin?
  • Başlat: β=0.1
  • Eğer model "boş cevaplar" üretmeye başlarsa (over-optimization) → β yükselt
  • Eğer DPO çok az kazandırırsa → β düşür
Gradient anatomy:
∂L_DPO/∂θ = -β · σ'(β · diff) · (∇log π_θ(y_w) - ∇log π_θ(y_l))
β büyük → gradient büyük → daha agresif update.
python
# === DPO Lab — TRL DPOTrainer RTX 4090 ===
import torch
from unsloth import FastLanguageModel
from datasets import load_dataset
from trl import DPOConfig, DPOTrainer
 
# 1. Load SFT'ed model (DPO için reference base — SFT'den geldiyse iyi)
model, tok = FastLanguageModel.from_pretrained(
"llama-3.1-8b-tr-instruct/final", # önceki SFT'den
max_seq_length=4096,
dtype="bfloat16", load_in_4bit=True,
)
model = FastLanguageModel.get_peft_model(
model, r=32, lora_alpha=64,
target_modules=["q_proj","k_proj","v_proj","o_proj"],
use_gradient_checkpointing="unsloth",
)
 
# 2. Preference dataset
dataset = load_dataset("HuggingFaceH4/ultrafeedback_binarized", split="train_prefs")
# Format: {"prompt": "...", "chosen": "...", "rejected": "..."}
 
# 3. DPO Config
cfg = DPOConfig(
output_dir="llama-3.1-8b-tr-dpo",
num_train_epochs=1,
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
learning_rate=5e-6, # DPO için DÜŞÜK lr (SFT'nin 1/50'si)
warmup_ratio=0.05,
lr_scheduler_type="cosine",
bf16=True, optim="paged_adamw_8bit",
max_length=4096,
max_prompt_length=2048,
beta=0.1, # KL strength
loss_type="sigmoid", # standart DPO loss
logging_steps=5,
save_steps=100, report_to="wandb",
)
 
# 4. Train
trainer = DPOTrainer(
model=model,
ref_model=None, # PEFT için — base model otomatik ref
args=cfg,
train_dataset=dataset,
tokenizer=tok,
)
trainer.train()
 
# Bench:
# - 50K pref pairs, 1 epoch, ~80 dakika RTX 4090
# - TR-MMLU: SFT 39.8 → DPO 40.2 (+0.4)
# - MT-Bench-TR: SFT 7.18 → DPO 7.51 (+0.33)
DPO TRL Lab — RTX 4090
🐛 FMD — 'DPO başarılı görünüyor ama model artık eski capability'yi kaybetti'
Hipotezler: (a) β çok düşük (0.01-0.05) → policy SFT'den çok uzaklaştı. Çözüm: β=0.1-0.2'ye çık. (b) Lr çok yüksek (>1e-5) → DPO instability. Çözüm: 5e-6 default. (c) Reference model SFT değil de base — değişim çok büyük. Çözüm: SFT'li model'i hem ref hem trainable olarak başla. (d) SFT mix data DPO'ya katılmamış → catastrophic forgetting. Çözüm: RPO/CPO yöntemleriyle SFT loss ekle. Drill: β=0.05, 0.1, 0.3 sweep'i koş.
✅ Teslim
  1. Cookbook DPO Lab'ı koş. 2) Pre/post DPO MT-Bench-TR ölç. 3) β=0.05/0.1/0.3 sweep. 4) Sonraki ders: 11.3 — DPO Implementation From Scratch.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content