面试官:你在训模型的时候经常使用的学习率策略有哪些?

推荐直接网站在线阅读:aicoting.cn

所有相关文档、源码示例、流程图与面试八股,我也将持续更新在AIHub,欢迎关注收藏!

学习率策略

在训练神经网络时,学习率(Learning Rate, LR) 是最关键的超参数之一。学习率控制了每次参数更新的步子大小,学习率太大,可能导致震荡甚至发散,模型根本学不下去;学习率太小,训练过程会非常慢,还可能卡在局部最优点。

为了在不同阶段取得更好的训练效果,人们设计了各种 学习率调度策略(Learning Rate Scheduling),它们的目标是让学习率在训练过程中动态变化,而不是固定不变。

固定学习率

最简单的方式就是设置一个固定的学习率。固定学习率实现简单,不需要额外的调度逻辑。但是在复杂模型训练中往往效果不好,因为模型在训练初期需要更快收敛,而在后期需要更稳的更新。

Step Decay

  • :第 t 次迭代的学习率
  • :初始学习率
  • :衰减因子(如 0.1)
  • :衰减步长

Step Decay 在训练到一定阶段后,将学习率整体降低一个档次。虽然简单粗暴,但在图像分类等任务中依旧常见。

代码示例:

ini 复制代码
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

学习率变化曲线是阶梯状的,看起来像台阶。 优点是简单易用,缺点是变化太生硬,有时候不够平滑。

优点是简单易用,缺点是变化太生硬,有时候不够平滑。

指数衰减

相比 StepLR,指数衰减更加平滑。

公式:

代码示例:

ini 复制代码
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)

每个 epoch 学习率都会乘上一个常数系数(比如 0.95),逐步下降。

常用于中小规模训练任务,稳定但缺乏灵活性。

多步衰减

有时候你希望学习率只在特定几个时间点下降,而不是固定周期。

比如:

ini 复制代码
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[60, 120, 160], gamma=0.2)

意思是当训练到第 60、120、160 轮时,学习率衰减为原来的 0.2。

这种方式常见于图像分类任务(如 ResNet 论文原设)。

Warm-up(预热策略)

Warm-up 的思想是不要一开始就用很大的学习率,而是从小学习率慢慢升上去。

原因是在训练初期,参数随机初始化,梯度方向可能非常不稳定,如果学习率过大,很容易发散。方法就是前几轮训练让学习率线性增加,达到设定的峰值,再切换到正常调度策略。Warm-up 几乎是 Transformer、大模型训练的标配,因为它能极大地缓解训练初期的不稳定。

常见组合:

  • Warmup + Cosine Decay

  • Warmup + Linear Decay

  • Warmup + Exponential Decay 示例(以 HuggingFace 为例):

ini 复制代码
from transformers import get_cosine_schedule_with_warmup

scheduler = get_cosine_schedule_with_warmup(
    optimizer,
    num_warmup_steps=1000,
    num_training_steps=10000
)

这种方式几乎成为 Transformer 时代的默认配置。

Cosine Annealing

  • :最大学习率
  • :最小学习率
  • :当前迭代数
  • :总迭代数

Cosine Annealing 会让学习率按照余弦函数曲线逐渐下降,更新越来越小,更利于模型在训练后期收敛到更优的点。有时还会配合 重启机制(Cosine Annealing with Restarts, SGDR) 使用,让学习率周期性恢复,从而跳出局部最优。

代码示例:

ini 复制代码
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)

如果结合 Warm Restarts(周期性重启),可以让学习率周期性上升再下降,从而跳出局部最优。

OneCycle Policy

OneCycle 是近年来非常流行的一种学习率策略。它的核心思想是前半程学习率从一个较小值线性升高到最大学习率;后半程学习率再逐渐下降到比初始值还小的水平。 同时,OneCycle 还会配合动量调整,学习率高时动量低,学习率低时动量高。

代码示例:

ini 复制代码
scheduler = torch.optim.lr_scheduler.OneCycleLR(
    optimizer, 
    max_lr=0.1, 
    total_steps=1000
)

OneCycle 可以让模型在训练过程中更快收敛,并且往往提升泛化性能。PyTorch 已经内置了这个调度器,很多人把它作为默认选择。

现在你想一下优化器和学习率策略有什么关系,是不是优化器决定了怎么走,学习率策略决定了走多快、何时加速、何时刹车。合理的学习率调度,往往比盲目调大模型、更换优化器带来的提升还要显著。

📚推荐阅读

面试官:深度学习中经典的优化算法都有哪些?

一文搞懂深度学习中的通用逼近定理!

一文搞懂深度学习中的表征学习理论!

一文搞懂深度学习中的信息论!

一文搞懂深度学习的反向传播与优化理论!

一文搞懂深度学习中的张量与自动微分!

一文彻底搞懂深度学习和机器学习的区别!

最新的文章都在公众号aicoting更新,别忘记关注哦!!!

作者:aicoting

分享是一种信仰,连接让成长更有温度。

我们下次不见不散!

相关推荐
Sammyyyyy1 小时前
9个Python库把一个月的AI开发周期缩短到了3天
人工智能·后端·python·servbay
Julian.zhou2 小时前
AI Coding的本质:Skill为魂,脚本为足,双引擎驱动确定性工程
人工智能·ai编程·ai coding
ambition202422 小时前
从“分组游戏”到数学结构:等价关系、等价类、商集与划分完全指南
人工智能·游戏
黎阳之光2 小时前
AI数智筑防线 绿色科技启新篇——黎阳之光硬核技术赋能生态安全双升级
大数据·人工智能·算法·安全·数字孪生
高德开放平台2 小时前
高德开放平台已全面接入“鹰眼守护”预警系统,两轮车版率先适配小牛电动
人工智能
twc8292 小时前
Query 改写 大模型测试的数据倍增器
开发语言·人工智能·python·rag·大模型测试
程序员小郭832 小时前
Spring AI 06 提示词(Prompt)全场景实战:从基础到高级模板用法
人工智能·spring·prompt
zhangfeng11332 小时前
`transformers` 的 `per_device_train_batch_size` 不支持小于 1 的浮点数值,llamafactory 支持
人工智能·算法·batch
zl_vslam2 小时前
SLAM中的非线性优-3D图优化之绝对位姿SE3约束四元数形式(十九)
人工智能·算法·计算机视觉·3d