系列 · 线性代数 · 第 11 篇

线性代数(十一):矩阵微积分与优化——从梯度到反向传播

调淋浴水温就是一个最小号的神经网络训练:根据误差去调一个参数。矩阵微积分把这件事推广到上亿个参数,优化算法则是把它做下去的引擎。本章从标量梯度讲到 Jacobian、Hessian、反向传播、凸优化与 Adam。

从淋浴龙头到神经网络#

每天早上,你都在训练一个微型神经网络:水太冷时,你会拧一下水龙头旋钮——这是一个参数;一秒钟后,你感受到新的水温——这是误差信号;接着再拧一次。经过三四次调整,水温就刚刚好。

线性代数(十一):矩阵微积分与优化——从梯度到反向传播 — 章节概览图

现代深度学习其实也是这么回事,只是规模放大了七个数量级。“旋钮”变成了一块矩阵 $W$ ,里面可能有几亿个参数;“误差”变成了标量损失 $L$ 。但问题没变:对每个参数,我该往哪个方向调,调多少? 答案就在一个东西里:梯度 $\partial L / \partial W$

这一章将从零开始构建这个对象,并让它真正发挥作用。

你将学到什么#

  • 梯度——标量对向量的导数,以及它为什么指向“上坡”
  • 方向导数——任意方向上的变化率,“最速下降”为何是“下坡”
  • Jacobian 矩阵——向量函数的导数,链式法则的核心组件
  • Hessian 矩阵——二阶导数矩阵,用来判断临界点性质
  • 矩阵导数——真正实用的迹和行列式公式
  • 链式法则与反向传播——一条规则,递归走遍计算图
  • 凸优化——让“搜索”变成“顺坡而下”的关键特性
  • 优化器全家桶——梯度下降、牛顿法、SGD、动量、Adam

前置知识#

  • 一元微积分(导数、链式法则)
  • 向量与点积(第 1 章
  • 矩阵乘法(第 3 章
  • 对称矩阵与正定性(第 8 章

梯度:多维空间中的“坡度”#

从单变量到多变量#

假设你开了一家奶茶店,利润 $f$ 取决于价格 $x_1$ 和广告预算 $x_2$ 。你想知道:如果稍微调整一下价格或者广告预算,利润会怎么变化?

两个偏导数分别回答了这个问题的一部分:

  • $\partial f/\partial x_1$ —— 固定广告预算,价格每变动 1 元,利润的变化量。
  • $\partial f/\partial x_2$ —— 固定价格,广告预算每增加 1 元,利润的变化量。
$$ \nabla f = \begin{pmatrix} \partial f/\partial x_1 \\ \partial f/\partial x_2 \end{pmatrix} $$ $$ \nabla f(\vec{x}) = \begin{pmatrix} \partial f/\partial x_1 \\ \vdots \\ \partial f/\partial x_n \end{pmatrix} \in \mathbb{R}^n $$

梯度的三个几何意义#

梯度不仅仅是偏导数的简单堆叠;它的形式之所以如此,是因为以下三个几何事实。

1. 方向: 梯度指向函数值增长最快的方向。在所有可能的单位方向中,沿着 $\nabla f$ 的方向走,函数值增长最快;反方向则是下降最快的方向——这句话就是梯度下降算法的全部理论依据。

2. 大小: $\|\nabla f\|$ 表示函数值沿最快方向的增长率。梯度越大,说明这里的“坡”越陡,稍微移动一步,函数值就会发生显著变化;梯度接近零,则说明你处于平地或临界点附近。

3. 正交性: 梯度垂直于等值面 $\{\vec{y}: f(\vec{y}) = f(\vec{x})\}$ 。在地形图上,等高线表示高度不变的区域,而梯度总是垂直于这些等高线,指向“上坡”的方向。

梯度即最速上升方向:左边是 3D 碗状曲面,右边是带梯度场的等高线图

三个必背的例子#

下面三个公式非常重要,建议直接记住。

线性函数 $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)$ 是鞍点。

Hessian 的特征值符号决定了临界点类型

为什么深度学习要特别关注鞍点? 在高维非凸损失函数中,随机遇到的“梯度为零”几乎都是鞍点,而不是真正的极小值。现代优化器必须能逃离这些鞍点,这也是动量类方法流行、而朴素牛顿法在深度学习中几乎不用的原因。

矩阵导数:当参数是矩阵时#

在神经网络中,参数通常是矩阵(比如权重矩阵)。你需要计算的是“标量损失对权重矩阵的导数”。

定义#

$$ \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}$

  1. 穿过激活函数: $\delta_z = \delta_a \odot \sigma'(\vec{z})$$\odot$ 表示逐元素乘法)。
  2. 权重梯度: $\dfrac{\partial L}{\partial W} = \delta_z \vec{x}^T$ 。注意形状:上游信号与输入的外积,正好和 $W$ 同形。
  3. 偏置梯度: $\dfrac{\partial L}{\partial \vec{b}} = \delta_z$
  4. 回传给上一层: $\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$ 函数)#

  1. $f$ 是凸函数。
  2. 图像总在切线之上:$f(\vec{y}) \geq f(\vec{x}) + \nabla f(\vec{x})^T(\vec{y} - \vec{x})$
  3. 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$对数似然损失的基础

凸碗 vs 非凸地形:只有左边那种能保证找到全局最优解

KKT 条件#

对于带约束优化问题 $\min f(\vec{x})$ ,满足 $g_i(\vec{x}) \leq 0$$h_j(\vec{x}) = 0$ ,KKT 条件是任何最优解的必要条件。如果问题是凸的,这些条件也足够了:

  1. 原问题可行: $g_i(\vec{x}^*) \leq 0$$h_j(\vec{x}^*) = 0$
  2. 对偶可行: $\mu_i \geq 0$
  3. 互补松弛: $\mu_i\, g_i(\vec{x}^*) = 0$ 。不等式约束要么取等号,要么对应的乘子为零。
  4. 驻点条件: $\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)$ 的时间复杂度,参数上百万时根本跑不动。而且对非凸损失,牛顿法可能会冲向鞍点甚至极大值——它只认梯度为零的地方,不挑类型。

牛顿法 vs 梯度下降:二次函数上牛顿法一步到位

随机梯度下降(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 实战#

梯度检验#

手推梯度时,最好的调试方法就是用中心差分来验证。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np

def gradient_check(f, grad_f, x, epsilon=1e-5):
    """用数值梯度验证解析梯度"""
    analytical = grad_f(x)
    numerical = np.zeros_like(x)

    for i in range(len(x)):
        x_plus = x.copy(); x_plus[i] += epsilon
        x_minus = x.copy(); x_minus[i] -= epsilon
        numerical[i] = (f(x_plus) - f(x_minus)) / (2 * epsilon)

    rel_error = np.linalg.norm(analytical - numerical) / (
        np.linalg.norm(analytical) + np.linalg.norm(numerical) + 1e-10)
    return rel_error

A = np.array([[2, 1], [1, 3]], dtype=float)
f = lambda x: x @ A @ x
grad_f = lambda x: 2 * A @ x

x = np.array([1.0, 2.0])
print(f"相对误差:{gradient_check(f, grad_f, x):.2e}")  # 约 1e-10

相对误差小于 $10^{-7}$ 就不错了,小于 $10^{-9}$ 则非常优秀。

对比 GD、Momentum 和 Adam#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import matplotlib.pyplot as plt

def optimize_comparison():
    """在二维各向异性二次函数上对比 GD、Momentum 和 Adam"""
    A = np.array([[10, 0], [0, 1]])  # 条件数为 10
    f = lambda x: 0.5 * x @ A @ x
    grad = lambda x: A @ x

    methods = {
        'GD': {'lr': 0.1},
        'Momentum': {'lr': 0.1, 'beta': 0.9},
        'Adam': {'lr': 0.3, 'beta1': 0.9, 'beta2': 0.999}
    }

    x0 = np.array([5.0, 5.0])
    paths = {}

    for name, p in methods.items():
        x, v, m, vv = x0.copy(), np.zeros(2), np.zeros(2), np.zeros(2)
        path = [x.copy()]
        for t in range(1, 50):
            g = grad(x)
            if name == 'GD':
                x = x - p['lr'] * g
            elif name == 'Momentum':
                v = p['beta'] * v + g
                x = x - p['lr'] * v
            elif name == 'Adam':
                m = p['beta1'] * m + (1-p['beta1']) * g
                vv = p['beta2'] * vv + (1-p['beta2']) * g**2
                m_hat = m / (1 - p['beta1']**t)
                v_hat = vv / (1 - p['beta2']**t)
                x = x - p['lr'] * m_hat / (np.sqrt(v_hat) + 1e-8)
            path.append(x.copy())
        paths[name] = np.array(path)

    fig, ax = plt.subplots(figsize=(8, 6))
    t = np.linspace(-6, 6, 100)
    X, Y = np.meshgrid(t, t)
    Z = 0.5 * (A[0,0]*X**2 + A[1,1]*Y**2)
    ax.contour(X, Y, Z, levels=20, alpha=0.5)
    for name, path in paths.items():
        ax.plot(path[:, 0], path[:, 1], 'o-', markersize=3, label=name)
    ax.legend()
    ax.set_aspect('equal')
    ax.set_title('二次函数上的优化轨迹')
    plt.show()

optimize_comparison()

练习题#

基础题#

  1. 求函数 $f(\vec{x}) = 3x_1^2 + 2x_1x_2 + x_2^2$ 的梯度。
  2. 找出函数 $f(x,y) = x^3 - 3xy + y^3$ 的所有临界点,并用 Hessian 判断每个点的性质。
  3. 根据偏导数定义,证明 $\nabla(\vec{x}^TA\vec{x}) = (A + A^T)\vec{x}$

进阶题#

  1. 推导两层神经网络 $f = \sigma_2(W_2\sigma_1(W_1\vec{x} + \vec{b}_1) + \vec{b}_2)$ 的反向传播公式,每一步都要明确标注矩阵形状。
  2. 证明牛顿法在任意二次函数上只需一步即可收敛到最优解。
  3. 使用“弦在图像上方”的定义证明:凸函数的任意局部极小值一定是全局极小值。

编程题#

  1. 实现梯度检查器,并在三个不同函数上验证其正确性,其中一个函数必须是矩阵值函数。
  2. 从零实现 SGD、Momentum 和 Adam 优化算法,在 Rosenbrock 函数上比较它们的收敛速度,并绘制收敛路径图。
  3. 仅使用 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 篇

  1. 01 线性代数(一):向量的本质——不仅仅是箭头
  2. 02 线性代数(二):线性组合与向量空间
  3. 03 线性代数(三):矩阵作为线性变换
  4. 04 线性代数(四):行列式的秘密
  5. 05 线性代数(五):线性方程组与列空间
  6. 06 线性代数(六):特征值与特征向量
  7. 07 线性代数(七):正交性与投影——当向量互不干扰
  8. 08 线性代数(八):对称矩阵与二次型
  9. 09 线性代数(九):奇异值分解 SVD
  10. 10 线性代数(十):矩阵范数与条件数——数值计算的健康体检
  11. 11 线性代数(十一):矩阵微积分与优化——从梯度到反向传播 当前
  12. 12 线性代数(十二):稀疏矩阵与压缩感知——少即是多的数学奇迹
  13. 13 线性代数(十三):张量与多线性代数——从标量到高维数据立方体
  14. 14 线性代数(十四):随机矩阵理论——混沌中的秩序
  15. 15 线性代数(十五):机器学习中的线性代数——从 PCA 到推荐系统
  16. 16 线性代数(十六):深度学习中的线性代数——从全连接到 Transformer
  17. 17 线性代数(十七):计算机视觉中的线性代数——从像素到三维重建
  18. 18 线性代数(十八):前沿应用与总结——量子计算、GNN、大模型,与十八章回望

读有所得?

GitHub 关注我 → 新文周更

GitHub