共计 2092 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要 AdamW 优化器
Adam 优化器在深度学习领域广泛应用,但它存在一个关键问题:权重衰减(L2 正则化)与自适应学习率机制耦合。这种耦合会导致权重衰减的效果受到当前参数梯度的影响,从而使得正则化的效果不稳定。

AdamW 优化器通过解耦权重衰减解决了这个问题。具体来说,它:
- 将权重衰减从梯度更新步骤中分离出来
- 直接将其应用于参数更新步骤
- 保持 Adam 优化器的其他特性不变
这种改进使得权重衰减的效果更加稳定可靠,特别是在使用较大学习率时。
关键参数解析
1. 学习率(lr)
学习率是最重要的超参数之一,控制着参数更新的步长。在 AdamW 中,学习率的设置需要考虑:
- 初始学习率通常设置在 $10^{-5}$ 到 $10^{-3}$ 之间
- 不同层可能需要不同的学习率
- 学习率可能需要随时间衰减
数学表达式:
$$\theta_t \leftarrow \theta_{t-1} – \eta \cdot \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon)$$
其中 $\eta$ 就是学习率。
2. betas 参数
betas 参数包含两个值($\beta_1$, $\beta_2$),分别控制:
- $\beta_1$: 一阶矩估计的衰减率(默认 0.9)
- $\beta_2$: 二阶矩估计的衰减率(默认 0.999)
这些值决定了梯度历史信息的保留程度。较大的值会使优化器更 ” 记忆 ” 过去的梯度信息。
3. eps 参数
eps($\epsilon$)是一个极小值(默认 1e-8),用于防止除以零的情况。虽然这个值很小,但在某些情况下调整它可以帮助稳定训练。
4. weight_decay
权重衰减系数,控制 L2 正则化的强度。在 AdamW 中:
- 典型值在 0.01 到 0.1 之间
- 可以针对不同参数组设置不同的值
- 通常不对 bias 参数应用权重衰减
参数配置策略
计算机视觉任务
- 初始学习率: 3e- 4 到 1e-3
- betas: (0.9, 0.999)
- weight_decay: 0.01 到 0.05
- 使用学习率 warmup
自然语言处理任务
- 初始学习率: 5e- 5 到 2e-4
- betas: (0.9, 0.999)
- weight_decay: 0.01
- 更长的 warmup 阶段
PyTorch 代码实现
import torch
from torch.optim import AdamW
# 模型定义
model = MyModel()
# 参数分组:对权重和 bias 应用不同的 weight_decay
params = [{"params": [p for n, p in model.named_parameters()
if "bias" not in n and p.requires_grad], "weight_decay": 0.01},
{"params": [p for n, p in model.named_parameters()
if "bias" in n and p.requires_grad], "weight_decay": 0.0}
]
# 优化器初始化
optimizer = AdamW(
params,
lr=3e-4, # 初始学习率
betas=(0.9, 0.999), # beta1 和 beta2
eps=1e-8, # epsilon
weight_decay=0.01 # 全局 weight_decay(会被分组设置覆盖)
)
# 学习率 warmup 实现
def warmup_lr_scheduler(optimizer, warmup_steps, current_step):
"""线性 warmup"""
if current_step < warmup_steps:
lr_scale = float(current_step + 1) / float(warmup_steps)
for param_group in optimizer.param_groups:
param_group["lr"] = lr_scale * param_group["initial_lr"]
常见问题与解决方案
1. 梯度爆炸
表现: 损失值突然变成 NaN
解决方法:
- 降低学习率
- 增加 gradient clipping
- 检查数据预处理
2. 过早收敛
表现: 训练早期验证指标就停止提升
解决方法:
- 增加学习率
- 减少 weight_decay
- 尝试不同的 betas 组合
3. 训练不稳定
表现: 损失值波动很大
解决方法:
- 增加 batch size
- 调整 eps 参数(如改为 1e-6)
- 使用更长的 warmup 阶段
实验对比
我们在 CIFAR-10 数据集上测试了不同参数组合:
| 学习率 | weight_decay | 最终准确率 |
|---|---|---|
| 1e-3 | 0.01 | 92.3% |
| 5e-4 | 0.01 | 91.8% |
| 1e-3 | 0.1 | 89.5% |
| 5e-4 | 0.001 | 91.2% |
结果表明,适中的学习率 (1e-3) 配合适度的 weight_decay(0.01)效果最好。
参数调试 checklist
- 初始学习率是否在合理范围内?
- 是否使用了 warmup?
- weight_decay 是否合理设置?
- 是否对 bias 参数禁用了 weight_decay?
- betas 参数是否需要调整?
- 训练过程中学习率是否需要衰减?
- 是否监控了梯度 norm?
- 是否尝试过不同的 eps 值?
通过系统地检查这些点,可以大大提高调参效率。记住,调参是一个需要耐心和实验的过程,保持记录和分析的习惯非常重要。
