余弦退火

wen IT资讯 22

本文目录导读:

余弦退火

  1. 它是什么?—— 一个形象的比喻
  2. 核心公式
  3. 与“阶梯式下降”的对比
  4. 为什么它有效?—— 背后的原因
  5. 扩展:带热重启的余弦退火 (Cosine Annealing with Warm Restarts)
  6. 如何在实际代码中使用?

这是一个非常专业且重要的深度学习训练技巧。余弦退火是一种学习率调度策略,它让学习率在训练过程中按照余弦函数的形状进行衰减。

下面我将从几个方面来详细解释它。

它是什么?—— 一个形象的比喻

想象一下,你正在训练一个深度学习模型,这个模型就像一个在峡谷中寻找最低点的探险家。

  • 学习率 就是探险家迈出的步子大小。
  • 学习率太高:步子太大,可能会直接跳过最低点,在峡谷两边来回震荡,永远找不到最低点(模型无法收敛)。
  • 学习率太低:步子太小,初期探索效率低,或者很容易掉进一个“局部最低点”(非最优解)就再也出不来了。

余弦退火 就是一个非常智能的策略:

  • 训练初期:探险家精力充沛,允许迈出大而稳健的步子,快速从起点(随机初始化的参数)靠近比较低的区域(快速收敛)。
  • 训练中期:随着经验积累,探险家开始逐步缩小步子,在峡谷底部进行精细搜索,避免错过真正的最低点。
  • 训练末期:步子已经变得非常非常小,在潜在的最优区域附近进行微调,最终稳定地停在最低点。

这个“步子”的变化规律,正是遵循了余弦函数的曲线,它在开始时下降缓慢,中间下降加速,最后又缓慢接近于零。

核心公式

余弦退火的学习率变化可以用一个简单的公式来描述:

$$\etat = \eta{min} + \frac{1}{2}(\eta{max} - \eta{min})(1 + \cos(\frac{T{cur}}{T{max}}\pi))$$

  • $\eta_t$:当前训练步数 t 时的学习率。
  • $\eta_{max}$:初始学习率,即训练开始时的最大学习率。
  • $\eta_{min}$:最终学习率,训练结束时的最小学习率,通常可以设得非常小,0 或初始学习率的 1/1000。
  • $T_{cur}$:当前已经执行的训练步数(或 epoch 数)。
  • $T_{max}$:一个完整的余弦周期包含的总步数(或 epoch 数)。

简单解释:当 $T_{cur} = 0$ 时,$\cos(0) = 1$,$\etat = \eta{max}$。 当 $T{cur} = T{max}$ 时,$\cos(\pi) = -1$,$\etat = \eta{min}$。 在中间,学习率会平滑地从最大值下降到最小值。

与“阶梯式下降”的对比

其他常见的学习率调度策略,阶梯式下降”(Step Decay),学习率像下楼梯一样,每隔固定步数就突然“跳”一下,变成原来的一半。

余弦退火 vs. 阶梯式下降

特性 余弦退火 (Cosine Annealing) 阶梯式下降 (Step Decay)
下降方式 平滑、连续、周期性 离散、突变、无周期
初期 学习率下降较慢,有利于探索 保持高学习率,直到下一个拐点
中期 学习率下降加速,快速收敛 学习率突然下降,可能造成性能波动
末期 学习率下降放缓,精细微调 学习率稳定在一个很低的值
主要优势 平滑过渡,有时能获得更好的泛化能力 简单、直观、容易实现
典型应用 现代深度学习,尤其是Transformer、ResNet、GAN等大型模型 传统的卷积网络(如 AlexNet, VGG)

一个直观的图表对比(想象一下):

  • 阶梯式下降:像城市里的楼梯,每一级都是平的,然后在某个点突然下降。
  • 余弦退火:像一座平滑的山坡,从山顶(高学习率)平滑地延伸到山脚(低学习率)。

为什么它有效?—— 背后的原因

  1. 避免局部最优:训练初期,高学习率且下降缓慢,可以帮助模型逃离那些尖锐但浅的局部最小值,冲向更广阔、更平滑的损失区域。
  2. 加速收敛:在损失函数相对陡峭的区域,快速下降的学习率可以精确地引导模型走向最优解,而不是在最优解附近来回震荡。
  3. 更好的泛化能力:很多研究和实践表明,使用余弦退火训练的模型,其测试集上的性能往往比使用阶梯式下降更好,这可能与它最后的平滑微调过程有关,能让模型到达更平坦的、泛化能力更强的极小值点。
  4. 自动化:你只需要设定好初始和最终学习率以及周期总步数,训练过程会自动平滑调整,无需手动干预“何时”下降。

扩展:带热重启的余弦退火 (Cosine Annealing with Warm Restarts)

这是一个非常流行的变体,就是在整个训练过程中,让学习率从高到低衰减多次,而不是只衰减一次。

  • 原理:每经过 $T{max}$ 步,学习率会“重新加热”回到 $\eta{max}$,然后开始新一轮的余弦衰减,每一轮的 $T_{max}$ 可以逐渐增大(比如每次乘以2),这就是 SGDR(Stochastic Gradient Descent with Restarts)。
  • 为什么有效
    • 有助于模型跳出当前的局部最优,探索其他可能的、更好的谷底。
    • 由于每次“重启”后,模型会从一个已经学得不错的点开始,所以可以更快地找到更优的解。
    • 在很多竞赛和前沿模型中,这是最常用的学习率策略之一。

如何在实际代码中使用?

在 PyTorch 中,使用余弦退火非常方便。

标准版本:

import torch.optim as optim
from torch.optim.lr_scheduler import CosineAnnealingLR
# 假设你已经有了优化器 optimizer
# 假设一个epoch有1000个batch,总共训练100个epoch
T_max = 100 * 1000  # 总步数
scheduler = CosineAnnealingLR(optimizer, T_max=T_max, eta_min=1e-6)
# 在每个 batch 训练结束后更新: for epoch in range(num_epochs):
#     for batch in dataloader:
#         ...训练...
#         scheduler.step()

带热重启的版本:

from torch.optim.lr_scheduler import CosineAnnealingWarmRestarts
# T_0: 第一次重启的周期长度(epoch数或step数)
# T_mult: 每个周期后,周期长度乘以的因子,通常设为2。
scheduler = CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2, eta_min=1e-6)
# 训练时,同样在每个step后调用 scheduler.step()
要点 说明
核心思想 学习率按照余弦函数平滑地从最大值衰减到最小值。
主要优点 平滑过渡、避免震荡、更好的泛化能力、容易实现。
关键变体 带热重启的余弦退火(SGDR),效果往往更好。
典型应用 现代深度学习模型,如 Transformer、ResNet、GAN、扩散模型等。
一句话 它是目前最流行、最有效的学习率调度策略之一,值得在所有大型深度学习训练任务中尝试。

希望这个解释能帮助你彻底理解“余弦退火”,如果你对“热重启”或其他变体有更深入的兴趣,可以随时提问。

上一篇Kaiming He

下一篇Xavier初始化

抱歉,评论功能暂时关闭!