深度学习篇---余弦退火学习率调度

张开发
2026/4/18 7:49:30 15 分钟阅读

分享文章

深度学习篇---余弦退火学习率调度
一、什么是余弦退火核心思想是让学习率按照余弦函数的形状衰减训练开始时保持较高学习率进行大范围探索随着训练推进平滑地降低到接近零帮助模型精细收敛。数学表达式纯文本描述学习率 最小学习率 0.5 × 初始学习率 - 最小学习率 × 1 cos当前步数 / 总步数 × π当前学习率当前这一步的学习率数值。初始学习率训练开始时的最大学习率。最小学习率衰减终点的学习率通常设为 0 或一个极小的值如 1e-6。当前步数从0开始计数的已执行训练步数或轮数。总步数一个完整余弦周期包含的步数。曲线形态从最大值平滑下降末期变化非常平缓斜率几乎为0这非常有利于在极小步长下找到最优解。二、为什么要用余弦形状与常见的阶梯衰减或指数衰减相比余弦退火有几个独特优势对比项阶梯 / 指数衰减余弦退火末期变化率可能突然下降或维持恒定速度末端斜率趋近于0极其平滑对微小最优解的敏感度一般很高能在极小步长下精细搜索热重启潜力无天然支持周期性重启这种平滑性在图像分类、对比学习等任务中表现尤为突出常比传统的阶梯式下降取得更好的准确率。三、重要变体带热重启的余弦退火这是余弦退火最著名的扩展由 Loshchilov Hutter 在2016年提出。普通余弦退火的问题学习率一旦衰减到接近于0训练就基本停滞了。但如果此时模型还没完全收敛到理想状态就无能为力了。热重启的解决思路每经过一个周期比如10个epoch学习率瞬间跳回初始最大值开始新一轮余弦衰减。重启周期通常逐渐拉长第一个周期 10 轮第二个周期 20 轮第三个周期 40 轮 ……或者每个周期长度是前一个的固定倍数例如乘以2。为什么有效每一次重启模型会短暂地以高学习率“跳出”当前的局部极小值区域。然后随着学习率衰减在新的区域内重新收敛。多次重启相当于集成了多个在不同局部最优附近的模型快照Snapshot Ensemble可以在不增加训练成本的情况下提升最终模型的泛化能力。四、实践中需要注意的细节与 Warmup预热结合单纯余弦退火从高学习率直接开始训练初期可能不稳定。通常先做Linear Warmup把学习率从0线性增长到最大值再开始余弦衰减。Transformer类模型几乎必用这个组合。重启周期的设定周期太短频繁跳高模型震荡难以收敛。周期太长退化为普通余弦退火失去重启优势。经验值第一次重启设置在总训练时长的1/4 到 1/3处。保存和恢复状态热重启调度器有内部计数器。中断训练后继续时需要同时保存和恢复调度器的状态字典否则重启节律会被打乱。Batch-level vs Epoch-level大多数情况下按 Epoch轮调度但如果数据集极小或单批次数据量极大按 Step步调度会更精细。五、适用场景场景推荐程度原因图像分类CNN⭐⭐⭐⭐⭐末期平滑下降对精调权重帮助极大。对比学习 / 自监督⭐⭐⭐⭐⭐训练时间极长热重启能维持模型的探索能力。Transformer / LLM 预训练⭐⭐⭐⭐通常必须配合Warmup使用是标准配置之一。GAN 训练⭐⭐生成器和判别器在动态博弈剧烈的学习率跳变可能破坏平衡。强化学习⭐环境本身是非平稳的固定的学习率调度表意义不大。余弦退火策略总结框图流程图文字解读主循环左侧系统在每个训练步都会计算当前应处于余弦曲线的哪个位置得出对应的学习率更新给优化器。周期判断中间菱形检查是否已经跑完了设定的周期总步数。如果没跑完继续按余弦规律衰减。热重启分支右侧如果跑完了且开启了热重启计数器归零周期长度延长学习率瞬间拉满然后再次进入左侧的余弦衰减流程。结束出口底部如果不开启热重启走完一个完整余弦周期后学习率将永久保持在最小值直到训练停止。

更多文章