
超参数并非经验玄学,而是直接塑造Loss曲面形态与优化器行为的可控变量。本文从梯度更新公式出发,剖析学习率、Batch Size、Warmup、Weight Decay等核心超参数对训练动力学的影响机制,结合LLM训练实践给出调参的定量分析框架。
1. 优化器中的超参数全景
大模型训练的核心循环是梯度下降的变体。每一个超参数都对应优化器数学公式中的一个系数,直接影响参数更新的方向和幅度。
AdamW是LLM训练的事实标准,其参数更新公式为:
mt=β1mt−1+(1−β1)gt
vt=β2vt−1+(1−β2)gt2
m^t=1−β1tmt,v^t=1−β2tvt
θt+1=θt−η(v^t +ϵm^t+λθt)
其中 η 是学习率, λ 是权重衰减系数, β1=0.9,β2=0.95 是动量衰减因子。每个参数的作用域和敏感度不同。
2. 学习率:Loss曲面的步长控制器
学习率是影响训练稳定性的最敏感超参数。它决定了每次参数更新在Loss曲面上移动的步长。
学习率与Loss的关系不是线性的。实验表明存在一个"Goldilocks区间"------通常在 10−5 到 10−3 之间(对于预训练),超出这个区间训练会快速恶化。
关键的定量规律:
- 最大学习率 :存在一个临界值 ηmax,超过后Loss会发散。经验上 ηmax≈λmax(H)2,其中 λmax(H) 是Hessian矩阵最大特征值
- 最优学习率 :通常在 ηmax/2 到 ηmax/10 之间
- Batch Size缩放律 :线性缩放规则(Linear Scaling Rule)指出 lr∝B,但仅在一定范围内成立
python
# 来源:GPT-3 (Brown et al., 2020) Section 2.2
# 学习率随训练进行先升后降的策略
def lr_schedule(step, warmup_steps, max_lr, total_steps):
"""Warmup + Cosine Decay 学习率调度"""
if step < warmup_steps:
# 线性预热阶段:从0逐步上升到max_lr
return max_lr * step / warmup_steps
else:
# 余弦退火阶段:从max_lr平滑下降到min_lr
progress = (step - warmup_steps) / (total_steps - warmup_steps)
return max_lr * 0.5 * (1 + math.cos(math.pi * progress))
3. Batch Size:梯度估计的方差与泛化
Batch Size决定了每次参数更新使用的样本数,直接影响梯度估计的质量和泛化能力。这是LLM训练中最具争议的超参数之一。
Batch Size的核心影响机制:
梯度估计方差 : Var∇θL∝Bσ2,其中 σ2 是单样本梯度的方差。更大的Batch Size降低梯度方差,但收益递减(平方根关系)。
泛化差距:Keskar et al. (2017) 的实证研究表明,大Batch Size倾向于收敛到sharp minima,泛化能力差;小Batch Size的噪声有助于逃离sharp minima,找到flat minima。
临界Batch Size :McCandlish et al. (2018) 提出了临界Batch Size B∗ 的概念:
B∗=∥∇L∥2⋅λmax(H)∇L⋅H⋅∇L
当 B>B∗ 后,增大Batch Size的收益急剧下降。
python
# 来源:Megatron-LM / megatron/core/optimizer/lr_scheduler.py
# 大模型训练中Batch Size与学习率的协同调整
def setup_lr_schedule(args):
"""根据warmup和batch size配置学习率调度"""
# Warmup阶段:避免初始阶段梯度方差过大导致不稳定
warmup_steps = int(args.lr_warmup_fraction * args.train_iters)
# 线性缩放规则:lr = base_lr * (batch_size / base_batch_size)
# 但需要设置上限防止学习率过大
scaled_lr = args.lr * (args.micro_batch_size * args.data_parallel_size / 256)
# 余弦退火:后期逐步降低学习率,帮助收敛到更优解
return CosineAnnealingLR(optimizer, T_max=args.train_iters - warmup_steps)
4. Warmup:稳定训练的关键机制
Warmup是大模型训练中不可或缺的技术。没有Warmup,训练几乎必然在初始阶段发散。
Warmup的必要性来自以下原因:
- 梯度方差:训练初期参数随机初始化,梯度估计方差极大。大学习率 × 大梯度 = 参数剧烈震荡
- Adam的偏差校正 :Adam的动量估计 mt 和 vt 在 t 较小时偏差显著(除以 1−βt 只是部分校正)
- Hessian特征值分布:初始阶段Hessian的条件数很大,不同方向的曲率差异显著
经验设置:
- Warmup步数:通常占总训练步数的 1-5%(GPT-3使用375M tokens的warmup)
- Warmup策略 :线性warmup最常用,从 10−7 线性增长到目标学习率
- 最小warmup步数:对于大模型,至少需要几百步warmup
python
# 来源:LLaMA (Touvron et al., 2023) 训练脚本
# 线性Warmup实现
class LinearWarmup:
def __init__(self, warmup_steps, target_lr):
self.warmup_steps = warmup_steps
self.target_lr = target_lr
self.current_step = 0
def step(self):
self.current_step += 1
if self.current_step <= self.warmup_steps:
# 线性插值:从0到target_lr
lr = self.target_lr * self.current_step / self.warmup_steps
else:
lr = self.target_lr
return lr
5. Weight Decay:正则化的现代实现
Weight Decay在AdamW中从L2正则化中解耦出来,这是理解现代LLM训练的关键设计决策。
L2正则化 vs 解耦Weight Decay的数学差异:
L2正则化 (传统Adam): θt+1=θt−η(v^t +ϵm^t+λθt)
正则化项 λθt 被自适应学习率 v^t 1 缩放,导致梯度大的参数受到的正则化反而弱。
解耦Weight Decay (AdamW): θt+1=θt−ηv^t +ϵm^t−ηλθt
参数衰减独立于梯度更新,正则化效果在所有参数上保持一致。
python
# 来源:PyTorch / torch/optim/adamw.py
# AdamW核心实现:解耦权重衰减
class AdamW(Optimizer):
def step(self, closure=None):
for group in self.param_groups:
lr = group['lr']
weight_decay = group['weight_decay']
for p in group['params']:
if p.grad is None:
continue
grad = p.grad.data
# 1. 计算一阶和二阶动量(与Adam相同)
exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
# 2. 偏差校正
bias_correction1 = 1 - beta1 ** step
bias_correction2 = 1 - beta2 ** step
# 3. 自适应梯度更新
step_size = lr / bias_correction1
denom = (exp_avg_sq.sqrt() / math.sqrt(bias_correction2)).add_(eps)
# 4. 先应用权重衰减(解耦!)
p.data.mul_(1 - lr * weight_decay)
# 5. 再应用梯度更新
p.data.addcdiv_(exp_avg, denom, value=-step_size)
6. 学习率调度:从Warmup到退火
学习率调度策略决定了训练过程中学习率的动态变化。合理的调度策略能显著提升最终模型质量。
Cosine Decay是目前LLM训练的主流选择,其公式为:
ηt=ηmin+21(ηmax−ηmin)(1+cos(Ttπ))
相比Step Decay,Cosine Decay的优势在于:
- 学习率平滑下降,没有突变
- 后期学习率缓慢降低,允许模型在Loss曲面上精细搜索
- 最终收敛到接近0的学习率,确保训练稳定结束
python
# 来源:Chinchilla (Hoffmann et al., 2022) 训练配置
# Cosine Decay调度器的典型配置
def cosine_lr_schedule(step, warmup_steps, total_steps, max_lr, min_lr=0.1):
"""
Args:
warmup_steps: 预热步数,通常占总步数的1-5%
total_steps: 总训练步数
max_lr: 最大学习率(峰值)
min_lr: 最小学习率(终值),通常为max_lr的10%
"""
if step < warmup_steps:
# 线性预热:避免初始阶段不稳定
return max_lr * step / warmup_steps
# 余弦退火
progress = (step - warmup_steps) / (total_steps - warmup_steps)
lr = min_lr + 0.5 * (max_lr - min_lr) * (1 + math.cos(math.pi * progress))
return lr
# Chinchilla论文的关键配置:
# - max_lr: 3e-4 (对于256 batch size)
# - warmup: 前约1000步
# - min_lr: max_lr / 10 = 3e-5
# - 最终模型在cosine衰减到接近0时收敛
7. 超参数之间的耦合关系
超参数不是独立的。它们之间存在复杂的耦合关系,需要联合调整。
关键耦合关系:
-
学习率 × Batch Size :线性缩放规则 lr∝B 在 B<B∗ 时近似成立。超过临界Batch Size后,需要更保守的缩放 lr∝B
-
学习率 × 模型大小 :模型参数量越大,最优学习率越小。经验规律:7B模型用 lr=3×10−4,70B模型用 lr=1.5×10−4
-
Weight Decay × 模型大小 :大模型通常使用更大的Weight Decay。LLaMA使用 λ=0.1,而小模型可能用 0.01
-
Warmup × Batch Size:更大的Batch Size需要更多的warmup步数来稳定初始梯度估计
python
# 来源:Chinchilla (Hoffmann et al., 2022) Table 1
# 不同模型大小的最优超参数配置(实证数据)
optimal_configs = {
# 模型参数量: (batch_size, learning_rate, weight_decay)
"70M": (2048, 6.0e-4, 0.1),
"160M": (2048, 4.0e-4, 0.1),
"410M": (2048, 3.0e-4, 0.1),
"1B": (2048, 2.5e-4, 0.1),
"7B": (1024, 3.0e-4, 0.1),
"13B": (1024, 2.5e-4, 0.1),
"65B": (2048, 1.5e-4, 0.1),
"530B": (4096, 1.0e-4, 0.1),
}
# 关键发现:随着模型增大,最优学习率下降
# 但Weight Decay保持不变(0.1),说明正则化需求与模型大小弱相关
8. 实战调参框架
基于上述分析,给出LLM训练的调参框架。
调参优先级:
- 学习率 :最敏感,优先确定。从小( 10−5)开始逐步增大,找到Loss开始发散前的临界值,取其1/3-1/2
- Warmup步数:其次确定。确保Loss在warmup阶段平稳上升后开始下降
- Weight Decay:相对鲁棒。0.1是良好的默认值,对最终结果影响不如LR敏感
- Batch Size:受硬件约束最大。在GPU显存允许范围内尽可能大,配合梯度累积
- Cosine Decay的min_lr:设为max_lr的10%通常是安全的
python
# 完整的LLM训练超参数配置示例(以7B模型为例)
training_config = {
# 模型配置
"model_size": "7B",
"hidden_size": 4096,
"num_layers": 32,
# 核心超参数
"learning_rate": 3e-4, # 最敏感,需优先调优
"min_lr": 3e-5, # max_lr的10%
"warmup_steps": 1000, # 总步数的~2%
"weight_decay": 0.1, # LLaMA标准值
"beta1": 0.9, # Adam动量衰减
"beta2": 0.95, # Adam二阶矩衰减(LLaMA用0.95而非0.999)
"eps": 1e-8, # 数值稳定性
# Batch Size配置
"micro_batch_size": 2, # 单GPU的batch size
"gradient_accumulation": 8, # 梯度累积步数
"global_batch_size": 1024, # micro_bs * accumulation * dp_size
# 训练长度
"max_steps": 500000,
"context_length": 4096,
# 调度策略
"lr_scheduler": "cosine_decay",
"clip_grad": 1.0, # 梯度裁剪阈值
}
总结
超参数调优的本质是控制优化器在Loss曲面上的运动轨迹。学习率控制步长,Batch Size控制梯度估计精度,Warmup保证初始稳定性,Weight Decay防止过拟合。理解每个超参数的数学本质和耦合关系,才能从经验试错走向系统化调参。