我很好奇为什么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.)
为什么要这样实施?
1条答案
按热度按时间3qpi33ja1#
它确实用-100填充了值。你可以在这里找到一个例子。
这很可能是一个黑客,以避免意外舍入为零所造成的错误。
从技术上讲,
binary_cross_entropy
的输入概率应该由一个sigmoid函数生成,该函数在(0, 1)
之间渐近有界。这意味着输入实际上永远不应该为零,但由于数值精度问题,对于非常小的值,可能会发生这种情况。