同一套网络结构有人能训出 95% 的精度有人怎么调都卡在 70%——差距往往不在模型而在调参。本篇不讲玄学只讲三个可量化、可操作的杠杆学习率、正则化、优化器。最后我会用一段零依赖的 NumPy 代码亲自跑出学习率怎么影响收敛、Adam 凭什么比 SGD 快的真实数据而不是空谈理论。一、学习率为何是核心超参如果把模型训练比作下山找最低点学习率就是你每一步迈多大太大一步跨过谷底在两侧反复横跳甚至越飞越高发散。太小每一步挪一点点训练几周都到不了底收敛慢、易陷局部极小。刚好稳步逼近最优点。我在自己机器上用一个小 MLP1→16→16→1tanh 激活在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可一键复现。可以看到lr0.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(), lr3e-4, weight_decay0.01) scheduler CosineAnnealingWarmRestarts(optimizer, T_010, T_mult2) # 每个 step 后 scheduler.step()三、正则化工具箱过拟合的本质是模型记住了训练集噪声。常用手段各有侧重建议组合使用L2 权重衰减Weight Decay惩罚大权重让决策边界更平滑。注意 AdamW 把衰减从梯度里解耦出来比在 Adam 里直接加 L2 更稳见下一节。Dropout训练时随机屏蔽部分神经元强迫网络不依赖单一路径。推理时关闭。数据增强图像翻转/裁剪、文本同义替换——免费地扩充数据分布治本。Early Stopping监控验证集指标不升反降就停省算力又防过拟合。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 任务、固定 lr0.01 跑 1500 epoch对比 SGD 与 AdamSGD 验证集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按顺序排查比瞎试高效十倍先让模型过拟合关掉正则、用小数据集确认容量够能逼近训练 loss。再治过拟合逐个加 Dropout / 数据增强 / 权重衰减。学习率优先用 LR Range Test 找拐点再配 warmup 余弦。优化器默认 AdamWlr3e-4、weight_decay0.01 是很好的起点。监控验证集Early Stopping 防止白烧算力。BatchNorm 别忘了训练和推理模式model.train()/model.eval()切换是高频 bug 源。调参不是玄学而是学习率定生死、正则化防过拟合、优化器定快慢的三角工程。本文的实验用真实数据证明学习率过大直接发散Adam 类自适应优化器在同等条件下收敛误差可低一个数量级。把上面的 checklist 存好下次模型不收敛时照着走一遍。参考资料Loshchilov, I., Hutter, F. (2017).Decoupled Weight Decay Regularization(AdamW).Smith, L. N. (2018).A disciplined approach to neural network hyper-parameters(LR Range Test).PyTorch Optim 与 LR Scheduler 官方文档。本文实验脚本experiments/exp_lr_opt.py零依赖可复现第 1、4 节数据。往期回顾第2篇反向传播算法详解与梯度消失实战第10篇文本分类任务——从传统机器学习到深度学习第6篇自然语言处理基础——词向量 Word2Vec 与 Embedding关注作者继续《深学之路从感知机到智能体》专栏下一篇讲迁移学习如何用小数据撬动大模型能力。
阅读完成 · 觉得有帮助?