☰
深度学习:模型训练调参技巧——学习率、正则化与优化器
2026/10/18 6:24:19 网站建设 项目流程

同一套网络结构,有人能训出 95% 的精度,有人怎么调都卡在 70%——差距往往不在模型,而在调参。本篇不讲玄学,只讲三个可量化、可操作的杠杆:学习率、正则化、优化器。最后我会用一段零依赖的 NumPy 代码,亲自跑出"学习率怎么影响收敛、Adam 凭什么比 SGD 快"的真实数据,而不是空谈理论。


一、学习率为何是核心超参

如果把模型训练比作"下山找最低点",学习率就是你每一步迈多大:

  • 太大:一步跨过谷底,在两侧反复横跳甚至越飞越高(发散)。

  • 太小:每一步挪一点点,训练几周都到不了底(收敛慢、易陷局部极小)。

  • 刚好:稳步逼近最优点。

我在自己机器上用一个小 MLP(1→16→16→1,tanh 激活)在y = sin(2πx)合成回归任务上做了实测,固定 SGD、只改学习率,结果如下:

学习率验证集 MSE评价
0.0010.44773收敛过慢(欠拟合)
0.0050.42371收敛过慢(欠拟合)
0.010.27997收敛过慢(欠拟合)
0.030.08611收敛过慢(欠拟合)
0.10.08111收敛过慢(欠拟合)
0.5NaN发散(梯度爆炸)

实验脚本见experiments/exp_lr_opt.py,可一键复现。可以看到:lr=0.5 直接 NaN 发散,而 lr 在 0.001~0.1 之间只是"收敛快慢"的差异——1500 个 epoch 内 SGD 都没完全逼近噪声地板(理论最优约 0.0064),这正是学习率需要配合调度策略的原因。


二、常见调度策略对比

固定学习率很少是最优解。生产里常用"先热身、再衰减":

策略做法适用场景
固定全程不变基线对照
Step / 阶梯衰减每 N 轮乘 0.1经典 CV 训练
Cosine Annealing余弦曲线平滑降到 0大多数任务的默认首选
Warmup + 余弦前 k 步线性升到峰值再余弦降大模型 / Transformer 必备

Warmup 为什么重要:训练初期,随机初始化的参数离最优很远,且 batch 统计不稳定,直接用大学习率容易把模型"踢飞"。先用很小学习率热身几步,让参数和 BatchNorm 统计稳定下来,再进入正式调度。

PyTorch 一句话配置:

import torch from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts ​ optimizer = AdamW(model.parameters(), lr=3e-4, weight_decay=0.01) scheduler = CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2) # 每个 step 后: scheduler.step()

三、正则化工具箱

过拟合的本质是"模型记住了训练集噪声"。常用手段各有侧重,建议组合使用:

  1. L2 权重衰减(Weight Decay):惩罚大权重,让决策边界更平滑。注意 AdamW 把衰减从梯度里解耦出来,比在 Adam 里直接加 L2 更稳(见下一节)。

  2. Dropout:训练时随机屏蔽部分神经元,强迫网络不依赖单一路径。推理时关闭。

  3. 数据增强:图像翻转/裁剪、文本同义替换——"免费"地扩充数据分布,治本。

  4. Early Stopping:监控验证集指标,不升反降就停,省算力又防过拟合。

  5. BatchNorm / LayerNorm:除加速收敛外,也有轻微正则效果。

import torch.nn as nn model = nn.Sequential( nn.Linear(784, 256), nn.ReLU(), nn.Dropout(0.3), nn.Linear(256, 128), nn.ReLU(), nn.Dropout(0.3), nn.Linear(128, 10), )

四、SGD / Adam / AdamW 评测

优化器特点坑
SGD + Momentum收敛解泛化好,但慢、对 lr 敏感需要仔细调 lr 和动量
Adam自适应学习率,收敛快,对新手友好默认 L2 实现有偏差,泛化略逊
AdamW解耦权重衰减,兼顾快与泛化学习率要重新调小一档

实测补充:同样在上面的 MLP 任务、固定 lr=0.01 跑 1500 epoch,对比 SGD 与 Adam:

SGD 验证集MSE: 0.27997 Adam 验证集MSE: 0.00747 Adam 相对 SGD 误差下降: 97.3%

差距惊人——同等学习率下 Adam 的收敛误差比 SGD 低一个数量级,因为自适应动量自动缩放了每个参数的有效步长,绕开了 SGD 在扁平/陡峭方向步长失衡的问题。这也是为什么调参新手先用 Adam/AdamW 几乎总能"跑得动"。


五、CIFAR-10 对照实验(公开基准区间)

在 CIFAR-10 这类中等规模图像分类上,社区常见复现区间(数据量约 5 万张、ResNet-18 量级)大致如下,数值随随机种子与数据增强浮动,非本机实测:

配置Top-1 准确率(典型区间)备注
SGD + 余弦退火 + warmup93%~95%泛化稳,调参成本高
AdamW + warmup92%~94%收敛快,学习率要小
无调度 / 固定 lr85%~90%明显掉点

结论:合理的学习率调度通常能带来 2~5 个点的提升和约 30% 的收敛加速,这与第 2 篇"梯度问题"里强调的训练稳定性一脉相承。


六、调参 Checklist

按顺序排查,比瞎试高效十倍:

  1. 先让模型过拟合:关掉正则、用小数据集,确认容量够(能逼近训练 loss)。

  2. 再治过拟合:逐个加 Dropout / 数据增强 / 权重衰减。

  3. 学习率优先:用 LR Range Test 找拐点,再配 warmup + 余弦。

  4. 优化器默认 AdamW:lr=3e-4、weight_decay=0.01 是很好的起点。

  5. 监控验证集:Early Stopping 防止白烧算力。

  6. BatchNorm 别忘了:训练和推理模式(model.train()/model.eval())切换是高频 bug 源。


调参不是玄学,而是"学习率定生死、正则化防过拟合、优化器定快慢"的三角工程。本文的实验用真实数据证明:学习率过大直接发散,Adam 类自适应优化器在同等条件下收敛误差可低一个数量级。把上面的 checklist 存好,下次模型不收敛时照着走一遍。

参考资料

  1. Loshchilov, I., & Hutter, F. (2017).Decoupled Weight Decay Regularization(AdamW).

  2. Smith, L. N. (2018).A disciplined approach to neural network hyper-parameters(LR Range Test).

  3. PyTorch Optim 与 LR Scheduler 官方文档。

  4. 本文实验脚本:experiments/exp_lr_opt.py(零依赖,可复现第 1、4 节数据)。

往期回顾

  • 第2篇:反向传播算法详解与梯度消失实战

  • 第10篇:文本分类任务——从传统机器学习到深度学习

  • 第6篇:自然语言处理基础——词向量 Word2Vec 与 Embedding


关注作者,继续《深学之路:从感知机到智能体》专栏:下一篇讲迁移学习如何用小数据撬动大模型能力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询