直觉理解

信息论回答的问题是:一个事件带来多少「意外」,一个分布有多「不确定」,两个分布差多少。越不可能发生的事情,一旦发生,信息量越大。语言模型的训练目标——交叉熵损失——直接来自信息论:它衡量模型预测的分布与真实数据之间的差距。

定义与公式

下面用自然对数 ,单位是奈特(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 中的作用

参考资料

相关