Tokenwerk · Das LLM-Lehrbuch

Kapitel 16 · II · Von Zahlen zu Sprache · 6 Minuten

Das Lernziel: Cross-Entropy

Welches Token soll an welcher Position vorhergesagt werden? Ein korrekter Loss beginnt mit korrekt verschobenen Targets.

Wir brauchen ein Fehlermaß für die nächste Textmöglichkeit

Beim kleinen Zahlenmodell haben wir Vorhersage und Zielwert voneinander abgezogen. Beim Sprachmodell ist die Ausgabe eine ganze Liste von Wahrscheinlichkeiten. Das Trainingsbeispiel verrät uns, welches Token tatsächlich als Nächstes vorkam. Wir möchten das Modell dafür belohnen, diesem Token eine hohe Wahrscheinlichkeit zu geben.

Angenommen, nach „Die Katze sitzt“ folgt im Trainingsdokument das Token „auf“. Gibt das Modell „auf“ nur 10 Prozent, soll der Fehler größer sein als bei 80 Prozent. Die Regel muss trotzdem anerkennen, dass Sprache mehr als eine plausible Fortsetzung haben kann. Unser Trainingsziel bleibt zunächst die beobachtete Fortsetzung.

Warum die Kennnummer selbst keine Zielgröße ist

Wenn „auf“ ID 42 und „unter“ ID 43 hat, ist die Zahlendifferenz eins bedeutungslos. Die IDs sind Adressen im Tokenizer. „Unter“ wäre nicht automatisch fast richtig, nur weil seine ID numerisch nahe bei 42 liegt.

Wir verwenden daher nicht den quadratischen Abstand zwischen Token-IDs. Stattdessen bewerten wir die Wahrscheinlichkeit, die das Modell dem richtigen Token zuweist. Ob dessen ID 42 oder 900 heißt, spielt für dieses Prinzip keine Rolle.

Die Zuordnung zwischen Eingabe und Ziel

Nimm die Folge [BOS, Die, Katze, schläft, EOS]. BOS ist der schon eingeführte Startmarker, EOS der Endmarker. Aus dieser Folge entstehen vier Lernaufgaben:

Sichtbare Eingabe bis hier Gewünschtes nächstes Token
BOS Die
BOS, Die Katze
BOS, Die, Katze schläft
BOS, Die, Katze, schläft EOS

Im Programm speichern wir Input [BOS, Die, Katze, schläft] und Target [Die, Katze, schläft, EOS]. Die Listen sind um eine Position gegeneinander verschoben. Das nennt man Target-Shift. Die spätere Kausalmaske wird verhindern, dass ein Rechenweg dabei schon sein rechts stehendes Ziel lesen kann.

Eine geeignete Fehlerkurve

Unsere Fehlerregel soll bei Wahrscheinlichkeit 1 den Wert null ergeben. Bei kleinen richtigen Wahrscheinlichkeiten soll sie stark wachsen. Dafür verwenden wir den negativen natürlichen Logarithmus:

Wahrscheinlichkeit des richtigen Tokens Fehler ungefähr
0,9 0,105
0,5 0,693
0,1 2,303
0,01 4,605

Du kannst bereits an der Tabelle die Wirkung erkennen: Ein selbstsicheres Verfehlen wird stärker bestraft. Wird die richtige Wahrscheinlichkeit größer, wird der Fehler kleiner.

Was bedeutet Logarithmus?

Du kennst aus Softmax die Exponentialfunktion exp. Der natürliche Logarithmus ist ihre Umkehrung. Weil exp(0)=1 gilt, ist ln(1)=0. Weil exp(1)≈2,718 gilt, ist ln(2,718) ungefähr 1.

Für Wahrscheinlichkeiten zwischen 0 und 1 ist der natürliche Logarithmus negativ. Das Minuszeichen davor macht daraus einen positiven Fehler. In diesem Buch meinen log und ln bei diesen Formeln denselben natürlichen Logarithmus; im Python-Code wird er stabil von der Bibliothek berechnet.

Du musst die Werte nicht im Kopf ausrechnen. Wichtig ist, die Richtung zu verstehen und einige Tabellenwerte zu kennen. Im Experiment kannst du die Kurve durch Verändern der Wahrscheinlichkeit nachvollziehen.

Die kurze Formel

L=−log⁡(pk).L=-\log(p_k).

Lies sie so: Suche die Wahrscheinlichkeit des richtigen Tokens heraus. Wende darauf den natürlichen Logarithmus an und ändere das Vorzeichen. Das Ergebnis ist der Fehler L. k ist die Nummer des richtigen Tokens, und pkp_k seine Wahrscheinlichkeit. k ist keine neue lernbare Zahl.

Für richtige Wahrscheinlichkeit 0,5 entsteht der Fehler ungefähr 0,693. Diese Einzelpositionsregel wird als negativer Log-Likelihood-Loss bezeichnet. Du darfst diesen langen Namen zunächst als „Fehler aus der richtigen Tokenwahrscheinlichkeit“ lesen.

Warum sie auch Cross-Entropy heißt

Cross-Entropy, auf Deutsch Kreuzentropie, ist der allgemeine Name für eine verwandte Verteilungsbewertung. In unserem Fall ist das Ziel ein einzelnes richtiges Token: gedanklich bekommt diese Klasse Zielgewicht eins, alle anderen null. Eine solche Darstellung heißt One-Hot-Ziel. Damit vereinfacht sich Cross-Entropy genau zu dem einen Term, den wir gerade berechnet haben.

Im Code müssen wir diesen großen One-Hot-Vektor nicht anlegen. Wir geben einfach die ID des richtigen Tokens an. PyTorch kennt daraus die richtige Ausgabeposition.

python
loss = F.cross_entropy(
    logits.reshape(-1, vocab_size),
    targets.reshape(-1),
    ignore_index=-100,
)

logits sind die Rohscores vor Softmax. targets enthält die richtigen Token-IDs. reshape gruppiert hier Batch- und Textpositionen zu einer gemeinsamen Liste von Vorhersageaufgaben. Die Vokabularachse bleibt erhalten. -1 bedeutet bei dieser Umformung: Die Bibliothek bestimmt die passende Länge selbst.

Die Funktion berechnet intern eine stabile Kombination aus Softmax und Logarithmus. Übergib deshalb die Rohscores und nicht bereits umgerechnete Wahrscheinlichkeiten. Sonst würdest du eine andere Rechnung durchführen.

Mehrere Positionen fair zusammenfassen

Wir summieren die Fehler aller aktiven Zielpositionen und teilen durch deren Anzahl. Hat eine Gruppe 100 Ziele und eine andere 10, muss die erste Gruppe für einen gemeinsamen Tokenmittelwert zehnmal so viel Gewicht erhalten. Die beiden Gruppendurchschnitte einfach gleich zu mitteln wäre etwas anderes.

Padding sind Füllpositionen, mit denen kurze Beispiele dieselbe Länge wie andere im Batch erhalten. Wir möchten diese Füllstellen nicht wie echte Textziele lernen. Dafür setzt der Code ihre Targets auf den besonderen Ignorierwert −100. ignore_index=-100 sagt der Fehlerfunktion, diese Positionen auszulassen. −100 ist dabei keine normale Token-ID.

Eine zusätzliche Zahl namens Perplexity

Perplexity entsteht, wenn wir die Exponentialfunktion auf den mittleren Fehler anwenden. Bei mittlerem Fehler ln(4) ist die Perplexity 4. Es ist eine andere Skala für denselben Durchschnitt, kein Prozentsatz richtiger Antworten.

Ein gleichverteiltes Modell mit vier möglichen Tokens hat für jedes richtige Token Wahrscheinlichkeit 1/4. Sein mittlerer Fehler ist −ln(1/4)=ln(4), seine Perplexity also 4. Diese kleine Gleichverteilung ist ein nützlicher Vergleichspunkt. Modelle mit verschiedenen Tokenizern kannst du damit nicht unbesehen vergleichen, weil ihre Einheiten verschieden groß sind.

Wie kommt daraus Lernen?

Die Fehlerfunktion ist an die Rohscores und über diese an die Gewichte angeschlossen. Backpropagation kann deshalb ihre Ableitungen durch das Netz berechnen, so wie im kleinen Zahlenbeispiel. Die genaue Ableitung nach einem Score beträgt „berechnete Wahrscheinlichkeit minus Zielwert 0 oder 1“. Für das richtige Token ergibt sich beispielsweise 0,5−1=−0,5, was dessen Score lokal nach oben drückt.

Du musst diese spezielle Ableitungsformel nicht für das erste Training herleiten. Wichtig ist die Verbindung: Ein niedrigerer Fehler beim richtigen Token kann durch denselben bereits bekannten Lernablauf erreicht werden. Das Lernziel ist neu, das Grundprinzip des Trainings bleibt gleich.