在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
提交
取消