学习率调度
为什么训练过程中需要调整学习率?固定的学习率会有什么问题?¶
需要调整学习率的原因:
-
训练初期,参数远离最优点,损失曲面可能陡峭,需要较大的学习率快速逼近最优区域。
-
训练后期,参数接近最优点或处于狭窄的极小值盆地,较大的学习率会使参数在最优值附近来回震荡,难以精确收敛,甚至跳出该区域。此时需要较小的学习率进行精细微调。
-
深度网络的损失曲面高度非凸,存在鞍点、峭壁和局部极小值,动态调整学习率可以帮助模型在不同阶段克服这些障碍。
固定学习率的问题:
-
过大:初期可能快速下降,但随后会在最优值周围剧烈震荡甚至发散,损失无法收敛到更低水平,泛化性能差。
-
过小:收敛极其缓慢,可能长时间陷在鞍点或平坦区域,且容易过拟合(因为无法摆脱局部极小),训练成本剧增。
-
适中:对于简单问题或许可行,但对于复杂模型,始终如一的步长既不能高效穿越平坦区,又不能在后期平稳着陆,往往会得到次优结果。
因此,合理的学习率调度策略旨在平衡探索与精确收敛,兼顾训练速度和最终性能。

Step Decay 和 Cosine Annealing 分别是如何调整学习率的?各自的特点是什么?¶
Step Decay(阶梯衰减) 每经过固定的 epoch 数或步数,将学习率乘以一个常数因子 γ(如 0.1 或 0.5)。

例如:初始 0.1,每 30 epoch 下降为原来的 0.1 倍,即 0.1 → 0.01 → 0.001。
特点:
-
实现简单,可解释性强。
-
分段常数,学习率在很长一段时间保持不变,然后在某一时刻突然下降。这可能导致损失在衰减点处出现突降。
-
适用于许多经典视觉模型(如 ResNet),通常配合手工设定的衰减里程碑(如 30, 60, 90 epoch)。
-
对衰减步长和衰减因子敏感,需要先验知识。
Cosine Annealing(余弦退火)
学习率按余弦曲线从初始值逐渐下降到最低值(通常接近0)。

特点:
-
平滑连续下降,没有突变,优化过程更平稳。
-
初期保持较高的学习率探索,中后期平滑地降低,有助于收敛到更好的极小值。
-
通常可以取得比阶梯衰减更优的最终性能,尤其在图像分类、对比学习等任务中。
-
超参数较少,只需设置初始学习率、最低学习率和周期长度。
余弦退火(Cosine Annealing)搭配热重启(Warm Restarts)有什么好处?¶

好处:
-
跳出局部极小值:周期结束时学习率突然跳回高值,相当于给优化过程一记“扰动”,能将参数弹出当前可能较差的局部极小值或鞍点,重新探索损失曲面。这种“逃离”能力是单周期余弦所不具备的。
-
集成效果:每个周期结束时模型收敛到不同的局部解,可以将这些周期的模型快照(Snapshot Ensemble)进行集成,不增加训练成本即可提升泛化能力。
-
更快的收敛:由于热重启允许更大的学习率反复探索,模型常能在更少的 epoch 内达到单周期余弦退火相似的精度。
-
缓解过拟合:定期重置学习率引入了类似周期性退火的效果,提供了一种正则化,防止模型过早扎入尖锐极小值。
典型应用:SGDR(Stochastic Gradient Descent with Warm Restarts),在 CIFAR、ImageNet 上均表现出色。
学习率预热(Warmup)的步数一般如何设定?过长或过短有什么后果?¶
预热步数:指学习率从一个极小值(或零)线性增加到目标初始学习率所需的迭代步数。
设定原则:
-
对于 Transformer 等模型,常见预热步数在数千到数万步(如 4000 steps)或占总训练步数的 1%~5%。例如训练 BERT 时常用 10000 steps 预热。对于大模型(如 GPT-3),预热步数可能达数万。
-
一般通过观察训练曲线:如果 loss 在初期出现剧烈震荡或发散,往往需要更长的预热;如果预热过长,前期学习率过低,训练进展缓慢。
-
实际中常用规则:对 batch size 较大的情况,预热步数适当增加。许多库默认预热 5 个 epoch 或 10% 的总步数。
过短的后果:
-
模型初始化不稳定,一阶/二阶矩估计尚不可靠,突然的大学习率会导致参数更新过大,loss 爆炸或 NaN,训练可能崩溃。
-
即使未崩溃,初期的无序大更新可能将模型带到极差的初始点,影响最终收敛。
过长的后果:
-
前期有效学习率太小,收敛速度大大降低,浪费计算资源。
-
可能使模型在低学习率下陷入不太好的局部区域,限制了后续大学习率探索的能力,反而可能略微降低最终性能。
OneCycleLR 的策略是怎样的?它试图在训练中达到什么目的?¶
OneCycleLR 策略(Leslie Smith, 2017):
- 整个训练过程只有一个学习率周期,包含“上升阶段”和“下降阶段”。

- 通常配合动量(momentum)反向变化:学习率上升时,动量从 0.95 下降到 0.85(或类似);学习率下降时,动量再返回高点。
试图达到的目的:
-
快速收敛:学习率上升阶段使模型快速通过平坦区域,加速早期训练。
-
正则化效果:大学习率在中期起到类似“退火”但带有噪声的探索作用,能帮助模型找到更平坦、泛化更好的极小值;而下降阶段的动量逐渐增大又帮助模型在后期稳定收敛。
-
不依赖繁琐的超参数调优:使用学习率查找器(LR Finder)找到合适的最大学习率即可,策略自动完成整个训练过程,只需要训练固定 epochs(通常比传统调度所需的 epochs 少)。
-
性能和效率:大量实验表明,OneCycleLR 在更少的 epoch 内可以达到甚至超越传统调度(如阶梯衰减)的精度,特别适合有限预算的场景。
典型用法:fastai 库中广泛应用,适用于图像分类、NLP 等多种任务。
如何通过监控验证损失来动态调整学习率(如 ReduceLROnPlateau)?¶
ReduceLROnPlateau(基于平台衰减):
当训练过程中,验证损失(或验证精度等监控指标)停止改善时,将学习率乘以一个衰减因子(如 0.1),直到衰减到某个最小值。
使用方法:
-
选择监控指标,通常是验证损失(val loss)。也可选验证准确率、F1 等,但需注意方向。
-
设定
patience(耐心值)——即验证损失连续不下降(或未改善)的 epoch 数。例如 patience=5,表示如果 5 个 epoch 内验证损失没有创新低,则触发学习率衰减。 -
设定衰减因子
factor(常为 0.1 或 0.5)和最小学习率min_lr。 -
在训练循环中,每个 epoch 结束后评估验证损失。如果当前损失相对于历史最小损失的改善低于
threshold(或没有改善),则计数器+1;若计数器 >= patience,执行lr = lr * factor,并将计数器归零。 -
这种动态调节对训练自动终止也很有用:若学习率已衰减到 min_lr 但指标仍不改善,可提前停止(Early Stopping)。
优点:不需要预先知道训练的总轮次,自适应模型饱和状态,对不同的数据和模型鲁棒。
缺点:带有延迟,可能在学习率本应衰减时等待 patience 数个 epoch 才响应,造成浪费;不适用于损失波动剧烈的场景,可能频繁误触发。
不同层使用不同学习率(差异化学习率)在迁移学习中很常见,为什么有效?¶
为什么有效:
-
在迁移学习中,预训练模型的不同层捕获了不同层级的特征:底层通常是通用特征(边缘、纹理),高层是任务特定特征(语义组合)。微调时,我们希望保留底层通用知识,仅轻微调整,而高层和新添加的层则需要大幅适应新任务。
-
通过对不同层分配不同的学习率,可以实现:
- 底层(靠近输入)使用较小的学习率:避免破坏预训练学到的通用、可迁移表示,这些特征对许多任务都有效。
- 顶层(靠近输出)使用较大的学习率:因为这些层更面向原任务,需要快速调整以拟合新任务的类别或输出空间。
-
新添加的随机初始化层(如分类头)使用更大的学习率:它们需要从头学习,需要大步长。
-
这种策略显著提升了微调的效果,既防止灾难性遗忘,又加速收敛,且常能取得比全模型统一学习率更好的泛化性能。
实践例子:使用 ResNet 预训练模型做微调时,将模型分为若干组,如“layer1”、“layer2”、“layer3”、“layer4”和“fc”,每组的学习率按 0.1 倍递增或递减。例如基础学习率 0.001,fc 为 0.01,layer4 为 0.001,layer3 为 0.0001 等。PyTorch 的优化器中可以传递参数组列表,指定不同 'lr'。
什么是“学习率查找器”(LR Finder)?如何使用它选择一个合适的初始学习率?¶
学习率查找器 (LR Finder) 由 Leslie Smith 提出,旨在半自动地找到一个合适的最大学习率或初始学习率。
方法步骤:
-
从一个极小的学习率开始(如 10−810−8)。
-
在每个 mini-batch 后指数(或线性)增加学习率,同时记录相应的训练损失。
-
绘制学习率-损失曲线(以对数刻度的学习率为横轴)。
-
曲线通常呈现:先缓慢下降,然后快速下降,达到一个低点后开始趋于平坦或上升,最后可能剧烈发散。
-
选择策略:
- 最大学习率:取损失开始急剧上升之前的点对应的学习率,或者选择损失仍在下降但已趋于平缓的转折点。常用“损失还在下降且比最低点低一点(比如损失最小值的 10 倍下降点之前)”。
-
合适的初始学习率:通常可设置为找到的最大学习率的 1/10 或 1/5。或者取损失下降最快的那个区间的学习率作为最大学习率,再除以 3~10 作为循环学习率的上界。
-
将找到的数值输入到学习率调度器中(如 OneCycleLR 的最大学习率),或者直接作为固定学习率使用。
为什么有效:通过观察损失对学习率的响应,能够避开经验猜测,适应不同的模型结构和数据分布,使训练在初始阶段就处于一个高效且稳定的范围。
请画出常见的学习率调度曲线(Step, Cosine, Linear)并说明各自的适用场景。¶
由于文字不能实际画图,下面用文本描述曲线形状,并给出适用场景。
-
Step Decay(阶梯衰减)
-
形状:水平线段,每隔一段时间突然垂直下降,呈阶梯状。
-
适用场景:经典的 CNN 训练(如 VGG、ResNet),尤其是当你有固定的里程碑(如 30, 60, 90 epoch)并期望在衰减后损失出现明显的台阶式下降。适用于需要手动精细控制、对验证精度的跳跃式提升可接受的场合。
-
Cosine Annealing(余弦退火)
-
形状:平滑的余弦曲线,从最大值逐渐下降到最小值。如果搭配热重启,则呈现多个周期性余弦下降,每个周期结束时突然跳升回高点,形成锯齿状的余弦波。
-
适用场景:现代深度学习各类任务,如图像分类(EfficientNet)、自监督对比学习(SimCLR)、知识蒸馏等。在不需要手动设计衰减点时,能够取得更优的最终精度。对于需要长时间训练的任务,平滑下降有助于收敛到平坦极小值。
-
Linear Decay(线性衰减)
-
形状:一条直线从初始学习率斜向下到最后的值。
-
适用场景:训练 Transformer(尤其是纯线性衰减搭配 warmup),许多 NLP 预训练模型(如 BERT、GPT)的标准配置。线性衰减简单、平稳,避免了阶梯衰减的突变,同时比余弦衰减更容易实现。在一些大 batch 训练和强化学习中也很常见。
-
Polynomial Decay(多项式衰减)
-
形状:类似平滑下降曲线,按 (1−t/T)p 衰减,p=1 即线性,p>1 时先快后慢。
-
适用场景:语义分割、目标检测等有时使用,尤其需要下降先快后慢的情形。
通常选择:有明确阶段需求用 Step;追求最高精度且周期固定用 Cosine;训练 Transformer 优先用线性(配合 warmup);不确定时,Cosine 往往是良好的默认选项。
在微调大模型时,学习率一般怎么设置?与预训练阶段有何不同?¶
微调大模型时的学习率设置:
- 学习率量级更小

-
差异化学习率(分层学习率) 如前面所述,底层小、顶层大。具体可给编码器低学习率,分类头高学习率。在微调大语言模型时,有时也整体使用统一的小学习率,但参数高效微调方法(如 LoRA)则调整新增参数,其学习率可稍大。
-
调度策略
- 微调常用带预热的线性衰减或余弦衰减。预热步数占比可稍少(如总步数的 5%),然后线性或余弦降至几乎为 0。有时也采用常量学习率 + 平台衰减。
-
预训练阶段一般使用较长的预热,随后保持高学习率较长一段时间再衰减。
-
与预训练的不同点总结:
- 目标:预训练是学习通用知识,需要大幅探索;微调是知识迁移,需保守更新。
- 数值:微调学习率通常低一个数量级或更多。
- 调度:微调往往使用更短的总训练步数,学习率衰减到更小的终值,防止遗忘。
- 层差异:预训练通常所有层统一学习率(或特定架构有不同),微调经常使用分层学习率以保留底层特征。
- 正则化:微调通常使用更强的权重衰减(或 Dropout),但学习率同样较小以避免过拟合。
通过这种谨慎的设置,既能充分利用预训练能力,又能在下游任务上取得良好的性能。