理解交叉熵作为损失函数在神经网络中的作用

本文介绍了在多分类问题中,交叉熵损失函数及其在二分类问题中的特例——二值交叉熵的应用。同时探讨了Softmax与Sigmoid激活函数如何帮助神经网络输出概率分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

交叉熵的作用

通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个结点:
这里写图片描述
而即便是ResNet取消了隐藏层的全连接,也会在最后有一个1000个节点的输出层,比如下图中的ResNet18,ResNet34,ResNet0,ResNet101和ResNet152,最后的输出都是1000-d fc,也就是1000个结点:
在这里插入图片描述
一般情况下,最后一个输出层的节点个数与分类任务的目标数相等。假设最后的节点数为N,那么对于每一个样例,神经网络可以得到一个N维的数组作为输出结果,数组中每一个维度会对应一个类别。在最理想的情况下,如果一个样本属于k,那么这个类别所对应的的输出节点的输出值应该为1,而其他结点的输出都为0,即[0,0,1,0,…0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果,交叉熵就是用来判定实际的输出与期望的输出的接近程度!
但是这里有一个特例,就是二分类问题,二分类问题时,网络可以输出N=2个结点,这种情况下和上面说到的是一致的。但是也可以只输出一个结点,用这个结点的值是否大于0.5来做二分类,Logist处理二分类问题时就是这样。

激活函数

神经网络的原始输出(也就是结点的直接输出结果)不是一个概率值,实质上只是输入的数值做了复杂的加权和与非线性处理之后的一个值而已,那么如何将这个输出变为概率分布呢?对于上面提到的两种情况,一般会采用Softmax和Sigmoid做激活处理。

Softmax

假设神经网络的原始输出为 y 1 , y 2 , . . . . , y n y_{1},y_{2},....,y_{n} y1,y2,....,yn,那么经过Softmax处理之后的输出为:
s o f t m a x ( y i ) = e i y ∑ j = 1 n e i y softmax(y_{i}) = \frac{e^y_{i}}{\sum_{j=1}^{n}e^y_{i}} softmax(yi)=j=1neiyeiy
很显然的是: ∑ j = 1 n s o f t m a x ( y i ) = 1 \sum_{j=1}^{n}softmax(y_{i}) = 1 j=1nsoftmax(yi)=1
也就是说每个结点的输出,加起来为1,所以经过Softmax处理后单个节点的输出变成的一个概率值。

Sigmoid

Softmax激活起码要对应N大于等于2的输出结点,那么上述的另一种情况,只有一个结点时处理二分类问题,应该怎么激活?这里就用到了Sigmoid,Sigmoid在早期ANN中常用于去线性化,因为它的特性是将一个数压缩到0-1之间:

S i g m o i d ( y ) = 1 1 + e − y Sigmoid(y) = \frac{1}{1+e^{-y}} Sigmoid(y)=1+ey1

压缩后的结果就可以作为二分类中某一类的概率值,由于是二分类问题,所以另一类的概率值自然就是 1 − S i g m o i d ( y ) 1-Sigmoid(y) 1Sigmoid(y)
这样处理,和N=2时做Softmax,效果是相似的,都可以表征出二分类的概率。

交叉熵原理

交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。

二值交叉熵

分类任务中有二分类,交叉熵中也有一个特例,就是二值交叉熵。
二值交叉熵是对应Sigmoid激活时的二分类问题的,它的公式是这样:
L ( p , t ) = − [ t l o g ( p ) + ( 1 − t ) l o g ( 1 − p ) ] L(p,t) = -[tlog(p)+(1-t)log(1-p)] L(p,t)=[tlog(p)+(1t)log(1p)]
其中, t t t为样本的期望输出, p p p为样本的实际输出,其中 p = S i g m o i d ( y ) p=Sigmoid(y) p=Sigmoid(y)。这里的 p p p t t t都只是一个数。
二值交叉熵的这个公式是可证的,在另一篇文章中给出了上述公式的证明。
这个公式如何表征距离呢,举个例子:

假设期望输出 t = 1 t=1 t=1,实际输出 p 1 = 0.3 p_{1}=0.3 p1=0.3 p 2 = 0.6 p_{2}=0.6 p2=0.6那么:
L 1 ( t , p 1 ) = − l o g ( 0.3 ) = 0.522 L_{1}(t,p_{1}) = -log(0.3)=0.522 L1(t,p1)=log(0.3)=0.522
L 2 ( t , p 2 ) = − l o g ( 0.6 ) = 0.221 L_{2}(t,p_{2}) = -log(0.6)=0.221 L2(t,p2)=log(0.6)=0.221
显然 t 2 t_{2} t2的损失更小。

假设期望输出 p = 0 p=0 p=0,实际输出 t 1 = 0.3 t_{1}=0.3 t1=0.3 t 2 = 0.6 t_{2}=0.6 t2=0.6那么:
L 1 ( t , p 1 ) = − l o g ( 1 − 0.3 ) = 0.154 L_{1}(t,p_{1}) = -log(1-0.3)=0.154 L1(t,p1)=log(10.3)=0.154
L 2 ( t , p 2 ) = − l o g ( 1 − 0.6 ) = 0.397 L_{2}(t,p_{2}) = -log(1-0.6)=0.397 L2(t,p2)=log(10.6)=0.397
显然 t 1 t_{1} t1的损失更小。

交叉熵

在二分类的基础上,交叉熵有更通用的表达形式,因为二分类只是分类问题的特例,更多的还是多分类问题,比如前面提到的1000分类。通用的交叉熵要对应Softmax函数使用,所以有时候Softmax+交叉熵也被称为Softmax损失函数,它表达式为:
H ( T , P ) = − ∑ 1 C T l o g ( P ) H(T,P) = -\sum_{1}^{C} Tlog(P) H(T,P)=1CTlog(P)

其中, T T T为样本的期望输出,它是一个one-hot编码形式,比如二分类时label=0,one-hot应该为[1,0];三分类时label=0,one-hot应该为[1,0,0]。
P P P为样本的实际输出,其中 P = [ s o f t m a x ( y 1 ) , s o f t m a x ( y 2 ) , . . . , s o f t m a x ( y i = n ) ] P=[softmax(y_{1}),softmax(y_{2}),...,softmax(y_{i=n})] P=[softmax(y1),softmax(y2),...,softmax(yi=n)]
这里的 T T T P P P就不再是一个数了,而是一个长度与类别数相同的集合,所以这里用了大写。

这个公式如何表征距离呢,还是举例说明,首先是上面二分类的例子:
假设期望输出 t = 1 t=1 t=1,实际输出 p 1 = 0.3 p_{1}=0.3 p1=0.3 p 2 = 0.6 p_{2}=0.6 p2=0.6,那么把它变成一个N=2的集合应该是: T = [ 0 , 1 ] T=[0,1] T=[0,1] P 1 = [ 0.7 , 0.3 ] P_{1}=[0.7,0.3] P1=[0.7,0.3] P 2 = [ 0.4 , 0.6 ] P_{2}=[0.4,0.6] P2=[0.4,0.6]

H 1 ( T , P 1 ) = − l o g ( 0.3 ) = 0.522 H_{1}(T,P_{1}) =-log(0.3)=0.522 H1(T,P1)=log(0.3)=0.522
H 2 ( T , P 2 ) = − l o g ( 0.6 ) = 0.221 H_{2}(T,P_{2}) = -log(0.6)=0.221 H2(T,P2)=log(0.6)=0.221
到这里就发现,和上面的结果是一致的,因为我们本来就是用Sigmoid的输出去假设了Softmax的输出,因为二分类只有1减去当前类别的概率,剩下的就会是另一个类别的概率。上述的交叉熵公式 H ( P , T ) H(P,T) H(P,T),如果把 ∑ \sum 展开,也就成了 L ( p , t ) L(p,t) L(p,t)
第二个 p = 0 p=0 p=0的例子就不太详细举例了。

下面假设一个三分类情况, T = [ 1 , 0 , 0 ] T=[1,0,0] T=[1,0,0] P 1 = [ 0.8 , 0.1 , 0.1 ] P_{1}=[0.8,0.1,0.1] P1=[0.8,0.1,0.1] P 2 = [ 0.5 , 0.3 , 0.2 ] P_{2}=[0.5,0.3,0.2] P2=[0.5,0.3,0.2]
H 1 ( P , T 1 ) = − ( 1 × l o g ( 0.8 ) + 0 × l o g ( 0.1 ) + 0 × l o g ( 0.1 ) ) = 0.096 H_{1}(P,T_{1}) =-(1\times log(0.8)+0\times log(0.1)+0\times log(0.1))=0.096 H1(P,T1)=(1×log(0.8)+0×log(0.1)+0×log(0.1))=0.096
H 2 ( P , T 2 ) = − ( 1 × l o g ( 0.5 ) + 0 × l o g ( 0.3 ) + 0 × l o g ( 0.2 ) ) = 0.301 H_{2}(P,T_{2}) = -(1\times log(0.5)+0\times log(0.3)+0\times log(0.2))=0.301 H2(P,T2)=(1×log(0.5)+0×log(0.3)+0×log(0.2))=0.301
T 1 T_{1} T1要更接近label,所以损失更小。

<think>好的,我现在需要帮助用户了解卷积神经网络(CNN)中的交叉熵损失函数的具体概念用法。首先,我要回顾交叉熵的基本概念,然后结合CNN的结构应用场景来解释。 首先,交叉熵是信息论中的概念,用于衡量两个概率分布之间的差异。在机器学习中,尤其是在分类任务中,通常使用交叉熵作为损失函数,因为分类问题通常涉及预测类别概率。交叉熵损失函数能够有效地度量模型输出与真实标签之间的差距,从而指导模型参数的更新。 接下来,我需要将交叉熵与CNN结合起来。CNN主要用于处理图像等具有网格结构的数据,通过卷积层、池化层等提取空间特征,最后通过全连接层进行分类。在分类层,通常会使用Softmax函数将输出转换为概率分布,然后计算交叉熵损失。 这里需要注意的是,交叉熵损失函数在CNN中的具体实现方式。例如,在PyTorch中,可以使用`nn.CrossEntropyLoss()`,它内部已经结合了Softmax函数,因此不需要在模型最后额外添加Softmax层。而在TensorFlow中,可能需要明确使用`tf.nn.softmax_cross_entropy_with_logits`。这些实现细节可能会影响用户的实际应用,所以需要详细说明。 另外,用户可能关心交叉熵损失函数的数学表达式。交叉熵的公式是$L = -\sum_{i=1}^C y_i \log(p_i)$,其中$y_i$是真实标签的one-hot编码,$p_i$是预测概率。在CNN中,这个损失函数会随着反向传播算法,通过优化器(如SGD、Adam)来更新卷积核参数全连接层的权重,从而最小化损失值。 还需要考虑用户可能遇到的常见问题,例如类别不平衡时的处理办法。这时候可以提到加权交叉熵或者焦点损失(Focal Loss),这些方法通过调整不同类别的权重来改善模型性能。此外,多标签分类任务可能需要使用二元交叉熵,这点也需要区分清楚。 用户提供的引用中有提到功能连接性计算优化器的调整。虽然引用[3]是关于功能连接性的CNN应用,可能与当前问题关联不大,但引用[4]提到通过改变优化器或微调神经网络(如应用正则化或学习率衰减)来提高准确性。这可能提示在解释交叉熵损失函数时,可以结合优化器的选择使用,例如Adam优化器配合交叉熵损失的效果,或者如何通过正则化防止过拟合,从而提升模型性能。 此外,需要确保回答符合用户的要求,比如使用中文,数学公式用$...$格式,独立公式用$$...$$。例如,交叉熵的公式应该写成: $$ L = -\sum_{i=1}^{C} y_i \log(p_i) $$ 并且需要检查LaTeX语法是否正确,避免格式错误。 可能用户还会关心交叉熵损失函数在CNN中的具体应用步骤,比如前向传播时如何计算损失,反向传播时如何梯度下降。这部分可以通过代码示例来展示,比如使用PyTorch或TensorFlow的实现代码,这样用户能更直观地理解用法。 最后,生成的相关问题需要围绕交叉熵损失函数展开,例如与其他损失函数的对比、在多分类任务中的调整、在图像分类中的具体应用案例等。这些问题可以帮助用户进一步深入学习。 总结思考过程: 1. 交叉熵的基本概念数学公式。 2. CNN的结构及其在分类任务中的流程。 3. 交叉熵在CNN中的具体应用,包括前向传播反向传播。 4. 实现时的注意事项常见框架中的使用方法。 5. 结合引用中的优化方法,讨论如何优化模型性能。 6. 生成相关问题,引导用户扩展知识。</think>### 卷积神经网络中的交叉熵损失函数 #### 基本概念 交叉熵(Cross Entropy)是信息论中用于衡量两个概率分布差异的指标。在卷积神经网络(CNN)中,它被广泛用作分类任务的损失函数,通过比较模型预测概率分布$p_i$与真实标签分布$y_i$的差异来优化参数[^4]。其数学定义为: $$ L = -\sum_{i=1}^{C} y_i \log(p_i) $$ 其中,$C$为类别总数,$y_i$为真实标签的one-hot编码,$p_i$为模型输出的Softmax概率。 #### CNN中的实现流程 1. **特征提取**:通过卷积层池化层提取输入数据的空间特征。 2. **分类层**:全连接层将特征映射到类别空间,输出未归一化的得分(logits)。 3. **概率转换**:应用Softmax函数将logits转换为概率分布: $$ p_i = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} $$ 4. **损失计算**:使用交叉熵损失比较预测概率与真实标签的差距,并反向传播更新权重[^1]。 #### 代码示例(PyTorch) ```python import torch import torch.nn as nn # 定义CNN模型 class CNN(nn.Module): def __init__(self, num_classes): super().__init__() self.conv_layers = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3), nn.ReLU(), nn.MaxPool2d(2) ) self.fc = nn.Linear(16*13*13, num_classes) # 假设输入图像尺寸为28x28 def forward(self, x): x = self.conv_layers(x) x = x.view(x.size(0), -1) return self.fc(x) # 初始化模型损失函数 model = CNN(num_classes=10) criterion = nn.CrossEntropyLoss() # 自动包含Softmax # 假设输入数据 inputs = torch.randn(4, 3, 28, 28) labels = torch.tensor([2, 5, 1, 9]) # 前向传播与损失计算 outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() ``` #### 关键用法 1. **多分类任务**:适用于图像分类(如MNIST、CIFAR-10),需配合Softmax使用。 2. **优化器选择**:常与Adam或SGD结合,引用[4]提到可通过学习率衰减提升精度。 3. **类别不平衡处理**:可对损失函数加权(`weight`参数)或使用焦点损失(Focal Loss)。 4. **数值稳定性**:框架(如PyTorch)的`CrossEntropyLoss`已集成Log-Softmax,避免数值溢出。 #### 与其他损失函数的对比 | 损失函数 | 适用场景 | 特点 | |----------------|------------------------|------------------------------| | 交叉熵损失 | 多分类 | 概率匹配,梯度稳定 | | 均方误差(MSE)| 回归任务 | 对异常值敏感,分类中少用 | | 二元交叉熵 | 二分类/多标签分类 | 每个类别独立计算概率 |
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值