Adam和AdamW是深度学习中广泛使用的两种优化算法,它们的核心区别在于权重衰减(Weight Decay)的实现方式:
1. 对比表
特性 | Adam | AdamW (Adam with Weight Decay Decoupling) |
---|---|---|
权重衰减实现 | L2正则化(与梯度更新耦合) | 解耦的权重衰减(独立于梯度更新) |
参数更新公式 | 梯度中包含L2项 | 梯度中不包含L2项,单独处理权重衰减 |
正则化效果 | 受自适应学习率影响,可能不稳定 | 独立于学习率,更稳定的正则化 |
适用场景 | 简单任务、小规模数据 | 大规模预训练模型(如BERT、ViT) |
超参数敏感性 | 对学习率和权重衰减比例敏感 | 超参数更易调节 |
理论依据 | 传统L2正则化 | 解耦的权重衰减(更接近SGD的权重衰减) |
PyTorch版本 | torch.optim.Adam | torch.optim.AdamW |
2. 数学原理对比
Adam参数更新公式:
# 传统Adam(L2正则化耦合)
theta_t+1 = theta_t - lr * m_hat / (sqrt(v_hat) + eps)
其中:
m_hat = beta1*m + (1-beta1)*grad
v_hat = beta2*v + (1-beta2)*grad^2
grad = grad + wd * theta_t # L2正则化耦合在梯度中
AdamW参数更新公式:
# AdamW(解耦权重衰减)
theta_t+1 = theta_t - lr * (m_hat / (sqrt(v_hat) + eps) + wd * theta_t)
其中:
m_hat = beta1*m + (1-beta1)*grad # 原始梯度
v_hat = beta2*v + (1-beta2)*grad^2
3. 直观理解
用一个比喻解释它们的区别:
• Adam:把"体重控制"(权重衰减)和"运动计划"(梯度更新)混在一起制定,可能导致健身效果不可控。
• AdamW:先制定"运动计划",再单独规划"饮食控制"(权重衰减),两者互不干扰。
4. 实际影响示例
假设有以下场景:
lr = 1e-3
wd = 0.01
beta1 = 0.9
# 参数初始值
theta = 1.0
grad = 0.5
Adam的计算:
m = 0.9*0 + 0.1*(0.5 + 0.01*1.0) = 0.051
update = 0.051 / (sqrt(...)) ≈ 0.051
theta = 1.0 - 1e-3*0.051 ≈ 0.999949
AdamW的计算:
m = 0.9*0 + 0.1*0.5 = 0.05
update = 0.05 / (sqrt(...)) + 0.01*1.0 ≈ 0.05 + 0.01 = 0.06
theta = 1.0 - 1e-3*0.06 ≈ 0.99994
虽然结果相似,但在自适应学习率较大时,两者的差异会被放大。
5. 何时选择哪种优化器?
场景 | 推荐优化器 | 原因 |
---|---|---|
小规模图像分类(CIFAR-10) | Adam | 简单任务差异不大 |
BERT/GPT预训练 | AdamW | 需要精确控制权重衰减 |
对抗生成网络(GAN) | Adam | 动态平衡需要耦合更新 |
迁移学习(微调ImageNet模型) | AdamW | 防止微调时的过拟合 |
强化学习 | Adam | 通常不需要强正则化 |
6. 调参技巧
对于AdamW:
# 典型超参数设置(以ViT为例)
optimizer = AdamW(
params,
lr=3e-4, # 比Adam稍大
weight_decay=0.05, # 更激进的正则化
betas=(0.9, 0.999)
)
对于Adam:
optimizer = Adam(
params,
lr=1e-4, # 通常需要更小
weight_decay=1e-4, # 保守的正则化
betas=(0.9, 0.999)
)
7. 常见误区
-
误区:AdamW只是Adam的简单改进
• 事实:AdamW改变了优化问题的数学形式,更适合现代深度学习模型 -
误区:AdamW在所有场景都优于Adam
• 事实:在需要强耦合更新的场景(如GAN),传统Adam可能更合适 -
误区:权重衰减系数可以直接移植
• 事实:当从Adam切换到AdamW时,通常需要增大权重衰减系数3-10倍
8. 历史演进
- 2014:Adam提出(Kingma & Ba)
- 2017:发现Adam+L2的问题(Loshchilov & Hutter)
- 2019:AdamW被广泛采用(BERT、GPT-2)
- 2021:成为Transformer模型的标准优化器
建议
• 新手:从AdamW开始,使用默认参数
• CV任务:优先尝试AdamW(特别是ViT等模型)
• NLP任务:必须使用AdamW(对正则化敏感)
• 小规模实验:可以用Adam快速验证想法