AI 学习课程 · 数学补充课

向量与矩阵求导

你已经会标量求导,也会矩阵乘法。这节课只搭中间的桥:先看“谁对谁求导”和结果形状,再用一个全连接层推导 ∂L/∂W、∂L/∂x,最后连接到反向传播。

梯度雅可比矩阵外积批次梯度数值差分核对

01 / 先理解为什么要求导

导数是在预测:稍微改一点,结果会怎样变

你熟悉的标量导数已经表达了这个意思。例如 f(w)=w²,在 w=3 时 f′(3)=6:把 w 增加很小的 0.01,f 大约增加 6×0.01=0.06。实际从 9 变成 9.0601;导数给的是当前位置附近的一阶近似。

向量和矩阵求导没有改变这件事。只是现在有很多个可以改动的数,也可能有很多个输出。导数负责把“输入的小变化”换算成“输出的小变化”。在神经网络里,矩阵的每个元素都是一个可调整的权重,矩阵梯度就是每个权重对损失的局部影响表。

三个常见问题,对应三种结果

一个结果,很多输入

问题:把向量 x 的每个分量稍微改动,标量损失 L 会变多少?

定义:把所有偏导排成梯度 (n,)。

L(x+Δx) ≈ L(x) + ∇L · Δx

梯度与改变量做点积,预测损失变化。

很多结果,很多输入

问题:输入向量 x 有一点变化时,输出向量 y 的每个分量怎样变?

定义:所有输出对所有输入的偏导组成雅可比矩阵 (m,n)。

y(x+Δx) ≈ y(x) + JΔx

雅可比像一个局部线性变换,把输入变化映射为输出变化。

一个结果,矩阵参数

问题:把权重矩阵 W 的每个格子稍微改动,损失会变多少?

定义:每格的偏导组成与 W 同形的梯度 (m,n)。

ΔL ≈ Σᵢⱼ (∂L/∂Wᵢⱼ)ΔWᵢⱼ

负梯度告诉优化器该怎样同时调整整张权重表。

一句话记忆:梯度预测一个标量怎样变;雅可比预测一个向量怎样变;矩阵梯度告诉训练器每个参数该往哪个方向改。
本课采用的约定:梯度与自变量形状相同;雅可比矩阵的“行对应输出、列对应输入”。不同教材可能使用转置约定,看到公式时先检查形状,不要只凭记忆。

02 / 一个标量如何随多个数变化

梯度把所有偏导排在一起

令 L(x₁,x₂)=x₁²+2x₂²。你会分别求两个标量偏导:

∂L/∂x₁ = 2x₁  ∂L/∂x₂ = 4x₂

把它们按 x 的顺序排在一起,就是梯度:

∇L = [2x₁, 4x₂]
二维损失曲面俯视图上的梯度椭圆是等损失线,红色箭头是梯度,绿色箭头是负梯度下降方向。∇L:上升最快−∇L:下降方向

例子:让梯度预测一次小改动

假设准备把当前位置改成 x+Δx。梯度不必重新完整计算函数,就能预测损失大约变化 ∇L·Δx。把改动调大、再调小,比较预测和真实变化。

改动越小,一阶预测通常越准确。梯度不是“最终移动量”;训练器会选择 Δx=−η∇L,用学习率 η 控制步长。

03 / 多个输出对多个输入

雅可比矩阵就是一张偏导表

雅可比矩阵的意义不是“把偏导摆好看”,而是用一个矩阵把输入的小变化换算成输出的小变化:Δy≈JΔx。第 j 列直接回答“只改变第 j 个输入时,所有输出如何变化”。

设 x=[x₁,x₂],y=Wx+b,其中 W 有 2 行 2 列:

y₁y₂=12−13x₁x₂+01

展开后 y₁=x₁+2x₂,y₂=−x₁+3x₂+1。每行对应该输出对所有输入的偏导:

J = ∂y/∂x = [ [∂y₁/∂x₁, ∂y₁/∂x₂], [∂y₂/∂x₁, ∂y₂/∂x₂] ] = W

例子:只推动一个输入,看看两个输出怎样动

本例是线性函数,所以 Δy=JΔx 完全相等。非线性函数中它是当前位置附近的近似,而且雅可比会随输入变化。

04 / 训练真正需要的形式

先把向量输出变成标量损失,再对参数求导

矩阵 W 可以看成一张参数表。∂L/∂Wᵢⱼ 的定义是:只把第 i,j 个参数增加一个极小量,其余参数不动时,损失变化量与这个极小量的比值。把每一格的结果放回原位置,就得到矩阵梯度。

∂L/∂Wᵢⱼ = limε→0 [L(W中只有Wᵢⱼ增加ε) − L(W)] / ε

直接写“向量 y 对矩阵 W 求导”会得到三维对象,很难使用。训练最终有一个标量损失 L,因此通常直接求 ∂L/∂W:它与 W 同形,每一格就是对应权重的局部敏感度。

输入 x(3,)
→
y = Wx+b(2,)
→
e = y−t(2,)
→
L = ½‖e‖²标量
W =1−120.51−1x =21−1b =01t =02
y = Wx+b = [−1,4]  e = y−t = [−1,2]  L = ½(1+4) = 2.5
要求的梯度公式本例结果形状
∂L/∂We xᵀ[[-2,-1,1],[4,2,-2]](2,3)
∂L/∂be[-1,2](2,)
∂L/∂xWᵀe[0,3,-4](3,)

第 i 个输出为 yᵢ=ΣⱼWᵢⱼxⱼ+bᵢ。损失对 yᵢ 的偏导是 eᵢ。

∂L/∂Wᵢⱼ = (∂L/∂yᵢ)(∂yᵢ/∂Wᵢⱼ) = eᵢxⱼ

因此梯度矩阵第 i,j 格就是 eᵢxⱼ,把所有格子合起来便是 e xᵀ。

∂L/∂xⱼ = Σᵢ(∂L/∂yᵢ)(∂yᵢ/∂xⱼ) = ΣᵢeᵢWᵢⱼ

这正是 Wᵀe 的第 j 个分量。

权重 Wᵢⱼ 连接“输入 xⱼ”和“输出 yᵢ”。它的梯度同时需要两条信息:

  • eᵢ:第 i 个输出收到多大的上游梯度;
  • xⱼ:这条连接当时接收到多大的输入。

把每个输出信号与每个输入值两两相乘,刚好形成一个 (输出数, 输入数) 的表,这就是外积 e xᵀ。

例子:只拧动权重矩阵中的一个“旋钮”

选择一个权重并改变一点。矩阵梯度对应位置的数字乘改变量,会预测损失怎样变化。负梯度表示增加这个权重会让损失下降;正梯度表示增加它会让损失上升。

最可靠的检查:W 是 (2,3),所以 ∂L/∂W 也必须是 (2,3)。如果得到 (3,2),通常是外积次序或转置写反了。

05 / 从一个样本到一批样本

PyTorch 的 weight 为什么需要转置

PyTorch 把 nn.Linear(in,out).weight 存成 (out,in)。一批输入 X 的每行是一个样本,所以前向是:

X (B,in) @ weight.T (in,out) + b (out,) → Z (B,out)

设上游梯度 G=∂L/∂Z,它和 Z 同形。批次公式是:

梯度公式形状检查含义
∂L/∂weightG.T @ X(out,B) @ (B,in) → (out,in)把每条样本的外积贡献加起来
∂L/∂bG.sum(axis=0)(B,out) → (out,)同一个偏置被一批中的所有样本共用
∂L/∂XG @ weight(B,out) @ (out,in) → (B,in)把梯度继续传向上一层
如果损失使用批次平均值,G 中已经包含除以批次大小的因子;如果损失使用求和,则没有这个因子。二者方向相同但大小不同。

06 / 不建立巨大的导数矩阵

反向传播是在传递“上游梯度”

考虑 z=Wx+b、h=ReLU(z)、L=½‖h−t‖²。从右向左,每个节点只回答:“已经收到 ∂L/∂输出,怎样算 ∂L/∂输入?”

L先得 ∂L/∂h
→
ReLU 反向乘 1[z>0]
→
线性层反向算 W、b、x 梯度
gh = h−t → gz = gh ⊙ 1[z>0] → ∂L/∂W = gzxᵀ,∂L/∂x = Wᵀgz

⊙ 表示逐元素乘法。虽然 ReLU 作为“向量对向量函数”有雅可比矩阵,但它是对角矩阵;实际程序直接做逐元素乘法,不会创建一张巨大的对角矩阵。

不要把前向和反向混在一起:前向用参数算预测与损失;反向不重新预测,而是把损失对各中间量的影响从后向前传播。

07 / 先理解结果,不要求背

softmax 的完整导数与常用化简

softmax 的每个输出都依赖所有输入,因此它的雅可比不是单纯的逐元素导数。若 p=softmax(z):

∂pᵢ/∂zⱼ = pᵢ(δᵢⱼ−pⱼ) ,也可写成 J = diag(p)−ppᵀ

与单个样本的交叉熵 L=−Σᵢyᵢlog pᵢ 合起来后,对 logits 的梯度会化简:

∂L/∂z = p−y

这不是“softmax 的导数就是 p−y”。p−y 是 softmax 与交叉熵组合后的结果。

以后再学的内容
  • Hessian:标量对向量的二阶偏导矩阵;
  • 矩阵微分与迹技巧:更紧凑地推导复杂公式;
  • 特征值、SVD 与低秩分解:在 PCA 和模型压缩中按用途学习。

08 / 手推之后让代码检查

数值差分是你的公式验算器

如果把矩阵中某个元素 Wᵢⱼ 增加和减少一个很小的 ε,就能近似该位置的偏导:

∂L/∂Wᵢⱼ ≈ [L(Wᵢⱼ+ε)−L(Wᵢⱼ−ε)] / (2ε)

打开或下载配套代码。它会核对向量梯度、雅可比、单样本与批次矩阵梯度,并和 PyTorch 自动求导比较。在项目根目录运行:

uv run python lessons/lesson-math-matrix-calculus.py

学习任务

  1. 先不运行代码,手算页面中的 ∂L/∂W、∂L/∂b 和 ∂L/∂x。
  2. 给每个公式写出形状,确认矩阵乘法可以执行。
  3. 运行配套程序,比较解析梯度、数值差分和 PyTorch 结果。
  4. 把损失从求和改为平均,解释梯度数值发生了什么变化。

09 / 检查是否真正理解

六道自测题

1. 在某点 ∇L=[3,−2],它主要表达什么?
2. 标量损失 L 对形状为 (3,4) 的 W 求导,结果形状是?
3. y=Wx+b,W 是 (2,3),x 是 (3,),y 对 x 的雅可比形状是?
4. 单样本线性层中 e 是 (out,),x 是 (in,),∂L/∂W 是?
5. 批次中偏置梯度为什么沿批次维求和?
6. ∂L/∂z=p−y 是什么的组合结果?