课程/M08/Jacobian:多元映射的导数
M08 · 微积分与优化核心约 40 分钟

8.3 Jacobian:多元映射的导数

本节位置:模块 8 · 微积分与优化 | 前置:3.3 矩阵乘法、8.1 梯度 | 预计:40 分钟

一句话:向量值函数的导数不再是一个数,而是一个矩阵——它把「输入动一点」线性地翻译成「输出动一点」。

0. 场景引入

凌晨 2 点,一次 6 小时的同化窗口要闭合。数值天气预报的模式状态是 3600 万维: 个水平格点、40 层、5 个变量(温度、风的两个分量、湿度、气压)。而这个窗口里进来 2000 万个观测:卫星辐射率、探空、飞机报、地面站。

观测算子 把 3600 万维的状态映射到 2000 万维的观测空间。业务要的是:每个观测对初始场的敏感度是多少?把分析增量放在哪几个格点上,才能让 24 小时后的预报误差最小?

的 Jacobian 是 , 个数,fp32 要 2.9 PB。最快的超算也存不下,更别说在 30 分钟内跑完一次 4D-Var 的 50 次外循环。

所以现实中的做法是:永远不写这个矩阵,只写它的两个动作——(切线性,把状态扰动变成观测扰动)和 (伴随,把观测残差变回状态空间)。代价:如果伴随代码和切线性代码不一致(手写两套,很容易差一个转置),同化会悄悄给出一个偏差方向,24 小时预报的位置误差可能多出几十公里——按一次中等台风估算,就是多疏散两万人。

把现场抽象出来:一个向量值函数的导数,是一个把 维扰动翻译成 维响应的线性映射;选定基之后它就是矩阵。这就是 Jacobian(雅可比矩阵)。

读完本节,你应该能回答三件事:

  1. Jacobian 的形状为什么是 ,行和列各自代表什么?
  2. 链式法则 的顺序由什么决定,写反了会怎样?
  3. 为什么反向传播只算向量–Jacobian 乘积,却能得到和显式矩阵一样的结果?

1. 直觉

1.1 局部线性化(local linearization)

一元函数在一点附近可以用切线近似;多元标量函数用切平面;向量值函数则用线性映射近似。

输入空间里一个很小的球,经过 后变成一个很小的椭球(或压扁的平行四边形)。Jacobian 就是描述这个「球变椭球」的线性变换矩阵。

1.2 每一行是一个梯度

的第 个输出 是一个标量函数。它的梯度 是行向量(或列向量,取决于约定)。把 个输出的梯度摞起来,就是 的 Jacobian。

💡 一句话直觉:Jacobian = 把每个输出分量的梯度按行叠起来;它是一阶导数的「矩阵版」。

类比边界:局部线性化只在一点附近有效;离得远时高阶项不可忽略,就像切线不能代替整条曲线。

1.3 它在现实世界里对应什么

同化系统里,Jacobian 不是教科书上的方块,而是一张**「观测对格点的敏感度表」**:

数学对象同化系统里的对应物单位
输入 3600 万维模式状态K、m/s、kg/kg、Pa
输出 2000 万维模拟观测(辐射率、风、温度)K(亮温)、m/s 等
第 个观测通道对第 个格点变量的敏感度观测单位 / 状态单位
给状态加一个扰动 ,观测变多少(切线性)观测单位
给观测一个残差 ,反推状态该怎么改(伴随)状态单位

量级直觉(经验值,随通道与廓线变化):一个近地面温度通道对温度的敏感度约 K/K,也就是「状态温度加 1 K,亮温涨 0.5 K」;同一个通道对水汽的敏感度可能在 K/(g/kg) 量级。同一行里,不同列的单位和量级差好几个数量级——这就是同化系统必须先对变量做缩放(背景误差协方差的平方根)的原因,否则 Jacobian 的条件数会大到无法迭代。

边界: 含辐射传输,强非线性(云、地表发射率、散射)。 只是在一条参考廓线附近的线性化;云区的辐射传输甚至不可微(散射相函数切换),这些观测必须做质量控制剔除,否则伴随会放大噪声。Jacobian 描述的是局部,而大气是一个每小时都在换参考点的系统。

这个类比在哪里失效:矩阵的「行」在数学上没有顺序,但同化里观测是有顺序的(通道 1、通道 2……), 的行号就是观测索引。如果并行时观测列表被打乱却没有同步重排,矩阵看着还对,物理上已经错位。

2. 定义

设 ,写成

若所有偏导存在,定义 Jacobian 为

即 。行对应输出,列对应输入,形状是 。

可微的定义相应地写成 。逐项读法:输出的变化约等于矩阵乘上输入的变化。

3. 为什么这样定义

标量函数的导数是一个数,因为「输入方向」只有两个(正、负),变化率用一个数就够。向量值函数不同:

  • 输入有 个独立方向;
  • 输出有 个分量,每个分量对每个输入方向都有各自的敏感度。

所以导数必须是一个从输入空间到输出空间的线性映射。选定标准基后,线性映射就是 矩阵。这不是选择,而是「线性映射 = 矩阵」的必然结果(3.3 节)。

如果只算每个输出的梯度而不用矩阵组织,链式法则会变成一堆下标;写成矩阵后,复合函数的导数就是矩阵乘法。这正是反向传播能用 GEMM 高效实现的原因。

3.1 反事实:把 Jacobian 转置(或把链式顺序写反)会坏在哪

取一个能手算的观测算子,两个输入 (气压、温度),两个输出:

在 处:

现在做一次线性化预报:状态扰动 (只加气压)。正确的观测变化是

如果代码里错用了转置:

增量的第二个分量差了 3 倍。注意两者的行列式都是 ——在方阵上,转置连行列式都看不出来,只有真正乘一个扰动量才会暴露。这就是伴随代码必须做点积测试的原因: 要对随机向量成立到机器精度。

再看链式顺序。设 、,则 是 、 是 。正确顺序 是 ;写成 是 ——形状看着也「合理」,但它既不是输入的维数,也不是输出的维数,是一个物理上不存在的映射。在 4D-Var 里,这等价于把「观测空间」当成了「状态空间」:迭代照样会收敛到某个数,只是那个数没有意义。

4. 性质与推导

4.1 线性映射的 Jacobian 就是它自己

若 ,则 ,于是 ,即 。对仿射映射 ,同样有 (常数的导数为零)。线性函数是自身的导数,这是后面「 的 Jacobian 是 」的来源。

4.2 链式法则

若 、,则 的 Jacobian 是 。

形状检查:,正好是复合映射的形状。中间维数 被消掉,这就是「前向传播的形状链」,也是反向传播里梯度能逐层回传的原因。

4.3 坐标变换与行列式

极坐标 :

是面积缩放因子(5.1 节)。 时行列式为 0,映射退化——极点在极坐标下确实「压扁」了。这也是变量替换公式里要乘 的原因。

4.4 复合的顺序不能反

与 通常形状都不同;即使都是方阵,矩阵乘法也不可交换。链式法则的顺序由「先作用谁」决定,写反了就是另一个函数。

5. 例子

5.1 手算:二维映射的 Jacobian

偏导:

在 处:

。用 Jacobian 预测 :

所以 。精确值:,。预测几乎完全正确,因为步长很小,二阶项可以忽略。

5.2 手算:极坐标在

。面积放大了 2 倍:极坐标下 的那个 ,就是这里来的。

5.3 场景:两层网络的逐样本 Jacobian

设 ,其中 、。由链式法则:

形状 。它告诉你「这个样本的输入像素动一点,输出 logits 动多少」。实际训练不会把它算出来,但反向传播传的正是它的转置作用(见 §8)。

5.4 场景闭环:3600 万维状态、2000 万观测、半小时

输入:状态 (fp64 约 288 MB),观测 (约 160 MB);背景误差协方差用对角 + 低秩近似,不显式存 。

计算:一次 要跑 2000 万条辐射传输/插值,按每条 FLOP 估算约 FLOP;伴随 同量级。一轮 4D-Var 里正演与伴随合计要应用约 次,于是

在 FLOP/s 的机器上约 40 秒纯计算。但实际耗时远不止——每次应用都要把 288 MB 的状态在几百个节点之间做一次全局转置,通信与 IO 才是瓶颈。

输出:分析增量 。决策是「这批观测同化还是剔除」「哪个通道的偏差订正系数要更新」。

成本:显式矩阵 个数、2.9 PB——不可行;伴随法只多存两个状态量级的向量(各 288 MB),计算量是前向的 2–3 倍。这就是 Jacobian 在工程里唯一的活法:不存矩阵,只存「乘一下」的代码。

失败条件与兜底:

  • 伴随与切线性不一致:最隐蔽的 bug。兜底:每次业务运行前做点积测试,随机取 ,要求相对误差 。
  • 强非线性区:台风眼、深对流区,线性化误差超过观测误差。兜底:增加外循环(重线性化),并对这些区域降权。
  • 观测偏差未订正:卫星通道有系统偏差,同化会把偏差吸进状态。兜底:变分偏差订正,把偏差系数和状态一起解。

6. 常见误区

  1. 误区:Jacobian 一定是 。 纠正:形状取决于约定。本文统一「行 = 输出、列 = 输入」,即 。别的书写成 是其转置,公式里的转置位置会不同。

  2. 误区:Jacobian 的每个元素就是「总导数」。 纠正: 是偏导,固定其它输入。若变量之间还有依赖(如 ),总导数要把间接路径加起来,那才是链式法则。

  3. 误区:Jacobian 是常数矩阵。 纠正:只有线性/仿射映射的 Jacobian 处处相同。一般情况下它随 变化,例如 §5.1 的 依赖 。

  4. 误区: 说明函数不可逆。 纠正:只说明逆函数定理不能直接使用,该点附近可能压扁或折叠;不能推出函数处处不可逆。例如 在 处导数为 ,但全局可逆。

7. 概念网络

  • 前置:3.3 矩阵乘法 —— Jacobian 是线性映射的矩阵。
  • 前置:8.1 梯度 —— 每一行是一个输出的梯度。
  • 后续:8.4 Hessian —— 梯度的 Jacobian 就是 Hessian。
  • 后续:8.5 矩阵求导与链式法则 —— 用 Jacobian 组织反向传播。
  • 关联:5.1 行列式 —— 是局部体积缩放;变量替换、归一化流都靠它。

8. 通往大模型:反向传播从不真的造 Jacobian

出现位置:autograd 的反向模式(reverse-mode AD)。对一层 ,逐样本 Jacobian 是 ;一个 batch 的完整 Jacobian 是块对角矩阵,形状 。

形状有多夸张:、 时,完整 Jacobian 有 个元素,bf16 下约 34 GB。没人会把它存下来。

为什么需要:反向传播只需要「向量–Jacobian 乘积」(vector–Jacobian product, VJP)。给定上游梯度 ,它计算 ,成本约等于一次矩阵乘法。对 ,,形状回到输入空间。这就是为什么反向传播的显存约等于前向激活,而不是 Jacobian 的尺寸。

可检验结论:对 softmax 输出 (),其 Jacobian 是 ,形状 ,单个样本就有 25 亿元素。但交叉熵损失对 logits 的梯度只是 ,一个 维向量——链式法则把巨大的中间矩阵约掉了。

如果这一步算错,推理/训练时看到什么:反向传播里漏乘一层转置,梯度形状可能仍然对(方阵时),loss 会下降但明显变慢,验证集早早停在平台;VJP 与 JVP 混用(把 当成 ),数值梯度检查立刻对不上,但训练不会报错——它只是朝一个系统性偏斜的方向更新。

9. 练习

  1. 概念: 的 Jacobian 是什么形状? 的第 2 行第 3 列代表什么?
  2. 计算:,求 与 。
  3. 计算:,求 在 处的值。
  4. 链式:,,写出 的形状与乘法顺序。
  5. 开放:为什么深度学习框架选择反向模式而不是前向模式?从「输入维数 vs 输出维数」的角度解释。
参考答案
  1. 。第 2 行第 3 列是 :第 2 个输出对第 3 个输入的偏导。
  2. ,在 处为 ,。
  3. ,在 处为 ,形状 。
  4. ,,乘积 ;顺序不能反。
  5. 反向模式一次就能得到「标量损失对所有输入」的梯度,成本与前向同阶;前向模式每算一个输入方向就要一遍。大模型输入(参数)上亿、输出(损失)一个标量,所以反向模式压倒性划算。代价是要保存前向激活。

10. 一页速记

  • ,,行是输出、列是输入。
  • ,局部线性化。
  • 的 Jacobian 就是 。
  • 链式法则:,形状 。
  • 反向传播用 VJP,不显式构造 Jacobian。
  • 物理意义 / 现实对应:Jacobian 是一张敏感度表——第 行是第 个观测对全部状态变量的响应;同化系统只存 与 两个动作,从不存矩阵。

11. 参考文献与致谢

这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。

  • Jacobi(1841):De Determinantibus Functionalibus。函数行列式(Jacobian)的原始论文;本页把「多元映射的导数」写成矩阵,正是这项工作开启的语言。Journal für die reine und angewandte Mathematik
  • Nocedal & Wright(2006):Numerical Optimization(2nd ed.)。Jacobian 在非线性方程与优化中的用法,可与本页 §4 的链式法则对照。Springer
  • Goodfellow, Bengio & Courville(2016):Deep Learning。第 6 章用计算图解释 Jacobian 与反向传播,对应本页 §8 的线性层例子。MIT Press(开放网页版)

下一篇 → 8.4 Hessian 与二阶近似

返回 M08 导览去练习场

随堂测 · 4 题

单选难度 1第 1 / 4 题
设 ,按本文约定(行是输出、列是输入), 的形状是?

源文件:08-微积分与优化/03-Jacobian.md

输入关键词开始搜索