Here’s a minimum working example:
def model(data):
mu = pyro.sample("mu", dist.Beta(1.,1.))
y = pyro.sample( "y", dist.Binomial(total_count = 30, probs = mu), obs = torch.tensor(27.))
def guide(data):
loc = pyro.param('loc', lambda: torch.tensor(0.))
scale = pyro.param('scale', lambda: torch.tensor(1.), constraint=constraints.positive)
logit_mu = pyro.sample("logit_mu", dist.Normal(loc, scale), infer={'is_auxiliary': True})
mu = pyro.sample('mu', dist.Delta(F.sigmoid( logit_mu )))
return({"mu" : mu})
pyro.clear_param_store()
adam = pyro.optim.Adam({"lr": 0.03})
svi = SVI(model, guide, adam, loss=Trace_ELBO() )
losses=[]
for j in range(300):
loss = svi.step(None)
losses.append(loss)
plt.plot(losses)
This runs and converges, but the results don’t look entirely consistent with using an AutoDiagonalNormal guide on mu (from my understanding it should be exactly equivalent). Is my setup missing a Jacobian term? Thanks!