想象你刚拿到驾照,第一次独自坐进一辆性能强劲的车。如果一上来就把油门踩到底,会发生什么?车子会像受惊的野马一样猛窜出去,方向盘还没来得及把稳,车身就歪斜乱晃,甚至直接冲出马路牙子。而任何一位靠谱的教练都会先让你驶入空旷的停车场,用怠速慢慢绕圈,熟悉刹车和油门的脾气,等手脚协调了再一点一点加速,最后才汇入高速车流。 深度学习模型的训练,正是这样一场“学开车”。刚初始化的随机权重就像手脚不听使唤的新手,梯度是它感受到的路面变化,而学习率就是油门大小。如果在起步阶段就把学习率设得很大,参数更新会剧烈震荡,损失函数像喝醉了酒一样乱跳,严重时直接发散“翻车”。Warmup 预热策略,就是在训练最初的一小段路上,让学习率从零缓慢爬升到目标值,给模型一段“练车”的时间。它看起来只是个不起眼的小技巧,却是 Transformer、BERT、GPT 等大模型训练的标配,也是每一位 AI 工程师的必修课。

岗位关联

理解 Warmup 的数值稳定性原理,能让你在训练大模型时少踩无数“发散”的坑,这正是工业界 AI 工程师的核心竞争力之一。

目录
  1. 可视化演示
  2. 初期震荡危机
  3. 预热核心原理
  4. 常见实现方式
  5. Adam优化配合
  6. 训练阶段划分
  7. 实际应用实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示Warmup预热策略中学习率从零递增的原理、线性与余弦Warmup对比、有无Warmup训练效果差异的交互式动画。

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

Warmup预热原理 训练初期学习率从零逐步递增 避免随机权重下大学习率导致梯度震荡 lr = target_lr × (step / warmup_steps) Warmup使模型平稳度过训练初期阶段

初期震荡危机

想象一个刚拿到驾照的新手,第一次坐上驾驶座就一脚把油门踩到底。汽车会怎样?转速瞬间爆表,车身左右摆动,方向完全失控,运气不好直接冲进隔离带。深度学习训练的开局,很像这种场景——模型刚刚完成随机初始化,权重就像“手脚不协调的新手”,而学习率就是那把油门。

训练的本质是用梯度下降更新参数:每一步,模型沿着梯度指出的方向挪动一小步,步子大小由学习率决定。类比开车,梯度是路面坡度提示,学习率是你踩油门的力度。刚初始化的模型,每个方向都是乱猜的,梯度此时又大又吵。如果一上来就把学习率设得很大,等于第一次上路就地板油——参数一步迈出“十里地”,越过损失函数的低谷,在两侧来回横跳。

这个现象在深层网络中尤其明显:随机初始化后,各层激活值的方差尚未对齐,梯度信号含有大量噪声。极端情况下,一次过大的更新会把权重推到损失面陡峭甚至发散的区域,损失值飙升为 NaN,训练彻底失败。在训练曲线上,你会看到损失像病危心电一样剧烈跳动,而不是平稳下降。

所以,就像教练绝不会让新手第一天就上高速,训练的头几步也不能直接猛踩油门。与其冒险大步流星,不如让模型先在原地小步试探——这正是 Warmup 策略登场的理由。

θt+1=θt−ηt∇θL(θt)\displaystyle \theta_{t+1} = \theta_t - \eta_t \nabla_{\theta} \mathcal{L}(\theta_t)
这是梯度下降的更新规则:新参数 = 旧参数 − 学习率 × 梯度,学习率越大步子越猛。
  1. 当前权重 \theta_t第 t 步时模型拥有的全部参数,相当于新手当前的车身姿态与方向。
    θt\theta_t
  2. 学习率 \eta_t这一步的“油门力度”,决定参数挪动的步长大小。
    ηt\eta_t
  3. 梯度方向损失函数对参数的偏导,告诉模型“往哪个方向修正最快”。
    ∇θL(θt)\nabla_{\theta} \mathcal{L}(\theta_t)
  4. 负梯度移动量沿负梯度方向走一步,移动量等于学习率乘以梯度;学习率过大时这一步就会“飞出去”。
    −ηt∇θL(θt)-\eta_t \nabla_{\theta} \mathcal{L}(\theta_t)

预热核心原理

老司机带新手练车,第一节课永远是在空旷停车场里,用怠速慢慢挪动。先熟悉方向盘的回正力度、刹车的行程、油门的响应,原地绕几圈,再一点点带油门。这个过程不追求速度,只追求“别一开始就失控”。

Warmup 预热策略的核心思想就是如此:在训练最初的 T_warmup 步内,学习率不从目标值开始,而是从零起步,随着训练步数匀速(或按特定曲线)爬升到目标学习率。这段时间里,模型每一步都走得很小,像怠速挪车一样,先把参数空间里的“路况”摸清楚。

具体实现时,最常用的是线性预热:第 t 步的学习率 = 目标学习率 × (t / T_warmup)。当 t 从 1 增长到 T_warmup,比例因子从 0 增长到 1,学习率随之均匀爬升。预热结束后学习率达到目标值,进入正常训练。预热期虽然短,却让权重从“随机乱撞”过渡到“心中有数”,后续大学习率才敢安全使用。

回到开车场景:从停车场怠速起步,到第一脚轻油,再到逐渐并入城市车道,车速虽然慢,但每一步都稳稳当当。预热就是这个“从怠速到巡航”的平滑过渡,给模型留出足够的掌控时间。

ηt=ηmax⁡×tTwarmup,1≤t≤Twarmup\displaystyle \eta_t = \eta_{\max} \times \frac{t}{T_{\text{warmup}}}, \quad 1 \le t \le T_{\text{warmup}}
线性预热公式:预热期第 t 步的学习率等于目标学习率乘以“已预热步数占比”。
  1. 目标学习率 \eta_{\max}预热结束后要达到的“巡航速度”,也就是你为训练设定的最终学习率。
    ηmax⁡\eta_{\max}
  2. 当前训练步数 t已经训练了多少步,相当于车子已经开了多少米。
    tt
  3. 预热总步数 T_{\text{warmup}}计划用多少步完成从零到满的加速。
    TwarmupT_{\text{warmup}}
  4. 比例因子t 从 1 到 T_warmup 时,比值从 0 到 1 均匀增长,学习率随之线性爬升。
    tTwarmup\frac{t}{T_{\text{warmup}}}

常见实现方式

同样是“先慢后快”,不同司机的脚法也略有差别。有的司机喜欢匀速踩油门,车速直线上升;有的司机追求平顺,前段缓、中段急、后段又缓,让加速过程像一道弧线。Warmup 的世界里,也有这些不同的“脚法”。

最常见的三种方式是线性预热、余弦预热、分段常数预热。线性预热最简单——学习率从零按固定斜率升到目标值;余弦预热用余弦函数把零平滑地“画”到目标值,前段缓慢、中段加快、接近目标时再次放缓;分段常数预热则把预热期切成长度相等的若干段,每段用一个小常数学习率,逐步加大。

不同方案在训练效果上差异通常不大,但它们与后续学习率调度的衔接方式不同。余弦预热因曲线天然平滑,常与余弦衰减搭配,形成“预热-衰减”的对称结构;线性预热则常与线性衰减或 Noam 调度搭配。选择哪种,更多是工程习惯和框架默认值的差异。

就像老司机在不同路况下切换脚法,线性、余弦、分段这三种“开车风格”殊途同归——都保证起步阶段不失控。选择哪一种,本质上只是决定了加速过程中的“舒适度曲线”。

ηt=12ηmax⁡(1−cos⁡(πtTwarmup))\displaystyle \eta_t = \frac{1}{2} \eta_{\max} \left(1 - \cos\left(\frac{\pi t}{T_{\text{warmup}}}\right)\right)
余弦预热公式:学习率在预热期内沿余弦曲线从 0 平滑升至目标值。
  1. 角度参数当 t 从 0 走到 T_warmup 时,这个比值从 0 变为 1,正好对应余弦函数的半周期。
    πtTwarmup\frac{\pi t}{T_{\text{warmup}}}
  2. 余弦值cos 在 0 到 π 之间从 1 单调降到 -1。
    cos⁡(πtTwarmup)\cos\left(\frac{\pi t}{T_{\text{warmup}}}\right)
  3. 整体缩放1 减去余弦值后从 0 平滑升到 2,再乘二分之一,正好从 0 升到 1,最后乘 \eta_{\max} 得到目标学习率。
    12(1−cos⁡(πtTwarmup))\frac{1}{2}\left(1 - \cos\left(\frac{\pi t}{T_{\text{warmup}}}\right)\right)

Adam优化配合

副驾驶位上坐着一位智能教练(Adam),它号称能根据路面情况自动帮你调整油门和刹车。教练有个小本本:记录你每次踩油门的力度和频率(梯度的一阶矩与二阶矩),然后据此动态调节辅助力度。听起来很省心,对吧?但教练刚上车时也有尴尬——小本本上一片空白。

Adam 优化器的核心是两个指数移动平均:一阶矩 m_t 近似梯度均值,二阶矩 v_t 近似梯度平方的均值。问题在于,v_0 初始化为 0,训练开头几步 v_t 严重偏小。Adam 的有效学习率是 η 除以 \sqrt{v_t},分母偏小意味着步长异常偏大——教练对小本本上的统计还没建立起来,就给出了过大的辅助力度。

虽然 Adam 自带偏差修正机制,但并不能完全消除早期步长偏大的问题。于是工业界的标准做法是 Adam 与 Warmup 一起使用:warmup 压低前段学习率 η,正好抵消 Adam 早期有效步长偏大的缺陷,等二阶矩统计量积累得足够可靠了,再放开学习率全速前进。

所以千万别以为“有了 Adam 就不需要 warmup”。恰恰相反,Adam 这个智能教练刚上车时最需要你稳住油门——先让它把驾驶习惯的统计数据记全了,再放心把方向盘交给它。

vt=β2vt−1+(1−β2)gt2,Δθt=ηv^t+ϵm^t\displaystyle v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2, \qquad \Delta\theta_t = \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t
Adam 的二阶矩递推与有效更新步长公式:分母中的 \sqrt{\hat{v}_t} 决定每一步被放大的倍数。
  1. 二阶矩 v_t梯度平方的指数移动平均,相当于教练记录的“踩油门力度的方差”。
    vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2
  2. 衰减系数 \beta_2通常取 0.999,决定历史统计的“记忆长度”。
    β2\beta_2
  3. 偏差修正后的二阶矩 \hat{v}_t修正 v_t 初始为零导致的低估问题。
    v^t=vt1−β2t\hat{v}_t = \frac{v_t}{1 - \beta_2^t}
  4. 有效更新步长当 \hat{v}_t 偏小时,分母偏小,步长异常偏大;warmup 通过压低 η 来补偿。
    ηv^t+ϵ\frac{\eta}{\sqrt{\hat{v}_t} + \epsilon}

训练阶段划分

一次完整的练车行程,教练会把它分成三段:先在停车场热身,熟悉车感;然后上城市道路,正常行驶;快到目的地时,提前收油减速,稳稳停在车位里。Warmup 只是整个训练旅程的“第一段”。

一个完整的学习率调度通常包含:预热起步阶段——学习率从零升到目标值;主训练阶段——学习率保持目标值附近,模型在参数空间中快速收敛;学习率衰减阶段——训练后期逐步调低学习率,让参数在最优解附近精细收敛。三段组合在一起,就是一条完整的“训练速度曲线”。

Transformer 时代最经典的 Noam 调度,把预热和衰减统一进一个公式:当步数小于 warmup 步数时,min 取前一项,学习率线性上升;当步数超过后,min 取后一项,学习率按步数的负二分之一次方衰减。一条公式,同时管住了起步加速与收尾减速。

教练的完整教学计划就是这样:热身、巡航、收油,三个阶段各司其职。只看 warmup 而忽略后面的衰减,就像只练起步、不懂停车,训练同样难以圆满收场。

ηt=dmodel−0.5⋅min⁡(t−0.5,  t⋅Twarmup−1.5)\displaystyle \eta_t = d_{\text{model}}^{-0.5} \cdot \min\left(t^{-0.5}, \; t \cdot T_{\text{warmup}}^{-1.5}\right)
Noam 调度公式:前段线性升温、后段按 t^{-0.5} 衰减,一条曲线覆盖完整训练旅程。
  1. min 函数两个候选值取较小者——预热期第一项小,预热后第二项小,实现自动切换。
    min⁡(t−0.5,  t⋅Twarmup−1.5)\min\left(t^{-0.5}, \; t \cdot T_{\text{warmup}}^{-1.5}\right)
  2. 预热期候选值随 t 线性增长,在 warmup 阶段占主导,让学习率从零爬升。
    t⋅Twarmup−1.5t \cdot T_{\text{warmup}}^{-1.5}
  3. 衰减期候选值随 t 增长而不断减小,在预热结束后占主导,让学习率逐步下降。
    t−0.5t^{-0.5}
  4. 缩放系数用模型隐层维度 d_model 归一化学习率的数量级。
    dmodel−0.5d_{\text{model}}^{-0.5}

实际应用实践

老司机的经验,往往是在一次次翻车和总结中沉淀下来的。Warmup 在工业界的地位,也是被大规模训练的血泪史验证出来的——如今它已成为 Transformer 系列模型的默认配置。

在 BERT、GPT 等预训练中,模型随机初始化后直接以目标学习率起步几乎必然震荡;配置 warmup 后,损失曲线在初始阶段就能保持平滑下降。在大模型预训练中,warmup 步数通常取总训练步数的 1%~10%,例如 20 万步的训练配置 2000 步预热。微调场景同样需要:加载预训练权重后,优化器的统计量是空的,也需要一小段 warmup 让 Adam 重新“记账”。

实践中常用的超参经验是:预热步数约等于总步数乘以一个很小的比例 α,α 通常落在 1%~10% 之间;配合 Adam 时建议同时检查 β_2 的设置(大模型常用 0.95~0.98);如果发现训练初期损失剧烈波动,第一反应不是调低全局学习率,而是先检查 warmup 是否配置合理。

就像每位老司机都懂得“起步要稳”的道理,Warmup 正是大模型训练世界里那条朴素而关键的驾驶准则:真正的老司机,从来不会在点火的第一秒就把油门踩到底。

Twarmup≈α⋅Ttotal,α∈[0.01, 0.10]\displaystyle T_{\text{warmup}} \approx \alpha \cdot T_{\text{total}}, \qquad \alpha \in [0.01,\, 0.10]
工程经验公式:预热步数约等于总训练步数的 1% 到 10%。
  1. 总训练步数 T_{\text{total}}整个训练计划要走的总步数,相当于总行驶里程。
    TtotalT_{\text{total}}
  2. 预热比例 \alpha热身路程占全程的比例,工程经验值在 1% 到 10% 之间。
    α\alpha
  3. 预热步数 T_{\text{warmup}}约等于总步数乘以 α,例如 20 万步的 1% 就是 2000 步。
    Twarmup≈α⋅TtotalT_{\text{warmup}} \approx \alpha \cdot T_{\text{total}}

AI 应用场景

大语言模型预训练

阶段:模型预训练阶段

解决的问题:千亿级参数模型训练成本极高,一次“发散”可能浪费数百万 GPU 小时。从随机权重出发直接大学习率,叠加 Adam 早期二阶矩统计不足,有效步长异常偏大,训练极易不稳定。

具体案例:训练一个 7B 参数的大模型,总步数约 20 万步,工程师配置 warmup_steps=2000(约 1%),学习率从 0 线性升至 3e-4,再配合余弦衰减。监控中模型损失曲线在前 2000 步平滑下降,避免了“起步翻车”。

开源模型微调(迁移学习)

阶段:模型微调阶段

解决的问题:加载预训练权重后,Adam 的状态(一阶矩与二阶矩)是空的,模型需要一小段“重新适应”时间去补齐统计量。若沿用大学习率直接微调,初期几步就可能让权重偏离预训练分布,造成灾难性遗忘。

具体案例:使用 LoRA 微调开源大模型做垂直领域对话,设置 warmup_steps=200~500(约占总步数 1%~3%),学习率从 0 升到 2e-4,微调过程稳定且保留原有能力。

BERT 类模型预训练

阶段:预训练阶段

解决的问题:Transformer 深层堆叠对学习率极其敏感,随机初始化后残差连接与 LayerNorm 之间的动态尚未平衡,直接大学习率容易让注意力分布崩塌。

具体案例:BERT-base 训练约 100 万步,warmup 比例取 10%(10 万步)做线性预热,配合 Adam(β1=0.9、β2=0.999、weight decay 0.01),损失曲线全程平滑,下游任务指标稳定达标。

Python 演示

python65 行
import random  def simulate_training(target_lr, warmup_steps, total_steps, use_warmup,                      initial_x=5.0, noise_scale=0.05, seed=42):    # 在带轻微噪声的二次损失上模拟梯度下降, 返回损失与参数偏移序列    # 损失 f(x) = (x - 1)^2, 梯度 g = 2(x - 1) 加上微小随机噪声    rng = random.Random(seed)    x = initial_x    losses = []    offsets = []    for step in range(1, total_steps + 1):        if use_warmup:            ratio = min(1.0, step / warmup_steps)            lr = target_lr * ratio        else:            lr = target_lr        grad = 2.0 * (x - 1.0) + rng.uniform(-noise_scale, noise_scale)        x -= lr * grad        losses.append((x - 1.0) ** 2)        offsets.append(x - 1.0)    return losses, offsets  def early_swings(offsets, horizon=50, threshold=0.05):    # 统计前 horizon 步内参数在目标值两侧来回跨越的大幅甩尾次数    swings = 0    for i in range(1, min(horizon, len(offsets))):        if offsets[i] * offsets[i - 1] < 0:            if abs(offsets[i] - offsets[i - 1]) > threshold:                swings += 1    return swings  def max_step_jump(offsets, horizon=50):    # 统计前 horizon 步内的最大单步位移, 即最猛的一脚油门    return max(abs(offsets[i] - offsets[i - 1])               for i in range(1, min(horizon, len(offsets))))  def main():    target_lr = 0.9    warmup_steps = 80    total_steps = 200     warm_loss, warm_off = simulate_training(target_lr, warmup_steps, total_steps, True)    raw_loss, raw_off = simulate_training(target_lr, warmup_steps, total_steps, False)     print("First 6 steps loss (with warmup / without warmup):")    for i in range(6):        print("  step {:>2}: {:.4f} / {:.4f}".format(i + 1, warm_loss[i], raw_loss[i]))     print("Early swings in first 50 steps:")    print("  with warmup: {} times".format(early_swings(warm_off)))    print("  without warmup: {} times".format(early_swings(raw_off)))    print("Max single-step jump in first 50 steps:")    print("  with warmup: {:.3f}".format(max_step_jump(warm_off)))    print("  without warmup: {:.3f}".format(max_step_jump(raw_off)))    print("Final loss:")    print("  with warmup: {:.6f}".format(warm_loss[-1]))    print("  without warmup: {:.6f}".format(raw_loss[-1]))  if __name__ == "__main__":    main()
目的:在一个带噪声的二次损失函数上对比“有 warmup”与“无 warmup”两种训练轨迹,直观展示预热如何避免起步阶段的甩尾震荡。
  1. ratio = min(1.0, step / warmup_steps)预热核心:步数占比从 0 到 1 封顶,前 80 步内生效。
  2. lr = target_lr * ratio学习率从 0 线性爬升到目标值,相当于缓慢加油。
  3. grad = 2.0 * (x - 1.0) + rng.uniform(-noise_scale, noise_scale)带噪声的梯度,模拟真实训练中的梯度噪声。
  4. x -= lr * grad梯度下降更新参数,lr 越大这一脚油门越猛。
  5. if offsets[i] * offsets[i - 1] < 0:相邻两步参数跨越目标值,说明发生了“甩尾”。
  6. max(abs(offsets[i] - offsets[i - 1]) ...)统计前 50 步的最大单步位移,衡量起步的激进程度。

常见误区

误区预热期学习率从零开始,整体平均学习率降低了,所以 warmup 本质上就是调低学习率,没什么特别的。

正解Warmup 改变的是学习率的“时间分布”——前段从零爬升、中段到达目标值,峰值学习率本身并未降低。它解决的是“训练初期稳不稳”的问题,而不是“总共学到多少”的问题。好比新手开车,不是让你全程都开慢,而是起步前几百米慢慢地,熟悉之后再正常巡航。

为何常见:从学习率曲线整体看确实像“压缩了前半段面积”,容易产生这种直觉性误会。

误区Adam 是自适应优化器,会自动调整每一步的学习率,所以不需要再手动加 warmup。

正解恰恰相反。Adam 的二阶矩 v_t 初始为 0,早期统计量偏小,导致有效步长 η/√v̂ 异常偏大;偏差修正虽能缓解,但早期大步长问题依然存在。Warmup 压低前段 η 正好补偿这一缺陷。Adam 像副驾教练,但教练也需要时间记笔记。

为何常见:自适应学习率给人一种“全自动”的印象,忽略了它自身的统计初始化偏差。

误区反正预热没坏处,把 warmup 步数设长一点,模型更稳。

正解预热过长会浪费训练预算,因为预热期学习率低于目标值,模型推进缓慢。通常 warmup 步数占总步数 1%~10% 即可,大模型预训练常用几千步。长预热不是更稳,而是更慢。

为何常见:把“稳健”误解为“慢”,忽略了预热期模型进度缓慢的代价。

误区训练计划里有了 warmup,就不要再加学习率衰减了,否则学习率曲线会乱。

正解二者分别作用于训练首尾——warmup 管“起步加速”,衰减管“收尾减速”,天然互补。Noam 调度就是同时包含预热上升段和衰减下降段的完整学习率曲线。就像开车,起步要缓,快到目的地也要缓。

为何常见:把注意力全放在“学习率从零升高”这一段,忽略了完整的训练生命周期。

误区我这个任务不是 Transformer,用不上 warmup。

正解只要有随机初始化权重和大学习率配置,任何深层模型都可能因初期梯度噪声而震荡。Transformer 的深层堆叠放大了问题,所以成为“标配”,但其他深层架构在大学习率训练时同样应优先考虑 warmup 来提升稳定性。

为何常见:由“Transformer 标配→默认方案”的错误归纳得出,忽略了问题本质是随机初始化加过大学习率。

面试题

Q1. Warmup 预热策略在训练初期的核心做法是?

单选题 · easy

  • A.学习率从零逐渐升到目标值← 正确答案
  • B.学习率从一开始设为最大值
  • C.学习率在训练中保持恒定
  • D.学习率先下降再逐渐回升

答案:A。Warmup 的核心就是让学习率从零开始逐渐爬升到目标值,就像新手先在停车场怠速练车再上高速。B 是“地板油”的危险做法,C 是恒定学习率,D 是反向操作,均不符合预热定义。

Q2. 随机初始化后直接使用很大学习率,最可能的结果是?

单选题 · easy

  • A.收敛更快最终精度更高
  • B.损失剧烈震荡甚至发散← 正确答案
  • C.对训练过程没有任何影响
  • D.模型必然产生过拟合

答案:B。随机权重下梯度噪声大,大学习率导致参数大步横跳,损失剧烈震荡甚至发散。A 忽略了初始权重不可靠,C 不可能,D 与过拟合无关。

Q3. 工业实践中 warmup 步数占总训练步数的典型比例约为?

单选题 · mid

  • A.总步数的百分之五十以上
  • B.总步数的百分之三十左右
  • C.总步数的百分之一到十← 正确答案
  • D.全程使用预热不设上限

答案:C。工程经验中 warmup 通常取总步数的 1%~10%,例如 20 万步配 2000 步预热。过大比例会浪费训练预算,所以 A、B、D 都不符合实践经验。

Q4. 为什么 Adam 优化器配合 Warmup 效果更好?

单选题 · mid

  • A.因为 Adam 本身不需要学习率
  • B.早期二阶矩偏小导致步长偏大← 正确答案
  • C.因为 warmup 能消除全部噪声
  • D.因为 β1 在早期取值为负

答案:B。Adam 的二阶矩 v_t 初始为 0,早期统计量偏小,有效步长 η/√v̂ 异常偏大,warmup 压低前段 η 正好补偿。A 错误,Adam 仍需要学习率;C 夸大其词;D 是对 β 参数的误解。

Q5. 下列哪些是常见的 Warmup 实现方式?

多选题 · mid

  • A.线性预热方式← 正确答案
  • B.余弦预热方式← 正确答案
  • C.分段常数预热← 正确答案
  • D.反向传播预热

答案:ABC。线性、余弦、分段常数都是工业界常见的预热实现。D 的“反向传播预热”是编造的概念,反向传播是计算梯度的方法,与学习率调度无关。

Q6. Noam 调度中,当步数超过 warmup 步数后学习率如何变化?

单选题 · mid

  • A.按 t 的负二分之一次方衰减← 正确答案
  • B.学习率保持恒定不变
  • C.继续线性上升至两倍
  • D.按 t 的二分之一次方上升

答案:A。Noam 公式中 min 的第二项 t^{-0.5} 在预热结束后占主导,学习率随步数按负二分之一次方衰减。B、C、D 都与公式的衰减项不符。

Q7. 一个完整的训练学习率调度通常包含哪些阶段?

多选题 · hard

  • A.预热起步阶段← 正确答案
  • B.主训练阶段← 正确答案
  • C.学习率衰减阶段← 正确答案
  • D.反向传播阶段

答案:ABC。完整调度 = 预热起步(热身)+ 主训练(巡航)+ 衰减(收油停车)。D 的“反向传播”是每一轮都要执行的运算过程,不是学习率调度的阶段。

Q8. 关于 Adam 的偏差修正,下列说法正确的是?

单选题 · hard

  • A.偏差修正使早期更新强制为零
  • B.减轻初值偏小导致的步长偏大← 正确答案
  • C.偏差修正只在测试时生效
  • D.偏差修正会消除二阶矩统计

答案:B。偏差修正通过 \hat{v}_t = v_t/(1-β_2^t) 减轻 v_t 初始为零导致的步长偏大,但并不能完全消除,所以 warmup 仍常被采用。A、D 说法错误,C 错在偏差修正在训练时生效而非测试时。

Q9. 以下哪些场景通常建议使用 Warmup?

多选题 · easy

  • A.Transformer 预训练场景← 正确答案
  • B.大语言模型预训练场景← 正确答案
  • C.加载预训练权重后的微调← 正确答案
  • D.零样本推理服务场景

答案:ABC。预训练与微调都属于训练过程,随机初始化或空优化器状态都需要 warmup 稳定起步。D 是推理阶段,不涉及梯度更新,与 warmup 无关。

Q10. 余弦预热中,学习率随时间变化的整体趋势是?

单选题 · hard

  • A.从零平滑升至目标学习率← 正确答案
  • B.从目标值平滑降至零
  • C.先升后降再升再降
  • D.全程恒等于目标值一半

答案:A。余弦预热公式中 1 − cos(πt/T) 在预热期内从 0 平滑攀升到 2,乘以二分之一后从 0 升到目标值。B 是衰减曲线,C、D 均与公式不符。