Pyro изменяет размер дискретной скрытой переменной при использовании сэмплера NUTS (MCMC)

Спасибо, что нашли время прочитать мою проблему, как указано ниже.

Проблема, в которой мне нужна помощь, заключается в том, что размеры моего вывода биномиального распределения изменяются (автоматически) во время второй итерации, когда я запускаю модель с использованием семплера NUTS. Из-за этого оставшаяся часть моего кода (не приведена здесь) выдает ошибку несоответствия размеров. Если я запускаю функцию модели, просто вызывая функцию (без использования Sampler), она отлично работает, даже если я продолжаю вызывать функцию несколько раз. Но это не удается, когда я использую Sampler.

Я воспроизвел проблему, используя меньший и более простой код, как указано ниже (этот код не представляет мой реальный код, но воспроизводит проблему).

  • Пакеты, которые я импортировал:
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 Sampler
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. В приведенном выше коде B принимает A в качестве входных данных. , но B не меняет размер, даже когда A меняет свой размер.

Большое спасибо за помощь.


person rkmalaiya    schedule 04.11.2020    source источник
comment
Наверное, я мог бы использовать Бернулли вместе с биномиальным распределением. Мне действительно нужна матрица из нулей и единиц. Биномиальное распределение принимает матрицу вероятностей, а Бернулли - нет в Pyro / PyTorch. Я подумал, что если я выберу n = 1 в биномиальном распределении, я, вероятно, смогу получить распределение Бернулли в матричной форме.   -  person rkmalaiya    schedule 04.11.2020
comment
Я попробовал только сейчас, и я также могу воспроизвести проблему, используя распределение Бернулли для переменной A.   -  person rkmalaiya    schedule 04.11.2020
comment
Обратите внимание, что правильный тег здесь - pyro.ai; pyro относится к другому (отредактировано).   -  person desertnaut    schedule 07.04.2021


Ответы (1)


Я нашел еще одно обсуждение этого вопроса.

Мне кажется, что проблема в моем коде заключается в том, что NUTS пытаются интегрировать дискретные случайные величины. Следовательно, я не могу применить условный поток, основанный на дискретной случайной величине. Дополнительную информацию см. Здесь: Ошибка NUTS при использовании случайной переменной в потоке управления

person rkmalaiya    schedule 09.11.2020
comment
Кроме того, обсуждение того, почему изменение размеров доступно по этой ссылке на документы pyro: pyro.ai /examples/enumeration.html#Multiple-latent-variables - person rkmalaiya; 10.11.2020