模型训练调参深度解析:学习率、正则化与优化器

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

说明:本文按四个递进模块组织——① 学习率(为什么它是第一超参数、一维二次函数上的完整收敛分析、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 · 导读:四个模块的逻辑链

模型训练是一个三层栈:优化器负责「怎么走」(每步沿什么方向、走多远),学习率负责「走多快」(全局步长及其随时间的变化),正则化负责「别走过头」(约束有效容量、压制过拟合)。三者的顺序不能颠倒——先搞清楚损失曲面的几何,再谈调度策略,最后才是容量控制。按下面的链条读,每一步都建立在前一步上:

  1. 学习率:一切更新都写成 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。
  2. 正则化:训练集好、验证集差 = 过拟合,本质是有效容量超过数据量。从偏差-方差分解出发,逐个拆解 L1/L2/weight decay 的 MAP 先验解释、L2 在 Adam 里为什么失效(AdamW 的解耦)、Dropout 为什么训练/推理期望一致、BatchNorm 的隐性正则、Mixup/CutMix/Label smoothing 为什么有效、early stopping 的隐式正则化身份。
  3. 优化器:把动量推出物理图像(重球),把 Adam 的三个希腊字母(β1,β2\beta_1,\beta_2β1​,β2​ 与偏差修正)逐个讲透,回答三个真问题——Adam 到底在做什么、为什么它开箱即用却可能输给 SGD、以及大模型时代为什么又回到 AdamW。顺带覆盖梯度裁剪、混合精度、梯度累积、EMA 这些工程必选项。
  4. 实战案例:把三件套拼成可复用的五步流程——先过拟合一个小 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)=21​w⊤Aw(AAA 半正定,特征值 λmax⁡\lambda_{\max}λmax​),梯度下降沿第 iii 个特征方向的乘子是 1−ηλi1-\eta\lambda_i1−ηλi​,所以

η<2λmax⁡(全局不发散的必要条件)\eta < \frac{2}{\lambda_{\max}} \quad\text{(全局不发散的必要条件)}η<λmax​2​(全局不发散的必要条件)

而病态条件数 κ=λ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)是把这个观察变成方法:

  1. 从极小 LR(如 10−710^{-7}10−7)开始,每个 mini-batch 后把 LR 乘以一个常数(如 1.02~1.1)做指数爬升;
  2. 记录每步的(平滑后的)训练 loss;
  3. 画 loss-LR 曲线,找曲线的最低点或下降最陡的位置;
  4. 经验法则:取「最陡下降点」的 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 不确定该退多快时的懒人选择 各框架默认

三条工程经验:

  1. 短训练(< 30 epoch)用 OneCycle,长训练用 cosine/SGDR,拿不准用 plateau;
  2. ηmax⁡\eta_{\max}ηmax​ 通常取 LR range test 的结果,ηmin⁡\eta_{\min}ηmin​ 取 ηmax⁡\eta_{\max}ηmax​ 的 1%~10%;
  3. 调度的终点: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​−

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reset2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值