← 返回模块
Q2.4.2.2beta 可读 · 未来付费校验通过内容版本 2026-05-24

链式法则与雅可比矩阵

2.4.2 · 面向最优化的微积分 · 数学与统计能力

Hook:一次梯度核对失败的复盘

上海某量化私募的小组复盘会上,工程师摊开一张 PnL 时序图:基于沪深300 成分股的因子神经网络回测里,梯度核对(gradient check)数值在第三层之后开始与解析梯度系统性偏离一个常数倍。CFFEX 主力合约的日线策略本来 7 月稳得像一块表,过完一个版本后突然走样——根因追下来是一行被写反的 transpose:在某一层把 JWhJ_W h 写成了 WTJhW^T J h 的形式。一个把雅可比矩阵(Jacobian)摆错位置的失误,可以让一整条反向传播链路系统性偏差。下面我们把多元链式法则从一元情形重新搭起来,让你之后写每一行梯度都知道矩阵该乘在哪一边。

一、回到一元链式法则

y=f(g(x))y = f(g(x)),其中 f,g:RRf, g: \mathbb{R} \to \mathbb{R} 都可导。一元链式法则告诉你

dydx=f(g(x))g(x)\frac{dy}{dx} = f'(g(x)) \cdot g'(x)

这条式子的解读:要把 xx 的一个微小变化 dxdx 翻译成 yy 的变化 dydy,先用 g(x)g'(x)dxdx 变换到中间变量空间里的 dg=g(x)dxdg = g'(x) dx,再用 f(g(x))f'(g(x))dgdg 翻译成 dy=f(g(x))dgdy = f'(g(x)) \cdot dg。两个​​标量乘子​​按从外到内的顺序相乘——一元世界里乘法可交换,所以你不必担心顺序,到了多元世界这个余地就消失了。

二、把标量乘子升级成矩阵:雅可比

f:RnRmf: \mathbb{R}^n \to \mathbb{R}^m 是一个向量值函数。它的​​雅可比矩阵(Jacobian)​ Jf(x)J_f(x) 是一个 m×nm \times n 的矩阵,其 (i,j)(i, j) 元为

Jf(x)ij=fixj(x)J_f(x)_{ij} = \frac{\partial f_i}{\partial x_j}(x)

每一行(共 mm 行)是输出分量 fif_i 对全体输入 x1,,xnx_1, \dots, x_n 的梯度向量的转置;每一列(共 nn 列)是「只让 xjx_j 动」时输出向量在 Rm\mathbb{R}^m 里的瞬时位移方向。两种读法各有用处:训练神经网络时按行思考更自然,做敏感性分析时按列思考更直观。

关键事实:在 ff 光滑的前提下,

f(x+h)=f(x)+Jf(x)h+o(h)f(x + h) = f(x) + J_f(x) \cdot h + o(\|h\|)

它把多元函数的一阶变化压缩成一次矩阵乘法(matrix multiplication)。当 m=1m = 1 时雅可比退化成一个行向量,即 f(x)T\nabla f(x)^T——也就是上一课讲的梯度转置。雅可比是梯度向高维输出的自然推广。

三、多元链式法则

g:RnRpg: \mathbb{R}^n \to \mathbb{R}^pf:RpRmf: \mathbb{R}^p \to \mathbb{R}^m,复合函数 h=fg:RnRmh = f \circ g: \mathbb{R}^n \to \mathbb{R}^m。多元链式法则断言

Jfg(x)=Jf(g(x))Jg(x)J_{f \circ g}(x) = J_f(g(x)) \cdot J_g(x)

形状自洽性验证:Jf(g(x))J_f(g(x))m×pm \times pJg(x)J_g(x)npn \to p(即 p×np \times n),相乘得到 m×nm \times n,正是 fgf \circ g 的雅可比应有的形状。乘法的​​顺序​​是「外层在左、内层在右」——这与一元情形对应,但在多元世界里矩阵乘法不可交换(matrix multiplication is not commutative),写反就是另一个函数的梯度。

把这条规则特化到神经网络里常见的「标量损失对参数向量」情形:设损失 L=(h(Wx))L = \ell(h(W \cdot x)),其中 WxRpW \cdot x \in \mathbb{R}^ph:RpRqh: \mathbb{R}^p \to \mathbb{R}^q:RqR\ell: \mathbb{R}^q \to \mathbb{R}。把 LLWW 的梯度按链式法则展开,会涉及把矩阵转置(matrix transpose)按从后往前的顺序乘起来——这就是反向传播(backpropagation)公式的全部内容。

四、正向 vs 反向:在一张小图上数一数

考虑一个三节点计算图:xR10x \in \mathbb{R}^{10}y=Axy = A xAA5×105 \times 10 矩阵),z=cos(y)z = \cos(y)(按元素),L=1TzL = \mathbf{1}^T z(标量损失)。从 xxLL 经过两层雅可比再到一个 1×51 \times 5 的行向量。

  1. ​正向模式(forward-mode)​​:从 xx 端开始,维护一个「方向导数向量」,每经过一个节点做一次雅可比—向量乘积。在本例中:先算 Jyv=AvJ_y \cdot v = A v5×1010×1=5×15 \times 10 \cdot 10 \times 1 = 5 \times 1,约 50 次乘加);再算 Jz(Jyv)J_z \cdot (J_y \cdot v)(对角矩阵作用,约 5 次乘加);最后再做一次内积。要拿到对 xx 全部 10 个分量的偏导,需要把 vv 取成 10 个单位向量分别跑一遍,总计 10 次正向。
  2. ​反向模式(reverse-mode)​​:从 LL 端开始,维护一个「梯度行向量」,每经过一个节点做一次向量—雅可比乘积。在本例中:先算 1TJz\mathbf{1}^T J_z(约 5 次乘加),再算 (1TJz)Jy(\mathbf{1}^T J_z) \cdot J_y1×55×101 \times 5 \cdot 5 \times 10,约 50 次乘加)。一遍反向就拿到对 xx 全部 10 个分量的偏导。

通用法则:当输出维度(这里 1)远小于输入维度(这里 10)时,反向模式更便宜;反之则正向模式更便宜。深度学习里损失永远是标量、参数动辄上百万维——这就是为什么标准做法是反向模式自动微分,也就是反向传播。

下方滑块可以扫一遍输出维度 m 与输入维度 n 之比的两种成本估计:正向模式约为 n*c,反向模式约为 m*cc 是一遍前向的算子开销)。

Formula Explorer

(n - m) * c

五、自检

Exercise

f(u)=uTuf(u) = u^T u(其中 uRpu \in \mathbb{R}^p),g(x)=Axg(x) = A x(其中 AAp×np \times n 常矩阵)。 (i) 用链式法则求复合函数 h(x)=f(g(x))=xTATAxh(x) = f(g(x)) = x^T A^T A x 的梯度 h(x)\nabla h(x)。 (ii) 取 n=p=2n = p = 2A=(1201)A = \begin{pmatrix}1 & 2 \\ 0 & 1\end{pmatrix}x=(1,1)Tx = (1, 1)^T,先用解析式算梯度,再用中心差分 (h(x+ϵek)h(xϵek))/(2ϵ)(h(x + \epsilon e_k) - h(x - \epsilon e_k)) / (2\epsilon)ϵ=104\epsilon = 10^{-4})逐分量做数值对比,确认两者匹配到 4 位有效数字。

提示
先单独算两层的雅可比:Jf(u)J_f(u)1×p1 \times p 的行向量 2uT2 u^TJg(x)J_g(x)p×np \times n 的常矩阵 AA
提示
按多元链式法则 Jh=Jf(g(x))Jg(x)=2(Ax)TAJ_h = J_f(g(x)) \cdot J_g(x) = 2 (A x)^T A,转置成列向量即得 h(x)=2ATAx\nabla h(x) = 2 A^T A x。代入 A,xA, x 得解析梯度;中心差分按公式逐分量算两次再做减法。

通往下一节

到这里你已经能把任意一条计算图上的梯度按正确顺序乘出来。但梯度只回答了「在当前点往哪个方向走会变化最快」,没有回答「这条方向走出去之后曲面会怎么弯」。后一个问题需要二阶信息——海森矩阵(Hessian)。下一课从一元泰勒展开出发,把它升级到多元二阶展开,并展示为什么海森的特征值(eigenvalue)就是局部曲率沿对应主轴的二阶导数。