From Karpathy · Let’s build GPT

GPT 结构精讲

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

精读约 40–60 分钟 · 配合 code/01_llama2_decoder.py

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 口径(飞书自测常用):

  1. Wq
  2. Wk
  3. Wv
  4. Wo
  5. MLP 升维
  6. MLP 降维

合计 6。Llama SwiGLU 是 gate/up/down 三个线性 → Attention 4 + MLP 3 = 7(答之前先说清口径)。

7. 建议怎么学透

  1. 对照图 1、图 2 默画一遍(不看屏幕)。
  2. 打开 Attention 精讲,把 Attn 子层抠透。
  3. code/01_llama2_decoder.py,打印每个 Linear 的 weight shape。
  4. 录音 3 分钟:整模型数据流 + 一层里 6/7 个 matmul + 训练/推理差别。
网页是精读版;仓库里 notes/01_*.md 是提纲索引。对外发布请看 发布与变现

下一篇:Attention 精讲 →