
线性代数(十一):矩阵微积分与优化——从梯度到反向传播
调淋浴水温就是一个最小号的神经网络训练:根据误差去调一个参数。矩阵微积分把这件事推广到上亿个参数,优化算法则是把它做下去的引擎。本章从标量梯度讲到 Jacobian、Hessian、反向传播、凸优化与 Adam。
从淋浴龙头到神经网络#
每天早上,你都在训练一个微型神经网络:水太冷时,你会拧一下水龙头旋钮——这是一个参数;一秒钟后,你感受到新的水温——这是误差信号;接着再拧一次。经过三四次调整,水温就刚刚好。

现代深度学习其实也是这么回事,只是规模放大了七个数量级。“旋钮”变成了一块矩阵 $W$ ,里面可能有几亿个参数;“误差”变成了标量损失 $L$ 。但问题没变:对每个参数,我该往哪个方向调,调多少? 答案就在一个东西里:梯度 $\partial L / \partial W$ 。
这一章将从零开始构建这个对象,并让它真正发挥作用。
你将学到什么#
- 梯度——标量对向量的导数,以及它为什么指向“上坡”
- 方向导数——任意方向上的变化率,“最速下降”为何是“下坡”
- Jacobian 矩阵——向量函数的导数,链式法则的核心组件
- Hessian 矩阵——二阶导数矩阵,用来判断临界点性质
- 矩阵导数——真正实用的迹和行列式公式
- 链式法则与反向传播——一条规则,递归走遍计算图
- 凸优化——让“搜索”变成“顺坡而下”的关键特性
- 优化器全家桶——梯度下降、牛顿法、SGD、动量、Adam
前置知识#
梯度:多维空间中的“坡度”#
从单变量到多变量#
假设你开了一家奶茶店,利润 $f$ 取决于价格 $x_1$ 和广告预算 $x_2$ 。你想知道:如果稍微调整一下价格或者广告预算,利润会怎么变化?
两个偏导数分别回答了这个问题的一部分:
- $\partial f/\partial x_1$ —— 固定广告预算,价格每变动 1 元,利润的变化量。
- $\partial f/\partial x_2$ —— 固定价格,广告预算每增加 1 元,利润的变化量。
梯度的三个几何意义#
梯度不仅仅是偏导数的简单堆叠;它的形式之所以如此,是因为以下三个几何事实。
1. 方向: 梯度指向函数值增长最快的方向。在所有可能的单位方向中,沿着 $\nabla f$ 的方向走,函数值增长最快;反方向则是下降最快的方向——这句话就是梯度下降算法的全部理论依据。
2. 大小: $\|\nabla f\|$ 表示函数值沿最快方向的增长率。梯度越大,说明这里的“坡”越陡,稍微移动一步,函数值就会发生显著变化;梯度接近零,则说明你处于平地或临界点附近。
3. 正交性: 梯度垂直于等值面 $\{\vec{y}: f(\vec{y}) = f(\vec{x})\}$ 。在地形图上,等高线表示高度不变的区域,而梯度总是垂直于这些等高线,指向“上坡”的方向。

三个必背的例子#
下面三个公式非常重要,建议直接记住。
线性函数 $f(\vec{x}) = \vec{a}^T\vec{x}$ ,则 $\nabla f = \vec{a}$ 。
这个函数的图像是一个超平面,$\vec{a}$ 是它的法向量,也是函数值增长最快的方向。
平方范数 $f(\vec{x}) = \|\vec{x}\|^2 = \vec{x}^T\vec{x}$ ,则 $\nabla f = 2\vec{x}$ 。
这是一个以原点为底的“碗”,梯度从原点向外辐射,正好指向远离最小值的方向。
一般二次型 $f(\vec{x}) = \vec{x}^TA\vec{x}$ ,其中 $A$ 对称,则 $\nabla f = 2A\vec{x}$ 。
本书后续遇到的所有二次损失函数,最终都可以归结为这个公式。如果 $A$ 不对称,用 $\tfrac{1}{2}(A+A^T)$ 替代即可——梯度只关心矩阵的对称部分。
方向导数:任意路径的坡度#
$$ D_{\vec{d}}f = \nabla f \cdot \vec{d} = \|\nabla f\| \cos\theta $$这里 $\theta$ 是 $\nabla f$ 和 $\vec{d}$ 之间的夹角。有三个关键的角度值需要注意:
- $\theta = 0^\circ$ (顺着梯度方向走):函数值增加最快,变化率为 $\|\nabla f\|$ 。
- $\theta = 90^\circ$ (沿着等高线走):函数值不变。
- $\theta = 180^\circ$ (逆着梯度方向走):函数值减少最快,变化率为 $-\|\nabla f\|$ 。
最后一行正是梯度下降的理论基础:如果想让 $f$ 下降得最快,就沿着 $-\nabla f$ 的方向前进。
Jacobian:向量输入,向量输出#
如果输出也是向量,单靠一个梯度就不够了。你需要一个偏导数矩阵,每个输入和输出的组合都对应一个偏导数。
一个烹饪的例子#
假设三种调料 $(x_1, x_2, x_3)$ 分别控制三个口味指标 $(f_1, f_2, f_3)$ :咸度、甜度和辣度。这里一共有 $3 \times 3 = 9$ 个关系,描述的是“输入 $j$ 对输出 $i$ 的影响有多大”。把这些关系整理成一个 $3 \times 3$ 矩阵,这就是 Jacobian。
定义#
$$ J = \frac{\partial \vec{f}}{\partial \vec{x}} = \begin{pmatrix} \partial f_1/\partial x_1 & \cdots & \partial f_1/\partial x_n \\ \vdots & \ddots & \vdots \\ \partial f_m/\partial x_1 & \cdots & \partial f_m/\partial x_n \end{pmatrix} $$第 $i$ 行是 $f_i$ 的梯度,$(i,j)$ 位置表示的是“输入 $j$ 稍微变化一下,输出 $i$ 会跟着变化多少”。
几何意义:最佳线性近似#
$$ \vec{f}(\vec{x}_0 + \Delta\vec{x}) \approx \vec{f}(\vec{x}_0) + J\,\Delta\vec{x} $$从几何上看,Jacobian 描述了函数如何局部地改变空间形状:输入空间中的一个小正方形,经过函数映射后会变成输出空间中的一个小平行四边形,而 $J$ 正是实现这种变形的矩阵。
经典例子:极坐标#
$$ J = \begin{pmatrix} \cos\theta & -r\sin\theta \\ \sin\theta & r\cos\theta \end{pmatrix} $$它的行列式是 $\det(J) = r$ ——这正是极坐标积分中把 $dx\,dy$ 转换为 $r\,dr\,d\theta$ 时多出来的那个 $r$ 。微积分课上这个 $r$ 看起来像是凭空出现的,但在这里,你亲手把它推导出来了。
Hessian:曲率与临界点分类#
梯度告诉你坡度,Hessian 告诉你坡度如何变化——这就是曲率。
定义#
$$ H = \begin{pmatrix} \partial^2 f/\partial x_1^2 & \cdots & \partial^2 f/\partial x_1 \partial x_n \\ \vdots & \ddots & \vdots \\ \partial^2 f/\partial x_n \partial x_1 & \cdots & \partial^2 f/\partial x_n^2 \end{pmatrix} $$如果二阶偏导连续,Hessian 就是对称矩阵(Schwarz/Clairaut 定理)。这个对称性是后续讨论的基础,它让你可以直接分析 $H$ 的特征值。
二阶 Taylor 展开#
$$ f(\vec{x}_0 + \Delta\vec{x}) \approx f(\vec{x}_0) + \nabla f^T \Delta\vec{x} + \frac{1}{2}\Delta\vec{x}^T H \Delta\vec{x} $$公式包含三项:当前值、线性修正(梯度)、二次修正(曲率)。
临界点分类#
在 $\nabla f = \vec{0}$ 的临界点处,线性项消失,函数的局部行为完全由 Hessian 决定:
| Hessian 性质 | 类型 | 几何意义 |
|---|---|---|
| 正定($\lambda_i > 0$ ) | 局部极小 | 碗底 |
| 负定($\lambda_i < 0$ ) | 局部极大 | 山顶 |
| 不定(特征值正负混合) | 鞍点 | 马鞍面 |
| 半定(有 $\lambda_i = 0$ ) | 无法确定 | 某些方向平坦 |
两个例子: 对于 $f(x,y) = x^2 + y^2$ ,Hessian 是 $\mathrm{diag}(2,2)$ ,正定,所以 $(0,0)$ 是极小值点;对于 $f(x,y) = x^2 - y^2$ ,Hessian 是 $\mathrm{diag}(2,-2)$ ,不定,所以 $(0,0)$ 是鞍点。

为什么深度学习要特别关注鞍点? 在高维非凸损失函数中,随机遇到的“梯度为零”几乎都是鞍点,而不是真正的极小值。现代优化器必须能逃离这些鞍点,这也是动量类方法流行、而朴素牛顿法在深度学习中几乎不用的原因。
矩阵导数:当参数是矩阵时#
在神经网络中,参数通常是矩阵(比如权重矩阵)。你需要计算的是“标量损失对权重矩阵的导数”。
定义#
$$ \frac{\partial f}{\partial X} = \begin{pmatrix} \partial f/\partial x_{11} & \cdots & \partial f/\partial x_{1n}\\ \vdots & \ddots & \vdots\\ \partial f/\partial x_{m1} & \cdots & \partial f/\partial x_{mn} \end{pmatrix} $$结果和 $X$ 的形状完全一致。这个规则是本章最有用的检查点——如果推导出来的导数形状不对,那一定是代数运算出了问题。
常用公式#
| 函数 | 关于 $X$ 的导数 | 备注 |
|---|---|---|
| $\text{tr}(AX)$ | $A^T$ | 对 $X$ 是线性的 |
| $\text{tr}(X^TAX)$ | $(A + A^T)X$ | 如果 $A$ 对称,则简化为 $2AX$ |
| $\text{tr}(AXB)$ | $A^TB^T$ | 三明治形式 |
| $\det(X)$ | $\det(X)\, X^{-T}$ | 行列式 |
| $\ln\det(X)$ | $X^{-T}$ | 极大似然估计中常见 |
| $X^{-1}$ (微分) | $\partial(X^{-1}) = -X^{-1}(\partial X)X^{-1}$ | 逆矩阵 |
迹的出现频率很高,因为任何矩阵的标量函数都可以写成迹的形式。迹满足循环不变性 $\text{tr}(ABC) = \text{tr}(BCA) = \text{tr}(CAB)$ ,非常方便使用。更多公式可以参考 Petersen & Pedersen 的 Matrix Cookbook。

链式法则与反向传播#

矩阵形式的链式法则#
$$ \frac{\partial (g \circ \vec{h})}{\partial \vec{x}} = J_h^T \nabla g $$ $$ J_{\text{total}} = J_k\,J_{k-1}\,\cdots\,J_1 $$河流污染类比: 上游工厂排放变化 $\delta_1$ ,中游浓度响应为 $\delta_2 = J_1 \delta_1$ ,下游生态响应为 $\delta_3 = J_2 \delta_2$ 。最终结果是 $\delta_3 = J_2 J_1 \delta_1$ ——每一段对应一个矩阵,依次相乘。
反向传播:高效实现链式法则#
任何复合表达式——包括上千层的神经网络——都可以拆解成有向无环图上的基本运算,这张图叫计算图。反向传播就是在这张图上逆向应用链式法则。
为什么是逆向? 假设有 $n$ 个输入和 $1$ 个输出(典型场景:百万参数、单标量损失)。
- 前向模式(dual numbers)计算的是 Jacobian-向量乘积 $J\vec{v}$ 。要得到所有梯度,需要做 $n$ 次。
- 反向模式(反向传播)计算的是向量-Jacobian 乘积 $\vec{v}^TJ$ 。一次遍历就能同时得到所有 $n$ 个输入的梯度。
在深度学习中,“$n$ ”代表“模型中的所有参数”——反向模式比前向模式便宜大约一百万倍。这个差距是深度学习能够实际运行的唯一原因。

全连接层的反向传播#
这是最核心的推导;如果本章只记住一个公式,就记住这个。
$$ \vec{z} = W\vec{x} + \vec{b}, \qquad \vec{a} = \sigma(\vec{z})\quad(\text{逐元素}) $$反向: 假设后续层已经传回了 $\delta_a := \partial L / \partial \vec{a}$ 。
- 穿过激活函数: $\delta_z = \delta_a \odot \sigma'(\vec{z})$ ($\odot$ 表示逐元素乘法)。
- 权重梯度: $\dfrac{\partial L}{\partial W} = \delta_z \vec{x}^T$ 。注意形状:上游信号与输入的外积,正好和 $W$ 同形。
- 偏置梯度: $\dfrac{\partial L}{\partial \vec{b}} = \delta_z$ 。
- 回传给上一层: $\dfrac{\partial L}{\partial \vec{x}} = W^T\delta_z$ 。
PyTorch、JAX、TensorFlow 等现代框架,背后执行的就是这一套逻辑,逐层完成。
常见激活函数及其导数#
ReLU: $\sigma(z) = \max(0, z)$ ,$\sigma'(z) = 1$ (当 $z>0$ )或 0。计算简单,正区间不饱和。缺点是负区间梯度恒为零,可能导致“死亡 ReLU”。
Sigmoid: $\sigma(z) = 1/(1+e^{-z})$ ,有一个优雅的恒等式 $\sigma'(z) = \sigma(z)(1 - \sigma(z))$ 。输出范围在 $(0,1)$ ,可解释为概率。缺点是两端饱和,导致深层网络中梯度消失。
$$ \frac{\partial L}{\partial \vec{z}} = \hat{\vec{y}} - \vec{y} $$“预测概率减真实标签”——梯度局部、计算简单、量级合适。这正是 Softmax + 交叉熵成为分类问题默认选择的原因。
凸优化:让一切变简单的关键特性#
什么是“凸”#
$$ f(\alpha\vec{x} + (1-\alpha)\vec{y}) \leq \alpha f(\vec{x}) + (1-\alpha)f(\vec{y}), \quad \alpha \in [0,1] $$凸性之所以重要,全因一个简单事实:
定理: 凸函数的每个局部最小值都是全局最小值。
对于凸问题,优化器找到局部极小值就等于找到了全局最优解——完全不用担心陷入糟糕的局部解。
凸函数的三种等价定义(针对 $C^2$ 函数)#
- $f$ 是凸函数。
- 图像总在切线之上:$f(\vec{y}) \geq f(\vec{x}) + \nabla f(\vec{x})^T(\vec{y} - \vec{x})$ 。
- Hessian 矩阵处处半正定:$H(\vec{x}) \succeq 0$ 。
如果是严格凸,就把 $\succeq$ 换成 $\succ$ 。
常见凸函数示例#
| 函数 | 为什么是凸的 |
|---|---|
| $\vec{a}^T\vec{x} + b$ | 仿射函数,既是凸也是凹 |
| $\mid\vec{x}\mid_p$ ($p \geq 1$ ) | 满足三角不等式 |
| $\vec{x}^TA\vec{x}$ ,$A \succeq 0$ | Hessian 是 $2A \succeq 0$ |
| $e^x$ ,$x \log x$ | 二阶导数大于零 |
| $-\log x$ ($x > 0$ ) | 对数似然损失的基础 |

KKT 条件#
对于带约束优化问题 $\min f(\vec{x})$ ,满足 $g_i(\vec{x}) \leq 0$ 和 $h_j(\vec{x}) = 0$ ,KKT 条件是任何最优解的必要条件。如果问题是凸的,这些条件也足够了:
- 原问题可行: $g_i(\vec{x}^*) \leq 0$ ,$h_j(\vec{x}^*) = 0$ 。
- 对偶可行: $\mu_i \geq 0$ 。
- 互补松弛: $\mu_i\, g_i(\vec{x}^*) = 0$ 。不等式约束要么取等号,要么对应的乘子为零。
- 驻点条件: $\nabla f + \sum_i \mu_i \nabla g_i + \sum_j \nu_j \nabla h_j = \vec{0}$ 。
KKT 是解决带约束优化问题的核心工具。而拉格朗日框架不仅是 KKT 的基础,也是推导 SVM、最大熵模型和 PCA 的统一方法。
优化算法#
梯度下降#
$$ \vec{x}_{k+1} = \vec{x}_k - \alpha \nabla f(\vec{x}_k) $$沿着坡往下走。步长 $\alpha$ 是学习率:太小了走得慢,太大了会失控。
对于条件数为 $\kappa$ 的凸二次函数,收敛速度大约是 $\bigl(\tfrac{\kappa - 1}{\kappa + 1}\bigr)^k$ 。如果问题病态($\kappa \gg 1$ ),收敛会非常慢,路径还会在碗的长轴方向来回抖动。

牛顿法#
$$ \vec{x}_{k+1} = \vec{x}_k - H^{-1}\nabla f(\vec{x}_k) $$用二阶 Taylor 展开把 $f$ 近似成一个二次函数,然后直接跳到这个二次函数的极值点。这种方法有二次收敛的特性:每迭代一次,正确数字位数大概翻倍。
但代价也很高:构建和求逆 Hessian 矩阵需要 $O(n^3)$ 的时间复杂度,参数上百万时根本跑不动。而且对非凸损失,牛顿法可能会冲向鞍点甚至极大值——它只认梯度为零的地方,不挑类型。

随机梯度下降(SGD)#
$$ \vec{x}_{k+1} = \vec{x}_k - \alpha \nabla \ell_{i_k} $$每一步的计算量大大减少。注入的噪声还能帮助跳出窄鞍点和浅盆地——对非凸深度学习来说,这是个优点,不是缺点。
动量法(Momentum)#
$$ \vec{v}_{k+1} = \beta\vec{v}_k + \nabla f(\vec{x}_k), \qquad \vec{x}_{k+1} = \vec{x}_k - \alpha\vec{v}_{k+1} $$直观理解:一个重球沿坡滚下。惯性让路径更顺滑,还能冲过小坑。
Adam#
$$ m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla f \qquad v_t = \beta_2 v_{t-1} + (1-\beta_2)(\nabla f)^2 $$ $$ \vec{x}_{t+1} = \vec{x}_t - \frac{\alpha}{\sqrt{\hat{v}_t} + \epsilon}\hat{m}_t $$梯度持续较大的参数会被自动调小步长;梯度小、不太动的参数则被调大。默认配置 $\beta_1 = 0.9$ 、$\beta_2 = 0.999$ 、$\alpha = 10^{-3}$ 已经成为当今大部分深度学习训练的首选方案。
三个值得手算的应用#
线性回归(闭式解)#
目标函数是:$L(\vec{w}) = \|X\vec{w} - \vec{y}\|^2$ 。
梯度为:$\nabla L = 2X^T(X\vec{w} - \vec{y})$ 。
$$ \vec{w}^* = (X^TX)^{-1}X^T\vec{y} $$之所以有闭式解,是因为损失函数是关于 $\vec{w}$ 的凸二次函数。
岭回归#
在目标函数中加入 $\ell_2$ 正则项:$L(\vec{w}) = \|X\vec{w} - \vec{y}\|^2 + \lambda\|\vec{w}\|^2$ 。
$$ \vec{w}^* = (X^TX + \lambda I)^{-1}X^T\vec{y} $$$\lambda I$ 将 $X^TX$ 的所有特征值都增加了 $\lambda$ ,这不仅保证了矩阵可逆,还降低了条件数。这是第 10 章 关于条件数直觉的直接应用。
PCA 的优化视角#
$$ \max_{\|\vec{w}\|=1} \vec{w}^T\Sigma\vec{w} $$构造拉格朗日函数:$\vec{w}^T\Sigma\vec{w} - \lambda(\vec{w}^T\vec{w} - 1)$ 。对 $\vec{w}$ 求导并令其为零,得到 $\Sigma\vec{w} = \lambda\vec{w}$ 。根据 KKT 条件中的驻点条件,PCA 实际上是一个特征值问题。最优解就是 $\Sigma$ 的最大特征值对应的特征向量。
公式速查表#
向量导数#
| 函数 | 导数 |
|---|---|
| $\vec{a}^T\vec{x}$ | $\vec{a}$ |
| $\vec{x}^T\vec{x}$ | $2\vec{x}$ |
| $\vec{x}^TA\vec{x}$ ($A$ 对称) | $2A\vec{x}$ |
| $\mid\vec{x}\mid_2$ | $\vec{x}/\mid\vec{x}\mid_2$ |
矩阵导数#
| 函数 | 导数 |
|---|---|
| $\text{tr}(AX)$ | $A^T$ |
| $\text{tr}(X^TAX)$ | $(A+A^T)X$ |
| $\det(X)$ | $\det(X)\cdot X^{-T}$ |
| $\ln\det(X)$ | $X^{-T}$ |
Python 实战#
梯度检验#
手推梯度时,最好的调试方法就是用中心差分来验证。
| |
相对误差小于 $10^{-7}$ 就不错了,小于 $10^{-9}$ 则非常优秀。
对比 GD、Momentum 和 Adam#
| |
练习题#
基础题#
- 求函数 $f(\vec{x}) = 3x_1^2 + 2x_1x_2 + x_2^2$ 的梯度。
- 找出函数 $f(x,y) = x^3 - 3xy + y^3$ 的所有临界点,并用 Hessian 判断每个点的性质。
- 根据偏导数定义,证明 $\nabla(\vec{x}^TA\vec{x}) = (A + A^T)\vec{x}$ 。
进阶题#
- 推导两层神经网络 $f = \sigma_2(W_2\sigma_1(W_1\vec{x} + \vec{b}_1) + \vec{b}_2)$ 的反向传播公式,每一步都要明确标注矩阵形状。
- 证明牛顿法在任意二次函数上只需一步即可收敛到最优解。
- 使用“弦在图像上方”的定义证明:凸函数的任意局部极小值一定是全局极小值。
编程题#
- 实现梯度检查器,并在三个不同函数上验证其正确性,其中一个函数必须是矩阵值函数。
- 从零实现 SGD、Momentum 和 Adam 优化算法,在 Rosenbrock 函数上比较它们的收敛速度,并绘制收敛路径图。
- 仅使用 numpy 实现一个两层神经网络,在二维玩具分类数据集上手动完成反向传播(禁止使用任何自动微分工具)。
总结#
| 概念 | 关键事实 | 在机器学习中的作用 |
|---|---|---|
| 梯度 | 上升最快的方向 | 推动梯度下降 |
| Jacobian | 最优线性逼近 | 构成链式法则的基础 |
| Hessian | 曲率矩阵 | 判断临界点性质 |
| 链式法则 | Jacobian 相乘 | 支撑反向传播的核心 |
| 凸性 | 局部最小值就是全局最小值 | 许多损失函数的保障 |
| Adam | 自适应学习率 | 深度学习默认优化器 |
最关键的一点:对于一个标量损失函数,即使它有上百万个参数,一次计算图的反向传播就能得到所有参数的梯度。 本章讲的所有内容,都是为了确保这一点既精确又可靠。
参考文献#
- Petersen, K. B. & Pedersen, M. S. The Matrix Cookbook. 矩阵导数恒等式的标准参考。
- Goodfellow, I., Bengio, Y. & Courville, A. (2016). Deep Learning, 第 6 章 ——反向传播详解。
- Boyd, S. & Vandenberghe, L. (2004). Convex Optimization——凸性、拉格朗日、KKT 的标准教材。
- Nocedal, J. & Wright, S. (2006). Numerical Optimization——牛顿、拟牛顿、信赖域的经典参考。
- Kingma, D. P. & Ba, J. (2015). “Adam: A Method for Stochastic Optimization.” ICLR.
线性代数 18 篇
- 01 线性代数(一):向量的本质——不仅仅是箭头
- 02 线性代数(二):线性组合与向量空间
- 03 线性代数(三):矩阵作为线性变换
- 04 线性代数(四):行列式的秘密
- 05 线性代数(五):线性方程组与列空间
- 06 线性代数(六):特征值与特征向量
- 07 线性代数(七):正交性与投影——当向量互不干扰
- 08 线性代数(八):对称矩阵与二次型
- 09 线性代数(九):奇异值分解 SVD
- 10 线性代数(十):矩阵范数与条件数——数值计算的健康体检
- 11 线性代数(十一):矩阵微积分与优化——从梯度到反向传播 当前
- 12 线性代数(十二):稀疏矩阵与压缩感知——少即是多的数学奇迹
- 13 线性代数(十三):张量与多线性代数——从标量到高维数据立方体
- 14 线性代数(十四):随机矩阵理论——混沌中的秩序
- 15 线性代数(十五):机器学习中的线性代数——从 PCA 到推荐系统
- 16 线性代数(十六):深度学习中的线性代数——从全连接到 Transformer
- 17 线性代数(十七):计算机视觉中的线性代数——从像素到三维重建
- 18 线性代数(十八):前沿应用与总结——量子计算、GNN、大模型,与十八章回望