图示规划:让「变换」看得见
这份文档回答两个问题:哪些概念值得画图,以及画成什么形式才不比文字更差。 最近更新:2026-10-28。配套脚本在
figures/scripts/,产物在figures/out/。
0. 为什么要做这件事
课程正文已经覆盖 81 个概念,但多数页面仍是「公式 + 场景 + 推导」。对下面三类内容,文字描述的理解成本明显高于一张图:
- 空间动作:旋转、投影、压扁、拉伸、鞍面——读者需要在脑中做几何变换;
- 连续过程:幂迭代、梯度下降、Gram–Schmidt——读者需要想象「一步步走过去」;
- 离散结构:mask、量化刻度、稀疏/分块——读者需要对照「哪些位置被保留」。
一张好图不是装饰。它应该让读者在 10 秒内获得一个判断,例如「奇异矩阵把平面压成一条线,所以逆不存在」「条件数越大,梯度下降越像之字形」。如果图只是把正文再复述一遍,就不值得画。
1. 选图原则
| 内容 | 首选形式 | 反例 |
|---|---|---|
| 方向、形状、轨迹、场 | Matplotlib SVG | 用 ASCII 字符画箭头 |
| 流程、依赖、模块关系 | Mermaid | 用 SVG 画一堆方框和箭头 |
| 精确数字、矩阵行、参数对照 | Markdown 表格 | 把矩阵画成位图 |
| 单个公式的代数变形 | 正文公式 + 一句话读法 | 为「移项」画一张图 |
四条硬约束:
- 一图一判断:标题与图注只服务一个结论;不要把「旋转 + 特征值 + SVD」塞进一张图。
- 示例可复算:图中每个数字都要能从正文公式推出来;合成数据要标「示例」。
- 不重复正文:图出现的位置紧挨着它解释的那句话,图注补「怎么读」,不重复定义。
- 中英文分工:SVG 内用英文标题与数学符号(避免字体缺失),中文解释放在 Markdown 图注里。
2. 起点:第一轮前的 16 张
「页首」由 figures/manifest.yaml 自动插到概念页正文前;「内联」由 Markdown 直接引用,位置更贴近正文。
| 图 | 概念 | 位置 | 作用 |
|---|---|---|---|
transformer-pipeline.svg | 0.1 | 内联 | 一个 token 穿过 L 层 Transformer 的路径 |
vector-add.svg | 1.2 | 内联 | 首尾相接的加法与平行四边形 |
projection.svg | 1.6 | 页首 | 投影向量与垂直残差 |
cross-product.svg | 1.7 | 内联 | 叉积垂直于一平面,长度等于面积 |
least-squares.svg | 4.4 | 内联 | 向列空间作垂线得到最小二乘解 |
condition-number.svg | 4.6 | 内联 | 病态矩阵把单位圆压成扁椭圆 |
determinant.svg | 5.1 | 页首 | 单位正方形变成平行四边形,面积等于行列式 |
eigenvectors.svg | 6.1 | 页首 | 特征方向在变换后不转向 |
svd.svg | 7.1 | 页首 | 单位圆变成椭圆,半轴是奇异值 |
covariance-sign.svg | 9.1 | 内联 | 正/负协方差对应的点云方向 |
gaussian-contours.svg | 9.2 | 内联 | 二元高斯的同心椭圆 |
pca.svg | 9.3 | 页首 | 主成分方向与最小残差投影 |
whitening.svg | 9.4 | 内联 | 原斜椭圆 → PCA/ZCA 白化 |
rope.svg | 11.5 | 页首 | 位置编码体现为旋转角之差 |
kv-cache.svg | 11.7 | 页首 | KV Cache 随序列长度线性增长 |
softmax-temperature.svg | 11.11 | 页首 | 温度改变 softmax 的尖锐度 |
当时覆盖 16/81 个概念(约 20%)。当时的缺口集中在 M02、M03、M06、M08、M10、M11 的「过程类」概念。
3. 第一轮新增(11 张)
优先补「正文已经写了几何解释、但没有图」且画出来能直接减少脑内模拟的位置。
| 图 | 概念 / 小节 | 读者应获得的判断 |
|---|---|---|
rotation.svg | 0.1 §5.1 2D 旋转 | 把每个向量逆时针转 90°;连乘两次 等于 |
norm-balls.svg | 1.4 §1 范数 | 「长度 1」在 L1/L2/L∞ 下分别是菱形、圆、正方形 |
cosine-angle.svg | 1.5 §1 余弦 | 余弦就是单位向量在另一方向上的坐标,也就是 |
span-independence.svg | 2.3 §1 线性无关 | 相关组的组合挤在一条线上;无关组的组合铺满平面 |
inverse-singular.svg | 3.4 §1.1 可逆性 | 可逆矩阵保住面积、能撤回;奇异矩阵把平面压成线 |
quadratic-form.svg | 6.5 §1 二次型 | 正定是碗,不定是鞍;特征值符号决定每个方向朝上还是朝下 |
power-iteration.svg | 6.6 §1 幂迭代 | 反复乘 并归一化,方向被主特征向量吸过去 |
convexity.svg | 8.6 §1.2 凸性 | 凸函数的弦在图像上方;非凸函数会出现弦下方的「坑」 |
gradient-descent.svg | 8.7 §1.1 梯度下降 | 扁碗上 GD 走之字形,牛顿法一步到中心 |
attention-mask.svg | 11.4 §2.2 因果 mask | 上三角被置 后,第 行只在前 列分配预算 |
quantization-levels.svg | 11.9 §1 量化 | 量化是把连续值吸到最近刻度,最大误差是 |
放置方式:全部为正文内联。这些图只在对应小节有意义,放到页首会与上下文脱节。manifest.yaml 中用 inline: true 登记,概念页只自动挑选 inline 为假的第一张图。
4. 第二轮新增(18 张)
第一轮补的是「单点几何」,第二轮补「过程、映射与工程结构」:矩阵如何逐列组合、两个变换如何复合、特解如何沿零空间移动、浮点间距如何随指数翻倍、LoRA 的瓶颈如何省参数。
| 图 | 概念 / 小节 | 读者应获得的判断 |
|---|---|---|
dot-product.svg | 1.3 §1.1 点积 | 点积 = × 在 上的带符号影子 |
change-of-basis.svg | 2.5 §1 换基 | 同一个向量,换一套网格线,坐标就变了 |
gram-schmidt.svg | 2.7 §2.3 Gram–Schmidt | 减掉投影,剩下的分量才与已选方向正交 |
matrix-vector-columns.svg | 3.2 §1.1 矩阵乘向量 | 是按输入系数把列向量加权相加 |
matrix-composition.svg | 3.3 §1.1 矩阵乘法 | 先 后 与直接乘 是同一个映射 |
system-geometry.svg | 4.1 §1.2 方程组的几何 | 交点、平行、重合分别对应唯一解、无解、无穷多解 |
solution-structure.svg | 4.2 §1.2 通解结构 | 特解加零空间方向,整条线都是解 |
jacobian-polar.svg | 5.4 §1.2 极坐标 | 面积元要乘 ,因为越往外同样的角宽度弧越长 |
low-rank.svg | 7.3 §1 低秩近似 | 前几层奇异向量抓住主体,后面才是细节与噪声 |
gradient-field.svg | 8.1 §1.1 梯度 | 梯度垂直等高线,并指向函数增大方向 |
lagrange.svg | 8.8 §1.1 拉格朗日 | 最优点处目标等值线与约束曲线相切,两个梯度平行 |
float-spacing.svg | 10.1 §1 浮点数 | fp32 的绝对间距每个数量级翻倍,相对精度基本不变 |
roofline.svg | 10.3 §1.2 Roofline | 低强度受带宽限制,高强度受算力限制,拐点是两者之比 |
sparse-pattern.svg | 10.5 §1.2 稀疏结构 | 非零数相同,块/带结构比随机结构更硬件友好 |
layernorm-rmsnorm.svg | 11.6 §1 归一化 | LayerNorm 投影到零均值面,RMSNorm 只重定半径 |
lora.svg | 11.8 §1 LoRA | 冻结 ,只训练 的瓶颈,参数量降两个数量级 |
einsum.svg | 12.1 §1 einsum | 字母是轴名:共享的保留,输出没出现的被求和 |
random-matrix.svg | 12.2 §1 随机矩阵 | 方差 的随机矩阵,谱被压在 的典型尺度内 |
同样全部为正文内联。到这里,图不再只是「解释一个公式」,而是覆盖了几何 → 映射 → 求解 → 数值 → 大模型的一条链。
5. 第三轮新增(7 张)
第三轮把上一版列出的「仍值得补的几何/数值图」补完:基与维数、正交补、最小范数、对角化、Hessian、共轭梯度、QKV 形状。
| 图 | 概念 / 小节 | 读者应获得的判断 |
|---|---|---|
basis-dimension.svg | 2.4 §1 基与维数 | 两条无关方向就够;加入相关向量不增加维数,坐标反而不再唯一 |
orthogonal-complement.svg | 2.8 §1 正交补 | 与 只交于原点,任意向量唯一拆成「平面内 + 法向」 |
min-norm.svg | 4.5 §1.2 最小范数解 | 所有解在一条线上;离原点最近的切点就是 |
diagonalization.svg | 6.3 §1 对角化 | 换到特征基后,同一变换只剩每个坐标各自乘 |
hessian-approximation.svg | 8.4 §1.2 Hessian | 二阶模型沿两个特征方向的切片与真实函数在局部贴合 |
conjugate-gradient.svg | 10.4 §1.2 共轭梯度 | GD 在狭长山谷里之字形;CG 用共轭方向两步走完 |
qkv-shapes.svg | 11.3 §1 QKV | 的形状链 |
全部为正文内联;图注只补「怎么读」,定义仍留在正文。
6. 覆盖变化(三轮后)
| 模块 | 概念数 | 有图概念(三轮后) | 说明 |
|---|---|---|---|
| M00 准备 | 3 | 1(0.1) | 0.2 符号、0.3 张量更适合表格 |
| M01 向量与几何 | 7 | 6(1.2–1.7) | 1.1「向量是什么」暂不画,避免与 1.2 重复 |
| M02 向量空间 | 8 | 5(2.3/2.4/2.5/2.7/2.8) | 2.1 公理、2.2 子空间、2.6 秩仍以文字为主 |
| M03 矩阵与线性映射 | 7 | 3(3.2/3.3/3.4) | 3.7 四子空间适合 Mermaid |
| M04 线性方程组 | 6 | 5(4.1/4.2/4.4/4.5/4.6) | 4.3 零空间已有 Mermaid |
| M05 行列式 | 4 | 2(5.1/5.4) | 5.2/5.3 更适合公式推导 |
| M06 特征值 | 7 | 4(6.1/6.3/6.5/6.6) | 6.2/6.4/6.7 仍是定义与证明 |
| M07 SVD | 5 | 2(7.1/7.3) | 7.4/7.5 更适合表格与案例 |
| M08 微积分与优化 | 8 | 5(8.1/8.4/8.6/8.7/8.8) | 8.2/8.3/8.5 以公式或 Mermaid 为主 |
| M09 概率与统计 | 5 | 4(9.1–9.4) | 9.5 马尔可夫链适合 Mermaid + 稳态柱状图 |
| M10 数值线性代数 | 5 | 4(10.1/10.3/10.4/10.5) | 10.2 条件数可复用 4.6 的图,不重复画 |
| M11 大模型专题 | 12 | 8(11.3–11.9/11.11) | 11.10 MoE、11.12 反传适合 Mermaid/表格 |
| M12 进阶 | 4 | 2(12.1/12.2) | 12.3 全景图更适合 Mermaid 总图 |
合计:51/81 个概念有至少一张生成 SVG(约 63%),共 52 张(0.1 有两张图)。
另有 5 个概念(3.7 四子空间、4.3 零空间、9.5 马尔可夫链、11.1 Token/Embedding、12.3 全景图)已经用 Mermaid 画了结构关系。它们不计入 52 张 SVG,但算视觉覆盖。因此 56/81 个概念(约 69%) 已经有 SVG 或 Mermaid。
剩余 25 个概念大致分三类:
- 适合 Mermaid / 表格:11.10 MoE 路由、11.12 反向传播;3.7、9.5、12.3 已有 Mermaid,可继续打磨。
- 定义、证明与代数流程:2.1 八条公理、2.2 子空间、5.2 行列式性质、5.3 Cramer、6.2 特征多项式、6.7 Jordan——画图容易退化成「把公式再抄一遍」。
- 少量可补的几何图:2.6 秩的像空间视角、9.5 稳态分布柱状图;其余高性价比的几何/数值图已在三轮里收口。
所以下一阶段的目标不是继续堆 SVG,而是补结构图(Mermaid)与表格;第 3 类只在能一图说清一个判断时才画。
7. 后续收尾
- MoE 路由(11.10):用 Mermaid 画 top-k 路由与容量因子,而不是 Matplotlib。
- 反向传播(11.12):用 Mermaid 画计算图,突出链式法则的依赖方向。
- 稳态分布(9.5):在现有 Mermaid 状态图旁补一张稳态柱状图。
- 秩的像空间视角(2.6):复用矩阵映射图,标出「像空间维数 = 秩」。
暂不画:
- 八条公理(2.1)、矩阵四种身份(3.1):表格与一句话对照更精确,画图会变成装饰。
- 行列式性质 / Cramer(5.2/5.3)、特征多项式 / Jordan(6.2/6.7):代数推导本身就是主线,图只能重复符号。
- MoE 路由(11.10):路由概率与容量因子更适合表格 + 伪代码,画成饼图会掩盖 top-k 的离散性。
- 反向传播(11.12):计算图用 Mermaid 更清楚,Matplotlib 画方框没有优势。
- 浮点位布局(10.1):位宽用表格比色块更精确;本轮只画「间距随指数增长」这一条可验证的曲线。
8. 新增一张图的流程
在仓库根目录运行(避免写入用户级缓存):
MPLCONFIGDIR=.mplconfig UV_CACHE_DIR=.uv-cache \
uv run --with matplotlib --with numpy python figures/scripts/fig_rotation.py
然后在 figures/manifest.yaml 登记:
- id: rotation
file: rotation.svg
concepts: ["0.1"]
inline: true # 正文内联,不自动插到页首
caption: "……"
alt: "……"
最后在概念页对应小节插入:

*图:图注,说明「怎么读」而不是重复定义。*
提交前跑 cd web && pnpm sync && pnpm build,确认 SVG 被复制到 web/public/figures/ 且正文链接被改写为 /figures/...。
9. 验收清单
- 图里每个数字都能由正文公式复算;
- 图注说清「看什么」,而不是「这是什么」;
- 图紧挨着被解释的那句话,不跨小节;
- SVG 内无中文(避免字体缺失),中文只在 Markdown 图注;
-
manifest.yaml有caption与alt,内联图带inline: true; -
python3 scripts/check.py、check_links.py、check_refs.py通过; -
cd web && pnpm build && node scripts/check-render.mjs通过。