Skip to content

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 Devrim: Rafailov 2023'ün Matematik Keşfi — RLHF'i Tek Loss Fonksiyonuna Sıkıştırmak
💎 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)#

  1. DPO'nun Hikâyesi — Mayıs 2023 anı
  2. Kapalı form çözümün matematik anlamı
  3. RLHF optimum policy'sini türetelim — Bradley-Terry + KL
  4. DPO'nun temel iddiası — π* = (1/Z) · π_ref · exp(r/β)
  5. Reward'ın policy'den çıkarılması — implicit RM
  6. DPO loss'un sıfırdan türevi
  7. β parametresinin yorumu — KL strength
  8. PyTorch implementation — TRL ile production
  9. Modern DPO varyantları — IPO (2024), KTO, SimPO
  10. Sayısal karşılaştırma: PPO vs DPO empirik
  11. DPO'nun sınırları — ne zaman PPO daha iyi
  12. Türkçe DPO pratik notlar
  13. 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ıyoruz
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import DPOTrainer, DPOConfig
from datasets import load_dataset
from peft import LoraConfig
 
MODEL_SFT = 'sukruyusufkaya/llama-3-8b-tr-instruct-sft'
OUTPUT_DIR = './llama-3-8b-tr-dpo'
 
# 1. Tokenizer
tokenizer = 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 QDPO
lora = 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 config
config = 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 trainer
trainer = DPOTrainer(
model=policy,
ref_model=None, # TRL otomatik oluşturur
args=config,
train_dataset=dataset,
tokenizer=tokenizer,
peft_config=lora, # LoRA aktif
)
 
# 8. Train
trainer.train()
trainer.save_model(OUTPUT_DIR + '/final')
 
# 9. (Opsiyonel) LoRA merge ve push
from peft import PeftModel
base = 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):
  1. HHH üçgenini anlat (Helpful, Harmless, Honest)
  2. 10 örnek üzerinde 'doğru cevap' tartış
  3. Edge case'leri göster (politik, dini, hassas)
  4. 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