sklearn中的logloss和Pytorch中的BCEloss之间的区别?

Posted

技术标签:

【中文标题】sklearn中的logloss和Pytorch中的BCEloss之间的区别?【英文标题】:Difference between logloss in sklearn and BCEloss in Pytorch? 【发布时间】:2019-09-19 20:17:43 【问题描述】:

查看 Sklearn 中的 logloss 和 Pytorch 中的 BCEloss 的文档,这些应该是相同的,即只是应用了权重的正常 log loss。但是,它们的行为不同 - 无论是否应用了权重。谁能给我解释一下?我找不到 BCEloss 的源代码(内部引用 binary_cross_entropy)。

input = torch.randn((3, 1), requires_grad=True)
target = torch.ones((3, 1), requires_grad=False)
w = torch.randn((3, 1), requires_grad=False)

# ----- With weights
w = F.sigmoid(w)
criterion_test = nn.BCELoss(weight=w)
print(criterion_test(input=F.sigmoid(input), target=F.sigmoid(target)))
print(log_loss(y_true=target.detach().numpy(), 
               y_pred=F.sigmoid(input).detach().numpy(), sample_weight=w.detach().numpy().reshape(-1), labels=np.array([0.,1.])))
print("")
print("")
# ----- Without weights
criterion_test = nn.BCELoss()
print(criterion_test(input=F.sigmoid(input),target=F.sigmoid(target)))
print(log_loss(y_true=target.detach().numpy(), 
               y_pred=F.sigmoid(input).detach().numpy(), labels=np.array([0.,1.])))

【问题讨论】:

@BramVanroy 它就在那里。参见criteria_test = nn.BCELoss(weight=w) 和logloss一样 【参考方案1】:

关于没有权重的计算,使用BCEWithLogitsLoss 你会得到与sklearn.metrics.log_loss 相同的结果:

import torch
import torch.nn as nn
from sklearn.metrics import log_loss
import numpy as np

input = torch.randn((3, 1), requires_grad=True)
target = torch.ones((3, 1), requires_grad=False)

# ----- Without weights
criterion = torch.nn.BCEWithLogitsLoss()
criterion(input, target)
print(':.6f'.format(criterion(input, target)))
print(':.6f'.format((log_loss(y_true=target.detach().numpy(),
                                y_pred=torch.sigmoid(input).detach().numpy(),
                                labels=np.array([0.,1.])))))

注意:

这种损失将 Sigmoid 层和 BCELoss 组合在一个单一的 班级。这个版本比使用普通版本在数值上更稳定 Sigmoid 后跟 BCELoss as,通过将操作组合成一个 层,我们利用 log-sum-exp 技巧来计算数值 稳定性。

【讨论】:

好的,谢谢。不知道那是更稳定的数值。然而,与此同时,我发现 BCELoss 至少不会在内部“标准化”权重,而来自 Sklearn 的 log_loss 会。【参考方案2】:

其实我发现了。事实证明,当权重总和大于输入数组的维度时,BCELoss 和 log_loss 的行为会有所不同。有趣的。

【讨论】:

以上是关于sklearn中的logloss和Pytorch中的BCEloss之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

多个类的 tf.losses.logloss

pytorch和sklearn哪个运行快

如何在sklearn中获得逻辑回归模型的对数似然?

使用 pytorch 和 sklearn 对 MNIST 数据集进行交叉验证

PyTorch+sklearn划分训练集/验证集

PyTorch 中的高效指标评估