Embeddings: Warum ein Token mehr als ein Wort ist

Eine Token-ID ist nur eine Zahl und bei nlm liegt diese zwischen 0 und 4095. Wie wird daraus ein Vektor, der tatsächlich etwas über ein Wort "weiß"? Dazu habe ich die echte, trainierte Embedding-Tabelle von nlm geöffnet und nachgemessen, was tatsächlich gelernt wurde.

Inhalt
  1. Die kurze Antwort
  2. Schritt 1: Warum reicht die Token-ID selbst nicht?
  3. Schritt 2: Was lernt diese Tabelle tatsächlich?
  4. Schritt 3: Wie groß sind diese Vektoren eigentlich, und ist das normal?
  5. Was das für nlm bedeutet
  6. Nächster Beitrag

Die kurze Antwort

Im letzten Beitrag ging es darum, wie nlm Text in Token-IDs übersetzt. Eine Token-ID allein ist eine willkürliche Nummer. Es gibt keinen Grund, warum Token 1337 dem Token 1338 ähnlicher sein sollte als Token 4000 — die Nummerierung selbst sagt nichts über Bedeutung oder Verwendung aus.

Eine Token-ID ist nur eine Zahl aber wie wird daraus ein Vektor,
der tatsächlich etwas über das Wort "weiß"?

Die Antwort heißt Embedding: eine Tabelle mit einer Zeile pro Token, in der jede Zeile ein lernbarer Vektor aus Gleitkommazahlen ist, für nlm habe eine Dimension von 256 Vektoren pro Token gewählt. Am Anfang des Trainings ist diese Tabelle komplett bedeutungslos — reines Zufallsrauschen.

Schritt 1: Warum reicht die Token-ID selbst nicht?

Frage: Warum kann nlm nicht einfach mit den rohen Token-IDs rechnen?

Hypothese: Eine Zahl zwischen 0 und 4095 enthält eine implizite Ordnung — 12 liegt näher an 13 als an 4000. Diese Ordnung hat aber nichts mit Sprache zu tun und würde das Modell zu einem bedeutungslosen Größenvergleich zwingen.

Experiment: Ein naheliegender Ausweg wäre One-Hot-Encoding — jedem Token einen Vektor zuordnen, bei dem nur eine Position 1 ist, alle anderen 0. Das löst das Größenvergleich-Problem, aber bei nlms Vokabular von 4096 Tokens hätte jeder Vektor 4096 Dimensionen, von denen 4095 immer null sind.

Ergebnis:

Darstellung Dimension bei nlm Semantische Struktur
Token-ID 1 Keine — willkürliche Nummerierung
One-Hot 4096 Keine — alle Tokens exakt gleich weit entfernt
Embedding 256 Gelernt — ähnlich verwendete Tokens liegen näher beieinander

Bei One-Hot-Encoding wären "the" und "and" GENAUSO weit voneinander entfernt wie "the" und "elephant" — es gibt schlicht keinen Platz für die Information "diese beiden Tokens kommen oft in ähnlichen Kontexten vor".

Entscheidung: Ein Embedding — eine Tabelle der Form (vocab_size, d_model) = (4096, 256) — statt One-Hot. Jede Token-ID wählt per NumPy Fancy Indexing einfach die passende Zeile aus dieser Tabelle aus.

Schritt 2: Was lernt diese Tabelle tatsächlich?

Frage: Die Theorie sagt, ähnlich verwendete Tokens sollten sich im 256-dimensionalen Raum annähern. Stimmt das auch real, nach nlms tatsächlichem Training?

Hypothese: Wörter aus derselben semantischen Kategorie (Tiere, Gefühle, Natur) sollten eine höhere Cosine-Ähnlichkeit zeigen als Wörter aus völlig unterschiedlichen Kategorien.

Experiment: Ich habe die echte Token-Embedding-Tabelle aus nlms Checkpoint (Schritt 100.550) geladen und die Cosine-Ähnlichkeit zwischen zehn ausgewählten Wort-Tokens berechnet — alle davon sind im Tokenizer-Vokabular tatsächlich einzelne, vollständige Tokens (fox, rabbit, dog, cat, happy, sad, the, and, forest, tree):

token_emb = checkpoint["params"]["token_emb"]  # (4096, 256)
cos_sim = lambda a, b: np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

Ergebnis: Reale Zahlen, kein konstruiertes Beispiel:

dog      vs cat     : cos = +0,5477
fox      vs rabbit  : cos = +0,4932
happy    vs sad     : cos = +0,4119
forest   vs tree    : cos = +0,3483
the      vs and     : cos = +0,2065
---------------------------------------
fox      vs the     : cos = -0,2294
happy    vs forest  : cos = -0,0506
rabbit   vs sad     : cos = -0,0352

Tier-Wörter liegen tatsächlich näher beieinander (dog/cat: 0,55, fox/rabbit: 0,49) als zu völlig anderen Kategorien (rabbit/sad: fast null). Natur-Wörter ebenso (forest/tree: 0,35). Das bestätigt die Hypothese im Kern.

Die interessanteste Überraschung dabei: happy und sad — inhaltlich GEGENSÄTZLICH — liegen mit 0,41 fast genauso nah beieinander wie die Tier-Paare. Das ist kein Fehler, sondern erklärt sich aus dem, was ein Embedding tatsächlich lernt: nicht "Bedeutungsähnlichkeit", sondern "Verwendungsähnlichkeit". "Der Fuchs war glücklich" und "Der Fuchs war traurig" stehen syntaktisch an exakt derselben Stelle im Satz — das Modell lernt über den Next-Token-Prediction-Loss, welche Tokens an ähnlichen Stellen im Text auftauchen, nicht was sie im menschlichen Sinn "bedeuten". Gegensätze, die grammatisch gleich funktionieren, landen deshalb oft überraschend nah beieinander.

Entscheidung: Die Grundhypothese (ähnliche Kategorie → höhere Ähnlichkeit) ist bestätigt, aber mit einer wichtigen Präzisierung: "ähnlich" heißt bei einem Embedding nicht "bedeutungsgleich", sondern "austauschbar an derselben Stelle im Satz".

Schritt 3: Wie groß sind diese Vektoren eigentlich, und ist das normal?

Frage: Haben alle 4096 Embedding-Vektoren eine ähnliche "Größe" (Norm), oder gibt es Ausreißer?

Hypothese: Häufige Tokens sollten während des Trainings öfter aktualisiert worden sein und sich daher stärker vom zufälligen Startwert entfernt haben als seltene Tokens.

Experiment: Norm (euklidische Länge) jeder der 4096 Embedding-Zeilen berechnet und mit den zehn Beispiel-Wörtern verglichen.

Ergebnis:

Durchschnittliche Norm über alle 4096 Token-Embeddings: 1,534
Minimum: 1,067   Maximum: 2,440

Beispielwörter (alle zwischen 1,20 und 1,39):
fox:    1,3081   rabbit: 1,1969   dog:  1,2697   cat:    1,2871
happy:  1,3461   sad:    1,3775   the:  1,2476   and:    1,3888
forest: 1,2756   tree:   1,2943

Die zehn getesteten, häufigen Wörter liegen alle relativ nah am Durchschnitt (1,53) und deutlich unter dem beobachteten Maximum (2,44) — keine extremen Ausreißer. Das Maximum von 2,44 gehört vermutlich zu einem sehr seltenen oder untypischen Token, das hier nicht näher untersucht wurde.

Entscheidung: Für diese zehn Wörter zeigt sich kein auffälliger Zusammenhang zwischen Worthäufigkeit und Vektor-Norm — eine Vermutung, die eine systematischere Untersuchung (alle 4096 Normen gegen echte Korpus-Häufigkeiten) bräuchte, um sie wirklich zu bestätigen oder zu widerlegen. Das lasse ich erstmal offen, statt aus zehn Stichproben eine Regel abzuleiten.

Was das für nlm bedeutet

Vor dem Training: eine 4096 x 256 Tabelle aus reinem Zufallsrauschen.

Nach 100.550 Schritten: Tiere clustern bei Tieren, Natur bei Natur -- das ist der Nebeneffekt der Next-Token-Vorhersage, ohne dass irgendjemand eine "Ähnlichkeit" vorgegeben hat.

Diese Embedding-Tabelle wurde nie direkt auf „Ähnlichkeit“ trainiert. Sie hat kein eigenes Lernsignal wie Word2Vec oder GloVe. Jede Zeile ist ein normaler Parameter, der ausschließlich über denselben Cross-Entropy-Loss gelernt wird, der auch alle anderen 10,66 Millionen Parameter von nlm anpasst.

Das Modell lernt nur ein Ziel: Den tatsächlich nächsten Token vorherzusagen. Dass dabei trotzdem Strukturen entstehen, in denen ähnliche Tokens näher beieinanderliegen, ist kein eingebautes Feature. Es ist ein messbarer, emergenter Nebeneffekt des Next-Token-Trainings. Diese Ähnlichkeit ist dabei nicht garantiert und nicht immer menschlich interpretierbar. Sie entsteht, weil Tokens, die in ähnlichen Kontexten vorkommen, für die Vorhersage des nächsten Tokens ähnlich nützlich sein können.

Ein zweiter, praktischer Fund: nlm nutzt dieselbe Tabelle doppelt. Es gibt keine separate Gewichtsmatrix für die Ausgabe-Wahrscheinlichkeiten — die Token-Embedding-Tabelle wird am Ende, transponiert, einfach wiederverwendet ("Weight Tying"). Das spart bei nlm genau 1.048.576 Parameter, die sonst ein zweites Mal für dieselbe Information gebraucht würden.

Nächster Beitrag

In der Embedding-Tabelle zeigen sich erste Strukturen: Einige ähnlich verwendete Tokens haben ähnlich ausgerichtete Vektoren. Aber daraus folgt noch nicht, dass nlm auch gute Geschichten erzählt.

Die entscheidende Frage bleibt:

Das Modell hat etwas gelernt.
Aber was kommt beim Generieren tatsächlich dabei heraus?

Genau das werde ich im nächsten Beitrag „Nach dem Training beginnt die eigentliche Arbeit: Was nlm wirklich kann“ untersuchen.

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