直觉理解
信息论回答的问题是:一个事件带来多少「意外」,一个分布有多「不确定」,两个分布差多少。越不可能发生的事情,一旦发生,信息量越大。语言模型的训练目标——交叉熵损失——直接来自信息论:它衡量模型预测的分布与真实数据之间的差距。
定义与公式
下面用自然对数 ,单位是奈特(nat);用以 2 为底的对数时单位是比特(bit)。
信息量
概率为 的事件的信息量是 。必然发生的事件()信息量为 0;概率越小,信息量越大。
熵
熵是分布 的平均信息量,衡量不确定性:
在取值集合固定且有限、没有额外约束时,均匀分布的熵最大;确定性分布(某个值概率为 1)的熵为 0。这里讨论的是离散熵,不能直接把这些结论套到连续变量的微分熵上。
交叉熵
用分布 去描述真实分布 时的平均信息量:
在使用硬标签的分类或语言模型训练中,单个观测标签可以编码为独热的目标分布,交叉熵就化简为下式。这不表示真实条件分布是独热的:同一段前文往往有多种合理的后续;软标签和标签平滑也不使用独热目标。
也就是「模型给正确答案的概率取负对数」,与负对数似然完全相同。
KL 散度
KL 散度衡量分布 与 的差距:
它总是 ,当且仅当 时为 0。它不对称:,所以不是严格意义上的距离。
由于真实分布的熵 与模型无关,最小化交叉熵等价于最小化 KL 散度,也就是让模型分布逼近真实分布。
困惑度
语言模型常用困惑度(perplexity)来评估,它是平均交叉熵取指数:
可以粗略理解为预测的不确定程度。只有在测试文本、分词方式和上下文评估协议一致时,困惑度才适合直接比较;更低的困惑度也不保证指令遵循或事实准确率更高。
代码示例
import torch
import torch.nn.functional as F
p = torch.tensor([0.7, 0.2, 0.1]) # 真实分布
q = torch.tensor([0.5, 0.3, 0.2]) # 模型分布
H_p = -(p * p.log()).sum()
H_pq = -(p * q.log()).sum()
kl = (p * (p / q).log()).sum()
print(torch.allclose(kl, H_pq - H_p)) # True:KL = 交叉熵 - 熵
# 独热标签时,交叉熵就是正确类别概率的负对数
logits = torch.tensor([2.0, 0.5, -1.0]).unsqueeze(0) # 形状 (1, 3)
target = torch.tensor([0])
ce = F.cross_entropy(logits, target)
print(torch.allclose(ce, -torch.log_softmax(logits, -1)[0, 0])) # True
print(torch.exp(ce)) # 这一个 token 的困惑度在 AI 中的作用
- 分类与语言模型的训练损失就是交叉熵,见损失函数和语言模型。
- 知识蒸馏让学生模型的分布去逼近教师模型,常用 KL 散度(前向或反向),见知识蒸馏与小模型。
- RLHF 在奖励之外加一个 KL 惩罚,防止策略模型偏离参考模型太远,见RLHF、RLAIF与RLVR。
- 对比学习的 InfoNCE 损失也可以看作一种交叉熵,见跨模态表示对齐。
参考资料
相关
- 概率与统计:信息论的前提是概率分布与最大似然。