Adam、AdamW介绍,以及AdamW优势
本篇博客是对 Adam、 AdamW的详细介绍,包含什么是Adam、AdamW,以及它们之间的优化差异和 AdamW 的优势。
一、Adam 优化器介绍
1. 原理
Adam(Adaptive Moment Estimation)是一种常用的自适应优化算法,结合了:
Momentum(动量):利用过去梯度的指数加权平均来加快收敛;
RMSProp:通过梯度平方的指数平均值自适应调整学习率。
2. 参数更新公式
设当前参数为 θ,当前梯度为 gt:
m_t = β₁ * m_{t-1} + (1 - β₁) * g_t # 一阶矩(动量)
v_t = β₂ * v_{t-1} + (1 - β₂) * g_t^2 # 二阶矩(方差)
m̂_t = m_t / (1 - β₁^t) # 偏差修正
v̂_t = v_t / (1 - β₂^t)
θ = θ - α * m̂_t / (√v̂_t + ε) # 参数更新
3. 优点
自适应学习率;
收敛速度快;
适用于稀疏梯度的场景;
不太依赖学习率调参。
二、Adam 的局限(关于正则化)
Adam 在实现 L2 正则化(即权重衰减)时存在问题:
在 Adam 中,L2 正则项是加入 loss 后参与梯度计算的。但由于 Adam 的梯度会被缩放(平方根、动量修正等),正则项也会被错误地缩放,导致其效果变弱或不稳定。
结果:
正则效果受干扰;
泛化能力下降;
难以有效控制模型复杂度。
三、AdamW 优化器介绍
AdamW("W" 表示 Weight Decay)是对 Adam 的一个改进,提出者是 Loshchilov & Hutter(2019)。
1. 改进点:正则项与梯度解耦
AdamW 并不是将权重衰减加入到梯度中,而是 在梯度更新之外,直接对参数做衰减。
更新公式:
θ = θ - α * (Adam 更新) - α * weight_decay * θ
而不是 Adam 的:
θ = θ - α * (Adam 更新 + weight_decay * θ)
2. 优势
项目 | Adam | AdamW |
---|---|---|
权重衰减实现 | 作为正则项加进 loss 中,参与梯度 | 与梯度无关,独立进行权重衰减 |
对梯度缩放敏感性 | 是,正则项受缩放影响 | 否,正则项直接作用于参数更新 |
正则稳定性 | 较差 | 较好 |
泛化能力 | 相对较弱 | 更强,适合训练大型模型 |
实际应用(如 BERT、GPT) | 很少使用 | 默认优化器(如 Hugging Face 默认设置) |
四、AdamW 的优势总结
正则项有效:不会因梯度缩放而失效;
训练更稳定:尤其在 Transformer 等大模型上;
提升泛化能力:减少过拟合,提升在验证/测试集的表现;
更好的收敛性能:尤其在训练深层网络时;
广泛应用:几乎所有 NLP 预训练模型(BERT、GPT、T5 等)都使用 AdamW。
五、小结
Adam 适合初学者,结构简洁,自适应效果好;
AdamW 是更专业的改进版本,处理正则更合理;
对于实际任务,特别是需要正则化控制模型复杂度的任务,推荐使用 AdamW;
PyTorch 中可直接使用
torch.optim.AdamW
,或transformers.AdamW
。