Warmup 把学习率从零升到峰值。然后呢?一直保持峰值到训练结束?
不行。训练后期,参数已经接近最优位置了。如果还是用大学习率,参数会在最优点附近来回跳——跳过去,跳回来,永远定不下来。
需要在训练后期逐渐减小学习率,让步子越来越小,最终在最优点附近稳住。
Cosine decay
Cosine decay 是目前最常用的学习率衰减方式。学习率按照余弦函数的形状从峰值平滑下降到接近零:
学习率(t) = η_min + (η_max − η_min) × ½ × (1 + cos(π × t / T))
η_max 是峰值学习率,η_min 是最终学习率(通常是峰值的十分之一或更小),t 是当前步数,T 是总训练步数。
这个曲线的形状是:
峰值 ──╮
│ 一开始下降慢(余弦曲线上方是平的)
│
│ 中间加速下降
│
│ 接近结尾又放慢(余弦曲线下方也是平的)
╰── 最终值
为什么不线性衰减(匀速下降)?因为余弦衰减在训练中期保持较高的学习率更久——让模型有更多的高效训练时间——然后在后期迅速降低,精细调整。
完整的学习率曲线
把 warmup 和 cosine decay 合在一起,Sophia 的学习率随训练步数的变化是:
学习率
↑
0.0003 │ ╭────────────────╮
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
0.00003│ ╱ ╲
│╱ ╲___
└──────────────────────────────────→ 训练步数
warmup 主训练阶段 衰减
三个阶段:快速上升(warmup)→ 平稳的高学习率(主训练)→ 缓慢下降(cosine decay)。
这条曲线完全预先确定——在训练开始之前就设好了,不会根据 loss 的变化调整。这种不依赖训练状态的固定日程(schedule)是目前大模型训练的标准做法。
下一章节来看训练中的另一个节奏参数:每一步看多少数据。