跳转至

P2-4.4 为什么学习里需要微分

Section ID: P2-4.4 Version: v2026.09.14

损失很大这一事实,并不能告诉我们应该增大还是减小参数。微分说明当前参数发生微小变化时,损失会向哪一侧变化,以及变化有多敏感。基于梯度的学习反复利用变化率确定调整方向,并用学习率确定调整大小。

从预测到损失

考虑一个将输入乘以固定倍数来预测输出的小模型。输入为 x,需要学习的倍数是参数 w,预测值为 ŷ。上方的帽子符号 ^ 用于区分预测值与目标值。

\[ \hat y=wx \]

假设一条训练数据是 输入 x=1,目标 y=3。当前 w=2 时,预测为 2×1=2。数据中的目标保持不变,学习改变的是 w。

预测减去目标得到误差 2−3=−1。将误差的平方定义为损失,就能对预测偏高和偏低都赋予正值。

\[ L(w)=(\hat y-y)^2=(w\times1-3)^2=(w-3)^2 \]

因此当前损失是1。这个损失函数并不是突然给出的独立表达式,而是结合模型预测规则、目标值和误差评分规则的结果。实际训练通常对多条数据的损失取平均,这里用一条数据检查计算过程。

相同损失,相反的调整方向

w=2 和 w=4 时,预测位于目标3的两侧,损失都为1。损失概括了误差的大小,却不能区分调整方向。结合导数 L′(w)=2(w−3),就能看到区别。

当前 w 预测 损失 导数 减小损失的微小调整
2 2 1 −2 增大 w
4 4 1 2 减小 w
3 3 0 0 本例的最小值

从 w=2 移到 2.1,或从 w=4 移到 3.9,两种情况下损失都变为 0.81。反过来移到 1.9、4.1,损失就增大到 1.21。即使起始损失相同,导数的符号不同,调整方向也不同。

用学习率确定更新大小

最基本的梯度下降法,从当前值中减去导数乘以正学习率的结果。学习率(learning rate)是控制每次更新采用多少变化率信息的系数,下面用希腊字母eta η 表示。

\[ w_{\mathrm{new}}=w-\eta L'(w) \]

当 w=2、学习率 η=0.1 时,w_new=2−0.1×(−2)=2.2。减去负数使参数增大。新预测为2.2,新损失为 (2.2−3)²=0.64。如果从 w=4 出发,则减小到 4−0.1×2=3.8,损失同样为0.64。

反复更新时,要在改变后的参数处重新计算导数,而不是一直使用最初的 −2。从 w=2 开始更新三次,结果如下。

已更新次数 当前 w = 预测 当前损失 当前导数 下次更新量 −0.1×导数
0 2 1 −2 +0.2
1 2.2 0.64 −1.6 +0.16
2 2.36 0.4096 −1.28 +0.128
3 2.488 0.262144 −1.024 +0.1024

更新次数0表示训练前的状态,最后一行的更新量将用于第四次更新。预测逐渐接近目标3,损失和导数的绝对值逐渐减小。这里的 0.1 不是移动距离本身,它与导数相乘的结果才决定实际参数变化量。

方向正确,更新过大仍会失败

保持相同起点 w=2,只改变学习率。

学习率 η 新 w 新损失 结果
0.01 2.02 0.9604 略微减小
0.1 2.2 0.64 减小
0.5 3 0 对此函数一步到达最小值
1 4 1 越过到另一侧,损失不变
1.1 4.2 1.44 越过过远,损失增大

微分提供当前位置附近的变化信息。即使知道下降方向,移动过远也可能越过最小值,使损失增大。表中0.5的良好结果取决于这个函数的形状,并不意味着其他模型也适合相同的学习率。

计算梯度与更新参数

有多个参数时,用前一节的梯度代替单个导数。基本梯度下降法的向量形式如下。

\[ \mathbf w_{\mathrm{new}}=\mathbf w-\eta\nabla L(\mathbf w) \]

每个梯度分量用于更新对应的参数。深度学习经过多层计算得到损失,因此需要高效求出损失与各参数之间的变化率。反向传播(backpropagation)利用链式法则计算这些梯度。 链式法则是连接复合计算中各个变化率的微分规则。

优化器(optimizer)利用算出的梯度更新参数。 上式是最基本的方法,其他优化器也可能使用此前更新的信息等。不要把反向传播计算梯度的工作,与优化器更新参数的工作混为一谈。

下图展示同一个例子的第一次更新。用更新后的参数重新预测,再次计算损失与梯度,就形成反复学习的过程。

flowchart TD
  A["预测<br/>x = 1, w = 2 → ŷ = 2"]
  B["计算损失<br/>y = 3 → L = 1"]
  C["计算梯度<br/>L′ = 2 × (2 − 3) = −2"]
  D["更新参数<br/>η = 0.1 → w = 2.2"]
  A --> B --> C --> D
  D -->|"更新后重新预测"| A

使用变化率,而不是尝试所有数值

只有一个参数时,也可以把 w=0,1,2,3,4,5 全部代入并比较损失。每个参数都尝试这六个值,两个参数有 6²=36 种组合,十个参数有 6¹⁰=60,466,176 种组合。即使每个参数只比较六个离散候选值,组合数也会快速增长。

梯度利用当前位置的变化信息,而不枚举所有组合。反向传播利用中间计算结果,高效求出许多参数的梯度。但只凭当前位置的信息,不能保证找到全局最小值。

这里讨论的是使用微分的学习方法。并非所有AI学习都需要微分,也有不使用微分而搜索数值或选择规则的方法。

训练损失与新数据的表现

本例中,一条数据的损失持续下降。实际训练经常用一组数据,即小批量(minibatch),计算梯度。每次更新使用的数据可能不同,因此不能只期待损失每一步都平稳下降。

训练数据的损失变小,也不能保证对未见数据的预测更好,因为模型可能只拟合了训练中使用的数据。还需要在不参与参数更新的验证数据上检查表现。微分提供减小既定损失所需的信息,但损失和数据是否正确反映实际目标,需要另行判断。

练习:继续计算更新

从 w=4、η=0.1 开始,计算两次更新后的参数和损失。再比较第二次更新仍使用最初的导数2时,会得到什么数值。

计算与解释

第一次更新为 4−0.1×2=3.8。此时导数变为 2×(3.8−3)=1.6,所以第二次更新为 3.8−0.1×1.6=3.64,损失为 0.64²=0.4096。重复使用旧导数2会得到3.6,这与在当前位置计算的梯度下降更新不同。

检查清单

  • 能否根据预测规则和目标构建损失函数?
  • 能否说明相同损失也可能对应符号相反的导数?
  • 能否用学习率和导数计算新参数?
  • 能否解释为什么要在更新后的位置重新计算梯度?
  • 能否区分反向传播的计算工作与优化器的更新工作?
  • 能否区分训练损失下降与新数据表现改善?

来源与参考资料

确认日期:2026-09-14。数值示例与图示均为自行构建。