1

感谢您花时间阅读我的问题,如下所示。

我需要帮助的问题是,当我使用 NUTS 采样器运行模型时,我的二项式分布输出的维度在第二次迭代期间(自动)发生变化。因此,我的其余代码(此处未给出)会引发尺寸不匹配错误。如果我只通过调用函数(不使用采样器)来运行模型函数,它会很好,即使我一直重复调用函数。但是当我使用采样器时它失败了。

我使用如下所述的更小更简单的代码复制了该问题(此代码不代表我的实际代码,但复制了该问题)。

  • 我导入的包:
import pyro
import pyro.distributions as dist
import torch
import pyro.poutine as poutine
from pyro.infer import MCMC, NUTS

Pyro 的版本是 1.5,PyTorch 是 1.7

  • 该模型
def model ():
        
    print("***** Start ****")
    prior = torch.ones(5) / 5
    print("Prior", prior)
    
    a = pyro.sample("a", dist.Binomial(1, prior))
    print("A", a)
    
    b = pyro.sample("b", dist.Binomial(1, a)) 
    print("B", b)
    
    print("***** End *****")
    
    return b

def conditioned_model(model, data):
    print("**** Condition Model **** ")
    return poutine.condition(model, data = {"b":data})()

data = model()
  • 直接调用模型生成模拟数据时的输出
***** Start ****
Prior tensor([0.2000, 0.2000, 0.2000, 0.2000, 0.2000])
A tensor([0., 1., 0., 0., 0.])
B tensor([0., 1., 0., 0., 0.])
***** End *****

  • MCMC 采样器代码
nuts_kernel = NUTS(conditioned_model, jit_compile=False)
mcmc = MCMC(nuts_kernel,
            num_samples=1,
            warmup_steps=1,
            num_chains=1)
mcmc.run(model, data)
  • 运行 MCMC 采样器时的输出(上面的代码)
Warmup:   0%|          | 0/2 [00:00, ?it/s]
**** Condition Model **** 
***** Start ****
Prior tensor([0.2000, 0.2000, 0.2000, 0.2000, 0.2000])
A tensor([1., 0., 0., 0., 1.])
B tensor([0., 1., 0., 0., 0.])
***** End *****
**** Condition Model **** 
***** Start ****
Prior tensor([0.2000, 0.2000, 0.2000, 0.2000, 0.2000])
A tensor([0., 1.])
B tensor([0., 1., 0., 0., 0.])
***** End *****

在上面的输出中,请观察变量A的维度。最初它的大小为 5,后来变为 2。由于我在 DINA 模型中的剩余代码给出了错误。

在上面的代码中,变量A基于先验变量,先验的维度是 5。那么据我所知,A应该始终为 5。请帮助我理解为什么它会变为 2,以及如何避免这种情况发生。

另外,我无法理解的是B的维度始终保持为 5。在上面的代码中,BA作为输入,但即使A改变了维度, B也不会改变维度。

非常感谢您的帮助。

4

1 回答 1

0

我发现另一个关于这个问题的讨论。

在我看来,我的代码中的问题是 NUTS 试图整合离散随机变量。因此,我不能应用基于离散随机变量的条件流。有关更多信息,请参见此处:在控制流中使用随机变量时出现 NUTS 错误

于 2020-11-09T19:21:38.160 回答