Sofortantwort
Token Sampling einfach erklärt
Strategien zur Auswahl des nächsten Tokens bei der Textgenerierung.
- Kurz gesagt
- Greedy: Immer das wahrscheinlichste Token (deterministisch)
- Typischer Einsatz
- Kreatives Schreiben, Fakten-Antworten, Code-Generierung
- Wichtig zu wissen
- Top-K/Top-P: Begrenzt Auswahl auf wahrscheinlichste Tokens
Token Sampling im Überblick
Token Sampling bestimmt, wie ein LLM das nächste Wort (Token) auswählt. Das Modell gibt Wahrscheinlichkeiten für alle möglichen Tokens aus – die Sampling-Strategie entscheidet, welches genommen wird.
Die Grundidee:
Modell-Output (Logits → Wahrscheinlichkeiten):
"Der Himmel ist ___"
blau: 45% ████████████████████
schön: 20% ████████
klar: 15% ██████
heute: 10% ████
grün: 5% ██
...
Greedy: → "blau" (immer höchste)
Sampling: → "schön" (zufällig nach Wahrscheinlichkeit)
Die wichtigsten Strategien:
| Strategie | Beschreibung | Wann nutzen? |
|---|---|---|
| Greedy | Immer höchste Wahrscheinlichkeit | Deterministische Aufgaben |
| Temperature | Skaliert Wahrscheinlichkeiten | Kreativität steuern |
| Top-K | Nur Top K Tokens betrachten | Unsinn vermeiden |
| Top-P | Tokens bis P% Wahrscheinlichkeit | Adaptiver als Top-K |
| Beam Search | Mehrere Pfade parallel | Übersetzung, Summarization |
Technisch betrachtet
Greedy Decoding
def greedy_decode(logits):
# Immer das wahrscheinlichste Token
return torch.argmax(logits)
# Deterministisch, aber kann repetitiv werden
# "The cat sat on the mat. The cat sat on the mat..."
Temperature Sampling
def temperature_sample(logits, temperature=1.0):
# Skaliere Logits
scaled_logits = logits / temperature
# Softmax → Wahrscheinlichkeiten
probs = torch.softmax(scaled_logits, dim=-1)
# Sample nach Wahrscheinlichkeit
return torch.multinomial(probs, num_samples=1)
Effekt der Temperature:
Temperature = 0.1 (fast deterministisch):
blau: 95% ██████████████████████████████
schön: 3% █
klar: 2%
Temperature = 1.0 (Original):
blau: 45% ████████████████████████
schön: 20% ██████████
klar: 15% ████████
Temperature = 2.0 (sehr kreativ):
blau: 25% █████████████
schön: 18% █████████
klar: 15% ████████
grün: 12% ██████
Top-K Sampling
def top_k_sample(logits, k=50, temperature=1.0):
# Nur Top K Tokens behalten
top_k_logits, top_k_indices = torch.topk(logits, k)
# Temperature anwenden
scaled = top_k_logits / temperature
probs = torch.softmax(scaled, dim=-1)
# Sample aus Top K
idx = torch.multinomial(probs, num_samples=1)
return top_k_indices[idx]
Top-P (Nucleus) Sampling
def top_p_sample(logits, p=0.9, temperature=1.0):
# Sortiere nach Wahrscheinlichkeit
scaled = logits / temperature
probs = torch.softmax(scaled, dim=-1)
sorted_probs, sorted_indices = torch.sort(probs, descending=True)
# Kumulative Summe
cumsum = torch.cumsum(sorted_probs, dim=-1)
# Behalte Tokens bis P erreicht
mask = cumsum <= p
mask[0] = True # Mindestens ein Token
# Sample aus Nucleus
nucleus_probs = sorted_probs[mask]
nucleus_probs = nucleus_probs / nucleus_probs.sum()
idx = torch.multinomial(nucleus_probs, num_samples=1)
return sorted_indices[idx]
Kombinierte Strategien
# OpenAI API nutzt mehrere Parameter
response = openai.chat.completions.create(
model="gpt-4",
messages=[...],
temperature=0.7, # Kreativität
top_p=0.9, # Nucleus Sampling
frequency_penalty=0.5, # Wiederholungen vermeiden
presence_penalty=0.5, # Neue Themen fördern
)
Empfehlungen
| Use Case | Temperature | Top-P | Anmerkung |
|---|---|---|---|
| Code | 0.0-0.2 | 0.95 | Präzision wichtig |
| Fakten | 0.0-0.3 | 0.9 | Konsistenz |
| Chat | 0.5-0.7 | 0.9 | Balance |
| Kreativ | 0.8-1.0 | 0.95 | Vielfalt |
| Brainstorming | 1.0-1.2 | 1.0 | Maximale Diversität |