在PyTorch中使用多元正態(tài)分布時,我決定將其與精確的解析表達式進行比較。令我驚訝的是,它們之間存在著微小的差異。這種行為有什么原因嗎?首先,使用 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])他們之間有一個區(qū)別:1 (out_torch - out_exact).sum()Out: tensor(3.7253e-09)有人可以幫助我理解這兩個片段的行為嗎?這兩種表達方式哪個更準確呢?也許有人可以在代碼的任何部分強調(diào)我的錯誤?
1 回答

溫溫醬
TA貢獻1752條經(jīng)驗 獲得超4個贊
大多數(shù)現(xiàn)代系統(tǒng)使用IEEE 754標準來表示固定精度浮點值。因此,我們可以確定 pytorch 提供的結(jié)果或您計算的“精確”值實際上并不完全等于解析表達式。我們知道這一點是因為表達式的實際值肯定是無理數(shù),而 IEEE 754 不能精確地表示任何無理數(shù)。這是使用固定精度浮點表示時的普遍現(xiàn)象.
經(jīng)過進一步分析,我們發(fā)現(xiàn)您看到的歸一化差異約為機器 epsilon 的量級(即3.7253e-09 / 0.0398
約等于torch.finfo(torch.float32).eps
),表明差異可能只是浮點運算不準確的結(jié)果。
為了進一步演示,我們可以編寫一個與您所擁有的數(shù)學(xué)等效的表達式:
out_exact?=?torch.exp(np.log(1/?(2*np.pi*sigma**2))?+?(-torch.pow(values_temp,?2).sum(dim=-1)/2/sigma**2))
這與我當(dāng)前安裝的 pytorch 給出的值完全一致。
添加回答
舉報
0/150
提交
取消