本课模式:三步走——手算一次注意力(理解机制)→ 用可视化工具看多头 → 估算 KV cache 显存(理解工程)。做完你能读懂 DeepSeek/Qwen/Llama 的技术报告架构图。
📋 本课你将完成
- 手算过一次注意力加权(第 1 步)
- 在可视化工具里看过 Q/K/V 与多头
- 解释过 RoPE 解决什么问题
- 用计算器估算了 KV cache 显存
- 能说清 GQA/MoE 的「总参数 vs 激活参数」
步骤 1
手算一次注意力(20 分钟)
未完成🎯 这一步的目标:用最小的 3 词例子,亲手算 Q·K → softmax → 加权和。这一步通了,注意力机制就通了。
python3▶ 预期输出(点开对照)
>>> (提示符出现)
import numpy as np
np.random.seed(42)
X = np.random.rand(3, 4) # 3 个 token,每个 4 维向量
Wq = np.random.rand(4, 4); Wk = np.random.rand(4, 4); Wv = np.random.rand(4, 4)
Q = X @ Wq; K = X @ Wk; V = X @ Wv
scores = Q @ K.T / np.sqrt(4) # 除以 sqrt(d) 防梯度消失
weights = np.exp(scores - scores.max(axis=1, keepdims=True))
weights = weights / weights.sum(axis=1, keepdims=True) # softmax
out = weights @ V
print("注意力权重:"); print(weights.round(3)); print("输出:"); print(out.round(3))▶ 预期输出(点开对照)
注意力权重: [[0.541 0.243 0.216] [0.337 0.385 0.278] [0.359 0.328 0.313]] 输出: [[...]] (每一行 = 一个 token 对前文的关注分布;输出 = 加权后的新向量)
✅ 检查点:你能解释「scores → softmax → 加权 V」三步,并说出为什么除以 sqrt(d)。
步骤 2
用可视化工具看 Q/K/V 与多头(15 分钟)
未完成🎯 这一步的目标:在浏览器里直观看到「多头」各关注什么关系。
▶ 预期输出(点开对照)
(见下方交互实验:输入几个词,看注意力矩阵——不同头关注不同关系)
✅ 检查点:你观察到至少两个头关注了不同的词间关系。
步骤 3
估算 KV cache 显存(15 分钟)
未完成🎯 这一步的目标:算出「长上下文为什么贵」——这是推理工程的物理原因。
# KV cache 大小 ≈ 2(层数×注意力头数×每头维度) × 上下文长度 × 字节数
python3 -c 'layers=32; heads=32; dim=128; ctx=4096; bytes_per=2', 'kv_size = 2 * layers * heads * dim * ctx * bytes_per', 'print(f"KV cache ≈ {kv_size/1e9:.1f} GB (7B 模型, 4k 上下文, FP16)" )'▶ 预期输出(点开对照)
KV cache ≈ 1.1 GB (7B 模型, 4k 上下文, FP16)
▶ 预期输出(点开对照)
这 1.1GB 是<b>每个并发请求</b>都要占的——并发 100 个请求就 110GB。这就是长上下文 + 高并发的成本来源,也是 GQA/MLA 存在的意义(把 KV 压到 1/8 或 1/16)
✅ 检查点:你能说出 KV cache 随上下文/并发增长,以及 GQA/MLA 为什么省显存。
步骤 4
读懂架构表:总参数 vs 激活参数(10 分钟)
未完成🎯 这一步的目标:掌握读任何模型技术报告的最后一招——MoE 的算力与显存差异。
▶ 预期输出(点开对照)
DeepSeek-V3:总参数 671B,激活 37B(MoE) 推理算力 ≈ 37B 稠密模型(激活决定) 显存要装下 671B(总参数决定) 结论:MoE 用「同等算力换更多参数」——训练省,但部署显存不小
✅ 检查点:你能解释「为什么 671B 模型推理不算贵,但显存不小」。
🧪 交互实验 · 注意力热力图
输入几个词,下方显示一个模拟的注意力矩阵热力图——颜色越深 = 关注越强。不同「头」关注不同关系:有的头关注相邻词,有的头关注句首。
这是模拟的热力图(真实模型的注意力矩阵由训练学到)。目的是让你直观理解「每个位置对前文所有位置的加权关注」——这是 Transformer 的核心心智模型。
🧪 交互实验 · KV cache 显存计算器
拖动模型规模与上下文长度,看 KV cache 显存怎么涨——理解「长上下文为什么贵」。
8k
看到数字怎么暴涨了吗?这就是为什么「长上下文 = 贵」,以及 GQA/MLA(第 05 课表)为什么是重要工程。
❓ 老师答疑(卡住了先看这里)
❓ 手算时为什么除 √d?
防止点积过大把 softmax 推成 one-hot(一个 1 其余全 0)导致梯度消失。除以 √d 让分数保持在合理范围,softmax 分布平滑、可学习。
❓ 多头到底多在哪?
把 d 维拆成 h 个头并行算注意力,每个头可以专注不同关系(语法、指代、语义、位置……)。头数越多,单层能「并行看」的模式越多——但总维数有限,头太多每头维度太薄反而变差。
❓ RoPE 是什么?为什么是标准?
旋转位置编码:把位置信息以旋转矩阵方式乘进 Q/K,让相对位置差异体现在点积里。外推性好(训 4k 可用 8k+)、无额外参数、实现简单——所以是事实标准。
❓ GQA 和 MLA 的区别?
GQA(分组查询):多个 Q 共享一组 K/V,省显存;MLA(DeepSeek):把 KV 压缩进低维潜在空间再解压,省 90%+ KV 显存。都是「省 KV cache」的思路,工程取舍不同。
📝 自测清单(全勾才算过)
- 手算过一次注意力加权(第 1 步)
- 在可视化工具里看过 Q/K/V 与多头
- 解释过 RoPE 解决什么问题
- 用计算器估算了 KV cache 显存
- 能说清 GQA/MoE 的「总参数 vs 激活参数」
全勾 → 节点 05 / 14 完成。未勾 → 回看对应步骤,别急着往前走。