趋近智
选择合适的优化器,如Adam或AdamW,只是成功训练大型Transformer模型的一部分。学习率作为控制优化过程中步长的基本超参数,通常需要在整个训练过程中仔细调整。简单使用固定学习率通常是次优的,并可能导致不稳定或收敛缓慢,尤其考虑到涉及的复杂损失曲面和深度结构。因此,学习率调度变得必要。
学习率调度定义了一种在训练期间动态改变学习率的策略。对于Transformer模型,一种常见且高效的方法是结合“热身”阶段和随后的“衰减”阶段。
在训练的初始阶段,模型的参数是随机初始化的,梯度可能很大且不稳定。从一开始就使用高学习率可能会导致显著的更新,从而破坏训练过程的稳定性,可能使优化器偏离参数空间的良好区域。这对于Transformer模型来说尤其如此,因为层归一化、残差连接和注意力机制之间的互相影响对早期大参数变化很敏感。
热身阶段通过从非常小的学习率(通常为零)开始,并在预设的初始训练步数(即 warmup_steps)内逐渐增加学习率来解决这个问题。线性增加是常见的:
在此,lrpeak 是调度在热身阶段后将达到的最大学习率。这种渐进式增加允许模型在应用更大参数更新之前稳定下来,防止早期发散并促进更平滑的收敛。
一旦热身阶段完成且学习率达到峰值 (lrpeak),逐步降低它是有益的。这个衰减阶段有以下几个作用:
热身阶段后,几种衰减策略常被使用:
逆平方根衰减: 这种策略在原始论文“Attention Is All You Need”中被采用。热身之后,学习率与步数的逆平方根成比例地减小:
lrstep=lrpeak×stepwarmup_steps当 step≥warmup_steps或者,更常见的是直接参照论文中的公式实现(使用模型维度 dmodel 和一个缩放因子):
lrstep=dmodel−0.5×min(step−0.5,step×warmup_steps−1.5)此公式将线性热身和逆平方根衰减结合到一个表达式中。请注意,lrpeak 由 dmodel−0.5 和 warmup_steps 隐式定义。
余弦衰减 (余弦退火): 学习率遵循余弦曲线,在剩余的训练步数中从 lrpeak 降至最小值(通常为零)。这提供平滑、渐进的下降。
lrstep=lrmin+0.5×(lrpeak−lrmin)×(1+cos(total_steps−warmup_steps(step−warmup_steps)×π))其中 lrmin 是目标最小学习率(例如0),total_steps 是计划的总训练步数。
线性衰减: 学习率在剩余步数中从 lrpeak 线性下降到最小值(通常为零)。
lrstep=lrmin+(lrpeak−lrmin)×total_steps−warmup_stepstotal_steps−step指数衰减: 学习率以固定间隔或每一步乘以一个小于1的衰减因子。
衰减策略的选择会影响最终模型性能,经验评估通常是必要的。余弦衰减和逆平方根衰减是训练Transformer模型时尤其受欢迎的选择。
热身和衰减的组合随时间形成一个典型的学习率曲线。以下图表示例一个典型的调度,包含线性热身和随后的逆平方根衰减。
学习率调度,包含10步热身阶段,达到0.0005的峰值,随后是逆平方根衰减。
大多数深度学习框架都提供内置支持,使学习率调度器可以轻松与优化器集成。
torch.optim.lr_scheduler 模块提供多种调度器,例如 LambdaLR(用于逆平方根等自定义函数)、CosineAnnealingLR、LinearLR 和 SequentialLR(用于连接热身和衰减)。通常在每次优化器 step() 调用后调用调度器的 step() 方法。tf.keras.optimizers.schedules 模块提供诸如 PolynomialDecay(可以实现线性衰减)、CosineDecay 的类,并允许通过继承 LearningRateSchedule 创建自定义调度。这些调度在初始化时直接传递给优化器。调度的具体参数(lrpeak、warmup_steps、衰减类型、total_steps)是重要的超参数,通常需要根据所使用的特定模型大小、数据集和批次大小进行调整。选择合适的调度并调整其参数是获得最佳性能和Transformer模型稳定训练的必要步骤。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造