How `pyro.plate` works with conditional Independence?

Sorry it is a little difficult for me to understand SVI Part II: Conditional Independence, Subsampling, and Amortization — Pyro Tutorials 1.8.4 documentation .

Copy the paragraph:

def model(data):
    # sample f from the beta prior
    f = pyro.sample("latent_fairness", dist.Beta(alpha0, beta0))
    # loop over the observed data [WE ONLY CHANGE THE NEXT LINE]
    for i in pyro.plate("data_loop", len(data)):
        # observe datapoint i using the bernoulli likelihood
        pyro.sample("obs_{}".format(i), dist.Bernoulli(f), obs=data[i])

At every execution of the body of the for loop we enter a new (conditional) independence context which is then exited at the end of the for loop body. Let’s be very explicit about this:

  • because each observed pyro.sample statement occurs within a different execution of the body of the for loop, Pyro marks each observation as independent
  • this independence is properly a conditional independence given latent_fairness because latent_fairness is sampled outside of the context of data_loop .

Here , does it means latent_fairness doesn’t change in each for i in pyro.plate("data_loop", len(data)): ?
If I use range , latent_fairness would change along with range loop ?

latent_fairness is outside the plate. there is one common value of latent_fairness that is used by all sample statements in the plate.

Do you mean :
1.

for i in range(epoch):
    latent_fairness = model(xi)
    # latent_fairness  change here
    with plate('observe_data'):
           # latent_fairness doesn't change
for i in range(epoch):
    latent_fairness = model(xi)
    # latent_fairness change here
    for i in range(len(data)):
           # latent_fairness change too

And what will happen if I use range ?

i’m afraid i don’t understand what your pseudo code is doing. e.g. what is model(xi)?

It is batch input , each epoch only use one batch .