大模型训练中的 Loss 是怎么计算的?
大模型训练中的 Loss 是怎么计算的?
一句话核心:Loss(损失函数)是衡量模型预测与真实答案差距的标尺,通过反向传播指导参数更新,大模型训练中的 Loss 计算涉及多阶段设计,且 Pre-training Loss 已成为预测模型能力的关键指标。
核心概念(术语表)
- Loss(损失值):模型预测值与真实标签之间的差异度量,训练过程本质是不断“试错”并根据 Loss 进行“修正”,目标是最小化 Loss
- Cross-Entropy Loss(交叉熵损失):分类任务的“黄金标准”,衡量模型预测的概率分布与真实标签分布之间的“距离”,预测概率越高损失越小
- Loss Spike(损失激增):大模型训练过程中 Loss 突然暴涨的现象,可能发生在预训练的开始、中间或结束阶段,严重时导致模型无法收敛
- z-loss 正则化:通过正则化 softmax 分区函数 Z(所有指数项之和)来控制归一化增长,避免数值不稳定,用于 Chameleon 等模型
- Embedding 层梯度收缩(Gradient Shrink):将浅层(Embedding 层)梯度乘以缩放系数 α 减小更新值,GLM-130B 中 α=0.1 效果最佳
- Norm-Head:对 LM-Head 层进行归一化,动态缩放 LM-Head 层大小,提升训练稳定性,哔哩哔哩 Index-1.9B 采用此方法
- Pre-training Loss:模型预训练阶段的损失值,清华大学与智谱 AI 研究发现它是预测模型能力的最佳指标,优于模型参数量或训练数据量
- Adam 优化器不稳定性:大模型训练使用 Adam 优化器时,浅层参数长时间不更新后突然产生大梯度变化,引发连锁反应导致 Loss 爆炸
- WSD 学习率调度(Warmup-Stable-Decay):三阶段学习率策略,稳定阶段 Loss 偏高,Decay 阶段加入高质量数据可获得最佳效果
- PPO/DPO Loss:强化学习阶段使用的策略损失,PPO 目标是在生成高分回答的同时不偏离原始模型太远
- Loss 概念起源:深度学习领域,Loss 作为“教练”衡量预测与真实答案差距,最小化 Loss 是所有 AI 训练的共同目标
- Loss Spike 研究:论文 arXiv:2304.09871 系统分析了 Loss Spike 原因,认为梯度变化不满足独立性条件是根本原因
- z-loss 正则化:Meta、Chameleon 模型采用,通过在损失函数中添加 10^-5 log2 Z 来控制数值稳定性,Chameleon-34B 仅用 z-loss 即可稳定训练
- Pre-training Loss 新发现:2024 年清华大学与智谱 AI 研究,训练超过 30 个不同规模模型,发现无论模型大小,Pre-training Loss 相同时下游任务性能几乎相同
工作原理 / 核心机制
整体思路
大模型训练中的 Loss 计算本质是“下一个词预测”问题,将语言建模任务转化为多分类问题,使用交叉熵损失衡量预测下一个 token 的准确性,并通过梯度反向传播更新参数优化预测。
输入 / 输出
- 输入:模型对词表中每个 token 的预测 logits(未经归一化的分数),以及真实标签 token
- 处理:Softmax 将 logits 转换为概率分布 → 交叉熵计算预测概率与真实标签的差异 → 输出标量损失值
- 输出:单个标量损失值,用于反向传播计算梯度
核心步骤详解
第一步:Softmax 归一化
- 输入:logits 向量 [z₁, z₂, ..., zₙ],n = 词表大小(通常 30000-50000)
- 处理:计算 softmax 概率 pᵢ = exp(zᵢ) / Σⱼexp(zⱼ)
- 输出:概率分布向量 [p₁, p₂, ..., pₙ]
- 数字:GPT-3 词表约 50257,GLM-130B 词表约 150000
第二步:交叉熵损失计算
- 输入:预测概率分布 p,真实标签分布 q(one-hot 向量,仅真实 token 处为 1)
- 处理:H(q,p) = -Σᵢ qᵢ log(pᵢ) = -log(p_真实)
- 输出:标量损失值 loss
- 数字:当预测概率为 0.9 时 loss ≈ 0.105,为 0.99 时 loss ≈ 0.01
第三步:多阶段 Loss 设计(大模型特有)
- SFT 阶段:使用 GPT-LM-Loss,标准下一词预测损失
- RM 阶段:使用 PairWiseLoss,模型看到两个回答并学习判断哪个更好
- RL 阶段:使用 PPO Loss 或 DPO Loss,在生成高质量回答与保持原有能力间平衡
第四步:梯度反向传播与参数更新
- 输入:损失值 loss
- 处理:计算 ∂loss/∂θ 对每个参数求偏导
- 输出:梯度向量,用于 Adam 优化器更新参数
- 关键问题:浅层(Embedding 层)梯度长时间接近零后突然增大,导致 Loss Spike
关键知识点
- Loss 是模型训练的“指南针”:指导参数优化方向,目标是找到 Loss 山谷的最低点
- 交叉熵损失 = -log(真实 token 预测概率):预测越准确,概率越高,loss 越小
- Loss Spike 可发生在训练任何阶段:OPT 和 BLOOM 论文展示了不同阶段的 Spike 案例
- 浅层梯度“蓄水”机制:Embedding 层参数长时间不更新后,batch 样本分布变化会引发梯度“决堤”
- Adam 的 ε 参数影响稳定性:减小 ε 或设为 0 可改善更新参数非稳态
- z-loss = (log Σ exp(logitsᵢ))²:通过对数域求和的平方控制数值不稳定
- FP32 计算注意力 softmax:不同注意力头数值范围差异大,FP16 下易上溢或下溢
- LM-Head 梯度占据绝大部分:词表稀疏性导致 LM-Head 层稳定性低,Norm-Head 可动态缩放
- Pre-training Loss 预测能力:无论 1.5B 还是 32B 模型,相同 Loss 对应相同下游性能
- 涌现能力与 Loss 阈值相关:数学推理(GSM8K)、多任务问答(MMLU)等任务在 Loss 降到某阈值后性能才显著提升
- WSD 学习率调度效果:Stable 阶段 Loss 偏高,进入 Decay 后快速下降,与高质量数据配合效果最佳
- max_grad_norm = 0.1:常用梯度裁剪阈值,防止梯度爆炸
- α = 0.1 的 Embedding 梯度收缩:GLM-130B 最佳实践,公式:word_embedding * α + word_embedding.detach() * (1-α)
- Chameleon-7B 需要 dropout + z-loss:更大模型(34B)仅需 z-loss 即可稳定训练
- Batch Size 影响梯度噪声:太小导致方向不稳定,太大后期梯度更新趋于平稳
应用场景
场景 1:LLaMA 训练 Loss Spike 处理
- 公司:Meta
- 技术:断点续训,找到 Spike 前最近 checkpoint,更换后续训练样本
- 数据:LLaMA 训练过程中多次出现 Loss Spike
场景 2:GLM-130B 大模型稳定训练
- 公司:智谱 AI
- 技术:Embedding 梯度收缩(α=0.1)、FP32 softmax 计算、Adam ε 调整
- 数据:1300 亿参数,150000 词表
- 效果:显著减少训练崩溃,梯度范数激增后仍能稳定
场景 3:Chameleon 多模态模型
- 公司:Meta
- 技术:z-loss 正则化(10^-5 log2 Z)
- 数据:Chameleon-7B 需要 dropout + z-loss,Chameleon-34B 仅需 z-loss
场景 4:哔哩哔哩 Index-1.9B
- 公司:哔哩哔哩
- 技术:Norm-Head 归一化 LM-Head 层
- 数据:19 亿参数模型
- 效果:LM-Head 层梯度占据绝大部分梯度大小,Norm-Head 动态缩放提升稳定性
场景 5:预训练 Loss 预测模型能力
- 公司:清华大学 + 智谱 AI
- 技术:Pre-training Loss 作为能力指标
- 数据:超过 30 个不同规模模型(1.5B-32B),12 个下游任务
- 发现:无论模型大小,相同 Loss 对应相同性能
常见误区 / 踩坑
❌ 误区 1:很多人以为 Loss 越低模型越好
✅ 正解:需同时观察训练 Loss 和验证 Loss,若验证 Loss 上升说明过拟合;且 Loss 存在“涌现阈值”,降到某阈值前性能可能无显著提升❌ 误区 2:认为 Loss Spike 只是学习率问题,减小学习率就能解决
✅ 正解:Loss Spike 根源是浅层梯度“蓄水”后的突发释放,减小学习率治标不治本,需用梯度收缩或 z-loss 等方法❌ 误区 3:以为大模型和小模型的 Loss 计算完全相同
✅ 正解:大模型面临梯度不独立、Embedding 层梯度累积、数值溢出等问题,需要特殊处理(如 Norm-Head、FP32 softmax)❌ 误区 4:认为只要模型够大,Loss 自然会下降
✅ 正解:清华大学研究显示,相同样本量下,更小的模型配合更好的优化可以与大模型达到相同 Loss 和性能❌ 误区 5:忽视 z-loss 的作用,以为只是简单的正则化
✅ 正解:z-loss 控制 softmax 分区函数的量级,防止数值溢出,Chameleon-34B 训练必须使用❌ 误区 6:认为 Batch Size 越大越好
✅ 正解:Batch Size 太大导致后期梯度更新趋于平稳,太小导致梯度噪声大,需根据显存和数据特点平衡
性能 / 复杂度
时间复杂度:O(B × L × V),B=batch size,L=序列长度,V=词表大小
- 适用场景:每个样本需计算 V 个 logit,V 通常 30000-150000
空间复杂度:O(V) 用于存储 logit 和概率向量
- 适用场景:词表越大显存占用越高,分布式训练时词表分区
与替代方案对比:
- 方案 A(Sampled Softmax):时间 O(B × L × K),K << V(采样数),适用于超大词表(如百万级)
- 方案 B(本方案,Full Softmax):时间 O(B × L × V),精度最高,V < 100000 时效率可接受
- 临界点:词表 V > 100000 时,采样方法效率优势明显;V < 50000 时,Full Softmax 精度和稳定性更优
性能数字:
- GLM-130B 训练使用 150000 词表,每个 token 计算 150000 维 softmax
- LLaMA 训练中 Loss Spike 恢复可能需要数千步,浪费大量算力
- Pre-training Loss 从 2.5 降到 1.8 时,模型在 MMLU 任务上准确率从 30% 提升到 65%
与相关概念的区别
vs MSE Loss:
- 维度 1(适用任务):MSE 用于回归(如预测房价),Cross-Entropy 用于分类(语言建模)
- 维度 2(梯度特性):MSE 梯度在误差大时较大,Cross-Entropy 梯度恒定有利于训练稳定
- 维度 3(数值范围):MSE 输出范围无界,Cross-Entropy 输出范围 [0, +∞)
- 怎么选:语言建模/生成任务用 Cross-Entropy,预测连续值用 MSE
vs 评价指标(如 Accuracy、BLEU):
- 维度 1(用途):Loss 是训练过程中的可微优化目标,Accuracy/BLEU 是离散的评价指标
- 维度 2(可导性):Loss 可反向传播,评价指标不可导无法直接优化
- 维度 3(与训练关系**:Loss 下降不必然带来评价指标提升,需权衡两者
- 怎么选:训练时优化 Loss,上线后关注 Accuracy/BLEU 等业务指标
vs 对数似然(Log-Likelihood):
- 维度 1(数学形式):对数似然 = log(p),Cross-Entropy = -log(p_真实)
- 维度 2(包含项**:Cross-Entropy 包含真实分布的熵,对数似然仅关注预测
- 维度 3(优化等价性**:对于 one-hot 标签,最小化 Cross-Entropy 等价于最大化对数似然
- 怎么选:实际应用中两者几乎等价,选择 Cross-Entropy 更通用
进阶 / 面试加分项
最新进展:Pre-training Loss 作为“能力钥匙”的发现(2024 年清华+智谱)颠覆了“涌现能力仅与参数量相关”的传统观点,为模型能力评估和训练资源分配提供了新范式
业界争议:Loss 与模型能力的相关性是否因果?是否可以通过降低 Loss 而非增大模型来获得能力?这些问题的答案仍在探索中
金句:Loss 不仅是模型训练的“病历”,更是预测大模型能力的关键指标——与其盲目追求更大的模型,不如专注于如何更有效地降低 Pre-training Loss
面试加分句:Loss 设计本质是任务建模,好的 Loss 设计让优化事半功倍;Pre-training Loss 与下游性能的高度相关性暗示我们,简单高效的预训练目标可能比复杂的训练策略更有效
面试如何回答
🟢 什么是 Loss?为什么它是模型训练的核心?
回答要点:
Loss(损失值)是模型预测值与真实标签之间的差异度量,本质上是衡量“错得多严重”的标尺。\n\n从功能角度看,Loss 扮演三个关键角色:第一,它是反向传播的信号源,梯度 ∂Loss/∂θ 告诉每个参数该往哪个方向调整;第二,它是训练过程的“导航仪”,Loss 下降方向就是模型学习方向;第三,它是诊断模型健康状态的“病历本”,通过 Loss 曲线形态可以判断过拟合、欠拟合或训练崩溃等问题。\n\n类比来说,训练模型就像登山者寻找山谷最低点,Loss 就是指南针,每一步都在判断方向是否正确。研究表明,Pre-training Loss 甚至比模型参数量更能预测模型能力——无论 1.5B 还是 32B 模型,相等 Loss 时下游性能几乎相同。\n\n核心结论:Loss 是连接模型预测与真实目标的桥梁,没有 Loss 就无法指导参数优化。
🟡 大模型训练中的 Loss 是如何计算的?请详细解释交叉熵损失的计算过程
回答要点:
大模型语言建模本质上是多分类问题,Loss 计算分为两步:Softmax 归一化 + 交叉熵计算。\n\n第一步:Softmax 将模型输出的 logits(词表中每个 token 的未归一化分数)转换为概率分布。对于词表大小 V,logits = [z₁, z₂, ..., zₙ],计算 pᵢ = exp(zᵢ) / Σⱼexp(zⱼ)。GLM-130B 词表达 150000 维,每生成一个 token 都要计算 15 万维的 softmax。\n\n第二步:交叉熵损失计算真实 token 的负对数概率。由于真实标签是 one-hot 向量(仅真实位置为 1),交叉熵简化为 H = -log(p_真实)。当预测概率为 0.9 时 loss ≈ 0.105,为 0.99 时 loss ≈ 0.01。\n\n关键特性:交叉熵梯度恒定,不会因预测误差增大而梯度爆炸,这有利于训练稳定。与 MSE 相比,Cross-Entropy 对 logits 的梯度不会因为指数运算放大误差。\n\n核心结论:语言建模 Loss = -log(真实 token 的预测概率),计算简洁但需要高效的 Softmax 实现。
🟡 什么是 Loss Spike?大模型训练中为什么容易出现 Loss Spike?
回答要点:
Loss Spike 指训练过程中 Loss 突然暴涨,像火山喷发一样急剧升高,可能导致模型需要数千步恢复甚至完全无法收敛。\n\n根本原因在于梯度变化的“非独立性”。理论上,随机事件叠加成高斯分布要求各事件相互独立,但大模型训练中梯度更新无法满足独立性:\n\n① 浅层参数“蓄水”机制:Embedding 层参数长时间不更新(梯度接近零),但深层参数持续更新。当 batch 样本分布突然变化时,浅层产生巨大梯度变化,如同水坝蓄水太久后决堤。\n\n② Adam 优化器不稳定性:模型已收敛到局部最优点时,参数更新会再次进入非稳态。Adam 的动量估计使更新方向具有惯性,加剧振荡。\n\n③ Batch Size 影响:太小导致梯度噪声大,太大后期梯度更新趋于平稳但对分布变化更敏感。\n\n研究发现,大多数训练崩溃发生在梯度范数激增之后。大模型对样本间不同维度的特征分布变化更敏感,小模型因函数空间小而不会出现这种情况。
🟡 如何解决大模型训练中的 Loss Spike 问题?有哪些实践方案?
回答要点:
针对 Loss Spike 的解决方案分为“亡羊补牢”和“预防为主”两类。\n\n一、断点续训(被动应对):\n找到 Loss Spike 前最近的 checkpoint,更换后续训练样本重新训练。PaLM 和 GLM-130B 早期采用此方法。缺点是治标不治本,仍可能再次出现 Spike。\n\n二、梯度收缩(主动干预):\n将 Embedding 层梯度乘以缩放系数 α。GLM-130B 实践发现 α=0.1 效果最佳,公式:word_embedding * 0.1 + word_embedding.detach() * 0.9。大多数训练崩溃发生在梯度范数激增之后,此方法有效抑制尖峰。\n\n三、数值稳定性优化:\n- 减小 Adam ε 参数或设为 0\n- 使用 FP32 计算注意力 softmax(FP16 易溢出)\n- 添加 z-loss 正则化:Chameleon-34B 通过 10^-5 log2 Z 控制 softmax 归一化增长\n- 减小 max_grad_norm 到 0.1\n\n四、结构改进:\n- Norm-Head:归一化 LM-Head 层,动态缩放梯度\n- 合理学习率调度:WSD 策略在 Decay 阶段配合高质量数据效果最佳
🔴 Pre-training Loss 和模型能力之间是什么关系?为什么 Loss 能预测模型表现?
回答要点:
传统观点认为“涌现能力”主要由参数量决定,但 2024 年清华大学与智谱 AI 的研究颠覆了这一认知:Pre-training Loss 是预测模型能力的最佳指标,优于模型大小或训练数据量。\n\n核心发现来自超过 30 个模型的对比实验(1.5B 到 32B 规模),评估了 12 个下游任务。结论:无论模型大小,只要 Pre-training Loss 相同,它们在下游任务上的性能几乎相同。所有模型的数据点都落在同一趋势曲线上。\n\n两类任务的不同表现:\n- 平滑提升型:性能随 Loss 降低平稳提升\n- 涌现型(如 GSM8K、MMLU):只有当 Loss 降到某阈值以下,性能才开始显著提升\n\n这重新定义了“涌现能力”:一种能力是“涌现”的,如果它在 Pre-training Loss 较高的模型中不存在,但在 Loss 较低的模型中存在。\n\n实践意义:与其盲目增大模型,不如专注于如何更有效地降低 Pre-training Loss。Loss 成为评估训练效率和预测能力的可靠指标。
🟡 大模型训练分哪些阶段?各阶段的 Loss 函数有什么不同?
回答要点:
大模型训练通常分为三个阶段,每个阶段有特定的优化目标。\n\n一、SFT(监督微调)阶段:\n使用 GPT-LM-Loss,即标准的“下一个词预测”损失。模型学习根据前文预测下一个最可能的词,本质是多分类交叉熵。输入是 token 序列 [w₁, w₂, ..., wₙ],标签是 [w₂, w₃, ..., wₙ₊₁]。这是最基础的预训练损失。\n\n二、RM(奖励模型)阶段:\n使用 PairWiseLoss。模型看到两个回答 (response_A, response_B),被告知哪个更好。Loss 目标是让模型给“更好”的回答比“更差”的回答打出更高的 reward 分数。成对比较比单独评分更稳定。\n\n三、RL(强化学习)阶段:\n使用 PPO Loss 或 DPO Loss。PPO(近端策略优化)的目标是让模型在生成高分回答的同时,不要偏离原始模型太远,以保持语言能力和多样性。DPO(直接偏好优化)提供了更直接的方式,无需显式奖励模型即可完成对齐。\n\n关键对比:SFT 优化的是“说什么正确”,RM 优化的是“判断对错”,RL 优化的是“怎么说更好且不跑偏”。
🔴 z-loss 正则化是什么?它和普通的交叉熵损失有什么区别?
回答要点:
z-loss 是为了解决大模型训练中数值不稳定问题而设计的辅助损失函数。\n\n普通交叉熵损失只关注预测正确 token 的概率,但 z-loss 正则化额外控制 softmax 分区函数 Z = Σᵢ exp(logitsᵢ) 的量级。数学上,z-loss = (log Z)²,添加 10^-5 倍的 log2 Z 到总损失中。\n\n为什么需要 z-loss?不同注意力头计算出的注意力分数范围差异极大,有的平均值可达 +1e4,有的达 -1e-3。这种差异导致 FP16 下的 softmax 计算频繁上溢或下溢。z-loss 通过惩罚大的 log Z 值,抑制 logits 的极端增长。\n\n应用案例:Chameleon-7B 需要同时使用 dropout 和 z-loss 才能稳定训练,但更大的 Chameleon-34B 仅使用 z-loss 就足够了。这表明模型规模增大后,对稳定性的需求反而可能降低。\n\n与普通 Loss 的关系:z-loss 是辅助项,总损失 = 交叉熵 + z_loss_multiplier × z_squared。通常 z_loss_multiplier 很小(1e-4),以免干扰主目标。
🟢 如何通过 Loss 曲线判断模型训练状态?过拟合和欠拟合在曲线上有什么表现?
回答要点:
Loss 曲线是模型训练的“心电图”,通过观察 Train Loss 和 Validation Loss 的形态可以诊断模型健康。\n\n完美拟合(Good Fit):\n训练 Loss 和验证 Loss 都平稳下降并收敛到较低水平,两者差距很小(约 5-10%)。这表明模型既学到了数据规律,又具备良好泛化能力。\n\n过拟合(Overfitting):\n训练 Loss 持续下降,但验证 Loss 下降到某点后开始回升,两条曲线呈喇叭状发散。类比学生只会死记硬背练习题,正式考试就原形毕露。解决方法是增加数据量、数据增强、正则化(Dropout/权重衰减)或 Early Stopping。\n\n欠拟合(Underfitting):\n训练 Loss 和验证 Loss 都居高不下,或下降极其缓慢。这说明模型太简单,无法捕捉数据模式,如同让小学生做微积分。解决方法包括加深网络、延长训练、调整学习率或使用更复杂架构。\n\n异常情况:Loss 突然暴涨(Spike)说明训练不稳定;Loss 剧烈震荡(坐过山车)说明学习率过高或 Batch Size 过小;Loss 停滞不前说明学习率过低、数据错误或梯度消失。
