交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中用于分类任务的核心损失函数,尤其在二分类和多分类问题中广泛应用。以下从原理、数学推导和实际应用三个层面进行详解:
1. 信息论基础
交叉熵源于信息论中的香农熵(Shannon Entropy),用于衡量事件的不确定性:
- 熵(Entropy):描述一个概率分布 ( p ) 的不确定性,定义为:
[
H(p) = -\sum_{i} p(x_i) \log p(x_i)
] - 交叉熵(Cross-Entropy):衡量用分布 ( q ) 近似真实分布 ( p ) 时的平均信息量:
[
H(p, q) = -\sum_{i} p(x_i) \log q(x_i)
]
在机器学习中,( p ) 是真实标签分布(通常是one-hot编码),( q ) 是模型预测的概率分布。
2. 分类任务中的交叉熵
二分类问题
- 真实标签:( y \in {0, 1} )
- 预测概率:( \hat{y} = \sigma(z) )(sigmoid输出)
- 二分类交叉熵损失:
[
L = - \left[ y \log \hat{y} + (1-y) \log (1-\hat{y}) \right]
]- 当 ( y=1 ),损失为 ( -\log \hat{y} )(预测概率 ( \hat{y} \to 1 ) 时损失趋近0)。
- 当 ( y=0 ),损失为 ( -\log (1-\hat{y}) )(预测概率 ( \hat{y} \to 0 ) 时损失趋近0)。
多分类问题
- 真实标签:one-hot编码 ( y = [0, \dots, 1, \dots, 0] )
- 预测概率:softmax输出 ( \hat{y}i = \frac{e^{z_i}}{\sum{j} e^{z_j}} )
- 多分类交叉熵损失:
[
L = -\sum_{i=1}^{C} y_i \log \hat{y}_i
]
其中 ( C ) 是类别数。由于 ( y_i ) 只有真实类别为1,其余为0,实际只需计算真实类别对应的预测概率的负对数。
3. 数学推导与梯度
以多分类为例,假设真实类别为 ( k ),损失函数为:
[
L = -\log \hat{y}_k
]
计算梯度(反向传播):
- Softmax梯度:
[
\frac{\partial \hat{y}i}{\partial z_j} = \hat{y}_i (\delta{ij} - \hat{y}j)
]
其中 ( \delta{ij} ) 是Kronecker delta(当 ( i=j ) 时为1,否则为0)。 - 损失对logits的梯度:
[
\frac{\partial L}{\partial z_j} = \hat{y}_j - y_j
]
这一简洁形式是交叉熵与softmax结合的优势,梯度仅取决于预测与真实的差异。
4. 为什么使用交叉熵?
- 概率解释:直接优化模型输出概率与真实分布的差异。
- 梯度友好:避免均方误差(MSE)在饱和区(如sigmoid两端)梯度消失的问题。
- 与极大似然估计等价:最小化交叉熵等价于化对数似然函数。
5. 实际应用示例(PyTorch)
import torch.nn as nn
# 二分类
loss_fn = nn.BCELoss() # 输入需经过sigmoid
# 或直接使用带sigmoid的版本
loss_fn = nn.BCEWithLogitsLoss() # 输入为logits
# 多分类
loss_fn = nn.CrossEntropyLoss() # 输入为logits(无需手动softmax)
6. 常见问题
- 数值稳定性:计算 ( \log \hat{y} ) 时可能溢出,通常通过
log_softmax
或BCEWithLogitsLoss
内置优化避免。 - 类别不平衡:可通过加权交叉熵(
weight
参数)或Focal Loss改进。
交叉熵通过衡量概率分布的差异,为分类模型提供了清晰且高效的优化目标。理解其原理有助于灵活调整损失函数以适应不同任务需求。