Sampling Sanatı Derinlemesine: Greedy, Beam, Top-K, Top-P, Min-P, DRY, Tail-Free — Hepsi Production'da
Production-level sampling stratejileri: temperature/top-k/top-p/min-p/typical-p/tail-free/DRY repetition penalty, beam search ve diverse beam, contrastive decoding, speculative sampling, reasoning model'larda sampling, structured output ile sampling, multi-sample self-consistency.
Şükrü Yusuf KAYA
55 dakikalık okuma
Orta🎲 Sampling, LLM çıktısının kalitesinin %30'u
Mükemmel bir model + yanlış sampling = vasat çıktı. Sıradan bir model + iyi sampling = mükemmel çıktı. Bu paradoks LLM mühendisinin çoğu zaman gözden kaçırdığı detay. Ders 1.5'te temellerini gördük; bu ders production-grade detay. 55 dakika sonra: temperature niye 0.7, top-p niye 0.9 deniyor, niye DRY penalty modern LLM'lerde standard, niye reasoning model'lar temperature=1 ile çalışıyor — hepsini bileceksin.
Ders Haritası (Detaylı)#
- Sampling'in tek-cümlelik amacı
- Greedy decoding: ne zaman doğru, ne zaman tuzak
- Temperature: dağılımın termodinamiği
- Top-K: en olası K
- Top-P (Nucleus): adaptive cutoff
- Min-P: relative threshold — modern öneri
- Typical-P, Tail-Free: niş alternatifler
- Repetition penalty + DRY: tekrar engelleme
- Beam search: deterministic search
- Speculative decoding: hız için
- Multi-sample self-consistency: reasoning için
- Structured output sampling: JSON, kod
- Reasoning model sampling: o1, R1 farkı
- Sampling presets: hangi senaryoda hangisi
1. Sampling'in Tek-Cümlelik Amacı#
Modelin ürettiği distribution'dan, hedef niteliklerine sahip token'ı seçmek.
Hedef nitelikler:
- Coherence (anlamlı, akıcı metin)
- Diversity (yaratıcılık, çeşitlilik)
- Factuality (doğru bilgi)
- Compliance (format, kurallar)
- Speed (latency)
Hiçbir sampling stratejisi 5'i birden maksimize edemez. Sen trade-off'a karar veriyorsun.
Pratik karar matrisi#
| Öncelik | Önerilen başlangıç |
|---|---|
| Coherence + factual | T=0.0-0.3 |
| Yaratıcılık | T=0.8-1.0, top-p=0.95 |
| Çeşitlilik (multi-sample) | T=0.7, top-p=0.95 + DRY |
| Kod | T=0.1-0.3 + greedy fallback |
| Structured output | T=0.0 + constrained decoding |
| Reasoning | T=0.7 + multi-sample voting |
2. Greedy Decoding — Deterministik Ama Tuzaklı#
next_token = argmax P(x | context)
Ne zaman çalışıyor?#
- Kısa, factual cevaplar: "Türkiye'nin başkenti?" → "Ankara"
- Code completion: belirgin doğru cevap var
- Mathematical reasoning: deterministic step'ler
Tuzakları#
1. Repetition loops
"The cat sat on the cat sat on the cat sat on..."
Bir kelime yüksek olasılıkta tekrar tahmin edildiğinde, attention pattern aynı kalıyor → sonsuz döngü.
Çözüm: repetition penalty veya DRY (aşağıda).
2. Bland output
Her zaman 'most likely' = 'most generic'. Hikaye yaratımı, brainstorming için kötü.
3. Local optimum
Token başına en iyi != sequence olarak en iyi. Beam search bunu kısmen düzeltir.
Pratik#
temperature=0temperature → 0temperature=0Modern reasoning model'larda#
OpenAI o1, DeepSeek-R1 gibi reasoning model'lar greedy değil — temperature=0.7-1.0 kullanılır. Niye? Çünkü reasoning diversity gerektiriyor (multi-sample voting için). Tek-shot deterministic değil.
3. Temperature — Dağılımın Termodinamiği#
Logit'leri T ile böl, sonra softmax:
Termodinamik benzetim#
- T → 0: "dondur" — tek bir token dominant (greedy)
- T = 1: "natural" — orijinal training distribution
- T → ∞: "kaynat" — uniform distribution
Pratik değerler#
| T değeri | Sonuç |
|---|---|
| 0.0 | Greedy (deterministik) |
| 0.1-0.3 | Mostly deterministic, küçük varyasyon |
| 0.5-0.7 | Coherent + slight diversity |
| 0.8-1.0 | Natural creative (default OpenAI) |
| 1.0-1.5 | High creativity, bazı saçma çıktılar |
| 2.0+ | Mostly noise |
Önemli: T training distribution'a etkili#
Pretrain training'i tipik distribution üzerine yapılıyor. ile sampling = en doğal çıktılar.
T=1T=1RLHF sonrası model overconfident — distribution çok sharp. daha doğal cevap verir. ChatGPT default'u T=1 ama gerçekte T_effective 0.5-0.7 (RLHF sharpening).
T=1.5-2.0Mathematical thinking#
T küçükse:
logit_1 = 5, logit_2 = 4 → T=1: prob 0.73 vs 0.27 → T=0.1: prob ≈ 0.9999 vs 0.0001
T büyükse:
→ T=10: prob 0.525 vs 0.475 (neredeyse uniform)
python
import torchimport torch.nn.functional as F # Bir distribution examplelogits = torch.tensor([5.0, 4.0, 2.0, 1.0, 0.0, -1.0])print("Token | Logit | T=0.1 | T=1.0 | T=2.0")print("-" * 50)for t in [0.1, 1.0, 2.0]: probs = F.softmax(logits / t, dim=-1) print(f"T={t}:", " | ".join(f"{p:.4f}" for p in probs)) # Entropi karşılaştırmasıfor t in [0.1, 0.5, 1.0, 2.0, 5.0]: probs = F.softmax(logits / t, dim=-1) ent = -(probs * torch.log(probs + 1e-10)).sum() print(f"T={t}: entropy = {ent:.3f}")Temperature'ın dağılım üzerindeki termodinamik etkisi.
4. Top-K Sampling#
Sadece en yüksek K token arasında sample:
1. logits'leri sırala 2. Top-K'sını al 3. Geri kalanı -inf yap 4. Softmax + sample
Pratik değerler#
| K değeri | Etki |
|---|---|
| 1 | Greedy |
| 5-10 | Çok deterministic |
| 40-50 | Klasik default (HuggingFace, OpenAI eskisi) |
| 100+ | Esnek, top-p ile birlikte ya da değil |
| 0 / disabled | Top-p'ye bırak |
Sorun#
Fixed K her bağlamda doğru değil:
- Bağlam belirsizse, distribution flat → K=50 yeterli olmayabilir, anlamlı diversity gerek
- Bağlam çok belirginse, K=50 noise getirir (zaten ilk 3 token toplam %99)
Bu yüzden modern öneri: top-p.
5. Top-P (Nucleus) Sampling#
Holtzman et al. 2020 — "The Curious Case of Neural Text Degeneration".
1. logits'leri sırala 2. Kümülatif olasılık P'e ulaşana kadar token al 3. Geri kalanı -inf yap 4. Softmax + sample
Adaptive cutoff#
- Distribution sharp (örn. tek token %95): top-p=0.9 sadece 1 token alır
- Distribution flat (uniform-ish): top-p=0.9 belki 100+ token alır
Bağlama göre dinamik nucleus size — top-k'nın superior versiyonu.
Pratik değerler#
| P değeri | Sonuç |
|---|---|
| 0.5 | Çok deterministic (sadece nucleus top tokens) |
| 0.9 | Klasik default (HuggingFace) |
| 0.95 | OpenAI default |
| 0.99 | Neredeyse tüm distribution |
| 1.0 | Disabled |
Birlikte kullanım: T + top-p#
Modern API'lerde standart:
temperature = 0.7 top_p = 0.95
Önce T uygulanıyor (dağılımı şekillendir), sonra top-p ile nucleus.
6. Min-P Sampling — Modern Öneri (2023)#
Nguyen 2023 — top-p'nin geliştirilmiş alternatifi.
1. En yüksek olasılık p_max'i bul 2. Threshold = min_p × p_max 3. Threshold'un altındaki tüm token'ları kes 4. Re-normalize + sample
Sezgi#
Top-p absolute kümülatif eşik. Min-p relative — en olası token'a göre.
Distribution: [0.6, 0.2, 0.08, 0.05, 0.04, 0.03, ...] min-p = 0.1 → threshold = 0.6 × 0.1 = 0.06 Tutulanlar: 0.6, 0.2, 0.08 (≥0.06) Atılanlar: 0.05, 0.04, 0.03, ... (<0.06)
Avantaj#
- Top-p'nin tail problem'i çözer: distribution flat'ken top-p garbage token'ları dahil edebilir
- Top-k'nın fixed-size problem'i çözer: adaptive
Pratik değerler#
- min_p = 0.05: konservatif (default)
- min_p = 0.1: dengeli
- min_p = 0.2: daha agresif filtreleme
Adoption#
- llama.cpp default: min_p = 0.05
- Open WebUI: min_p destekli
- vLLM: min_p sampler available
- OpenAI/Anthropic API: henüz değil
Modern open-source community min_p'yi top-p'den üstün görüyor.
7. Typical-P ve Tail-Free Sampling — Niş Alternatifler#
Typical-P (Meister 2022)#
Locally typical sampling. Token'ların entropi anomalisi'ne göre filtrele. "Çok yüksek olasılıklı + çok düşük olasılıklı" token'ları at, typical olanları tut.
Kullanım niş; HuggingFace transformers destekliyor. Pratik etki marjinal.
Tail-Free Sampling (Cassidy 2019)#
Distribution'da second derivative'i en yüksek noktayı bul → orası "tail başlangıcı" → tail'i kes.
Yine niş; bazı RP (roleplay) topluluğunda popüler.
Pratik tavsiye#
Çoğu LLM mühendisi:
- Temperature ayarla (0.7 başlangıç)
- Top-p veya min-p ekle (0.95 veya 0.05)
- DRY repetition penalty uygula (aşağıda)
Bu üçlü %90 use case'i kapsıyor.
8. Repetition Penalty ve DRY#
Klasik repetition penalty (Keskar 2019):
P(x) ← P(x) / penalty if x in past tokens
penalty > 1Sorun#
Naif penalty bağımsız token'ları da cezalandırıyor. "the" gibi yüksek-frekans token tekrar etmemeli mi? Cezalandırırsan grammar bozulur.
DRY (Don't Repeat Yourself) — 2024#
Pengyu 2024: smarter repetition penalty. N-gram bazlı:
- Recent context'te bir 2-gram veya 3-gram göründü mü?
- Görüldüyse, devam edecek token'ı cezalandır (sadece o token, izole değil)
Pratik adoption#
- llama.cpp, vLLM, Open WebUI: DRY destekli
- OpenAI/Anthropic: standart repetition penalty
- Genel öneri: DRY > standart repetition penalty
Parametreler (DRY için)#
dry_multiplier = 0.8 # ceza şiddeti dry_base = 1.75 # exponential base dry_allowed_length = 2 # cezalandırmaya başlama uzunluğu
9. Beam Search — Deterministic Search#
Greedy: token başına argmax.
Beam: B paralel hipotez tut, her step'te genişlet, en yüksek B'i tut.
Algoritma#
1. Beam width B (örn. 5) 2. Initial: B copies of empty sequence 3. Repeat: - Her hipoteze, top-V token'ları ekle → B*V candidate - Score = log P(sequence) - Top B'i tut 4. Stop: EOS veya max_length
Niye?#
Greedy local optimum, beam global daha iyi:
Step 1: greedy "The" (P=0.4), alternatif "An" (P=0.35) Step 2: "The cat" P=0.4*0.6=0.24 vs "An elephant" P=0.35*0.9=0.315 → Greedy "The cat", ama "An elephant" daha olası sequence → Beam B=2 her ikisini tutar, sonra seçer
Pratik kullanım#
- Translation: tipik beam=5
- Summarization: beam=4-8
- Code generation: greedy yeter
Sınırları#
- Diversity yok: top-B genelde benzer (length normalization helps)
- Generation maliyetinin B katı
- Çoğu zaman vasat: "safe" ama bland çıktılar
- Modern LLM'lerde rare: ChatGPT, Claude beam kullanmıyor (chatbot için sampling daha iyi)
Diverse Beam Search#
Vijayakumar 2018 — beam'leri grupla, gruplar arası diversity penalty. Daha çeşitli çıktı için.
10. Speculative Decoding — Hız İçin#
Leviathan 2023 — büyük model'in inference'ını hızlandır.
Fikir#
- Draft model (küçük): hızlı, "tahmin et"
- Target model (büyük): yavaş, "doğrula"
1. Draft model 5-10 token "tahmin et" üretir (hızlı) 2. Target model bu tahminleri tek forward pass'te verify eder 3. Doğru tahminleri kabul et, yanlıştan itibaren regenerate
Hızlanma#
Tipik 2-3x latency düşüş. Quality kaybı 0 (matematiksel olarak target dağılımıyla aynı).
Varyantları#
- Medusa: target model üzerine ek head ekle, ayrı draft model gerek değil
- EAGLE/EAGLE-2: feature-level speculation, daha hızlı
- Lookahead Decoding: parallel n-gram tahmin
Production#
- vLLM: speculative_decoding parameter
- TensorRT-LLM: medusa support
- OpenAI/Anthropic internal: muhtemelen kullanıyorlar (açıklamıyorlar)
Modül 34'te detayda.
11. Multi-Sample Self-Consistency — Reasoning İçin#
Wang 2022 — "Self-Consistency Improves Chain-of-Thought Reasoning".
Fikir#
Tek bir reasoning chain yetersiz. Birden çok sample al, çoğunluğu seç.
1. Aynı prompt'a N kez sample (T=0.7, top-p=0.95) 2. Her sample'dan final answer'ı extract 3. Most common answer = en olası doğru cevap (majority voting)
Niye çalışıyor?#
Doğru cevap genelde multiple reasoning paths'ten ulaşılır. Yanlış cevaplar diverse şekillerde yanlış. Çoğunluk → genelde doğru.
Pratik#
- N = 5-40 (compute budget'a göre)
- Math benchmarks: %5-15 absolute improvement
- Coding benchmarks: %3-10 improvement
Modern reasoning model'lar#
OpenAI o1, DeepSeek-R1 self-consistency'i internalize etmiş. Tek bir reasoning chain üretiyor ama "düşünme" sırasında multiple paths explore ediyor (internal CoT).
Self-consistency hâlâ relevant — özellikle production'da çok yüksek-stakes karar için (medical, legal).
12. Structured Output Sampling#
JSON, kod, SQL gibi structured output için sampling değişiyor.
Constrained decoding#
Output format'ı (JSON schema, grammar) verilirse, invalid token'ları -inf ile maskelersin:
Token kümesi V_valid: bağlama göre geçerli token'lar P(x | context) = 0 if x not in V_valid P(x | context) ∝ original if x in V_valid
Araçlar#
- Outlines (Python): grammar-based constrained generation
- Instructor: Pydantic-based JSON enforcement
- XGrammar (vLLM 2024): hızlı CFG-based
- OpenAI structured output mode: native support
- Anthropic tools: JSON forced
Performance#
Constrained decoding doğru çıktı garantili ama:
- Generation 1.5-3x yavaş (mask computation)
- Bazen "natural" cevabı kısıtlıyor (creativity sacrifice)
- Complex schema'da yanlış yaratabilir (model şüphede)
Best practice#
- Production'da JSON output istiyorsan: OpenAI structured output mode veya Outlines
- Sampling parametreleri: T=0.0-0.3 (factual output için)
- Validation: çıktıyı yine de Pydantic'le verify et
Modül 40 (Structured Output) detayda.
13. Reasoning Model Sampling — o1, R1 Farkı#
Klasik LLM (Llama 3): greedy genelde best.
Reasoning model (o1, R1, GPT-5 thinking): farklı dynamics.
T=0Niye reasoning model'da T>0?#
- Multi-sample reasoning training: model T=0.7 ile eğitildi, T=0 OOD
- Internal CoT diversity: thinking sırasında multiple paths
- Self-consistency baked in: tek-shot bile internal voting'a yakın
Default'lar#
- OpenAI o1: T=1 (settable but discouraged)
- DeepSeek-R1: recommended T=0.6
- Claude reasoning: T=1 default
Pratik#
Reasoning model'larda parameter tuning daha az gerekli. Bunlar generally robust. Modül 25 (Reasoning Models) detayda.
Maliyet trade-off#
Reasoning model: 5-15x cost vs fast model. Multi-sample voting değil sadece single sample yetiyor.
Klasik: 5 sample × $0.001 = $0.005 (self-consistency) Reasoning: 1 sample × $0.015 = $0.015 (built-in reasoning)
Reasoning daha pahalı ama tek-shot reliable. Multi-step automation'da reasoning daha güvenli.
14. Sampling Presets — Hızlı Karar Matrisi#
| Senaryo | Önerilen Parameters |
|---|---|
| Code completion (greedy) | T=0.0, top_p=1.0 |
| Code generation (creative) | T=0.2, top_p=0.95 |
| Factual QA | T=0.3, top_p=0.9, DRY=0.8 |
| Summarization | T=0.5, top_p=0.95 |
| Chat (creative) | T=0.8, top_p=0.95, DRY=0.8 |
| Brainstorming | T=1.0, top_p=0.95, no_repeat=3 |
| Roleplay (creative writing) | T=1.0, top_p=0.95, min_p=0.05, DRY |
| Translation | T=0.3, beam=4 |
| Math reasoning (self-consistency) | T=0.7, N=10 samples, majority vote |
| Reasoning model (o1, R1) | T=0.7-1.0, no top-p constraint |
| Structured output (JSON) | T=0.0, constrained decoding |
| Long-form writing | T=0.7, top_p=0.95, min_p=0.05, DRY=1.0 |
python
# Production sampling — vLLM ile multi-strategyfrom vllm import LLM, SamplingParams llm = LLM(model="meta-llama/Llama-3.1-8B-Instruct") # Strategy 1: Factual QAfactual_params = SamplingParams( temperature=0.3, top_p=0.9, max_tokens=200, repetition_penalty=1.05,) # Strategy 2: Creative writingcreative_params = SamplingParams( temperature=1.0, top_p=0.95, min_p=0.05, # vLLM 0.6+ destekli repetition_penalty=1.1, max_tokens=1000,) # Strategy 3: Code generation (greedy fallback)code_params = SamplingParams( temperature=0.0, # greedy top_p=1.0, max_tokens=500,) # Strategy 4: Self-consistency reasoning (multi-sample)reasoning_params = SamplingParams( temperature=0.7, top_p=0.95, n=10, # 10 sample max_tokens=500,) # Kullanımprompt = "Solve: 2x + 5 = 13"outputs = llm.generate(prompt, reasoning_params)samples = [o.text for o in outputs[0].outputs] # Majority voting (basit example)from collections import Counterdef extract_answer(text): # Regex veya parser ile cevabı çıkar import re match = re.search(r"x\s*=\s*([-\d.]+)", text) return match.group(1) if match else None answers = [extract_answer(s) for s in samples]votes = Counter(filter(None, answers))print(f"Most common answer: {votes.most_common(1)}")vLLM ile production sampling strategies.
15. Mini Egzersizler#
-
Temperature etkisi: Logits [3.0, 1.0, -1.0]. T=0.1, 1.0, 5.0 için softmax dağılımları?
-
Top-p vs Min-p: Distribution [0.5, 0.2, 0.1, 0.08, 0.05, 0.04, 0.03]. top_p=0.9 ile hangi token'lar tutulur? min_p=0.1 ile?
-
Self-consistency pratiği: Math problem'a 10 sample → 7'si "x=3", 2'si "x=4", 1'i "no solution". Final cevap? Confidence?
-
Greedy loop: "I am happy and I am happy and I am happy..." durumunu yaratan tipik sebep nedir? 3 çözüm önerin.
-
Reasoning model T=0: o1'i T=0 ile çalıştırırsam ne olur? Niye recommended değil?
Bu Derste Neler Öğrendik?#
✓ Sampling = distribution'dan hedefe uygun token seçimi
✓ Greedy — deterministik ama loop, bland riski
✓ Temperature — dağılımın termodinamiği
✓ Top-K — fixed-size, modern öneri değil
✓ Top-P — adaptive nucleus, klasik default
✓ Min-P — relative threshold, 2024 modern öneri
✓ Typical-P, Tail-Free — niş alternatifler
✓ Repetition penalty + DRY — modern n-gram-based ceza
✓ Beam search — translation/summarization legacy
✓ Speculative decoding — 2-3x latency speedup
✓ Multi-sample self-consistency — reasoning için %5-15 improvement
✓ Structured output sampling — JSON/code için constrained
✓ Reasoning model sampling — T=0.7-1.0 default
✓ Presets matrisi — 12 senaryo için doğru parameter
Sıradaki Ders#
4.4 — Logit Gözlemciliği: logprobs ile Modelin Zihnini Okuma
4.1'de logprobs'a giriş yaptık. Şimdi production-grade detay: confidence-based filtering, hallucination detection, prompt diagnostics, model probing experiments. Hangi token'da model 'şüpheli', hangi token'da 'emin'.
Sık Sorulan Sorular
OpenAI API'sinde 2026 başı itibarıyla **min_p yok**. Sadece temperature ve top_p. Open-source local inference (vLLM, llama.cpp, Ollama) min_p destekliyor — daha modern. Anthropic Claude API'sinde de min_p yok. Pratik: cloud API kullanıyorsan top_p (0.95) yeter. Lokal/self-host için min_p (0.05) tercih.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Modül 0: Kurs Çerçevesi ve Atölye Kurulumu
LLM Engineer Kimdir? Junior'dan Staff'a Yapay Zekâ Mühendisliği Kariyer Haritası
Öğrenmeye BaşlaModül 0: Kurs Çerçevesi ve Atölye Kurulumu
Kurs Felsefesi: Neden Bu Yol, Neden Bu Sıra — 8 Aylık Müfredatın İskeleti
Öğrenmeye BaşlaModül 0: Kurs Çerçevesi ve Atölye Kurulumu