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

溫溫醬
TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
大多數(shù)現(xiàn)代系統(tǒng)使用IEEE 754標(biāo)準(zhǔn)來表示固定精度浮點(diǎn)值。因此,我們可以確定 pytorch 提供的結(jié)果或您計(jì)算的“精確”值實(shí)際上并不完全等于解析表達(dá)式。我們知道這一點(diǎn)是因?yàn)楸磉_(dá)式的實(shí)際值肯定是無理數(shù),而 IEEE 754 不能精確地表示任何無理數(shù)。這是使用固定精度浮點(diǎn)表示時(shí)的普遍現(xiàn)象.
經(jīng)過進(jìn)一步分析,我們發(fā)現(xiàn)您看到的歸一化差異約為機(jī)器 epsilon 的量級(jí)(即3.7253e-09 / 0.0398
約等于torch.finfo(torch.float32).eps
),表明差異可能只是浮點(diǎn)運(yùn)算不準(zhǔn)確的結(jié)果。
為了進(jìn)一步演示,我們可以編寫一個(gè)與您所擁有的數(shù)學(xué)等效的表達(dá)式:
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 給出的值完全一致。
添加回答
舉報(bào)
0/150
提交
取消