信息论入门从“猜硬币”到交叉熵直观理解KL散度与分类损失想象你和朋友在咖啡馆玩一个游戏桌上有一枚被做了手脚的硬币正面朝上的概率是70%。每次抛掷后你们需要预测结果并记录猜测的准确度。这个简单的游戏背后隐藏着机器学习中交叉熵损失函数的精髓。1. 从硬币游戏到信息量当硬币正面朝上时朋友A总是预测正面而朋友B则按60%概率猜正面。十轮下来A的正确率看似更高——但这里存在一个关键问题我们如何量化预测的好坏信息量衡量的是事件出人意料程度。公式简单却深刻def information(p): return -math.log(p)硬币正面实际概率P0.7A的预测完全确定要么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.916PyTorch中的实现极为简洁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(weightweights)过拟合配合标签平滑技术smoothed_labels (1 - 0.1) * one_hot 0.1 / num_classes6. 可视化理解通过二维平面展示不同预测与真实分布的差距红色区域表示预测与真实标签差距较大高损失蓝色区域表示匹配良好在模型训练过程中梯度下降算法实际上是在这个平面上寻找蓝色区域的过程。学习率决定了每一步的移动距离而batch size则影响了我们估计梯度方向时的噪声大小。