信息熵与交叉熵实战:从编码到PyTorch损失函数的3个关键推导

📅 2026/7/6 9:25:11
信息熵与交叉熵实战:从编码到PyTorch损失函数的3个关键推导
信息熵与交叉熵实战从编码到PyTorch损失函数的3个关键推导1. 信息论基础从编码视角理解熵的本质当我们谈论信息熵时本质上是在讨论用最优方式编码信息所需的最小平均比特数。这个观点由克劳德·香农在1948年提出它揭示了概率与信息之间的深刻联系。信息量的数学定义对于一个发生概率为p的事件其信息量I(p) -log₂p。这个对数函数的选择不是随意的——它确保了独立事件的信息量具有可加性。例如一个公平硬币抛掷的结果p0.5包含I1比特的信息一个八面骰子掷出特定数字p1/8包含I3比特的信息熵的物理意义信息熵H(X)是随机变量X所有可能取值的信息量的期望def entropy(prob_dist): return -np.sum(prob_dist * np.log2(prob_dist))考虑以下三种概率分布的熵对比分布类型概率向量熵值比特确定分布[1.0, 0.0, 0.0]0.0均匀分布[0.33, 0.33, 0.34]~1.58偏斜分布[0.9, 0.05, 0.05]~0.57熵的重要性质当分布越接近均匀时熵越大完全确定时熵为零。这解释了为什么压缩随机数据比压缩规律性强的数据更困难。2. 交叉熵的推导与最大似然估计交叉熵是机器学习中最重要的概念之一它衡量了两个概率分布之间的距离。从编码角度理解用真实分布P的最优编码时平均码长为H(P)用近似分布Q的编码来传达P的信息时平均码长为H(P,Q)数学定义 H(P,Q) -Σp(x)logq(x)在深度学习中最小化交叉熵等价于最大化似然函数。让我们通过一个分类问题来理解这点假设我们有真实标签分布Pone-hot编码 [0,0,1]模型预测分布Qsoftmax输出 [0.1,0.2,0.7]交叉熵计算为 H(P,Q) -(0log0.1 0log0.2 1*log0.7) -log0.7 ≈ 0.3567PyTorch中的实现方式import torch.nn as nn loss_fn nn.CrossEntropyLoss() # 内置了softmax outputs model(inputs) loss loss_fn(outputs, labels)三种典型分布的交叉熵计算对比二分类问题sigmoid输出 H(P,Q) -[y*logŷ (1-y)*log(1-ŷ)]多分类问题softmax输出 H(P,Q) -Σy_i*logŷ_i回归问题高斯假设 当假设输出服从高斯分布时最小化MSE等价于最小化交叉熵3. 从理论到实践PyTorch中的自定义损失函数理解理论后我们可以深入实现层面。标准的交叉熵损失有时需要调整例如处理类别不平衡或特殊任务需求。自定义加权交叉熵实现class WeightedCrossEntropy(nn.Module): def __init__(self, weights): super().__init__() self.weights torch.tensor(weights) def forward(self, inputs, targets): log_probs -F.log_softmax(inputs, dim1) loss self.weights[targets] * log_probs.gather(1, targets.unsqueeze(1)) return loss.mean() # 使用示例 weights [1.0, 2.0, 1.5] # 给不同类别不同权重 criterion WeightedCrossEntropy(weights)KL散度与交叉熵的关系 KL(P||Q) H(P,Q) - H(P)在PyTorch中可以直接计算kl_loss nn.KLDivLoss(reductionbatchmean) output F.log_softmax(model_out, dim1) loss kl_loss(output, target_distribution)实际训练中的技巧数值稳定性添加微小epsilon防止log(0)标签平滑防止模型对标签过度自信温度系数调整softmax输出的锐度# 标签平滑示例 def label_smoothing(targets, n_classes, smoothing0.1): with torch.no_grad(): targets targets * (1 - smoothing) smoothing / n_classes return targets4. 高级应用互信息与特征学习互信息I(X;Y)H(X)-H(X|Y)衡量两个变量间的统计依赖性。在现代深度学习中它被用于无监督表示学习如Deep InfoMax特征选择生成模型的评估互信息估计的PyTorch实现class MutualInfoEstimator(nn.Module): def __init__(self, input_dim): super().__init__() self.net nn.Sequential( nn.Linear(input_dim*2, 256), nn.ReLU(), nn.Linear(256, 1)) def forward(self, x, y): # 联合样本得分 joint torch.cat([x, y], dim1) t self.net(joint) # 边缘乘积样本得分 shuffled_y y[torch.randperm(y.size(0))] marginal torch.cat([x, shuffled_y], dim1) t_margin self.net(marginal) # 互信息下界估计 mi t.mean() - torch.log(t_margin.exp().mean() 1e-6) return mi在实际项目中理解这些基础概念如何转化为代码至关重要。例如在图像分类任务中交叉熵损失的选择直接影响模型收敛速度和最终性能。一个经验法则是对于类别不平衡数据使用加权交叉熵当需要比较两个完整分布时使用KL散度而在自监督学习中互信息最大化成为强大的学习目标。