常见超参数类型:学习率、批量大小、优化器选择

模型训练就像调一杯鸡尾酒。超参数就是配方里的比例。

太多、太少,味道都不对。我刚开始做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翻倍,学习率也可以翻倍。不过这是经验法则,不是铁律。

注意:批量大小改变会影响BN层的统计量。如果训练时batch size很小,BN的表现会不稳定。可以改用LayerNorm或GroupNorm。我见过不少项目在这上面栽坑。

3. 优化器选择:用什么策略更新权重?

优化器就是更新权重的具体算法。现在主流的有SGD、Adam、AdamW、RMSprop等。选哪个?很多时候取决于你的任务和数据。

优化器选择流程 (简化版) 开始选择优化器 小数据/快速原型 Adam (默认1e-3) 大模型/CV经典 SGD + Momentum NLP / Transformer AdamW + 权重衰减 ⚠️ 说明 • Adam系列收敛快,但最终精度有时不如SGD。 • 调优时间紧张:直接用AdamW;追求极致精度:试试SGD。 黄金组合:AdamW + CosineLR + Warmup 适用于大部分现代深度学习和预训练模型

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. 实际调参组合建议

调参不是玄学,是个找规律的过程。我一般按照以下步骤来:

  1. 先固定优化器:新手老老实实用AdamW,lr=1e-4,和batch size=32。
  2. 跑一个小实验:看看loss曲线能不能降。如果满屏NaN,降低学习率。
  3. 调整batch size:如果显存够,尝试64或128。同时按比例调整学习率。
  4. 引入学习率衰减:Cosine Annealing是个好选择,不用纠结衰减率。
  5. 最后微调优化器参数:比如Momentum的beta值、Adam的epsilon等。
一个小技巧:用学习率范围测试(LR Range Test)找出最佳学习率区间。PyTorch有现成的lr_finder库。我习惯先让学习率从1e-7逐渐升到10,观察loss下降最快的区间,然后取中间值。

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合理吗?优化器选对了吗?哪怕只改对一条,损失下降的速度都会不一样。