🏋️
Lektion 5 · Praxis
Trainingsschritt & Adam
Verlust, Backward über 50.000 Knoten, Adam-Update – und 1.000 Schritte im Zeitraffer
Tempo1 / 20
Vorbereitung Daten Forward Verlust Backward Update Sampling Ergebnis
📜Quelltext
Zeile 11➤learning_rate, beta1, beta2, eps_adam = 0.01, 0.85, 0.99, 1e-8
2m = [0.0] * len(params) # erstes Moment (Schwung)
3v = [0.0] * len(params) # zweites Moment (Streuung)
4num_steps = 1000
5for step in range(num_steps):
6 doc = docs[step % len(docs)]
7 tokens = [BOS] + [uchars.index(ch) for ch in doc] + [BOS]
8 n = min(block_size, len(tokens) - 1)
9 keys, values = [[] for _ in range(n_layer)], [[] for _ in range(n_layer)]
10 losses = []
11 for pos_id in range(n):
12 token_id, target_id = tokens[pos_id], tokens[pos_id + 1]
13 logits = gpt(token_id, pos_id, keys, values)
14 probs = softmax(logits)
15 loss_t = -probs[target_id].log()
16 losses.append(loss_t)
17 loss = (1 / n) * sum(losses)
18 loss.backward()
19 lr_t = learning_rate * (1 - step / num_steps)
20 for i, p in enumerate(params):
21 m[i] = beta1 * m[i] + (1 - beta1) * p.grad
22 v[i] = beta2 * v[i] + (1 - beta2) * p.grad ** 2
23 m_hat = m[i] / (1 - beta1 ** (step + 1))
24 v_hat = v[i] / (1 - beta2 ** (step + 1))
25 p.data -= lr_t * m_hat / (v_hat ** 0.5 + eps_adam)
26 p.grad = 0
27 print(f"step {step+1:4d} / {num_steps:4d} | loss {loss.data:.4f}")
🖥️Konsole (stdout)
— noch keine Ausgabe —
🔎Variablen (locals)
🟡 = geändert- learning_ratefloat0.01
- beta1float0.85
- beta2float0.99
🧰 VorbereitungZeile 1
Die Trainingsschleife in fünf Takten
Jeder Schritt: (1) ein Dokument nehmen, (2) Token für Token vorwärts rechnen, (3) den Verlust bilden, (4) mit backward() alle 4.192 Gradienten holen, (5) mit Adam die Parameter verbessern. Wir gehen den allerersten Schritt eines frisch initialisierten Modells durch.
🎬Visualisierung
🏋️
Ein Trainingsschritt
- 1① Dokument wählen und tokenisieren
- 2② Forward: Vorhersage an jeder Position
- 3③ Verlust: −log p(richtiges Token), gemittelt
- 4④ Backward: Gradienten für alle Parameter
- 5⑤ Adam-Update, Gradienten auf 0