Hi @jeffmax, I was able to get your snippet running by:
- applying @jpchen’s suggestion of adding
.independent(1)
- replacing the
.apply_()
with an affine sum (I’m not sure how the.apply_()
worked) - constraining the beta parameters to be positive and initializing with smaller values
def complete_model_tensor():
alpha0 = torch.ones(48) * 2.5
beta0 = torch.ones(48) * 7.5
guess_probs = pyro.sample('guess_prob',
dist.Beta(alpha0, beta0).independent(1))
with pyro.plate("participants", 22):
skills = []
for i in pyro.plate("skills", 7):
skills.append(pyro.sample("skill_{}".format(i),
dist.Bernoulli(0.5),
infer={"enumerate": "parallel"}))
for q in pyro.plate("questions", 48):
has_skills = reduce(operator.mul,
[skills[i] for i in skills_needed[q]]).float()
prob_correct = has_skills * (1 - prob_mistake) + (1 - has_skills) * guess_probs[q]
pyro.sample("isCorrect{}".format(q),
dist.Bernoulli(prob_correct))
def complete_model_tensor_guide():
guess_prob_a = pyro.param('guess_prob_a', torch.ones(48) * 4,
constraint=constraints.positive)
guess_prob_b = pyro.param('guess_prob_b', torch.ones(48) * 4,
constraint=constraints.positive)
guess_probs = pyro.sample('guess_prob',
dist.Beta(guess_prob_a , guess_prob_b).independent(1))
Does that look correct to you?