超参数全景:学习率、批次大小、正则化系数与网络结构参数

说到深度学习模型的训练,很多人一上来就调网络结构,折腾好几周,结果 loss 下不去。其实啊,真正决定模型能不能收敛、泛化好不好的,往往是那几个不起眼的超参数。我个人习惯把超参数比作汽车的调校参数——发动机再牛,油给大了也爆缸,油给小了跑不动。今天咱们就把四个最核心的超参数挨个捋一遍。

1. 学习率:训练步长的艺术

学习率大概是所有超参数里最敏感的一个。它决定了参数更新的步长——说白了就是每次朝着梯度方向走多远。步长太大容易跳过最优点,loss 直接震荡甚至炸掉;步长太小又走得慢,训到天荒地老也不收敛。

我在项目中遇到过一个问题:用 Adam 优化器训练一个文本分类模型,初始学习率设了 0.01,结果 loss 在前几个 epoch 下降很快,然后突然开始剧烈震荡。后来调成 0.001 并加了预热策略,训练曲线立马平滑了。

学习率的设置方式通常有几种:

  • 固定学习率:简单粗暴,但很难兼顾收敛速度与稳定性。
  • 学习率衰减:按 epoch 或 step 逐步降低,常见的有阶梯衰减和指数衰减。
  • 预热策略:前几个 step 从很小的 LR 线性增加到目标值,能有效避免初期梯度爆炸。
  • 循环学习率:让 LR 在上下界之间周期变化,有时能跳出局部最优。

我一般会先试 3e-4 这个值(Adam 的默认值),然后根据 loss 曲线的走势上下微调。如果 loss 下降太慢,就调大一点;如果震荡厉害,就调小。

小建议:用学习率范围测试(LR Range Test)快速找合适的区间,比凭感觉试要高效得多。我常用的做法是让 LR 从 1e-6 指数增长到 1,观察 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,不是越多越好。头数太多,每个头分到的维度太少,学不到东西。
记一条原则:结构参数的调整要跟着 loss 曲线走。欠拟合就加容量,过拟合就减容量或加强正则化,别拍脑袋乱改。

5. 超参数的协同效应

这四个超参数不是各自独立的——它们之间会互相影响。你看:

  • 学习率很大时,批次大小也要大一些,否则梯度噪声会加剧震荡。
  • 正则化系数强了,可以适当增加网络深度来补偿表达能力的损失。
  • 网络结构变大后,学习率通常要调小,并用更强的正则化来抑制过拟合。

我举个实际例子。之前做一个 CTR 预估模型,初始配置是:LR=0.001、batch=256、weight_decay=1e-4、3 层 MLP。上线后离线指标一直不达标。后来我把网络加深到 5 层,同时把 weight_decay 提到 5e-4,LR 降到 5e-4,指标一下子就上去了。你看,这几个参数是联动着调的。

调参顺序建议:我个人习惯先定学习率和批次大小,再调网络结构,最后用正则化系数做精细微调。当然,实际工程中往往需要反复迭代几轮。

下面这张图把四个超参数及其关键子维度串起来了,方便你对照理解:

超参数全景知识体系 超参数全景 学习率 批次大小 正则化系数 网络结构参数 初始值 衰减策略 内存约束 梯度稳定性 L1/L2强度 Dropout比率 深度与宽度 卷积核/注意力头 ⚠ 核心原则 四个超参数联动影响,调整一个往往需要同步调整其他参数

最后再说一句:超参数调优没有银弹。同一个配置在不同数据集、不同任务上的表现可能天差地别。理解每个参数的底层影响机制,比死记硬背「最佳值」重要得多。我自己每次接手新项目,都会先花半天跑一组小规模实验,摸清这几个参数的脾气,再开始大规模调优。

总结一下:学习率管步长,批次大小管梯度质量,正则化系数管过拟合,网络结构参数管模型容量。把这四者的关系理清了,调参就成功了一半。