Lernen, den nächsten Buchstaben zu raten
Ein Sprachmodell lernt durch die Vorhersage des nächsten Tokens. Es rät das nächste Token, sieht das richtige und schubst seine Zahlen, damit es besser rät. Diese eine Schleife, über riesige Textmengen wiederholt, ist das ganze Training.
Hier trainieren Sie ein winziges Modell in wenigen Sekunden auf einer kurzen Zeile und sehen, wie seine Vermutungen besser werden.
Am Ende dieser Lektion
Notiz
Ich kann ein winziges Modell trainieren, das das nächste Zeichen vorhersagt, und seinen Verlust lesen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Vorhersage des nächsten Tokens | raten, welches Token als Nächstes kommt | |
| Ziel | das Token, das wirklich als Nächstes kommt | e nach s |
| Wahrscheinlichkeit | der Anteil, den ein Modell einem Token gibt, von 0 bis 1 | |
| Verlust | wie überrascht das Modell vom Ziel war | |
| Trainingsschritt | ein kleiner Schubs für jeden Score | |
| Lernrate | wie groß jeder Schubs ist | 2,0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jede Stelle eines Textes ist eine Frage
Nehmen Sie die Zeile „see seerose rose see“ aus Lektion 1. An jeder Stelle lautet die Frage: Was kommt als Nächstes? Die Antwort, das Ziel, ist das nächste Zeichen im Text.
So ergeben 20 Zeichen 19 Fragen, ganz ohne Beschriften von Hand. Darum kann ein Modell aus jedem beliebigen Text lernen.
Durchgerechnetes Beispiel: die ersten sechs Fragen
| Stelle | Dieses Token | Ziel |
|---|---|---|
| 0 | s | e |
| 1 | e | e |
| 2 | e | Leerzeichen |
| 3 | Leerzeichen | s |
| 4 | s | e |
| 5 | e | e |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Unser Modell schaut ein Token zurück
Unser winziges Modell ist eine Tabelle von Scores, mit einer Zeile für jedes Token und einer Spalte für jedes mögliche nächste Token. Softmax macht aus einer Zeile Wahrscheinlichkeiten. Fünf Zeichen ergeben eine Tabelle mit 25 Scores.
Dieses Modell sieht nur das Token direkt davor. Ein Transformer sieht durch maskierte Attention jedes frühere Token. Trainiert wird er auf dieselbe Weise.
Der Verlust misst die Überraschung
Der Verlust für eine Frage ist minus der Logarithmus der Wahrscheinlichkeit, die das Modell dem Ziel gab. Eine sichere, richtige Vermutung kostet fast nichts. Eine kleine Wahrscheinlichkeit auf dem Ziel kostet viel.
Am Anfang ist jeder Score 0, also bekommt jedes der 5 Zeichen 0,2. Der Verlust ist dann bei jeder Frage 1,61.
Durchgerechnetes Beispiel: Wahrscheinlichkeit auf dem Ziel und Verlust
| Wahrscheinlichkeit auf dem Ziel | Verlust |
|---|---|
| 1,0 | 0 |
| 0,9 | 0,11 |
| 0,5 | 0,69 |
| 0,2 | 1,61 |
| 0,1 | 2,30 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Trainingsschritt schubst die Scores
Schauen Sie bei jeder Frage auf die Zeile dieses Tokens. Jeder Score darin sinkt um seine Wahrscheinlichkeit. Der Score des Ziels steigt zusätzlich um 1.
Addieren Sie diese Schubse über alle 19 Fragen und teilen Sie durch 19. Multiplizieren Sie mit der Lernrate und wenden Sie sie an. Das ist ein Trainingsschritt. Wiederholen Sie ihn, und der Verlust fällt.
Das winzige Modell 50 Schritte trainieren
import math
text = "see seerose rose see"
zeichen = [" ", "e", "o", "r", "s"] # das Vokabular, 5 Zeichen
tabelle = [] # jeder Score beginnt bei 0
for i in range(5):
tabelle.append([0.0] * 5)
rate = 2.0
for schritt in range(51):
schubs = []
for i in range(5):
schubs.append([0.0] * 5)
verlust = 0
for k in range(19): # 19 Paare: dieses Token und das nächste
a = zeichen.index(text[k])
b = zeichen.index(text[k + 1])
summe = 0
for s in tabelle[a]:
summe = summe + math.exp(s)
for j in range(5):
p = math.exp(tabelle[a][j]) / summe
schubs[a][j] = schubs[a][j] + p
if j == b:
schubs[a][j] = schubs[a][j] - 1
verlust = verlust - math.log(p)
if schritt % 10 == 0:
print("Schritt", schritt, "Verlust", round(verlust / 19, 3))
for a in range(5):
for j in range(5):
tabelle[a][j] = tabelle[a][j] - rate * schubs[a][j] / 19
# Ändern Sie rate in 0.5 und starten Sie erneut. Fällt der Verlust schneller oder langsamer?Durchgerechnetes Beispiel: der Verlust im Lauf des Trainings
| Schritt | 0 | 10 | 20 | 30 | 40 | 50 |
|---|---|---|---|---|---|---|
| Verlust | 1,609 | 0,750 | 0,613 | 0,564 | 0,539 | 0,525 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, ein Modell speichere die gelesenen Sätze und schlage sie nach. Unseres speichert 25 Scores und keinen Text. Es hat gelernt, dass auf s hier immer e folgt. Ein Modell hält Muster in Zahlen fest, und darum kann es sich auch sicher irren.
Das Trainingsskript ins Lab schreiben
docker exec jupyter sh -c "printf '%s\n' 'import numpy as np' 'text = \"see seerose rose see\"' 'zeichen = sorted(set(text))' 'ids = np.array([zeichen.index(z) for z in text])' 'x, y = ids[:-1], ids[1:]' 'W = np.random.default_rng(0).normal(0, 0.1, (5, 5))' 'for schritt in range(101):' ' p = np.exp(W[x]) / np.exp(W[x]).sum(axis=1, keepdims=True)' ' if schritt % 25 == 0:' ' print(\"Schritt\", schritt, \"Verlust\", round(-np.log(p[np.arange(19), y]).mean(), 3))' ' p[np.arange(19), y] -= 1' ' np.add.at(W, x, -2.0 * p / 19)' 'p = np.exp(W[1]) / np.exp(W[1]).sum()' 'print(\"nach e:\", dict(zip(zeichen, p.round(2).tolist())))' > steps/tiny.py"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Mit Zufallsscores und Startwert trainieren
docker exec jupyter python3 steps/tiny.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.