介绍
AdamW是Loshchilov和Hutter于2019年提出的解耦权重衰减的Adam变体,核心改进是将权重衰减与梯度计算分离,直接作用于参数更新,解决了Adam中 L2正则化效果不稳定的问题,提升了正则有效性与模型泛化能力。以下从核心原理、算法步骤、关键特性、实现示例等方面详细说明。
关键特性对比
| 特性 | Adam | AdamW |
|---|---|---|
| 权重衰减方式 | 融入梯度计算 | 独立参数更新 |
| 正则稳定性 | 受梯度缩放影响,不稳定 | 直接作用参数,稳定 |
| 泛化能力 | 较弱 | 更强(尤其大数据/复杂模型) |
| 超参数敏感性 | 高(权重衰减效果波动) | 低(衰减效果可预期) |
| 适用场景 | 快速收敛优先 | 正则化与泛化优先(如微调预训练模型) |
超参数设置建议
- 学习率(lr):默认
1e⁻³,微调时常用5e⁻⁵~2e⁻⁴。 - 权重衰减(weight_decay):默认
1e⁻²,视觉/语言任务常用1e⁻⁴~1e⁻²,需根据模型大小调整。 - betas:默认
(0.9, 0.999),一般无需修改;噪声大的数据可适当降低β₁。 - eps:默认
1e⁻⁸,防止除零,保持默认即可。
PyTorch实现示例
import torch
import torch.nn as nn
from torch.optim import AdamW
# 定义模型
model = nn.Linear(10, 2)
# 初始化优化器
optimizer = AdamW(
model.parameters(),
lr=1e-3,
betas=(0.9, 0.999),
eps=1e-8,
weight_decay=1e-2 # 权重衰减系数
)
# 训练循环
criterion = nn.CrossEntropyLoss()
for inputs, labels in dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
代码中,weight_decay 直接指定解耦的权重衰减强度,无需手动在损失中添加L2正则。
适用场景与优势
- 预训练模型微调:权重衰减的稳定作用能有效防止过拟合,提升下游任务性能。
- 复杂模型训练:如Transformer、大语言模型等,AdamW的正则化更可靠,泛化能力更强。
- 数据有限场景:通过精准权重衰减抑制参数冗余,减少过拟合风险。
常见变体
AMSGrad(改进二阶矩更新,增强收敛稳定性)、AdamW with warm-up(学习率预热,缓解训练初期震荡)。
注意事项
权重衰减仅适用于权重参数,偏置(bias)与层归一化(LayerNorm)参数通常不衰减;学习率与权重衰减需协同调优,避免衰减过强导致欠拟合。