03-训练核心 核心 预计 25 分钟

学习率、批大小与训练动态

学习率(Learning Rate)是每次参数更新沿负梯度走的步长,是深度学习影响力最大的单一超参数;它需要随训练进程调度(预热、衰减、循环),并与批大小联动决定训练动态的形态。

一句话定义

学习率(Learning Rate)是每次参数更新沿负梯度走的步长,是深度学习影响力最大的单一超参数;它需要随训练进程调度(预热、衰减、循环),并与批大小联动决定训练动态的形态。

直觉

学习率像下山的「步幅」:步子太大直接跨过谷底撞上山壁(发散),太小则一小时挪一米(停滞);调度器像「先小步探路、中段大步赶路、临近谷底碎步精调」的登山策略。

为什么重要

经验法则「先扫学习率、再谈其他」贯穿 kp-027 的调试方法论:损失发散、震荡、停滞三种典型病态的第一嫌疑人都不是模型而是学习率。批大小则联动显存预算(kp-029)与梯度噪声(kp-010),是每一个真实项目开训前必答的问题。

前置知识

  • kp-010(优化器更新方程中的 η)。

核心概念

  • 学习率扫描(LR range test):从极小值指数增大学习率跑若干迭代,画损失曲线找下降最陡区间。
  • 预热(warmup):训练初期从 0 线性升到目标学习率,避免初期大梯度+大步长造成发散。
  • 衰减调度(decay schedule):阶跃衰减(StepLR)、余弦退火(CosineAnnealing)、按平台调降(ReduceLROnPlateau)。
  • 批大小(batch size):单次前向的样本数,受显存硬约束;小批噪声大、大批噪声小。
  • 线性缩放规则(linear scaling rule):批大小扩大 k 倍时,学习率大致等比放大 k 倍(配合预热)。
  • 梯度累积(gradient accumulation):显存不够大批时,累积多个小批梯度再统一更新,等效大批。

原理与机制

学习率的力学来自 kp-010 的更新式 θ ← θ − η·g:损失面曲率固定时,η·|∇L| 超过「谷宽」就会在谷壁间跳跃放大,损失飙升——发散的机制解释。η 过小则每步位移低于噪声水平,损失平台期漫长的机制解释。经验工作流:先用 LR range test 找到「损失下降最陡且不回升」的量级,常在 1e−4~1e−1 之间(Adam 取低段、SGD 取高段);再用调度器在中段收敛。余弦退火把 η 从 η_max 沿余弦曲线降到 η_min≈0,平滑且无需人工选阶梯,是当前最常用默认。预热解决的是「训练初期:权重随机、梯度大且方向不可靠」的冷启动问题,大模型训练中已属标配。批大小维度:梯度是批内样本梯度的均值,批越大方差按 1/B 缩小、更新方向越准,但单 epoch 更新次数变少、且泛化行为可能变化;Goyal 等 2017 的线性缩放规则给了大批训练的换算抓手——B 乘 k 则 η 乘 k,并要求前若干 epoch 预热。显存角度:激活值缓存(kp-007)随 B 线性增长,B 常被显存而非理论决定;B 不够时用梯度累积凑等效大批。

公式或模型

余弦退火与线性缩放的公式:

余弦退火:  η_t = η_min + (η_max − η_min) · (1 + cos(π·t/T)) / 2
预热:      η_t = η_max · t / t_warmup            (t ≤ t_warmup)
线性缩放:  (B, η) → (kB, kη)                      (Goyal et al. 2017)

变量说明:T 为总步数、t 为当前步、t_warmup 为预热步数。三式都只改 kp-010 更新式中的标量 η,不动梯度本身。

图示

η
ηmax ┤      ╭─╮
     │     ╱   ╲
     │    ╱     ╲          余弦退火(先升后缓降)
     │   ╱       ╲╮
ηmin ┤──╯          ╰──► t
      |←warmup→|←——— 训练 ———→|

直观类比

线性缩放规则像「人多力量大再分饭」:批大 k 倍相当于梯度更稳(钟声更响),可以相应迈大步(η 乘 k)保持每 epoch 的「总位移」不变;预热像「大部队出发前先整队」。

实例或案例

CIFAR-10 上的一组对照(kp-021 项目可直接复现):SGD+动量,固定 lr=0.01 训练 50 epoch 约 88%;固定 lr=0.1 前期快但 20 epoch 后震荡在 90% 附近;lr=0.1 + 余弦退火到 0 达 93%+。差异全部来自调度而非模型。LR range test 的读图法:损失曲线从高台开始下降的拐点附近即为可用下限,开始回升的拐点即为危险上限,工作点取两者之间的对数中点。

常见误区

  • 「调不动模型就先堆层数/换结构」:九成「模型不行」其实是学习率不当,先扫 η 再动结构(kp-027 原则)。
  • 「学习率恒定最好」:后期大学习率会在谷底来回弹跳无法精调,衰减几乎是必需品。
  • 「批越大越好」:超过一定规模后泛化可能下降且显存昂贵,大批必须配合缩放规则与预热。
  • 混淆 epoch 级与 step 级调度:StepLR 按 epoch、CosineAnnealingLR 按步(也可按 epoch),单位搞错会让调度节奏错一整个量级。

与其他知识点的关系

本知识点是 kp-010 的超参数续篇;kp-016 训练循环演示 scheduler.step() 的挂载位置;kp-027 用损失曲线形态反推学习率问题;kp-029 的多卡训练中有效批大小 = 单卡批 × 卡数,学习率必须随之重调。

自测题

  1. 损失在训练初期迅速变为 NaN,最可能的原因与两个处理手段?

答案要点:学习率过大(或无预热);降低 η、加 warmup,也可查梯度爆炸配合裁剪(kp-025)。

  1. 批大小扩大 4 倍后按线性缩放规则应如何调学习率?为什么仍要预热?

答案要点:η 乘 4;初期梯度方向不可靠,大批+大步长更易开局发散。

  1. 显存只够 batch=32 但想要等效 128,怎么办?

答案要点:梯度累积 4 个批次再 step,等效批 128(注意损失按批平均后再累积的口径)。

延伸阅读

  • Smith《Cyclical Learning Rates for Training Neural Networks» 2017(LR range test 出处)。
  • Goyal 等《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour» 2017(线性缩放+预热出处)。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。