共计 1429 个字符,预计需要花费 4 分钟才能阅读完成。
1. AdamW 的革新意义
在 Transformer 架构主导的时代,AdamW 已成为训练深度神经网络的默认优化器。相比原始 Adam,其最关键的改进在于正确处理了权重衰减(weight decay)与 L2 正则化的关系。原始 Adam 将 weight decay 与梯度更新耦合,导致实际衰减量受自适应学习率影响;而 AdamW 通过解耦这两者,使权重衰减真正作用于参数本身,大幅提升了超参数稳定性。
2. 核心参数技术解析
2.1 epsilon 的参数影响
数学上,AdamW 的梯度更新公式为:
$$\theta_{t} = \theta_{t-1} – \eta\cdot\frac{\hat{m}t}{\sqrt{\hat{v}_t} + \epsilon} – \eta\lambda\theta$$
其中 $\epsilon$(默认 1e-8)的作用是防止除零错误,但对稀疏梯度场景尤为重要:
- 当 $v_t$ 极小时,$\epsilon$ 会主导分母,抑制参数更新幅度
- 文本等稀疏数据建议调大到 1e-6,图像数据保持默认即可
2.2 Weight decay 与 L2 正则化的本质差异
通过梯度更新路径可视化对比可见:
- L2 正则化会改变损失函数梯度方向(红色箭头)
- Weight decay 始终保持轴向衰减(蓝色箭头)

3. PyTorch 实现模板
import torch
from torch.optim import AdamW
# 带 warmup 的训练循环
def train(model, train_loader, epochs=100):
optimizer = AdamW(model.parameters(),
lr=5e-5, # 基础学习率
betas=(0.9, 0.999), # 动量参数
weight_decay=0.01, # 推荐 0.01-0.1
eps=1e-8)
scheduler = torch.optim.lr_scheduler.LambdaLR(
optimizer,
lambda step: min(step/1000, 1) # 1000 步 warmup
)
for epoch in range(epochs):
for batch in train_loader:
optimizer.zero_grad()
loss = model(batch)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0) # 梯度裁剪
optimizer.step()
scheduler.step()
4. 实战调优策略
4.1 学习率线性缩放法则
当 batch size 扩大 k 倍时:
- 基础学习率应同步扩大 k 倍
- warmup 步数也需相应增加
- 最大学习率不超过 1e-4(FP32)
4.2 早停策略联动技巧
- 监控验证集 loss 时,weight decay 应减半
- 早停触发后保存 EMA(指数移动平均)权重
- 最终预测使用 EMA 版本模型
5. 基准参数与未来方向
BERT/GPT 微调参考:
| 参数 | 推荐值 | 调整范围 |
|---|---|---|
| learning_rate | 3e-5 | 1e-5~5e-5 |
| weight_decay | 0.01 | 0.001~0.1 |
| warmup_steps | 10% 总步数 | 5%~20% |
开放性问题:
- 在千亿参数模型中,AdamW 的内存占用成为瓶颈,LAMB 等优化器是否更适合?
- 能否根据训练进度动态调整 weight decay 强度?例如前期大衰减后期微调
通过系统掌握 AdamW 的参数机理,配合本文的实践策略,可使模型训练稳定性显著提升。建议读者在具体任务中先使用基准参数,再逐步微调获得最优效果。
正文完
