Hotdry.

Article

大语言模型NaN传播机制与训练稳定性工程

解析Transformer架构下NaN的特殊来源与传播路径,给出梯度裁剪、混合精度训练、注意力稳定化的可落地参数阈值。

2026-04-27ai-systems

在大语言模型训练与推理过程中,NaN 值的处理远非标准 IEEE754 浮点数规则所能涵盖。传统数值计算中,NaN 通常由未定义操作(如 0 除以 0、无穷减无穷)直接产生;而在 LLM 的数十亿参数前向与反向传播中,NaN 的来源更加隐蔽 —— 权重初始化不当、梯度爆炸、混合精度下的溢出、注意力 logits 的数值灾难,都能触发看似正常的矩阵乘法输出 NaN,并沿着计算图迅速蔓延至整个模型。这种架构层面的独特传播机制,要求工程师从算法设计到工程实现都采取针对性的防护策略。

Transformer 架构下的 NaN 特殊来源

大语言模型的核心 Transformer 结构天然存在若干数值脆弱点。注意力机制中的 Softmax 是首要风险区:当 Query 与 Key 的点积结果过大时,指数函数会触发溢出,返回无穷大进而产生 NaN。标准 Softmax 的数值稳定性依赖减去最大值的技术(log-sum-exp 技巧),但当输入包含极端值或掩码处理不当时,仍可能产生 - Inf 与 NaN 的组合,使后续加权求和完全失效。实践中发现,许多掩码实现直接使用 -∞填充无效位置,若掩码逻辑在某些边界条件下失效,-∞会进入 Softmax 计算,导致输出全为 NaN 或全为 0 的异常状态。

激活函数与残差连接是另一类高危路径。GELU 等非线性激活在某些参数区域会产生接近无穷的输出,叠加残差连接的恒等映射后,数值范围进一步放大。当模型层数较深时,这些微小异常会逐层累积,最终在某一层突破浮点表示边界。LayerNorm 虽然能部分抑制激活膨胀,但其自身计算涉及方差与均值,当输入包含极小方差或异常值时,除法操作同样可能产生 NaN。值得注意的是,低精度训练(如 FP16 或 BF16)会显著放大上述风险 ——FP16 的动态范围仅为约 10⁻⁴至 65504,BF16 虽动态范围更宽但精度不足,小梯度在反向传播中容易被截断为 0,导致训练停滞或数值震荡。

传播机制与工程影响

与标准浮点数 NaN 的 “感染” 特性一致,LLM 中的 NaN 同样会沿计算图向下传播,但传播路径呈现出架构相关性。一旦注意力输出产生 NaN,该值会直接影响后续所有全连接层的输入,由于自回归生成的特性,错误会在每个解码步骤中累积放大,最终导致整个输出序列不可用。梯度反向传播时,NaN 会沿着同样的路径传回所有参数,使 optimizer 状态被污染。在分布式训练场景下,单个 GPU 的 NaN 会通过 All-Reduce 操作扩散至整个集群,使训练在几次迭代内完全崩溃。

传统的 IEEE754 规则在这里的工程意义有限。标准规范告诉我们 “任何与 NaN 的运算结果仍为 NaN”,这在 LLM 语境下意味着整个前向计算图需要从某个中间节点开始整体失效。但工程实践更关心的是:如何让这个失效点尽可能靠近 NaN 的起始位置,以及如何在失效后快速恢复。答案是构建数值监控层,在关键节点插入 NaN/Inf 检测,一旦发现异常立即触发预设的恢复流程,而非等待 NaN 蔓延至整个模型。

训练阶段的可落地参数

针对上述风险,工程实践中已形成一套可量化的防护参数体系。梯度裁剪是最基础的手段,推荐将范数裁剪阈值设定为 1.0(对于 GPT 类大规模模型可放宽至 0.5 至 1.0 之间),该阈值对应梯度向量的二范数超过设定值时按比例缩放。过于激进的裁剪本身也会引发训练不稳定,因此需配合学习率调度 —— 建议启用 1 至 2 个 epoch 的学习率预热(warmup),使模型在参数空间的安全区域内逐步建立稳定的梯度流。

混合精度训练必须配合动态损失缩放(Dynamic Loss Scaling)使用。启动时损失缩放因子建议设为 2⁸=256,当检测到前向传播出现 Inf 或 NaN 时,缩放因子减半重试;若连续多个迭代未出现异常,则逐步增大缩放因子(通常翻倍)以恢复精度。NVIDIA 的 Apex 库或 PyTorch 的 Native AMP 均支持这一机制,关键参数包括loss_scale='dynamic'、初始缩放值、以及 overflow 检测后的回退策略。对于 BF16 训练,损失缩放非必需,但需确保所有 tensor 的精度标志一致,防止混合精度下的隐式类型转换产生异常。

权重初始化方面,Xavier/Glorot 初始化适用于对称激活(如 Sigmoid、Tanh),而 He 初始化更适合 ReLU 系列激活函数。对于使用 GELU 的现代 LLM,He 初始化仍是工程首选。参数初始化的方差应与输入维度匹配,具体为sqrt(2/fan_in)量级,这能保证前向传播时激活方差在各层之间基本稳定,避免初期训练阶段的大幅数值波动。

推理阶段的稳定性保障

推理阶段的 NaN 处理逻辑与训练阶段有本质区别。训练阶段可以通过损失缩放与梯度裁剪容忍一定程度的数值波动,而推理阶段要求每个 token 的生成过程绝对稳定。因此需要在注意力计算的关键路径上增加额外的数值保护:Softmax 前对 logits 进行裁剪(常见做法是限制在 [-50, 50] 区间),在 LayerNorm 后添加小量 epsilon 防止除零,以及在模型输出层引入最小值钳制避免极端概率分布。

实际部署中,建议在推理服务入口处增加数值健康检查模块,对首 token 生成时的激活值分布进行统计监测。当检测到熵值骤降或概率分布异常时,触发降级策略 —— 可能包括切换至确定性解码模式、重置 KV 缓存、或回退到上一版本的 checkpoint。断线续传的工程实践在此处同样适用:使用带状态流式输出时,建议在每个 chunk 边界保存已验证的隐状态,一旦检测到数值异常即可从最近的稳定锚点恢复,而无需重新生成整个序列。

理解 LLM 中 NaN 的特殊传播机制,是构建可靠训练流程与稳健推理服务的基石。区别于通用数值计算的基础规则,Transformer 架构下的 NaN 防控需要结合模型结构特性,在算法层面引入注意力稳定化与归一化策略,在工程层面配置具体的裁剪阈值、损失缩放参数与监控告警阈值,方能实现从 “偶发崩溃” 到 “可预期收敛” 的关键跨越。

资料来源:Hugging Face LLM Training Handbook 关于数值稳定性的实践指南;Emberverse 关于 Transformer 训练不稳定性的技术分析。

ai-systems