AdamW优化器 作者:马育民 • 2026-01-30 09:51 • 阅读:10002 # 介绍 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实现示例 ```python 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正则。 --- # 适用场景与优势 1. 预训练模型微调:权重衰减的稳定作用能有效防止过拟合,提升下游任务性能。 2. 复杂模型训练:如Transformer、大语言模型等,AdamW的正则化更可靠,泛化能力更强。 3. 数据有限场景:通过精准权重衰减抑制参数冗余,减少过拟合风险。 --- # 常见变体 AMSGrad(改进二阶矩更新,增强收敛稳定性)、AdamW with warm-up(学习率预热,缓解训练初期震荡)。 # 注意事项 权重衰减仅适用于权重参数,偏置(bias)与层归一化(LayerNorm)参数通常不衰减;学习率与权重衰减需协同调优,避免衰减过强导致欠拟合。 原文出处:http://www.malaoshi.top/show_1GW2hHFVe4hP.html