编程与 AI15 分钟阅读更新于 2026-08-03

Transformer 为什么需要学习率预热:从 Adam 到训练稳定性

从 Transformer 的训练设置出发,理解 Adam 如何利用梯度、学习率预热和衰减如何配合,以及残差连接、层归一化和梯度规模怎样共同影响训练稳定性。

相关工具

模型结构搭好之后,训练还不一定稳定

Transformer 的注意力、前馈网络、残差连接和层归一化解决了表示计算问题,但模型能否顺利学到东西,还取决于参数如何更新。训练过程中,每个批次会产生梯度,优化器根据梯度调整参数,学习率决定每次调整的步幅。

步幅太大,参数可能在损失较低的区域来回跳动,甚至直接发散;步幅太小,模型学习会非常缓慢,长期停留在不理想的位置。Transformer 层数多、参数多、矩阵运算密集,训练初期尤其需要谨慎控制更新幅度。

原始 Transformer 论文采用 Adam 优化器,并使用带预热的学习率方案。理解这两个选择,有助于把“模型结构”和“训练过程”联系起来。

学习率决定每一步走多远

设某个参数为 θ,损失对它的梯度为 g。最简单的梯度下降会按照 θ_new=θ-ηg 更新,其中 η 就是学习率。梯度告诉我们损失增加最快的方向,负梯度是希望下降的方向,学习率则决定沿这个方向走多远。

学习率不是越大越好。训练开始时参数和表示还没有形成稳定状态,过大的更新可能让注意力分数、前馈激活和输出概率同时发生剧烈变化;训练后期则通常需要更小步长,在较好的区域附近细致调整。

因此,很多训练方案不会从头到尾使用一个完全固定的学习率,而是根据训练步数逐步调整。预热与衰减就是最常见的一种节奏。

Transformer 训练中学习率预热阶段和衰减阶段的曲线图
Transformer 的学习率预热与衰减

学习率先逐步升高帮助训练稳定起步,再逐步下降促进后期收敛。

Adam 为什么适合处理 Transformer 的梯度

Adam 可以看成把动量和自适应学习率结合起来。它会记录梯度的一阶矩,也就是带方向的指数移动平均;同时记录梯度平方的二阶矩,用来估计不同参数方向上的变化规模。

如果某个参数的梯度长期朝同一方向,动量项可以让更新更平滑;如果某个参数的梯度波动很大,二阶矩可以相应调整它的有效步幅。不同参数不再完全共享同一种更新尺度。

Adam 还会进行偏置修正,因为训练初期的一阶矩和二阶矩从 0 开始,直接使用会低估真实统计量。完成修正后,优化器再结合全局学习率更新参数。

Adam 优化器从梯度到一阶矩二阶矩再到参数更新的流程图
Adam 优化器的基本流程

Adam 根据梯度维护一阶矩和二阶矩,完成偏置修正后,为不同参数计算自适应更新步长。

Adam 不等于可以随意放大学习率

Adam 会根据梯度历史调整不同参数的相对步幅,但全局学习率仍然控制更新的总体尺度。自适应并不意味着任何学习率都安全,学习率过大仍可能让模型发散,过小也会让训练停滞。

β1、β2 和 ε 等超参数会影响动量记忆、方差估计和数值稳定性。很多情况下,先使用合理的默认设置,再根据损失曲线和梯度行为调整学习率,比同时改变所有优化器参数更容易判断原因。

还要区分 Adam 与 AdamW。两者都使用类似的自适应梯度更新,但权重衰减的处理方式不同。阅读训练配置时,优化器名称不能只看成一个无关紧要的实现细节。

学习率预热为什么放在训练开始

预热阶段从较小学习率开始,在设定的若干步内逐渐升到目标峰值。训练初期,词嵌入、位置表示、注意力投影和输出层都还没有形成协调关系,较小步幅可以让参数先建立一个较平稳的共同状态。

随着模型开始产生有意义的梯度,学习率逐渐增大,训练可以更有效率地离开初始区域。预热不是让模型慢慢“适应数据”这么简单,它是在控制早期更新的风险。

预热步数太短,可能仍然无法避免初始震荡;太长,则会让有效学习阶段变短。合适的设置与批次大小、模型规模、数据量和总训练步数有关。

为什么后期要衰减学习率

训练前期的目标是快速找到较好的参数区域,后期则更需要在这个区域附近做细致调整。持续使用峰值学习率,可能让参数在较优位置附近来回跳动,损失下降不够平滑。

学习率衰减可以是线性的、余弦形式的、按阶段下降的,或者采用原始 Transformer 中常见的随步数变化的方案。具体曲线不同,但共同思想是随着训练推进逐步减少更新步幅。

衰减不等于训练马上停止。它只是让每次更新更谨慎,模型仍然会继续根据梯度调整参数。最终学习率是否接近 0,要结合总训练步数和停止条件判断。

表示尺度和梯度传播也会影响稳定性

优化器和学习率之外,Transformer 内部的数值尺度同样重要。层归一化可以调整每个位置的特征分布,残差连接提供更直接的信息和梯度路径,二者共同帮助信号在多层结构中传播。

如果注意力分数、前馈激活或残差相加后的数值尺度变化过大,梯度可能变得不稳定。缩放点积中的 √d_k、初始化方式、归一化位置和激活函数,都会影响这些数值。

所以,训练不稳定时不能只盯着学习率。要同时观察损失是否突然变成 NaN、梯度范数是否爆炸、激活是否过大,以及 Pre-LN 或 Post-LN 结构是否与预期一致。

Transformer 训练稳定性从表示尺度到优化器学习率和验证损失的因素链路图
影响 Transformer 训练稳定性的因素

表示尺度、残差与归一化、梯度传播、Adam、学习率调度和验证损失共同影响训练过程。

梯度裁剪什么时候有用

梯度裁剪会在梯度范数超过阈值时缩小梯度,避免某一次更新过大。它可以缓解梯度爆炸造成的训练异常,尤其是在深层网络、长序列或批次梯度波动较大时。

梯度裁剪不是把所有训练问题都隐藏起来。如果损失长期不下降、输入数据错位或学习率设置严重不合理,裁剪只会限制表面症状,不能修复根本原因。

使用裁剪时要记录裁剪发生的频率和梯度范数。如果几乎每一步都触发,说明原始梯度或学习率可能需要重新评估,而不是无限制地把阈值调得更小。

如何看训练曲线判断问题

损失在训练初期突然升高、变成 NaN,常提示学习率过大、梯度爆炸、输入数值异常或掩码与损失处理存在问题。损失缓慢下降但长期没有改善,可能与学习率过小、模型容量不足或数据目标不清有关。

训练损失持续下降而验证损失开始上升,说明模型可能过度适应训练数据,需要关注数据量、正则化、训练轮数和验证分布。验证损失平稳但生成结果变差,则还要检查解码策略和输出长度。

单条曲线不够说明问题。最好同时记录学习率、梯度范数、训练损失、验证损失和固定样本输出,把数值变化与生成行为放在一起看。

训练稳定性的四个检查点

第一看数据和目标是否对齐,避免把训练标签错误归因于优化器。第二看表示和梯度的数值范围,确认没有明显爆炸或消失。第三看 Adam、学习率预热与衰减是否按预期运行。第四看验证集和固定样本,确认损失下降真的带来了任务改进。

这四步从输入一直覆盖到输出,能把“模型学不好”拆成数据、结构、优化和评估四类问题。排查时最好一次只改一个主要因素,否则很难知道是哪项调整产生了效果。

训练稳定不等于训练有效。一个非常平稳但几乎不下降的损失,同样说明配置需要调整。稳定性是达到更好结果的基础,不是结果本身。

训练稳定性的四个检查点
步骤 1
目标对齐

确认输入、标签、掩码和有效位置处理正确。

步骤 2
数值范围

观察激活、梯度和损失是否出现异常。

步骤 3
优化调度

核对 Adam、预热、衰减和梯度裁剪。

步骤 4
验证效果

同时查看验证损失和固定样本输出。

把训练配置放回 Transformer 主线

Transformer 的训练稳定性来自多个层面的共同作用:注意力中的缩放控制分数范围,残差连接和层归一化帮助深层表示传播,Adam 根据梯度历史调整更新,学习率预热和衰减控制训练节奏,验证集则帮助判断模型是否真正学会。

原始论文中的训练设置不是可以脱离结构随意复制的一组数字。模型规模、批次、数据量、词元化和硬件变化后,合适的学习率、预热步数和总训练步数也可能需要重新调整。

理解这些关系后,看到一份 Transformer 训练配置,可以从“参数怎样更新、学习率怎样变化、数值是否稳定、验证效果是否改善”四个角度读懂它,而不是只记住优化器名字。

常见问题

为什么学习率不能从训练一开始就用最大值?

训练初期参数和表示尚未稳定,过大的更新可能导致损失震荡或发散,预热可以降低早期更新风险。

Adam 会不会自动解决学习率问题?

不会。Adam 会根据梯度历史调整不同参数的相对步幅,但全局学习率仍然决定更新总体尺度。

梯度裁剪能解决所有训练不稳定吗?

不能。它主要缓解梯度过大造成的问题,数据错位、学习率不合理和结构实现错误仍需要单独排查。