超参数全景:学习率、批次大小、正则化系数与网络结构参数
说到深度学习模型的训练,很多人一上来就调网络结构,折腾好几周,结果 loss 下不去。其实啊,真正决定模型能不能收敛、泛化好不好的,往往是那几个不起眼的超参数。我个人习惯把超参数比作汽车的调校参数——发动机再牛,油给大了也爆缸,油给小了跑不动。今天咱们就把四个最核心的超参数挨个捋一遍。
1. 学习率:训练步长的艺术
学习率大概是所有超参数里最敏感的一个。它决定了参数更新的步长——说白了就是每次朝着梯度方向走多远。步长太大容易跳过最优点,loss 直接震荡甚至炸掉;步长太小又走得慢,训到天荒地老也不收敛。
我在项目中遇到过一个问题:用 Adam 优化器训练一个文本分类模型,初始学习率设了 0.01,结果 loss 在前几个 epoch 下降很快,然后突然开始剧烈震荡。后来调成 0.001 并加了预热策略,训练曲线立马平滑了。
学习率的设置方式通常有几种:
- 固定学习率:简单粗暴,但很难兼顾收敛速度与稳定性。
- 学习率衰减:按 epoch 或 step 逐步降低,常见的有阶梯衰减和指数衰减。
- 预热策略:前几个 step 从很小的 LR 线性增加到目标值,能有效避免初期梯度爆炸。
- 循环学习率:让 LR 在上下界之间周期变化,有时能跳出局部最优。
我一般会先试 3e-4 这个值(Adam 的默认值),然后根据 loss 曲线的走势上下微调。如果 loss 下降太慢,就调大一点;如果震荡厉害,就调小。
2. 批次大小:吞吐量与稳定性的平衡
批次大小(batch size)影响两个关键指标:训练速度和梯度质量。批次越大,硬件利用率越高,但梯度更新次数少,模型容易陷入尖锐极小值;批次越小,梯度噪声越大,反而可能帮助泛化。
为什么小批次有时泛化更好?你想想看,小批次带来的梯度噪声相当于一种正则化,让模型不容易过拟合到训练数据的局部细节。我记得有一篇经典论文专门讨论过这个问题——极大批次训练需要配合学习率 warmup 才能收敛。
实际项目中怎么选?
- GPU 显存允许的前提下,先从 32 或 64 起步。
- 如果训练集很大(百万级),可以尝试 256 或 512。
- 显存不够时用梯度累积,效果等价于扩大批次。
我曾经在一个图像分割任务里把 batch size 从 8 调到 32,训练速度提升了将近 3 倍,但最终精度掉了 0.5 个点。后来加了学习率线性缩放,精度才追回来。
3. 正则化系数:防止过拟合的阀门
正则化说白了就是给模型加点约束,不让它死记硬背训练数据。L1 正则化让权重变稀疏,L2 正则化让权重变小,Dropout 随机干掉一部分神经元——各有各的脾性。
正则化系数(通常记作 λ 或 weight_decay)控制着约束的强度。设大了模型欠拟合,设小了过拟合。怎么找这个平衡点?我个人习惯的做法是:先不开正则化训一轮,观察验证 loss 什么时候开始回升;然后设一个较小的 λ(比如 1e-5),再看曲线变化。
我踩过一个坑:在一个推荐系统模型上,我把 weight_decay 设成了 0.1,结果模型直接不学习了——所有参数都被压到了接近零。后来才意识到,对于深度网络,weight_decay 通常设在 1e-4 到 5e-4 之间就够用了。
不同正则化方法的典型系数范围:
| 方法 | 常见取值范围 | 适用场景 |
|---|---|---|
| L2 / weight_decay | 1e-5 ~ 1e-3 | 通用,几乎所有模型都用 |
| L1 | 1e-6 ~ 1e-3 | 需要特征稀疏的场景 |
| Dropout 比率 | 0.1 ~ 0.5 | 全连接层较多的网络 |
| 标签平滑 | 0.05 ~ 0.2 | 分类任务,防止过自信 |
4. 网络结构参数:模型的骨架
网络结构参数包括层数、每层神经元数、卷积核大小、注意力头数等。这些参数直接决定了模型的容量——容量太小欠拟合,容量太大过拟合且训练慢。
我刚开始做深度学习时,总觉得层数越多越好,结果一个 50 层的 ResNet 训了三天还没收敛。后来师父点醒我:结构参数要和数据量匹配。小数据集用大模型,正则化再强也救不回来。
几个实用的经验法则:
- 深度 vs. 宽度:先保证足够的宽度(每层通道数/神经元数),再考虑加深。宽度不够,深度再深也学不到有效特征。
- 卷积核大小:图像任务中 3×3 是主流,大核(5×5、7×7)通常只在浅层用。我用 3×3 堆叠替代大核,参数量更少,效果反而更好。
- 注意力头数:Transformer 中头数一般设 8 或 16,不是越多越好。头数太多,每个头分到的维度太少,学不到东西。
5. 超参数的协同效应
这四个超参数不是各自独立的——它们之间会互相影响。你看:
- 学习率很大时,批次大小也要大一些,否则梯度噪声会加剧震荡。
- 正则化系数强了,可以适当增加网络深度来补偿表达能力的损失。
- 网络结构变大后,学习率通常要调小,并用更强的正则化来抑制过拟合。
我举个实际例子。之前做一个 CTR 预估模型,初始配置是:LR=0.001、batch=256、weight_decay=1e-4、3 层 MLP。上线后离线指标一直不达标。后来我把网络加深到 5 层,同时把 weight_decay 提到 5e-4,LR 降到 5e-4,指标一下子就上去了。你看,这几个参数是联动着调的。
下面这张图把四个超参数及其关键子维度串起来了,方便你对照理解:
最后再说一句:超参数调优没有银弹。同一个配置在不同数据集、不同任务上的表现可能天差地别。理解每个参数的底层影响机制,比死记硬背「最佳值」重要得多。我自己每次接手新项目,都会先花半天跑一组小规模实验,摸清这几个参数的脾气,再开始大规模调优。