DPO Revolution: Rafailov 2023's Mathematical Discovery — Compressing RLHF into a Single Loss Function
Direct Preference Optimization (Rafailov et al. 2023): full derivation of the mathematical discovery that compresses RLHF's 3 stages into a single supervised loss. Reward model's 'hidden reformulation', optimum solution of Bradley-Terry + KL constraint, why DPO says 'every LLM is already a reward model', mathematical meaning of closed-form solution. Numerical comparison with PPO, modern DPO variants (IPO, KTO, SimPO), Turkish DPO production pipeline.
Şükrü Yusuf KAYA
85 min read
Advanced💎 DPO — RLHF'in 'Kuantum Mekaniği'
1925'te Heisenberg matris mekaniğini yazdı. Schrödinger 1926'da dalga mekaniğini. Önce farklı görünüyorlardı. Dirac 1929'da gösterdi: ikisi aynı şey. Tarihte böyle anlar var — karmaşık görünen şey, derine inilince inanılmaz basit. RLHF'in DPO anı 23 Mayıs 2023'te oldu. Stanford'dan Rafailov, Sharma, Mitchell, Ermon, Finn. 4 sayfa matematik. Sonuç şok: 'RLHF'in 3 aşamasına gerek yok. Reward model'e gerek yok. PPO'ya gerek yok. Tek supervised loss yeter.' Bu ders o 4 sayfayı satır satır türetiyor. Matematik fikrin şıklığından etkileneceksin. Bittiğinde, DPO loss'unu kendin yazabilir, PyTorch'ta implement edebilir, Türkçe için optimize edebileceksin. RLHF tarihinin estetik zirvesi.
Bu Derste Neler Var? (13 Bölüm)#
- DPO'nun Hikâyesi — Mayıs 2023 anı
- Kapalı form çözümün matematik anlamı
- RLHF optimum policy'sini türetelim — Bradley-Terry + KL
- DPO'nun temel iddiası — π* = (1/Z) · π_ref · exp(r/β)
- Reward'ın policy'den çıkarılması — implicit RM
- DPO loss'un sıfırdan türevi
- β parametresinin yorumu — KL strength
- PyTorch implementation — TRL ile production
- Modern DPO varyantları — IPO (2024), KTO, SimPO
- Sayısal karşılaştırma: PPO vs DPO empirik
- DPO'nun sınırları — ne zaman PPO daha iyi
- Türkçe DPO pratik notlar
- Egzersizler
1-2. DPO Hikâyesi ve Anlam#
1.1 Paper künyesi#
'Direct Preference Optimization: Your Language Model is Secretly a Reward Model'
Rafael Rafailov, Archit Sharma, Eric Mitchell, Stefano Ermon, Christopher D. Manning, Chelsea Finn
NeurIPS 2023 · Stanford
İlk versiyon: arXiv, 23 Mayıs 2023. AI Twitter'da yangın gibi yayıldı. 6 ay içinde fiili open-source standart.
1.2 Paper'ın iddiası#
Rafailov'un keşfi: 'RLHF'in optimal policy'si kapalı form ifade edilebilir. Bu ifade reward model'i içeriyor ama çevrilebilir — reward'ı policy'den çıkartabilirsin. Sonuç: reward model'i hiç eğitmeden, tercih verisinden doğrudan policy öğrenebilirsin.
3 aşama → 1 aşama. Karmaşıklık azaldı. Maliyet azaldı. Kalite aynı.
1.3 Niye 'gizemli'?#
Paper'ın alt başlığı: 'Your Language Model is Secretly a Reward Model'. Yani: hâlihazırda eğitilen bir LLM + referans model = örtük reward model.
Reward model ayrı eğitmek gereksizdi tüm bu zaman. LLM'in kendi log-probability'leri zaten reward sinyali. Tek yapman gereken doğru fonksiyonel formla bunu kullanmak.
2.1 Kapalı form çözüm fikri#
'Kapalı form' = matematiksel çözüm bir formülle yazılabiliyor.
Klasik RLHF: optimum policy iteratif (PPO) bulunuyor. Her step gradient adımı.
DPO keşfi: optimum policy doğrudan ifade edilebilir:
π*(a|s) = (1/Z(s)) · π_ref(a|s) · exp(r(s,a) / β)
İterasyona gerek yok — formül bunu söylüyor. Bunu tersine çevir, reward'ı bulmak için.
2.2 İçgörü#
İki adım yerine bir adım:
- Klasik RLHF: tercih → reward → optimum policy (iteratif)
- DPO: tercih → optimum policy (kapalı form)
Reward 'arada' olmadan, doğrudan tercihten policy'e geçiş. Bu paradigma değişimi.
3-6. DPO Matematiksel Türev#
3.1 RLHF'in objektif fonksiyonu#
RLHF'te politikayı şu hedefle bulduk:
max_π E_{(s,a)~π}[ r(s,a) ] - β · KL(π || π_ref)
- Reward'ı maksimize et
- Ama π_ref'ten çok uzaklaşma (KL penalty)
3.2 Çözümün türevi#
Kısıt: π toplam olasılığı 1 olmalı (Lagrange multiplier'a gerek var). Optimize edersek (matematiksel detayı atlayarak):
π*(a|s) = (1/Z(s)) · π_ref(a|s) · exp(r(s,a) / β)
Z(s) = normalization constant (toplam 1 olsun diye):
Z(s) = Σ_{a'} π_ref(a'|s) · exp(r(s,a') / β)
Bu formül RLHF'in optimum çözümü. Reward verildiğinde, optimum policy bu.
3.3 Reward'ı policy'den çıkartmak#
Formülü tersine çevirelim:
r(s,a) = β · log[π*(a|s) / π_ref(a|s)] + β · log Z(s)
Log Z(s) sabit, eylem a'ya bağlı değil. Bradley-Terry'de iki eylem farkı alındığında kaybolur:
r(s, a₁) - r(s, a₂) = β · log[π*(a₁|s) / π_ref(a₁|s)] - β · log[π*(a₂|s) / π_ref(a₂|s)]
Z(s) iptal oldu. Sadece policy log-ratio'ları kaldı.
4.1 Bradley-Terry'yi tercih verisine uygulayalım#
Karşılaştırma verisi: prompt s, chosen y_w, rejected y_l. Bradley-Terry:
P(y_w > y_l | s) = σ(r(s, y_w) - r(s, y_l))
Reward farkını DPO'nun formülüyle yerine koy:
P(y_w > y_l | s) = σ(β · log[π*(y_w|s)/π_ref(y_w|s)] - β · log[π*(y_l|s)/π_ref(y_l|s)])
4.2 DPO Loss#
Negatif log-likelihood:
L_DPO(θ) = -E_{(s,y_w,y_l)} [ log σ(β · log[π_θ(y_w|s)/π_ref(y_w|s)] - β · log[π_θ(y_l|s)/π_ref(y_l|s)]) ]
Bu DPO loss. Tek bir fonksiyon. Reward model yok. PPO yok. Sadece policy'i tercih verisinden eğit.
5.1 Loss'un yapısı#
Üç önemli parça:
Loss = -log σ( β · (log_ratio_chosen - log_ratio_rejected) )
- log_ratio: log[π_θ(y|s) / π_ref(y|s)] — model'in y'ye verdiği olasılık, reference model'e göre.
- β: KL penalty kuvveti (genelde 0.1)
- σ: sigmoid — Bradley-Terry olasılığa çeviriyor
5.2 Sezgisel okuma#
DPO loss düşmesi için:
- π_θ(chosen) artmalı (model chosen'u daha olası yapmalı)
- π_θ(rejected) azalmalı (model rejected'i daha olasısız yapmalı)
- Ama her ikisi de π_ref ile karşılaştırılıyor → SFT'den çok uzaklaşamaz
Net etki: model SFT etrafında tercih edilenleri kuvvetlendirir, tercih edilmeyenleri zayıflatır.
6.1 'Implicit reward model'#
DPO eğittiğin model'in kendisi, örtük bir reward model.
Reward bilgisi:
r_implicit(s, a) = β · log[π_θ(a|s) / π_ref(a|s)]
DPO eğitiminin sonunda model bu sayıyı 'biliyor' — açık reward head'i yok ama log-prob'larından çıkarabilirsin.
Bu güzel bir özellik: DPO sonrası, model'i reward model olarak kullanabilirsin (best-of-N sampling vs.).
python
# DPO Türkçe production — TRL DPOTrainer# Modül 14.3'teki SFT model üzerinden başlıyoruzimport torchfrom transformers import AutoTokenizer, AutoModelForCausalLMfrom trl import DPOTrainer, DPOConfigfrom datasets import load_datasetfrom peft import LoraConfig MODEL_SFT = 'sukruyusufkaya/llama-3-8b-tr-instruct-sft'OUTPUT_DIR = './llama-3-8b-tr-dpo' # 1. Tokenizertokenizer = AutoTokenizer.from_pretrained(MODEL_SFT)tokenizer.pad_token = tokenizer.eos_token # 2. Policy model (eğitilecek)policy = AutoModelForCausalLM.from_pretrained( MODEL_SFT, torch_dtype=torch.bfloat16,) # 3. Reference model (TRL otomatik oluşturuyor, ya da explicit)ref = AutoModelForCausalLM.from_pretrained( MODEL_SFT, torch_dtype=torch.bfloat16,)ref.eval() # Gradient yok # 4. Karşılaştırma datasetini yükle# format: {'prompt': '...', 'chosen': '...', 'rejected': '...'}dataset = load_dataset('sukruyusufkaya/turkish-preferences-10k', split='train') # 5. (Opsiyonel) LoRA ile QDPOlora = LoraConfig( r=16, lora_alpha=32, target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj'], lora_dropout=0.05, bias='none', task_type='CAUSAL_LM',) # 6. DPO configconfig = DPOConfig( output_dir=OUTPUT_DIR, num_train_epochs=2, per_device_train_batch_size=2, gradient_accumulation_steps=8, # effective batch 16 learning_rate=5e-6, # SFT'den 4x küçük, RLHF kararlılığı warmup_steps=100, lr_scheduler_type='cosine', beta=0.1, # KL penalty kuvveti max_length=2048, max_prompt_length=1024, bf16=True, logging_steps=10, save_steps=200, optim='paged_adamw_8bit', # memory verimli report_to='wandb', run_name='llama-3-8b-tr-dpo',) # 7. DPO trainertrainer = DPOTrainer( model=policy, ref_model=None, # TRL otomatik oluşturur args=config, train_dataset=dataset, tokenizer=tokenizer, peft_config=lora, # LoRA aktif) # 8. Traintrainer.train()trainer.save_model(OUTPUT_DIR + '/final') # 9. (Opsiyonel) LoRA merge ve pushfrom peft import PeftModelbase = AutoModelForCausalLM.from_pretrained(MODEL_SFT, torch_dtype=torch.bfloat16)model = PeftModel.from_pretrained(base, OUTPUT_DIR + '/final')merged = model.merge_and_unload()merged.push_to_hub('sukruyusufkaya/llama-3-8b-tr-dpo-merged') # Maliyet: 1× H100 24 saat ~ $60. Eğitim 2 saat süren küçük datasetler için $5-10. Türkçe Llama-3 DPO — TRL Production Script
9-11. Modern DPO Varyantları + PPO vs DPO#
9.1 IPO (Identity Preference Optimization, Azar 2024)#
DPO'nun teorik problemi: tercih veri tutarsız ise (insanlar bazı örneklerde A, bazılarında B tercih etmiş benzer karşılaştırmalarda), DPO overshoot yapıyor — chosen'a çok yüksek olasılık, rejected'a çok düşük.
IPO çözümü: log-ratio farkına lineer loss (sigmoid yerine):
L_IPO = E[(log[π_θ(y_w)/π_ref(y_w)] - log[π_θ(y_l)/π_ref(y_l)] - 1/(2β))²]
Karşılaştırma: DPO çok agresif, IPO daha temkinli. Empirik: IPO bazı setup'larda daha stabil.
9.2 KTO (Kahneman-Tversky Optimization, Ethayarajh 2024)#
DPO'nun başka problemi: paired data (chosen + rejected birlikte) gerekli. Hayatın çoğu zaman 'iyi/kötü' tek tek geliyor (thumbs up/down).
KTO: paired olmayan binary feedback ile çalışıyor. Loss tasarımı Kahneman-Tversky 'prospect theory'sinden ilham alıyor (kazanç değil risk aversiyonu).
Üretimde: KTO production verisi (👍/👎) ile direkt eğitim.
9.3 SimPO (Meng 2024)#
DPO'nun başka bir limit: reference model gerekiyor. Her eğitim iki forward pass.
SimPO: reference model'i tamamen ortadan kaldır. Sadece policy'in log-prob'larını uzunlukla normalize et:
L_SimPO = -log σ(β · (avg_log_prob(y_w) - avg_log_prob(y_l)) - γ)
γ = margin parameter. Avg log prob = log_prob / token sayısı.
Memory ve compute %50 düşer. Empirik: yarış halinde DPO ile.
10.1 PPO vs DPO Empirik#
Rafailov 2023 paper'ında:
- Anthropic HH dataset → DPO PPO ile comparable (statistically tied)
- TLDR Reddit özetleme → DPO PPO'dan daha iyi
- IMDB pozitif sentiment → DPO PPO'dan biraz daha iyi
Genel: DPO kayıpsız, çoğu zaman daha iyi veya eşit.
10.2 Maliyet karşılaştırması (Türkçe Llama-3-8B için)#
- PPO: 4 H100, 24 saat, $240-400 (her ek iterasyon)
- DPO: 1 H100, 24 saat, $60 (tek pass)
DPO 4-6× daha ucuz.
11.1 DPO'nun limitleri#
Offline öğrenme: tercih verisi sabit. Model production'da yeni soru ile karşılaşırsa, davranışını ayarlayamaz.
İteratif iyileştirme zor: DPO bir kez eğit, bitti. Yeni veri toplayıp tekrar başlat — yavaş döngü.
Reward magnitude yok: DPO sadece sıralama öğrenir. 'A çok iyi, B kötü' farkı 'A iyi, B yeterli' farkından ayırt edemez.
Frontier reasoning: o1, DeepSeek-R1 tarzı uzun reasoning için DPO yetmez. RL gerekli.
12. Türkçe DPO Pratik Notlar#
12.1 Türkçe için DPO veri toplama#
Format:
{ 'prompt': 'İstanbul'da Boğaz'a yakın romantik restoran tavsiye et.', 'chosen': 'Çırağan Palace içindeki Tugra harika seçim. Boğaz manzarası muhteşem...', 'rejected': 'İstanbul'da çok güzel restoranlar var. İnternet üzerinden bakabilirsiniz.' }
Hedef: 5K-50K karşılaştırma. Küçük ekipler için 5-10K yeter.
Kaynaklar:
- Mevcut Türkçe SFT modelinin (Modül 14.3) çıktılarını topla
- 2 sample her prompt için (farklı temperature)
- İnsan etiketleyici hangisini tercih ediyor
12.2 Etiketleyici eğitimi#
Türkçe etiketleyici eğitimi (1-2 saat):
- HHH üçgenini anlat (Helpful, Harmless, Honest)
- 10 örnek üzerinde 'doğru cevap' tartış
- Edge case'leri göster (politik, dini, hassas)
- Tutarlılık testi: aynı 5 örneği farklı zamanlarda etiketle
12.3 Hyperparametre önerileri#
Llama-3-8B + Türkçe için:
- β = 0.1 (KL penalty) — standart
- lr = 5e-6 — SFT'den 4x düşük
- batch_size = 16 (gradient accumulation)
- epoch = 1-2 — fazla overfitting riski
- max_length = 2048
- warmup_steps = 100
- LoRA r=16 — memory-efficient
12.4 Evaluation#
DPO sonrası model'i değerlendirmek için:
- MT-Bench-Türkçe: GPT-4 hakem ile çoklu görev
- Held-out karşılaştırmalar: %10 etiketleme dışında tut, accuracy ölç
- Manual sample inspection: 50 cevap, kalite kontrolü
- Capability tax: SQuAD-TR veya benchmark üzerinde regression yok mu kontrol et
12.5 Pratik metrikler#
Llama-3-8B-Instruct (RLHF'lenmiş zaten) + Türkçe DPO ile:
- Win rate vs base: %65-75 (kullanıcılar Türkçe DPO'yu tercih ediyor)
- MT-Bench-TR: +0.5-1.0 puan (10 üzerinden)
- Maliyet: $50-200
- Süre: 1-3 gün (veri toplama + eğitim)
Karşılaştırma: tam Türkçe PPO RLHF (RM dahil): $500-1500, 1-2 hafta.
✅ Ders 15.4 Özeti — DPO Devrim
Rafailov 2023 DPO matematiği AI eğitiminin estetik zirvesi. Bradley-Terry tercih modeli + KL constraint → kapalı form çözüm → reward'ı policy'den çıkartmak → 3 aşama 1 aşamaya iniyor. L_DPO: tek log σ() loss, reward model yok, PPO yok. Sezgisel: model SFT etrafında chosen'ı yukarı, rejected'ı aşağı çekiyor, KL ile sınırlı. β = 0.1 standart. Maliyet: PPO'dan 4-6× ucuz. Kalite: çoğu senaryoda eşit, bazı senaryolarda daha iyi. Modern varyantlar: IPO (overshoot fix), KTO (paired-data-free), SimPO (reference-model-free). Türkçe DPO: 5-10K karşılaştırma yeter, 1 H100, $50-200, MT-Bench-TR +0.5-1.0. Open-source ekosistemin fiili standardı. Sonraki ders: GRPO, DeepSeek-R1'in reasoning RL'i — DPO'nun online RL'e dönüştürülmüş hâli.
Sonraki Ders: GRPO ve Reasoning RL#
Ders 15.5'te GRPO (Group Relative Policy Optimization) — DeepSeek-R1'in reasoning model'lerini eğittiği teknik. PPO'nun reference model'i sürekli güncellenmiş hâli + DPO benzeri grup karşılaştırması. Reasoning chain'lerini ödüllendirme. o1-tarzı modelleri açık kaynakla eğitmek. Modül 17'de detaylanan reasoning models'in matematiksel temeli.
Frequently Asked Questions
Great question. Yes, **reference model (π_ref) needed**. But this isn't a reward model — reward model is **specifically trained** extra model. π_ref is just SFT model (Module 14) you already have.
Difference:
- **Reward model**: new training, new dataset (comparisons), new inference compute (used every PPO step)
- **Reference model**: frozen copy of SFT model. No new training. Use comparison dataset directly.
So 'no reward model needed' = 'no extra model to train'. Reference is a 'preserved snapshot'. This makes it simple and elegant.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
Related Content
Module 0: Course Framework & Workshop Setup
Who Is an LLM Engineer? The AI Engineering Career Ladder from Junior to Staff
Start LearningModule 0: Course Framework & Workshop Setup
Course Philosophy: Why This Path, Why This Order — The Skeleton of an 8-Month Curriculum
Start LearningModule 0: Course Framework & Workshop Setup