0.1.11. Training
Eine Stufe ist ein Dokument: vorwärts, Verlust, rückwärts, ein Adam-Schritt. train.Step macht das. Nichts in der Schleife schreibt eine Regel wie „Namen enden oft auf einen Vokal“. Wenn das aus der Datei vorhersagbar ist, zeigen es die Gewichte als höhere Wahrscheinlichkeit.
Nach der Stufe können sich die Data-Felder der Parameter geändert haben. Das ist das Modell. Unverändert bleiben das Vokabular, die Breite, die Adam-Koeffizienten und die Struktur des Netzes. Aktivierungen werden beim nächsten Dokument neu berechnet. Die Momentpuffer M und V gehören zum Optimierer. Sie stehen nicht im Graphen und gehen nicht in den Vorwärtspass, Glossar, öffnet in neuem Tab
ein.
1000 Stufen. Der Korpus wird einmal gemischt, bevor Stufe 0 beginnt, mit demselben Generator, der die Parameter gezogen hat. Stufe k nimmt docs[k mod Dokumentzahl]. Die Namensliste hat mehr als einen Durchgang in diesen 1000 Stufen. Ein wiederkehrendes Dokument ist erwartet. Es gibt keine zurückgehaltene Prüfliste. Der gedruckte Verlust, Glossar, öffnet in neuem Tab
ist der Trainingsverlust.
Die Lernrate ist 0.01 * (1 - Stufe/1000) mit einer Gleitkommadivision. Bei Stufe 0 ist sie 0.01, bei Stufe 999 fast 0. Es gibt kein Warmup, Glossar, öffnet in neuem Tab
.
Für jeden Parameter, mit Gradient, Glossar, öffnet in neuem Tab
g:
M = 0.85 * M + 0.15 * g
V = 0.99 * V + 0.01 * g * g
M̂ = M / (1 - 0.85^(Stufe+1))
V̂ = V / (1 - 0.99^(Stufe+1))
Data = Data - Lernrate * M̂ / (sqrt(V̂) + 1e-8)
Grad = 0
M und V starten bei 0. Die Division durch 1 - beta^(Stufe+1) korrigiert diese Null am Anfang. Das Vorzeichen ist eine Subtraktion: der Gradient zeigt bergauf, der Schritt geht bergab. Adam, Glossar, öffnet in neuem Tab
läuft einmal pro Dokument, nicht einmal pro Zeichen. Die Caches binden die Positionen zu einem Graphen.
-seed steht auf 1. Derselbe Seed, Glossar, öffnet in neuem Tab
zieht die Parameter, mischt einmal und setzt den Generator der Stichprobe neu auf, damit die Ziehungen nicht davon abhängen, wie viele Zufallszahlen die Initialisierung verbraucht hat.
Der Namensgenerator benutzt dieselbe Adam-Form. Dort ist die Schrittzahl Epochen × Anzahl der Namen, und jede Epoche mischt die Liste neu.
Die erste Zeile Schritt 0 liegt nahe bei ln(V). Im festgehaltenen Lauf ist das 3,2656 neben ln(27) = 3,2958. Gegen Stufe 999 liegt der Trend tiefer, der letzte gedruckte Verlust ist 2,2517, einzelne Zeilen springen noch über 3. Die Einbettung, Glossar, öffnet in neuem Tab
von a ist danach nicht mehr die anfangs gezogene Zeile. Ein Verlust, der bei ln(V) stehen bleibt, hieße, der Rückwärtspass hätte die Parameter nicht erreicht oder Data wäre nicht geschrieben worden.
0.1.12. Stichprobe zieht aus den festgehaltenen Gewichten neue Zeichenfolgen.