From Karpathy · Let’s build GPT

GPT 结构精讲

目标不是背名词,而是能手画整条数据流,并说出每个方块的 shape、参数和算力角色。

精读约 40–60 分钟 · 若术语吃力,先看 零基础图解

缩写看不懂?先花 15 分钟读完 GPT 零基础图解,再回本页。

1. 整模型长什么样

GPT 类语言模型 = 词嵌入 + 位置信息 + N 层 Decoder + LM Head。训练目标:根据前文预测下一个 token(交叉熵)。推理时把预测出的 token 再喂回去,这叫自回归。

GPT 整体数据流 tokens (B,T) Token Emb + Pos / RoPE Decoder × N Attn + MLP 残差 · Pre-Norm 一层示意 → LM Head → logits vocab → C 维向量 隐状态保持 (B,T,C) C → vocab_size
图 1 · 整模型:嵌入进、N 层 Decoder、LM Head 出 logits

形状习惯(务必记住)

tokens:   (B, T)           # batch, 序列长度
emb:      (B, T, C)        # C = n_embd / hidden_size
logits:   (B, T, vocab)    # 训练时常只取最后位置或全序列 CE
符号含义量级直觉
vocab词表大小几万(BPE)
T / block_size上下文长度1k–128k+
C隐层宽度768(小)→ 12288(GPT-3 175B)
NDecoder 层数12 → 96+

2. 一层 Decoder 内部

现代主流是 Pre-Norm:先 Norm,再子层,再残差相加。Karpathy 原课 GPT-2 风格也是这条路。

Decoder Block x 残差 RMS/LayerNorm Causal Attn QKV · mask · Wo + Norm MLP / SwiGLU 升维 → 激活 → 降维 + Attention 子层 · 混合序列信息 · 长序列算力 ∝ T² MLP 子层 · 逐位置非线性 · 参数量常更大
图 2 · 一层 Decoder:两条「Norm → 子层 → 残差加」
为什么要残差? 提供梯度直通路径,深度才堆得动。没有残差,上百层几乎训不动。

3. 训练 vs 推理(同一套权重,两条路径)

训练与推理对比 训练 一次喂入整段 (B,T) Teacher forcing 因果 mask 防作弊 对多位置算 loss 算力:含 T×T Attention 推理 Decode 逐步生成,每步 1 token 历史写入 KV Cache 新步只算新 Q 读完整段 K/V 常成带宽瓶颈
图 3 · 同一模型:训练并行看全文(被 mask 约束);推理逐步读 cache

4. MLP(FFN)要细到什么程度

GPT-2 风格:

Linear(C → 4C) → GELU → Linear(4C → C)

Llama2 风格(本仓库代码):

gate = SiLU(W1 x)
up   = W3 x
out  = W2 (gate * up)     # SwiGLU;中间宽约 8/3 C

参数与 FLOPs:短序列时 MLP 往往是大头(通道 4×);长序列 Prefill 时 Attention 的 T² 会追上来甚至反超。

5. Norm 与位置编码

6. 一个 Decoder 有几个带参 matmul?对照脚本打印

GPT-2/3 口径(飞书自测常用)共 6:Wq、Wk、Wv、Wo、MLP 升维、MLP 降维。
Llama SwiGLU(本仓库)是 Attention 4 + MLP 的 w1/w3/w2 → 7(答之前先说清口径)。

跑 python code/01_llama2_decoder.py(默认 C=256, nh=8, nkv=4)典型输出:

attn.wq  (256, 256)  → Q
attn.wk  (128, 256)  → K(GQA,头数减半)
attn.wv  (128, 256)  → V
attn.wo  (256, 256)  → 输出投影
mlp.w1   (688, 256)  → gate
mlp.w3   (688, 256)  → up
mlp.w2   (256, 688)  → down
权重人话
wq / wk / wv把 x 变成「提问 / 标签 / 货物」三路;分数用 Q·K,再用分数混 V
wo多头拼回后的汇总投影
w1 / w3 / w2SwiGLU:W2(SiLU(W1x)*(W3x))

更细的逐步说明见 Attention 精讲 §4(页面内「对照代码:wq / wk / wv / wo」一节)。

7. 建议怎么学透

  1. 对照图 1、图 2 默画一遍(不看屏幕)。
  2. 打开 Attention 精讲,把 Attn 子层与 wq/wk/wv/wo 抠透。
  3. 跑 code/01_llama2_decoder.py,改 n_kv_heads 看 wk/wv 形状变化。
  4. 录音 3 分钟:整模型数据流 + 一层里 7 个 matmul 各干什么 + 训练/推理差别。
网页是精读版;仓库里 notes/01_*.md 是提纲索引。对外发布请看 发布与变现。

下一篇:Attention 精讲 →