导数、梯度与梯度下降
梯度汇集损失对所有参数的局部变化率,梯度下降沿反方向更新参数。
学习前需要掌握
背景与问题
假设用一条直线预测房价,权重决定面积每增加一个单位时预测值增加多少,偏置决定整条直线上下移动多少。模型开始时并不知道合适的参数;训练需要把“预测偏了多少”转成“下一步该怎样改参数”。
在参数较少时,可以画图、列举候选值,某些模型也能直接求解析解。但神经网络可能有数百万个参数,逐个尝试通常不可行。梯度下降利用损失函数的局部变化率,把每次试探变成一个有方向的更新。
概念定义
导数回答一个局部问题:输入只改变很小一点时,函数值大约怎样变化。对单个参数 w,导数为正表示向右增大 w 会让函数在附近上升,导数为负表示附近向右反而下降。
模型有多个参数时,分别对每个参数求偏导,并按固定顺序组成梯度向量。这里其他参数保持不变;某一个偏导不是“所有参数一起变化”的结果。
梯度下降先在当前参数处计算梯度,再沿其反方向移动。它优化的是选定的训练目标;训练损失降低并不自动代表验证集表现提高。
直观理解
可以把损失曲面想成山坡,参数是当前位置。梯度提供脚下的局部坡向,学习率像每次迈出的步幅。坡度方向正确,步子过大仍可能跨过谷底,甚至越走越远。
“反方向”需要和导数的正负一起理解。例如梯度为 -6 时,更新式中减去一个负数,会让参数增大。这恰好是在当前点朝损失降低的方向移动,并不矛盾。
核心原理
一次标准更新包含两件不同的事:先用同一组旧参数计算损失和全部梯度,再用这些梯度更新参数。不能更新完第一个权重后,未经说明就用新权重重新计算第二个权重的梯度,否则实现的已不是同一个同步更新过程。
梯度只描述附近的变化。非凸目标可能出现局部极小值、鞍点或平坦区域;即使梯度很小,也要结合损失曲线、验证指标和参数变化判断训练是否合适。
批量梯度下降使用全部训练样本计算一次梯度;随机梯度下降使用单个样本,小批量方法使用一批样本。后两者的更新可能有噪声,因此不能要求每一步训练损失都严格下降。
特征尺度也会影响轨迹。如果一个特征以个位数计量、另一个以万为单位计量,损失曲面可能很狭长;标准化可以改善部分问题,但不能代替选择学习率、检查数据和使用合适的优化器。
数学表达
核心表达
梯度是局部信息,不保证一次到达全局最优;尺度、学习率和数值稳定性决定轨迹。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1明确输入、预测函数和要最小化的损失,记录一份初始损失作为比较基准。
- 2在训练数据上前向计算预测,再计算一个标量损失。
- 3用解析导数或自动微分计算当前参数的梯度,检查数值是否有限。
- 4使用同一次前向对应的梯度更新全部参数;自动微分框架中还需正确清理累计梯度。
代码对应位置
示例 1用 20 次梯度更新核对手算过程:完整定义损失、导数、初始参数与学习率,检查二次目标上的收敛。示例 2只改变学习率:收敛、震荡和发散:使用同一起点和迭代次数,观察学习率对本例轨迹的影响。
交互演示
学习率如何改变梯度下降
在确定性目标函数 上,从 出发。移动滑动条会重新运行全部迭代并实时绘制损失曲线。
当前步长能快速降低损失且没有明显震荡。
| 学习率 | 迭代次数 | 最终损失 | 状态 |
|---|---|---|---|
| 0.005 | 35 | 2.425e+1 | 下降缓慢 |
| 0.1 | 35 | 8.063e-6 | 快速稳定收敛 |
| 0.8 | 35 | 1.000e-8 | 发生震荡 |
| 1.05 | 35 | 3.870e+4 | 可能发散 |
滑动条改变什么
它改变更新式中的 。每次拖动都会从相同初始参数重新计算,因而曲线差异只来自学习率。
曲线为何变化
梯度为 。离最低点越远梯度越大;若学习率也很大,一步就可能跨过最低点。
与真实训练的关系
真实模型有更多参数和更复杂损失,但仍遵循“梯度给方向、学习率给步长”。合适范围要在训练曲线与验证集上确定。
手算:三次更新怎样接近最低点
用一个只有一个参数的构造目标练习更新过程:,起点 ,学习率 。它的导数是 ,最小值位于 。
| 更新前的 w | 当前梯度 | 更新后的 w | 损失(约) |
|---|---|---|---|
| 0 | -6 | 0 − 0.1 × (-6) = 0.6 | 5.76 |
| 0.6 | -4.8 | 0.6 − 0.1 × (-4.8) = 1.08 | 3.69 |
| 1.08 | -3.84 | 1.08 − 0.1 × (-3.84) = 1.464 | 2.36 |
表中损失保留两位小数,更新使用未舍入的参数。这里步子逐渐变小,是因为离最小值越近,梯度绝对值也越小。并不是代码额外设置了逐步衰减的学习率;本例学习率始终是 0.1。
把误差记为 ,可以直接推导 。因此,仅对这个二次目标,当 时误差逐步缩小; 会在两侧等幅来回跳, 会放大误差。不能把“1”当成所有模型的统一临界学习率。
上方互动图形默认从 -4 出发,而且学习率可调;本手算例与下面代码从 0 出发。比较图形和表格的具体数值前,要先对齐初始值和学习率,它们使用的是同一个更新公式。
计算与实现步骤
- 明确输入、预测函数和要最小化的损失,记录一份初始损失作为比较基准。
- 在训练数据上前向计算预测,再计算一个标量损失。
- 用解析导数或自动微分计算当前参数的梯度,检查数值是否有限。
- 使用同一次前向对应的梯度更新全部参数;自动微分框架中还需正确清理累计梯度。
- 记录训练损失、参数或梯度变化,并在独立验证数据上检查泛化表现。
- 达到迭代预算、变化阈值或早停条件时停止;最后才按既定协议评估测试集。
代码实现
示例 1
用 20 次梯度更新核对手算过程
example_01.py用途:完整定义损失、导数、初始参数与学习率,检查二次目标上的收敛。
w = 0.0
learning_rate = 0.1
for _ in range(20):
gradient = 2 * (w - 3)
w -= learning_rate * gradient
loss = (w - 3) ** 2
print(f"w={w:.4f}, loss={loss:.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
完整定义损失、导数、初始参数与学习率,检查二次目标上的收敛。
loss- 当前预测与目标之间的损失值。
gradient- 损失对参数的局部变化率。
w- 模型权重或当前待优化参数。
Step 1 · 1–7 行
计算损失对参数的梯度,对应数学表达中的 ∇J;梯度只给出局部变化方向。
w = 0.0
learning_rate = 0.1
for _ in range(20):
gradient = 2 * (w - 3)
w -= learning_rate * gradient
loss = (w - 3) ** 2
print(f"w={w:.4f}, loss={loss:.6f}")代码与数学原理
参数更新由当前梯度与学习率共同决定。
平方误差代码对应均方损失。
预期输出或运行结果
w=2.9654, loss=0.001196
常见错误 · 4 条
- 认为“梯度为负就应该减小参数”:应代入更新式检查符号,减去负梯度会增大参数。
- 把某个示例的学习率范围当成所有模型的通用安全范围;稳定步长依赖损失的曲率与尺度。
- 把训练损失变小等同于泛化变好,或只看最后一个批次的损失就宣布收敛。
- 遇到 NaN、无穷大或持续震荡时只增加迭代次数,却不检查数据、学习率、梯度和数值稳定性。
示例 2
只改变学习率:收敛、震荡和发散
example_02.py用途:使用同一起点和迭代次数,观察学习率对本例轨迹的影响。
for rate in [0.1, 0.8, 1.1]:
w = 0.0
for _ in range(4):
w -= rate * 2 * (w - 3)
print(f"eta={rate:.1f} w={w:.4f} loss={(w - 3) ** 2:.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用同一起点和迭代次数,观察学习率对本例轨迹的影响。
loss- 当前预测与目标之间的损失值。
w- 模型权重或当前待优化参数。
Step 1 · 1–5 行
计算当前预测误差,把模型表现压缩成可优化的标量损失。
for rate in [0.1, 0.8, 1.1]:
w = 0.0
for _ in range(4):
w -= rate * 2 * (w - 3)
print(f"eta={rate:.1f} w={w:.4f} loss={(w - 3) ** 2:.4f}")代码与数学原理
参数更新由当前梯度与学习率共同决定。
平方误差代码对应均方损失。
预期输出或运行结果
eta=0.1 w=1.7712 loss=1.5099 eta=0.8 w=2.6112 loss=0.1512 eta=1.1 w=-3.2208 loss=38.6984
常见错误 · 4 条
- 认为“梯度为负就应该减小参数”:应代入更新式检查符号,减去负梯度会增大参数。
- 把某个示例的学习率范围当成所有模型的通用安全范围;稳定步长依赖损失的曲率与尺度。
- 把训练损失变小等同于泛化变好,或只看最后一个批次的损失就宣布收敛。
- 遇到 NaN、无穷大或持续震荡时只增加迭代次数,却不检查数据、学习率、梯度和数值稳定性。
实际应用
- 线性回归
- 神经网络
常见错误
- 认为“梯度为负就应该减小参数”:应代入更新式检查符号,减去负梯度会增大参数。
- 把某个示例的学习率范围当成所有模型的通用安全范围;稳定步长依赖损失的曲率与尺度。
- 把训练损失变小等同于泛化变好,或只看最后一个批次的损失就宣布收敛。
- 遇到 NaN、无穷大或持续震荡时只增加迭代次数,却不检查数据、学习率、梯度和数值稳定性。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。