Hey everyone,
I’m trying to get my head around the plate notation representation with Pyro but unfortunately haven’t been able to understand this from the documentation.
At a high level, I’m trying to model a time-series dataset as a Deep Markov Process where the statistics for transition and emission are parametrized by an NN. This is a multi-task dataset and one of the tasks is to predict a multi-label classification problem at the end (among 25 classes). The inputs are mini-batches of padded time series (just like in the tutorial on DMM) and pheno
represents the binary multi-class labels.
with pyro.plate('X_plate', X.size(1), device=X.device):
for t in range(T_max):
with poutine.mask(mask=(t < L)):
h_t, z_mu, z_log_var = self.transition(z_prev, h_prev)
z_dist = dist.Normal(z_mu, z_log_var.exp()).to_event(1)
z_t = pyro.sample('Z_{}'.format(t + 1), z_dist)
# TODO: How do we decide df?
x_mu, x_log_var = self.emitter(z_t)
x_dist = dist.StudentT(2, x_mu, x_log_var.exp()).to_event(1)
pyro.sample('X_{}'.format(t + 1), x_dist,
obs=X[t, :, :13])
with poutine.mask(mask=(t == L)):
pheno_p = self.pheno(z_t)
pheno_dist = dist.Bernoulli(pheno_p).to_event(1)
pyro.sample('P_{}'.format(t + 1), pheno_dist,
obs=pheno)
h_prev = h_t
z_prev = z_t
I have the following questions:
- Is there a difference between
Normal
andMultivariateNormal
distributions? - At the last time step of each time-series, I would like to solve 25 independent binary classification problems. So, I instantiated the plate notation again with a Bernoulli parametrized by another NN. I’ve specified its independence along the columns of
pheno_p
. Is this the right way to proceed? - Which parameters is
pyro.module
exactly capturing? My NN parameters are not something that I want to be Bayesian about.
Thanks!
EDITS: Upgraded code to Pyro 0.3.0
and limited the scope of questions.