第 5 章 训练与优化
第5章 训练与优化
5.1 权重初始化
权重初始化决定训练的起点。好的初始化让信号与梯度在深度方向上保持健康尺度,坏的初始化让网络从第一步就无法正 常学习。本节从方差传播的数学原理出发,给出现代大模型使用的缩放初始化方案。
5.1.1 方差传播与经典初始化
深层网络由多层线性变换与非线性激活堆叠而成。若每层输出的方差随层数累积或衰减,前向信号会迅速放大或消失,反 向传播的梯度也随之失衡。初始化的目标不是让每一层最好,而是让整个网络的信号与梯度处于健康尺度,从而在训练早 期就能正常更新。 考虑单层线性变换 y = W x,输入分量 x 独立同分布,权重 w 均值为零。输出方差的表达式为: i ij Var(yj ) = nin ⋅ Var(wij ) ⋅ Var(xi ) 其中 n 为该层输入维度。要让方差经过任意多层后保持稳定,权重方差应取 Var(w) = 1/n 。这就是 Xavier 初始化 (Glorot 与 Bengio,2010)的动机:它以均匀分布初始化权重,使前向信号与反向梯度在传播中方差守恒: in in 6 6 W ∼ U (− , ) nin + nout nin + nout 分母取输入与输出维度之和,是因为反向传播中梯度沿输出侧回传,梯度方差同样需要约束:若只按 n 缩放,深层梯度 会在反传中继续累积方差。Xavier 假设激活函数近似线性(如 tanh);引入 ReLU 后约一半神经元输出被置零,有效方差 in 减半,需要放大初始化尺度,即 Kaiming 初始化(He 等人,2015): 6 6 W ∼ U (− , ) nin nin Kaiming 初始化的分母只含 n ,权重方差 2/n 恰好补偿 ReLU 带来的方差折半,使前向信号保持方差守恒。两者都是 “以方差匹配换取深度可训练”的设计:深层网络的本质困难不是权重大小,而是方差在深度方向上的不匹配。 in in
5.1.2 Transformer 中的初始化特殊性
Transformer 以 LayerNorm 替代 Batch Normalization。LayerNorm 在每层前向将激活方差归约为固定值,阻断了方差 在层间的简单累积,因此 Transformer 的线性层初始化并不严格要求 1/n 的精确匹配,而是普遍采用小标准差的高斯分 布。 in 这并不意味着初始化无关紧要。残差流中的方差仍会随层数叠加,需要显式的缩放控制。此外,注意力投影与 FFN 投影 的初始化分别决定自注意力的起点与残差流的注入幅度:QK 的尺度过大时 softmax 过早饱和成接近独热的分布,首轮 T 训练梯度极小;FFN 注入幅度过大时首层输出直接溢出。两类投影的初始化需求因角色而异。
5.1.3 残差缩放初始化
现代大模型以 GPT-2(Radford 等人,2019)确立的残差缩放初始化(Residual Scaled Init)为起点。GPT-2 的权重默 认从均值为 0、标准差 0.02 的正态分布初始化,其中每个残差块末端的输出投影(注意力层的 out_proj 与 FFN 层的 down_proj)再额外乘以 1/ N ,N 为层数。这一缩放抵消残差流跨 N 个块累加的方差,使深层输出保持在健康尺度:
import math
import torch
def scaled_init(model, std=0.02, depth=48):
# GPT-2 style: residual branch projections get 1/sqrt(N) downscale
for name, p in model.named_parameters():
if "weight" not in name:continue
if "out_proj" in name or "down_proj" in name:
torch.nn.init.normal_(p, mean=0.0, std=std / math.sqrt(depth))
else:
torch.nn.init.normal_(p, mean=0.0, std=std)设每一层残差分支(注意力或 FFN)的输出方差为 σ ,则第 N 层的残差流方差约为 N σ 。若保持 σ 不变,深层残差流的 2 2 方差随 N 线性增长,激活值超出激活函数与后续归一化的合理范围。残差分支的初始化标准差降为 σ/ N 后,单层增量 方差变为 σ /N ,N 层累积仍为 σ ,方差与深度解耦。Hugging Face 的实现将缩放写作 0.02/ 2N ,多出的 2 因子是工 2 2 程上的保守余量。 为抑制罕见的大幅权重,Megatron-LM 采用截断正态分布(Truncated Normal)初始化:从正态分布采样,拒绝超出 2σ 的样本。这类离群权重在 FP16/BF16 混合精度下容易触发数值溢出,截断后训练起点更温和: def truncated_normal_init(tensor, mean=0.0, std=0.02, cutoff=2.0): # Megatron-LM style: resample values beyond cutoff*std with torch.no_grad():
while True:
cand = torch.randn_like(tensor) * std + mean
mask = (cand > mean + cutoff * std) | (cand < mean - cutoff * std)
if not mask.any():
tensor.copy_(cand)break tensor[mask] = cand[mask] W ~ N(0, 0.02) Unscaled: variance grows Residual branch: N(0, 0.02/ with depth sqrt(N)) Deep blocks diverge Scaled: variance bounded Stable deep training 图5-1 残差缩放初始化的方差控制 如图5-1 所示,同样以 N (0, 0.02) 为起点,未缩放的残差分支随深度累积方差,深层块趋于发散;而按 1/ N 缩放后,方 差与深度解耦,训练全程保持有界。
5.1.4 DeepNorm 的理论推广
DeepNet(Wang 等人,2022)把残差缩放推广为可计算参数的显式控制:残差路径写作 x = x + α ⋅ Sublayer(x),缩放 ′ 因子 α 按层数配置,子层权重以匹配的尺度初始化。由此 DeepNet 在不依赖 Warmup 的情况下稳定训练了 1000 层 Transformer。 残差缩放初始化可视为这一思路的工程化默认值:GPT-2 用固定 1/ N 的经验缩放,DeepNorm 则给出随深度计算的解 析尺度,并将 Post-LN 也纳入稳定范围。
5.1.5 Embedding 初始化与当代演进
token embedding 与输出投影(词嵌入反投影)同样以 N (0, 0.02) 初始化。两者常做权重共享(Weight Tying),共享后 实际参数只有一份,初始化保持一致即可。embedding 的方差直接影响首层注意力与残差流的起点,故与整体初始化尺 度对齐。一个容易忽略的细节是 embedding 不做残差分支的 1/ N 缩放——它位于残差流的入口而非分支末端,过小反 而削弱首层信号。部分现代实现会在 embedding 上叠加与模型维度相关的缩放因子,逻辑与 Noam 调度中的 d 一 −0.5 致,本质都是让各尺度模型拥有可比的学习起点。 model DeepSeek-V3 等新一代模型在 RMSNorm 下采用更小的初始化标准差(约 0.006–0.01),部分框架将 weight decay 从
0.1 下探到 0.01–0.05 以适配更长上下文训练。这一演进的方向是从经验试探转向缩放控制:先分析残差流方差再决定初
始化尺度。
5.2 优化器与学习率调度
优化器决定参数更新的方向与幅度,学习率调度控制每步的绝对步长,两者共同约束训练轨迹。
5.2.1 Adam 与 Transformer 参数配置
Adam(Adaptive Moment Estimation)由 Kingma 和 Ba 于 2015 年提出,融合了动量法(Momentum)与 RMSprop 的优点。其更新规则同时维护梯度的一阶矩估计 m 和二阶矩估计 v : t t mt = β1 mt−1 + (1 − β1 )gt vt = β2 vt−1 + (1 − β2 )gt2 其中 g = ∇ L(θ ) 为第 t 步的梯度。为纠正早期步骤的零初始化偏差,Adam 引入偏差校正: t θ t−1 mt vt mt = ^ , v^t = 1 − β1t 1 − β2t 参数更新公式为: ^ mt θt = θt−1 − α ⋅ v^t + ϵ 一阶矩提供惯性方向,二阶矩提供逐参数自适应学习率。两者结合使 Adam 对稀疏梯度和非平稳目标函数均有良好表 现。 《Attention Is All You Need》原始论文给出了如表5-1 所示的参数配置: 参数 取值 说明 β1 0.9 一阶矩衰减率 β2
0.98 二阶矩衰减率(与常规 0.999 不同)
ϵ 10−9 数值稳定性常数 α 见调度 学习率由 Noam 调度公式动态控制 表5-1 Adam 优化器的关键超参数 β = 0.98 是其中的关键设定。常规 Adam 默认 β = 0.999,对应约 1000 步的指数滑动窗口。Transformer 的基础模型 2 2 batch size 较小(约 25,000 个源/目标 token),训练步数多,降低 β 可使二阶矩估计更灵敏地追踪近期梯度变化。
# Adam configuration in Transformer
optimizer = torch.optim.Adam(
model.parameters(),
betas=(0.9, 0.98),
eps=1e-9,
lr=0.0 # actual lr set via scheduler)
5.2.2 权重衰减与 AdamW
L2 正则化在损失中加入 ∥θ∥ ,等价于在梯度上添加 λθ。在 SGD 中,这与权重衰减(Weight Decay)等价——每步先把 λ 2 参数乘以 (1 − λ ⋅ lr) 再更新。两者在 Adam 中却分道扬镳。 问题出在 Adam 的分母 v^ 对正则项同样生效。L2 的梯度项 λθ 被自适应缩放后,梯度绝对值大的参数(v^ 大)衰减被 削弱,正则效果减弱;梯度小的参数则被过度惩罚。Loshchilov 与 Hutter(2019)证明 Adam 中 L2 与权重衰减不再等 t t 价,并据此提出解耦权重衰减(Decoupled Weight Decay)的 AdamW:把衰减从自适应缩放中移出,作为独立步骤执 行: ^ mt θt = θt−1 ⋅ (1 − λ ⋅ α) − α ⋅ v^t + ϵ 如表5-2 所示,Adam 的 L2 正则梯度被 v^ 缩放后,正则强度随参数梯度历史变化,既无法均匀衰减,也无法预测,是 早期 Transformer 训练中权重衰减效果不稳的根源。AdamW 的更新式中权重衰减项与自适应项线性相加,等价性由构造 t 保证。 方案 衰减机制 与权重衰减等价 现代 LLM 采用 SGD + L2 梯度加 λθ 等价 否 Adam + L2 正则梯度被 v^ 缩放 t 不等价 否 AdamW 独立解耦步骤 显式设计 是 表5-2 三种权重衰减方案的对比
import torch
# AdamW with decoupled weight decay (GPT-3 / LLaMA defaults)
optimizer = torch.optim.AdamW(
model.parameters(),
lr=3e-4,
betas=(0.9, 0.95),
eps=1e-8,
weight_decay=0.1, # decoupled: not scaled by sqrt(v_t)) 现代大模型的 weight decay 典型值为 0.1(GPT-3 与 LLaMA 均采用),部分训练选择 0.01 或更小以适配更长上下文。0.1 这一偏大的取值与二范数约束的几何意义有关:在大模型的高维参数空间中,偏大的衰减能有效抑制参数范数持续膨胀, 防止训练后期权重过大导致注意力 logit 失真。注意 weight decay 通常不施加于 LayerNorm 的 scale 参数与 bias,两者 数量少、对正则化贡献小,实践中按参数名分组屏蔽(no_decay 分组),否则归一化增益被不必要地拉向零,等效改变 激活尺度。
5.2.3 Warmup 的必要性
Adam 的更新量 Δ = ^m / v^ 在训练初期存在固有的不稳定性,如图5-2 所示。此时模型权重刚完成随机初始化,梯度 g 的方向高度随机,二阶矩 v^ 尚未积累足够的历史信息。若学习率过大,Δ 可能在方向极不稳定的情况下大幅跳变,使参 t t t t 数偏离良好初始化区域。 t t Warmup 在前 N 步将学习率从接近 0 线性增至目标值,给 Adam 的二阶矩估计足够的预热时间。 warmup Unstable v_t Estimate Large Lr: Divergence Random Init High-Variance Gradients Warmup: Small Lr Stable v_t Accumulation Full Lr: Converge 图5-2 Warmup 对 Adam 二阶矩估计的稳定化作用 Liu 等人 2020 年的研究(RAdam)从理论上论证:Adam 在训练初期的自适应学习率方差极大,可能导致模型收敛至次 优局部极小值。他们的修正方案(Rectified Adam)在头几步直接禁用自适应学习率,效果等价于隐式 Warmup。
5.2.4 Noam 调度公式
Vaswani 等人的方案在原始 Adam 基础上叠加了线性 Warmup 与逆平方根衰减,完整形式为: αt = αpeak ⋅ min ( ) t Nwarmup , Nwarmup t 其中 N 通常为 4000。前 N 步学习率从 0 线性增至峰值,之后按步数的逆平方根衰减。实践中 N = 4000 warmup warmup warmup 是多次实验后选择的经验值:过短则二阶矩预热不充分,过长则浪费训练预算。更深的模型、更大的 batch 通常需要相应 调大 Warmup 步数。
5.2.5 衰减策略的选择
Warmup 阶段与衰减阶段有本质不同的物理含义,如图5-3 所示。Warmup 阶段的目标是稳定性:以渐进增大的学习率让 优化器的自适应状态(Adam 的 m 、v )平稳建立,避免大梯度方向上的过早跳跃。衰减阶段的目标是精细化收敛:递 减的学习率使模型逐渐缩小搜索半径,最终落入损失函数的深窄谷底。逆平方根衰减的收敛速度为 O(1/ t),在凸优化理 t t 论中是最优的在线学习速率。 step=1 Warmup Phase: LR ▲ step=N_warmup: Peak LR Decay Phase: LR ▼ step->∞: LR -> 0 图5-3 Noam 调度两阶段示意图 逆平方根衰减并非唯一选择。实践中常用的替代方案包括线性衰减与余弦退火。 线性衰减的表达式为 α = α ⋅ (1 − t/T ),优势在于实现简单、可预见终止值。 t peak total 余弦退火(Cosine Annealing)由 Loshchilov 和 Hutter 于 2017 年提出,表达式为: αt = αmin + (αpeak − αmin ) (1 + cos ( π )) t Ttotal 余弦退火在训练中期衰减较慢(平台期更长),有利于模型在较好的参数区域充分探索;末尾阶段衰减较快,促使快速收 敛。GPT 系列模型大多采用余弦退火。现代大语言模型预训练为单周期余弦退火,训练完成后即收敛,不采用热重启 (SGDR 式多周期)——热重启主要用于小规模模型的超参探索。
5.2.6 大 batch 训练的学习率缩放
当 batch size 增大时,每个 batch 的梯度估计方差减小,单步可使用的学习率理应更高。由此产生了学习率缩放的两条 经验法则: •线性缩放法则(Linear Scaling Rule)由 Goyal 等人于 2017 年提出:当 batch size 增大 k 倍时,学习率也相应增大 k 倍,即 α = k ⋅ α 。这一规则在 batch size 不超过 8K 时表现稳健。 k 1 •平方根缩放法则(Square Root Scaling)由 Krizhevsky 于 2014 年提出:α = k ⋅ α ,更保守。在大 batch(32K+) 场景下,线性缩放容易导致发散,平方根缩放更为安全。 k OpenAI 在 GPT-3 的训练中采用了随 batch 线性增长的 Warmup 策略:batch size 从小逐步增大以稳定梯度方向,再配 合线性缩放的余弦退火。这套组合已是大规模 Transformer 训练的事实标准。
5.2.7 梯度裁剪
梯度裁剪(Gradient Clipping)限制单步更新的梯度范数上界。最常用的是全局范数裁剪(Global Norm Clipping):先 计算所有参数梯度的整体 L2 范数,若超过阈值 max_norm,则将全部梯度等比例缩放: max_norm g ← g ⋅ min (1, ) ∥g∥2
import torch
# Global gradient norm clipping
total_norm = torch.nn.utils.clip_grad_norm_(
model.parameters(), max_norm=1.0) 全局裁剪保留梯度间的相对方向,只压缩整体幅度,是 Transformer 训练的标准做法。其数学性质是投影到半径为 max_norm 的球面:梯度方向不变,只把范数压回阈值以内。由于 Adam 的更新量近似 ^ m / v^ (量级常接近 1),梯度范 数裁剪间接约束了单步参数位移的物理尺度,从而防止权重在一步内大幅跳变。 t t 逐参数裁剪(Per-Parameter Clipping)独立处理每个参数张量,实现简单但会扭曲层间梯度比例,大模型训练中较少采 用。全局范数的计算在分布式训练中需要一次额外的 AllReduce(对所有分片的梯度平方求和开根),这是梯度裁剪在多 卡场景下唯一的额外通信开销。典型 max_norm 取 1.0(GPT-3 即采用此值),个别框架使用 0.5–5.0 之间的取值;阈值过 小会压制正常梯度,过大则损失回升,1.0 是多数场景的平衡点。 梯度裁剪对 loss spike(训练中损失突然飙升,常伴随梯度爆炸)有缓解作用:裁剪后单步更新量受限,模型不会因个别 离群梯度大幅偏离当前参数区域。梯度范数的走势本身也是重要的健康指标,训练日志中 ∥g∥ 持续逼近或频繁触及阈 2 值,往往是学习率过高或数据异常的早期信号。但裁剪只是刹车而非根治,spike 的源头仍需从数据、学习率、数值精度 等方面排查。
5.3 标签平滑
标签平滑(Label Smoothing)是 Szegedy 等人于 2016 年在 Inception-v3 中引入的正则化技术,Vaswani 等人在 Transformer 中沿用了它。
5.3.1 数学定义
标准交叉熵损失中,目标分布为独热向量:正确类别概率为 1,其余为 0。标签平滑将概率质量从正确类别重新分配给所 有类别。设平滑参数为 ϵ ,词汇表大小为 V ,则平滑后的目标分布为: ls ϵls q(k∣x) = (1 − ϵls ) ⋅ 1[k=y] + V 其中 1 在 k 为真实标签时取 1,否则为 0。模型不必对正确类别给出 100% 的概率信心,而是预留 ϵ 的概率质量分给 [k=y] ls 所有类别。 损失函数随之变为平滑标签与模型预测分布 p(k∣x) 的交叉熵: V Lsmooth = − ∑ q(k∣x) log p(k∣x) k=1 在 Transformer 原论文中,ϵ = 0.1,这是在 WMT 英德/英法翻译任务上经实验选定的值。 ls
5.3.2 对模型困惑度的影响
def label_smoothing_loss(logits, targets, eps=0.1):
n_classes = logits.size(-1)
smooth_targets = torch.full_like(logits, eps / n_classes)
smooth_targets.scatter_(-1, targets.unsqueeze(-1), 1.0 - eps + eps / n_classes)
log_probs = F.log_softmax(logits, dim=-1)
return -(smooth_targets * log_probs).sum(dim=-1).mean()标签平滑对困惑度的影响是反直觉的,如图5-4 所示:它通常使训练集和目标域的困惑度上升。原因在于,困惑度度量模 型分配给正确 token 的概率:PP L = exp(− ∑ log p(y ∣y ))。标签平滑要求模型刻意降低对正确 token 的信心,困惑 <i 度自然增大。 N i i 这一现象揭示了困惑度与泛化能力之间的张力:较低的困惑度不一定意味着更好的翻译质量。标签平滑迫使模型在 softmax 输出层保持一定的不确信,这种训练约束具有正则化效果。 One-Hot Target Label Smoothed Target p(y)=1.0: High Confidence p(y)=0.9: Moderate Confid ence Lower Perplexity Overconfident Predictions Higher Perplexity Better Generalization Poor Calibration Higher BLEU 图5-4 标签平滑对训练指标的双向影响
5.3.3 对 BLEU 分数的提升
Vaswani 等人的实验表明,在 WMT 2014 英德翻译任务上,加入 ϵ = 0.1 的标签平滑使 BLEU 分数提升约 0.4–0.6 点。这 ls 一提升有两个来源: •标签平滑降低了模型在 softmax 输出上的过度自信。过度自信的模型在解码时容易陷入重复生成(degeneration),因 为 Beam Search 中高置信 token 会自我强化。平滑后的概率分布更均匀,beam 中的候选多样化程度更高。 •平滑迫使 logit 层学习更具判别性的内部表示。Müller 等人 2019 年的实证分析表明,标签平滑使倒数第二层 (softmax 前的线性投影)的表示形成更清晰的类别聚类,类内紧凑、类间分离。
5.3.4 与知识蒸馏的等价关系
标签平滑与知识蒸馏(Knowledge Distillation, KD)在数学形式上有紧密联系。知识蒸馏的损失函数为: LKD = (1 − λ)LCE (p, y) + λ ⋅ KL(pT ∥q T ) 其中 p 是温度 T 下的教师模型 softmax 输出,q 是学生模型对应输出。 T T 若将教师模型替换为均匀分布,即 p (k) = 1/V ,则 KL(p ∥q ) 退化为 − ∑ log q (k) + const,恰好等同于标签平滑的 T T T 1 T 附加项。换言之,标签平滑等价于“以均匀分布为教师的特殊知识蒸馏”。这一洞察为后续的 Self-Distillation、Noisy V Student 等方法提供了理论基础。
5.4 梯度累积与混合精度
大 batch 训练受限于 GPU 显存。梯度累积在模拟大 batch 的同时节省显存,混合精度训练通过降低数值精度换取吞吐量 与速度。两者结合构成现代 Transformer 训练的效率基石。
5.4.1 梯度累积
梯度累积(Gradient Accumulation)在连续 K 个 micro-batch 上依次前向传播、计算梯度,但不立即更新参数,如图 5-5 所示。累积 K 次梯度后再执行一次参数更新,等效于用 K × micro_batch_size 的有效 batch 训练。
# Gradient accumulation with micro-batches
optimizer.zero_grad()
for i, micro_batch in enumerate(dataloader):
loss = model(micro_batch).sum() / accumulation_steps
loss.backward() # gradients accumulate in .grad
if (i + 1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()采用梯度累积的主要动机是模拟大 batch 训练效果。Transformer 以 LayerNorm 替代 Batch Normalization,其计算独 立于 batch 维度,因此累积梯度不会破坏统计量估计。实现时 loss.backward() 阶段每个 micro-batch 的损失应除以 累积步数,保证最终梯度均值不偏移。
Micro-Batch 1 Forward Backward: Σ grad
Micro-Batch 2 Forward Backward: Σ grad
Micro-Batch K Forward Backward: Σ grad Parameter Update图5-5 梯度累积流程
5.4.2 FP16 与 BF16 混合精度原理
混合精度训练由 Micikevicius 等人于 2018 年提出,在前向传播中使用半精度(FP16/BF16)以节省显存和计算时间,同 时在参数更新中使用单精度(FP32)以维护数值稳定性。 FP16(IEEE 754 半精度,16 位)具有 3.3 个十进制有效数字,最大表示范围约 6.5 × 10 ,如表5-3 所示。激活值和梯度 4 存储为 FP16,但在反向传播时,小梯度(如 10 量级)可能下溢为 0,需要损失缩放来弥补。 −8 BF16(Google Brain 浮点,16 位)与 FP32 共享相同的 8 位指数域(动态范围一致),但尾数从 23 位缩减至 7 位。BF16 不会出现梯度的动态范围溢出问题,但精度低于 FP16。NVIDIA A100 及之后的 GPU 对 BF16 有原生硬件支持。 格式 符号位 指数位 尾数位 动态范围 精度 FP32 1 8 23 ≈ 1038 高 FP16 1 5 10 ≈ 6.5 × 104 中 格式 符号位 指数位 尾数位 动态范围 精度 BF16 1 8 7 ≈ 1038 低 表5-3 浮点精度格式对比
5.4.3 损失缩放
FP16 的动态范围有限,梯度小于 2 ≈ 6 × 10 时直接下溢为零。损失缩放(Loss Scaling)的解决方法是:在前向传 −24 −8 播后将损失乘以缩放因子 S(如 2 = 32768),反向传播中的梯度随之放大 S 倍,使小梯度进入 FP16 的可表示范围。在 参数更新前,再将梯度除以 S 恢复原尺度。
# Loss scaling with FP16
loss = criterion(output, target)
scaled_loss = loss * scale_factor # e.g., 32768
scaled_loss.backward()
# Unscale before optimizer step
for param in model.parameters():
param.grad.data /= scale_factor
optimizer.step()动态损失缩放进一步自动化这一过程:若连续多步未出现梯度溢出(Inf/NaN),则增大缩放因子;若检测到溢出,则跳 过本次更新并缩小缩放因子。
5.4.4 混合精度对训练吞吐量的影响
NVIDIA 的实证数据显示,在 V100 GPU 上,FP16 混合精度使 Transformer 的训练吞吐量提升约 2–3 倍。提升来自三个 层面: •Tensor Core 加速:V100/A100 的 Tensor Core 在 FP16 模式下提供 8 倍于 FP32 的理论吞吐 •显存占用减半:激活值和梯度从 32 位压缩至 16 位,每层可容纳更大的 micro-batch 或更深的模型 •带宽节省:GPU 间的 NCCL 通信量减半,多卡数据并行时通信开销显著降低 BF16 的吞吐提升幅度略低于 FP16(因尾数精度损失需要稍保守的训练超参),但它无需损失缩放,实现更简单。目前主 流框架(如 PyTorch AMP)均已内置对两种半精度格式的支持。 自 NVIDIA H100 起 GPU 原生支持 FP8,2024 年后 FP8 混合精度成为训练主流。其指数范围与 BF16 相近,配合可学习 的 per-tensor/per-token 缩放(如延迟缩放)可在不损失精度的前提下将训练吞吐再提升约 20–30%。2025 至 2026 年,基于 OCP 微缩放规范(microscaling formats)的 MXFP4 将权重与激活压缩到 4 位进行量化训练与推理,成为大规 模预训练降低显存与带宽成本的探索方向。
5.5 分布式训练
模型参数量超过单卡显存容量时,分布式训练通过将计算和存储拆分到多台设备,使百亿甚至千亿参数 Transformer 的 训练成为可能。
5.5.1 数据并行
数据并行(Data Parallelism, DP)是最直观的并行方式,如图5-6 所示:每个 GPU 持有模型参数的完整副本,但只处理 训练数据的一个不重叠分片(mini-batch)。每步训练各 GPU 独立完成前向与反向传播,随后通过 AllReduce 通信同步 梯度,最后各自执行相同的参数更新。
# Simplified data-parallel training
for batch_chunk in split_batch(data, num_gpus):
# Each GPU runs independently
loss = model(batch_chunk).sum()
loss.backward()
# AllReduce: sum gradients across
all_reduce_gradients(model.parameters())
# Identical optimizer step on each
optimizer.step()数据并行的通信开销集中在 AllReduce 阶段。对于 P 个 GPU、总参数量 Θ 的模型,每步通信量为 2Θ ⋅ (P − 1)/P 。当模 型规模较小时,通信开销可忽略;但当 Θ 超过数十亿参数时(如 GPT-3 的 175B 参数),每张卡无法放下完整副本,纯数 据并行失效。 Training Data Shard 1 to GPU 0 Shard 2 to GPU 1 Shard 3 to GPU 2 Forward+Backward Forward+Backward Forward+Backward AllReduce Gradients Update θ on GPU 0 Update θ on GPU 1 Update θ on GPU 2 图5-6 数据并行训练架构
5.5.2 模型并行
当单卡无法容纳完整模型参数时,必须诉诸模型并行(Model Parallelism):将模型的不同部分分配到不同 GPU 上。 Transformer 天然适合模型并行,各层的参数彼此独立,层间通过激活值的跨 GPU 传输连接。 简单流水模型并行将第 1 到 k 层放在 GPU 0,第 k + 1 到 m 层放在 GPU 1,以此类推。每步训练中,GPU i 完成前向计算 后将激活值发送给 GPU i + 1;反向传播时梯度沿相反方向传递。 这种朴素方案的问题是 GPU 利用率低:任一时刻只有一片 GPU 在计算,其余空闲。
5.5.3 流水线并行与张量并行
流水线并行(Pipeline Parallelism)由 GPipe(Huang et al., 2019)和 PipeDream 等框架推广。其创新是将一个 mini- batch 进一步切分为多个 micro-batch,以流水线方式注入模型各段。GPipe 每 M 个 micro-batch 后同步一次梯度, PyTorch 的 torch.distributed.pipeline 原生实现了这一策略。 流水线并行的 GPU 利用率可通过气泡率(Bubble Ratio)衡量:(P − 1)/M ,其中 P 为流水线段数,M 为 micro-batch 数。增大 M 可降低气泡,但受限于显存。 张量并行(Tensor Parallelism)由 Megatron-LM(Shoeybi et al., 2019)引入,将单层 Transformer 内的矩阵乘法沿特 定维度切分,分配到多个 GPU 上并行计算。以自注意力层的 QKV 投影为例:
- 将 W 按列切分为 [W , W ],分别放在 GPU 0 和 GPU 1 Q Q Q
- 每个 GPU 本地计算部分投影结果
- 通过 AllReduce 或 AllGather 合并输出 张量并行的通信模式更密集(每层内多次 AllReduce),但 GPU 无空闲时段,是显存受限场景的首选。
5.5.4 混合并行实践
主流大模型训练框架采用三维混合并行:数据并行、流水线并行、张量并行三者叠加。 Megatron-LM + DeepSpeed 的组合是典型例子。在节点内(intra-node),使用张量并行将单层计算拆分到 8 张 GPU (NVLink 高速互联,通信延迟极低);在节点间(inter-node),使用流水线并行跨节点串接 Transformer 各段;最外层 叠加数据并行,用多个流水线副本处理不同数据分片。 以混合并行训练 175B 级模型为例:总 GPU 数 = DP × PP × TP,其中 TP = 8(单节点内 8 卡张量并行),PP = 8(8 段 流水线),DP = 64(64 个数据并行副本),合计 4096 张 GPU。GPT-3 原始论文(2020)以张量并行配合数据并行,在大 规模 V100 集群上完成 175B 参数的训练。ZeRO 同年由 DeepSpeed 提出,属于并行框架层面的演进。 DeepSpeed ZeRO(Zero Redundancy Optimizer)通过优化器状态、梯度和参数的分布式存储,将数据并行的显存占 用降至 1/P ,使数百 GB 的模型仅靠数据并行即可训练。ZeRO-3 进一步将模型参数本身也分片存储,训练中按需 AllGather,反向释放。 这一系列技术演进使 Transformer 的模型规模在数年内从 65M 参数扩大至万亿级别,而训练逻辑(前向传播、注意力计 算、交叉熵损失)始终未变。 混合专家(Mixture-of-Experts, MoE)模型将稠密 FFN 替换为多个专家网络,其训练引入了第四种并行维度——专家并行 (Expert Parallelism, EP):按专家将路由后的 token 分发到不同 GPU 计算,再通过 All2All 通信聚合。DeepSeek-V3 (671B 总参数/37B 激活)在 2048 块 GPU 上结合 EP、数据并行、流水线与张量并行完成训练,成本约为同规模稠密模 型的 1/4。2024 年后,序列并行(Sequence Parallelism)将层内激活沿序列维度切分以节省显存,与 DP/PP/TP 组合成 的 4D 并行已成为千卡以上大规模训练的标配。
5.6 训练稳定性组合
前述各节分别讨论了初始化、优化器、学习率调度、混合精度与分布式训练。这些组件在实际训练中并非孤立运作,而是 构成一个协同的稳定系统。本节分析它们的交互机制,给出 loss spike 的排查流程,并总结现代预训练的默认配置。
5.6.1 组件交互机制
训练稳定性由四个关键组件共同保障,如图5-7 所示,它们分别作用于训练过程的不同环节: Scaled Init AdamW + Weight Decay Gradient Clip Warmup + Cosine Healthy Residual Stream Bounded Update Size Spike Guard Controlled Lr Curve Stable Training 图5-7 现代训练稳定性组件协同 •初始化:决定参数起点,保证残差流方差健康,是稳定性的第一道防线 •AdamW:提供自适应学习率与解耦权重衰减,让每步更新量有界且正则有效 •梯度裁剪:拦截偶发梯度爆炸,是防止单步失控的兜底机制 •学习率调度:Warmup 与余弦退火控制全局更新幅度平稳收缩 四个组件之间存在耦合关系。初始化尺度决定了 Warmup 所需的步数:残差缩放越大,二阶矩预热越充分,Warmup 可 以越短。权重衰减的取值影响梯度范数的长期走势,进而影响裁剪阈值的有效性——衰减偏小时梯度范数更易膨胀,裁剪 阈值需要相应降低。混合精度的选择也与初始化相关:FP16 的动态范围有限,初始化标准差过大时更容易在首步触发溢 出。
5.6.2 失效诊断
四者的失效模式各不相同: •初始化出错表现为训练初期 loss 即发散或不下降 •weight decay 缺失表现为 loss 前期正常但后期权重范数持续膨胀 •裁剪阈值过小表现为收敛变慢但指标平滑 •调度不当则表现为 loss 曲线出现周期性的锯齿 训练稳定性问题的排查,本质是先定位哪一环失效,再对局部调整,而非盲目堆叠技巧。 loss spike 的处理遵循固定流程:先判断是否为瞬时可自愈的跳变;若连续多步未恢复,按顺序排查——降低学习率、回 退到最近的稳定 checkpoint 并减小 batch、检查数据 pipeline 与混合精度溢出。Megatron-LM 等框架内置 spike 检测与 自动回滚,将人工干预降到最低。回滚粒度通常取最近的 10–100 步 checkpoint,回滚后以较低学习率重启,避免在受 损权重上继续累积错误梯度。 梯度范数 ∥g∥ 的走势是重要的健康指标。当它持续逼近或频繁触及裁剪阈值时,往往是学习率过高或数据异常的早期信 号。在实践中,训练日志中应持续记录梯度范数、权重范数、学习率三个指标,形成可追溯的诊断链。
5.6.3 默认配置与演进
2026 年大模型预训练的默认配置如表5-4 所示。 组件 默认取值 说明 初始化 ,残差分支 0.02/ N N (0, 0.02) 可选截断正态 优化器 AdamW,β = (0.9, 0.95),eps=1e-8 GPT-3/LLaMA 风格 权重衰减 0.1 不作用于 norm/bias 梯度裁剪 max_norm=1.0 全局范数裁剪 调度 余弦退火 + Warmup 线性或余弦衰减 数值格式 BF16(无需损失缩放) — 表5-4 2026 年预训练默认配置清单 清单中的每个取值都对应一个工程权衡。初始化 σ 取 0.02 与 Noam 调度中的 d 同理,是小尺度与大尺度的折中。 −0.5 weight decay 0.1 是正则强度与拟合能力的平衡。裁剪阈值 1.0 是允许正常梯度通过、拦截离群值的经验分界。这套组合 model 在数百亿至万亿参数的预训练中被反复验证。 DeepSeek-V3 等新一代模型已将初始化标准差下调至约 0.006–0.01,weight decay 相应下探至 0.01–0.05,演进方向是 从经验试探转向缩放控制。初始化尺度的调整需与裁剪阈值等兜底机制协同,对绝大多数工程场景,上述保守默认加兜底 机制的组合仍是稳定性与实现成本的最佳平衡。