交叉熵(Cross-Entropy)

本文详细解析了信息论中的核心概念——交叉熵,从信息量出发,介绍了熵、相对熵的概念,并深入探讨了交叉熵与相对熵的区别与联系。通过具体实例,帮助读者理解这些概念的实际意义。

交叉熵(Cross-Entropy)

交叉熵是一个在ML领域经常会被提到的名词。在这篇文章里将对这个概念进行详细的分析。

1.什么是信息量?

假设XX是一个离散型随机变量,其取值集合为XX,概率分布函数为p(x)=Pr(X=x),x∈Xp(x)=Pr(X=x),x∈X,我们定义事件X=x0X=x0的信息量为: 
I(x0)=−log(p(x0))I(x0)=−log(p(x0)),可以理解为,一个事件发生的概率越大,则它所携带的信息量就越小,而当p(x0)=1p(x0)=1时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。举个例子,小明平时不爱学习,考试经常不及格,而小王是个勤奋学习的好学生,经常得满分,所以我们可以做如下假设: 
事件A:小明考试及格,对应的概率P(xA)=0.1P(xA)=0.1,信息量为I(xA)=−log(0.1)=3.3219I(xA)=−log⁡(0.1)=3.3219 
事件B:小王考试及格,对应的概率P(xB)=0.999P(xB)=0.999,信息量为I(xB)=−log(0.999)=0.0014I(xB)=−log⁡(0.999)=0.0014 
可以看出,结果非常符合直观:小明及格的可能性很低(十次考试只有一次及格),因此如果某次考试及格了(大家都会说:XXX竟然及格了!),必然会引入较大的信息量,对应的II值也较高。而对于小王而言,考试及格是大概率事件,在事件B发生前,大家普遍认为事件B的发生几乎是确定的,因此当某次考试小王及格这个事件发生时并不会引入太多的信息量,相应的II值也非常的低。

2.什么是熵?

那么什么又是熵呢?还是通过上边的例子来说明,假设小明的考试结果是一个0-1分布XAXA只有两个取值{0:不及格,1:及格},在某次考试结果公布前,小明的考试结果有多大的不确定度呢?你肯定会说:十有八九不及格!因为根据先验知识,小明及格的概率仅有0.1,90%的可能都是不及格的。怎么来度量这个不确定度?求期望!不错,我们对所有可能结果带来的额外信息量求取均值(期望),其结果不就能够衡量出小明考试成绩的不确定度了吗。 
即: 
HA(x)=−[p(xA)log(p(xA))+(1−p(xA))log(1−p(xA))]=0.4690HA(x)=−[p(xA)log⁡(p(xA))+(1−p(xA))log⁡(1−p(xA))]=0.4690 
对应小王的熵: 
HB(x)=−[p(xB)log(p(xB))+(1−p(xB))log(1−p(xB))]=0.0114HB(x)=−[p(xB)log⁡(p(xB))+(1−p(xB))log⁡(1−p(xB))]=0.0114 
虽然小明考试结果的不确定性较低,毕竟十次有9次都不及格,但是也比不上小王(1000次考试只有一次才可能不及格,结果相当的确定) 
我们再假设一个成绩相对普通的学生小东,他及格的概率是P(xC)=0.5P(xC)=0.5,即及格与否的概率是一样的,对应的熵: 
HC(x)=−[p(xC)log(p(xC))+(1−p(xC))log(1−p(xC))]=1HC(x)=−[p(xC)log⁡(p(xC))+(1−p(xC))log⁡(1−p(xC))]=1 
其熵为1,他的不确定性比前边两位同学要高很多,在成绩公布之前,很难准确猜测出他的考试结果。 
可以看出,熵其实是信息量的期望值,它是一个随机变量的确定性的度量。熵越大,变量的取值越不确定,反之就越确定。

对于一个随机变量X而言,它的所有可能取值的信息量的期望(E[I(x)]E[I(x)])就称为熵。 
XX的熵定义为: 
H(X)=Eplog1p(x)=−∑x∈Xp(x)logp(x)H(X)=Eplog⁡1p(x)=−∑x∈Xp(x)log⁡p(x) 
如果p(x)p(x)是连续型随机变量的pdf,则熵定义为: 
H(X)=−∫x∈Xp(x)logp(x)dxH(X)=−∫x∈Xp(x)log⁡p(x)dx 
为了保证有效性,这里约定当p(x)→0时,有p(x)logp(x)→0p(x)→0时,有p(x)log⁡p(x)→0 
当X为0-1分布时,熵与概率p的关系如下图: 
这里写图片描述 
可以看出,当两种取值的可能性相等时,不确定度最大(此时没有任何先验知识),这个结论可以推广到多种取值的情况。在图中也可以看出,当p=0或1时,熵为0,即此时X完全确定。 
熵的单位随着公式中log运算的底数而变化,当底数为2时,单位为“比特”(bit),底数为e时,单位为“奈特”。

3.什么是相对熵?

相对熵(relative entropy)又称为KL散度(Kullback-Leibler divergence),KL距离,是两个随机分布间距离的度量。记为DKL(p||q)DKL(p||q)。它度量当真实分布为p时,假设分布q的无效性。 
DKL(p||q)=Ep[logp(x)q(x)]=∑x∈Xp(x)logp(x)q(x)DKL(p||q)=Ep[log⁡p(x)q(x)]=∑x∈Xp(x)log⁡p(x)q(x) 
=∑x∈X[p(x)logp(x)−p(x)logq(x)]=∑x∈X[p(x)log⁡p(x)−p(x)log⁡q(x)] 
=∑x∈Xp(x)logp(x)−∑x∈Xp(x)logq(x)=∑x∈Xp(x)log⁡p(x)−∑x∈Xp(x)log⁡q(x) 
=−H(p)−∑x∈Xp(x)logq(x)=−H(p)−∑x∈Xp(x)log⁡q(x) 
=−H(p)+Ep[−logq(x)]=−H(p)+Ep[−log⁡q(x)] 
=Hp(q)−H(p)=Hp(q)−H(p) 
并且为了保证连续性,做如下约定: 
0log00=0,0log0q=0,plogp0=∞0log⁡00=0,0log⁡0q=0,plog⁡p0=∞ 
显然,当p=qp=q时,两者之间的相对熵DKL(p||q)=0DKL(p||q)=0 
上式最后的Hp(q)Hp(q)表示在p分布下,使用q进行编码需要的bit数,而H(p)表示对真实分布pp所需要的最小编码bit数。基于此,相对熵的意义就很明确了:DKL(p||q)DKL(p||q)表示在真实分布为p的前提下,使用q分布进行编码相对于使用真实分布p进行编码(即最优编码)所多出来的bit数。

4. 什么是交叉熵?

交叉熵容易跟相对熵搞混,二者联系紧密,但又有所区别。假设有两个分布p,qp,q,则它们在给定样本集上的交叉熵定义如下: 
CEH(p,q)=Ep[−logq]=−∑x∈Xp(x)logq(x)=H(p)+DKL(p||q)CEH(p,q)=Ep[−log⁡q]=−∑x∈Xp(x)log⁡q(x)=H(p)+DKL(p||q) 
可以看出,交叉熵与上一节定义的相对熵仅相差了H(p)H(p),当pp已知时,可以把H(p)H(p)看做一个常数,此时交叉熵与KL距离在行为上是等价的,都反映了分布p,q的相似程度。最小化交叉熵等于最小化KL距离。它们都将在p=qp=q时取得最小值H(p)H(p)(p=q时KL距离为0),因此有的工程文献中将最小化KL距离的方法称为Principle of Minimum Cross-Entropy (MCE)或Minxent方法。 
特别的,在logistic regression中, 
p:真实样本分布,服从参数为p的0-1分布,即X∼B(1,p)X∼B(1,p) 
q:待估计的模型,服从参数为q的0-1分布,即X∼B(1,q)X∼B(1,q) 
两者的交叉熵为: 
CEH(p,q)CEH(p,q) 
=−∑x∈Xp(x)logq(x)=−∑x∈Xp(x)log⁡q(x) 
=−[Pp(x=1)logPq(x=1)+Pp(x=0)logPq(x=0)]=−[Pp(x=1)log⁡Pq(x=1)+Pp(x=0)log⁡Pq(x=0)] 
=−[plogq+(1−p)log(1−q)]=−[plog⁡q+(1−p)log⁡(1−q)] 
=−[yloghθ(x)+(1−y)log(1−hθ(x))]=−[ylog⁡hθ(x)+(1−y)log⁡(1−hθ(x))] 
对所有训练样本取均值得: 
−1m∑i=1m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]−1m∑i=1m[y(i)log⁡hθ(x(i))+(1−y(i))log⁡(1−hθ(x(i)))] 
这个结果与通过最大似然估计方法求出来的结果一致。

5.参考链接:

维基百科关于cross-entropy的解释 
交叉熵损失函数 
UFLDL中关于logistic regression的说明 
Kraft’s inequality 
Visual Information

<think>我们正在讨论PyTorch中的CrossEntropyLoss损失函数。用户的问题集中在理解该损失函数在图像分类中的作用和原理。根据引用资料,我们可以总结如下: 1. **作用**:CrossEntropyLoss(交叉熵损失)是分类任务(包括图像分类)中最常用的损失函数之一。它衡量模型预测的概率分布与真实标签分布之间的差异,并指导模型通过反向传播更新权重,使预测结果更接近真实标签[^2][^5]。 2. **原理**:交叉熵源于信息论,描述两个概率分布之间的距离。给定真实分布$p$和预测分布$q$,交叉熵定义为: $$H(p, q) = -\sum_{i} p(i) \log q(i)$$ 在分类任务中: - $p$是**one-hot编码**的真实标签(如类别3对应[0,0,1,...,0]) - $q$是模型输出的**softmax概率分布**(如[0.1, 0.2, 0.7,...,0]) 因此损失计算简化为: $$\text{loss}(x, y) = -\log \left( \frac{\exp(x_y)}{\sum_j \exp(x_j)} \right)$$ 其中$x$是模型最后一层的原始输出(logits),$y$是真实类别索引[^3][^5]。 3. **图像分类中的输入要求**(关键点): - 输入张量形状:`(batch_size, num_classes, ...)`,其中第二维必须是类别数(如ImageNet的1000类)[^4]。 - 标签张量形状:`(batch_size, ...)`,每个元素是类别索引(0~num_classes-1)。例如,对于224x224的RGB图像分类: - 输入:`(16, 1000, 224, 224)` → 实际需调整为`(16, 1000, 1, 1)`(全局平均池化后)或直接`(16, 1000)` - 标签:`(16,)`(16个样本各自的类别编号)[^4]。 4. **内部计算步骤**: **步骤1**:对logits应用softmax获得概率分布(自动完成): $$q_i = \frac{\exp(x_i)}{\sum_j \exp(x_j)}$$ **步骤2**:计算交叉熵(仅考虑真实类别$y$): $$\text{loss} = -\log(q_y)$$ 5. **参数解析**(引用[3]): - `weight`:各类别的权重(处理类别不平衡) - `ignore_index`:忽略特定标签(如-100) - `reduction`:聚合方式("mean"或"sum") - `label_smoothing`:平滑标签(提高泛化性) ### 代码示例 ```python import torch import torch.nn as nn # 模拟图像分类任务(batch_size=2, 类别数=3) logits = torch.tensor([[1.2, 0.4, -0.5], [0.3, 2.1, -1.0]]) # 模型原始输出 labels = torch.tensor([0, 2]) # 真实类别:第一个样本为0类,第二个为2类 loss_fn = nn.CrossEntropyLoss() loss = loss_fn(logits, labels) print(loss) # 输出:tensor(0.7566) # 手动验证(第一个样本) softmax = torch.exp(logits) / torch.exp(logits).sum(dim=1, keepdim=True) # 第一个样本的softmax: [0.5227, 0.3077, 0.1696] loss_manual = -torch.log(softmax[0][0]) # 取真实类别0的概率 -> 0.6485 # 第二个样本同理,最终取平均:(0.6485 + 0.8648)/2 ≈ 0.7566 ``` ### 图像分类注意事项 - **输入维度处理**:若模型输出为4D张量(如CNN的`(batch, classes, H, W)`),需确保标签匹配: - 语义分割中:标签是单通道图像(形状`(batch, H, W)`),每个像素是类别索引[^1] - 图像分类中:通常通过全局池化将特征图转换为`(batch, classes)`再计算损失 > **核心价值**:通过最小化交叉熵,模型被强制学习到**区分不同类别的特征表示**,这是图像分类任务的基础优化目标[^5]。 --- ### §§相关问题§§ 1. 如何处理图像分类中的类别不平衡问题?CrossEntropyLoss的`weight`参数如何配置? 2. 在PyTorch中,如何实现标签平滑(Label Smoothing)?它对模型泛化能力有何影响? 3. 为什么语义分割任务中可以使用CrossEntropyLoss?它与图像分类的损失计算有何异同? 4. 多标签分类任务(如同时识别多个物体)能否使用CrossEntropyLoss?如果不能,应该选择什么损失函数? 5. 从数学角度解释:为什么交叉熵损失可以分解为对数似然的负值?</think>### PyTorch CrossEntropyLoss 在图像分类中的作用与原理 #### 一、核心作用 CrossEntropyLoss(交叉熵损失)是图像分类任务中最常用的损失函数,主要作用包括: 1. **量化预测误差**:衡量模型预测概率分布与真实标签分布的差异程度[^5] 2. **指导优化方向**:通过反向传播为模型提供梯度更新方向 3. **处理分类不确定性**:对"不确定的预测"施加更大惩罚(如正确类别概率0.51 vs 0.99)[^3] 4. **多类别兼容**:天然支持多类别分类任务(如ImageNet的1000类)[^4] #### 二、数学原理 交叉熵源自信息论,描述两个概率分布$p$(真实分布)和$q$(预测分布)之间的"距离": $$H(p, q) = -\sum_{i=1}^{C} p_i \log(q_i)$$ 其中$C$为类别数。 在图像分类中: - $p$是**one-hot编码**的真实标签(如类别3:$[0,0,1,...,0]$) - $q$是**softmax输出的概率分布**(如$[0.1,0.2,0.7,...,0]$) 因此损失简化为($y$为真实类别索引): $$\text{loss} = -\log\left(\frac{\exp(x_y)}{\sum_{j=1}^{C} \exp(x_j)}\right) = -x_y + \log\left(\sum_{j=1}^{C} \exp(x_j)\right)$$ 其中$x$是模型最后一层的原始输出(logits)[^3][^5] #### 三、图像分类中的工作流程 ```mermaid graph LR A[输入图像] --> B[CNN特征提取] B --> C[全连接层输出logits] C --> D[Softmax概率转换] D --> E[CrossEntropy计算] E --> F[梯度反向传播] ``` #### 四、输入输出要求 1. **模型输出**: - 形状:`(batch_size, num_classes, ...)` - 必须是**原始logits**(未经过softmax)[^4] ```python # 正确:输出原始logits model = nn.Sequential( nn.Conv2d(3, 16, 3), nn.Flatten(), nn.Linear(16*224*224, 1000) # 直接输出1000个类别的logits ) ``` 2. **标签格式**: - 形状:`(batch_size, ...)` - 每个元素是**类别索引**(0 ~ num_classes-1) ```python # 图像分类标签示例(batch_size=4) labels = torch.tensor([3, 0, 9, 1]) # 每个数字代表类别索引 ``` #### 五、参数解析(引用[3]) ```python torch.nn.CrossEntropyLoss( weight=None, # 各类别权重(处理不平衡数据) size_average=None, # 已弃用 ignore_index=-100, # 忽略的标签索引 reduce=None, # 已弃用 reduction='mean', # 聚合方式:'mean'/'sum'/'none' label_smoothing=0.0 # 标签平滑系数(默认0) ) ``` #### 六、计算实例(2分类) 假设: - 模型输出logits:`[0.8, -0.5]` - 真实标签:`0`(第一类) 计算过程: 1. Softmax概率: $$q_0 = \frac{e^{0.8}}{e^{0.8} + e^{-0.5}} \approx 0.79, \quad q_1 \approx 0.21$$ 2. 交叉熵损失: $$\text{loss} = -\log(0.79) \approx 0.24$$ 对比错误预测(真实标签为0但预测`[-0.5, 0.8]`): $$\text{loss} = -\log(0.21) \approx 1.56 \quad \text{(惩罚更大)}$$ #### 七、图像分类中的特殊考量 1. **空间维度处理**: - 当输出为特征图时(如分割任务),自动逐像素计算损失[^1] ```python # 语义分割场景:输出[2, 5, 256, 256] 标签[2, 256, 256] loss = CrossEntropyLoss()(output, target) ``` 2. **类别不平衡处理**: ```python # 医疗图像中病变像素占比少 weight = torch.tensor([0.1, 0.9]) # 背景权重0.1,病变权重0.9 criterion = nn.CrossEntropyLoss(weight=weight) ``` 3. **标签平滑**(Label Smoothing): ```python # 缓解过拟合(ε=0.1时,真实标签从1→0.9,其他从0→0.1/(C-1)) criterion = nn.CrossEntropyLoss(label_smoothing=0.1) ``` > **核心价值**:通过最小化预测分布与真实分布的交叉熵,驱动CNN学习判别性特征,最终实现准确的图像分类[^5]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值