优化器

内容与边界

本页是对一手 API 文档与原始论文的原创中文摘要。优化器定义“在已给定梯度后怎样更新参数”;它不能修复泄漏、错误标签、不可获得特征或不恰当的评测切分,也没有脱离任务的通用最优默认值。

关联笔记

先建立共同语言

对目标函数 ,最简单的梯度下降更新可写为:

其中 是参数, 是学习率。不同优化器主要改变梯度怎样平滑、缩放或与正则化组合;它们都仍依赖数据、loss、batch、数值精度和训练预算。

常见类别与适用问题

类别核心想法需要验证的取舍
SGD直接按当前梯度更新学习率、batch、数据尺度与收敛速度
SGD + momentum / Nesterov累积历史更新方向,降低局部震荡动量、学习率调度和不稳定/发散风险
Adam对一阶、二阶梯度矩做指数滑动估计并做偏差修正学习率、betas、数值稳定项与泛化表现
AdamW将 weight decay 与 Adam 的矩估计解耦decay 适用的参数、学习率调度与验证集收益
AdaGrad / RMSprop依历史梯度平方自适应缩放稀疏性、非平稳训练和具体框架实现

这张表是排查和实验的起点,不是选型配方。对同一个任务,数据量、预训练起点、模型结构、混合精度、batch 大小和调度器都可能改变结果。

Adam、AdamW 与 weight_decay 不要混为一谈

Adam 维护梯度及其平方的指数滑动估计,常见简写为 与 ,再用经偏差修正的量缩放更新。AdamW 则把参数衰减从这些矩估计之外单独施加;PyTorch 的 AdamW 文档明确描述为 weight decay 不累积进 momentum 或 variance。

因此,weight_decay 不能在所有优化器、所有框架中被不加区分地称为“就是 L2 正则”。查看当前实现的公式、参数组和默认值,尤其在迁移 checkpoint 或更换框架时。是否对 bias、归一化层或嵌入层施加衰减也属于模型和任务设计选择,应有验证证据,而不是照抄某个项目的参数组。

import torch
 
optimizer = torch.optim.AdamW(
    model.parameters(),
    lr=learning_rate,
    weight_decay=weight_decay,
)

这里的变量是待验证的实验配置,不是推荐常数。保存 checkpoint 时也应保存 optimizer.state_dict();它包含每个参数的优化状态,缺失时“恢复训练”不会等价于从中断点继续。

一个可复现的优化实验协议

  1. 先固定数据版本、切分单位、baseline、loss、主指标和训练预算;不要先按最终测试集挑 optimizer。
  2. 每轮只改少量有理由的变量,例如 optimizer、学习率或调度器,而不是同时换模型、增强和 batch。
  3. 记录 Python/框架版本、硬件、随机性设置、精度模式、batch、梯度裁剪、loss、学习率曲线和验证指标。
  4. 同时看训练损失、验证指标、错误样本和失败模式。训练 loss 下降而验证表现不变时,先排查数据、标签、泄漏、过拟合和指标对齐,再扩大参数搜索。
  5. 方案锁定后,再在封存测试集或新时间窗口上报告结果;保存模型、优化器、调度器、随机状态和配置,才能讨论恢复训练或可复现性。

常见误区

  • 把学习率当作一切:它很重要,但不替代正确数据边界和 loss/指标匹配。
  • 把默认值当推荐值:API 默认值服务于可用性,不是对你的模型和业务的实证结论。
  • 只看最后一次 loss:不同 reduction、batch 与数据范围会使 loss 量级不可直接横比。
  • 只保存模型权重:推理也许可以恢复,但训练轨迹、调度器和优化状态可能已经丢失。
  • 用训练集判断“哪个 optimizer 更好”:应在训练区内验证选择,并保留最终测试边界。

参考资料

核验日期:2026-07-22。接口、默认值和加速实现会随框架版本更新;运行前以正在使用的版本文档为准。