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

学习率的底层作用机制与数学直观
从最朴素的视角看,梯度 ∇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