基础篇

F17|微积分只学用得上的部分:导数、梯度与链式法则

基础篇约 2.4 千字1 组分步图解

从具体对象与小例子开始,理解计算过程与适用条件。

本章目录
动态图解 · F17

梯度像坡度,学习率像迈步大小

为什么“梯度下降”有时让参数增大?

想象你站在损失曲线上,想往低处走。梯度给的是当前局部坡度;更新用它的相反方向。坡度为负时,往右走会更低,所以减去负梯度使参数增加。它只保证足够小的局部方向信息,不保证任意大一步都正确。

损失衡量当前预测偏离目标的数。
梯度参数轻微增加时损失的局部变化率。
学习率沿更新方向迈多大一步的系数。

输入与适用条件:沿用主算例x=2、目标4、w=1、平方误差损失。前三帧学习率0.2;最后一帧明确重置w=1并只改学习率为0.6。

1 / 4 · 预测偏小,但参数还没变

第1步,共4步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

梯度像坡度,学习率像迈步大小:预测偏小,但参数还没变w=1预测=2损失=2参数 w损失 L

x=2,目标4,初始w=1,因此预测2,损失2。先有可测的误差,才谈如何更新。

w=1.0;L=2.0

L=0.5×(2w−4)²;dL/dw=(2w−4)×2

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

需要系统地调整大量参数,而不是逐项猜一个新数。

怎样实现

前向算损失,反向传播求梯度,优化器更新,然后重新前向核验。

可能的代价与误解

过大步长、错误梯度或错误累计方式都可能让损失上升;降低训练损失不等于提升未见数据表现。

如何判断是否做对

这里基准损失2→0.08;大步长反例2→3.92,并用有限差分核对梯度−4。

导数是在问:稍微改一下输入,结果怎样变

对f(x)=x²,x=3时结果9。把x改到3.01,结果9.0601;结果增加0.0601,输入增加0.01,比例约6.01。

当改动越来越小时,这个比例趋近6,称为f在x=3处的导数。公式df/dx=2x表达“x平方对x的局部变化率”。它不是新的输入变量,也不是直接把f除以x。

局部很重要:在3附近的变化率,不代表把x从3变100还能用同一个斜率精确预测。

参数训练为什么需要变化率

模型给出预测,我们用一个数衡量它离目标多远,叫损失loss。训练希望找到能降低损失的参数。梯度告诉我们:每个参数小幅增加时,损失会往哪个方向变、多快变。

只有一个参数时就是导数;很多参数时,把对各参数的局部变化率排在一起叫梯度(gradient)。符号∂L/∂w表示只改变w、其余参数暂时保持不变时损失L的变化率。

用一个参数手算一次完整更新

模型预测=w×x,给x=2,目标y=4,初始w=1。预测为2。定义损失L=0.5×(预测−目标)²,得到0.5×(-2)²=2。

现在沿链条算变化率:

w -> 预测=w×2 -> 差值=预测−4 -> 损失=0.5×差值²
损失对预测的变化率 = 预测−4 = -2
预测对w的变化率    = x = 2
损失对w的变化率    = -2×2 = -4

这就是链式法则:每一小段的变化率相乘,把影响传回前面的参数。

设学习率η=0.2,即每次沿梯度方向调整多大一步。采用最简单的梯度下降:

w新 = w旧 − η×梯度 = 1 − 0.2×(-4) = 1.8
新预测 = 1.8×2 = 3.6
新损失 = 0.5×(3.6−4)² = 0.08

损失从2降到0.08。注意梯度为负,减去负数使w增加;“梯度下降”不是说每个参数都减小。

反向传播与优化器不是同一个步骤

反向传播backpropagation按计算依赖反向计算各参数梯度;优化器optimizer拿到梯度后按规则更新参数。运行backward并不必然已经完成参数更新。

计算图是一份记录哪些运算产生哪些结果的依赖关系。自动求导系统依据这份关系应用已知导数规则,不是对每个参数实际试无数次微小扰动。

同一个参数被多处使用时,各使用路径对总损失的影响要合并。如果代码意外切断了计算图,或忘记清除上轮累积梯度,梯度可能不符合本次训练意图。

有限差分怎样核对解析梯度

可以近似计算[L(w+ε)−L(w−ε)]/(2ε),其中ε是很小正数,比较它与反向传播得到的梯度。这叫有限差分检查。

它适合小规模调试,不适合为十亿参数逐个计算。ε太大,近似不够局部;太小,浮点舍入误差变重要。ReLU在折点处也要特别处理。因此“两个数不完全一样”不必然是错,要选合理输入与容差。

为什么会梯度消失或爆炸

链条上乘了很多小于1的变化率,传回去可能越来越小;乘了很多大于1的变化率,可能越来越大。网络结构、归一化、初始化和优化策略都影响这种现象。

这些是实际计算与数值问题,不是“模型懒得学习”。认识这一点,再读更深的Attention反向推导和训练稳定性,才知道公式试图解决什么。

运行示例 · F17

算一次梯度,再看损失是否真的下降

输入与条件。这是独立的训练算例,不沿用本节前面“目标y=4、损失含0.5”的示例条件。这里模型为 y=w×2,希望y=6;初始w=1。损失明确设为 (y−6)²(不乘0.5),学习率0.1。

步骤与对象内部动作中间结果 / 新状态
1先前向y=1×2=2损失 (2−6)²=16。
2从损失对y求导2(y−6)得到−8,说明y增大一点有利于降低损失。
3沿乘法传回wdy/dw=2梯度 dL/dw=−8×2=−16。
4更新参数w_new=1−0.1×(−16)w变2.6。
5重新前向y=5.2新损失 (5.2−6)²=0.64,确实比16小。

把过程连起来。反向传播求“改哪里、往哪边改”的局部信息;优化器执行参数更新。两者不是同一动作。

边界与反例。换太大的学习率可能越过最优点使损失变大,本例下降不是所有步都下降的保证。

依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。

课后自检

自检 1

梯度为-4,使用w←w−0.1×梯度,会增加还是减少w?

查看参考答案收起参考答案
增加0.4。梯度的符号指向损失上升方向,下降更新取相反方向。
自检 2

反向传播算出梯度后,参数一定已改变吗?

查看参考答案收起参考答案
不一定。还需要执行优化器更新;计算梯度与修改参数是两个动作。

机制依据:[F-CALC][F-AUTOGRAD]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。