简单谈谈Cross Entropy Loss

本文探讨了交叉熵损失函数在分类问题中的作用,解释了为什么不用分类错误作为损失,并对比了与均方误差的区别。通过具体例子展示了交叉熵如何更准确地描述模型与理想模型之间的差距。此外,还介绍了在TensorFlow中实现交叉熵损失的常见方法,以及为什么回归问题通常使用均方误差。

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

写在前面

分类问题和回归问题是监督学习的两大种类:分类问题的目标变量是离散的;回归问题的目标变量是连续的数值。
神经网络模型的效果及优化的目标是通过损失函数来定义的。

回归问题解决的是对具体数值的预测。比如房价预测、销量预测等都是回归问题。这些问题需要预测的不是一个事先定义好的类别,而是一个任意实数。解决回顾问题的神经网络一般只有一个输出节点,这个节点的输出值就是预测值。对于回归问题,常用的损失函数是均方误差( MSE,mean squared error )。

分类问题常用的损失函数为交叉熵( Cross Entropy Loss)。

这篇博客我们简单谈谈交叉熵损失函数。


交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。[关于交叉熵的原理,我这有一篇简单明白的博客]

尽管交叉熵刻画的是两个概率分布之间的距离,但是神经网络的输出却不一定是一个概率分布。为此我们常常用Softmax回归将神经网络前向传播得到的结果变成概率分布。

softmax常用于多分类过程中,它将多个神经元的输出,归一化到( 0, 1) 区间内,因此Softmax的输出可以看成概率,从而来进行多分类。

假设我们有一个包含k个元素的数组V, i i 表示V中的第 i 个元素,那么这 i i 个元素的softmax输出就是:

S i = e i j = 1 k e j

为了举一个具体例子,特意盗了一张图,如下:[关于Softmax更简单明白的原理阐述,特意负责任地推荐我这篇博客]

这里写图片描述

:在TensorFlow中使用Cross Entropy Loss时,主要是使用tf.nn.softmax_cross_entropy_with_logits这类函数,但这类函数需要输入的是未经过Softmax的Logits。而所谓的unscaled logits就可以粗略理解为没有经过Softmax的变量。这一点要与数学上的logits ( 一个事件发生与该事件不发生的比值的对数) 进行区分。

进入主题

简单复习了Softmax,开始进入主题:损失函数为什么要用Cross Entropy Loss。

出于直觉,人们会觉得可以使用classification error来做损失函数:

classificationerr
### 关于 PyTorch 中 CrossEntropyLoss实现与应用 在机器学习领域,`CrossEntropyLoss` 是一种常用的损失函数,尤其适用于分类任务。它结合了 `LogSoftmax` 和 `Negative Log Likelihood (NLL)` 损失[^3]。以下是关于其具体实现和使用的详细介绍: #### 1. **PyTorch 中 CrossEntropyLoss 的定义** `torch.nn.CrossEntropyLoss` 是 PyTorch 提供的一个类,用于计算输入张量和目标之间的交叉熵损失。该方法内部实现softmax 函数以及负对数似然损失的组合操作。 ```python import torch import torch.nn as nn criterion = nn.CrossEntropyLoss() ``` 上述代码片段展示了如何实例化一个 `CrossEntropyLoss` 对象。需要注意的是,此函数期望未经缩放的原始分数(logits),而不是经过 softmax 处理后的概率分布[^4]。 --- #### 2. **典型应用场景** 假设我们正在处理一个多类别分类问题,其中模型输出是一个大小为 `[batch_size, num_classes]` 的 logits 张量,而标签则是一个形状为 `[batch_size]` 的整型张量,表示每一批次样本的真实类别索引。 ```python # 假设 batch size 为 3,num classes 为 5 outputs = torch.randn(3, 5, requires_grad=True) # 随机初始化 logits labels = torch.tensor([1, 0, 4]) # 真实标签 loss = criterion(outputs, labels) print(f'Computed Loss: {loss.item()}') ``` 在此示例中,`nn.CrossEntropyLoss` 自动执行以下两步: - 应用 Softmax 转换到 `outputs` 上; - 计算并返回 NLL 损失值。 因此,在使用 `CrossEntropyLoss` 时无需手动调用 `softmax()` 方法[^5]。 --- #### 3. **自定义权重调整** 如果数据集中某些类别的样本数量较少,则可以通过设置参数 `weight` 来平衡不同类别的贡献度。 ```python weights = torch.tensor([1.0, 2.0, 1.0, 1.5, 0.5]) weighted_criterion = nn.CrossEntropyLoss(weight=weights) loss_with_weights = weighted_criterion(outputs, labels) print(f'Weighted Loss: {loss_with_weights.item()}') ``` 通过这种方式可以缓解因类别不平衡而导致的训练偏差问题[^6]。 --- #### 4. **忽略特定索引** 当存在未标注的数据或者希望跳过某些预测结果时,可利用 `ignore_index` 参数指定这些特殊位置不会参与最终的误差累积过程。 ```python ignored_criterion = nn.CrossEntropyLoss(ignore_index=-100) modified_labels = torch.tensor([1, -100, 4]) # 将第二个样例标记为忽略项 (-100) loss_ignoring_some = ignored_criterion(outputs, modified_labels) print(f'Ignored Index Loss: {loss_ignoring_some.item()}') ``` 这里 `-100` 表明对应条目应被排除在外[^7]。 --- #### 5. **与其他框架对比** 相较于 TensorFlow,虽然两者都支持类似的交叉熵功能,但在灵活性方面各有千秋。例如,PyTorch 更适合快速原型开发研究项目;而对于大规模分布式部署场景来说,TensorFlow 可能更具优势[^8]。 --- ### 总结 综上所述,`CrossEntropyLoss` 不仅简化了多分类任务中的复杂流程,还提供了丰富的配置选项来满足实际需求下的各种特殊情况处理要求。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值