想象你是一位老司机,要从北京自驾去拉萨。刚发动汽车时,你不会猛踩油门——发动机还在预热,轮胎抓地力不足,路面情况也没摸清;上了高速后,你匀速巡航;等看到远处雪山的轮廓、离目的地越来越近时,你会提前松开油门,让车沿着平滑的弧线减速滑行,慢慢对准导航上的那个“终点”。训练一个深度学习模型,走的正是这样一段旅程:损失面是蜿蜒的地形,参数是方向盘,而“学习率”(learning rate)就是你的油门。学习率调度器(Scheduler)就是一位经验丰富的老司机,帮你在旅程的不同阶段,该快时快、该慢时慢。这篇文章要讲的 Cosine(余弦退火)和 Warmup(预热),正是现代 AI 圈最流行的一套“驾驶手册”——从 GPT 到 LLaMA,几乎人人都用它。读完它,你就掌握了让模型又快又稳抵达目的地的心法。

岗位关联

学习率调度是超参数调优的必修课,掌握 Warmup 与 Cosine 组合策略,能让模型训练又快又稳、告别手动反复试错。对希望进入大模型训练领域的工程师,这是必须具备的底层功力。

目录
  1. 可视化演示
  2. 学习率基础
  3. 经典调度器
  4. Warmup预热
  5. 余弦退火
  6. 组合调度
  7. 工程实践
  8. 前沿扩展
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

学习率基础

开车从北京去拉萨,方向盘决定方向,但真正决定你几点到的是油门。踩得浅,车速慢;踩得深,车速快;踩得太猛,还可能冲出路面、车毁人亡。训练神经网络,本质上就是成千上万次“走一步看一步”的调整,而这一步迈多大,正是学习率的职责。你设置的每一个超参数里,学习率常常是第一个要调的——它不是普通的旋钮,而是整辆车的油门踏板。

在机器学习中,学习率(learning rate,通常记作 $\eta$)控制着梯度下降时参数更新的幅度。每次迭代,模型先计算损失函数对参数的梯度,这个梯度像箭头一样指出“哪个方向会让损失上升得最猛”,然后模型沿着反方向迈出一步。这一步有多大,就由学习率决定:它直接乘在梯度上。

所以,想让模型安全到达拉萨,光有方向盘还不够,必须有一位会控制油门的“老司机”:在路况不明时慢行,在开阔直路上加速,在接近终点时优雅收油。接下来,我们就看看传统司机怎么踩油门,以及现代老司机总结出的“预热 + 余弦”这套黄金右脚。

wt+1=wt−η∇L(wt)\displaystyle w_{t+1} = w_t - \eta \nabla L(w_t)
这条式子每天在无数 GPU 上运行亿万次:新权重 = 旧权重 − 学习率 × 梯度。学习率太大,训练像醉驾——损失剧烈震荡甚至发散;学习率太小,训练像蜗牛爬——几千轮过去还在原地打转。
  1. w_t(当前参数)模型此刻“脑子里”的数值,比如某个权重当前是 0.3。
    wtw_t
  2. ∇L(w_t)(梯度)指向损失上升最快方向的箭头,告诉模型哪个方向最糟糕。
    ∇L(wt)\nabla L(w_t)
  3. η(学习率)每次沿梯度反方向迈出的步子大小,是整辆车油门的开度。
    η\eta
  4. 减号与更新沿梯度反方向迈一步得到新参数,这就是一次完整的参数更新。
    wt+1=wt−η∇L(wt)w_{t+1} = w_t - \eta \nabla L(w_t)

经典调度器

在没有导航的年代,老司机开车只有三种油门策略:全程定速巡航、看到路标突然点刹、缓慢匀速地松油门。早期的学习率调度也恰好对应着这三招:固定学习率、Step 阶梯衰减、指数衰减。它们思路朴素,却奠定了调度器的基本框架。

固定学习率全程不变,实现最简单,但训练后期容易在最优解附近来回震荡,像定速巡航始终用同一个速度跑山路。Step 阶梯衰减则每到固定的轮数(比如每 30 epoch)把学习率降一半,曲线像楼梯一样一节节往下走——缺点是每次“急刹”都会让损失曲线抖一抖。指数衰减则温和得多,每走一步都乘一个略小于 1 的系数。

三种策略各有各的毛病:要么全程笨笨地定速,要么中途急刹惊到乘客,要么缓和有余但收效太慢。它们共同的缺憾是——既没有照顾到出发时“车还没热”的脆弱期,也没有用最优雅的弧线逼近终点。于是,更聪明的调度策略开始登上历史舞台。

ηt=η0γt\displaystyle \eta_t = \eta_0 \gamma^t
指数衰减中,t 是当前训练步数,η₀ 是初始学习率,γ 是衰减系数(如 0.98)。每走一步,学习率就乘一次 γ,曲线从高处缓缓滑向低处,越到后面变化越平缓。
  1. η₀(初始学习率)旅程起点时设定的最大油门开度。
    η0\eta_0
  2. γ(衰减系数)介于 0 和 1 之间的小数,决定学习率每步衰减的力度。
    γ∈(0,1)\gamma \in (0, 1)
  3. t(训练步数)当前迭代次数,从 0 开始一路递增。
    tt
  4. 指数连乘t 次连乘 γ 后,学习率按指数规律下降,曲线平滑但衰减始终偏慢。
    ηt=η0γt\eta_t = \eta_0 \gamma^t

Warmup预热

冬天的早晨,老司机绝不会一上车就地板油——发动机没热、轮胎没抓地力,猛踩油门只会原地打滑。训练刚开始的模型处境一模一样:参数是随机初始化的,梯度又大又乱,如果开局就直接上大学习率,模型极易“打滑”甚至撞墙发散,loss 直接变成 NaN。

Warmup(预热)就是让学习率从很小甚至 0 开始,在最初的若干步内线性或指数地爬升到预设峰值。2017 年后,随着 Transformer 时代的到来,几乎所有大模型训练都默认先预热再起飞——从 BERT 到 GPT,无一例外。为什么?因为随机初始化带来的梯度方差在初期巨大,模型需要一段“热身时间”来稳定方向感。

为什么预热如此关键?除了参数初始化不稳,Adam 这类自适应优化器在初期对梯度方差的估计也有偏差,预热给了它足够的时间“校准仪表”。就像老司机先慢开几公里摸清道路脾气,再放开手脚——这段热身,省不得。

ηt=ηmax⁡⋅tTwarm,t<Twarm\displaystyle \eta_t = \eta_{\max} \cdot \frac{t}{T_{\text{warm}}}, \quad t < T_{\text{warm}}
这是最常用的线性预热公式:在预热期 T_warm 内,学习率从 0 均匀线性增长,到第 T_warm 步正好到达峰值 η_max。相当于先挂一档慢慢挪,再逐步换挡到五档。
  1. η_max(峰值学习率)预热结束时模型要达到的目标学习率,之后调度从它开始衰减。
    ηmax⁡\eta_{\max}
  2. t(当前步数)训练已走的步数,在预热期从 1 数到 T_warm。
    tt
  3. T_warm(预热步数)设定的预热时长,经验上通常占总训练步数的 5%~10%。
    TwarmT_{\text{warm}}
  4. 比值缩放t/T_warm 从 0 逐渐增长到 1,学习率也随之从小爬到大,完成“热车”。
    tTwarm\frac{t}{T_{\text{warm}}}

余弦退火

接近拉萨时,老司机不会开到 120 码再一脚踩死刹车,而是远远看到导航提示,就松开油门,让车沿着一条平滑的减速弧线滑向终点。Cosine(余弦退火)调度做的正是这件事:让学习率沿着余弦函数优雅地滑向谷底,而不是像 Step 那样一节节往下跳。

余弦退火出自 Loshchilov 与 Hutter 在 2017 年的研究(ICLR 论文《SGDR: Stochastic Gradient Descent with Warm Restarts》)。它的核心思想很简单:不搞“阶梯式急刹”,而是每一步都按余弦函数微微降低一点学习率,让模型在最优解附近的盆地中有充裕时间精细打磨,收敛得更加细腻。

相比 Step 的“急刹”,余弦退火的“滑行”让损失曲线少了许多毛刺。更有意思的是,研究者还发现可以周期性“热重启”——每次快衰减到底时,突然把学习率拉回高位,让模型跳出次优解、重新出发去更广阔的天地探索。这就是著名的 SGDR 热重启策略。

ηt=ηmin⁡+(ηmax⁡−ηmin⁡)⋅1+cos⁡(πtT)2\displaystyle \eta_t = \eta_{\min} + (\eta_{\max} - \eta_{\min}) \cdot \frac{1 + \cos\left(\pi \frac{t}{T}\right)}{2}
其中 T 为总训练步数。t=0 时 cos(0)=1,学习率等于 η_max;t=T 时 cos(π)=−1,学习率降到 η_min。整条曲线像一条从高处滑向低处的滑梯,越接近终点越是轻柔。
  1. η_max 与 η_min(上下界)调度区间的最高点与最低点,一般 η_min 取 η_max 的 1%~5%。
    ηmax⁡,ηmin⁡\eta_{\max}, \eta_{\min}
  2. 相位角 πt/T把训练进度从 0 到 1 映射成 0 到 π 的角度,控制余弦曲线的位置。
    πtT\pi \frac{t}{T}
  3. 余弦函数cos 在 0 到 π 之间从 1 平滑递减到 −1,天然构成一条下坡滑梯。
    cos⁡(πtT)\cos\left(\pi \frac{t}{T}\right)
  4. 整体缩放加 1 除以 2,把 [−1, 1] 映射到 [0, 1],再乘上区间长度并加 η_min,得到最终学习率。
    1+cos⁡(⋅)2\frac{1 + \cos(\cdot)}{2}

组合调度

一位真正的高手从不只用一个技巧:出发时先热车,上高速后定速巡航,接近终点再优雅滑行。现代 AI 圈最流行的组合策略正是 Warmup + Cosine:学习率先线性预热到峰值,再按余弦曲线退火到低谷。这套“油门剧本”几乎统治了 2020 年之后的大模型训练。

从 GPT 系列到 LLaMA、BERT,几乎所有大模型都在用这套配方。原因很简单:Warmup 解决的是出发时的稳定性——随机初始化的参数太脆弱;Cosine 解决的是到达时的精细度——后期需要小步慢走精雕细琢。两者各管一段,职责互补,堪称天作之合。

这套“预热 + 余弦”之所以成为行业标配,正因为它在关键时刻都做了正确的事:起步不飘、冲刺不冲、收尾不抖。当你在论文里看到 "Cosine schedule with warmup" 时,你心里应该浮现出那位从容不迫的老司机——他先热车,再滑翔,最后精准地停在布达拉宫门前。

ηt={ηmax⁡⋅tTwarm,t<Twarmηmin⁡+(ηmax⁡−ηmin⁡)⋅1+cos⁡(πt−TwarmT−Twarm)2,t≥Twarm\displaystyle \eta_t = \begin{cases}\eta_{\max} \cdot \dfrac{t}{T_{\text{warm}}}, & t < T_{\text{warm}} \\[8pt]\eta_{\min} + (\eta_{\max}-\eta_{\min}) \cdot \dfrac{1+\cos\left(\pi\dfrac{t-T_{\text{warm}}}{T-T_{\text{warm}}}\right)}{2}, & t \ge T_{\text{warm}}\end{cases}
前半段是线性爬坡,后半段是余弦滑坡,在 T_warm 处两段完美衔接——学习率到达峰值后不停顿,直接开始平滑下降。
  1. 分段条件训练以 T_warm 为界分为两段,两个公式各管一段,各司其职。
    t<Twarmt < T_{\text{warm}}
  2. 预热段线性项t/T_warm 从 0 匀速爬到 1,学习率从 0 升到峰值。
    ηmax⁡⋅tTwarm\eta_{\max} \cdot \frac{t}{T_{\text{warm}}}
  3. 退火段余弦项把预热之后的时间归一化到 0~1,再套用余弦退火公式平滑下降。
    1+cos⁡(π⋅t−TwarmT−Twarm)2\frac{1 + \cos\left(\pi \cdot \frac{t - T_{\text{warm}}}{T - T_{\text{warm}}}\right)}{2}
  4. 峰值衔接t=T_warm 时两段公式都等于 η_max,曲线无断裂,切换如丝般顺滑。
    ηTwarm=ηmax⁡\eta_{T_{\text{warm}}} = \eta_{\max}

工程实践

知道“配方”不等于能做出好菜。老司机的经验在于面对不同路况微调油门:路宽车少可以开快些,山路弯多必须放慢。工程中调整学习率调度,也有几条经过千万次实验打磨出来的经验法则,掌握它们能让你少走许多弯路。

第一条是“线性缩放规则”:当 batch size 扩大 k 倍时,梯度估计更稳定,峰值学习率也应大致乘以 k。第二条是经验比例:Warmup 步数通常取总步数的 5%~10%;余弦退火的低谷一般设为峰值的 1%~5%,而不是直接降到 0——留一点“怠速”,模型才能在最后阶段继续微调。

工程上还要养成两个好习惯:把学习率曲线打出来看,把 loss 曲线打出来对照。如果 loss 在某个“急刹点”突然抖动,说明 Step 衰减过猛;如果训练前期就发散,说明 Warmup 太短或峰值太高;如果后期 loss 纹丝不动,可能是低谷学习率设得太低导致模型“僵死”。老司机的直觉,就是这样一帧一帧看监控练出来的。

ηnew=ηold×BnewBold\displaystyle \eta_{\text{new}} = \eta_{\text{old}} \times \frac{B_{\text{new}}}{B_{\text{old}}}
B 表示 batch size。把 batch 从 256 加到 1024(4 倍),峰值学习率也近似乘以 4,两者配合才能在相同的步数里收敛到相近的效果。
  1. B_old 与 B_new(前后批次)调整前后的批次大小,工程中常以 2、4、8 的倍数变化。
    Bold, BnewB_{\text{old}},\ B_{\text{new}}
  2. 比值缩放批次扩大多少倍,学习率就放大多少倍,这就是线性缩放规则的数学形式。
    BnewBold\frac{B_{\text{new}}}{B_{\text{old}}}
  3. 适用范围该规则在 batch 扩大 8 倍以内基本成立,再大时需配合更长的 Warmup 谨慎调整。
    ηnew=ηold×k\eta_{\text{new}} = \eta_{\text{old}} \times k

前沿扩展

会开车的人也许只求稳妥,但赛车手总想挑战更多花样。前沿的学习率调度同样不止一种玩法,其中最出名的是 OneCycle 与 SGDR 热重启,它们把“踩油门”从一门手艺变成了一门艺术。

OneCycle 策略让学习率先从低谷线性升到峰值,再一路降回低谷,全程只跑一个“大周期”。它能在极短的训练时间内冲到较好的收敛点,特别适合需要快速迭代的场景。SGDR(带热重启的随机梯度下降)则更为激进:每过一个周期,学习率立刻被拉回高位,让模型跳出局部最优,带着上一段旅程的记忆去探索新区域。

从固定步长到指数衰减,再到 Warmup、Cosine、OneCycle、SGDR,学习率调度的进化像一部驾驶技术进化史:越来越懂得该快时快、该慢时慢,甚至敢于在关键时刻一脚油门重新出发。理解了这条主线,你再去读任何一篇大模型训练论文,都能一眼看穿作者“踩油门”的意图——而这,正是超参数调优的真正内功。

ηt=ηmin⁡+12(ηmax⁡−ηmin⁡)(1+cos⁡(π⋅t mod TiTi))\displaystyle \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})\left(1 + \cos\left(\pi \cdot \frac{t \bmod T_i}{T_i}\right)\right)
其中 T_i 是第 i 个周期的长度。取模运算让余弦曲线周而复始:学习率降落又弹起,像弹簧一样反复蓄力。每次重启,模型都带着上一阶段的经验重新出发。
  1. t mod T_i(取模)把全局步数映射到一个周期内的位置,实现循环往复。
    t mod Tit \bmod T_i
  2. T_i(周期长度)每个周期持续的步数,实践中常随周期序号递增,越到后面周期越长。
    TiT_i
  3. 余弦项与普通余弦退火相同的滑梯曲线,只是被取模“折叠”成一段段重复的锯齿。
    cos⁡(π⋅t mod TiTi)\cos\left(\pi \cdot \frac{t \bmod T_i}{T_i}\right)
  4. 整体含义学习率在每个周期内从高到低,周期结束时立刻弹回高位,开始新一轮探索。
    ηt=ηmin⁡+12(ηmax⁡−ηmin⁡)(1+cos⁡(⋅))\eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})(1 + \cos(\cdot))

AI 应用场景

大语言模型预训练

阶段:模型训练与超参数调优

解决的问题:GPT、LLaMA 等大模型参数动辄千亿,训练初期梯度剧烈波动,直接上大学习率极易发散;后期若学习率下不去,又无法收敛到高质量解。Warmup + Cosine 同时解决“起步不稳”和“收尾不精”两大痛点,还天然适配海量数据上的超长训练。

具体案例:训练一个 70 亿参数的 LLaMA 类模型,共消耗 2 万亿 token、约 40 万步。工程师设置 2000 步线性 Warmup,峰值学习率 3×10⁻⁴,随后按余弦退火降至 3×10⁻⁵。前 2000 步模型 loss 平稳下降无尖峰,后期曲线平滑收敛,最终困惑度显著优于固定学习率基线。

视觉模型微调

阶段:迁移学习与模型微调

解决的问题:用 ImageNet 预训练的 ResNet 微调到医疗影像分类时,固定学习率要么收敛慢、要么直接过拟合;学习率太大容易把预训练权重“冲坏”,太小又学不到新任务特征。短 Warmup 保护预训练特征,余弦退火让模型在新数据上稳定收敛。

具体案例:某医疗 AI 团队将 ResNet50 微调到肺炎 X 光片分类,采用 5 个 epoch 的 Warmup 加 30 个 epoch 的余弦退火,准确率比固定学习率提升约 3 个百分点,且验证集曲线更加平滑,减少了调参时间。

推荐系统 CTR 模型

阶段:在线学习与增量训练

解决的问题:广告推荐模型每天都用新数据增量训练,数据分布不断漂移,固定学习率难以兼顾“快速吸收新分布”和“稳定保留旧知识”。Warmup 帮助模型平稳接纳新分布带来的冲击,余弦退火保证当天训练稳定收敛。

具体案例:某电商推荐团队的 DeepFM 模型每日全量重训,设置 1000 步 Warmup 与覆盖总训练步数 20% 的余弦退火尾部,线上 CTR 指标周环比稳定提升,且训练过程的 loss 尖峰数大幅减少。

Python 演示

python29 行
import math class WarmupCosineSchedule:    """模拟 PyTorch 中 Warmup + Cosine 组合调度器。"""     def __init__(self, warmup_steps, total_steps, peak_lr, min_lr=0.0):        self.warmup_steps = warmup_steps        self.total_steps = total_steps        self.peak_lr = peak_lr        self.min_lr = min_lr     def get_lr(self, step):        if step < self.warmup_steps:            # 线性预热:从 0 爬到峰值            return self.peak_lr * (step + 1) / self.warmup_steps        # 余弦退火:从峰值滑向低谷        progress = (step - self.warmup_steps) / max(1.0, self.total_steps - self.warmup_steps)        cosine = 0.5 * (1.0 + math.cos(math.pi * progress))        return self.min_lr + (self.peak_lr - self.min_lr) * cosine def main():    sched = WarmupCosineSchedule(warmup_steps=10, total_steps=50, peak_lr=1e-3, min_lr=5e-5)    for step in range(50):        lr = sched.get_lr(step)        if step % 5 == 0 or step == 49:            print("step=%2d  lr=%.5f" % (step, lr)) if __name__ == "__main__":    main()
目的:用纯 Python 实现一个 Warmup + Cosine 组合调度器,模拟训练过程中每一轮的学习率变化,无需任何第三方库即可运行。
  1. class WarmupCosineSchedule:定义一个调度器类,封装预热步数、总步数、峰值和低谷学习率四个核心超参数。
  2. return self.peak_lr * (step + 1) / self.warmup_steps预热核心逻辑:用 (step+1)/warmup_steps 从 0 线性爬到 1,加一是为了让第 1 步的学习率不为 0。
  3. progress = (step - self.warmup_steps) / max(1.0, self.total_steps - self.warmup_steps)把预热结束后的训练进度归一化到 0~1,供余弦函数使用。
  4. cosine = 0.5 * (1.0 + math.cos(math.pi * progress))余弦退火的核心公式:progress 从 0 到 1 时,该项从 1 平滑降到 0。
  5. return self.min_lr + (self.peak_lr - self.min_lr) * cosine把余弦值从 [0,1] 映射到 [min_lr, peak_lr] 区间,得到最终学习率。
  6. if __name__ == "__main__":声明程序入口,保证脚本可以被直接执行也能被模块导入。

常见误区

误区反正模型要训练那么多步,预热那几百步学习率小得可怜,不是在浪费算力吗?直接全程都用最大学习率不就好了?

正解恰恰相反,没有预热的模型很可能在开头几百步就“翻车”——随机初始化的参数让梯度巨大且方向混乱,大学习率会让 loss 直接变成 NaN。预热那几步的“慢”,是为了后面上万步的“稳”和“快”。就像发动机不热就地板油,车还没跑出去先熄火了。

为何常见:从直觉上看,学习率越大步子越大、收敛越快,人们容易忽略训练初期梯度方差极高的客观事实。

误区论文里都说余弦退火效果好,那我所有任务无脑切余弦退火,肯定能涨点。

正解余弦退火在视觉分类、大模型预训练等长任务上通常占优,但在短任务或小数据集上,Step 衰减配合早停可能更省事;有些任务甚至需要阶梯式“急刹”带来的扰动来跳出局部最优。调度器是工具,要对症下药,而不是万能药。

为何常见:看到 benchmark 上余弦效果不错,就把它当成银弹,忽略了任务特性和训练预算的差异。

误区既然要收敛,最后把学习率降到 0,模型不就稳稳停在最优点了吗?

正解学习率降为 0 后梯度不再产生有效更新,模型就“僵死”了,甚至会在最后阶段丢失已学到的信息。实际工程中通常保留峰值 1%~5% 的“兜底学习率”,让模型在末段继续细微调整。就像停车前不是突然熄火,而是挂空挡滑行到停车位。

为何常见:把“学习率越小越精细”片面理解成“越小越好”,忽略了更新幅度为零时模型失去学习能力的风险。

误区预热越久起步越稳,那我干脆预热总步数的 30%,反正曲线平滑嘛。

正解预热本质是“牺牲进度换稳定”,占用过多训练预算会让模型长期在低学习率区间空转,损害整体收敛速度。经验上 Warmup 占总步数 5%~10% 已经足够,除非 batch 特别大或数据分布剧烈变化,才需要适当延长。

为何常见:人们把 Warmup 的“稳定性收益”无限放大,却没意识到它本质上是一个训练预算的分配问题。

面试题

Q1. 在梯度下降更新公式 w = w − η∇L 中,学习率 η 主要控制什么?

单选题 · easy

  • A.控制参数每次更新的步长大小← 正确答案
  • B.决定神经网络隐藏层的数量
  • C.决定训练数据集的样本数量
  • D.控制损失函数的具体计算方式

答案:A。学习率直接乘在梯度上,决定参数每次更新的幅度,类比开车时油门踩多深。隐藏层数量属于网络结构,数据集样本量与损失函数形式都与学习率无关,因此 B、C、D 错误。

Q2. 学习率设置过大时,训练最可能出现的现象是?

单选题 · easy

  • A.参数几乎不再发生任何更新
  • B.损失震荡加剧甚至直接发散← 正确答案
  • C.训练时间必然会显著缩短
  • D.模型一定能收敛得又快又好

答案:B。学习率过大的后果是“油门踩太猛冲出路面”——参数一步跨过最优点,损失在巨大值之间来回震荡甚至变成 NaN。参数不更新是学习率为零才有的现象,过大不会缩短训练时间,更不可能保证收敛,故选 B。

Q3. 余弦退火相比于 Step 阶梯衰减,主要优势是?

单选题 · easy

  • A.学习率全程保持恒定不变
  • B.完全不需要设置初始学习率
  • C.学习率平滑下降没有急刹突变← 正确答案
  • D.只适用于验证集而不适用于训练

答案:C。余弦退火每一步都按余弦函数平滑降低学习率,而 Step 是阶梯式骤降,像开车突然踩刹车,容易让损失曲线抖动。余弦退火同样需要设置初始学习率,且作用于训练过程,故选 C。

Q4. Warmup 机制解决的核心问题是?

单选题 · mid

  • A.训练初期参数随机导致梯度不稳← 正确答案
  • B.训练中期的梯度消失问题
  • C.训练后期的过拟合问题
  • D.测试时的推理速度问题

答案:A。模型刚初始化时参数是随机的,梯度方差极大,直接大学习率容易发散;Warmup 让学习率从小爬升,相当于先热车再上高速。梯度消失、过拟合、推理速度都不是 Warmup 的职责,故选 A。

Q5. 余弦退火公式 η_t = η_min + (η_max−η_min)·(1+cos(πt/T))/2 中,T 的含义是?

单选题 · mid

  • A.预热阶段所占用的总步数
  • B.整个调度过程的总训练步数← 正确答案
  • C.模型参数的总体数量
  • D.每次梯度计算的批次大小

答案:B。T 出现在 cos(πt/T) 的分母中,作用是把训练进度归一化到 0~π,因此 T 是调度覆盖的总步数。预热步数是温启动的 T_warm,参数数量、批次大小与余弦相位无关,故选 B。

Q6. 关于 SGDR 热重启策略,下列说法正确的是?

单选题 · mid

  • A.学习率单调递减,永不上涨
  • B.定期把学习率拉回较高数值← 正确答案
  • C.每个周期都从随机权重重新训练
  • D.只适用于批量大小为 1 的场景

答案:B。SGDR 的关键词是“热重启”:每个周期结束时学习率立刻弹回高位,但模型权重保留之前训练的成果,相当于带着经验重新踩油门。它不是从零训练,也不限制 batch 大小,故选 B。

Q7. 现代大模型训练中,余弦退火的低谷学习率通常设在什么范围?

单选题 · hard

  • A.峰值的 50%~80% 保持高位
  • B.直接设置为 0 以获得最佳解
  • C.峰值的 1%~5% 作为兜底← 正确答案
  • D.大于峰值以加速后期收敛

答案:C。低谷设为 0 会让模型在后期“僵死”,失去微调能力;保持过高又无法精细收敛。工业界普遍把低谷设在峰值的 1%~5%,既保留微调能力,又足够收敛,故选 C。

Q8. 以下哪些属于常见的学习率调度策略?

多选题 · mid

  • A.Step 阶梯式衰减策略← 正确答案
  • B.指数衰减调度策略← 正确答案
  • C.余弦退火调度策略← 正确答案
  • D.全连接层剪枝策略

答案:ABC。Step 阶梯衰减、指数衰减、余弦退火都是经典学习率调度器,分别对应“定点急刹”“缓慢收油”“优雅滑行”。全连接层剪枝属于模型压缩技术,与学习率调度无关,故选 A、B、C。

Q9. 关于 Warmup + 余弦组合调度的说法,正确的有哪些?

多选题 · hard

  • A.先线性预热再余弦退火下降← 正确答案
  • B.兼顾起步稳定与收尾平滑← 正确答案
  • C.预热阶段直接采用峰值学习率
  • D.只适用于 GPT 类生成模型

答案:AB。组合调度的标准形态是预热段线性爬升、之后余弦退火,起点稳、终点细,两段互补。预热阶段不可能直接用峰值,否则就失去了预热的含义;该策略广泛用于各类模型而非生成模型专属,故选 A、B。

Q10. 在工程中正确调试学习率调度的做法有哪些?

多选题 · hard

  • A.Warmup 步数常取总步数的 5%~10%← 正确答案
  • B.打印学习率曲线与损失曲线对照检查← 正确答案
  • C.增大批次时按比例提高峰值学习率← 正确答案
  • D.调度器与优化器完全无关,可随意组合

答案:ABC。工程上 Warmup 经验占比为 5%~10%;画 LR 曲线与 loss 曲线对照能定位发散、抖动等问题;batch 扩大 k 倍时按线性缩放规则把峰值 LR 乘 k。调度器虽独立于优化器,但需要按优化器特性(如带动量)协同配置,并非随意组合,故选 A、B、C。