跳到主要内容

困惑度与损失函数

训练大语言模型时,最常见的指标是 loss。看模型报告时,也经常会看到 perplexity,中文通常叫困惑度。

这两个指标都和“模型能不能预测下一个 token”有关。它们很重要,但也很容易被误解:

  • loss 下降,说明模型在训练目标上变好了。
  • perplexity 下降,说明模型面对这段文本时更“不困惑”。
  • 但低 loss、低 perplexity 不等于模型一定好用。

理解它们,可以帮助我们判断训练是否正常、模型是否过拟合、评估结果是否可信,以及为什么生成质量不能只看一个数字。


1. 语言模型到底在优化什么

现代 decoder-only LLM 最常见的训练目标是 next token prediction:

给定前面的 token,预测下一个 token。

例如:

上下文: 人工智能正在改变
目标 token: 软件

模型不会只输出一个答案,而是对整个词表输出一个概率分布:

token模型预测概率
软件0.40
世界0.20
教育0.12
医疗0.08
其他 token0.20

如果真实下一个 token 是“软件”,那么模型给“软件”的概率越高,损失就越低。

一句话概括:

语言模型训练的核心,是让真实下一个 token 的概率尽可能高。


2. 交叉熵损失

语言模型最常用的损失函数是交叉熵损失,英文是 cross entropy loss。

对单个 token 来说,如果真实 token 的预测概率是 p,那么损失可以简化理解为:

loss = -log(p)

这里的 log 通常是自然对数。

几个直观例子:

真实 token 的预测概率 p单 token loss
0.900.105
0.500.693
0.102.303
0.014.605

可以看到:

  • 模型越确信正确答案,loss 越低。
  • 模型把正确答案概率压得越低,loss 越高。
  • loss 不是线性惩罚,极低概率会被重罚。

这很符合训练目标:如果正确 token 的概率只有 1%,说明模型几乎没有预测对,应该给出很大的惩罚。


3. 为什么是负对数

使用 -log(p) 有几个好处。

第一,它会把“最大化正确 token 概率”转成“最小化损失”。优化器通常做的是最小化目标函数。

第二,多个 token 的概率相乘时,对数可以把乘法变成加法。

例如一句话有 3 个 token:

P(整句话) = P(token1) * P(token2) * P(token3)

取对数后:

log P(整句话) = log P(token1) + log P(token2) + log P(token3)

这样训练时就可以把每个 token 的损失加起来或求平均。

第三,低概率错误会被明显放大。模型如果对正确答案非常不自信,loss 会迅速升高,优化信号更强。


4. Token-level Loss

语言模型的 loss 通常是 token-level 的。

一段文本会被 tokenizer 切成 token 序列:

[大型, 语言, 模型, 正在, 学习]

训练样本可以理解为:

给定: 大型
预测: 语言

给定: 大型 语言
预测: 模型

给定: 大型 语言 模型
预测: 正在

给定: 大型 语言 模型 正在
预测: 学习

每一个预测位置都会产生一个 loss。最终 loss 通常是这些位置的平均值:

平均 loss = 所有有效 token loss 之和 / 有效 token 数量

这里要注意“有效 token”。训练时可能会有 padding、prompt 部分、被 mask 掉的位置,通常不会计入 loss。


5. 困惑度是什么

Perplexity 可以看作 cross entropy loss 的另一种表达方式。

如果 loss 使用自然对数,那么:

perplexity = exp(loss)

也就是:

PPL = e ^ loss

几个例子:

平均 lossperplexity
0.69约 2
1.10约 3
2.30约 10
4.61约 100

直觉上,perplexity 可以理解为:

模型在每个位置平均面对多少个“差不多可能”的选择。

如果 perplexity 是 10,可以粗略理解为:模型平均像是在 10 个候选 token 里犹豫。这个说法只是直觉,不代表模型真的只看 10 个 token。


6. Loss 和 Perplexity 的关系

Loss 和 perplexity 单调对应:

  • loss 越低,perplexity 越低。
  • loss 越高,perplexity 越高。
  • 两者表达的是同一个训练目标,只是尺度不同。

例如:

loss = 2.30
perplexity = exp(2.30) ≈ 10

所以在很多训练日志里,只看 loss 就够了。Perplexity 的优点是更直观,尤其适合向非训练工程背景的人解释“模型有多困惑”。

但在工程排查中,loss 通常更常用,因为它更稳定,也更适合观察训练曲线。


7. 一个简单计算例子

假设一句话有 4 个需要预测的 token,模型给真实 token 的概率分别是:

位置真实 token 概率
10.50
20.25
30.10
40.40

每个位置的 loss 是:

-log(0.50) = 0.693
-log(0.25) = 1.386
-log(0.10) = 2.303
-log(0.40) = 0.916

平均 loss:

(0.693 + 1.386 + 2.303 + 0.916) / 4 = 1.3245

perplexity:

exp(1.3245) ≈ 3.76

也就是说,这个模型在这段文本上的平均困惑度大约是 3.76。


8. 训练 Loss、验证 Loss 和测试 Loss

看 loss 时,要区分数据集。

指标含义用途
训练 loss模型在训练数据上的平均损失判断训练是否收敛
验证 loss模型在未参与参数更新的数据上的平均损失判断泛化和调参
测试 loss模型在最终保留测试集上的平均损失最终评估

如果只看训练 loss,很容易误判。

常见情况:

现象可能含义
训练 loss 和验证 loss 都下降训练正常,泛化也在改善
训练 loss 下降,验证 loss 不降可能过拟合,或训练数据和验证数据分布不同
训练 loss 不下降学习率、数据、模型结构或训练管道可能有问题
loss 突然变成 NaN可能发生数值不稳定、梯度爆炸或数据异常
验证 loss 异常低可能存在数据泄漏或评估集污染

训练大模型时,loss 曲线不是唯一判断依据,但它是最基础的健康信号。


9. 过拟合怎么看

过拟合的典型表现是:

训练 loss 持续下降
验证 loss 停止下降,甚至开始上升

这说明模型越来越擅长拟合训练集,但没有更好地泛化到新数据。

常见原因包括:

  • 训练数据太少。
  • 重复数据太多。
  • 模型容量相对数据规模过大。
  • 训练轮数过多。
  • 验证集和训练集分布差异太大。
  • 数据清洗或切分方式有问题。

在大语言模型里,过拟合不一定只表现为“背答案”。它还可能表现为:

  • 输出过度接近训练语料风格。
  • 对训练集中高频模板过度依赖。
  • 在真实用户问题上泛化较差。
  • 在公开 benchmark 上表现虚高,但业务评估不稳定。

10. 为什么低 Perplexity 不等于好用

低 perplexity 说明模型更擅长预测某个文本分布,但真实产品问题通常不只是预测文本。

例如,一个模型可能在通用网页文本上 perplexity 很低,但仍然:

  • 不会稳定遵守指令。
  • 不会正确调用工具。
  • 不会输出合法 JSON。
  • 不会拒绝危险请求。
  • 不会根据私有知识库回答问题。
  • 不会在复杂业务流程中保持状态。
  • 会编造看似合理但错误的事实。

原因是 perplexity 衡量的是“给定上下文后,真实文本是否高概率”,而产品质量还包括:

  • 指令跟随。
  • 事实正确性。
  • 安全性。
  • 格式可靠性。
  • 推理能力。
  • 工具使用能力。
  • 多轮对话一致性。
  • 用户偏好对齐。

所以,perplexity 是模型训练指标,不是产品体验指标。


11. 高质量回答不一定最低 Loss

很多任务没有唯一正确答案。

例如用户问:

请解释什么是 KV Cache。

可能有很多合理回答:

  • 面向初学者的解释。
  • 面向工程部署的解释。
  • 带公式的解释。
  • 用类比说明的解释。
  • 简短回答。
  • 长篇教程。

训练语料里的某个参考答案只是众多合理答案之一。模型给参考答案更高概率,会降低 loss;但这不代表它生成的答案一定最适合当前用户。

这就是为什么后训练和偏好优化很重要。它们不只是让模型“更会预测文本”,还要让模型更符合人类偏好、指令约束和产品目标。

对应阅读:


12. 生成任务中的局限

Perplexity 对开放式生成任务尤其有限。

比如写作、总结、问答、头脑风暴、客服对话,通常存在多个可接受输出。一个答案的概率高,不代表它更有帮助;一个答案的概率低,也不代表它差。

生成质量还受到解码参数影响:

  • temperature
  • top_p
  • top_k
  • repetition penalty
  • max_tokens
  • stop sequence

同一个模型、同一个 prompt,在不同解码参数下可能生成完全不同的回答。Perplexity 衡量的是模型分布本身,而不是某次采样结果的最终质量。

对应阅读:


13. 对话任务中的局限

对话模型通常经过 SFT、偏好优化和安全对齐。它的目标已经不只是“续写最可能的文本”,还包括“作为助手完成任务”。

对话场景里,低 perplexity 不能直接说明:

  • 模型是否理解用户意图。
  • 模型是否遵守 system 指令。
  • 模型是否能在多轮中记住约束。
  • 模型是否能拒绝不安全请求。
  • 模型是否能在不确定时承认不知道。
  • 模型是否能正确使用工具或引用来源。

例如,训练语料里可能有大量“看似自信的回答”。模型学会这种分布后,perplexity 可能不错,但事实性和可靠性未必好。

这也是幻觉问题的重要来源之一:模型生成的是概率上合理的文本,不等于经过事实校验的文本。

对应阅读:


14. Perplexity 不能随便横向比较

不同模型的 perplexity 不一定能直接比较。

主要原因包括:

14.1 Tokenizer 不同

同一句话在不同 tokenizer 下可能切成不同数量的 token。

例如:

文本: 大模型部署
tokenizer A: [大模型, 部署]
tokenizer B: [大, 模型, 部, 署]

perplexity 是按 token 计算的。token 切分不同,计算口径就不同。

14.2 评估数据不同

在新闻、代码、数学、聊天记录、论文、中文网页上评估,结果会差很多。

一个代码模型在代码数据上 perplexity 低,不代表它在中文问答上也低。

14.3 上下文长度不同

更长上下文可能让模型看到更多线索,从而降低 loss。但这不一定代表模型基础能力更强,也可能只是评估条件不同。

14.4 数据污染不同

如果评估集或相似文本进入训练集,perplexity 会被低估,模型看起来更好。

所以,比较 perplexity 时至少要说明:

  • 使用哪个评估集。
  • 使用哪个 tokenizer。
  • 是否按 token、byte 还是 character 归一化。
  • 上下文长度和截断方式。
  • 是否过滤过训练污染。
  • 是否包含 prompt、答案或特殊 token。

15. 中文和多语言场景的注意点

中文场景下,perplexity 更容易受 tokenizer 影响。

有的 tokenizer 对中文压缩效率高,一个词可能是一个 token;有的 tokenizer 会把中文拆得更碎。这样会影响:

  • 每段文本的 token 数。
  • 平均 loss 的口径。
  • 上下文窗口能容纳的信息量。
  • 不同语言之间的指标可比性。

因此,多语言模型评估时,不应只看一个整体 perplexity。更合理的做法是分语言、分领域、分任务查看。

例如:

数据切片观察重点
中文通用文本中文基础语言建模
英文通用文本英文基础语言建模
代码代码模式和语法
数学题符号和推理文本
业务文档目标领域术语
对话数据指令和交互格式

整体指标可能掩盖局部问题。一个模型整体 loss 很好,但中文法律文档、医学问答或企业内部术语上的表现仍然可能很差。


16. 与准确率、Win Rate 和人工评估的关系

Perplexity 不是唯一评估指标。不同任务需要不同指标。

指标适合衡量局限
loss / perplexity语言建模能力、训练收敛不直接反映产品质量
accuracy有标准答案的分类、选择题、抽取题不适合开放式生成
exact match格式严格、答案唯一的任务对同义表达不友好
F1抽取、检索、分类仍需要明确标签
pass@k代码生成、数学求解依赖测试用例或验证器
win rate两个模型回答偏好对比依赖评审标准和样本设计
人工评估综合质量、可用性、安全性成本高,一致性难控制

实际模型评估通常需要组合指标:

训练健康: loss / perplexity
任务能力: accuracy / F1 / pass@k
生成质量: win rate / 人工评估
产品风险: 安全评估 / 幻觉评估 / 格式校验
线上效果: 用户反馈 / 转化率 / 解决率 / 延迟和成本

单一指标无法覆盖所有问题。


17. 工程上怎么使用这些指标

在训练和微调过程中,可以按以下方式使用 loss 和 perplexity。

17.1 看训练是否健康

重点观察:

  • loss 是否稳定下降。
  • 是否出现尖峰。
  • 是否出现 NaN。
  • 不同数据源的 loss 是否异常。
  • 训练 loss 和验证 loss 是否逐渐分叉。

如果 loss 曲线异常,优先检查:

  • 学习率。
  • batch size。
  • 数据格式。
  • label mask。
  • tokenizer。
  • 混合精度配置。
  • 梯度裁剪。
  • 数据中是否有极端长文本或异常样本。

17.2 看数据配比是否合理

如果不同数据源分别记录 loss,可以发现很多问题。

例如:

现象可能原因
代码数据 loss 高代码占比不足,或 tokenizer 对代码不友好
中文数据 loss 高中文语料质量不足,或中文 token 压缩差
某来源 loss 极低数据重复、模板化严重,或存在泄漏
某来源 loss 剧烈波动数据质量不稳定,或样本格式异常

这比只看整体 loss 更有诊断价值。

17.3 看微调是否破坏基础能力

做 SFT 或领域微调时,目标数据上的 loss 下降是好事,但也要监控通用验证集。

如果领域 loss 降低,但通用验证集 loss 明显变差,可能出现灾难性遗忘或过度领域化。

这时可以考虑:

  • 降低学习率。
  • 缩短训练轮数。
  • 混入通用数据。
  • 使用更保守的 LoRA 配置。
  • 增加多任务评估。

18. 常见误区

18.1 Loss 越低模型越聪明

不一定。Loss 只说明模型更擅长拟合某个文本分布,不等于推理、事实、安全和工具能力都更强。

18.2 Perplexity 可以直接比较所有模型

不一定。Tokenizer、评估集、上下文长度和计算口径不同,perplexity 就不具备直接可比性。

18.3 验证 loss 低说明没有问题

不一定。如果验证集被训练数据污染,或者验证集太接近训练分布,验证 loss 会虚低。

18.4 对话模型只要继续降低 loss 就会更好

不一定。继续降低模仿数据的 loss,可能让模型更像训练答案,但不一定更符合用户偏好。对话质量通常需要偏好评估和人工评估。

18.5 生成答案概率最高就是最佳答案

不一定。最高概率答案可能保守、模板化、缺少信息,甚至稳定输出错误事实。


19. 小结

Loss 和 perplexity 是理解大语言模型训练的基础指标。

  • 交叉熵损失衡量模型给真实 token 的概率有多高。
  • 单 token loss 可以简化理解为 -log(p)
  • 平均 loss 是多个有效 token 损失的平均值。
  • Perplexity 是 exp(loss),可以理解为模型的平均困惑程度。
  • 训练 loss 用来看收敛,验证 loss 用来看泛化和过拟合。
  • Perplexity 受 tokenizer、评估集、上下文长度和数据污染影响,不能随便横向比较。
  • 低 loss、低 perplexity 不等于模型好用,真实产品还需要任务评估、人工评估、安全评估和线上反馈。

可以把它们放在正确位置上理解:

loss / perplexity 负责回答:
模型是否更会预测这类文本?

任务评估和人工评估负责回答:
模型是否真的能解决用户问题?

训练模型时不能没有 loss,但评估模型时也不能只有 loss。