前几篇反复用微分法推具体层的梯度,这篇停一下做盘点:把向量/矩阵微分里最高频的公式收成一张表。目的不是让人背表——背下来的公式在转置上必翻车——而是每条配一行推导,让读者形成"三秒之内自己重新推出来"的反射。表之后补一条真正的兜底法则:形状自检,它能抓住九成推导错误。
使用约定
全表沿用本系列的布局:标量对向量/矩阵求导,梯度形状等于参数形状。$a,b,x$ 为列向量,$A,B,X$ 为矩阵,未声明的都是与微分变量无关的常量。$\odot$ 逐元素乘,$\mathbf{1}$ 全 1 向量。
向量公式:线性型与二次型
| $f(x)$ | $\nabla_x f$ | 一行推导 |
|---|---|---|
| $a^\top x$ | $a$ | $df=a^\top dx$ 直接读 |
| $x^\top x=\|x\|^2$ | $2x$ | $df=2x^\top dx$ |
| $a^\top x\cdot b^\top x$ | $a(b^\top x)+b(a^\top x)$ | 乘积法则,两个标量各自微分 |
| $x^\top Ax$ | $(A+A^\top)x$ | $df=x^\top(A+A^\top)dx$;对称时 $2Ax$ |
| $\|Ax-b\|^2$ | $2A^\top(Ax-b)$ | 令 $e=Ax-b$,$df=2e^\top A\,dx$ |
| $\|x-b\|^2$ | $2(x-b)$ | 上式 $A=I$ |
| $\log\sum_i e^{x_i}$ | $\mathrm{softmax}(x)$ | $df=\frac{\sum_i e^{x_i}dx_i}{\sum_j e^{x_j}}$ |
| $-\log p_y$,$p=\mathrm{softmax}(x)$ | $p-e_y$ | 前篇专推,分母消分母 |
| $\|x\|_2$ | $x/\|x\|$ | $df=x^\top dx/\|x\|$ |
| $x/\|x\|$ | $\frac{1}{\|x\|}(I-\hat x\hat x^\top)$ | 下文专节推导 |
| $x^\top Ay$ 对 $x$ | $Ay$ | 双线性型,梯度=另一侧 |
| $\sum_i\log x_i$ | $\mathbf{1}\oslash x$ | 逐元素,独立性 |
| $\prod_i x_i$ | $(\prod_i x_i)\oslash x$ | 对数化后求和再求导 |
前两条是所有正则项梯度的来源(L2 惩罚 $\frac{\lambda}{2}\|w\|^2$ 的梯度 $\lambda w$);第四条是注意力打分、马氏距离、瑞利商反复出现的形态,$A$ 不对称时必须保留 $A+A^\top$ 两项,忘一半是最常见的错。logsumexp 那行值得记:它的梯度是 softmax,这条共轭关系在温度采样、蒸馏、最大熵原理里反复出现。
$\prod_i x_i$ 那行的写法值得记:先取对数变 $\sum\log x_i$,求导后乘回原值——"乘积的梯度 = 乘积本身除以该因子",这是处理概率连乘(n-gram、重要性权重连乘)的标准动作,也是为什么在概率上做梯度几乎总是先取 log。
矩阵公式:trace 家族
| $f(X)$ | $\partial f/\partial X$ | 一行推导 |
|---|---|---|
| $\mathrm{tr}(AX)$ | $A^\top$ | 定义式直读 |
| $a^\top Xb$ | $ab^\top$ | 标量转 trace 后循环轮换 |
| $\mathrm{tr}(X^\top AX)$ | $(A+A^\top)X$ | 乘积法则 + 整体转置 |
| $\mathrm{tr}(AXB)$ | $A^\top B^\top$ | $\mathrm{tr}(A\,dX\,B)=\mathrm{tr}(BA\,dX)$ |
| $\|X\|_F^2$ | $2X$ | $\mathrm{tr}(X^\top X)$ 微分 |
| $\|AX-B\|_F^2$ | $2A^\top(AX-B)$ | $E=AX-B$,$df=2\,\mathrm{tr}(E^\top A\,dX)$ |
| $\|XA-B\|_F^2$ | $2(XA-B)A^\top$ | $df=2\,\mathrm{tr}(A^\top E^\top dX)$ 注意顺序 |
| $\log\det X$($X$ 正定) | $X^{-\top}$ | Jacobi 公式,专篇展开 |
| $\mathrm{tr}(X^{-1}A)$ | $-X^{-\top}A^\top X^{-\top}$ | $dX^{-1}=-X^{-1}dX\,X^{-1}$ 代入 |
中间两条最小二乘左右乘的对照很有意思:$\|AX-B\|^2$ 的梯度把 $A^\top$ 放左边,$\|XA-B\|^2$ 把 $A^\top$ 放右边。不用背,用下面的形状法则现场推。
逐元素与广播:激活函数家族
| $y=f(x)$ | $\bar x$(VJP) | 说明 |
|---|---|---|
| $y=\sigma(x)$(逐元素) | $\sigma'(x)\odot\bar y$ | 雅可比对角,VJP 退化为点乘 |
| $y=\mathrm{ReLU}(x)$ | $\mathbb{1}[x>0]\odot\bar y$ | 0/1 掩码 |
| $y=x\odot c$ | $c\odot\bar y$ | 缩放即掩码的推广 |
| $y=\mathrm{sigmoid}(x)$ | $y(1-y)\odot\bar y$ | 导数用输出表达,缓存友好 |
| $y=\tanh(x)$ | $(1-y^2)\odot\bar y$ | 同上 |
| $y=\log x$ | $\bar y\oslash x$ | 逐元素除 |
| $y=x+b$($b$ 广播) | $\bar b=\mathrm{sum}_{\text{广播维}}\bar y$ | 广播的反向是归约 |
| $y=\mathrm{reshape}(x)$ | $\mathrm{reshape}^{-1}(\bar y)$ | 置换阵从不实例化 |
广播归约那行在前面已经出现过三次(偏置、GQA、参数共享),它是"复制算子的转置是求和"这一个事实的不同化身。sigmoid/tanh 两行有个工程细节值得点出:导数用输出 $y$ 而不是输入 $x$ 表达,反向 kernel 只需缓存前向输出,省一份显存——逐元素激活的融合实现都利用了这个性质。
补充推导:L2 归一化与余弦相似度
对比学习(CLIP、InfoNCE)里每条样本都要过 $\hat x=x/\|x\|$,这个映射的雅可比值得单列一条。设 $r=\|x\|$,则
$$ d\hat x=\frac{dx}{r}-\frac{x}{r^2}dr=\frac{dx}{r}-\frac{x}{r^2}\cdot\frac{x^\top dx}{r}=\frac{1}{r}\Big(I-\hat x\hat x^\top\Big)dx, $$
(用了 $dr=d\sqrt{x^\top x}=\frac{x^\top dx}{r}$。)所以
$$ \frac{\partial\hat x}{\partial x}=\frac{1}{r}\big(I-\hat x\hat x^\top\big),\qquad \bar x=\frac{1}{r}\big(\bar{\hat x}-\langle\bar{\hat x},\hat x\rangle\hat x\big). $$
结构与 LayerNorm 反向神似——$I-\hat x\hat x^\top$ 是投影到 $\hat x$ 正交补的算子,缩放不变性($\hat x$ 对 $x\leftarrow cx$ 不变)迫使梯度与 $\hat x$ 方向正交。这再次验证了那条通用原则:函数对哪个方向不敏感,梯度就在哪个方向清零。余弦相似度 $\cos(u,v)=\hat u^\top\hat v$ 的梯度套两次上式即得:
$$ \nabla_u\cos(u,v)=\frac{1}{\|u\|}\big(\hat v-\cos(u,v)\,\hat u\big), $$
几何读法:只保留 $\hat v$ 垂直于 $\hat u$ 的分量——沿 $\hat u$ 自身方向拉动不改变夹角,自然不会出现在梯度里。对比学习温度系数 $\tau$ 若乘在 logits 上,梯度再整体乘 $\tau$ 即可。
兜底法则:形状自检与维度对齐
查表不如会查错。两条自检覆盖绝大多数推导失误。
法则一:梯度形状等于参数形状。 推出 $\partial f/\partial X$ 之后第一件事是对形状,不一致必有转置错位。这条抓转置错误百发百中——转置错位的梯度在标量测试里碰巧形状对、数值错,但在形状层面已经有一半概率露馅。
法则二:矩阵乘梯度的"对调转置"口诀。 若 $Y=AXB$($A,B$ 常量),$d\ell=\mathrm{tr}(\bar Y^\top dY)=\mathrm{tr}(\bar Y^\top A\,dX\,B)$,循环轮换把 $B$ 挪到前面:$\mathrm{tr}(B\bar Y^\top A\,dX)$,读出
$$ \frac{\partial\ell}{\partial X}=A^\top\bar Y B^\top . $$
记忆法:梯度里的常量因子各自转置、并交换到对侧——$X$ 左边的 $A$ 转置后留在左边,右边的 $B$ 转置后绕到右边,中间的 $\bar Y$ 顶替 $dX$ 的位置。形状验证:$A^\top\bar Y B^\top$ 是 $(m\times r)(r\times s)(s\times n)=m\times n$,与 $X$ 一致。注意力反向里 $\bar Q=\bar SK$、$\bar K=\bar S^\top Q$ 都是这条口诀的实例($B=I$ 或转置归位后)。这条口诀的正式出处要等 Kronecker/vec 那篇——$\mathrm{vec}(AXB)=(B^\top\otimes A)\mathrm{vec}(X)$ 转置后反 vec 回来就是它,口诀是恒等式的投影。
一个容易翻车的复合例子
单条公式都好推,复合起来才见功力。拿 $f=\|\mathrm{ReLU}(XW)-Y\|_F^2$ 对 $W$ 的梯度收尾,把表里的三条串起来:令 $H=\mathrm{ReLU}(XW)$、$E=H-Y$,则
$$ df=2\,\mathrm{tr}(E^\top dH)=2\,\mathrm{tr}\big(E^\top\big(M\odot(X\,dW)\big)\big),\qquad M=\mathbb{1}[XW>0]. $$
逐元素掩码与 trace 内积相容:$\mathrm{tr}(E^\top(M\odot Z))=\mathrm{tr}\big((M\odot E)^\top Z\big)$(掩码对称地作用在两侧),于是
$$ df=2\,\mathrm{tr}\big((M\odot E)^\top X\,dW\big)\ \Longrightarrow\ \frac{\partial f}{\partial W}=2X^\top\big(M\odot(XW-Y)\big). $$
三步分别用了最小二乘行、ReLU 掩码行、矩阵乘口诀。这就是这张表的正确用法:不背结论,把复合表达式拆成表内原子的链,每步检查形状。推导速度随着熟练度线性提升,而正确率由形状自检兜底。
推完之后的固定动作是数值验收:中心差分 $\hat g_i=\frac{f(\theta+he_i)-f(\theta-he_i)}{2h}$($h\approx10^{-5}$、float64),相对误差低于 $10^{-7}$ 才算过。第一章第一篇详细写过这套流程,这里只强调它与速查表的分工——表负责"快速推出候选答案",数值检验负责"否决错误答案"。两者缺一不可:只查表不验证,转置错位会混进训练代码;只验证不推导,每次改结构都要从头写有限差分脚本。
小结
这张表覆盖了深度学习手写梯度 95% 的场景:线性型读出常量、二次型记住 $A+A^\top$、最小二乘记住残差左乘(或右乘)转置、逐元素激活退化为掩码、广播反向即求和。比表更重要的是两条兜底法则——梯度形状等于参数形状、矩阵乘梯度"常量转置换对侧"。后续篇章遇到的新层(RMSNorm、SwiGLU、RoPE)的梯度推导,全部是这张表的原子组合。
日常使用的建议顺序:
- 先拆:复合表达式拆成表内原子的链,逐段写微分;
- 再查:每段套表内公式或口诀,不写中间下标;
- 后验:形状自检加 float64 数值梯度,双保险通过才进训练代码。
下一篇进入矩阵微分的深水区:Kronecker 积与 vec 操作,它们是处理"矩阵方程整体求导"的重武器,也是 K-FAC 这类二阶优化器的理论根基。