Hello,

First of all I wanted to thank the people on the Pyro team for creating the GP contrib section. I find it nice and really easy to use. It sets a nice standard for good software to allow researchers to explore GP algorithms - something we desperate need in the GP community.

## Problem

I am trying to verify some things that have been said in this paper (Damianou 2014) for my research. They claim that we can use the BGPLVM model in the case of modeling **uncertain inputs**. So, instead of having deterministic inputs X, the inputs come from a distribution e.g. N(mu_x, Sigma_x).

In the paper, they claim that we can do one of two things:

- Set a prior distribution to X (the model(?) as you call it in Pyro)
- Set a prior distribution to the variational parameter q(X) (or the guide as you call it in Pyro)

I like the example you put in the tutorial (from this paper GrandPrix 2019) as it is something very similar in the sense that you are explicitly putting priors on X. The problem Iâ€™m doing is slightly different as Iâ€™m not reducing the dimensionality but I think itâ€™s a similar situation regardless; I imagine that I just need to finess the priors and which parameters require a grad function. However, Iâ€™m having trouble understanding how we are setting the priors and what exactly they represent within our GPLVM model.

## Code - Setting Priors

Continuing from the tutorial where you set a prior to the `gplvm`

class (`line [6]`

),

```
#...
# we use `.to_event()` to tell Pyro that the prior distribution for X has no batch_shape
gplvm.set_prior("X", dist.Normal(X_prior_mean, 0.1).to_event())
gplvm.autoguide("X", dist.Normal)
```

the `autoguide`

puzzles me a bit as I cannot really understand where to access the parameters. I could be wrong but doing a simple inspection of the model attributes

```
gplvm.mode = 'model'
model_X_loc = gplvm.X_loc.cpu().detach().numpy()
model_X_scale_unconstrained = gplvm.X_scale_unconstrained.cpu().detach().numpy()
```

and similarly a simple inspection of the guide attributes

```
gplvm.mode = 'guide'
guide_X_loc = gplvm.X_loc.cpu().detach().numpy()
guide_X_scale_unconstrained = gplvm.X_scale_unconstrained.cpu().detach().numpy()
```

gives the exact same output

```
assert(model_X_loc.all() == guide_X_loc.all())
assert(model_X_scale_unconstrained.all() == guide_X_scale_unconstrained.all())
```

So my intuition is that I just donâ€™t understand where the parameters are stored in this model nor the guide because if I look at the min, mean and max of the values for the model and the guide

```
print(model_X_loc.min(),
model_X_loc.mean(),
model_X_loc.max())
print(model_X_scale_unconstrained.min(),
model_X_scale_unconstrained.mean(),
model_X_scale_unconstrained.max())
```

they return

```
0.0 0.38005337 1.0
0.0 0.0 0.0
```

which doesnâ€™t make sense to me because we explicitly set the prior to have a 0.1 variance.

## Question

Would anyone be able to help me and give me some more intuition or perhaps point me in the direction of some tutorials about how I can do the following:

- Set a prior distribution to the parameter X
- Constrain the mean and/or variance of the distribution of the prior for X (e.g. positive, zero_grad)
- Set a prior distribution to the parameter q (the guide)
- Constrain the mean and/or variance of the distribution of the prior for the guide (e.g. positive, zero_grad)

Thank you in advanced.

J. Emmanuel Johnson