常见超参数类型:学习率、批量大小、优化器选择
模型训练就像调一杯鸡尾酒。超参数就是配方里的比例。
太多、太少,味道都不对。我刚开始做AI时,觉得模型一跑就完事。结果呢?loss曲线像心电图一样上蹿下跳。后来才明白——超参数没选对。
这一章我们就聊三个最核心的超参数:学习率、批量大小、优化器。
1. 学习率:步子迈多大?
学习率控制着参数更新的步长。说白了就是——每次反向传播后,参数朝梯度方向走多远。
- 太大:loss直接飞了,模型震荡不收敛。
- 太小:迈着碎步,训练慢得让人怀疑人生。
- 合适:loss稳步下降,收敛速度快且稳定。
我曾经调一个图像分类模型,学习率设了0.1。结果前两步loss就变成NaN。吓我一跳。后来改成0.001,立马正常了。
- Adam优化器:默认 1e-3,大多数任务可以从这里起步。
- SGD优化器:一般 0.01~0.1,需要搭配学习率衰减。
- 迁移学习:通常用更小的学习率,比如 1e-4~1e-5。
学习率的设置还有其他技巧。比如说warmup——先小步走,再正常走。我习惯用线性warmup,前5%的step让学习率从0线性增加到目标值。这样能避免一开始的抖动。
# PyTorch 示例:带warmup的学习率调度器
import torch.optim as optim
from torch.optim.lr_scheduler import LambdaLR
optimizer = optim.Adam(model.parameters(), lr=1e-3)
def warmup_lambda(step):
warmup_steps = 500
if step < warmup_steps:
return step / warmup_steps
return 1.0
scheduler = LambdaLR(optimizer, lr_lambda=warmup_lambda)
2. 批量大小:一次看多少样本?
批量大小(batch size)决定了一次forward/backward处理多少样本。这也是个让人头疼的参数。
- 大batch:更稳定的梯度估计,但容易收敛到sharp minima(尖锐极小值)。
- 小batch:噪声大,反而可能跳到更好更平坦的谷底。但训练速度变慢。
- 超大batch:可能直接崩掉,因为梯度方差太小。
我有一个项目要做语义分割,显存只够batch size=4。我当时很担心收敛不好。结果发现小batch配合合适的优化器,效果居然比batch=32还好。真的有意思。
| 批量大小 | 优缺点 | 适用场景 |
|---|---|---|
| 1~16 | 高频更新,泛化好;但噪声大,训练波动 | 小模型、显存受限、需要更好的泛化 |
| 32~256 | 平衡稳定与速度,最常用范围 | 多数CV/NLP任务通用 |
| 512以上 | 需要大显存,可能降低模型性能 | 大规模分布式训练(需调整学习率) |
调整批量大小时,有个规律:学习率与批量大小成正比。比如你batch翻倍,学习率也可以翻倍。不过这是经验法则,不是铁律。
3. 优化器选择:用什么策略更新权重?
优化器就是更新权重的具体算法。现在主流的有SGD、Adam、AdamW、RMSprop等。选哪个?很多时候取决于你的任务和数据。
4. 常见优化器对比
下面这张表格整理了我个人常用的几个优化器。你可以把它当作速查手册。
| 优化器 | 核心特点 | 推荐学习率 | 适用场景 |
|---|---|---|---|
| SGD + Momentum | 经典,收敛稳定,泛化能力好 | 0.01~0.1 | 图像分类、目标检测等CV任务 |
| Adam | 自适应学习率,快速收敛,调参少 | 1e-3~1e-4 | 快速原型、NLP基础模型 |
| AdamW | Adam + 正确权重衰减,更适合Transformer | 1e-3~1e-4 | BERT、GPT、ViT等预训练/微调 |
| RMSprop | 自适应学习率,对循环网络友好 | 1e-3~1e-4 | RNN/LSTM、强化学习 |
我个人踩过最深的坑就是——AdamW的epsilon参数。默认为1e-8,但在混合精度训练时,容易造成数值下溢。我建议将epsilon调到1e-7或1e-6,能减少NaN的出现。代码里这样设置:
optimizer = optim.AdamW(model.parameters(), lr=1e-4, eps=1e-7)
5. 实际调参组合建议
调参不是玄学,是个找规律的过程。我一般按照以下步骤来:
- 先固定优化器:新手老老实实用AdamW,lr=1e-4,和batch size=32。
- 跑一个小实验:看看loss曲线能不能降。如果满屏NaN,降低学习率。
- 调整batch size:如果显存够,尝试64或128。同时按比例调整学习率。
- 引入学习率衰减:Cosine Annealing是个好选择,不用纠结衰减率。
- 最后微调优化器参数:比如Momentum的beta值、Adam的epsilon等。
6. 避坑指南
每次带新人做项目,我都会提醒几个常见错误:
- 学习率太大导致loss溢出:如果你看到loss是inf或nan,第一步就是降低学习率。
- batch size太大导致OOM:建议从16开始,逐步增加,直到显存爆掉,再退回。
- 优化器参数乱改:我有一次把Adam的beta2设成了0.9,结果训练震荡得厉害。beta2默认0.999是有原因的。
- 忘记梯度裁剪:尤其是RNN和Transformer,梯度爆炸是常客。我习惯把max_norm=1.0作为必选项。
# 梯度裁剪示例
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
好了,超参数的三个核心就聊到这儿。下次你调模型时,不妨先问问自己——学习率合适吗?batch size合理吗?优化器选对了吗?哪怕只改对一条,损失下降的速度都会不一样。