İçeriğe geç

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 Sanatı Derinlemesine: Greedy, Beam, Top-K, Top-P, Min-P, DRY, Tail-Free — Hepsi Production'da
🎲 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ı)#

  1. Sampling'in tek-cümlelik amacı
  2. Greedy decoding: ne zaman doğru, ne zaman tuzak
  3. Temperature: dağılımın termodinamiği
  4. Top-K: en olası K
  5. Top-P (Nucleus): adaptive cutoff
  6. Min-P: relative threshold — modern öneri
  7. Typical-P, Tail-Free: niş alternatifler
  8. Repetition penalty + DRY: tekrar engelleme
  9. Beam search: deterministic search
  10. Speculative decoding: hız için
  11. Multi-sample self-consistency: reasoning için
  12. Structured output sampling: JSON, kod
  13. Reasoning model sampling: o1, R1 farkı
  14. 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 + factualT=0.0-0.3
YaratıcılıkT=0.8-1.0, top-p=0.95
Çeşitlilik (multi-sample)T=0.7, top-p=0.95 + DRY
KodT=0.1-0.3 + greedy fallback
Structured outputT=0.0 + constrained decoding
ReasoningT=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=0
veya
temperature → 0
ile greedy. API'lerde
temperature=0
standardı.

Modern 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:
PT(x)=exp(zx/T)xexp(zx/T)P_T(x) = \frac{\exp(z_x / T)}{\sum_{x'} \exp(z_{x'} / T)}

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ğeriSonuç
0.0Greedy (deterministik)
0.1-0.3Mostly deterministic, küçük varyasyon
0.5-0.7Coherent + slight diversity
0.8-1.0Natural creative (default OpenAI)
1.0-1.5High creativity, bazı saçma çıktılar
2.0+Mostly noise

Önemli: T training distribution'a etkili#

Pretrain training'i tipik
T=1
distribution üzerine yapılıyor.
T=1
ile sampling = en doğal çıktılar.
RLHF sonrası model overconfident — distribution çok sharp.
T=1.5-2.0
daha doğal cevap verir. ChatGPT default'u T=1 ama gerçekte T_effective 0.5-0.7 (RLHF sharpening).

Mathematical 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 torch
import torch.nn.functional as F
 
# Bir distribution example
logits = 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ğeriEtki
1Greedy
5-10Çok deterministic
40-50Klasik default (HuggingFace, OpenAI eskisi)
100+Esnek, top-p ile birlikte ya da değil
0 / disabledTop-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ğeriSonuç
0.5Çok deterministic (sadece nucleus top tokens)
0.9Klasik default (HuggingFace)
0.95OpenAI default
0.99Neredeyse tüm distribution
1.0Disabled

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:
  1. Temperature ayarla (0.7 başlangıç)
  2. Top-p veya min-p ekle (0.95 veya 0.05)
  3. 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 > 1
(örn. 1.1-1.3). Tekrar eden token'ı cezalandır.

Sorun#

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):
T=0
greedy genelde best. Reasoning model (o1, R1, GPT-5 thinking): farklı dynamics.

Niye reasoning model'da T>0?#

  1. Multi-sample reasoning training: model T=0.7 ile eğitildi, T=0 OOD
  2. Internal CoT diversity: thinking sırasında multiple paths
  3. 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 QAT=0.3, top_p=0.9, DRY=0.8
SummarizationT=0.5, top_p=0.95
Chat (creative)T=0.8, top_p=0.95, DRY=0.8
BrainstormingT=1.0, top_p=0.95, no_repeat=3
Roleplay (creative writing)T=1.0, top_p=0.95, min_p=0.05, DRY
TranslationT=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 writingT=0.7, top_p=0.95, min_p=0.05, DRY=1.0
python
# Production sampling — vLLM ile multi-strategy
from vllm import LLM, SamplingParams
 
llm = LLM(model="meta-llama/Llama-3.1-8B-Instruct")
 
# Strategy 1: Factual QA
factual_params = SamplingParams(
temperature=0.3,
top_p=0.9,
max_tokens=200,
repetition_penalty=1.05,
)
 
# Strategy 2: Creative writing
creative_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ım
prompt = "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 Counter
def 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#

  1. Temperature etkisi: Logits [3.0, 1.0, -1.0]. T=0.1, 1.0, 5.0 için softmax dağılımları?
  2. 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?
  3. Self-consistency pratiği: Math problem'a 10 sample → 7'si "x=3", 2'si "x=4", 1'i "no solution". Final cevap? Confidence?
  4. Greedy loop: "I am happy and I am happy and I am happy..." durumunu yaratan tipik sebep nedir? 3 çözüm önerin.
  5. 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çimiGreedy — 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 öneriTypical-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