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 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 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.
Für jeden Parameter, mit Gradient 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 läuft einmal pro Dokument, nicht einmal pro Zeichen. Die Caches binden die Positionen zu einem Graphen.
-seed steht auf 1. Derselbe Seed 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 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.