Transformer 训练的优化器、学习率策略与稳定性调优¶
Transformer 的训练是一个对优化器和超参数极其敏感的过程。不同于传统卷积网络,Transformer 拥有自注意力机制带来的梯度特性,以及大规模参数下的独特挑战。以下逐一剖析训练中的核心优化问题,从 Adam 的内在机理到 loss 尖峰的诊断。
Adam 优化器的更新规则是什么?它结合了哪两种优化器的思想?¶
Adam(Adaptive Moment Estimation)将动量法(Momentum) 和自适应学习率(RMSprop) 的思想融合在一起。它的核心是同时维护梯度的一阶矩(均值)和二阶矩(未中心化的方差)的指数移动平均,并使用这些矩来为每个参数计算独立的、自适应的学习率。
Adam 的完整更新流程:

其中 α 是学习率,ϵ 是防止除零的小常数。
两种思想的结合:
-
一阶矩 mt(动量):累积历史梯度方向,加速收敛,特别是在沟壑地形和鞍点处,帮助梯度保持方向一致性并平滑震荡。
-
二阶矩 vt(自适应学习率):累积梯度平方,相当于估计每个参数梯度的方差。对于频繁更新的参数(大梯度),学习率会被二阶矩的平方根所缩小;对于稀疏更新的参数(小梯度),学习率则相对增大。这相当于给了每个参数一个动态的学习率缩放因子,非常适合处理稀疏特征和多头模型中不同层之间的梯度尺度差异。
两者结合,使 Adam 既具备动量法的快速收敛优势,又拥有 RMSprop 的逐参数自适应能力,是 Transformer 训练中不二的默认选择。
AdamW 与 Adam 的根本区别在哪里?为什么权重衰减要解耦?¶
根本区别:Adam 的权重衰减直接加在梯度上(通过修改损失函数实现 L2 正则化),而 AdamW 的权重衰减是直接对参数本身进行衰减,与梯度更新分离。

为什么需要解耦:
-
在 Adam 中,权重衰减的强度受到自适应学习率的干扰。对于大梯度的参数,学习率被二阶矩大幅缩小,导致权重衰减效果也大幅减弱;对于小梯度参数则相反。这破坏了权重衰减作为通用正则化手段的均匀性,降低了其效果。
-
AdamW 解耦后,权重衰减的强度仅由衰减系数 λ 决定,对所有参数公平,与梯度尺度无关,更能有效地控制模型复杂度,防止过拟合。实验证明,AdamW 相比原 Adam 能获得更好的泛化性能和更稳定的训练。
权重衰减和 L2 正则化在 Adam 中为什么不等价?AdamW 如何修正?¶

这样就保证了权重衰减的独立性,使得正则化效果不再受自适应学习率缩放的影响,泛化性能得以提升。
学习率 Warmup 的作用是什么?如果不用 Warmup 会怎样?¶
作用:学习率 Warmup 是指在训练开始的若干个步骤(或 epoch)内,将学习率从 0 或极小值线性(或按某种曲线)增加到预设的初始学习率。其核心目的是缓解训练初期模型对梯度方向的剧烈变化,避免模型在参数空间中走偏。
具体原因:
-
随机初始化带来的大梯度:在训练开始时,模型权重是随机初始化的,注意力矩阵、FFN 的参数都处于不稳定的初始状态。前几步的梯度可能非常大且方向混乱,如果立即使用大的学习率,模型可能被这些早期的大梯度带到一个很差的局部区域,甚至导致梯度爆炸或 NaN。
-
Adam 的二阶矩需要预热:Adam 在初期的一阶矩和二阶矩都是零,对梯度的估计极不准确。Warmup 给优化器一段缓冲时间来积累合理的动量统计,从而使后续的自适应学习率更加可靠。
-
深层 Transformer 的训练稳定性:Transformer 有多层残差连接和层归一化,但初始化后的方差分布仍然可能不够理想。小学习率在早期相当于给模型一个“轻柔的起点”,让各层的参数逐渐协调。
如果不用 Warmup:模型可能在训练初期就遭遇 loss 尖峰(甚至 NaN),或者早期陷入不良局部最小值,后续无论怎么训练也难以恢复。对于大模型,没有 warmup 几乎必然导致训练失败。
Warmup 的步数通常如何选择?过长或过短有什么影响?¶
选择方法:通常根据总训练步数 Ttotal 的很小比例(如 1%~5%),或者根据经验设置为几千步。对于大模型(数十亿参数),常用 2000~4000 步 warmup;对于小模型,几百到一千步即可。实际中最常用的方法是:设置 warmup 步数占总步数的 1%,例如训练 100K 步,warmup 1K 步。
过短的影响:学习率攀升过快,早期的大梯度仍可能引起参数剧烈震荡,loss 尖峰概率增大,模型可能无法稳定收敛。
过长的影响:学习率长期处于较低水平,前期训练效率低下,浪费计算资源。更重要的是,过长的 warmup 会导致模型在训练早期“欠学习”,当学习率最终达到峰值时,模型可能已经处于一个不太适合高学习率的状态,影响后续收敛速度和最终性能。
经验:一般 1000~4000 步 warmup 对大多数任务足够。如果训练开始时 loss 波动很大,可以适当延长。也可以使用动态 warmup(如根据 loss 的平稳性自动结束)。
常用的学习率衰减策略有哪些?Cosine Annealing 相比线性衰减有什么优势?¶
常用策略:
-
Step Decay:每过一定步数或 epoch,学习率乘以一个衰减因子(如 0.1)。简单粗暴,但衰减不连续,可能错过最优点。
-
Linear Decay:学习率线性减少到零或最小值。变化平缓,适合在收敛后期精细调整。

Cosine Annealing 的优势:
-
初期缓慢衰减,后期快速衰减:余弦曲线初期变化平缓,让模型在较高学习率下充分探索;后期快速降低,使模型更稳定地收敛到极小值。
-
避免剧烈调整:与 step decay 相比,余弦衰减没有突变,训练更平滑。
-
结合 restarts 提升泛化:Cosine Annealing with Warm Restarts(SGDR)通过周期性将学习率重置到高值,帮助模型跳出局部最优,提升泛化性能。
-
实践效果优越:在大量 Transformer 预训练实验中,余弦衰减相比线性衰减通常能带来更低的验证困惑度和更好的下游性能。
为什么 Transformer 训练对学习率非常敏感?有哪些常见的调节策略?¶
敏感的原因:
-
复杂的参数尺度:Transformer 的不同组件(注意力、FFN、嵌入层)对学习率的容忍度不同。注意力矩阵对学习率尤其敏感,过大的学习率会导致注意力分布崩塌。
-
残差连接与梯度尺度:残差连接使得层间梯度可以直接流动,但也可能导致深层梯度爆炸。学习率必须精心匹配每一层的响应。
-
批大小与学习率的耦合:在 Adam 等自适应优化器中,有效步长不仅依赖于学习率,还依赖于二阶矩的累积。这增加了调参的复杂性。
-
训练早期的脆弱性:如上所述,初始阶段的不稳定要求非常保守的学习率起步。
调节策略:
-
使用 Adam/AdamW:自适应学习率缓解了手动为每层设置学习率的问题。
-
Warmup:必不可少,为初始训练提供稳定环境。
-
学习率调度:余弦衰减或线性衰减,让学习率平稳下降。
-
层自适应学习率:对底层使用更小的学习率,顶层使用更大的学习率(如 LLaMA 的做法,通过梯度范数调整)。
-
梯度裁剪:配合使用,防止单步更新过大。
-
小批量正态化:使用 Pre-Norm 架构(如 Pre-LN Transformer),相比 Post-Norm 对学习率更鲁棒。
梯度裁剪有哪几种方式?按值裁剪和按范数裁剪各适用什么场景?¶
按值裁剪(Value Clipping):将每个梯度分量的值限制在 [−c,c][−c,c] 范围内。适用于需要防止单个极端值但保留梯度方向多样性的情况,例如处理离群梯度峰值。
按范数裁剪(Norm Clipping):对整个梯度向量进行 L2 范数计算,如果范数超过阈值 cc,则将整个向量等比例缩放到范数为 cc。这保留了梯度的方向,仅缩放其大小。这是训练 Transformer 等深层网络的首选方式,因为它可以防止由于梯度爆炸导致的单步更新过猛,同时保持原始梯度的相对结构,对于训练稳定性至关重要。
适用场景:
-
按值裁剪:常用于训练 RNN 或某些优化器中,以去除数值异常,但可能改变梯度的方向分布。
-
按范数裁剪:几乎所有 Transformer 训练中都会使用,能有效预防 loss 尖峰和 NaN。
在训练大模型时,发现 loss 突然变为 NaN,可能的原因有哪些?优化器层面如何排查?¶
可能原因:
-
学习率过高:导致参数更新过大,激活值或权重溢出 FP16/BF16 范围。
-
梯度爆炸:深层网络梯度范数过大,未有效裁剪。
-
数值不稳定操作:如注意力 softmax 前未缩放或缩放不当;分母为零的除零错误;FP16 混合精度下溢出。
-
数据问题:输入中存在 NaN 或 Inf 值;极端文本(如超长序列、乱码)。
-
模型权重初始化不当:初始权重过大或过小。
-
优化器状态损坏:Adam 的二阶矩累积了异常梯度,导致学习率缩放后变为 Inf。
优化器层面排查:
-
检查梯度范数:在更新前记录梯度的 L2 范数,若突然爆增,则是梯度爆炸。
-
监控学习率:结合 warmup 和衰减,确保学习率不会突然跳跃。
-
检查 Adam 的一阶矩和二阶矩:可以查看动量值的统计,若出现 NaN 或 Inf,则说明优化器已污染。
-
尝试回滚:保存 NaN 前的 checkpoint,降低学习率或增大梯度裁剪阈值后从该点继续训练。
-
降低混合精度损失:若使用 FP16,开启 loss scaling 并监控缩放因子,或改用 BF16。
如何使用学习率查找器来选择合适的初始学习率?¶
学习率查找器的方法由 Leslie N. Smith 提出,其核心是让学习率在一个小批量上从极小值指数增长到极大值,观察 loss 曲线。具体步骤:
-
选择一个很小的起始学习率(如 1e-7)。
-
在一个 epoch 或几千步内,每步按照指数增长学习率,直到 loss 开始回升或发散。
-
记录每个学习率对应的 loss,绘制 loss 对学习率的对数图。
-
在 loss 下降最快、且还没有发散的区间内,选择一个学习率作为初始值。通常选择 loss 下降最快的点的 1/10 或 1/3 作为安全初始学习率。
这种方法能快速找到模型训练的最佳学习率范围,避免反复试错。
Adam 中的动量参数 β1 和 β2 一般如何设置?调整它们会产生什么效果?¶
Cosine Annealing 的优势:
-
初期缓慢衰减,后期快速衰减:余弦曲线初期变化平缓,让模型在较高学习率下充分探索;后期快速降低,使模型更稳定地收敛到极小值。
-
避免剧烈调整:与 step decay 相比,余弦衰减没有突变,训练更平滑。
-
结合 restarts 提升泛化:Cosine Annealing with Warm Restarts(SGDR)通过周期性将学习率重置到高值,帮助模型跳出局部最优,提升泛化性能。
-
实践效果优越:在大量 Transformer 预训练实验中,余弦衰减相比线性衰减通常能带来更低的验证困惑度和更好的下游性能。
为什么 Transformer 训练对学习率非常敏感?有哪些常见的调节策略?¶
敏感的原因:
-
复杂的参数尺度:Transformer 的不同组件(注意力、FFN、嵌入层)对学习率的容忍度不同。注意力矩阵对学习率尤其敏感,过大的学习率会导致注意力分布崩塌。
-
残差连接与梯度尺度:残差连接使得层间梯度可以直接流动,但也可能导致深层梯度爆炸。学习率必须精心匹配每一层的响应。
-
批大小与学习率的耦合:在 Adam 等自适应优化器中,有效步长不仅依赖于学习率,还依赖于二阶矩的累积。这增加了调参的复杂性。
-
训练早期的脆弱性:如上所述,初始阶段的不稳定要求非常保守的学习率起步。
调节策略:
-
使用 Adam/AdamW:自适应学习率缓解了手动为每层设置学习率的问题。
-
Warmup:必不可少,为初始训练提供稳定环境。
-
学习率调度:余弦衰减或线性衰减,让学习率平稳下降。
-
层自适应学习率:对底层使用更小的学习率,顶层使用更大的学习率(如 LLaMA 的做法,通过梯度范数调整)。
-
梯度裁剪:配合使用,防止单步更新过大。
-
小批量正态化:使用 Pre-Norm 架构(如 Pre-LN Transformer),相比 Post-Norm 对学习率更鲁棒。
梯度裁剪有哪几种方式?按值裁剪和按范数裁剪各适用什么场景?¶
按值裁剪(Value Clipping):将每个梯度分量的值限制在 [−c,c][−c,c] 范围内。适用于需要防止单个极端值但保留梯度方向多样性的情况,例如处理离群梯度峰值。
按范数裁剪(Norm Clipping):对整个梯度向量进行 L2 范数计算,如果范数超过阈值 cc,则将整个向量等比例缩放到范数为 cc。这保留了梯度的方向,仅缩放其大小。这是训练 Transformer 等深层网络的首选方式,因为它可以防止由于梯度爆炸导致的单步更新过猛,同时保持原始梯度的相对结构,对于训练稳定性至关重要。
适用场景:
-
按值裁剪:常用于训练 RNN 或某些优化器中,以去除数值异常,但可能改变梯度的方向分布。
-
按范数裁剪:几乎所有 Transformer 训练中都会使用,能有效预防 loss 尖峰和 NaN。
在训练大模型时,发现 loss 突然变为 NaN,可能的原因有哪些?优化器层面如何排查?¶
可能原因:
-
学习率过高:导致参数更新过大,激活值或权重溢出 FP16/BF16 范围。
-
梯度爆炸:深层网络梯度范数过大,未有效裁剪。
-
数值不稳定操作:如注意力 softmax 前未缩放或缩放不当;分母为零的除零错误;FP16 混合精度下溢出。
-
数据问题:输入中存在 NaN 或 Inf 值;极端文本(如超长序列、乱码)。
-
模型权重初始化不当:初始权重过大或过小。
-
优化器状态损坏:Adam 的二阶矩累积了异常梯度,导致学习率缩放后变为 Inf。
优化器层面排查:
-
检查梯度范数:在更新前记录梯度的 L2 范数,若突然爆增,则是梯度爆炸。
-
监控学习率:结合 warmup 和衰减,确保学习率不会突然跳跃。
-
检查 Adam 的一阶矩和二阶矩:可以查看动量值的统计,若出现 NaN 或 Inf,则说明优化器已污染。
-
尝试回滚:保存 NaN 前的 checkpoint,降低学习率或增大梯度裁剪阈值后从该点继续训练。
-
降低混合精度损失:若使用 FP16,开启 loss scaling 并监控缩放因子,或改用 BF16。
如何使用学习率查找器来选择合适的初始学习率?¶
学习率查找器的方法由 Leslie N. Smith 提出,其核心是让学习率在一个小批量上从极小值指数增长到极大值,观察 loss 曲线。具体步骤:
-
选择一个很小的起始学习率(如 1e-7)。
-
在一个 epoch 或几千步内,每步按照指数增长学习率,直到 loss 开始回升或发散。
-
记录每个学习率对应的 loss,绘制 loss 对学习率的对数图。
-
在 loss 下降最快、且还没有发散的区间内,选择一个学习率作为初始值。通常选择 loss 下降最快的点的 1/10 或 1/3 作为安全初始学习率。
这种方法能快速找到模型训练的最佳学习率范围,避免反复试错。
Adam 中的动量参数 β1 和 β2 一般如何设置?调整它们会产生什么效果?¶
Cosine Annealing 的优势:
-
初期缓慢衰减,后期快速衰减:余弦曲线初期变化平缓,让模型在较高学习率下充分探索;后期快速降低,使模型更稳定地收敛到极小值。
-
避免剧烈调整:与 step decay 相比,余弦衰减没有突变,训练更平滑。
-
结合 restarts 提升泛化:Cosine Annealing with Warm Restarts(SGDR)通过周期性将学习率重置到高值,帮助模型跳出局部最优,提升泛化性能。
-
实践效果优越:在大量 Transformer 预训练实验中,余弦衰减相比线性衰减通常能带来更低的验证困惑度和更好的下游性能。
为什么 Transformer 训练对学习率非常敏感?有哪些常见的调节策略?¶
敏感的原因:
-
复杂的参数尺度:Transformer 的不同组件(注意力、FFN、嵌入层)对学习率的容忍度不同。注意力矩阵对学习率尤其敏感,过大的学习率会导致注意力分布崩塌。
-
残差连接与梯度尺度:残差连接使得层间梯度可以直接流动,但也可能导致深层梯度爆炸。学习率必须精心匹配每一层的响应。
-
批大小与学习率的耦合:在 Adam 等自适应优化器中,有效步长不仅依赖于学习率,还依赖于二阶矩的累积。这增加了调参的复杂性。
-
训练早期的脆弱性:如上所述,初始阶段的不稳定要求非常保守的学习率起步。
调节策略:
-
使用 Adam/AdamW:自适应学习率缓解了手动为每层设置学习率的问题。
-
Warmup:必不可少,为初始训练提供稳定环境。
-
学习率调度:余弦衰减或线性衰减,让学习率平稳下降。
-
层自适应学习率:对底层使用更小的学习率,顶层使用更大的学习率(如 LLaMA 的做法,通过梯度范数调整)。
-
梯度裁剪:配合使用,防止单步更新过大。
-
小批量正态化:使用 Pre-Norm 架构(如 Pre-LN Transformer),相比 Post-Norm 对学习率更鲁棒。
梯度裁剪有哪几种方式?按值裁剪和按范数裁剪各适用什么场景?¶
按值裁剪(Value Clipping):将每个梯度分量的值限制在 [−c,c][−c,c] 范围内。适用于需要防止单个极端值但保留梯度方向多样性的情况,例如处理离群梯度峰值。
按范数裁剪(Norm Clipping):对整个梯度向量进行 L2 范数计算,如果范数超过阈值 cc,则将整个向量等比例缩放到范数为 cc。这保留了梯度的方向,仅缩放其大小。这是训练 Transformer 等深层网络的首选方式,因为它可以防止由于梯度爆炸导致的单步更新过猛,同时保持原始梯度的相对结构,对于训练稳定性至关重要。
适用场景:
-
按值裁剪:常用于训练 RNN 或某些优化器中,以去除数值异常,但可能改变梯度的方向分布。
-
按范数裁剪:几乎所有 Transformer 训练中都会使用,能有效预防 loss 尖峰和 NaN。
在训练大模型时,发现 loss 突然变为 NaN,可能的原因有哪些?优化器层面如何排查?¶
可能原因:
-
学习率过高:导致参数更新过大,激活值或权重溢出 FP16/BF16 范围。
-
梯度爆炸:深层网络梯度范数过大,未有效裁剪。
-
数值不稳定操作:如注意力 softmax 前未缩放或缩放不当;分母为零的除零错误;FP16 混合精度下溢出。
-
数据问题:输入中存在 NaN 或 Inf 值;极端文本(如超长序列、乱码)。
-
模型权重初始化不当:初始权重过大或过小。
-
优化器状态损坏:Adam 的二阶矩累积了异常梯度,导致学习率缩放后变为 Inf。
优化器层面排查:
-
检查梯度范数:在更新前记录梯度的 L2 范数,若突然爆增,则是梯度爆炸。
-
监控学习率:结合 warmup 和衰减,确保学习率不会突然跳跃。
-
检查 Adam 的一阶矩和二阶矩:可以查看动量值的统计,若出现 NaN 或 Inf,则说明优化器已污染。
-
尝试回滚:保存 NaN 前的 checkpoint,降低学习率或增大梯度裁剪阈值后从该点继续训练。
-
降低混合精度损失:若使用 FP16,开启 loss scaling 并监控缩放因子,或改用 BF16。
如何使用学习率查找器来选择合适的初始学习率?¶
学习率查找器的方法由 Leslie N. Smith 提出,其核心是让学习率在一个小批量上从极小值指数增长到极大值,观察 loss 曲线。具体步骤:
-
选择一个很小的起始学习率(如 1e-7)。
-
在一个 epoch 或几千步内,每步按照指数增长学习率,直到 loss 开始回升或发散。
-
记录每个学习率对应的 loss,绘制 loss 对学习率的对数图。
-
在 loss 下降最快、且还没有发散的区间内,选择一个学习率作为初始值。通常选择 loss 下降最快的点的 1/10 或 1/3 作为安全初始学习率。
这种方法能快速找到模型训练的最佳学习率范围,避免反复试错。
Adam 中的动量参数 β1 和 β2 一般如何设置?调整它们会产生什么效果?¶
默认设置:β1=0.9, β2=0.999,这是经过大量实验验证的稳健组合。
-
β1(一阶矩衰减率):控制历史梯度对当前动量方向的影响。增大 β1(如 0.95):模型更依赖长期积累的梯度方向,更新更平滑,可能加速收敛,但对近期梯度变化不敏感,可能错过新方向。减小 β1(如 0.8):模型对近期梯度更敏感,能快速调整方向,但震荡可能增大。
-
β2(二阶矩衰减率):控制梯度平方的指数平均窗口。增大 β2(如 0.9999):二阶矩估计更平滑,学习率调整更稳定,但响应缓慢,可能导致前期训练慢。减小 β2(如 0.99):对近期梯度尺度变化更敏感,自适应学习率调整更快,但可能过于激进导致不稳定。
在训练初期,由于二阶矩为零,β2β2 过大可能导致自适应学习率过高,因此通常与 warmup 配合。
比较 SGD+Momentum 与 Adam/AdamW 在 Transformer 训练中的表现差异,为什么 Adam 系列更流行?¶
SGD+Momentum:
-
优点:泛化能力往往更好,在一些视觉任务和最终微调阶段仍被使用。
-
缺点:需要手动调节学习率和动量,对学习率极其敏感;在训练 Transformer 时收敛极慢,因为不同参数(如注意力头和 FFN 层)的梯度尺度差异大,单一学习率难以适应,容易陷入沟壑。
Adam/AdamW:
-
优点:自适应学习率使得不同参数拥有各自的学习率,特别适合 Transformer 这种不同层、不同头之间梯度差异显著的架构。收敛快,对初始学习率不那么敏感(但仍需合理设置),训练过程更稳定,减轻了人工调参负担。
-
为什么流行:Transformer 预训练数据量大、训练时间长,使用自适应优化器能大幅缩短实验周期,且最终性能往往能追平甚至超越精心调参的 SGD。AdamW 结合解耦权重衰减,兼顾了泛化,已成为 Transformer 训练的标配。
总结来说,Adam 系列解决了 Transformer 训练中最重要的梯度尺度不平衡问题和高效收敛的需求,其稳定性和易用性使其成为工业界和学术界的首选。