余弦退火

wen IT资讯 140

本文目录导读:

余弦退火

  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初始化

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