
学习率衰减( Learning Rate Decay)是指在训练过程中逐渐降低学习率的策略。通过衰减学习率 ,可以在训练的早期阶 段使用 较大 的学习率以快速收敛,然后逐渐降低学习率以细化参数更新并提高 模型的泛化能力 。
学习率是深度学习中最关键的超参数之一。它决定了每次参数更新的步长。在训练初期,较大的学习率有助于快速收敛;但到了训练后期,如果学习率仍然很大,优化可能会在最优点附近震荡,无法收敛到最佳解,甚至可能"越过"最优点导致发散。
学习率衰减策略就是为了解决这个问题而设计的,其核心思想是:在训练过程中随着迭代次数的增加,逐渐减小学习率,从而使得模型在初期快速收敛,在后期精细调参,达到更好的性能和稳定性。
以下是几种常见且重要的学习率衰减方法:
1. 按时间步衰减 / 指数衰减
这是最直接的方法。学习率在每个epoch或每一定数量的step之后按一个固定的比率下降。
-
公式 :
lr = initial_lr * decay_rate ^ (step / decay_steps)
-
特点:实现简单,是早期最常用的方法。
-
缺点:需要手动设置衰减率和衰减步长,对超参数比较敏感。
2. 阶梯衰减
在训练达到预设的特定"里程碑"时,将学习率乘以一个衰减系数(例如0.1)。这是目前最常用、最有效的策略之一。
-
操作:例如,可以设定在训练到总epoch数的50%和75%时,各将学习率降为之前的十分之一。
-
特点:性能稳定,可解释性强,在许多经典模型(如ResNet)的训练中都被使用。
-
缺点:需要预先设定好衰减的时间点,对于不同的任务可能需要调整这些"里程碑"。
3. 余弦退火
学习率的变化遵循余弦函数的一部分,从初始值缓慢地下降到0。
-
公式 :
lr = initial_lr * 0.5 * (1 + cos(π * current_epoch / total_epochs))
-
特点:
-
平滑下降:衰减过程非常平滑,没有突然的断点。
-
实验表现好:在很多任务上(尤其是图像分类)表现出色,通常是效果强大的基准方法。
-
重启变体 :其改进版带重启的余弦退火 ,在每次余弦周期结束时不是将学习率降到0,而是突然重启到一个较大的值("热身"),然后开始一个新的余弦下降周期。这种"重启"策略有助于帮助模型跳出局部最优点或鞍点,找到更优的解。
-
4. 线性衰减
学习率从一个初始值开始,随着训练过程线性地减小到0。
-
公式 :
lr = initial_lr * (1 - current_step / total_steps)
-
特点:比指数衰减更线性、更可控,下降过程稳定且可预测。在很多Transformer系列的模型训练中常用。
5. 性能平台衰减
这不是一个固定的数学 schedule,而是一种基于验证集指标的自适应策略。
-
操作:持续监控验证集损失(或准确率)。如果其在连续的若干个epoch内(即一个"耐心"区间)没有再提升,则认为性能进入了"平台期",此时就将学习率降低一个比例(如减半)。
-
特点 :非常实用,因为它根据模型的实际表现 来决定何时衰减,避免了预设schedule可能不合理的问题。
ReduceLROnPlateau
在PyTorch和Keras等框架中都是标准实现。 -
缺点:需要在每个epoch后评估验证集,增加了一些计算开销。
6. 反比例衰减 / 多项式衰减
学习率与训练步数的反平方根成比例衰减。这种方法在Transformer模型的原始论文中被提出并广泛应用。
-
公式 :
lr = initial_lr * (1 / sqrt(step))
或更常见的lr = initial_lr * (warmup_steps ^ 0.5) * min(step ^ -0.5, step * warmup_steps ^ -1.5)
-
特点 :通常与学习率预热配合使用。在训练初期,学习率从一个很小的值线性增加(预热),达到初始学习率后,再开始按反平方根衰减。这种"先升后降"的模式被证明对训练大规模Transformer网络非常有效。
总结与建议
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
阶梯衰减 | 稳定有效,可解释性强 | 需要预设里程碑 | CNN图像分类等广泛任务 |
余弦退火 | 平滑,收敛性能好,重启版能逃离局部最优 | 需要知道总训练步数 | 图像分类 、检测等(常用作强基线) |
线性衰减 | 简单,线性可控 | 需要知道总训练步数 | NLP(如Transformer) 、目标检测 |
性能平台衰减 | 自适应,无需预设schedule | 需验证集,增加计算 | 通用,尤其当不确定训练动态时 |
反比例衰减(带预热) | 对大规模模型训练稳定 | 需要精心调参 | Transformer/BERT等大型NLP模型 |
现代深度学习的实践建议:
-
默认起点 :可以首先尝试余弦退火 或线性衰减,它们通常能提供不错且稳定的性能。
-
使用预热 :无论采用哪种衰减策略,在训练的最开始(例如前5%的步数或epoch)使用学习率预热(Learning Rate Warmup)几乎总是一个好主意。它允许模型在初期稳定地建立梯度,避免训练初期的不稳定。
-
组合策略 :先进的方法通常是组合策略,例如 "线性预热 + 余弦退火" 是当前非常流行的选择。
-
框架支持 :主流框架(如PyTorch的
torch.optim.lr_scheduler
和 TensorFlow/Keras的tf.keras.optimizers.schedules
)都内置了上述所有方法,可以方便地调用和实验。 -
注意自适应优化器:对于Adam、AdamW这类自适应优化器,它们自身有一定的调节步长的能力,因此对学习率衰减的敏感度可能不如传统的SGD+Momentum那么高,但使用衰减通常仍然能带来提升。
选择哪种方法取决于具体任务、模型结构和经验,在实际应用中需要通过实验来选择最适合当前任务的学习率衰减策略。