İçeriğe geç

DPO Devrim: Rafailov 2023'ün Matematik Keşfi — RLHF'i Tek Loss Fonksiyonuna Sıkıştırmak

Direct Preference Optimization (Rafailov vd. 2023): RLHF'in 3 aşamasını tek supervised loss'a indiren matematik keşfin tam türevi. Reward model'in 'gizli reformülasyonu', Bradley-Terry + KL constraint optimum çözümü, neden DPO 'her LLM zaten reward model' diyor, kapalı form çözümün matematik anlamı. PPO ile sayısal karşılaştırma, modern DPO varyantları (IPO, KTO, SimPO), Türkçe DPO production pipeline'ı.

Şükrü Yusuf KAYA
85 dakikalık okuma
İleri
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.

Sık Sorulan Sorular

Çok güzel soru. Evet, **reference model (π_ref) lazım**. Ama bu reward model değil — reward model **özel olarak eğitilen** ek bir model. π_ref ise zaten elinde olan SFT model'i (Modül 14). Fark: - **Reward model**: yeni eğitim, yeni dataset (karşılaştırma), yeni inference compute (her PPO step'te kullan) - **Reference model**: SFT model'in dondurulmuş kopyası. Yeni eğitim yok. Karşılaştırma datasetini doğrudan kullan. Yani 'reward model gerek yok' = 'ek bir model eğitmen gerekmiyor'. Reference 'eski hâlini koruyan' bir snapshot. Sade ve elegantı bu yapıyor.

Yorumlar & Soru-Cevap

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

İlgili İçerikler