使用权重手动计算的交叉熵损失

Posted

技术标签:

【中文标题】使用权重手动计算的交叉熵损失【英文标题】:cross entropy loss with weight manual calculation 【发布时间】:2021-10-14 01:03:13 【问题描述】:

您好,只是在玩代码,我得到了交叉熵损失权重实现的意外结果。

pred=torch.tensor([[8,5,3,2,6,1,6,8,4],[2,5,1,3,4,6,2,2,6],[1,1,5,8,9,2,5,2,8],[2,2,6,4,1,1,7,8,3],[2,2,2,7,1,7,3,4,9]]).float()
label=torch.tensor([[3],[7],[8],[2],[5]],dtype=torch.int64)
weights=torch.tensor([1,1,1,10,1,6,1,1,1],dtype=torch.float32)

使用这种样本变量,pytorch 的交叉熵损失为 4.7894

loss = F.cross_entropy(pred, label, weight=weights,reduction='mean')
> 4.7894

我手动实现了如下交叉熵损失代码

one_hot = torch.zeros_like(pred).scatter(1, label.view(-1, 1), 1)
log_prb = F.log_softmax(pred, dim=1)
loss = -(one_hot * log_prb).sum(dim=1).mean()

如果没有权重值,这种实现与 pytorch 的交叉熵函数给出相同的结果。但是有重量值

one_hot = torch.zeros_like(pred).scatter(1, label.view(-1, 1), 1)
log_prb = F.log_softmax(pred, dim=1)
loss = -(one_hot * log_prb)*weights.sum(dim=1).sum()/weights.sum()
> 3.9564

它使用 pytorch 模块(4.7894)给出不同的损失值。 我可以粗略估计我对减肥的理解在这里有些问题,但我无法找出这种差异的确切原因。 有人可以帮我处理这个问题吗?

【问题讨论】:

【参考方案1】:

我发现了问题。这很简单...... 我不应该除以权重的总和。 而不是与wt.sum() (wt=one_hot*weight) 分开得到了我4.7894

>>> wt = one_hot*weights
>>> loss = -(one_hot * log_prb * weights).sum(dim=1).sum() / wt.sum()
4.7894

分母仅与“相关”权重值有关,而不是整体。

【讨论】:

以上是关于使用权重手动计算的交叉熵损失的主要内容,如果未能解决你的问题,请参考以下文章

语义分割损失函数

交叉熵损失函数关于交叉熵损失函数的一些理解

交叉熵损失函数关于交叉熵损失函数的一些理解

如何在 PyTorch 中计算自举交叉熵损失?

交叉熵损失不等于 lgbm 中的二进制对数损失

为啥tf模型训练时的二元交叉熵损失与sklearn计算的不同?