困惑度与损失函数
训练大语言模型时,最常见的指标是 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 |
| 其他 token | 0.20 |
如果真实下一个 token 是“软件”,那么模型给“软件”的概率越高,损失就越低。
一句话概括:
语言模型训练的核心,是让真实下一个 token 的概率尽可能高。
2. 交叉熵损失
语言模型最常用的损失函数是交叉熵损失,英文是 cross entropy loss。
对单个 token 来说,如果真实 token 的预测概率是 p,那么损失可以简化理解为:
loss = -log(p)
这里的 log 通常是自然对数。
几个直观例子:
| 真实 token 的预测概率 p | 单 token loss |
|---|---|
| 0.90 | 0.105 |
| 0.50 | 0.693 |
| 0.10 | 2.303 |
| 0.01 | 4.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
几个例子:
| 平均 loss | perplexity |
|---|---|
| 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 概率 |
|---|---|
| 1 | 0.50 |
| 2 | 0.25 |
| 3 | 0.10 |
| 4 | 0.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。