课程/图示规划:让「变换」看得见
附录源文件:docs/图示规划.md

图示规划:让「变换」看得见

这份文档回答两个问题:哪些概念值得画图,以及画成什么形式才不比文字更差。 最近更新:2026-10-28。配套脚本在 figures/scripts/,产物在 figures/out/。

0. 为什么要做这件事

课程正文已经覆盖 81 个概念,但多数页面仍是「公式 + 场景 + 推导」。对下面三类内容,文字描述的理解成本明显高于一张图:

  1. 空间动作:旋转、投影、压扁、拉伸、鞍面——读者需要在脑中做几何变换;
  2. 连续过程:幂迭代、梯度下降、Gram–Schmidt——读者需要想象「一步步走过去」;
  3. 离散结构:mask、量化刻度、稀疏/分块——读者需要对照「哪些位置被保留」。

一张好图不是装饰。它应该让读者在 10 秒内获得一个判断,例如「奇异矩阵把平面压成一条线,所以逆不存在」「条件数越大,梯度下降越像之字形」。如果图只是把正文再复述一遍,就不值得画。

1. 选图原则

内容首选形式反例
方向、形状、轨迹、场Matplotlib SVG用 ASCII 字符画箭头
流程、依赖、模块关系Mermaid用 SVG 画一堆方框和箭头
精确数字、矩阵行、参数对照Markdown 表格把矩阵画成位图
单个公式的代数变形正文公式 + 一句话读法为「移项」画一张图

四条硬约束:

  • 一图一判断:标题与图注只服务一个结论;不要把「旋转 + 特征值 + SVD」塞进一张图。
  • 示例可复算:图中每个数字都要能从正文公式推出来;合成数据要标「示例」。
  • 不重复正文:图出现的位置紧挨着它解释的那句话,图注补「怎么读」,不重复定义。
  • 中英文分工:SVG 内用英文标题与数学符号(避免字体缺失),中文解释放在 Markdown 图注里。

2. 起点:第一轮前的 16 张

「页首」由 figures/manifest.yaml 自动插到概念页正文前;「内联」由 Markdown 直接引用,位置更贴近正文。

图概念位置作用
transformer-pipeline.svg0.1内联一个 token 穿过 L 层 Transformer 的路径
vector-add.svg1.2内联首尾相接的加法与平行四边形
projection.svg1.6页首投影向量与垂直残差
cross-product.svg1.7内联叉积垂直于一平面,长度等于面积
least-squares.svg4.4内联向列空间作垂线得到最小二乘解
condition-number.svg4.6内联病态矩阵把单位圆压成扁椭圆
determinant.svg5.1页首单位正方形变成平行四边形,面积等于行列式
eigenvectors.svg6.1页首特征方向在变换后不转向
svd.svg7.1页首单位圆变成椭圆,半轴是奇异值
covariance-sign.svg9.1内联正/负协方差对应的点云方向
gaussian-contours.svg9.2内联二元高斯的同心椭圆
pca.svg9.3页首主成分方向与最小残差投影
whitening.svg9.4内联原斜椭圆 → PCA/ZCA 白化
rope.svg11.5页首位置编码体现为旋转角之差
kv-cache.svg11.7页首KV Cache 随序列长度线性增长
softmax-temperature.svg11.11页首温度改变 softmax 的尖锐度

当时覆盖 16/81 个概念(约 20%)。当时的缺口集中在 M02、M03、M06、M08、M10、M11 的「过程类」概念。

3. 第一轮新增(11 张)

优先补「正文已经写了几何解释、但没有图」且画出来能直接减少脑内模拟的位置。

图概念 / 小节读者应获得的判断
rotation.svg0.1 §5.1 2D 旋转 把每个向量逆时针转 90°;连乘两次 等于
norm-balls.svg1.4 §1 范数「长度 1」在 L1/L2/L∞ 下分别是菱形、圆、正方形
cosine-angle.svg1.5 §1 余弦余弦就是单位向量在另一方向上的坐标,也就是
span-independence.svg2.3 §1 线性无关相关组的组合挤在一条线上;无关组的组合铺满平面
inverse-singular.svg3.4 §1.1 可逆性可逆矩阵保住面积、能撤回;奇异矩阵把平面压成线
quadratic-form.svg6.5 §1 二次型正定是碗,不定是鞍;特征值符号决定每个方向朝上还是朝下
power-iteration.svg6.6 §1 幂迭代反复乘 并归一化,方向被主特征向量吸过去
convexity.svg8.6 §1.2 凸性凸函数的弦在图像上方;非凸函数会出现弦下方的「坑」
gradient-descent.svg8.7 §1.1 梯度下降扁碗上 GD 走之字形,牛顿法一步到中心
attention-mask.svg11.4 §2.2 因果 mask上三角被置 后,第 行只在前 列分配预算
quantization-levels.svg11.9 §1 量化量化是把连续值吸到最近刻度,最大误差是

放置方式:全部为正文内联。这些图只在对应小节有意义,放到页首会与上下文脱节。manifest.yaml 中用 inline: true 登记,概念页只自动挑选 inline 为假的第一张图。

4. 第二轮新增(18 张)

第一轮补的是「单点几何」,第二轮补「过程、映射与工程结构」:矩阵如何逐列组合、两个变换如何复合、特解如何沿零空间移动、浮点间距如何随指数翻倍、LoRA 的瓶颈如何省参数。

图概念 / 小节读者应获得的判断
dot-product.svg1.3 §1.1 点积点积 = × 在 上的带符号影子
change-of-basis.svg2.5 §1 换基同一个向量,换一套网格线,坐标就变了
gram-schmidt.svg2.7 §2.3 Gram–Schmidt减掉投影,剩下的分量才与已选方向正交
matrix-vector-columns.svg3.2 §1.1 矩阵乘向量 是按输入系数把列向量加权相加
matrix-composition.svg3.3 §1.1 矩阵乘法先 后 与直接乘 是同一个映射
system-geometry.svg4.1 §1.2 方程组的几何交点、平行、重合分别对应唯一解、无解、无穷多解
solution-structure.svg4.2 §1.2 通解结构特解加零空间方向,整条线都是解
jacobian-polar.svg5.4 §1.2 极坐标面积元要乘 ,因为越往外同样的角宽度弧越长
low-rank.svg7.3 §1 低秩近似前几层奇异向量抓住主体,后面才是细节与噪声
gradient-field.svg8.1 §1.1 梯度梯度垂直等高线,并指向函数增大方向
lagrange.svg8.8 §1.1 拉格朗日最优点处目标等值线与约束曲线相切,两个梯度平行
float-spacing.svg10.1 §1 浮点数fp32 的绝对间距每个数量级翻倍,相对精度基本不变
roofline.svg10.3 §1.2 Roofline低强度受带宽限制,高强度受算力限制,拐点是两者之比
sparse-pattern.svg10.5 §1.2 稀疏结构非零数相同,块/带结构比随机结构更硬件友好
layernorm-rmsnorm.svg11.6 §1 归一化LayerNorm 投影到零均值面,RMSNorm 只重定半径
lora.svg11.8 §1 LoRA冻结 ,只训练 的瓶颈,参数量降两个数量级
einsum.svg12.1 §1 einsum字母是轴名:共享的保留,输出没出现的被求和
random-matrix.svg12.2 §1 随机矩阵方差 的随机矩阵,谱被压在 的典型尺度内

同样全部为正文内联。到这里,图不再只是「解释一个公式」,而是覆盖了几何 → 映射 → 求解 → 数值 → 大模型的一条链。

5. 第三轮新增(7 张)

第三轮把上一版列出的「仍值得补的几何/数值图」补完:基与维数、正交补、最小范数、对角化、Hessian、共轭梯度、QKV 形状。

图概念 / 小节读者应获得的判断
basis-dimension.svg2.4 §1 基与维数两条无关方向就够;加入相关向量不增加维数,坐标反而不再唯一
orthogonal-complement.svg2.8 §1 正交补 与 只交于原点,任意向量唯一拆成「平面内 + 法向」
min-norm.svg4.5 §1.2 最小范数解所有解在一条线上;离原点最近的切点就是
diagonalization.svg6.3 §1 对角化换到特征基后,同一变换只剩每个坐标各自乘
hessian-approximation.svg8.4 §1.2 Hessian二阶模型沿两个特征方向的切片与真实函数在局部贴合
conjugate-gradient.svg10.4 §1.2 共轭梯度GD 在狭长山谷里之字形;CG 用共轭方向两步走完
qkv-shapes.svg11.3 §1 QKV 的形状链

全部为正文内联;图注只补「怎么读」,定义仍留在正文。

6. 覆盖变化(三轮后)

模块概念数有图概念(三轮后)说明
M00 准备31(0.1)0.2 符号、0.3 张量更适合表格
M01 向量与几何76(1.2–1.7)1.1「向量是什么」暂不画,避免与 1.2 重复
M02 向量空间85(2.3/2.4/2.5/2.7/2.8)2.1 公理、2.2 子空间、2.6 秩仍以文字为主
M03 矩阵与线性映射73(3.2/3.3/3.4)3.7 四子空间适合 Mermaid
M04 线性方程组65(4.1/4.2/4.4/4.5/4.6)4.3 零空间已有 Mermaid
M05 行列式42(5.1/5.4)5.2/5.3 更适合公式推导
M06 特征值74(6.1/6.3/6.5/6.6)6.2/6.4/6.7 仍是定义与证明
M07 SVD52(7.1/7.3)7.4/7.5 更适合表格与案例
M08 微积分与优化85(8.1/8.4/8.6/8.7/8.8)8.2/8.3/8.5 以公式或 Mermaid 为主
M09 概率与统计54(9.1–9.4)9.5 马尔可夫链适合 Mermaid + 稳态柱状图
M10 数值线性代数54(10.1/10.3/10.4/10.5)10.2 条件数可复用 4.6 的图,不重复画
M11 大模型专题128(11.3–11.9/11.11)11.10 MoE、11.12 反传适合 Mermaid/表格
M12 进阶42(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 个概念大致分三类:

  1. 适合 Mermaid / 表格:11.10 MoE 路由、11.12 反向传播;3.7、9.5、12.3 已有 Mermaid,可继续打磨。
  2. 定义、证明与代数流程:2.1 八条公理、2.2 子空间、5.2 行列式性质、5.3 Cramer、6.2 特征多项式、6.7 Jordan——画图容易退化成「把公式再抄一遍」。
  3. 少量可补的几何图:2.6 秩的像空间视角、9.5 稳态分布柱状图;其余高性价比的几何/数值图已在三轮里收口。

所以下一阶段的目标不是继续堆 SVG,而是补结构图(Mermaid)与表格;第 3 类只在能一图说清一个判断时才画。

7. 后续收尾

  1. MoE 路由(11.10):用 Mermaid 画 top-k 路由与容量因子,而不是 Matplotlib。
  2. 反向传播(11.12):用 Mermaid 画计算图,突出链式法则的依赖方向。
  3. 稳态分布(9.5):在现有 Mermaid 状态图旁补一张稳态柱状图。
  4. 秩的像空间视角(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: "……"

最后在概念页对应小节插入:

![替代文本](/figures/rotation.svg)

*图:图注,说明「怎么读」而不是重复定义。*

提交前跑 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 通过。
输入关键词开始搜索