余弦退火是一种用于训练机器学习模型,尤其是深度学习模型的学习率调度策略。它通过遵循余弦曲线来调整优化过程中的学习率,从初始较高值开始,平滑下降至最小值,并在指定的周期数或迭代次数内完成。这种方法旨在平衡收敛速度与稳定性,帮助模型更好地逼近损失函数的最优解。由于其简洁高效,该策略在现代神经网络架构的训练中被广泛采用,包括基于Transformer的模型,如大型语言模型。
在优化问题中,学习率决定了每次参数更新时朝着损失函数最小值方向迈出的步长。若学习率恒定不变,可能导致收敛缓慢或震荡:过高的学习率会使参数越过最优点,而过低的学习率则会使训练停滞。余弦退火通过平滑地降低学习率来解决这一问题,使得训练后期能够进行更精细的参数调整。与阶梯式或指数式等骤降型调度不同,余弦退火提供了连续且可微的衰减过程,通常能带来更稳定的训练动态。
数学公式
余弦退火调度的数学定义如下:
\[
\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min}) \left(1 + \cos\left(\frac{t \pi}{T}\right)\right)
\]
其中,\(\eta_t\) 表示第 \(t\) 次迭代或周期时的学习率,\(\eta_{max}\) 是初始学习率,\(\eta_{min}\) 是最小学习率(通常设为 0),\(T\) 是一个完整周期的总步数。余弦函数的值从 1 递减至 -1,对应学习率从 \(\eta_{max}\) 平滑过渡到 \(\eta_{min}\)。该公式还可扩展至带热重启的变体,即在一个周期结束后重置调度,具体细节将在下文阐述。
该调度通常按周期(epoch)或按批次(batch)应用,具体取决于实现方式。例如,在 PyTorch 和 TensorFlow 等框架中,内置函数如 torch.optim.lr_scheduler.CosineAnnealingLR 和 tf.keras.optimizers.schedules.CosineDecay 可直接实现此功能,允许用户指定初始学习率和周期长度。这种平滑的衰减有助于避免训练过程中的剧烈波动,从而提升稳定性。
历史背景
余弦退火调度源于深度学习研究领域,作为对传统调度方法(如时间衰减、阶梯衰减和指数衰减)的改进而提出。这些早期方法虽然有效,但通常需要手动调整衰减参数,且对超参数选择较为敏感。余弦退火由 Ilya Loshchilov 和 Frank Hutter 在其 2017 年发表的论文《SGDR:带热重启的随机梯度下降》中推广,该论文提出利用周期性重启来改善收敛性能。这一工作建立在更早关于学习率调度的研究基础上,例如时间衰减公式 \(\eta_{n+1} = \eta_0 / (1 + dn)\),其中 \(\eta_0\) 为初始学习率,\(d\) 为衰减系数。
在训练过程中动态调整学习率的思想源自自适应控制领域的文献,其中学习率常被称为增益。多年来,研究者探索了多种调度策略,包括指数衰减 \(\eta_n = \eta_0 e^{-dn}\) 和阶梯衰减等,但余弦退火因其在多种任务中能实现更快的收敛和更好的泛化性能而逐渐受到青睐。
与其他调度的关系
余弦退火与常见调度方法存在显著差异。时间衰减调度按迭代次数反比降低学习率,可能导致训练后期学习率过小;阶梯衰减调度在预设间隔处骤降学习率,可能引起训练动态的突变;指数衰减则持续快速降低学习率,有时会过于激进。相比之下,余弦退火提供了一种平缓且连续的衰减曲线,既不会过快也不会过慢,并且如果初始学习率设置得当,还能自然支持“预热”阶段。
此外,余弦退火常与动量等优化技术结合使用。动量方法有助于在梯度方向一致时加速收敛,并帮助模型跳出局部极小值,类似于小球滚过起伏的地形。在训练Transformer等模型时,将动量与余弦退火学习率相结合,能够有效稳定大规模参数空间的优化过程。
热重启与变体
余弦退火的一个重要变体是热重启技术,即在一个周期结束后重置学习率调度,使其重新从较高值开始。这一方法在 SGDR 论文中提出,其中学习率在一个长度为 \(T\) 的周期内遵循余弦曲线下降,随后重启并进入新的周期,通常新周期的长度会适当延长。这种策略有助于模型逃离局部极小值,探索损失景观中更优的区域,从而提升最终性能。热重启变体在深度学习任务中尤为有用,尤其是当损失函数存在多个局部极小值且表面非凸时。
其他变体包括在余弦衰减前加入线性预热阶段,即学习率从较小值线性增加至初始最大值,然后再按余弦曲线衰减。这种做法常用于训练大型语言模型,以避免训练初期因学习率过高而导致的不稳定性。
现代应用
余弦退火在现代人工智能研究中应用广泛。在人工智能领域,它已成为许多深度学习框架的默认选择。例如,OpenAI 和 Google DeepMind 等机构在训练大规模模型(包括基于Transformer的架构)时,常采用余弦退火调度。该策略也集成于 PyTorch 和 TensorFlow 等主流库中,便于研究者直接使用。
在计算机视觉领域,余弦退火已被证明能提升 CIFAR-10 和 ImageNet 等基准数据集上的准确率。在自然语言处理中,它被用于训练 BERT 和 GPT 等模型,帮助管理数百万甚至数十亿参数的学习率。此外,该技术还应用于生成式人工智能模型,如扩散模型和生成对抗网络(GAN),以稳定训练过程。
优势与局限
余弦退火的主要优势在于其平滑的衰减特性,这能降低训练震荡风险,并有助于模型收敛至更优解。同时,它所需的超参数较少,主要涉及初始学习率、最小学习率和周期长度,简化了调参过程。然而,该调度并非自适应方法,它不依赖于损失景观或梯度信息,因此在某些场景下可能不如 Adam 等自适应优化器灵活。实践中,余弦退火常与这类优化器结合使用,将调度应用于全局学习率,而优化器内部则按参数自适应调整。
一个潜在局限是,余弦退火要求预先知道总训练周期数,以便设定周期长度 \(T\)。如果训练需要延长,则必须调整或重启调度。此外,初始学习率的选择仍然至关重要,设置过高可能导致发散,即使有余弦衰减也无法完全避免。
实践实现
在实践中,实现余弦退火非常简单。在 PyTorch 中,可使用 torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0),其中 T_max 为周期步数。在 TensorFlow 中,tf.keras.optimizers.schedules.CosineDecay 类提供了类似功能。这些内置工具会自动在每个周期或批次更新学习率,使研究者能专注于模型架构和数据设计。
例如,一个典型的训练循环可能设置初始学习率为 0.1,并在 100 个周期内通过余弦退火将其降至 0。该调度常与带动量的 SGD 优化器结合,这在计算机视觉任务中很常见。对于大型语言模型,则通常加入预热阶段,即学习率在前几千步线性上升,随后按余弦曲线衰减。
参见
- 学习率
- 随机梯度下降
- 优化算法
- 深度学习
参考文献
- Loshchilov, Ilya; Hutter, Frank (2017). "SGDR: Stochastic Gradient Descent with Warm Restarts." International Conference on Learning Representations.
- Géron, Aurélien (2017). "Gradient Descent." Hands-On Machine Learning with Scikit-Learn and TensorFlow. O'Reilly. pp. 113–124. ISBN 978-1-4919-6229-9.
- Plagianakos, V. P.; Magoulas, G. D.; Vrahatis, M. N. (2001). "Learning Rate Adaptation in Stochastic Gradient Descent." Advances in Convex Analysis and Global Optimization. Kluwer. pp. 433–444. ISBN 0-7923-6942-4.