我很好奇为什么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.)
为什么要这样实施?
确实用-100填充了该值。您可以在此处找到相关示例。
这很可能是一种黑客行为,以避免因意外舍入为零而导致的错误。
从技术上讲,
binary_cross_entropy
的输入概率应该由 sigmoid 函数生成,该函数渐进地限制在 (0, 1)
之间。这意味着输入实际上永远不应该为零,但这可能是由于非常小的值的数值精度问题而发生的。