在PyTorch中使用多元正态分布时,我决定将其与精确的解析表达式进行比较。令我惊讶的是,它们之间存在着微小的差异。这种行为有什么原因吗?首先,使用 MultivariateNormal 计算概率:1 from torch.distributions.multivariate_normal import MultivariateNormal2 import torch3 sigma = 24 m = MultivariateNormal(torch.zeros(2, dtype=torch.float32), torch.eye(2, dtype=torch.float32)*sigma**2)5 values_temp = torch.zeros(size=(1,2), dtype=torch.float32)6 out_torch = torch.exp(m.log_prob(values_temp))7 out_torch Out: tensor([0.0398])其次,可以为这种情况写出精确的公式:1 import numpy as np2 out_exact = 1/(2*np.pi*sigma**2) * torch.exp(-torch.pow(values_temp, 2).sum(dim=-1)/(2*sigma**2))3 out_exactOut: tensor([0.0398])他们之间有一个区别:1 (out_torch - out_exact).sum()Out: tensor(3.7253e-09)有人可以帮助我理解这两个片段的行为吗?这两种表达方式哪个更准确呢?也许有人可以在代码的任何部分强调我的错误?
1 回答
温温酱
TA贡献1752条经验 获得超4个赞
大多数现代系统使用IEEE 754标准来表示固定精度浮点值。因此,我们可以确定 pytorch 提供的结果或您计算的“精确”值实际上并不完全等于解析表达式。我们知道这一点是因为表达式的实际值肯定是无理数,而 IEEE 754 不能精确地表示任何无理数。这是使用固定精度浮点表示时的普遍现象.
经过进一步分析,我们发现您看到的归一化差异约为机器 epsilon 的量级(即3.7253e-09 / 0.0398
约等于torch.finfo(torch.float32).eps
),表明差异可能只是浮点运算不准确的结果。
为了进一步演示,我们可以编写一个与您所拥有的数学等效的表达式:
out_exact = torch.exp(np.log(1/ (2*np.pi*sigma**2)) + (-torch.pow(values_temp, 2).sum(dim=-1)/2/sigma**2))
这与我当前安装的 pytorch 给出的值完全一致。
添加回答
举报
0/150
提交
取消