交叉熵的数学推导与代码实现
简单介绍交叉熵(Cross Entropy)
基本概念
什么是交叉熵?
交叉熵(Cross Entropy)是深度学习中最常见的损失函数之一,尤其在分类任务中被广泛应用。它结合了信息论与概率论的思想,能有效衡量模型输出分布与真实分布之间的差异。
信息熵
信息熵:衡量分布不确定性的指标。
$$
H(X) = -\sum^{n}_{i=1}p(x_i)log(p(x_i))
$$
- X: 事件
- $p(x_i)$:发生第i种现象的可能性。
系统越是有序,信息熵越低,反之越混乱值越高。
交叉熵(Cross Entropy)
交叉熵:用于衡量两个概率分布之间的距离:
$$
H(p,q) = -\sum^{n}_{i=1}p(x_i)log(q(x_i))
$$
- $p(x_i)$:真实分布(ground truth)
- $q(x_i)$:模型预测分布
若p=q:交叉熵最小。
数学推导
二分类任务(Binary Classification)
真实标签$∈{0,1}$, 模型的输出预测为$\hat y ∈(0,1)$,损失函数:
$$
\mathcal{L} = -[y \log(\hat{y}) + (1 - y)\log(1 - \hat{y})]
$$
多分类(Multi-class Classification)
对于 𝐶类问题,模型输出为经过 softmax 的概率分布 $\hat y$,真实标签为 one-hot 向量 𝑦,损失函数为:
$$\mathcal{L} = -\sum_{i=1}^C y_i \log(\hat{y}i)
$$
由于one-hot只有目标类为1,公式简化为:
$$\mathcal{L} = -\log(\hat{y}{\text{target}})
$$
代码实现
Numpy 实现 Softmax + Cross Entropy
1 | import torch |
Pytorch实现(自动处理LogSoftmax)
1 | import torch |
⚠️ 注意:F.cross_entropy() 自动包括了 softmax 和 log 操作,因此输入应该是未归一化的 logits。
补充:Label Smoothing对交叉熵的影响
什么是Lable Smoothing?
Label Smoothing 是一种正则化技术,用于避免模型过度自信地预测某个类别。在 one-hot 编码中,真实标签为:
1 | [0, 0, 1, 0] # 100% 相信第 3 类 |
加入 label smoothing 后,标签会被“平滑”成:
1 | [0.1, 0.1, 0.7, 0.1] # 不再绝对确信 |
数学形式:
$$
y^{\text{smooth}}_i = (1 - \epsilon) \cdot y_i + \frac{\epsilon}{C}
$$
- $\epsilon$:平滑因子
- C:类别数
好处
- 减少过拟合
- 提升泛化能力
- 缓解softmax饱和(梯度消失)
Pytorch
从 PyTorch 1.10 开始,torch.nn.CrossEntropyLoss 支持 label_smoothing 参数:
1 | import torch |
补充:
Focal loss:处理类别不平衡