Разница между logloss в sklearn и BCEloss в Pytorch?

Если посмотреть на документацию по logloss в Sklearn и BCEloss в Pytorch, они должны быть одинаковыми, т.е. просто обычная потеря журнала с примененными весами. Однако они ведут себя по-разному - как с отягощениями, так и без них. Кто-нибудь может мне это объяснить? Мне не удалось найти исходный код 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.])))

person Peter Alexander    schedule 01.05.2019    source источник
comment
@BramVanroy Это прямо здесь. См. Criterion_test = nn.BCELoss (weight = w) и то же самое с logloss   -  person Peter Alexander    schedule 01.05.2019


Ответы (2)


Что касается вычисления без весов, используя BCEWithLogitsLoss, вы получите тот же результат, что и для _ 2_:

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.])))))

Обратите внимание, что:

Эта потеря объединяет сигмовидный слой и BCELoss в один единственный класс. Эта версия более стабильна в числовом отношении, чем использование простого сигмоида, за которым следует BCELoss, поскольку, комбинируя операции в один слой, мы используем трюк логарифма суммы-экспонирования для обеспечения числовой стабильности.

person sentence    schedule 01.05.2019
comment
Хорошо спасибо. Не знал, что это численно более стабильно. Однако тем временем я обнаружил, что BCELoss по крайней мере не «нормализует» веса внутри, в отличие от log_loss из Sklearn. - person Peter Alexander; 01.05.2019

Собственно, я узнал. Оказывается, BCELoss и log_loss ведут себя по-разному, когда суммы весов больше, чем размер входного массива. Интересно.

person Peter Alexander    schedule 01.05.2019