交叉熵:语言模型训练的唯一主菜
语言模型的训练损失是交叉熵(cross-entropy),它的直觉版本:模型对下一个 token 输出一个概率分布,真实答案是一个确定 token——交叉熵衡量「模型给正确答案分配的概率有多低」,分配越低罚越重。数学形态是对正确 token 的负对数概率:loss = −log P(正确token)。三个性质值得内化。惩罚不对称:模型给正确答案 0.9 的概率,损失 0.1;给 0.01,损失 4.6——自信地犯错比谨慎地犯错罚得重得多,这个不对称性塑造了模型「宁肯不确定也不要自信地错」的压力(与幻觉篇的校准话题呼应)。梯度天然合理:概率越接近正确,梯度越小(学得差不多了就少更新);错得离谱梯度越大——交叉熵与 softmax 的组合是「自动调节的学习信号」。与困惑度的关系:困惑度就是交叉熵的指数化(PPL = e^loss),loss 2.0 ≈ 困惑度 7.4——「模型平均在 7.4 个候选里犹豫」(本库困惑度篇展开)。
Label Smoothing:给「过分自信」上个保险
训练里有个副作用:模型为了压低交叉熵,会把正确 token 的概率推向 1.0——过自信(over-confidence)。过自信的模型在推理时表现为采样分布过于尖锐(temperature 调节都救不回)、校准失效(自评置信度虚高)。Label smoothing 的处方:把「正确答案概率 = 1」的目标软化——目标改为「正确答案 0.9,其余所有 token 分摊 0.1」。效果:模型不再追求极端自信,分布更平滑、校准更好、泛化常常更稳。代价也要诚实:训练损失与验证损失的绝对值失去可比性(目标本身变了),且在追求极致基准分数的场景(后训练的 RLVR 之前)有时会牺牲一点峰值性能。实践姿势:预训练与大 SFT 常开(0.1 是常见值)、追求极致对齐精度的场景评估后再定。
辅助损失:MoE 与多任务里的「副目标」
辅助损失(auxiliary loss)指主损失之外附加的「副目标损失」,最著名的场景是 MoE 的负载均衡(本库 MoE 篇):主损失(下一 token 预测)之外,加一项「专家负载均匀性」的惩罚——没有它路由会崩塌(所有 token 挤向少数明星专家)。辅助损失的设计要点是权重的拿捏:权重太小不起作用(路由照旧崩塌)、太大喧宾夺主(模型为均衡而均衡,牺牲语言质量)——MoE 训练的「辅助损失权重」是核心超参之一。多任务学习(一个模型同时学翻译 + 摘要 + 代码)是辅助损失的另一个舞台:各任务损失的加权求和,权重决定「偏科程度」。辅助损失的通用规律:它是「用主目标的些许损失,换训练稳定性或次要目标达成」的工具——每次加辅助损失,都要回答「我愿意为主目标损失多少」。
对比损失:Embedding 训练的另一菜系
交叉熵管「分类/预测」型任务,对比损失(contrastive loss)管「相似度」型任务——Embedding 模型(本库 Embedding 训练篇的主菜)的核心。InfoNCE(对比损失的现代标准形态)的直觉:把「匹配的样本对」在向量空间拉近、把「不匹配的样本对」推远——一个 batch 里 N 对样本,每对的正例要胜过 2N−2 个负例(softmax over 相似度)。它的工程要点与交叉熵不同:负例的质量决定一切——随机负例太容易(一眼假),模型学不到精细区分;难负例(看起来相似实则不匹配的)才是训练的关键(本库 Embedding 篇的难负例挖掘)。两条损失菜系的分工:交叉熵教「判断对错」,对比损失教「衡量远近」——语言模型的生成用前者、检索的向量用后者,一个完整 RAG 系统两样都要。
损失函数的工程细节:数值稳定性与特殊任务的损失设计
损失函数从理论到代码有一层工程细节,跨过它才算真正掌握。数值稳定性:交叉熵的实现要「logits + log_softmax 合并计算」(分开算 softmax 会溢出——FP16 下指数爆炸是经典事故);混合精度下损失缩放(本库混合精度篇)与交叉熵的配合(BF16 无需缩放、FP16 必需)。特殊 token 的损失处理:padding token 不参与损失(mask 掉)、assistant 部分的 loss masking(本库 SFT 篇)——mask 的实现错误是「模型学坏」的隐形来源。特殊任务的损失变体。其一,长输出的损失归一:按 token 平均还是按样本平均(长样本权重被稀释还是放大——影响模型对长短任务的偏科)。其二,代码与数学的辅助损失:在主损失外加「格式正确性」的软约束(如鼓励闭合括号的辅助项)——辅助损失(本库损失篇)在代码任务的具体化。其三,偏好类任务的损失:DPO 的成对损失(本库 DPO 篇)与对比损失(本库 Embedding 篇)都是交叉熵家族的亲戚——「损失函数家族」的谱系:所有这些变体都在回答同一个问题的不同侧面——「怎么度量模型的输出与期望的差距」。调试损失的心法:loss 不降的排查顺序——数据(标签错没错、mask 对不对)→ 学习率(太大震荡太小不动)→ 数值(溢出/NaN 的位置)→ 架构(梯度断流的位置)。损失函数是训练目标的编码,读懂它才能在训练出问题时「读出模型在抱怨什么」。
损失曲线的完整解读:训练过程的「体检报告」
损失曲线是训练的体检报告(本库调度篇讲了节奏诊断),本篇把曲线形态学补全成一份完整解读手册。健康曲线的形态:前期陡降(快学期)、中期缓降(慢学期)、后期平台微降(精修期)——验证曲线与训练曲线平行下降且间距小(无过拟合)。异常形态七种与诊断。①开局不平(loss 高位横盘数步)——warmup 不足或初始化异常。②尖峰(spike)——瞬时异常(数据段/数值),能自愈则观察、不能则回滚。③锯齿剧烈震荡——学习率过大或 batch 过小(梯度噪声大)。④训练与验证剪刀差——过拟合(本库正则化篇)。⑤阶梯状下降(平台-骤降-平台)——正常(能力的分阶段涌现),平台期耐心,骤降点评估。⑥loss 降到异常低——数据泄漏嫌疑(验证集与训练集重叠?)。⑦loss 缓慢上升——学习率漂移或数值问题(罕见但严重)。曲线之外的配套证据:loss 只 tells「学没学」,评估曲线 tells「学到了什么」——loss 平稳但某能力评估突降的事件,只有评估驱动才看得见(本库预训练篇的评估驱动原则)。曲线解读的纪律:任何调整(超参、数据、模型)都要「单变量 + 前后曲线对比」,凭感觉的多变量同调会让曲线失去可解释性——曲线是训练的体检报告,而读懂报告的前提是「一次只改变一个变量」。
损失函数的调试实例:一次「loss 不降」的完整排查
损失调试(正文心法)的真实案例演练:某次 SFT 训练 loss 纹丝不动,完整排查过程演示。症状:SFT 训练开始后 loss 稳定在初始值附近,数百步不降。排查第一步:数据侧。打印解码后的训练样本——发现标签(assistant 回复)正常,但检查 loss mask 的实现:mask 的索引错位(把 user 部分也算进了损失之外、assistant 部分反被 mask 掉——损失算的是「用户的输入」而非「助手回复」,模型无从学习,loss 当然不动)。排查第二步:确认修复。修正 mask(只对 assistant token 计损失),loss 开始正常下降。案例的教训清单。教训一:loss 不降的第一嫌疑是数据与标签(mask 错位、标签错位、pad token 的处理),而不是学习率——数据问题的概率远高于超参。教训二:打印解码后的「训练真值」是万能第一步(把「模型被要求预测的目标」解码出来人眼看——一眼就能看出 mask 错位);教训三:单元测试损失计算(构造一个「一眼可验」的迷你样本:两轮对话、手算期望损失——训练脚本的损失函数值得被单测)。loss 调试的三步口诀:打印真值、检查 mask、小样本手算——九成的「loss 不降」在这三步内破案。
损失与评估的分离原则:训练信号与验收信号
损失函数篇的收尾原则:训练损失与评估指标必须分离——两者服务不同的目的,混用会导致系统性误判。训练损失(交叉熵)的用途:梯度信号(优化器唯一看得见的反馈)与训练健康监测(曲线形态诊断——本库曲线手册)。评估指标的任务基准:验收信号(模型「能不能完成任务」的裁决)。分离的原因:训练损失优化的是「下一个 token 的分布拟合」,任务基准度量的是「完成任务的表现」——两者相关但不等价(本库困惑度篇的低 PPL 不等于好)。分离的操作纪律:训练循环只看训练/验证损失(调超参、诊断健康);验收只看任务基准(选版本、定上线);绝不用训练 loss 的高低决定「哪个模型更好」(loss 低的可能只是过拟合训练分布)。分离原则的一个反例警示:见过团队用「SFT 的训练 loss 降到最低」作为微调完成标准——结果 loss 最低的 checkpoint 过拟合最重、任务表现最差——把训练信号当验收信号,是模型工程里代价最高的认知混淆之一。
小结
交叉熵是语言模型的主损失:负对数概率的不对称惩罚塑造了训练压力,与困惑度是指数关系。Label smoothing 软化过自信(校准更好,损失值口径改变),辅助损失用主目标的些许损失换稳定性(MoE 负载均衡与多任务加权,权重拿捏是核心超参),对比损失管相似度任务(InfoNCE、难负例决定成败)——交叉熵教判断、对比损失教远近。损失函数看似数学细节,实为训练目标的编码:改损失就是改「你让模型学什么」。下一篇转向训练超参的节奏器:Batch Size 与学习率调度。
读者留言
COMMENTS 暂无还没有留言,来说第一句?