8.5 矩阵求导与链式法则
本节位置:模块 8 · 微积分与优化 | 前置:8.3 Jacobian、8.4 Hessian | 预计:45 分钟
一句话:把标量链式法则推广到向量和矩阵,关键是先约定「导数的形状」,再让每一步的形状接得上。
0. 场景引入
下午 4 点收盘,某资管的风控台要在 18:00 前交出 200 个组合的风险归因表。每个组合持有 3000 只股票,用 60 个因子的多因子模型刻画:
是因子载荷, 是因子协方差, 是对角特质方差, 是持仓市值(单位:元)。
归因表要回答的是:每一只股票多配 1 元,组合方差变多少? 也就是 。风控经理据此决定减哪 5 只。
其中一个组合市值 亿元、年化波动 11.2%,目标是把波动压到 10% 以下。如果梯度算错、减仓方向反了,波动不降反升——跟踪误差超标,客户赎回;按 0.8%/年的管理费算,这一单一年少收约 690 万元。
难点不在「会不会求导」,而在: 是什么形状?已知上游敏感度,怎么穿过 、、 这三层矩阵乘,一步算出对 的梯度?为什么框架里的 w.grad 和 w 永远同形?
这和手写一个线性层 的反向传播是同一套公式:把 换成 、把方差换成损失,形状与转置的规则一字不改。§5.2 会手推那个网络版本。
读完本节,你应该能回答三件事:
- 分母布局与分子布局差在哪,混用会让哪一步转置?
- 是怎么一项一项数出来的?
- 链式法则 里的转置,是「约定」还是「必须」?
1. 直觉
1.1 导数是一张「敏感度表」,链式法则(chain rule)把它乘回去
标量对向量求导,得到一张与输入同形的表:第 个输入动一点,输出动多少。向量对向量求导,得到二维表:第 个输入动一点,第 个输出动多少。
前向 ,反向先知道 对 的敏感度,再乘上 对 的敏感度,就得到 对 的敏感度。
💡 一句话直觉:反向传播(Rumelhart 等, 1986)就是「上游梯度 × 本地 Jacobian」,一路乘回输入端。
类比边界:这不是数值近似,而是精确的链式法则;但它依赖前向时保存的中间值(激活),所以显存换计算。
1.3 它在现实世界里对应什么
矩阵求导在风控台这里的身份,是一张逐格填写的敏感度表:
| 数学对象 | 风险归因里的对应物 | 单位 |
|---|---|---|
| 3000 只股票的持仓市值 | 元 | |
| 组合方差 | 元² | |
| 每只股票多配 1 元,方差变多少 | 元²/元 = 元 | |
| (神经网络) | 每个权重拧一点,损失变多少 | 损失单位 / 权重单位 |
注意这个单位:方差是「元²」、持仓是「元」,所以梯度的单位是「元」——它本身就带钱的味道。如果把 换成无量纲的权重(和为 1),梯度的单位退化成「元²」,数值放大 倍。同一份风险,两套变量,两张数量级完全不同的表。 这就是 8.1 节「梯度是敏感度」的直接后果。
量级直觉:一个 8.6 亿元的组合,单只股票的风险敏感度 通常在 元量级(每多配 1 元,方差增加几分钱到一毛钱);乘上持仓 才是「这只股票贡献了多少方差」,量级才回到元²。
边界:矩阵求导只对可微的表达式成立。风险模型里的期权收益 、分段费率、涨跌停约束都不可微,梯度要么不存在,要么依赖次梯度约定。还有一个更常见的边界:协方差矩阵必须正定,否则 可能为负——那时梯度仍然算得出来,但在经济上没有意义。
这个类比在哪里失效:因子模型假设收益线性依赖于因子, 是二次型;真实收益有厚尾、有跳跃,方差本身是一个估计量。梯度告诉你「在当前模型里」怎么调仓,不告诉你「调完真的会降波动」。
2. 定义:布局约定
矩阵求导(matrix calculus)有两套常见布局:
| 布局 | 标量对向量 | 向量对向量 |
|---|---|---|
| 分子布局(numerator layout) | 行向量 | 输出在行、输入在列 |
| 分母布局(denominator layout) | 列向量(与变量同形) | 输出在列、输入在行 |
两种只差转置,但混用会让公式整体错位。
2.1 本文的约定
本文以分母布局为默认:标量求导,梯度与变量同形;向量求导,Jacobian 取工程界通用的 排法(它是严格分母布局的转置)。
一句话记:标量求导看形状(与变量同形),向量求导看下标(行 = 输出,列 = 输入)。
| 情形 | 记号 | 形状 |
|---|---|---|
| 标量 对向量 | ,与 同形 | |
| 标量 对矩阵 | ,与 同形 | |
| 向量 对向量 | , |
这套约定与 PyTorch/JAX 的行为一致:y.backward() 后 x.grad 与 x 同形;torch.autograd.functional.jacobian(y, x) 返回 。它对向量值函数用的是分子布局,所以 的 Jacobian 正好是 ;严格的分母布局会把它写成 。两种写法只差转置,读别的资料时先看它写的是 还是 ,不要混用中间步骤。
3. 为什么这样定义
如果只追求「数学上唯一」,转置无关紧要。但工程上必须固定一种,否则梯度无法直接和参数相加,链式法则里不知道哪一步要转置,einsum 的下标也会对不上。
「梯度与变量同形」这条规则最大的好处是:优化器更新 可以逐元素写,不需要任何 reshape。而「Jacobian 输出在行」让 的导数就是 ,链式法则写成干净的矩阵乘法 。
3.1 反事实:布局混用、转置写反,会坏在哪
反事实 A:把 写成 。
取
给一个扰动 。正确预测是 ,输出变成 。如果按 算,预测是 ,输出变成 ——增量的第二个分量差了 50%(0.3 对 0.2)。
这个错误在手推时几乎看不出来: 和 形状一样(都是 ),grad 的形状检查也过。只有在非对称矩阵、且真的乘一个扰动时才会暴露。权重矩阵大多是非对称的长方阵,转置错误会在形状检查时被抓到;但一旦某层恰好是方阵,它就可能悄悄跑完整个训练。
反事实 B:把 的导数当成 。
取不对称的 、。正确结果是 (§5.1 手算);。两者差 ,相对误差 33%。在二次型优化里,这相当于用了一个错误的 Hessian,收敛方向会偏。
反事实 C:链式法则里凭感觉加转置。
里的转置不是风格问题: 是 , 是 ,只有 能把 变回 。反过来写 ,在 时形状也对,但结果完全是另一个向量。先对形状,再对数值。
4. 性质与推导
4.1 五个必背公式
| 函数 | 导数 | 形状 |
|---|---|---|
| 与 同形 |
4.2 为什么
设 ,则 ,所以 ,即 。这就是「线性映射是自身的导数」(8.3 节)。注意这里没有转置:输入 在列,输出 在行,正好是 的排法。
4.3 为什么
展开 。对 求偏导,只有含 的项存活;固定 得 ,固定 得 :
合起来就是 。若 对称,退化为 。
4.4 链式法则(反向传播的核心)
设 是标量,,则 。形状:。若 ,则 。
对线性层 ,已知上游 :
第一个是外积,形状 ,与 同形。逐分量验证:。
因为 ,只有 时对 的偏导非零,等于 。
5. 例子
5.1 手算:二次型的梯度
取 ,。先按公式:
再直接展开验证:,在 处 ,,两者一致。
5.2 手算:两层 ReLU 网络的反向传播
取 ,,,。
前向:,,。
设目标 ,。
反向,逐层算:;;穿过 ReLU 得 ;于是 ,。
抽查:把 的第 1 行第 2 列加 , 变为 , 变为 , 增加约 ,与梯度 一致。第 2 行梯度为 0,因为该神经元当前是关闭的。
5.3 场景闭环:3000 只股票、200 个组合、2 小时
输入:(1.44 MB fp64)、(28.8 KB)、、200 组 。绝不构造 的 ——那是 72 MB,200 个组合就是 14.4 GB。
计算:按形状一节一节乘:
梯度用同一批中间量:
FLOP 估算: 是 次乘加, 同量级,其余可忽略,单个组合约 FLOP。200 个组合共 FLOP,单核 10 GFLOP/s 下 8 ms。若显式构造 ,每个组合要 次乘加、72 MB 内存,200 个组合是 FLOP 加 14.4 GB——慢 45 倍。
输出:每只股票的风险贡献 (Euler 分解,各项相加正好等于 ),排序取前 5 只减仓。
成本:8 ms 计算、1.5 MB 常驻内存、200 个组合 1.6 s;真正的瓶颈是每天更新 与 的回归,不在求导。
失败条件与兜底:
- 非正定:因子高度共线(比如同时放「大盘」和「大盘价值」),Cholesky 失败,方差可能算出负数。兜底:加收缩 ,或做特征值截断。
- 做空: 时风险贡献可以是负的,Euler 分解的「贡献」不再单调,减仓建议会反直觉。兜底:多空分开归因,或只看 。
- 布局/转置错误:形状检查通不过最好;若恰好是方阵( 的 ),可能一路跑通但方向反了。兜底:每天用中心差分抽查 5 只股票的梯度,相对误差应 。
6. 常见误区
-
误区:。 纠正:取决于布局。本文约定下是 ;若你按「输出放列」的分母布局,则是 。先看约定,再写公式,这是手推反向传播最常见的错误来源。
-
误区: 总成立。 纠正:只在 对称时成立。一般情况是 ; 不对称时 会漏掉 的部分。
-
误区:矩阵求导就是把每个元素分别求导,顺序无所谓。 纠正:形状必须能接上。 是外积;写成 就变成标量,形状直接错。
-
误区:链式法则里转置可以随便加。 纠正:转置由形状决定。 中,只有这样才能把 变回 。
7. 概念网络
- 前置:8.3 Jacobian —— 向量对向量的导数。
- 前置:8.4 Hessian —— 标量对向量的二阶导。
- 后续:8.6 凸性 —— 用 判断凸。
- 后续:8.7 梯度下降与牛顿法 —— 用这些公式推更新规则。
- 关联:3.3 矩阵乘法 —— 外积与矩阵乘法的形状。
8. 通往大模型:autograd 就是这套公式的流水线
出现位置:每个 nn.Linear 的反向。前向 ,反向只需三个式子:、、。
批量形状:,,,上游 。则 ,。两个都是 GEMM。这就是为什么反向传播和 forward 一样快:没有逐元素循环,全是矩阵乘法。
为什么需要:手写时最容易错的是转置。一个 的权重,梯度也必须是 ;如果得到 ,要么是布局混了,要么是外积写反了。
可检验结论:对上面的批量公式,用数值梯度检查(扰动单个 ,看 变化)应在 量级吻合。lab08 会亲手做这件事;这也是实现自定义算子时的标准验收步骤。
如果这一步算错,训练时看到什么:外积写反(把 写成 ),在方阵层上形状不变,loss 仍会降,但收敛明显变慢、最终指标差一截;批量维度弄错(把 的 当成 ),框架会直接报形状错误——报错反而是幸运的,不报错才要担心。
9. 练习
- 概念:本文的布局约定下,、, 是什么形状?元素 是什么?
- 计算:,,用公式求 ,并展开验证。
- 计算:,。证明 。
- 计算:,,求 与 。
- 开放:既然 Jacobian 这么大,为什么框架还能在反向传播里「隐式」用它?这对自定义算子有什么要求?
参考答案
- 形状 ,与 相同。元素 是 。
- ,乘 得 。展开:,,。
- ,;由链式法则 (因为 的作用就是外积)。
- ( 对称)。 的梯度是 ;,转置得 。
- 反向模式只算 VJP:给定上游向量,乘本地 Jacobian 的转置,从不构造完整矩阵。代价是前向必须保存中间激活;自定义算子需要同时定义前向与反向(或由 AD 追踪基本算子),否则梯度链会断。
10. 一页速记
- 约定:梯度与变量同形;Jacobian 是 ,行输出、列输入。
- ;。
- 线性层反向:,。
- 链式:。
- 形状接不上时,先怀疑转置,而不是怀疑数学。
- 物理意义 / 现实对应: 是「每个旋钮的敏感度」,单位是「损失 / 参数单位」; 的单位是「元」,因为方差是元²、持仓是元。链式法则就是敏感度的乘法传递。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- Rumelhart, Hinton & Williams(1986):Learning Representations by Back-Propagating Errors。反向传播的经典论文;本页 §4.4 的链式法则就是它的矩阵形式。Nature
- Magnus & Neudecker(2019):Matrix Differential Calculus with Applications in Statistics and Econometrics(4th ed.)。矩阵求导、布局约定与链式法则的系统参考。Wiley
- Petersen & Pedersen(2012):The Matrix Cookbook。常用矩阵恒等式与求导公式的速查手册,适合手推反向传播时对照。PDF
下一篇 → 8.6 凸性与优化
随堂测 · 5 题
源文件:08-微积分与优化/05-矩阵求导与链式法则.md