翻大模型训练的日志时常能看到一种曲线:前几百轮损失掉得很快,之后开始左右摇摆,怎么也压不下去。很多人第一反应是模型容量不够或数据有问题,实际原因常常简单得多——步长从头到尾没变过。学习率调度管的就是这件事:训练的不同阶段该用多大的步子。它不改变模型学什么,只改变学的节奏,而节奏错了,再好的结构也发挥不出来。
固定步长在两个阶段都不合适
训练初期,参数离目标很远,梯度方向大体一致,这时候步子大一些能快速穿过平坦区域。到了后期,参数已经在低点附近,梯度变小、方向开始来回摆,同样大的步子会让参数在谷底两侧反复跳过,损失停在一个偏高的位置震荡。两个阶段的要求互相矛盾,任何固定值都只能照顾一头。调度要做的,就是在训练过程中把步长从大调小,让快速接近和精细收敛各得其所。学习率本身控制什么,可参考 学习率的含义。
几种常见策略,各自赌的是什么
| 策略 | 什么时候降 | 代价 | 失效条件 |
|---|---|---|---|
| 阶梯衰减 | 固定轮数到点降一档 | 节点靠人工设定,换数据集要重调 | 数据量变化后,原来的轮数刻度全部错位 |
| 余弦衰减 | 按余弦曲线连续降到接近零 | 必须预先知道总步数 | 中途想延长训练,曲线已经走到底 |
| 指数或线性衰减 | 按固定比例逐步缩小 | 衰减系数敏感,设错前期就废 | 系数偏大时,模型很快进入几乎不更新的状态 |
| 预热 | 开局从极小值线性升到目标值 | 多花几百步在低效区间 | 小模型上预热过长,纯属浪费 |
| 按验证指标降 | 指标连续若干轮不改善时降一档 | 每轮多跑一次验证,训练变慢 | 验证指标噪声大时,会被误判触发 |
这五种里,前四种按计划走,最后一种按反馈走。计划型的优点是过程可复现、不用额外验证开销,缺点是计划基于对总步数的预估,预估错了曲线就对不上;反馈型更贴合实际,却把判断权交给了一个有噪声的指标。工程上常见的做法是两者叠加:主体用余弦衰减,开头加一段预热。
预热防的是开局那几百步
训练刚开始时,参数是随机的,梯度可能非常大且方向混乱。这时候直接用目标学习率,一次更新就能把参数推到很糟的位置,之后很难拉回来。深层网络里这个问题更明显,因为梯度要穿过很多层,早期的剧烈更新会被层层放大。预热把前几百步的学习率压到很小,让模型先在一个稳定区域里找到大致方向,再逐步放开。自适应优化器还有一层原因:它内部维护梯度平方的滑动估计,初始值接近零,前几步的更新量会被这个偏小的分母放大,预热正好把这段不稳定期盖住。层数越深、批越大,预热越值得加;反过来,一个几层的小模型上做几千步预热,收益基本为零。
降太早和降太晚,曲线长得不一样
降太早的典型表现是损失很早就变平,而且平在一个偏高的位置,训练损失和验证损失都不低——模型还没走到该去的地方,步子就先没了。这种欠拟合很难靠加轮数补救,因为学习率已经太小,参数几乎不再移动。降太晚则相反:训练损失继续往下走,验证损失却开始回升,模型在记住训练集的细节;或者两条损失都在低位持续抖动,始终压不到更低。判断方法不复杂,看训练损失还有没有下降空间——它已经彻底平了而验证损失还在涨,说明该早点停或早点降;它明显还有余量却降不动,多半是学习率过早衰减。训练损失和验证损失分叉意味着什么,可看 过拟合的典型曲线。
什么时候它不灵
调度不是万能钥匙。初值方差失控导致开局就溢出,调什么曲线都救不回来;数据标签有系统性错误,学习率再精细也只是更平稳地学错;模型结构本身不适合这个任务,收敛曲线漂亮也没意义。它还有很强的场景绑定:一套在图像分类上验证过的余弦加预热,搬到语言模型上未必合适,因为两者的序列长度、批大小、梯度噪声水平都不同。同一个模型改了批大小,最优学习率也会跟着变——常见经验是批大小翻倍、学习率大致翻倍,但这个线性关系有上限,批大到一定程度后收益会饱和,需要换用层自适应优化器。所以照搬别人的调度配置是最容易踩的坑,配置背后的批大小、总步数、优化器类型,一个都不能少。梯度更新的基本机制见 梯度下降,调度只是给它加了一个随时间变化的系数。
换配置时该怎么动
实用的调整顺序是:先把预热步数定在总步数的一个小比例,让开局稳定;再用余弦或阶梯把主体降下来;最后才考虑按验证指标微调。改批大小时同步改学习率,改总步数时同步改余弦的周期,换优化器时重新确认预热长度。每次只动一个变量,并且保留上一版的损失曲线做对照,否则很难判断是哪个改动起了作用。这套流程听起来笨,比反复试「感觉更好」的参数可靠得多。
速查:学习率调度的判断
- 训练初期要大步快走,后期要小步精修,固定值只能照顾一头
- 预热盖住开局的不稳定期,层越深、批越大越需要
- 损失早早变平且偏高是降太早,验证损失回升是降太晚
- 批大小、总步数、优化器任一改变,调度配置都要重新确认


