梯度下降收敛诊断
结合损失趋势、相对变化、梯度范数、耐心轮数和最大轮数判断优化是否稳定。
学习前需要掌握
背景与问题
运行固定 epochs 既可能提前停止,也可能浪费计算。某一轮变化小也可能只是震荡瞬间,因此需要阈值与 patience。
概念定义
收敛表示在当前模型、特征和优化设置下,参数更新带来的目标改善已经很小;它不等于模型泛化良好。
直观理解
不是看到车速慢一次就说已到终点,而是连续多次变化都很小,并确认没有发散或停在错误原因上。
核心原理
相对损失变化对不同损失量级更可比;梯度范数接近 0 是补充信号。训练和验证曲线还用于区分优化收敛与过拟合。
数学表达
相对损失变化
连续若干轮小于 tolerance 时可提前停止。
变量含义
ε防止分母为零的小常数。patience允许连续稳定或未改善的轮数。
计算步骤
- 1每轮记录训练损失。
- 2检查 loss 和参数是否有限。
- 3计算相对损失变化。
- 4可同时计算梯度范数。
代码对应位置
示例 1耐心机制判断稳定:避免一次偶然的小变化导致过早停止。
变量解释
| 变量 | 含义 |
|---|---|
ε | 防止分母为零的小常数。 |
patience | 允许连续稳定或未改善的轮数。 |
交互演示
学习率如何改变梯度下降
在确定性目标函数 上,从 出发。移动滑动条会重新运行全部迭代并实时绘制损失曲线。
当前步长能快速降低损失且没有明显震荡。
| 学习率 | 迭代次数 | 最终损失 | 状态 |
|---|---|---|---|
| 0.005 | 35 | 2.425e+1 | 下降缓慢 |
| 0.1 | 35 | 8.063e-6 | 快速稳定收敛 |
| 0.8 | 35 | 1.000e-8 | 发生震荡 |
| 1.05 | 35 | 3.870e+4 | 可能发散 |
滑动条改变什么
它改变更新式中的 。每次拖动都会从相同初始参数重新计算,因而曲线差异只来自学习率。
曲线为何变化
梯度为 。离最低点越远梯度越大;若学习率也很大,一步就可能跨过最低点。
与真实训练的关系
真实模型有更多参数和更复杂损失,但仍遵循“梯度给方向、学习率给步长”。合适范围要在训练曲线与验证集上确定。
计算与实现步骤
- 1
每轮记录训练损失。
- 2
检查 loss 和参数是否有限。
- 3
计算相对损失变化。
- 4
可同时计算梯度范数。
- 5
连续 patience 轮满足条件才停止。
- 6
设置最大轮数。
- 7
用验证曲线确认没有过拟合。
代码实现
示例 1
耐心机制判断稳定
example_01.py用途:避免一次偶然的小变化导致过早停止。
tolerance = 1e-8
patience = 10
stable_count = 0
relative_change = abs(old_loss - new_loss) / max(abs(old_loss), 1e-12)
stable_count = stable_count + 1 if relative_change < tolerance else 0
if stable_count >= patience:
print("梯度下降已经收敛")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
避免一次偶然的小变化导致过早停止。
Step 1 · 1–3 行
使用相对变化适配不同损失量级。
tolerance = 1e-8
patience = 10
stable_count = 0Step 2 · 5–6 行
计算当前预测误差,把模型表现压缩成可优化的标量损失。
relative_change = abs(old_loss - new_loss) / max(abs(old_loss), 1e-12)
stable_count = stable_count + 1 if relative_change < tolerance else 0Step 3 · 8–9 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
if stable_count >= patience:
print("梯度下降已经收敛")代码与数学原理
平方误差代码对应均方损失。
预期输出或运行结果
连续 10 轮相对变化小于 1e-8 后打印收敛提示。
常见错误 · 3 条
- 把训练收敛等同泛化成功
- 不设最大轮数
- 忽略 nan/inf
实际应用
- 手写梯度下降
- 早停诊断
- 优化器调试
常见错误
文档来源
02|数据预处理与特征工程原始文档
学习资料/learning_tech/02_preprocessing_feature_engineering.md- §7 判断梯度下降是否收敛
推荐学习资料
参考库不会生成虚假资源或无效外部链接。