前言

这一篇不是基础线性代数笔记。矩阵乘法、转置、逆矩阵、特征值这些基础概念默认你已经见过。我们只关心一个更具体的问题:为什么深度学习里的反向传播经常要用矩阵微积分来描述?

在标量函数里,导数告诉我们“输入变化一点,输出会怎么变”。但神经网络里大量对象都不是标量:输入是向量,权重是矩阵,中间特征是高维张量,损失函数最后才压成一个标量。因此,普通的一元导数不够用,我们需要用 Jacobian、梯度向量和链式法则来描述这些对象之间的局部关系。

从标量导数到 Jacobian

设一个函数把向量 $x \in \mathbb{R}^n$ 映射到向量 $y \in \mathbb{R}^m$:

$$ y = f(x) $$

它的 Jacobian 矩阵定义为:

$$ \begin{aligned} J_f(x) &= \frac{\partial y}{\partial x} \\\\ &= \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_n} \\\\ \vdots & \ddots & \vdots \\\\ \frac{\partial y_m}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \end{aligned} $$

Jacobian 的含义不是“又多了一个复杂矩阵”,而是:它描述了函数 $f$ 在某一点附近的局部线性近似。

$$ f(x + \Delta x) \approx f(x) + J_f(x)\Delta x $$

这就是 AI 中 Jacobian 最重要的直觉:非线性网络在局部可以近似看成线性变换。

深度网络中的链式法则

深度网络可以看成一串函数复合:

$$ x \xrightarrow{f_1} h_1 \xrightarrow{f_2} h_2 \xrightarrow{f_3} \cdots \xrightarrow{f_k} L $$

其中 $L$ 是最终的标量损失。普通链式法则在这里变成 Jacobian 的连乘:

$$ \begin{aligned} \frac{\partial L}{\partial x} &= \frac{\partial L}{\partial h_k} \frac{\partial h_k}{\partial h_{k-1}} \cdots \frac{\partial h_1}{\partial x} \end{aligned} $$

这个式子能解释“梯度消失”和“梯度爆炸”的来源:如果每一层的 Jacobian 都在连乘,很多小于 1 的因子会让梯度越来越小,很多大于 1 的因子会让梯度越来越大。

不过,真实框架里通常不会显式构造这些巨大的 Jacobian。它们更常计算的是向量-Jacobian 乘积。

为什么框架偏爱 VJP

反向传播从损失 $L$ 开始。因为 $L$ 是标量,所以我们通常已经有了某个上游梯度:

$$ g_y = \frac{\partial L}{\partial y} $$

如果 $y=f(x)$,那么传给 $x$ 的梯度是:

$$ g_x = g_y J_f(x) $$

这叫 向量-Jacobian 乘积(Vector-Jacobian Product, VJP)。它的优势是:框架不必把完整 Jacobian 矩阵写出来,只需要知道“上游梯度乘过这一层之后变成什么”。

flowchart LR L["损失 L"] --> gy["上游梯度 g_y"] gy --> vjp["VJP: g_y · J_f(x)"] x["输入 x"] --> f["局部函数 y = f(x)"] f --> y["输出 y"] vjp --> gx["下游梯度 g_x"]

这就是 PyTorch、JAX、TensorFlow 这类自动微分系统背后的关键计算模式之一。你写的是前向函数,框架保存必要的中间值,然后在反向时按局部规则拼出 VJP。

回到 ResNet:为什么恒等项重要

ResNet 的残差块可以抽象成:

$$ y = F(x, W) + x $$

如果把 $x$ 和 $y$ 都看成向量,那么它的 Jacobian 是:

$$ \begin{aligned} \frac{\partial y}{\partial x} &= \frac{\partial F(x, W)}{\partial x} + I \end{aligned} $$

这里的 $I$ 是恒等矩阵,来自 shortcut 分支 $x \mapsto x$。反向传播时:

$$ \begin{aligned} \frac{\partial L}{\partial x} &= \frac{\partial L}{\partial y} \left( \frac{\partial F(x, W)}{\partial x} + I \right) \end{aligned} $$

这个式子的意义是:梯度不只依赖残差分支 $F$,还可以通过 $I$ 这条恒等路径直接传回去。

flowchart RL gy["上游梯度 ∂L/∂y"] --> add["乘以 J_F + I"] add --> jf["残差分支 J_F"] add --> id["恒等路径 I"] jf --> gx["贡献到 ∂L/∂x"] id --> gx

这就是为什么 ResNet 的数学表达经常会提到 Jacobian 和恒等矩阵。它并不是为了炫技,而是在解释:shortcut 让深层网络的梯度传播多了一条结构性通路。

哪些矩阵知识值得继续学

如果目标是理解 AI 模型,而不是完整重修数学系课程,优先级可以这样排:

  1. Jacobian 与链式法则:理解反向传播、残差连接、归一化层。
  2. 矩阵范数与谱半径直觉:理解梯度爆炸、梯度消失、稳定性。
  3. SVD 与低秩近似:理解 LoRA、模型压缩、Embedding 表示。
  4. 二阶信息与 Hessian 直觉:理解优化地形、曲率、Sharp/Flat minima。
  5. 向量化与张量形状推理:减少深度学习代码中的维度错误。

这些内容会比“从零讲矩阵乘法”更适合 AI 学习路线。

总结

矩阵微积分在深度学习中的作用,是把“很多变量之间的局部变化关系”写清楚。Jacobian 描述向量函数的局部线性近似,VJP 解释自动微分如何高效做反向传播,而 ResNet 中的恒等矩阵 $I$ 则揭示了 shortcut 为什么能改善深层网络的梯度流。

理解这些概念后,再看 ResNet、Transformer、LoRA 或归一化层时,很多公式就不再是凭空出现的符号,而是在描述信息和梯度如何穿过网络。

参考