0.1.8. Vorwärtspass
Model.Forward bewertet eine Token-ID an einer Position und verlängert den Cache. Training ruft es für jede Eingabeposition auf, die Stichprobe für jedes neu gezogene Zeichen. Die Rechnung ist derselbe Aufruf.
embedAdd: Tokenzeile plus Positionszeile.- RMSNorm dieser Summe.
- Jede Schicht in
Layersersetzt den Strom durch ihren Block. Mit der Referenz ist das eine Schicht. logit[v] = Skalarprodukt(LMHead[v], x)für jede Token-ID.
Die Logits sind so lang wie das Vokabular, nicht 16. Ein größerer Logit ist eine stärkere Neigung zu dieser ID. Wahrscheinlichkeiten entstehen erst im Verlust und in der Stichprobe. An den Logits hängt kein Bias.
StartSequence legt einen neuen Graphen an und leert jeden Cache. FinishSequence gibt den Graphen frei. Die Parameter bleiben.
E = 16, L = 1, V die Vokabulargröße, T = 16, Aufweitung H = 4.
| Tabelle | Form | Anzahl |
|---|---|---|
WTE |
V × E |
V·E |
WPE |
T × E |
T·E |
je Schicht WQ, WK, WV, WO |
je E × E |
4 E² |
je Schicht FC1 |
(H·E) × E |
H E² |
je Schicht FC2 |
E × (H·E) |
H E² |
LMHead |
V × E |
V·E |
Zusammen 2·V·E + T·E + L·(4·E² + 2·H·E²). New prüft, dass die angelegte Liste genau diese Zahl hat, und das Programm druckt sie. Für die Namensliste mit V = 27 sind das 4192 Parameter. Die Adam-Momente zählen nicht mit.
Eine Matrix ist eine Liste von Zeilen. Die Zeilenlänge ist die Eingabegröße. matrix zieht jeden Eintrag unabhängig mit Standardabweichung 0.08.
Context ist zugleich die Zeilenzahl von WPE und die größte Positionszahl, die Attention in einer Folge sieht. positions nimmt das Minimum aus dieser Grenze und len(Token) - 1, weil hinter dem letzten Token kein Ziel mehr steht. Ein längeres Dokument verliert die Paare hinter dem Fenster. Das ist die Grenze, kein Fehler im Verlust.
Für ana sind fünf IDs da, also vier bewertete Positionen, 0 bis 3. Der gedruckte Vorwärtspass ist die letzte dieser Positionen. Ihr Ziel ist das schließende BOS. Die Attention-Zeile hat vier Gewichte.
0.1.9. Verlust macht aus den Logits die Zahl, die das Training senkt.