Pytorch 的 `binary_cross_entropy` 似乎实现了 ln(0) = -100。为什么?

问题描述 投票:0回答:1

我很好奇为什么Pytorch的

binary_cross_entropy
函数似乎是以这样的方式实现的来计算ln(0) = -100。

二元交叉熵函数从数学角度计算:

H = -[ p_0*log(q_0) + p_1*log(q_1) ]

在 pytorch 的

binary_cross_entropy
函数中,
q
是第一个参数,
p
是第二个参数。

现在假设我做

p = [1,0]
q = [0.25, 0.75]
。在本例中,
F.binary_cross_entropy(q,p)
如预期返回:-ln(0.25) = 1.386。

如果我们反转函数参数并尝试

F.binary_cross_entropy(p,q)
,这应该会返回错误,因为我们会尝试计算 -0.75*ln(0),而 ln(0) 处于极限 -无穷大内。

尽管如此,如果我这样做

F.binary_cross_entropy(p,q)
,它会给我 75 作为答案(见下文):

> import torch.nn.functional as F 
> pT = torch.Tensor([1,0]) 
> qT =torch.Tensor([0.25,0.75]) 
> F.binary_cross_entropy(pT,qT)

张量(75.)

为什么要这样实施?

pytorch tensor cross-entropy natural-logarithm
1个回答
0
投票

确实用-100填充了该值。您可以在此处找到相关示例。

这很可能是一种黑客行为,以避免因意外舍入为零而导致的错误。

从技术上讲,

binary_cross_entropy
的输入概率应该由 sigmoid 函数生成,该函数渐进地限制在
(0, 1)
之间。这意味着输入实际上永远不应该为零,但这可能是由于非常小的值的数值精度问题而发生的。

© www.soinside.com 2019 - 2024. All rights reserved.