nlm · Teil 4 von 4

Nach dem Training beginnt die eigentliche Arbeit: Was nlm wirklich kann

nlm hat das Pre-Training abgeschlossen. In diesem Beitrag zeige ich, wie ich die ersten generierten Geschichten geprüft, einen systematischen Test gebaut und mit einer Ablationsstudie zum ersten Mal kausal ins Innere des Modells geschaut habe.

Inhalt
  1. Die kurze Antwort
  2. Schritt 1: Funktioniert es überhaupt?
  3. Schritt 2: Ein systematischer Test statt Einzelbeispielen
  4. Die unerwartete Nebenbeobachtung
  5. Schritt 3: Ins Innere schauen — welcher Teil ist wichtig?
  6. Was das für nlm bedeutet
  7. Nächster Beitrag

Die kurze Antwort

nlm hat das Pre-Training abgeschlossen: 100.550 Schritte auf TinyStories, komplett CPU-only auf einem VPS, finaler Validation-Loss ≈0,93. Das ist aber nicht die eigentliche Geschichte dieses Beitrags.

Ein guter Loss-Wert sagt nur: Das Modell wird im Durchschnitt besser darin, das nächste Token vorherzusagen. Er sagt nichts darüber, ob die daraus entstehenden Geschichten tatsächlich lesbar sind, ob sich das Modell wiederholt, oder welche seiner inneren Komponenten überhaupt für gute Ergebnisse verantwortlich sind. Genau das wollte ich nach dem Training herausfinden — nicht nur, dass trainiert wurde, sondern was dabei herauskommt und warum.

Ein guter Loss sagt:
Das Modell wird besser im Vorhersagen.

Ein guter Loss sagt nicht:
Die generierten Geschichten sind gut.

Schritt 1: Funktioniert es überhaupt?

Frage: Ist der von nlm generierte Text verständlich, kohärent und kindgerecht — oder nur grammatisch plausibel wirkender Unsinn?

Hypothese: Bei einer Perplexity von ≈2,5 (abgeleitet aus dem Validation-Loss) sollte das Modell kurze Geschichten mit konsistenten Figuren erzeugen können.

Experiment: Mehrere Prompts ("Once upon a time", "Once fox Freddy", "Two little birds") bei den Temperaturen 0,8 und 1,2 generiert.

Ergebnis: Bei Temperature 0,8 entstehen zwei klar kohärente Kurzgeschichten:

"Once upon a time, there was a little girl named Lily.
She loved to play with her toys and her friends..."

Figuren bleiben konsistent, es gibt einen erkennbaren Anfang-Mitte-Ende-Bogen. Bei Temperature 1,2 wird die Struktur dagegen sichtbar fragiler — Pronomen-Bezüge werden unklar, die Geschichte driftet thematisch ab (aus einem Vogel wird plötzlich ein Baum, der wie eine Person behandelt wird).

Entscheidung: Das Modell funktioniert grundsätzlich. Aber zwei Einzelbeispiele sind keine belastbare Qualitätsaussage — nur ein Eindruck. Für eine echte Antwort brauchte ich mehr als zwei Stichproben.


Schritt 2: Ein systematischer Test statt Einzelbeispielen

Frage: Wie verhält sich nlm über viele verschiedene Prompts und Temperaturen hinweg — systematisch, nicht nur anekdotisch?

Hypothese: Niedrigere Temperature sollte zu weniger Wiederholung führen, weil das Modell näher an seiner wahrscheinlichsten (und damit vermutlich saubersten) Vorhersage bleibt.

Experiment: Ein neues Skript gebaut (evaluate_generation.py), das Checkpoint und Tokenizer einmal lädt und dann automatisch über eine Matrix aus 10 Prompts × 4 Temperaturen (0,5 / 0,8 / 1,0 / 1,2) läuft — insgesamt 40 Generierungen. Für jede wird automatisch gemessen: Wie oft wiederholt sich eine Wortfolge? Wie vielfältig ist das Vokabular? Endet der Text überhaupt auf einem Satzzeichen?

Bewusst NICHT automatisch gemessen: ob die Geschichte inhaltlich Sinn ergibt. Das kann aktuell nur ein Mensch durch Lesen beurteilen — ein Zahlenwert dafür wäre nur scheinbar präzise.

Ergebnis: Eine echte Überraschung. Die niedrigste Wiederholungsrate lag NICHT bei der niedrigsten Temperature, sondern bei Temperature 1,0:

Temperature  Ø Wiederholung  Ø Vokabular-Vielfalt
0,5          1,70            0,698
0,8          1,60            0,697
1,0          1,00            0,708
1,2          1,40            0,736

Die Erklärung: Bei niedriger Temperature bleibt das Modell eng an der wahrscheinlichsten Fortsetzung — und wenn genau diese ein Wiederholungsmuster ist (zum Beispiel "Tom and his dog and his dog were friends"), verstärkt die niedrige Temperature die Wiederholung, statt sie zu verringern.

Entscheidung: Meine ursprüngliche Hypothese war falsch, und genau das macht den Test wertvoll. Vor einer zweiten Trainingsrunde steht jetzt erst die Frage, ob das ein Trainingsproblem ist oder ein reines Sampling-Problem (zum Beispiel durch einen Wiederholungs-Penalty lösbar) — ohne diesen Test hätte ich das Falsche vermutet.


Die unerwartete Nebenbeobachtung

Beim Durchlesen der 40 Texte fiel mir etwas auf, das keine der automatischen Kennzahlen erfasst hat: In 8 von 40 Generierungen (20 %) erzeugt nlm plötzlich die Zeichenfolge <|endoftext|> — und beginnt direkt danach eine völlig neue, unabhängige Geschichte.

Lily and her dog and the dog ran away. They were very sad and angry.
They did not like the broken car and the dog.
<|endoftext|>

Lily and Ben are playing in the garden. They see a big box with a bow.

Das wirkte zunächst wie ein Widerspruch: nlm arbeitet bewusst OHNE eigene Sonder-Tokens. Die Auflösung liegt im Rohkorpus selbst — die Trainingsdaten enthalten diese Zeichenfolge buchstäblich über zwei Millionen Mal als Geschichtentrenner. Weil mein Datenpipeline-Design diese Zeichenfolge nicht herausfiltert, läuft sie wie jeder andere Text durch den Byte-Level-BPE-Tokenizer von nlm und wird ganz normal mittrainiert. Das Modell hat schlicht gelernt: Nach einer abgeschlossenen Geschichte kommt mit hoher Wahrscheinlichkeit genau diese Zeichenfolge — rein statistisch, ohne dass ich dafür irgendeine Struktur im Code vorgesehen hätte.

Ein kleines, aber schönes Beispiel dafür, wie viel ein Modell allein aus roher Häufigkeit lernt, ganz ohne explizite Anleitung.


Schritt 3: Ins Innere schauen — welcher Teil ist wichtig?

Frage: Sind alle 96 Attention-Heads (12 Layer × 8 Heads) ungefähr gleich wichtig, oder gibt es einzelne, die deutlich mehr beitragen?

Hypothese: Heads in späteren Schichten sollten wichtiger sein, weil sie auf einer bereits mehrfach verfeinerten Repräsentation arbeiten.

Experiment: Für jeden einzelnen der 96 Heads wurde sein Beitrag gezielt auf null gesetzt ("Zero-Ablation") und gemessen, wie stark sich dadurch der Validation-Loss verschlechtert — bei exakt denselben Vergleichs-Daten für jede Messung, damit der Unterschied tatsächlich dem fehlenden Head zuzuschreiben ist und nicht Zufall.

Ergebnis: Deutlicher als erwartet. Ein einzelner Head — Layer 11 (die letzte Schicht), Head 0 — ist mit großem Abstand der wichtigste: Sein Fehlen kostet fast dreimal so viel Validation-Loss wie der nächstwichtigste Head.

Layer 11, Head 0:  Delta +0,0647  (klar der wichtigste)
Layer  1, Head 2:  Delta +0,0229
Layer  9, Head 1:  Delta +0,0220

Eine zweite, ebenso interessante Beobachtung: Alle 96 gemessenen Deltas sind positiv. Kein einziger Head verbessert durch sein Fehlen das Modell — jeder trägt etwas bei, auch wenn die meisten davon nur sehr wenig.

Entscheidung: Die Hypothese stimmt im Kern, aber die Realität ist extremer als vermutet — nicht "später generell wichtiger", sondern ein einzelner Head dominiert klar. Was weiterhin offenbleibt: WOFÜR genau dieser Head zuständig ist. Ein gemessenes Delta beweist Wichtigkeit, nicht Funktion — das bleibt eine offene Frage für eine spätere, gezieltere Untersuchung.


Was das für nlm bedeutet

Drei einzelne Experimente, aber ein gemeinsames Muster: Jedes Mal, wenn ich eine naheliegende Annahme systematisch statt anekdotisch geprüft habe, kam ein konkreteres (und teilweise überraschendes) Ergebnis heraus als erwartet.

Erwartet: Niedrige Temperature = weniger Wiederholung.
Gemessen: Temperature 1,0 ist am robustesten.

Erwartet: Spätere Heads sind generell wichtiger.
Gemessen: EIN Head in der letzten Schicht dominiert klar.

Das ist der eigentliche Punkt dieses Beitrags: Nicht "das Training ist fertig", sondern "ich habe systematisch geprüft, was dabei wirklich herausgekommen ist — und zwei meiner eigenen Annahmen waren dabei zu grob".

Nächster Beitrag

Die Tests zeigen, was nlm nach dem Training ausgibt — und welche seiner Komponenten unter den getesteten Bedingungen besonders wichtig sind. Doch um zu verstehen, wie diese Ergebnisse entstehen, gehe ich als Nächstes einen Schritt zurück: zur Reihenfolge der Tokens.

The dog bites the man.
The man bites the dog.
Dieselben Wörter, eine andere Reihenfolge — und eine völlig andere Geschichte.

Die Token-Embedding-Tabelle liefert für dieselbe Token-ID aber immer denselben Ausgangsvektor. Woher bekommt nlm also die Information, an welcher Stelle ein Token steht?

Im nächsten Beitrag „Warum mein Modell die Wortstellung kennen muss“ öffne ich dafür die trainierte Positions-Embedding-Tabelle. Ich untersuche, ob benachbarte Positionen ähnliche Vektoren gelernt haben, warum Position 0 besonders auffällt und welche Grenze die gewählte Lösung dem Kontextfenster setzt.

Nach der Frage „Was kann nlm?“ folgt damit die nächste: „Wie bekommt das Modell überhaupt die Informationen, die es dafür braucht?“

Dies ist der vierte Beitrag aus der Serie über den Aufbau von nlm: einem kleinen Sprachmodell, das von Grund auf gebaut, trainiert und kritisch bewertet wird.