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

z0qdvdin  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(121)

我很好奇为什么Pytorch的binary_cross_entropy函数似乎是以计算ln(0)=-100的方式实现的。
从数学Angular 来看,二进制交叉熵函数计算:
H = -[ p_0log(q_0)+ p_1log(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)

字符串
Tensor(75.)
为什么要这样实施?

3qpi33ja

3qpi33ja1#

它确实用-100填充了值。你可以在这里找到一个例子。
这很可能是一个黑客,以避免意外舍入为零所造成的错误。
从技术上讲,binary_cross_entropy的输入概率应该由一个sigmoid函数生成,该函数在(0, 1)之间渐近有界。这意味着输入实际上永远不应该为零,但由于数值精度问题,对于非常小的值,可能会发生这种情况。

相关问题