Adam 与 AdamW
Adam 用一阶/二阶矩自适应缩放,AdamW 解耦权重衰减。
学习目标
- 零数据梯度时隔离 AdamW 衰减
- Adam 的二阶矩就是梯度方差吗?
- 说明:自适应步长不等于无需调学习率;grad=None 与零梯度的更新行为也可能不同。
为什么需要这个概念
Adam 维护梯度一阶矩 m 与平方梯度二阶矩 v,进行偏差修正后更新;AdamW 在该更新之外直接按比例缩小权重,避免衰减项混入自适应矩估计。
学习前需要掌握
背景与问题
不同参数的梯度尺度可能相差很大,普通固定步长更新需要细致调节。Adam 利用历史梯度估计为各参数调整更新尺度,而 AdamW 进一步区分数据梯度与权重衰减。
概念定义
Adam 维护梯度一阶矩 m 与平方梯度二阶矩 v,进行偏差修正后更新;AdamW 在该更新之外直接按比例缩小权重,避免衰减项混入自适应矩估计。
直观理解
Adam 按每个参数过去的梯度量级调整步幅;AdamW 另外施加一个持续把参数拉向零的动作。
核心原理
一阶矩是梯度的指数移动平均,二阶矩是梯度平方的指数移动平均。初始矩为零会偏小,因此用与步数相关的因子修正。分母使用二阶矩的平方根和 epsilon,不能把 v 理解成严格的梯度方差。
经典耦合 L2 会先把衰减项加到梯度,再参与 m、v 的更新;AdamW 的衰减直接作用于参数,因此相同 weight_decay 数字不保证与 Adam 的 L2 相同效果。学习率仍然影响衰减幅度。
参数组可以为骨干、任务头、偏置和归一化设置不同规则,但应遵循验证过的训练配方。优化器状态包含矩和步数,恢复训练只加载模型参数会改变后续轨迹。
数学表达
核心公式
Adam 维护梯度一阶矩 m 与平方梯度二阶矩 v,进行偏差修正后更新;AdamW 在该更新之外直接按比例缩小权重,避免衰减项混入自适应矩估计。
变量含义
m一阶矩v平方梯度二阶矩
计算步骤
- 1数据梯度没有贡献。
- 2执行解耦缩放 2×(1−0.1×0.2)。
代码对应位置
示例 1零数据梯度时隔离 AdamW 衰减的最小验证:使用完整构造输入核对零数据梯度时隔离 AdamW 衰减,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
m | 一阶矩 |
v | 平方梯度二阶矩 |
完整数值示例
零数据梯度时隔离 AdamW 衰减
已知条件
- 参数初值为 2,数据梯度显式设为 0
- 学习率 0.1,weight_decay=0.2
计算步骤
- 数据梯度没有贡献。
- 执行解耦缩放 2×(1−0.1×0.2)。
计算结果
一次更新后参数为 1.96。
处理前后对比
- 自适应步长不等于无需调学习率;grad=None 与零梯度的更新行为也可能不同。
零数据梯度时隔离 AdamW 衰减
这个例子显式设置零梯度,而不是让 grad=None。PyTorch 优化器可能跳过没有梯度的参数,所以这两种状态不能混为一谈。
非零历史矩还会继续产生自适应更新,本例使用新优化器以隔离衰减。真实训练不能只根据参数变小就认定某次更新只有正则项。
计算与实现步骤
- 数据梯度没有贡献。
- 执行解耦缩放 2×(1−0.1×0.2)。
代码实现
示例 1
零数据梯度时隔离 AdamW 衰减的最小验证
example_01.py用途:使用完整构造输入核对零数据梯度时隔离 AdamW 衰减,输出只表示本例计算。
import torch
p = torch.nn.Parameter(torch.tensor(2.))
optimizer = torch.optim.AdamW([p], lr=0.1, weight_decay=0.2)
p.grad = torch.zeros_like(p)
optimizer.step()
print(f"parameter={p.item():.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对零数据梯度时隔离 AdamW 衰减,输出只表示本例计算。
Step 1 · 1–6 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
p = torch.nn.Parameter(torch.tensor(2.))
optimizer = torch.optim.AdamW([p], lr=0.1, weight_decay=0.2)
p.grad = torch.zeros_like(p)
optimizer.step()
print(f"parameter={p.item():.4f}")代码与数学原理
参数更新由当前梯度与学习率共同决定。
预期输出或运行结果
parameter=1.9600
常见错误 · 3 条
- Adam L2 等同 AdamW
- 固定 decay 适合全部
- 比较优化器用同一 lr
实际应用
- 训练稀疏或尺度差异较大的参数
- 用参数组设置解耦衰减
常见错误
- Adam L2 等同 AdamW
- 固定 decay 适合全部
- 比较优化器用同一 lr
常见问题
Adam 的二阶矩就是梯度方差吗?
不是,它估计梯度平方的移动平均,未减去均值平方;将其当成严格方差会误解分母的作用。
这个示例能说明什么边界?
自适应步长不等于无需调学习率;grad=None 与零梯度的更新行为也可能不同。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。