  Compared to the wide array of advanced Monte Carlo methods supported by
modern probabilistic programming languages (PPLs), PPL support for variational
inference (VI) is less developed: users are typically limited to a predefined
selection of variational objectives and gradient estimators, which are
implemented monolithically (and without formal correctness arguments) in PPL
backends. In this paper, we propose a more modular approach to supporting
variational inference in PPLs, based on compositional program transformation.
In our approach, variational objectives are expressed as programs, that may
employ first-class constructs for computing densities of and expected values
under user-defined models and variational families. We then transform these
programs systematically into unbiased gradient estimators for optimizing the
objectives they define. Our design enables modular reasoning about many
interacting concerns, including automatic differentiation, density
accumulation, tracing, and the application of unbiased gradient estimation
strategies. Additionally, relative to existing support for VI in PPLs, our
design increases expressiveness along three axes: (1) it supports an open-ended
set of user-defined variational objectives, rather than a fixed menu of
options; (2) it supports a combinatorial space of gradient estimation
strategies, many not automated by today's PPLs; and (3) it supports a broader
class of models and variational families, because it supports constructs for
approximate marginalization and normalization (previously introduced only for
Monte Carlo inference). We implement our approach in an extension to the Gen
probabilistic programming system (genjax.vi, implemented in JAX), and evaluate
on several deep generative modeling tasks, showing minimal performance overhead
vs. hand-coded implementations and performance competitive with
well-established open-source PPLs.
