一句话定义:OneCycle 学习率调度(OneCycle LR schedule)是一种让学习率在训练中途升到最高、再一路退到接近零的策略——整段训练的学习率曲线像一座小山,而不是常见的一路下坡。
为什么这样设计
常规直觉是“学习率越到后期越小”。OneCycle 反着来:开头用不大的学习率热身(大约占总步数的两三成),随后升到峰值,峰值往往比常规设置大好几倍;过了中点再一路下降,终点甚至低于起点。
打个比方。训练模型就像让一颗珠子在起伏的地形上找到最低的谷底。学习率小,珠子轻轻滚,很快卡在第一个浅坑里出不来。学习率大,相当于给它一脚,噪声把它踢出浅坑、翻过小坡;但一直猛踢,它永远安静不下来。OneCycle 的做法是:先把珠子晃起来,让它有本事逃离糟糕的坑;再逐渐收力,最后轻手轻脚,让它稳稳停在最深的谷底。
高学习率阶段还有个副产品:更新噪声本身起到正则化作用,模型不容易死记硬背训练数据。末尾的小学习率负责精修,让参数停在一个较为平坦的低谷里,泛化通常更好。合起来就是常说的“超收敛”(super-convergence):用更少的轮数跑出不错的结果。
和 warmup + 余弦有什么不同
| 维度 | OneCycle | warmup + 余弦退火 |
|---|---|---|
| 学习率形状 | 升到峰值,再降到低于起点 | 升到峰值后单调下降 |
| 峰值位置 | 训练中段 | 训练起点 |
| 动量 | 常与学习率反向变化,接力控制步长 | 通常固定 |
| 训练预算 | 必须提前知道总步数 | 较灵活,可配合重启 |
一句话概括:warmup 只是开头的保护措施,防止随机初始化的模型被大学习率带偏;OneCycle 把这段保护纳入整体设计,真正的目标是“用高学习率跑完全程”。余弦退火的峰值就是起点,之后只降不升;OneCycle 的峰值在中间,终点更低。此外 OneCycle 常把动量也做成反向曲线:学习率升时动量降,学习率降时动量升,两者接力维持更新幅度。
对从业者的意义
OneCycle 是“省调参、省算力”的实用默认选项:按总步数设一次,通常就有接近调参后的效果,相同轮数下往往收敛更快。代价是训练必须跑满预定预算,中途停下再恢复会打乱节奏;做微调、训练步数不确定或数据流式到达时,warmup + 余弦更省心。各框架的具体实现略有差异,参数含义以官方文档为准。
