信息论入门:从“猜硬币”到交叉熵,直观理解KL散度与分类损失
想象你和朋友在咖啡馆玩一个游戏:桌上有一枚被做了手脚的硬币,正面朝上的概率是70%。每次抛掷后,你们需要预测结果并记录猜测的准确度。这个简单的游戏背后,隐藏着机器学习中交叉熵损失函数的精髓。
1. 从硬币游戏到信息量
当硬币正面朝上时,朋友A总是预测"正面",而朋友B则按60%概率猜正面。十轮下来,A的正确率看似更高——但这里存在一个关键问题:我们如何量化预测的"好坏"?
信息量衡量的是事件出人意料程度。公式简单却深刻:
def information(p): return -math.log(p)- 硬币正面实际概率P=0.7
- A的预测完全确定(要么100%要么0%)
- B的预测保留不确定性(60%/40%)
当出现反面时:
- A的信息量 = -log(0) → 无穷大(完全预测错误)
- B的信息量 = -log(0.4) ≈ 0.916
这就是为什么分类模型不能做绝对预测——需要保留合理的概率分布。
2. 信息熵:不确定性度量
连续玩100次硬币游戏,每次结果的信息量平均值就是信息熵:
| 预测类型 | 计算公式 | 熵值(nats) |
|---|---|---|
| 完美匹配 | -0.7ln(0.7)-0.3ln(0.3) | ≈0.61 |
| 朋友B的预测 | -0.7ln(0.6)-0.3ln(0.4) | ≈0.67 |
| 随机猜测(50%) | -0.5ln(0.5)-0.5ln(0.5) | ≈0.69 |
熵值越低,预测系统的不确定性越小。在图像分类任务中,这意味着模型输出的概率分布越集中。
3. KL散度:预测与现实的差距
比较两种预测质量的差异,需要KL散度(相对熵):
def kl_divergence(p, q): return sum(p[i] * math.log(p[i]/q[i]) for i in range(len(p)))以硬币游戏为例:
- 真实分布 P = [0.7, 0.3]
- 朋友A预测 Q1 = [1.0, 0.0]
- 朋友B预测 Q2 = [0.6, 0.4]
计算结果:
KL(P||Q1) = 0.7*ln(0.7/1) + 0.3*ln(0.3/0) → 无限大 KL(P||Q2) ≈ 0.7*ln(0.7/0.6) + 0.3*ln(0.3/0.4) ≈ 0.042这就是为什么机器学习中要避免"过于自信"的预测——KL散度会惩罚那些给真实情况分配零概率的预测。
4. 交叉熵:实战中的损失函数
在训练神经网络时,真实分布P固定(如标签[1,0,0]),信息熵恒定。此时最小化KL散度等价于最小化交叉熵:
交叉熵 H(P,Q) = 信息熵 H(P) + KL散度 D(P||Q)以三分类问题为例:
| 样本 | 真实分布P | 模型预测Q | 交叉熵计算 |
|---|---|---|---|
| 猫 | [1,0,0] | [0.7,0.2,0.1] | -1ln(0.7)-0ln(0.2)-0*ln(0.1) ≈ 0.357 |
| 狗 | [0,1,0] | [0.3,0.4,0.3] | -0ln(0.3)-1ln(0.4)-0*ln(0.3) ≈ 0.916 |
PyTorch中的实现极为简洁:
loss = nn.CrossEntropyLoss() output = loss(model_input, true_labels)5. 分类任务中的实战技巧
二元分类(如垃圾邮件检测):
# 使用sigmoid激活配合BCELoss model = nn.Sequential( nn.Linear(1000, 1), nn.Sigmoid() ) loss_fn = nn.BCELoss()多分类(如ImageNet):
# 最后一层无需softmax(已包含在CrossEntropyLoss中) model = nn.Sequential( nn.Linear(2048, 1000) ) loss_fn = nn.CrossEntropyLoss()常见问题解决方案:
- 类别不平衡:在损失函数中添加类别权重
weights = torch.tensor([1.0, 2.0, 1.5]) # 给少数类更高权重 loss_fn = nn.CrossEntropyLoss(weight=weights) - 过拟合:配合标签平滑技术
smoothed_labels = (1 - 0.1) * one_hot + 0.1 / num_classes
6. 可视化理解
通过二维平面展示不同预测与真实分布的差距:
红色区域表示预测与真实标签差距较大(高损失),蓝色区域表示匹配良好
在模型训练过程中,梯度下降算法实际上是在这个平面上寻找蓝色区域的过程。学习率决定了每一步的移动距离,而batch size则影响了我们估计梯度方向时的噪声大小。