现场是这样的。用 cosine 调度训练完,日志显示最后的学习率仍有初始值的百分之十,模型在收尾阶段还在大幅更新。
中间走过弯路,把「训练步数与调度器配置的总步数不一致」当成主因,改完现象没变。
原因不止一个,得分开看。调度器没有设置最小学习率比例;预热步数占比过高,压缩了衰减区间;续训时重建调度器导致曲线错位。
先把最小学习率比例设为接近零
TrainingArguments(learning_rate=2e-4, lr_scheduler_type='cosine', warmup_ratio=0.03)
显式给出最小学习率
python train.py --lr_scheduler_type cosine_with_min_lr --min_lr_rate 0.01
随后确认调度器总步数与实际一致
print(trainer.state.max_steps)
画出学习率曲线检查形状
python -c "print([round(x,6) for x in lrs[::max(1,len(lrs)//10)]])")
怎么算真的好了,看的是同一批现象。训练末段学习率降到接近零,loss 在收尾阶段平稳收敛,验证指标不再抖动。
最小学习率不是零有时是刻意设计,能让模型在末期保持一定探索能力,是否归零要看任务而不是照搬配置。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。