Guides

A number of inference strategies make use of an auxiliary distribution which we call a guide distribution. They are specified like so:

sample(dist, {guide: guideFn});

Where guideFn is a function that takes zero arguments, and returns a distribution object.

For example:

sample(Cauchy(params), {
  guide: function() {
    return Gaussian(guideParams);
  }
});

Note that such functions will only be called when using an inference strategy that makes use of the guide.

In some situations, it is convenient to be able to specify part of a guide computation outside of the functions passed to sample. This can be accomplished with the guide function, which takes a function of zero arguments representing the computation:

guide(function() {
  // Some guide computation.
});

As with the functions passed to sample, the function passed to guide will only be called when required for inference.

It’s important to note that guide does not return the value of the computation. Instead, the global store should be used to pass results to subsequent guide computations. This arrangement encourages a programming style in which there is separation between the model and the guide.

Default Guide Distributions

Both optimization and forward sampling from the guide require that all random choices in the model have a corresponding guide distribution. So, for convenience, these methods automatically use an appropriate default guide distribution at any random choice in the model for which a guide distribution is not specified explicitly.

Default guide distributions can also be used with SMC. See the documentation for the importance option for details.

The default guide distribution used at a particular random choice:

  • Is independent of all other guide distributions in the program.
  • Has its type determined by the type of the distribution specified in the model for the random choice.
  • Has each of its continuous parameters hooked up to an optimizable parameter. These parameters are not shared with any other guide distributions in the program.

For example, the default guide distribution for a Bernoulli random choice could be written explicitly as:

var x = sample(Bernoulli({p: 0.5}), {guide: function() {
  return Bernoulli({p: Math.sigmoid(param())});
}});