Skip to content

LR Scheduling

Learning Rate Scheduling

在DNN训练中的另一大挑战就是设置合适的learning rate schedule。不合适的设置会导致:

  • 训练的不稳定
  • 过慢的convergence
  • convergence to suboptimal solutions

学习率调度器(Learning Rate Schedulers)在深度学习训练中非常重要,它通过动态调整学习率 ,帮助模型在训练初期快速学习,在后期稳定细致地优化,从而提高收敛速度最终模型性能

具体来说,学习率(Learning Rate) 是优化器(如SGD、Adam)更新模型参数时所迈出的步长。步子太大,可能会跳过最优解;步子太小,则收敛太慢。调度器(Schedulers)就是用来自动管理和调整这个步长的机制。它不是使用一个固定的学习率,而是根据预设的规则(如周期数、损失值变化)来改变它。

其具体作用如下:

  • 训练初期(Fast Progress Early On): 刚开始训练时,模型参数离最佳值很远,可以使用 较大的学习率 。这使得模型可以快速穿过平坦的损失区域,迅速找到损失函数的”大致方向”,从而实现 快速收敛
  • 训练后期(Stable Fine-Tuning Later): 随着训练的进行,模型参数越来越接近损失函数的最低点。这时如果继续使用大步长,模型就会在最优解附近来回 震荡 ,无法稳定收敛。因此,调度器会 降低学习率 ,让模型”迈小步”,进行 稳定、细致的优化(fine-tuning) ,确保能找到更精确的最低点。

最终,通过早期的大步长,模型能更快地达到一个可接受的性能水平;通过后期的微小步长,模型能更精确地定位到损失函数的全局(或局部)最小值,从而获得 更高的准确率和更低的损失

学习率调度器就像是 汽车的油门和刹车 。刚上路时(训练初期)加大油门(高学习率)迅速提速;快到目的地时(训练后期)轻踩刹车(低学习率)缓慢而精确地停到位。这种动态控制是深度学习中提高效率和精度的一个 关键技巧


在经典优化理论中,梯度下降(GD)的每一步更新都涉及选择合适的步长 \(\lambda_k\)

\[ \theta^{(k+1)} = \theta^{(k)} - \lambda_k \cdot \nabla J(\theta^{(k)}) \]

注意在原始的梯度下降方法中(不是机器学习而是优化领域),步长 \(\lambda_k\) 在每次迭代 \(k\) 都可能不同。通常需要通过 线搜索(Line Search) 来确定这个值——即沿更新方向 \(\Delta\theta^{(k)}\) 搜索使损失函数下降的步长。

Backtracking Line Search(回溯线搜索): 从一个较大的步长开始,逐步缩小直到满足充分下降条件(Armijo condition)。

Exact Line Search(精确线搜索): 精确求解一维优化问题 \(\min_{\lambda > 0} J(\theta^{(k)} - \lambda \nabla J(\theta^{(k)}))\)

Backtracking与Exact Line Search在2D非二次函数上的比较:两种方法都展现线性收敛

上图展示了对函数 \(f(x_1, x_2) = e^{x_1+3x_2-0.1} + e^{x_1-3x_2-0.1} + e^{-x_1-0.1}\) 的优化过程,backtracking line search 的轨迹呈锯齿状,而 exact line search 的路径更直接。两种算法都展现 线性收敛(linear convergence)

但在DNN训练中,每步都进行线搜索的计算开销太大。因此研究者们致力于设计 学习率调度(schedule) 或规则来自动更新学习率,避免数值搜索。


SGD 收敛的充分条件(Robbins-Monro 条件)

对于 SGD 更新 \(\theta^{k+1} \leftarrow \theta^k - \lambda_k \cdot g(\theta^k)\),其中 \(g(\theta^k)\) 是梯度的随机估计,收敛需要以下 充分条件

\[ \sum_{k=1}^{\infty} \lambda_k = \infty \quad \text{且} \quad \sum_{k=1}^{\infty} \lambda_k^2 < \infty \tag{C} \]

直觉解释:

  • 第一个条件 \(\sum \lambda_k = \infty\) 保证步长总和足够大,使得优化过程能够到达参数空间中的任何位置
  • 第二个条件 \(\sum \lambda_k^2 < \infty\) 保证步长最终足够小,使得噪声的影响逐渐消失,收敛到稳定解

重要提示: 条件 (C) 是 充分条件但非必要条件——满足 (C) 可以保证 SGD 收敛,但 SGD 收敛不一定需要 (C)。由于第二个条件要求学习率递减,这就是衰减学习率调度器的理论基础。

实践中,存在许多满足这些条件的学习率调度器:从最大值 \(\lambda_{max}\) 开始,逐渐衰减到最小值 \(\lambda_{min}\) 并保持。不同的调度器区别在于衰减函数 \(f(k, \lambda_0)\) 的选择。由于实际训练会在有限步 \(k\) 后停止,这种递减调度通常效果良好。


Step Decay

Step Decay(阶梯衰减)是最简单、最经典的学习率调度策略。其核心思想是每隔固定的 epoch 数,将学习率乘以一个衰减因子(通常为 0.1 或 0.5)。

公式:

\[ \eta_t = \eta_0 \cdot \gamma^{\lfloor t / S \rfloor} \]

其中 \(\eta_0\) 是初始学习率,\(\gamma\) 是衰减因子(如 0.1),\(S\) 是衰减步长(每隔多少个 epoch 衰减一次),\(\lfloor \cdot \rfloor\) 是取整操作。

典型设置: 在 ImageNet 训练 ResNet 的经典设置中,初始学习率 \(\eta_0 = 0.1\),每 30 个 epoch 将学习率乘以 0.1(即在第 30、60、90 个 epoch 时衰减)。

优点: 实现简单,效果稳定,是很多经典论文的默认选择。

缺点: 需要手动选择衰减的时机和幅度,不够灵活;学习率的突变可能导致训练过程中 loss 出现短暂的不稳定。

在 PyTorch 中对应 torch.optim.lr_scheduler.StepLRMultiStepLR


Exponential Decay

Exponential Decay(指数衰减)让学习率按指数函数平滑地衰减,避免了 Step Decay 中学习率突然跳变的问题。

公式:

\[ \eta_t = \eta_0 \cdot \gamma^{t} \]

其中 \(\gamma \in (0, 1)\) 是每个 epoch 的衰减率,如 \(\gamma = 0.95\)\(\gamma = 0.99\)

特点: 学习率呈平滑的指数曲线下降,前期下降较快,后期下降逐渐放缓。相比 Step Decay,指数衰减更加平滑,不会有突然的学习率跳变。但需要注意 \(\gamma\) 的选取:如果 \(\gamma\) 太小,学习率会过快衰减,可能导致训练不充分;如果 \(\gamma\) 太接近 1,则衰减太慢,与固定学习率差别不大。

在 PyTorch 中对应 torch.optim.lr_scheduler.ExponentialLR


Inverse Square Root Decay

Inverse Square Root Decay(逆平方根衰减)是满足 Robbins-Monro 条件的经典调度,在 Transformer 的 Noam scheduler 中被广泛使用:

\[ \lambda_t = \frac{\lambda_0}{\sqrt{t}} \]

这是多项式衰减 \(\lambda_k = \lambda_0 / (k+1)^p\)\(p = 0.5\) 时的特例。该衰减速度适中——比指数衰减慢,但比线性衰减快,特别适合需要长时间训练的场景。


收敛性分析

关于不同调度器的收敛性,有几个重要结论:

衰减路径的影响: 学习率衰减的具体函数形状并不是最关键的因素。大多数收敛分析使用多项式学习率 \(\lambda_t = \lambda_0 / \sqrt{t}\) 作为分析对象。不同的变体可能影响损失曲线的稳定性,但不应影响算法是否收敛。

多项式学习率的收敛步数: 对于多项式学习率 \(\lambda_k = \lambda_0 / (k+1)^p\)\(p \in (0,1)\)),达到最优性间隙 \(\|J(\theta^k) - J(\theta^*)\|\) 小于某个阈值所需的步数为:

\[ N^* = m^{\frac{1}{(1-p)c}} \]

其中 \(m\) 是数据样本数,\(p\) 是多项式幂次,\(c\) 是常数。(参见 Yao 2007, Early Stopping)

直觉:

  • 更大的数据集(更大的 \(m\))→ 更长的训练时间
  • 更小的 \(p\)\(0 < p < 1\))→ 更小的 \(N^*\),即更激进的学习率衰减 → 更短的训练时间。这解释了为什么 指数衰减 在某些场景下收敛更快

Cosine Annealing

Cosine Annealing(余弦退火)是目前非常流行的学习率调度策略,由 Loshchilov 和 Hutter 在2016年的 SGDR(SGD with Warm Restarts)论文中提出。

公式:

\[ \eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 + \cos\left(\frac{t}{T}\pi\right)\right) \]

其中 \(\eta_{max}\) 是最大学习率(通常等于初始学习率),\(\eta_{min}\) 是最小学习率(通常取 0 或一个极小值),\(T\) 是总的训练周期数,\(t\) 是当前周期。

为什么有效:

  • 训练初期学习率高,可以快速探索参数空间
  • 训练中期学习率平缓下降,逐步精细化
  • 训练后期学习率接近零,在局部最优点附近进行精细搜索
  • 余弦曲线的形状使得学习率在开始和结束时变化缓慢、中间变化较快,这比线性衰减更符合实际训练的需求

Warm Restarts(SGDR): SGDR 的核心思想是周期性地将学习率"重启"回初始值,然后再次按余弦曲线衰减。这种策略的好处是:当学习率突然增大时,模型会跳出当前的局部最优,有机会探索到更好的解。每次重启后的余弦衰减又能让模型稳定收敛。实践中,重启周期可以逐渐加长(如 \(T_0, 2T_0, 4T_0, \ldots\)),这样前期多探索,后期多收敛。

在 PyTorch 中对应 torch.optim.lr_scheduler.CosineAnnealingLRCosineAnnealingWarmRestarts


Warmup

Warmup(学习率预热)是指在训练刚开始的若干步中,将学习率从一个很小的值(如 0 或 \(10^{-7}\))线性增长到目标学习率,然后再按照其他策略(如余弦退火)进行衰减。

Linear Warmup 公式:

\[ \eta_t = \eta_{target} \cdot \frac{t}{T_{warmup}}, \quad t \leq T_{warmup} \]

其中 \(T_{warmup}\) 是预热步数,\(\eta_{target}\) 是目标学习率。

为什么需要 Warmup:

  1. 训练初期参数不稳定: 模型参数是随机初始化的,初始梯度的方向和大小都不可靠。如果一开始就用很大的学习率,模型可能会被带到参数空间中很差的区域,甚至直接发散。
  2. Adaptive Optimizer 的统计量不准确: 对于 Adam 等自适应优化器,训练刚开始时一阶矩和二阶矩的估计非常不准确(因为样本太少),此时大学习率会导致异常大的参数更新。
  3. 大 Batch 训练的必要条件: 当使用非常大的 batch size(如数千甚至数万)时,梯度估计非常准确(方差小),如果直接用大学习率,模型容易过早收敛到尖锐的局部最小值(sharp minima),泛化性差。Warmup 给模型一个缓冲期,让参数先在一个合理的范围内"热身"。
  4. Transformer 训练的标配: 原始 Transformer 论文(Vaswani et al., 2017)中使用的 Noam scheduler 就包含 warmup 阶段。其学习率公式为:
\[ \eta_t = d_{model}^{-0.5} \cdot \min(t^{-0.5}, \; t \cdot T_{warmup}^{-1.5}) \]

\(T_{warmup}\) 步线性增长,之后按 \(t^{-0.5}\) 衰减。几乎所有现代 Transformer 模型(BERT、GPT、ViT 等)都使用 warmup。

Warmup 的理论动机: 从 Hessian 的角度理解,训练初期参数远离最优点,损失曲面的曲率(Hessian 特征值)可能非常大且不稳定。此时最优学习率 \(\lambda \approx 1/h\)\(h\) 为 Hessian 对角元素)很小。如果直接使用大学习率,更新量 \(\lambda \cdot g\) 会远超 Newton 步的大小,导致参数跳到更差的区域甚至发散。Warmup 让学习率从小值逐步增大,给模型时间稳定梯度统计量和 Hessian 估计。


OneCycleLR

OneCycleLR(1Cycle Policy)由 Leslie Smith 在2018年提出,其核心发现是使用比传统方法更大的学习率,配合特殊的调度策略,可以实现 Super-Convergence(超级收敛) -- 用更少的训练步数达到更好的效果。

策略描述:

整个训练过程分为两个阶段:

  1. 上升阶段(约占前 30%-45% 的训练): 学习率从一个较低值线性增长到最大学习率 \(\eta_{max}\)
  2. 下降阶段(约占后 55%-70% 的训练): 学习率从最大值余弦退火到一个极小值(甚至接近 0)

同时,动量(momentum)做相反的变化:学习率升高时动量降低,学习率降低时动量升高。

Super-Convergence: Smith 发现,在使用 1Cycle Policy 时,最大学习率可以设置为传统方法的 3-10 倍。配合这种"先升后降"的策略,模型可以用传统方法 1/5 甚至 1/10 的训练步数达到相同甚至更好的性能。这种现象称为超级收敛。

如何选择最大学习率: 使用 LR Range Test(学习率范围测试):将学习率从一个极小值逐步增大到一个极大值,记录每个学习率对应的 loss。选择 loss 下降最快处对应的学习率作为 \(\eta_{max}\)

在 PyTorch 中对应 torch.optim.lr_scheduler.OneCycleLR


ReduceLROnPlateau

ReduceLROnPlateau(基于平台期的学习率衰减)是一种自适应调度策略。它不依赖预设的衰减计划,而是监控某个指标(通常是 validation loss),当指标在连续若干个 epoch 内不再改善时,自动降低学习率。

工作机制:

  • 监控指标(如 validation loss)在 patience 个 epoch 内没有改善
  • 将学习率乘以 factor(通常为 0.1 或 0.5)
  • 可以设置 min_lr 防止学习率降得过低
  • 可以设置 threshold 来定义"改善"的最小幅度

典型设置: patience=10, factor=0.1,即如果 validation loss 连续 10 个 epoch 没有下降,就将学习率缩小为原来的 1/10。

优点: 不需要预先知道最佳的衰减时机,完全由训练过程中的表现驱动。特别适合不确定训练需要多少个 epoch 的场景。

缺点: 是一种被动策略,只有在发现性能停滞后才降低学习率,存在一定的滞后性。

在 PyTorch 中对应 torch.optim.lr_scheduler.ReduceLROnPlateau


调度器对比总结

调度策略 核心机制 超参数 典型应用场景
Step Decay 每隔固定 epoch 乘以衰减因子 衰减步长, 衰减因子 CNN 分类(ResNet 等)
Exponential Decay 每个 epoch 乘以固定衰减率 衰减率 \(\gamma\) 通用,适合平滑衰减需求
Cosine Annealing 按余弦曲线从高到低 最大/最小学习率, 周期 \(T\) 现代训练的主流选择
Warmup 训练初期线性增长学习率 预热步数 Transformer, 大 Batch 训练
OneCycleLR 先升后降 + 动量反向变化 最大学习率, 训练总步数 追求快速收敛、超级收敛
ReduceLROnPlateau 监控指标停滞时降低学习率 patience, factor 不确定训练时长的场景

实践建议:

  • 训练 Transformer 类模型时,推荐使用 Warmup + Cosine Annealing 的组合
  • 训练 CNN 分类模型时,Step DecayCosine Annealing 都是不错的选择
  • 如果追求快速训练,可以尝试 OneCycleLR
  • 如果对任务不够了解、不确定训练多少个 epoch 合适,可以用 ReduceLROnPlateau 作为兜底方案
  • 在几乎所有大规模训练中,Warmup 都是必不可少的

Polynomial Decay

Polynomial Decay(多项式衰减)按多项式函数将学习率从初始值衰减到最小值:

\[ \eta_t = (\eta_0 - \eta_{min}) \cdot \left(1 - \frac{t}{T}\right)^p + \eta_{min} \]

其中 \(p\) 是多项式的幂次。当 \(p = 1\) 时,就是 Linear Decay(线性衰减),即学习率均匀地从 \(\eta_0\) 下降到 \(\eta_{min}\)

Linear Decay 是 BERT 和许多 NLP 模型训练的默认选择。典型配置为 Warmup + Linear Decay:前若干步线性增长学习率,之后线性衰减到 0。

# PyTorch - Warmup + Linear Decay
from transformers import get_linear_schedule_with_warmup

scheduler = get_linear_schedule_with_warmup(
    optimizer,
    num_warmup_steps=1000,
    num_training_steps=total_steps
)

在 PyTorch 中对应 torch.optim.lr_scheduler.PolynomialLR


组合使用调度器

在实际训练中,调度器往往组合使用。最常见的组合是 Warmup + 主调度器

import torch.optim as optim
from torch.optim.lr_scheduler import SequentialLR, LinearLR, CosineAnnealingLR

optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)

# Warmup: 前1000步线性从 0.01*lr 增长到 lr
warmup = LinearLR(optimizer, start_factor=0.01, total_iters=1000)

# 主调度器: Cosine Annealing
cosine = CosineAnnealingLR(optimizer, T_max=total_epochs - 1000)

# 组合: 先 Warmup 再 Cosine
scheduler = SequentialLR(optimizer, [warmup, cosine], milestones=[1000])

常见组合:

组合 适用场景
Warmup + Cosine Annealing Transformer 预训练、ViT
Warmup + Linear Decay BERT/GPT 微调
Warmup + Cosine with Warm Restarts 长时间训练、探索能力强
OneCycleLR(内置 Warmup) CNN 快速训练

自适应学习率方法(Adaptive Learning Rate)

以上调度器按照预设的时间表调整学习率。下面介绍另一类方法:根据训练过程中的信息自适应地调整学习率,包括基于梯度符号的启发式方法、基于 Hessian 的二阶方法,以及包含周期/重启机制的策略。


基于梯度的启发式方法:Delta-Bar-Delta

Jacobs (1988) 提出了学习率自适应的四条启发式规则:

  1. 每个参数应有独立的学习率(per-dimension LR)
  2. 学习率应随时间变化
  3. 当某参数的梯度在多个连续时间步保持相同符号时,该参数的学习率应增大
  4. 当某参数的梯度在多个连续时间步符号交替时,该参数的学习率应减小

注意:规则 3 和 4 的思想与动量(Momentum)的核心思想相同。

Delta-Bar-Delta (DBD) 更新规则:

\[ \Delta\lambda_t = \begin{cases} \delta & \text{if } \bar{g}(t-1) \cdot g(t) > 0 \\ -\varepsilon \lambda_t & \text{if } \bar{g}(t-1) \cdot g(t) < 0 \\ 0 & \text{otherwise} \end{cases} \]

其中 \(\delta > 0\) 是增大学习率的常数,\(1 > \varepsilon > 0\) 是减小学习率的因子,\(g(t) = \nabla J(\theta^t)\) 是当前梯度,\(\bar{g}(t) = (1 - \beta)g(t) + \beta\bar{g}(t-1)\) 是梯度的指数移动平均。

参考文献:Jacobs, R. A. "Increased rates of convergence through learning rate adaptation." Neural Networks 1, no. 4 (1988): 295-307.

Regrettable DBD(RDBD,Song 2023): 现代改进版本,核心思想是检查条件 \(\langle g_t, g_{t-1} \rangle \cdot \langle g_{t+1}, g_t \rangle \geq 0\)。如果不满足,则"撤销"上一步的学习率更新(regrettable);如果满足,则按以下规则更新:

\[ \begin{cases} h_t \leftarrow \langle g_t, g_{t-1} \rangle \\ \lambda_t \leftarrow \lambda_{t-1} + \varepsilon h_t \\ \theta_{t+1} \leftarrow \theta_t - \lambda_t \cdot g_t \end{cases} \]

DBD与RDBD在MNIST和CIFAR-10上的性能比较

参考文献:Song, Zhao, and Chiwun Yang. "An automatic learning rate schedule algorithm for achieving faster convergence and steeper descent." arXiv preprint arXiv:2310.11291 (2023).


最优学习率与 Hessian 的关系

从 Newton 法推导最优学习率

回顾梯度下降只使用一阶导数(梯度):\(\Delta\theta_{GD}^{(k)} = -\nabla J(\theta^{(k)})\),而 Newton 法 使用二阶导数(Hessian),收敛速度远快于 GD:

\[ \Delta\theta_{Newton}^{(k)} = -[\nabla^2 J(\theta^{(k)})]^{-1} \cdot \nabla J(\theta^{(k)}) = -H_k^{-1} \cdot g_k \]

其中 \(H_k = \nabla^2 J(\theta^{(k)})\) 是 Hessian 矩阵(\(n \times n\))。

1D 情况的直觉: 考虑 \(\min_\theta f(\theta)\)\(\theta \in \mathbb{R}\),此时:

\[ \Delta\theta_{GD} = -f'(\theta) = -g, \quad \Delta\theta_{Newton} = -(f''(\theta))^{-1} \cdot f'(\theta) = -h^{-1} \cdot g \]

其中 \(h = f''(\theta)\) 是二阶导数。则:

\[ \Delta\theta_{Newton} = \frac{1}{h} \cdot (-g) = \frac{1}{h} \cdot \Delta\theta_{GD} \]

这意味着 最优学习率 为:

\[ \boxed{\lambda_{opt} = \frac{1}{h}} \]

即学习率应为 Hessian(二阶导数)的倒数,这样 GD 就能达到 Newton 法的性能。

注意: 这个 \(\lambda_{opt} = 1/h\) 只在 1D 情况下严格成立。在高维情况下,Newton 步涉及完整的 Hessian 逆矩阵 \(H^{-1}\),无法简单地用一个标量学习率替代。

Newton法 vs GD + Line Search:Newton法在5步内收敛到\(10^{-15}\)精度,而GD需要25步以上

高维(100维)示例:GD需要200次迭代,Newton法仅需约10次

Preconditioning(预条件化)

由于计算完整的 \(H^{-1}\) 代价极高(\(n \times n\) 矩阵求逆),实际方法都采用 逐维度(per-dimension) 近似:只使用 Hessian 的对角元素,分别对每个参数应用独立的学习率。这称为 预条件化(preconditioning),其效果是通过拉伸或压缩某些维度,使损失曲面变得不那么"病态(ill-conditioned)"。

Hessian 计算的注意事项:

  1. 如何计算 Hessian 对角线? 通常通过对梯度本身做反向传播(backprop of backprop),需要额外一次反向传播,但可以与标准反向传播并行执行(有一步延迟)
  2. Mini-batch 的影响: 由于使用随机数据,得到的 Hessian 对角线是真实 Hessian 的一个估计

AdaDelta

AdaDelta(Zeiler, 2012)利用 Hessian 的 "思想" 但不显式计算二阶导数。其核心推导如下:

从 Newton 步出发:\(\Delta\theta_{Newton} = -g/h\),因此 \(1/h = -\Delta\theta_{Newton}/g\)

在 AdaGrad/RMSProp 中:\(\Delta x = -\frac{\eta}{\sqrt{v_t + \epsilon}} g_t\),其中 \(v_t = \beta v_{t-1} + (1-\beta)g_t^2\),即等效学习率 \(\lambda_t = \eta / \sqrt{v_t + \epsilon}\)

要让 \(\lambda_t \approx 1/h\),即 \(\frac{\eta}{\sqrt{v_t + \epsilon}} \approx \frac{\Delta\theta_{Newton}}{g_t}\)。由于 \(\sqrt{v_t + \epsilon}\) 包含梯度信息(等价于 \(g_t\)),因此希望 \(\eta\) 等价于 \(\Delta\theta\)——用过去参数更新量的 RMS 来代替:

\[ \eta_t^2 = \text{RMS}(\Delta\theta)_t = \beta \eta_{t-1}^2 + (1-\beta)\Delta\theta_t^2 \]

从而得到 AdaDelta 更新规则

\[ \lambda_t = -\frac{\text{RMS}(\Delta\theta)_{t-1}}{\text{RMS}(g_t)} \]
\[ \theta^{(t+1)} = \theta^{(t)} - \frac{\eta_t}{\sqrt{v_t + \epsilon}} \cdot g_t \]

其中:

\[ \begin{cases} \eta_t^2 = \beta \eta_{t-1}^2 + (1-\beta)\Delta\theta_t^2 \\ v_t = \beta v_{t-1} + (1-\beta)g_t^2 \end{cases} \]

特点: AdaDelta 不需要手动设置全局学习率 \(\eta\),这是其相对于 AdaGrad 和 RMSProp 的主要优势。但目前没有理论收敛保证。

AdaDelta在3层DNN/MNIST上的性能:各层的步长和更新量自适应调整

AdaDelta在5层DNN/语音数据集上的表现:与Adagrad和Momentum的比较

参考文献:Zeiler, M. D. "Adadelta: an adaptive learning rate method." arXiv preprint arXiv:1212.5701 (2012).


Adaptive Gradient Descent without Descent(AdGD)

Malitsky and Mishchenko (2019) 提出了一种不依赖线搜索的自适应学习率方法。核心思想是利用连续迭代间的梯度差来 近似 Hessian

\[ L_k = \frac{\|\nabla J(\theta^k) - \nabla J(\theta^{k-1})\|}{\|\theta^k - \theta^{k-1}\|} \]

注意 \(L_k\) 近似梯度的导数,即 近似 Hessian \(h_k\)。然后学习率更新为:

\[ \lambda_k = \min\left\{\sqrt{1 + r_{k-1}} \cdot \lambda_{k-1}, \; \frac{\alpha}{L_k}\right\} \]

其中 \(r_k = \lambda_k / \lambda_{k-1}\)。该公式包含两部分:\(\sqrt{1 + r_{k-1}} \cdot \lambda_{k-1}\) 实际上在 增大 学习率,而 \(\alpha / L_k\) 是 Hessian 倒数的近似。

理论保证: 对于具有局部光滑性的凸损失函数,收敛速率为 \(\|J(\theta^k) - J(\theta^*)\| \sim O(1/k)\)

AdGD在矩阵分解(非凸非光滑)问题上的性能

AdSGD在ResNet-18和DenseNet-121/CIFAR10上的表现

参考文献:Malitsky, Y. and Mishchenko, K. "Adaptive gradient descent without descent." arXiv preprint arXiv:1910.09529 (2019).


vSGD:基于二阶信息的学习率自适应

Schaul, Zhang, and LeCun (2013) 提出了 vSGD,通过最小化期望损失(考虑随机数据的影响),推导出每个维度 \(i\) 的最优学习率:

\[ \lambda_t^* = \frac{1}{h_i} \cdot \frac{(\theta^{(t)} - \theta^*)^2}{(\theta^{(t)} - \theta^*)^2 + \sigma^2} \]

其中 \(\sigma^2\) 是最优参数的方差。由于实践中不知道 \(\theta^*\) 及其方差,上式被近似为:

\[ \lambda_i^* = \frac{1}{h_i} \cdot \frac{(\mathbb{E}[g_i])^2}{\mathbb{E}[g_i^2]} = \frac{1}{h_i} \cdot \frac{(\mathbb{E}[g_i])^2}{(\mathbb{E}[g_i])^2 + \text{Var}[g_i]} \]

vSGD 算法(结合指数移动平均):

\[ \begin{aligned} \bar{g}_i &\leftarrow (1 - \beta_i)\bar{g}_i + \beta_i g_i & \text{(梯度 EMA)} \\ \bar{v}_i &\leftarrow (1 - \beta_i)\bar{v}_i + \beta_i g_i^2 & \text{(梯度平方 EMA)} \\ \bar{h}_i &\leftarrow (1 - \beta_i)\bar{h}_i + \beta_i |\text{bbprop}(g_i)| & \text{(对角 Hessian EMA)} \\ \lambda_i &\leftarrow \frac{(\bar{g}_i)^2}{h_i \cdot \bar{v}_i} & \text{(自适应学习率)} \\ \frac{1}{\beta_i} &\leftarrow \left(1 - \frac{(\bar{g}_i)^2}{\bar{v}_i}\right)\frac{1}{\beta_i} + 1 & \text{(更新遗忘因子)} \\ \theta_i &\leftarrow \theta_i - \lambda_i \cdot \bar{g}_i & \text{(参数更新)} \end{aligned} \]

vSGD在噪声二次损失和非平稳噪声二次损失上的表现:自动适应最优学习率

参考文献:Schaul, T., Zhang, S., and LeCun, Y. "No more pesky learning rates." ICML, pp. 343-351. PMLR, 2013.


AdaHessian

AdaHessian(Yao et al., 2021)是一种自适应二阶优化器,使用 Newton 步 \(\Delta\theta = -H^{-k} \cdot g\)\(0 \leq k \leq 1\) 为 Hessian 幂次超参数),但仅计算 Hessian 对角线来降低计算开销。

核心思想: 对梯度进行 预条件化\(\Delta\theta = [\text{diag}(H)]^{-k} \cdot g = D^{-k} \cdot g\),其中 \(D\) 是 Hessian 对角线。

AdaHessian可视化:每层的损失曲面和Hessian结构

算法步骤:

  1. 计算梯度 \(g_t \leftarrow \nabla J(\theta^t)\)
  2. 计算 Hessian 对角线 \(h_t\)(通过 backprop of \(g_t\)
  3. Batch 平均 Hessian 对角线:\(d_t \leftarrow \text{batch\_avg}(h_t)\)
  4. Hessian 对角线平方的 EMA:\(\bar{d}_t^2 \leftarrow \beta_2 \bar{d}_{t-1}^2 + (1-\beta_2)d_t^2\)
  5. 动量:\(m_t \leftarrow \beta_1 m_{t-1} + (1-\beta_1)g_t\)
  6. 关键步骤 —— 计算预条件化分母:\(v_t \leftarrow (\bar{d}_t)^k\)
  7. 参数更新:\(\theta_{t+1} \leftarrow \theta_t - \eta \cdot m_t / v_t\)

Hessian 幂次 \(k\) 的作用:

\(k\) 等价方法
\(k = 0\) 退化为 AdaGrad(带 EMA)
\(0 < k < 1\) 介于一阶和二阶方法之间
\(k = 1\) 使用完整的 Newton 步长/学习率

AdaHessian性能:机器翻译和语言模型任务上超越SGD和AdamW

计算开销: Hessian 对角线通过 Hutchinson 方法近似计算。计算频率可以调节——不必每步都计算:

Hutchinson 计算频率 1 2 3 5
理论开销(\(\times\)SGD) \(2\times\) \(1.5\times\) \(1.33\times\) \(1.2\times\)

在 ResNet20/CIFAR10 上,即使每5步计算一次 Hessian,精度也几乎不受影响(92.16 vs 92.13)。

参考文献:Yao, Z., Gholami, A., Shen, S., et al. "Adahessian: An adaptive second order optimizer for machine learning." AAAI, vol. 35, no. 12, pp. 10665-10673. 2021.


Cyclic Learning Rate(CLR)

Cyclic Learning Rate(Smith, 2017)采用三角形(triangular)波形在最大值和最小值之间周期性地循环学习率,而非单调衰减。

Cyclic LR示意图:三角波形在max_lr和base_lr之间循环,及LR Range Test

核心思想: 周期性调度的目的是通过重启学习率来 跳出当前局部最小值区域,探索新的区域。这一思想虽然是启发式的,但实践效果很好,与优化领域的"重启(restart)"技术相关。

LR Range Test(学习率范围测试) 用于确定 \(\lambda_{min}\)\(\lambda_{max}\)

  1. 设定最小和最大学习率范围
  2. 绘制 accuracy vs. LR 曲线
  3. 注意 accuracy 开始增加 时对应的 LR → 设为 \(\lambda_{min}\)
  4. 注意 accuracy 开始下降或变得不稳定 时的 LR → 设为 \(\lambda_{max}\)

变体: CLR 还可以与自适应优化器组合(如 Nesterov + CLR、Adam + CLR),在 CIFAR-10 上的实验表明组合效果良好。

CLR在ImageNet/AlexNet和GoogLeNet上的表现:Triangular2和Exp Range策略

参考文献:Smith, L. N. "Cyclical learning rates for training neural networks." WACV, pp. 464-472. IEEE, 2017.


SGDR:SGD with Warm Restarts

SGDR(Loshchilov and Hutter, 2017)在 Cyclic LR 的基础上,使用 余弦退火 + 周期性 Warm Restart 的组合。

具体策略: 执行多个 run,每个 run \(i\) 持续 \(T_i\) 个 epoch。每次 restart 时,使用上一 run 的最终参数值作为新 run 的初始点。第 \(i\) 个 run 内部按余弦调度衰减学习率:

\[ \eta_t = \eta_{min}^i + \frac{1}{2}(\eta_{max}^i - \eta_{min}^i)\left(1 + \cos\frac{t\pi}{T_i}\right) \]

其中 \(\eta_{max}^i\)\(\eta_{min}^i\) 分别是第 \(i\) 个 run 的最大和最小学习率,\(T_i\) 是其持续时间。

关键设计:

  • 不同 run 可以有不同的持续时间 \(T_i\) 和不同的 (\(\eta_{max}\), \(\eta_{min}\))
  • 建议逐步增大 \(T_i\)(如 \(T_0, 2T_0, 4T_0, \ldots\)):短周期快速探索多个局部最小值区域,长周期锁定在好的局部最小值中
  • 也可以逐步减小 \(\eta_{max}\)\(\eta_{min}\)
  • Warm Restart LR 调度非常鲁棒

SGDR在WRN-28-10/CIFAR-10和CIFAR-100上的表现

参考文献:Loshchilov, I. and Hutter, F. "SGDR: Stochastic gradient descent with warm restarts." arXiv preprint arXiv:1608.03983 (2016).


Adaptive Restart for Accelerated Gradient Schemes

O'Donoghue and Candes (2015) 提出了用于加速梯度法(如 Nesterov Momentum)的自适应重启方案。

Restart 算法的基本思想:

  1. 运行原始算法 \(T\)
  2. 如果未收敛,将最后一个点 \(\theta^{(T)}\) 作为新的起点重新运行
  3. 每次 restart 使用相同的超参数和策略(只换起始点)

对于 GD + Nesterov Momentum:

\[ x^{k+1} = y^k - t_k \nabla f(y^k), \quad y^{k+1} = x^{k+1} + \beta_{k+1}(x^{k+1} - x^k) \]

高动量 \(\beta \to 1\) 会导致更多的振荡(rippling)。最优动量 \(q = \mu/L\)(强凸参数/光滑参数的比值),但通常未知。

三种 Restart 条件:

方案 条件 含义
Fixed Restart 每隔固定 \(T\) 简单但不自适应
Function Restart (FR) \(J(\theta^k) > J(\theta^{k-1})\) 损失增加时重启
Gradient Restart (GR) \(g_{k-1}^T \cdot (m_k - m_{k-1}) > 0\) 梯度与动量变化方向相反时重启

Gradient Restart 的直觉: 下降方向要求 \(\nabla J(\theta)^T \cdot \Delta\theta < 0\)。GR 条件 \(g_{k-1}^T \cdot (m_k - m_{k-1}) > 0\) 意味着 \((-g_{k-1})^T \cdot (m_k - m_{k-1}) < 0\),即动量的变化方向与梯度下降方向相反——暗示损失函数可能在增加,此时重启。

GD+Nesterov Momentum的各种restart方案比较

理论结论: 自适应重启方法可以在 不需要知道问题结构(如 Hessian 最大/最小特征值)的情况下,达到最优的线性收敛速率。

参考文献:O'Donoghue, B. and Candes, E. "Adaptive restart for accelerated gradient schemes." Foundations of Computational Mathematics 15, no. 3 (2015): 715-732.


评论 #