Ein Embedding ist eine Lookup-Tabelle, keine Funktion
Eine erste Schicht nach dem Tokenizer
Ein Tokenizer liefert dem Modell ganzzahlige IDs: [256, 1842, 7301, ...]. Eine der ersten Aufgaben eines Transformers besteht darin, jede ID in einen Vektor aus d_model Gleitkommazahlen umzuwandeln. Dieser Vektor existiert in einem d_model-dimensionalen Raum (768 Dimensionen bei ANDREA-120M).
Eine Embedding-Schicht ist eine Lookup-Tabelle, keine Funktion. Stellen Sie sich eine riesige Matrix vor:
shape: (V, d_model)
row 0: [e_0_0, e_0_1, ..., e_0_767]
row 1: [e_1_0, e_1_1, ..., e_1_767]
...
row 8448: [e_8448_0, e_8448_1, ..., e_8448_767]
Token-ID i wählt Zeile i. Direkter Array-Zugriff. Keine Arithmetik, keine Aktivierung. Nur ein Index.
Trainierbare Gleitkommazahlen
Jeder Eintrag in dieser Tabelle beginnt als kleine Zufallszahl (typischerweise aus einer Normalverteilung mit Skalierung 1/sqrt(d_model)). Backpropagation aktualisiert jede Zeile, sobald ihre Token-ID in einem Batch vorkommt. Nach dem Training erhalten ähnliche Tokens (cat, dog, pet) ähnliche Vektoren; unzusammenhängende Tokens (cat, Tuesday, xylophone) liegen weit auseinander im Vektorraum.
ANDREA-120M Token Embedding Kosten
| Menge | Wert |
|---|---|
| V | 8,449 |
| d_model | 768 |
| Parameter | 6,488,832 |
Etwa 6,5 Mio. Parameter befinden sich allein in einer Token-Embedding-Tabelle, rund 5,4 % der Gesamtparameter von ANDREA-120M. Jeder Vokabular-Slot erhält diese 768 Floats.
Größenberechnung von Embedding-Tabellen
Skalarprodukte messen Ähnlichkeit
Vektoren als Pfeile
Ein 768-dimensionaler Vektor lebt in einem Raum, den Menschen nicht visualisieren können, aber dieselbe Algebra funktioniert in jeder Dimension. Zwei Schlüsseloperationen sind für Transformer wichtig:
Betrag (Länge eines Pfeils):
||v|| = sqrt(v_0² + v_1² + ... + v_767²)
Skalarprodukt (Ausrichtung zwischen zwei Pfeilen):
u · v = u_0 × v_0 + u_1 × v_1 + ... + u_767 × v_767
Was ein Skalarprodukt aussagt
Zwei Tatsachen, die in jeder Dimension gelten:
- u · v = ||u|| × ||v|| × cos(theta), wobei theta der Winkel zwischen ihnen ist.
- Vektoren, die in dieselbe Richtung zeigen, ergeben große positive Skalarprodukte.
- Vektoren, die in entgegengesetzte Richtungen zeigen, ergeben große negative Skalarprodukte.
- Vektoren im rechten Winkel ergeben ein Skalarprodukt von null.
Skalarprodukt = unnormalisierte Ähnlichkeit. Zwei trainierte Token-Embeddings für cat & dog ergeben ein hohes Skalarprodukt, weil Backpropagation sie zusammengeschoben hat (beide sagen haustierbezogene Kontexte voraus). cat & Tuesday enden nahezu orthogonal, weil sie unterschiedliche Kontexte vorhersagen.
Warum ein Transformer aufmerksam ist
Aktivität 5 (grow_a_language_model_attention) baut Attention aus Dot-Produkten auf: Ein Query-Vektor, der mit Key-Vektoren multipliziert wird, liefert Scores, die angeben, welche vergangenen Tokens für die Vorhersage des nächsten Tokens relevant sind. Embeddings und Dot-Produkte zusammen tragen jede Interaktion innerhalb eines Transformers.
Ähnlichkeit vorhersagen
ANDREA verwendet gelernte Positions-Embeddings
Ein Problem
Ein Token-Embedding sagt einem Modell, welches Wort an dieser Position steht. Es sagt dem Modell jedoch nicht, wo dieses Wort sitzt. Ohne Positionsinformation behandelt ein Transformer the cat sat on a mat und mat a on sat cat the identisch: dieselbe Menge von Tokens, kein Ordnungssignal.
In der Transformer-Literatur gibt es drei Lösungen:
Sinusoidal (Vaswani 2017). Eine feste mathematische Formel basierend auf Sinus- und Kosinusfunktionen. Position 0 erhält einen bestimmten 768-Vektor; Position 1 erhält einen anderen; wird nie trainiert, nie aktualisiert. Generalisiert auf jede Position über die Formel.
RoPE (Rotary Position Embedding). Rotiert Query- und Key-Vektoren basierend auf der Position. Wird von LLaMA, Qwen verwendet. Keine zusätzlichen Parameter; die Rotation ist in den Attention-Mechanismus integriert.
Gelernt. Eine separate Embedding-Tabelle der Form (T, d_model), wobei T eine Kontextlänge ist. Jede Zeile wird per Backpropagation trainiert, genau wie Token-Embeddings.
ANDREAs Wahl: Gelernt
ANDREA übernimmt einen gelernten Positionsansatz von microGPT, der ihn von nanoGPT übernommen hat, der ihn wiederum von GPT-2 geerbt hat. Eine Begründung:
- Einfachheit. Keine spezielle Mathematik in Attention. Eine Positionstabelle sieht aus wie eine Token-Tabelle.
- Kompatibilität mit benutzerdefiniertem CUDA. ANDREAs microgpt_cuda.cu-Engine behandelt zwei Embedding-Lookups identisch; keine Sin/Cos-Kernels nötig.
- Ausreichend für festen Kontext. ANDREA begrenzt T auf 1024. Eine gelernte Tabelle funktioniert gut für Sequenzen fester Länge.
ANDREA-120M Positions-Embedding-Kosten
| Menge | Wert |
|---|---|
| T (Kontext) | 1.024 |
| d_model | 768 |
| Parameter | 786.432 |
0,79M Parameter für Positionen. Kombiniert mit Token-Embeddings: 6,49M + 0,79M = 7,27M Embedding-Parameter insgesamt für ANDREA-120M.
Wie sie kombiniert werden
An jeder Position t in einer Eingabesequenz:
x_t = token_embedding[token_id_t] + position_embedding[t]
Zwei 768-Vektoren, elementweise addiert. Das Ergebnis, x_t, fließt in den ersten Transformer-Block. Das Modell trennt sie nie wieder; es lernt, das kombinierte Signal zu nutzen.
Gelernt vs. Sinusförmig
Wo die Embedding-Parameter liegen
Eine vollständige ANDREA-120M-Embedding-Schicht
| Komponente | Shape | Parameter |
|---|---|---|
| Token-Einbettungstabelle | 8.449 × 768 | 6.488.832 |
| Positions-Einbettungstabelle | 1.024 × 768 | 786.432 |
| Gesamt | 7.275.264 |
Rund 7,3 Mio. Parameter. Gesamte Parameteranzahl von ANDREA-120M: ~120 Mio. Allein die Einbettungsschicht: 6 %. Die restlichen 94 % befinden sich in den Transformer-Blöcken (Attention + MLP, behandelt in Aktivitäten 5–7).
Ungebundene vs. gebundene Einbettungen
Viele Transformer-Designs (einschließlich GPT-2) koppeln eine Token-Einbettung mit einer finalen Ausgabeprojektion: dieselbe V × d_model-Matrix wird sowohl am Eingang als auch am Ausgang (Logits über den Wortschatz) verwendet. Das Koppeln spart V × d_model Parameter und verbessert oft die Qualität.
ANDREA verwendet entkoppelte Einbettungen: Eingabe-Einbettung und Ausgabeprojektion werden als separate Matrizen trainiert. Aktivität 7 (grow_a_language_model_transformer_block) behandelt eine finale Schicht.
Ein Forward-Pass bis hierhin
Eingabe: Token-IDs [256, 1842, 7301, ...] (1024 Stück). Jede ID wird zu einem 768-Vektor nachgeschlagen. Jede Position wird zu einem 768-Vektor nachgeschlagen. Elementweise summiert. Ergebnis: eine (1024, 768)-Matrix x aus Token-+-Positionsvektoren. x fließt in Transformer-Block 1.
Aktivität 5 (grow_a_language_model_attention) behandelt, was Block 1 macht: Scaled-Dot-Product-Attention mit kausaler Maske & Softmax.