交叉熵与 Softmax 在多分类问题中的应用
文章目录
在机器学习和深度学习中,Softmax 函数和交叉熵损失函数是解决多分类问题的关键组成部分。本文将详细介绍这两个概念,并通过一个实际案例来说明它们的应用。
Softmax 函数
Softmax 函数是一个常用的激活函数,用于将一组数值转换为概率分布。假设我们有一个向量 z z z,Softmax 函数定义如下:
softmax ( z ) i = e z i ∑ j = 1 K e z j \text{softmax}(z)_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} softmax(z)i=∑j=1Kezjezi
这里:
- z i z_i zi是输入向量中的第 i i i个元素,
- K K K是向量的长度,
- e e e是自然对数的底数。
Softmax 函数的主要作用是将每个原始值 z i z_i zi转换为一个介于 0 和 1 之间的值,并且所有这些转换后的值之和为 1,这使得它可以被解释为概率分布。
交叉熵损失函数
交叉熵是一个度量两个概率分布之间差异的方法。在机器学习中,我们通常有一个真实的概率分布 y y y(通常是独热编码形式的一组标签)和模型预测的概率分布 y ^ \hat{y} y^。对于多分类问题,交叉熵损失函数定义如下:
CE ( y ^ , y ) = − ∑ i = 1 K y i log ( y ^ i ) \text{CE}(\hat{y}, y) = -\sum_{i=1}^{K} y_i \log(\hat{y}_i) CE(y^,y)=−i=1∑Kyilog(y^i)
这里:
- y i y_i yi是真实标签向量中的第 i i i个元素,
- y ^ i \hat{y}_i y^i是预测标签向量中的第 i i i个元素,
- K K K是类别数量。
实际案例
为了更好地理解这些概念,让我们来看一个实际的多分类问题案例:图像分类。
假设我们正在训练一个卷积神经网络 (CNN) 来识别动物图片中的三种动物:猫、狗和鸟。每张图片都将被分类为这三个类别之一。
数据准备
我们有以下训练数据集:
- 样本1:猫的图片,标签为 [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0]。
- 样本2:狗的图片,标签为 [ 0 , 1 , 0 ] [0, 1, 0] [0,1,0]。
- 样本3:鸟的图片,标签为 [ 0 , 0 , 1 ] [0, 0, 1] [0,0,1]。
模型结构
我们的 CNN 模型结构如下:
- 输入层:接收图像像素值。
- 卷积层和池化层:提取特征。
- 全连接层:最后的全连接层输出一个长度为 3 的向量,表示每个类别的得分或“证据”(logits)。
- Softmax 层:将 logits 转换为概率分布。
训练过程
- 前向传播:对于每个样本,模型产生一个 logits 向量 z z z。
- Softmax 函数:将 logits 向量 z z z转换为概率分布 y ^ \hat{y} y^。
- 交叉熵损失:使用 y ^ \hat{y} y^和真实的标签 y y y来计算交叉熵损失。
示例计算
假设模型对于样本1(猫的图片)产生了以下 logits 向量 z z z:
z = [ 1.0 , 2.0 , 0.5 ] z = [1.0, 2.0, 0.5] z=[1.0,2.0,0.5]
使用 Softmax 函数得到预测概率分布 y ^ \hat{y} y^:
y ^ = [ e 1.0 e 1.0 + e 2.0 + e 0.5 , e 2.0 e 1.0 + e 2.0 + e 0.5 , e 0.5 e 1.0 + e 2.0 + e 0.5 ] ≈ [ 0.245 , 0.665 , 0.090 ] \hat{y} = \left[\frac{e^{1.0}}{e^{1.0} + e^{2.0} + e^{0.5}}, \frac{e^{2.0}}{e^{1.0} + e^{2.0} + e^{0.5}}, \frac{e^{0.5}}{e^{1.0} + e^{2.0} + e^{0.5}}\right] \approx [0.245, 0.665, 0.090] y^=[e1.0+e2.0+e0.5e1.0,e1.0+e2.0+e0.5e2.0,e1.0+e2.0+e0.5e0.5]≈[0.245,0.665,0.090]
对于这个样本,真实的标签 y y y是 [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0]。因此,交叉熵损失函数计算如下:
CE ( y ^ , y ) = − ( 1 ⋅ log ( 0.245 ) + 0 ⋅ log ( 0.665 ) + 0 ⋅ log ( 0.090 ) ) ≈ 1.38 \text{CE}(\hat{y}, y) = -\left(1 \cdot \log(0.245) + 0 \cdot \log(0.665) + 0 \cdot \log(0.090)\right) \approx 1.38 CE(y^,y)=−(1⋅log(0.245)+0⋅log(0.665)+0⋅log(0.090))≈1.38
平均交叉熵损失
在深度学习中,我们通常使用平均交叉熵损失来计算整个批次的数据损失。对于一个包含 N N N个样本的批次,平均交叉熵损失定义为:
Average CE = − 1 N ∑ i = 1 N ∑ j = 1 K y j ( i ) log ( y ^ j ( i ) ) \text{Average CE} = -\frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{K} y_j^{(i)} \log(\hat{y}_j^{(i)}) Average CE=−N1i=1∑Nj=1∑Kyj(i)log(y^j(i))
这里 N N N是批次中样本的数量, K K K是类别数量。
不使用平均交叉熵的影响
如果我们不使用平均交叉熵,而是直接使用交叉熵损失,那么会有以下几个影响:
- 不可比较性:每个批次的损失值将取决于批次中样本的数量,使得不同批次之间的损失值不可直接比较。
- 不稳定的学习:如果不进行平均,那么每个批次的损失值可能会因为样本数量的变化而波动较大,这可能导致训练过程不稳定。
- 难以设置超参数:优化器的学习率等超参数通常需要根据损失函数的规模来调整。如果不使用平均交叉熵,损失函数的规模会随着批次大小的变化而变化,这使得设置合适的超参数变得更加困难。
推荐的做法是在深度学习训练过程中使用平均交叉熵损失,这样可以确保训练过程更加稳定,并且使得不同批次之间的损失值更具可比性。大多数深度学习框架(如 TensorFlow 和 PyTorch)都默认使用平均交叉熵损失。
实例分析
假设我们有一个批次包含 3 个样本的图像分类任务,每个样本都有 3 个可能的类别(猫、狗、鸟)。每个样本的真实标签和预测概率分布如下:
- 样本1:猫的图片,真实标签 [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0],预测概率 [ 0.2 , 0.5 , 0.3 ] [0.2, 0.5, 0.3] [0.2,0.5,0.3]。
- 样本2:狗的图片,真实标签 [ 0 , 1 , 0 ] [0, 1, 0] [0,1,0],预测概率 [ 0.1 , 0.8 , 0.1 ] [0.1, 0.8, 0.1] [0.1,0.8,0.1]。
- 样本3:鸟的图片,真实标签 [ 0 , 0 , 1 ] [0, 0, 1] [0,0,1],预测概率 [ 0.1 , 0.1 , 0.8 ] [0.1, 0.1, 0.8] [0.1,0.1,0.8]。
对于每个样本,我们可以计算交叉熵损失:
- 对于样本1,交叉熵损失为 − log ( 0.2 ) ≈ 1.609 -\log(0.2) \approx 1.609 −log(0.2)≈1.609
- 对于样本2,交叉熵损失为 − log ( 0.8 ) ≈ 0.097 -\log(0.8) \approx 0.097 −log(0.8)≈0.097
- 对于样本3,交叉熵损失为 − log ( 0.8 ) ≈ 0.097 -\log(0.8) \approx 0.097 −log(0.8)≈0.097
接着,我们计算平均交叉熵损失:
Average CE = 1 3 ( 1.609 + 0.097 + 0.097 ) ≈ 0.601 \text{Average CE} = \frac{1}{3} (1.609 + 0.097 + 0.097) \approx 0.601 Average CE=31(1.609+0.097+0.097)≈0.601
关注真实类别的预测概率
在计算交叉熵损失时,我们只关注模型对于每个样本真实类别的预测概率。例如,当真实标签为“猫”时,我们只关注模型对于“猫”的预测概率 y ^ 1 \hat{y}_1 y^1,而其他类别的预测概率对损失函数没有贡献。
小结
通过结合 Softmax 函数和交叉熵损失函数,我们可以构建出强大的多分类模型,用于解决各种分类任务。平均交叉熵损失函数可以帮助我们更稳定地评估模型的表现,并指导模型学习正确的分类决策。