Weight Decay(权重衰减)是深度学习中一个非常重要的超参数,用于防止模型过拟合、提升泛化能力。下面我们从直观理解、数学原理、实际作用和调参建议四个方面详细解释它的含义。
✅ 一、直观理解:什么是 Weight Decay?
你可以把它想象成:
"给模型一个惩罚机制:如果你的参数变得太大或太复杂,我就要罚你。"
这就像训练一个学生:
-
不仅要看他答题是否正确(损失小),还希望他用简洁的方法解题(参数不要太复杂)。
-
Weight Decay 就是鼓励模型"保持简单"的正则化手段。
✅ 二、数学定义:它是如何工作的?
1. 标准训练目标(无 weight decay)
最小化损失函数:
其中
是任务损失(如交叉熵)。
2. 加入 Weight Decay 后的目标
-
就是
weight_decay参数(例如 0.01) -
是所有可训练参数的 L2 范数平方
👉 这个额外项叫做 L2 正则化(L2 Regularization)
⚠️ 注意:在使用 AdamW 优化器时,weight decay 是独立施加在梯度更新之外的,与传统 Adam 中的 L2 正则不同,效果更干净有效。
✅ 三、实际作用:为什么需要它?
|------------|---------------------------|
| 作用 | 说明 |
| 🔹 防止过拟合 | 抑制模型将权重放大来"死记硬背"训练数据的行为 |
| 🔹 提升泛化性 | 让模型学到更平滑、更鲁棒的特征表示 |
| 🔹 稳定训练过程 | 特别是在大模型、大数据量训练中,避免参数爆炸或震荡 |
| 🔹 控制模型复杂度 | 相当于奥卡姆剃刀原则:"简单的解释更好" |
🎯 典型场景:
-
微调大模型(如 BERT、Qwen、LLaMA)时几乎 always 使用 weight decay
-
图像分类、NLP、多模态任务中广泛使用
✅ 四、常见默认值(参考)
|---------------------------------|-------------------|----------------------------|
| 模型类型 | 推荐 weight decay 值 | 备注 |
| Transformer 类(BERT, T5, Qwen 等) | 0.01 或 0.0 | 常见默认值为 0.01 |
| ViT / 视觉模型 | 0.05 ~ 0.3 | 更高以应对高维输入 |
| AdamW 优化器 | 推荐使用 0.01 | AdamW 专为分离 weight decay 设计 |
| 微调(Fine-tuning) | 0.01 ~ 0.1 | 可稍低避免破坏预训练知识 |
| 小模型 | 0.001 ~ 0.01 | 太大会导致欠拟合 |
📌 在你的命令中:
--weight_decay 未显式设置 → 使用默认值,通常是 0.01
✅ 五、Weight Decay vs L2 正则:有什么区别?
|------|--------------|-----------------------------|
| 对比项 | 传统 L2 正则 | AdamW / 显式 Weight Decay |
| 实现方式 | 损失函数中加入 | 单独对参数做衰减: |
| 效果 | 在自适应优化器中可能失效 | 更合理,真正实现"权重衰减" |
| 推荐 | ❌ 不推荐用于 Adam | ✅ 推荐使用 AdamW + weight decay |
💡 所以现代框架(如 Hugging Face Transformers、Swift)都推荐使用 AdamW 并开启 weight_decay,而不是依赖 loss 的 L2 正则。
✅ 六、如何选择合适的 weight decay 值?
|----------------------------------------------------|--------------------------------------------------|
| 方法 | 描述 |
| 📌 默认尝试 0.01 | 最常用的起点,适用于大多数情况 |
| 🔍 小范围搜索 | 如 [0.01, 0.1, 0.001],观察验证集表现 |
| 🔁 结合学习率调整 | 高 learning rate 可搭配中等 weight decay;低 lr 可适当降低 wd |
| 🧪 注意极端情况: • wd=0:容易过拟合 • wd 太大:模型学不会(参数被压得太小) | 需平衡 |
✅ 七、代码示例(PyTorch)
from torch.optim import AdamW
optimizer = AdamW(
model.parameters(),
lr=1e-5,
weight_decay=0.01 # ←← 关键参数
)
或者在 Hugging Face / Swift 中通过参数传入:
--weight_decay 0.01
✅ 总结一句话:
Weight Decay 是一种通过轻微"压缩"模型参数来防止过拟合的技术,相当于告诉模型:"不要把参数弄得太大,保持简洁!"
|----------------|--------------|------------------------------|
| 参数名 | 含义 | 推荐值 |
| weight_decay | 权重衰减值,控制正则强度 | 0.01(通用)、微调可试 0.0~0.1 |
✅ 在你的 GKD 训练任务中,如果没有指定,默认很可能就是 0.01,这是一个安全且有效的选择。