From Karpathy · Let’s build GPT
GPT 结构精讲
目标不是背名词,而是能手画整条数据流,并说出每个方块的 shape、参数和算力角色。
缩写看不懂?先花 15 分钟读完 GPT 零基础图解,再回本页。
1. 整模型长什么样
GPT 类语言模型 = 词嵌入 + 位置信息 + N 层 Decoder + LM Head。训练目标:根据前文预测下一个 token(交叉熵)。推理时把预测出的 token 再喂回去,这叫自回归。
形状习惯(务必记住)
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) |
N | Decoder 层数 | 12 → 96+ |
2. 一层 Decoder 内部
现代主流是 Pre-Norm:先 Norm,再子层,再残差相加。Karpathy 原课 GPT-2 风格也是这条路。
为什么要残差? 提供梯度直通路径,深度才堆得动。没有残差,上百层几乎训不动。
3. 训练 vs 推理(同一套权重,两条路径)
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 与位置编码
- LayerNorm / RMSNorm:稳定激活尺度。Llama 用 RMSNorm(无均值项,更省一点)。
- 绝对位置嵌入(Karpathy 课):可学习
pos_emb[T, C],与 token emb 相加。 - RoPE(Llama):旋转 Q/K,不另加一套大参数表;shape 不变。
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 / w2 | SwiGLU:W2(SiLU(W1x)*(W3x)) |
更细的逐步说明见 Attention 精讲 §4(页面内「对照代码:wq / wk / wv / wo」一节)。
7. 建议怎么学透
- 对照图 1、图 2 默画一遍(不看屏幕)。
- 打开 Attention 精讲,把 Attn 子层与 wq/wk/wv/wo 抠透。
- 跑
code/01_llama2_decoder.py,改n_kv_heads看 wk/wv 形状变化。 - 录音 3 分钟:整模型数据流 + 一层里 7 个 matmul 各干什么 + 训练/推理差别。
网页是精读版;仓库里
notes/01_*.md 是提纲索引。对外发布请看 发布与变现。