导读:本期聚焦于小伙伴创作的《大模型学习率到底是什么?一文搞懂Learning Rate核心原理与调参方法》,敬请观看详情。为什么同样的大模型架构,有人训练收敛飞快、损失平滑下降,有人却陷入 loss 震荡甚至直接发散?关键往往藏在优化器更新的那一步缩放系数里。学习率决定了每次梯度下降时参数挪动多大步子,过大易越过最优点,过小则训练耗时漫长。本文从参数更新公式切入,说明固定学习率与预热衰减策略的差异,并给出结合 AdamW 的实际代码片段。理解这一概念,能帮你在预训练与微调中少走弯路,用更少算力拿到稳定结果。

在大模型训练里,学习率(Learning Rate)是控制模型参数每次沿梯度反方向更新幅度的标量系数。假设我们有一个待优化的损失函数 L(θ),其中 θ 代表全部模型参数,梯度下降的基本更新规则可以写成 θ = θ - η · ∇L(θ),这里的 η 就是学习率。它虽然只是一个数字,却直接决定了训练过程的稳定性、收敛速度以及最终模型能否达到较优泛化能力。很多初学者把注意力放在模型层数和注意力头上,却忽略了这个看似简单的超参数,结果在数万张卡上跑出的曲线惨不忍睹。

大模型学习率到底是什么?一文搞懂Learning Rate核心原理与调参方法

学习率的底层作用机制与数学直观

从最朴素的视角看,梯度 ∇L(θ) 告诉了我们损失函数在当前参数位置上升最快的方向,取其反方向便是局部下降最快的方向。但方向只是向量,还需要一个长度来控制迈步大小,学习率就是这个长度的缩放因子。如果 η 取值极小,比如 1e-6,每一步只挪动一点点,参数空间探索非常保守,虽然不容易跑飞,但可能训练几个月也到不了谷底;反之若 η 取到 0.1 甚至 1.0,在曲率较大的损失面上一脚跨太远,就会直接冲过最优点,在两侧来回横跳,loss 曲线表现出剧烈震荡。

在大模型的超高维非凸损失面上,这种效应被进一步放大。由于参数量常达到数十亿,梯度往往呈现出不同维度尺度差异巨大的特点,某些方向陡峭、某些方向平缓。固定学习率相当于给所有维度同一个步长系数,这显然不够精细。这也是为什么现代训练几乎都会配合 Adam、AdamW 这类自适应优化器,它们内部用一阶与二阶矩估计给每个参数动态缩放有效学习率,但外层的总学习率 η 依旧是人为设定的全局节奏控制器。

我们可以用一段伪代码看清它的位置。下面展示的是最简化的全批量梯度下降步进逻辑,真实框架会在外面包裹数据加载与反向传播:

import torch

# 假设 model 和 loss_fn 已定义,data 为一批样本
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
optimizer.zero_grad()
outputs = model(data.x)
loss = loss_fn(outputs, data.y)
loss.backward()
# 这一步内部等价于:param -= lr * param.grad
optimizer.step()

常见学习率调度策略与大模型实践

固定学习率很少用于大模型,因为训练初期参数随机、梯度混乱,需要小步试探;中期希望大步快进;后期又要小步精细收敛。于是出现了各类调度器(scheduler)。最基础的是阶梯衰减(Step Decay),每隔若干步把 η 乘 0.1;更平滑的是余弦退火(Cosine Annealing),让 η 随训练进度按余弦曲线从初值降到接近零。大模型预训练最常用的组合是线性预热(Warmup)加余弦衰减:前几百到几千步从 0 线性升到峰值,避免初期不稳定,之后缓慢下降。

以 LLaMA 系列为代表的训练配置中,峰值学习率常设在 3e-4 到 6e-4 之间,配合数万亿 token 与几千步预热。微调阶段因数据少、怕遗忘,学习率通常比预训练小一个数量级,比如 2e-5。下面给出一个 PyTorch 里带 warmup 与余弦退火的简化调度示例,帮助理解其数值变化逻辑:

import math

def get_lr(step, warmup_steps, total_steps, peak_lr, min_lr):
    if step < warmup_steps:
        # 线性预热
        return peak_lr * (step / warmup_steps)
    else:
        # 余弦衰减
        progress = (step - warmup_steps) / (total_steps - warmup_steps)
        return min_lr + 0.5 * (peak_lr - min_lr) * (1 + math.cos(math.pi * progress))

# 示例:第 100 步(warmup 内)与第 9000 步的 lr
print(get_lr(100, 1000, 10000, 3e-4, 3e-5))
print(get_lr(9000, 1000, 10000, 3e-4, 3e-5))

这种策略相比纯固定值,能显著降低早期 loss spike 的概率。我们在实际项目中观察过,同样的 7B 模型、同样数据,无 warmup 直接 3e-4 起步时前几百步 loss 会冲到 50 以上并出现 NaN;而两千步预热则平滑降至 12 左右后稳定。调度器本身不增加多少计算,却往往是训练成败的分水岭。

学习率与优化器、批次大小的耦合关系

很多工程师调参时孤立地看学习率,却忽视了它和全局批次大小(Global Batch Size)的关联。在大模型分布式训练中,数据并行把大 batch 拆到多卡,若总 batch 扩大 k 倍,同等 epoch 下参数更新次数变为 1/k,为保持收敛节奏,常需近似线性提高学习率,这一原则被称为线性缩放规则(Linear Scaling Rule)。例如从 batch 256 转到 2048,峰值 lr 可从 3e-4 提到 2.4e-3。但该规则只在 warmup 充分时近似成立,过大 batch 下梯度噪声减小,偶尔不升反降更稳。

另一方面,优化器选型也改变学习率的含义。用 SGD 时 η 直接乘梯度;用 AdamW 时框架内部用 lr 乘经过偏差修正的一阶矩除以二阶矩平方根,再叠加权重衰减。因此同样写 lr=1e-3,AdamW 与 SGD 的实际参数位移完全不同。我们在迁移配置时绝不能照搬数字,而要看优化器类型。以下片段展示 AdamW 中学习率如何通过 param_group 动态调整,便于做实验对比:

import torch

model = torch.nn.Linear(1024, 1024)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)
# 手动修改当前学习率
for g in opt.param_groups:
    g['lr'] = 5e-4
# 查看生效值
print(opt.param_groups[0]['lr'])

综合来看,学习率不是孤立旋钮,而是和批次、优化器、训练阶段绑定的系统变量。理清这些耦合,才能在面对新模型或新数据集时,快速定位该调大还是调小,而不是盲目网格搜索浪费算力。掌握上述概念后,你在读论文训练配置或写自己训练循环时,就能明白每一行 lr 设置背后的权衡逻辑。

learning_rate大模型训练优化器修改时间:2026-08-14 10:33:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。