🏋️
Lektion 5 · Praxis

Trainingsschritt & Adam

Verlust, Backward über 50.000 Knoten, Adam-Update – und 1.000 Schritte im Zeitraffer

Tempo
1 / 20
Vorbereitung Daten Forward Verlust Backward Update Sampling Ergebnis

📜Quelltext

Zeile 1
1learning_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_ratefloat
    0.01
  • beta1float
    0.85
  • beta2float
    0.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