说明:本文按四个递进模块组织——① 学习率(为什么它是第一超参数、一维二次函数上的完整收敛分析、LR range test、调度器全家桶、warmup 的数学、大 batch 的 LR scaling);② 正则化(过拟合诊断、L1/L2/weight decay、AdamW 解耦、Dropout、BatchNorm 效应、数据增强、Mixup/CutMix、Label smoothing、Early stopping);③ 优化器(GD→SGD→momentum→NAG→Adagrad→RMSProp→Adam→AdamW 全推导、Adam 偏差修正、Adam vs SGD 之争、Lion/Sophia 新优化器、梯度裁剪与 AMP);④ 实战案例(五步调参流程 + PyTorch 代码骨架 + 故障排查表)。公式使用
$...$LaTeX 分隔符,带 MathJax 的预览器(GitHub / VS Code / Typora 等)可正常渲染。配套交互版见同名.html文件(单文件自包含,含 7 个可交互演示:LR range test、学习率调度器、优化器轨迹对比、动量滚球、L1/L2 约束几何、Dropout 网络、过拟合诊断)。
0 · 导读:四个模块的逻辑链
模型训练是一个三层栈:优化器负责「怎么走」(每步沿什么方向、走多远),学习率负责「走多快」(全局步长及其随时间的变化),正则化负责「别走过头」(约束有效容量、压制过拟合)。三者的顺序不能颠倒——先搞清楚损失曲面的几何,再谈调度策略,最后才是容量控制。按下面的链条读,每一步都建立在前一步上:
- 学习率:一切更新都写成 w←w−η⋅uw \leftarrow w - \eta\cdot uw←w−η⋅u,η\etaη 是唯一直接控制「稳定 vs 速度」的旋钮。先用一维二次函数把「太大发散、太小龟速」推成硬数字(η<2/λmax\eta < 2/\lambda_{\max}η<2/λmax),再讲工程上怎么找这个数(LR range test)、怎么让它随时间退火(step/cosine/OneCycle/plateau)、为什么大 batch 可以线性放大、Transformer 为什么非要 warmup。
- 正则化:训练集好、验证集差 = 过拟合,本质是有效容量超过数据量。从偏差-方差分解出发,逐个拆解 L1/L2/weight decay 的 MAP 先验解释、L2 在 Adam 里为什么失效(AdamW 的解耦)、Dropout 为什么训练/推理期望一致、BatchNorm 的隐性正则、Mixup/CutMix/Label smoothing 为什么有效、early stopping 的隐式正则化身份。
- 优化器:把动量推出物理图像(重球),把 Adam 的三个希腊字母(β1,β2\beta_1,\beta_2β1,β2 与偏差修正)逐个讲透,回答三个真问题——Adam 到底在做什么、为什么它开箱即用却可能输给 SGD、以及大模型时代为什么又回到 AdamW。顺带覆盖梯度裁剪、混合精度、梯度累积、EMA 这些工程必选项。
- 实战案例:把三件套拼成可复用的五步流程——先过拟合一个小 batch 验证管线 → LR range test 定基准 → 选优化器与调度器 → 叠加正则化 → early stopping 收尾。配 PyTorch 代码骨架、参数组惯例(bias/LN 不加 weight decay)、以及一张「症状 → 病因 → 处方」排查表。
1 · 学习率:第一超参数的数学
1.1 一切更新的统一形式
不管优化器多花哨,每一步参数更新都可以写成
wt+1=wt−ηt⋅utw_{t+1} = w_t - \eta_t \cdot u_twt+1=wt−ηt⋅ut
其中 utu_tut 是优化器给出的「有效更新方向/步长」(SGD 里 ut=∇Lu_t = \nabla\mathcal{L}ut=∇L,Adam 里 ut=m^t/(v^t+ϵ)u_t = \hat m_t/(\sqrt{\hat v_t}+\epsilon)ut=m^t/(v^t+ϵ)),ηt\eta_tηt 是学习率(learning rate, LR)。学习率是唯一同时决定两件事的旋钮:
- 太小:每步挪不动,训练按龟速前进,且小梯度下容易被噪声淹没;
- 太大:一步跨过谷底,损失不降反升,甚至逐轮放大到 NaN。
调参界的第一性原理:学习率比其他任何超参数都值得先调。其他超参数(动量、weight decay、dropout)通常是「在正确学习率附近的微调」,而学习率错了,其他都白搭。
1.2 一维二次函数:把「太大太小」推成硬数字
取最简单的非平凡损失——一维二次碗 f(w)=12λw2f(w) = \tfrac{1}{2}\lambda w^2f(w)=21λw2(λ>0\lambda > 0λ>0 是曲率),梯度 g=λwg = \lambda wg=λw。梯度下降一步:
wt+1=wt−ηλwt=(1−ηλ) wtw_{t+1} = w_t - \eta\lambda w_t = (1-\eta\lambda)\,w_twt+1=wt−ηλwt=(1−ηλ)wt
于是 wt=(1−ηλ)tw0w_t = (1-\eta\lambda)^t w_0wt=(1−ηλ)tw0。收敛的充要条件是乘子绝对值小于 1:
∣1−ηλ∣<1 ⟺ 0<η<2λ|1 - \eta\lambda| < 1 \iff 0 < \eta < \frac{2}{\lambda}∣1−ηλ∣<1⟺0<η<λ2
三个推论,全部是可验证的硬结论:
| 区间 | 行为 | 迭代表现 |
|---|---|---|
| 0<η<2/λ0 < \eta < 2/\lambda0<η<2/λ | 收敛 | 若 η<1/λ\eta < 1/\lambdaη<1/λ:单调下降;若 1/λ<η<2/λ1/\lambda < \eta < 2/\lambda1/λ<η<2/λ:震荡下降(过冲) |
| η=1/λ\eta = 1/\lambdaη=1/λ | 一步到谷底 | w1=0w_1 = 0w1=0,一维最优步长恰为曲率倒数 |
| η≥2/λ\eta \ge 2/\lambdaη≥2/λ | 发散 | ∣1−ηλ∣≥1\lvert 1-\eta\lambda\rvert \ge 1∣1−ηλ∣≥1,误差逐轮(等比)放大 → loss 爆炸 |
高维情形完全同构:对二次函数 f(w)=12w⊤Awf(w) = \tfrac12 w^\top A wf(w)=21w⊤Aw(AAA 半正定,特征值 λmax\lambda_{\max}λmax),梯度下降沿第 iii 个特征方向的乘子是 1−ηλi1-\eta\lambda_i1−ηλi,所以
η<2λmax(全局不发散的必要条件)\eta < \frac{2}{\lambda_{\max}} \quad\text{(全局不发散的必要条件)}η<λmax2(全局不发散的必要条件)
而病态条件数 κ=λmax/λmin\kappa = \lambda_{\max}/\lambda_{\min}κ=λmax/λmin 决定收敛速度:最优步长 η⋆=2/(λmax+λmin)\eta^\star = 2/(\lambda_{\max}+\lambda_{\min})η⋆=2/(λmax+λmin) 下,收敛率约为 (κ−1κ+1)\big(\frac{\kappa-1}{\kappa+1}\big)(κ+1κ−1) 每步。κ=1000\kappa = 1000κ=1000 的损失面(深度网络里比比皆是)意味着每步只缩掉 0.2%0.2\%0.2% 的误差分量——慢不是因为你 LR 小,是因为曲面畸形。这正是动量与 Adam 后面登场的理由(第 3 章)。
交互版 W1 在曲率 λ1=1,λ2=10\lambda_1=1,\lambda_2=10λ1=1,λ2=10 的二维碗上拖动学习率滑块(10−510^{-5}10−5 到 101010)实时训练:η<0.2\eta<0.2η<0.2 龟速、0.2≲η≲10.2\lesssim\eta\lesssim10.2≲η≲1 顺滑、η→2\eta\to2η→2 开始震荡、η≥2\eta\ge2η≥2 直接发散。点「自动扫描」看 loss-LR 曲线——那条曲线就是下面 LR range test 的原理。
1.3 Loss-LR 曲线与 LR Range Test
把 1.2 的「震荡 vs 发散」现象画成图,就是著名的 loss vs LR 曲线:学习率从小到大扫过去,损失先降后升,整体呈「U 形/J 形」,在发散点附近垂直上天。
LR range test(Smith & Topin, Super-Convergence, 2018)是把这个观察变成方法:
- 从极小 LR(如 10−710^{-7}10−7)开始,每个 mini-batch 后把 LR 乘以一个常数(如 1.02~1.1)做指数爬升;
- 记录每步的(平滑后的)训练 loss;
- 画 loss-LR 曲线,找曲线的最低点或下降最陡的位置;
- 经验法则:取「最陡下降点」的 LR 作为基准 ηmax\eta_{\max}ηmax(或最低点右侧一个数量级内的值),发散点之前的 LR 都不安全。
工程要点:
- 扫描要快(1~3 个 epoch 扫完),否则模型已经学会了不少东西,早期 LR 段的 loss 不再可比;
- 先固定其他超参数(batch size、weight decay、数据管线),一次只扫 LR;
- BatchNorm 的 mini-batch 统计与 dropout 的随机掩码会给曲线加噪,平滑后再看趋势;
- PyTorch Lightning 内置
auto_lr_find,本质就是这套流程。
注意 LR range test 的边界:它回答的是「这个 batch size 下哪些 LR 不发散」,不回答「哪个 LR 泛化最好」——后者受 weight decay、数据增强、训练时长影响,通常还要在 ηmax\eta_{\max}ηmax 附近 ±3 倍各跑 1~2 轮。
1.4 学习率调度器全景
固定 LR 的问题:早期需要大步长探路,后期需要小步长精修(想象下山,快到谷底时迈大步只会来回跨过谷底)。于是有了学习率调度(LR schedule)。全家桶:
| 调度器 | 公式/行为 | 适用场景 | 代表工作 |
|---|---|---|---|
| Step / MultiStep | 每 NNN epoch 除以 10(如 epoch 30/60/90) | 短训练、快速 baseline;调好后收敛稳 | AlexNet、VGG、ResNet 原始论文 |
| Exponential | ηt=η0γt\eta_t = \eta_0\gamma^tηt=η0γt | 同上,连续版 | 早期工作 |
| Cosine Annealing | ηt=ηmin+12(ηmax−ηmin)(1+cos(πt/T))\eta_t = \eta_{\min} + \tfrac12(\eta_{\max}-\eta_{\min})\big(1+\cos(\pi t/T)\big)ηt=ηmin+21(ηmax−ηmin)(1+cos(πt/T)) | 默认首选:平滑退火、无需调里程碑 | ResNet、ConvNeXt |
| Warmup + Cosine | 前 www 步线性从 0 升到 ηmax\eta_{\max}ηmax,再 cosine 退火 | Transformer/BERT/GPT 标配 | BERT、GPT、ViT |
| SGDR(Warm Restarts) | cosine 退火到 ηmin\eta_{\min}ηmin 后重启回 ηmax\eta_{\max}ηmax | 长训练、想多次「跳出去」探索 | Loshchilov & Hutter, SGDR 2017 |
| OneCycle | 先 warmup 到很大(如基准 10 倍)再 cosine 退到近 0,同时动量反向调度 | 短训练冲刺,配合大 LR 常加速数倍 | Smith, Super-Convergence 2018 |
| ReduceLROnPlateau | val loss ppp 个 epoch 不降就 ÷\div÷ factor | 不确定该退多快时的懒人选择 | 各框架默认 |
三条工程经验:
- 短训练(< 30 epoch)用 OneCycle,长训练用 cosine/SGDR,拿不准用 plateau;
- ηmax\eta_{\max}ηmax 通常取 LR range test 的结果,ηmin\eta_{\min}ηmin 取 ηmax\eta_{\max}ηmax 的 1%~10%;
- 调度的终点:cosine 结束时 LR 应接近 0——最后的低 LR 阶段对最终精度贡献巨大(相当于免费的精修),别把训练时长砍在 LR 还很高的时候。
交互版 W2 切换 Step / Cosine / Warmup+Cosine / OneCycle 四种调度,看 LR 曲线与对应的(模拟)验证 loss:OneCycle 与 cosine 的 val loss 明显低于 step;关掉 warmup 重跑 Transformer 式训练,看前 500 步 val loss 的尖峰——那就是 1.5 节的主角。
1.5 Warmup 的数学:为什么 Transformer 非它不可
Warmup = 训练最初几百~几千步把 LR 从 0 线性升到 ηmax\eta_{\max}ηmax,再进入正常调度。三个原因,一个比一个本质:
原因一:Adam 早期步长是全尺寸的(数学)。Adam 第一步的更新(见 3.6):
w1=w0−η⋅m^1v^1+ϵ,m^1=g1, v^1=g12 ⟹ m^1v^1≈sign(g1)w_1 = w_0 - \eta\cdot\frac{\hat m_1}{\sqrt{\hat v_1}+\epsilon},\qquad \hat m_1 = g_1,\ \hat v_1 = g_1^2 \implies \frac{\hat m_1}{\sqrt{\hat v_1}} \approx \operatorname{sign}(g_1)w1=w0−

本文系统解析深度学习模型训练中三大核心超参数:学习率(含LR range test、warmup、调度策略与大batch缩放)、正则化(L1/L2、Dropout、BatchNorm隐式正则、数据增强、Label Smoothing及early stopping)以及优化器(SGD、Momentum、Adam、AdamW原理与对比)。强调三者协同逻辑链:学习率决定更新步长稳定性,优化器定义更新方向,正则化约束模型容量防过拟合。结合数学推导、工程实践与故障排查,提供可复用的五步调参流程。
384

被折叠的 条评论
为什么被折叠?



