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
Advanced1. DPO Loss'unun Derivation'ı#
Adım 1 — Bradley-Terry preference model:#
İki cevap ( = chosen, = rejected) verildiğinde:
y_wy_lP(y_w ≻ y_l | x) = σ(r*(x, y_w) - r*(x, y_l))
r*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)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#
| β | Anlam | Pratik etki |
|---|---|---|
| 0.01 | Çok zayıf KL constraint | Policy SFT'den agresif uzaklaşır, riskli |
| 0.1 | Cookbook default | Dengeli, çoğu use-case için |
| 0.3-0.5 | Güçlü constraint | Policy 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 torchfrom unsloth import FastLanguageModelfrom datasets import load_datasetfrom 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 datasetdataset = load_dataset("HuggingFaceH4/ultrafeedback_binarized", split="train_prefs")# Format: {"prompt": "...", "chosen": "...", "rejected": "..."} # 3. DPO Configcfg = 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. Traintrainer = 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
- 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
Part 0 — Engineering Foundations
Welcome to the Fine-Tuning Cookbook: System, Stage Taxonomy, and the Reproducibility Contract
Start LearningPart 0 — Engineering Foundations
Reproducibility Stack: Seeds, cuDNN Flags, and Deterministic CUDA — End the 'Works on My Machine' Problem
Start LearningPart 0 — Engineering Foundations