Octave -inf and NaN



我搜索了论坛并找到了这个线程,但它没有涵盖我的问题 绕过 -inf 的两种方式

在第 3 周的机器学习课上,我在使用log(0)-inf,后来变成了NaNNaN导致在求和公式中没有给出答案,因此没有标量表示J(矩阵数学的结果的成本函数(。

这是对我的功能的测试

>> sigmoid([-100;0;100])
ans =
3.7201e-44
5.0000e-01
1.0000e+00

这是意料之中的。 但假设需要ans = 1-sigmoid

>> 1-ans
ans =
1.00000
0.50000
0.00000

日志 (0( 给出-Inf

>> log(ans)
ans =
0.00000
-0.69315
-Inf

-Inf行不添加到成本函数中,但-Inf延续到NaN,我没有得到结果。我找不到任何关于-Inf的材料,但我认为我的 S 形函数有问题。

你能提供任何方向吗?

在这些情况下避免无穷大的典型方法是在操作数中添加eps

log(ans + eps)

eps是一个非常非常小的值,并且不会影响ans值的输出,除非ans为零:

>> z = [-100;0;100];
>> g = 1 ./ (1+exp(-z));
>> log(1-g + eps)
ans =
0.0000
-0.6931
-36.0437

除了这里的答案之外,我真的希望你能为你的问题提供更多的背景(特别是,你实际上想做什么。

我会出去猜测上下文,以防万一这很有用。您可能正在进行机器学习,并尝试根据模型的负对数可能性定义成本函数,然后尝试对其进行微分以找到此成本最小点。

一般来说,对于一个符合克伦威尔规则的具有有用可能性的合理模型,你不应该有这些问题,但在实践中它发生了。并且大概在尝试计算零概率的负对数可能性的过程中,您得到 inf,并尝试计算两点之间的差异会产生 inf/inf = nan。

在这种情况下,这是一个"边缘情况",通常在计算机科学中,边缘情况需要被发现为特殊情况并得到适当处理。现实情况是,您可以合理地预期 inf 不会是函数的最小值!因此,无论是将其从计算中删除,还是将其替换为非常大的数字(无论是任意还是通过机器精度(都不会真正产生影响。

因此,在实践中,您可以执行其他人建议的两件事中的任何一件,甚至可以只是检测此类实例并从计算中跳过它们。实际结果应该是相同的。

-inf 表示负无穷大。这是正确的答案,因为根据定义,(0(的对数是负无穷大。

最简单的方法是检查您的中间结果,如果数字低于某个阈值(如 1e-12(,则只需将其设置为该阈值即可。答案不会是完美的,但它们仍然非常接近。

使用以下函数作为 sigmoid 函数:

function g = sigmoid(z)
g = 1 ./ (1 + e.^-z);
end

然后,以下代码运行没有问题。选择"max"语句中的阈值,使其小于测量中的预期噪声,然后您就可以开始了

>> a = sigmoid([-100, 0, 100])
a =
3.7201e-44   5.0000e-01   1.0000e+00
>> b = 1-a
b =
1.00000   0.50000   0.00000
>> c = max(b, 1e-12)
c =
1.0000e+00   5.0000e-01   1.0000e-12
>> d = log(c)
d =
0.00000   -0.69315  -27.63102

最新更新