0.1.1. MinimalesLLM
MinimalesLLM zeigt, wie ein Sprachmodell intern im Prinzip arbeitet. Aus einem kurzen Text werden Token, aus den Token werden Vektoren, ein Transformer mischt diese Vektoren, das Training verschiebt die Gewichte, und eine Stichprobe setzt den Text fort.
Das ist dieselbe Kernoperation wie im Abschnitt Was sind LLMs: das jeweils nächste Token vorhersagen. Die Ausgabe des Programms ist eine kurze Buchstabenfolge. Es führt keinen Dialog.
Der Quelltext liegt hier: https://gitea.neitzel.de/konrad/MinimalesLLM (extern)
Ein heutiges Modell kennt Zehntausende Token: Wortteile, Satzzeichen, Code. Hier ist das Vokabular des Referenzlaufs auf die 26 Kleinbuchstaben a bis z reduziert. Dazu kommt ein weiteres Token, BOS.
BOS ist kein Buchstabe. Es markiert den Rand eines Worts. Jede Trainingszeile beginnt mit BOS, und eine erzeugte Zeichenfolge endet, wenn das Modell BOS zieht.
Dadurch wird ein „Satz“ in diesem Beispiel zu einem einzelnen Wort: ein Vorname in einer Zeile. Das Modell sieht keine Absätze und keine Rollen. Es lernt, welcher Buchstabe in solchen kurzen Wörtern als Nächstes kommt.
Das Wort ana wird zu fünf Token: BOS, a, n, a, BOS. In der Namensliste des Referenzlaufs sind das die IDs [26 0 13 0 26].
Die folgenden Seiten beschreiben jeden Schritt. Hier nur die Rolle.
- Tokenizer. Eine Zeile wird zu BOS, den IDs ihrer Buchstaben und noch einmal BOS. Ein Zeichen, das in der Datei nicht vorkommt, hat keine ID.
- Einbettung. Jede Token-ID und jede Position wird zu einem Vektor aus 16 Zahlen. Beide Vektoren werden addiert.
- Attention. Die aktuelle Position mischt die Stellen, die sie schon gesehen hat. Spätere Zeichen bleiben unsichtbar.
- Block. Attention und ein kleines vorwärtsgerichtetes Netz schreiben je eine Änderung auf den laufenden Vektor zurück.
- Vorwärtspass. Am Ende steht für jedes Token eine Zahl, der Logit. Ein größerer Logit ist eine stärkere Neigung zu diesem Token.
- Verlust. Er misst, wie überrascht das Modell vom tatsächlich nächsten Token war. Training soll diese Zahl senken.
- Autograd. Der Rückwärtspass rechnet mit der Kettenregel aus, welches Gewicht am Verlust beteiligt war.
- Training. Ein Schritt ist ein Wort. Adam verschiebt danach alle Gewichte ein kleines Stück.
- Stichprobe. Die Gewichte bleiben stehen. Das Programm zieht das nächste Zeichen, hängt es an und hört bei BOS auf.
Die Referenzform ist schmal: Breite 16, eine Schicht, vier Attention-Köpfe, Kontextfenster 16. Für 26 Buchstaben plus BOS sind das 4192 Parameter.
| Paket | Aufgabe |
|---|---|
token |
Korpus, Vokabular, Kodierung |
autograd |
Elementare Operationen und der Rückwärtspass |
model |
Einbettung, Attention, Block, Vorwärtspass, Verlust |
train |
Adam und ein Schritt je Wort |
sample |
Temperatur und Ziehung |
cmd/minimalesllm |
Referenzlauf und die gedruckte Inspektion |
cmd/namegenerator |
Trainiert eine Namensliste und setzt eingegebene Anfänge fort |
- 0.1.2. Aufruf und Beispielausgabe
Start des Referenzlaufs, die beiden Parameter und was die gedruckten Zeilen bedeuten. - 0.1.3. Namensgenerator
Dieselbe Rechnung, danach Fortsetzungen zu einem eingegebenen Anfang. - 0.1.4. Token
Wie eine Zeile zu IDs wird. - 0.1.5. Einbettungen
Token-ID und Position als gelernte Vektoren. - 0.1.6. Attention
Query, Key, Value und die Mischung der bisherigen Positionen. - 0.1.7. Block
Attention, vorwärtsgerichtetes Netz und Residualverbindung. - 0.1.8. Vorwärtspass
Die Reihenfolge der Rechnung und die 4192 Parameter. - 0.1.9. Verlust
Vom Logit zur Überraschung über das nächste Token. - 0.1.10. Autograd
Kettenregel auf einzelnen Skalaren. - 0.1.11. Training
Ein Wort, ein Adam-Schritt. - 0.1.12. Stichprobe
Zeichen ziehen, bis BOS kommt. - 0.1.13. Was weggelassen wurde
Techniken heutiger Modelle, die dieses Beispiel bewusst auslässt.