【深度学习笔记 Ⅱ】11 学习率衰减
深度学习中的学习率衰减策略
学习率衰减(Learning Rate Decay)是优化深度学习模型的重要技术,它通过在训练过程中逐渐降低学习率来提高模型性能。以下是学习率衰减的全面解析:
1. 为什么需要学习率衰减?
- 初期阶段:较大的学习率有助于快速收敛
- 后期阶段:较小的学习率有助于精细调参,找到更优解
- 避免震荡:防止在最优解附近来回震荡
- 提高精度:最终能更精确地接近最优解
2. 常见学习率衰减方法
2.1 时间衰减(Time-Based Decay)
公式:
η_t = η_0 / (1 + decay_rate * t)
其中:
- η_t:当前学习率
- η_0:初始学习率
- decay_rate:衰减率
- t:当前epoch或step
PyTorch实现:
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda t: 1/(1 + 0.1*t)
2.2 指数衰减(Exponential Decay)
公式:
η_t = η_0 * decay_rate^t
PyTorch实现:
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95) # decay_rate
2.3 阶梯衰减(Step Decay)
公式:
每N个epoch学习率减半
PyTorch实现:
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, # 每30个epochgamma=0.5) # 衰减为原来的0.5倍
2.4 余弦退火(Cosine Annealing)
公式:
η_t = η_min + 0.5*(η_max-η_min)*(1+cos(t/T*π))
PyTorch实现:
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100) # 周期
2.5 带重启的余弦退火(Cosine Annealing with Warm Restarts)
PyTorch实现:
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer,T_0=50, # 第一个周期长度T_mult=2) # 后续周期倍增因子
2.6 ReduceLROnPlateau(基于指标衰减)
特点:当验证指标停止改善时降低学习率
PyTorch实现:
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,mode='min', # 监控指标模式(min/max)factor=0.1, # 衰减因子patience=10, # 等待epoch数verbose=True) # 打印信息# 使用时需要在每个epoch后:
val_loss = ...
scheduler.step(val_loss)
3. 学习率衰减实现对比
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
时间衰减 | 简单直接 | 可能过早衰减 | 简单任务 |
指数衰减 | 衰减速度快 | 需要调衰减率 | 初期快速收敛 |
阶梯衰减 | 明确可控 | 非平滑变化 | 分阶段训练 |
余弦退火 | 平滑变化 | 计算稍复杂 | 精细调参 |
带重启余弦 | 跳出局部最优 | 超参较多 | 复杂优化场景 |
ReduceLROnPlateau | 自适应 | 依赖验证集 | 实际应用 |
4. 学习率衰减最佳实践
-
初始学习率选择:
- 先用较大学习率(如0.1)测试
- 观察损失曲线调整
-
衰减时机:
- 当验证损失停滞时开始衰减
- 或预先设定衰减计划
-
组合策略:
# 前10个epoch用warmup warmup_scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda epoch: epoch/10)# 之后用余弦退火 main_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=90)
-
监控与可视化:
# 记录学习率变化 lr_history = [] for epoch in range(epochs):lr_history.append(optimizer.param_groups[0]['lr'])# ...训练步骤...scheduler.step()
-
与优化器配合:
- Adam等自适应方法通常需要较小的衰减率
- SGD通常需要更积极的学习率衰减
5. 学习率衰减的数学原理
学习率衰减的理论基础来自优化理论中的学习率条件:
∑η_t = ∞ 且 ∑η_t² < ∞
这意味着:
- 学习率足够大、持续足够长时间以保证收敛
- 学习率最终足够小以保证稳定
6. 现代深度学习中的学习率调度
-
One-Cycle策略:
- 先升高再降低学习率
- 结合动量变化
-
Super-Convergence:
- 使用非常大的学习率
- 配合特殊正则化
-
自适应方法:
- 如Adam等算法内置自适应学习率
- 但仍可配合适度的衰减
学习率衰减是深度学习调参的关键技术之一,合理的学习率调度可以显著提高模型性能。在实际应用中,需要根据具体任务和模型结构选择合适的衰减策略。