Wie Sprachmodelle Text erzeugen: Temperature und Top-k in Python
Ein Sprachmodell gibt für jedes mögliche nächste Token einen Score (Logit) aus. Sampling-Einstellungen bestimmen, wie daraus eine Wahl wird; Temperature steuert den Zufall, und Top-k behält nur die besten Kandidaten.
Das Konzept in einfachen Worten
Ein Sprachmodell gibt für jedes mögliche nächste Token einen Score (Logit) aus. Sampling-Einstellungen bestimmen, wie daraus eine Wahl wird; Temperature steuert den Zufall, und Top-k behält nur die besten Kandidaten.
Sieh dir an, wie ein Sprachmodell das nächste Token wählt: Layer Normalization, Temperature und Top-k-Sampling in reinem Python.
Die wichtigsten Ideen
- Eine Temperature unter 1 macht die Ausgabe vorhersehbarer, über 1 kreativer.
- Top-k-Sampling entfernt unwahrscheinliche Tokens, damit der Text beim Thema bleibt.
- Text wird Token für Token erzeugt, und jedes neue Token fließt wieder in die Eingabe ein.
- Layer Normalization hält die Werte in einem stabilen Bereich, während sie viele Schichten durchlaufen.
Wann wird dieser Ansatz verwendet?
- Verstehen, was in neuronalen Netzen und KI-Bibliotheken passiert.
- Die Idee lernen, bevor du sie in den passenden Challenges umsetzt.
- Dich auf Kurse zu maschinellem Lernen, Vorstellungsgespräche und Projekte vorbereiten.
Selbst ausprobieren
Klicke auf den Würfel, um das nächste Wort zu ziehen. Senke Temperature oder Top-k, damit die Wahl vorhersehbarer wird.
Beispielcode
import math
import random
# Layer normalization rescales a vector to mean 0 and variance 1.
def layer_norm(x, eps=1e-5):
mean = sum(x) / len(x)
var = sum((v - mean) ** 2 for v in x) / len(x)
return [(v - mean) / math.sqrt(var + eps) for v in x]
print("layer norm:", [round(v, 3) for v in layer_norm([2.0, 4.0, 6.0, 8.0])])
# Next-token scores from a model; temperature and top-k shape the choice.
words = ["cat", "dog", "car", "sky"]
logits = [2.0, 1.5, 0.3, -1.0]
def probabilities(temperature=1.0, top_k=None):
scores = [l / temperature for l in logits]
if top_k: # keep only the k best scores
cutoff = sorted(scores, reverse=True)[top_k - 1]
scores = [s if s >= cutoff else -1e9 for s in scores]
exps = [math.exp(s - max(scores)) for s in scores]
return [e / sum(exps) for e in exps]
for t, k in [(1.0, None), (0.5, None), (1.0, 2)]:
print(f"temperature={t} top_k={k}:", [round(p, 2) for p in probabilities(t, k)])
random.seed(7)
print("sampled:", random.choices(words, weights=probabilities(0.8, 3), k=5))
Erwartete Ausgabe
layer norm: [-1.342, -0.447, 0.447, 1.342]
temperature=1.0 top_k=None: [0.54, 0.33, 0.1, 0.03]
temperature=0.5 top_k=None: [0.71, 0.26, 0.02, 0.0]
temperature=1.0 top_k=2: [0.62, 0.38, 0.0, 0.0]
sampled: ['cat', 'cat', 'dog', 'cat', 'cat']
So funktioniert es
layer_norm() skaliert einen Vektor auf Mittelwert 0 und Varianz 1, wie es Transformer in jedem Block tun. probabilities() teilt die Logits durch die Temperature und wendet Softmax an, sodass eine niedrige Temperature das beste Wort wahrscheinlicher macht. Top-k setzt vor dem Softmax jeden Score außerhalb der besten k auf fast −∞.
Ändere die Werte und führe das Programm im CodeUtility Python Online-Compiler aus, ohne Python lokal zu installieren.
Übungsaufgaben
Verändere Eingaben und Randfälle, bevor du die Lösung mit größeren Datenmengen testest.
- Ändere Eingaben oder Gewichte und sage die Ausgabe vor dem Ausführen voraus.
- Gib die Zwischenwerte aus, um jeden Rechenschritt zu verfolgen.
- Löse die verlinkten Challenges unten, um die Idee selbst umzusetzen.
Mit einer Challenge üben
Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.
- Layer-Normalisierung Normalisiere jede Zeile auf Mittelwert 0 und Varianz 1, dann skaliere und verschiebe sie, wie es jeder Transformer-Block tut. Mittel
- Temperatur- und Top-K-Sampling Wähle das nächste Token wie ein Sprachmodell: Behalte die k höchsten Logits, wende die Temperatur an und ziehe eine Stichprobe. Mittel