本文目录导读:

- 它是什么?—— 一个形象的比喻
- 核心公式
- 与“阶梯式下降”的对比
- 为什么它有效?—— 背后的原因
- 扩展:带热重启的余弦退火 (Cosine Annealing with Warm Restarts)
- 如何在实际代码中使用?
这是一个非常专业且重要的深度学习训练技巧。余弦退火是一种学习率调度策略,它让学习率在训练过程中按照余弦函数的形状进行衰减。
下面我将从几个方面来详细解释它。
它是什么?—— 一个形象的比喻
想象一下,你正在训练一个深度学习模型,这个模型就像一个在峡谷中寻找最低点的探险家。
- 学习率 就是探险家迈出的步子大小。
- 学习率太高:步子太大,可能会直接跳过最低点,在峡谷两边来回震荡,永远找不到最低点(模型无法收敛)。
- 学习率太低:步子太小,初期探索效率低,或者很容易掉进一个“局部最低点”(非最优解)就再也出不来了。
余弦退火 就是一个非常智能的策略:
- 训练初期:探险家精力充沛,允许迈出大而稳健的步子,快速从起点(随机初始化的参数)靠近比较低的区域(快速收敛)。
- 训练中期:随着经验积累,探险家开始逐步缩小步子,在峡谷底部进行精细搜索,避免错过真正的最低点。
- 训练末期:步子已经变得非常非常小,在潜在的最优区域附近进行微调,最终稳定地停在最低点。
这个“步子”的变化规律,正是遵循了余弦函数的曲线,它在开始时下降缓慢,中间下降加速,最后又缓慢接近于零。
核心公式
余弦退火的学习率变化可以用一个简单的公式来描述:
$$\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) |
一个直观的图表对比(想象一下):
- 阶梯式下降:像城市里的楼梯,每一级都是平的,然后在某个点突然下降。
- 余弦退火:像一座平滑的山坡,从山顶(高学习率)平滑地延伸到山脚(低学习率)。
为什么它有效?—— 背后的原因
- 避免局部最优:训练初期,高学习率且下降缓慢,可以帮助模型逃离那些尖锐但浅的局部最小值,冲向更广阔、更平滑的损失区域。
- 加速收敛:在损失函数相对陡峭的区域,快速下降的学习率可以精确地引导模型走向最优解,而不是在最优解附近来回震荡。
- 更好的泛化能力:很多研究和实践表明,使用余弦退火训练的模型,其测试集上的性能往往比使用阶梯式下降更好,这可能与它最后的平滑微调过程有关,能让模型到达更平坦的、泛化能力更强的极小值点。
- 自动化:你只需要设定好初始和最终学习率以及周期总步数,训练过程会自动平滑调整,无需手动干预“何时”下降。
扩展:带热重启的余弦退火 (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、扩散模型等。 |
| 一句话 | 它是目前最流行、最有效的学习率调度策略之一,值得在所有大型深度学习训练任务中尝试。 |
希望这个解释能帮助你彻底理解“余弦退火”,如果你对“热重启”或其他变体有更深入的兴趣,可以随时提问。