理解crossentropy loss

在这里插入图片描述

在这里插入图片描述
input 为 (N,C)维, 其中N为样本个数, C为分类数, 其中值为每个样本在某类上的得分, 注意这里不是概率, 可以为正也可以为负, 也可以大于1, 后面会经过softmax的处理, 统一变成概率的分布
target为N维, 其值为truth groud 的分类值

这个Loss就是正确得分(后面会转成概率)在所有得分所占的比重来确定的, 如果正确的概率为1, 其他都为0的话, 那么 根据上面的公式可得loss为0

然后特别特别重要的一点, 就是送入cross_entropy之前不要进行softmax归一化处理, 否则会训练不出来。因为归一化把信号变弱了, 而且你会发现cross_entropy久久不能为0, 然后可能造成logits为错误的one hot vector, 梯度消失, 参数得不到更新。这个bug耽误了我一年左右的科研时间!!!

### PyTorch 中 CrossEntropyLoss 的计算方法及其输出值含义 #### 定义与作用 `nn.CrossEntropyLoss()` 是一种用于分类任务的损失函数,在多类分类问题中尤为常见。该函数不仅能够衡量预测概率分布与真实标签之间的差异,还内置了 Softmax 激活层的功能[^4]。 #### 计算过程详解 具体来说,对于每一个样本 \(i\),假设共有 \(C\) 类,则 `CrossEntropyLoss` 可表示为: \[ L(i)=− \sum_{c=1}^{C}{y_{ic}\cdot log(\hat{p}_{ic})} \] 其中, - \(y_{ic}\) 表示第 i 个样本属于类别 c 的 ground truth (0 或者 1),当采用 one-hot 编码时; - \(\hat{p}_{ic}\) 则代表模型对该样本属于类别 c 的预测概率; 此公式意味着如果某个特定类别的真值为 1 (\(y_{ic}=1\)) 而对应的预测概率较低的话,那么整个表达式的负对数值将会很大,从而使得最终得到的整体误差增大。反之亦然。 值得注意的是,在实际应用过程中并不需要显式调用 Softmax 函数来转换 logits 值,因为 `nn.CrossEntropyLoss()` 已经包含了这一操作。 #### 输出解释 返回的结果是一个标量张量(scalar tensor),代表着所有训练样例平均后的总损失。这个数值越低越好,因为它表明我们的模型所给出的概率分布更加接近真实的标签分布。 为了更直观理解上述理论描述,下面提供了一个简单的 Python 实现例子: ```python import torch import torch.nn as nn # 创建模拟数据集 output = torch.tensor([[2.0, 1.0, 0.1], [0.5, 2.0, 0.3]], requires_grad=True) target = torch.tensor([0, 1]) # 初始化交叉熵损失对象 criterion = nn.CrossEntropyLoss() # 计算并打印损失值 loss = criterion(output, target) print(f'Loss value is {loss.item()}') ``` 这段代码创建了一组假定来自神经网络最后一层未经过激活函数变换过的输出以及相应的目标索引形式的真实标签,并通过实例化 `nn.CrossEntropyLoss()` 对象来进行损失评估。最后输出的就是这批数据上的平均损失得分[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值