🧠
Lektion 4 · Kern
Forward-Pass & Attention
Embeddings, 4 Attention-Heads, MLP und Residualstrom – ein Token Schritt für Schritt
Tempo1 / 22
Vorbereitung Daten Forward Verlust Backward Update Sampling Ergebnis
📜Quelltext
Zeile 11➤def gpt(token_id, pos_id, keys, values):
2 tok_emb = state_dict['wte'][token_id] # Token-Embedding
3 pos_emb = state_dict['wpe'][pos_id] # Positions-Embedding
4 x = [t + p for t, p in zip(tok_emb, pos_emb)]
5 x = rmsnorm(x)
6
7 for li in range(n_layer):
8 # 1) Multi-Head-Attention
9 x_residual = x
10 x = rmsnorm(x)
11 q = linear(x, state_dict[f'layer{li}.attn_wq'])
12 k = linear(x, state_dict[f'layer{li}.attn_wk'])
13 v = linear(x, state_dict[f'layer{li}.attn_wv'])
14 keys[li].append(k)
15 values[li].append(v)
16 x_attn = []
17 for h in range(n_head):
18 hs = h * head_dim
19 q_h = q[hs:hs+head_dim]
20 k_h = [ki[hs:hs+head_dim] for ki in keys[li]]
21 v_h = [vi[hs:hs+head_dim] for vi in values[li]]
22 attn_logits = [sum(q_h[j] * k_h[t][j] for j in range(head_dim)) / head_dim**0.5 for t in range(len(k_h))]
23 attn_weights = softmax(attn_logits)
24 head_out = [sum(attn_weights[t] * v_h[t][j] for t in range(len(v_h))) for j in range(head_dim)]
25 x_attn.extend(head_out)
26 x = linear(x_attn, state_dict[f'layer{li}.attn_wo'])
27 x = [a + b for a, b in zip(x, x_residual)]
28 # 2) MLP-Block
29 x_residual = x
30 x = rmsnorm(x)
31 x = linear(x, state_dict[f'layer{li}.mlp_fc1'])
32 x = [xi.relu() for xi in x]
33 x = linear(x, state_dict[f'layer{li}.mlp_fc2'])
34 x = [a + b for a, b in zip(x, x_residual)]
35
36 logits = linear(x, state_dict['lm_head'])
37 return logits
🖥️Konsole (stdout)
— noch keine Ausgabe —
🔎Variablen (locals)
🟡 = geändert- token_idint12(„m“)
- pos_idint3
- keys[0]3 gecachte Keys (⟨BOS⟩, e, m)
🧰 VorbereitungZeile 1
Ein Token durch das Netz: „m“ an Position 3
Wir verfolgen den Namen emma mit dem trainierten Modell. Die Positionen 0–2 (⟨BOS⟩, e, m) sind schon durchgelaufen und liegen im KV-Cache. Jetzt kommt das zweite „m“ an Position 3. Die Frage an das Modell: Welcher Buchstabe folgt auf „emm“? (Richtig wäre „a“.)
🎬Visualisierung
🧠
gpt(): ein Token rein, 27 Bewertungen raus
- 1Embeddings: Token-Id und Position werden zu Vektoren
- 2Attention: das Token „schaut“ auf frühere Token (Kommunikation)
- 3MLP: rechnet pro Position weiter (Berechnung)
- 4lm_head: 27 Logits – eine Bewertung je möglichem nächsten Token