Skip to content

Instantly share code, notes, and snippets.

@beckermr
Created September 25, 2018 15:59
Show Gist options
  • Save beckermr/f3e18965393207f961064e2fa1392adb to your computer and use it in GitHub Desktop.
Save beckermr/f3e18965393207f961064e2fa1392adb to your computer and use it in GitHub Desktop.
VI Notes
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# A Hacker's Introduction to Variational Inference \n",
"\n",
"## Matthew R. Becker, ANL\n",
"\n",
"\n",
"### Note: This tutorial is based on this [blog post](https://www.civisanalytics.com/blog/variational-inference-ground/)\n",
"\n",
"Most statistical constraints on cosmological parameters are computed via Bayesian techniques. The central statistical quantity is the posterior distribution\n",
"\n",
"$$P(\\Theta|\\mathrm{data}) \\propto {\\cal L}(\\mathrm{data}|\\Theta) P(\\Theta)$$\n",
"\n",
"The posterior is probability density function (PDF) and is proportional to the product of the likelihood ${\\cal L}(\\mathrm{data}|\\Theta)$ and the prior $P(\\Theta)$. \n",
"\n",
"The final analysis usually involves computing a high-dimensional integral over a subset $\\Psi$ of the parameter space $\\Theta$. \n",
"\n",
"$$P(\\Phi|\\mathrm{data}) \\propto \\int {\\cal L}(\\mathrm{data}|\\Phi, \\Psi) P(\\Phi, \\Psi) d\\Psi$$\n",
"\n",
"where $\\Theta = \\Phi \\cup \\Psi$. In the jargon of cosmologists (and others), we *marginalize* over nuisance parameters $\\Psi$.\n",
"\n",
"As we all know, computing high-dimensional integrals is hard. To date, the most successful technique for doing this has been to apply Markov Chain Monte Carlo techniques to the posterior. Once we have obtained a sample of draws from the posterior, we can then use Monte Carlo integration to compute the integrals of interest.\n",
"\n",
"### So what is VI exactly and what might we do with it?\n",
"\n",
"I personally define variational inference (VI) as a set of techniques which aim to find an approximate representations \n",
"of PDFs. The central questions in VI are \n",
"\n",
"1. What do we mean by the statement that one PDF approximates another?\n",
"2. How do we compute such approximations efficiently?\n",
"\n",
"How do we apply this to our statistical inference problem above? Well, suppose we have an approximation $Q(\\Theta)$ of the posterior $P(\\Theta|\\mathrm{data})$ and further suppose that making draws from this approximation is numerically efficient. Then we could approximate integrals over the posterior by performing Monte Carlo integration using draws from $Q(\\Theta)$. \n",
"\n",
"Now that we have a better idea of where VI might fit into our standard practices for statistical inference, let's take a pass at providing answers to the two questions above."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import copy\n",
"import time\n",
"import scipy.special\n",
"import scipy.optimize\n",
"import scipy.stats\n",
"\n",
"%matplotlib notebook\n",
"sns.set()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Some Preliminaries\n",
"\n",
"As a running example, I am going to attempt to approximate a one-dimensional unit Student's-t distribution with a one-dimensional Gaussian distribution. In the plot below, I have put in an approximate guess for the right parameters of the Gaussian, mean zero and standard deviation $\\exp(0.15)$."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"NU = 3\n",
"NU_NORM = scipy.special.gammaln((NU + 1)/2) - scipy.special.gammaln(NU/2) - 0.5 * np.log(NU*np.pi)\n",
"\n",
"def logp(z):\n",
" \"\"\"log of students-t dist.\"\"\"\n",
" return -0.5 * (NU+1) * np.log(1 + z*z/NU) + NU_NORM\n",
" \n",
"def logq(z, mu, lnsigma):\n",
" \"\"\"log of Gaussian parameterized by mean and log(sigma)\"\"\"\n",
" sigma = np.exp(lnsigma)\n",
" return -0.5 * ((z - mu) / sigma) ** 2 - lnsigma - 0.5*np.log(2.0 * np.pi)\n",
"\n",
"z = np.linspace(-5.0, 5.0, 1000)\n",
"pz = np.exp(logp(z))\n",
"qz = np.exp(logq(z, 0, 0.15))\n",
"\n",
"plt.figure(figsize=(8, 6))\n",
"plt.plot(z, pz, label='p(z) Student\\'s-t')\n",
"plt.plot(z, qz, label='q(z) Gaussian')\n",
"plt.xlabel('z')\n",
"plt.ylabel('PDF')\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## VI I: The Laplace Approximation\n",
"\n",
"One way to approximate a PDF would be to perform a brute-force Taylor expansion, attempting to match its value and some set of derivatives at a given point. If we pick a local maximum in the PDF and apply this expansion to the logarithm of the PDF to second order, we get what some people call the *Laplace approximation*. Note that the Laplace approximation is roughly equivalent to fitting a multidimensional Gaussian to a peak of the posterior.\n",
"\n",
"For our problem, we can apply this technique in two steps. First we find the maximum of the PDF and then second we use finite-differencing to compute the derivatives of the Taylor expansion."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 1.000889\n",
" Iterations: 24\n",
" Function evaluations: 48\n",
" final_simplex: (array([[ 0.00000000e+00],\n",
" [-7.62939453e-05]]), array([1.00088885, 1.00088885]))\n",
" fun: 1.0008888496235098\n",
" message: 'Optimization terminated successfully.'\n",
" nfev: 48\n",
" nit: 24\n",
" status: 0\n",
" success: True\n",
" x: array([0.])\n",
"z_max : 0.0\n",
"lnsigma: -0.14377445978237235\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def second_deriv(logp, z, h):\n",
" \"\"\"compute second deriv with finite diff stencil at second order\n",
" \n",
" See https://en.wikipedia.org/wiki/Finite_difference.\n",
" \"\"\"\n",
" fzph = logp(z + h)\n",
" fzmh = logp(z - h)\n",
" fz = logp(z)\n",
" return (fzph - 2*fz + fzmh) / h**2\n",
"\n",
"\n",
"def laplace_apprx(logp, z_start):\n",
" \"\"\"compute a laplace approx to a 1d pdf\n",
" \n",
" returns mean, lnsigma of the approximate Gaussian\n",
" \"\"\"\n",
" # First find max.\n",
" z_max = scipy.optimize.minimize(lambda z: -logp(z), z_start,\n",
" method='Nelder-Mead',\n",
" options={'disp': True})\n",
" print(z_max)\n",
" z_max = z_max['x'][0]\n",
"\n",
" # Now do finite diff. \n",
" # Set the stepsize by large of 1e-6 of z_max or 1e-6\n",
" eps = 1e-6\n",
" h = max(np.abs(z_max * eps), eps)\n",
" \n",
" # Get hessian and compute log(sigma).\n",
" hess = second_deriv(logp, z_max, h)\n",
" lnsigma = 0.5 * np.log(-1.0 / hess)\n",
" return z_max, lnsigma\n",
"\n",
"mu, lnsigma = laplace_apprx(logp, 100.0)\n",
"print(\"z_max :\", mu)\n",
"print(\"lnsigma:\", lnsigma)\n",
"\n",
"z = np.linspace(-5.0, 5.0, 1000)\n",
"pz = np.exp(logp(z))\n",
"qz = np.exp(logq(z, mu, lnsigma))\n",
"\n",
"plt.figure(figsize=(8, 6))\n",
"plt.plot(z, pz, label='p(z) Student\\'s-t')\n",
"plt.plot(z, qz, label='q(z) Gaussian')\n",
"plt.xlabel('z')\n",
"plt.ylabel('PDF')\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice the shape of the peak matches closely, but the approximation is poor in the wings of the PDF."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## VI II: The KL Divergence"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we talk more about VI, let's introduce the Kullback–Leibler divergence or \n",
"KL divergence. This quantity is defined for PDFs $q(z)$ and $p(z)$\n",
"\n",
"$$D_{KL}(Q||P) = \\int q(z)\\log q(z)p(z)dz$$ .\n",
"\n",
"An extremely important property of the KL divergence is known as the Gibbs' inequality,\n",
"\n",
"$$D_{KL}(Q||P) \\ge 0$$\n",
" \n",
"with equality when $p(z)=q(z)$. Note also that it is not symmetric in its arguments. The KL divergence is a way to measure the difference between PDFs.\n",
"\n",
"We can now do a standard set of manipulations on the KL divergence to derive a quantity known as the evidence lower bound or ELBO. We start by introducing data $D$ and noting that since $p(z,D) = p(z|D)p(D)$ \n",
"\n",
"$$\\log p(z|D) = \\log p(z,D) - \\log p(D)$$.\n",
"\n",
"Then we get\n",
"\n",
"$$D_{KL}(Q||P) = \\int q(z)\\log q(z)dz + \\int q(z)[\\log p(D) - \\log p(D|z)p(z)]dz$$.\n",
" \n",
"After moving terms around a bit and noting that $p(D)$ is constant with respect to $z$ and any parameters $ϕ$ in $q(z)$, we get\n",
"\n",
"$$\\log p(D)= D_{KL}(Q||P) + \\int q(z)\\log p(D|z)p(z)dz - \\int q(z)\\log q(z)dz \\equiv D_{KL}(Q||P) + \\mathrm{ELBO}(Q)$$\n",
" \n",
"where\n",
"\n",
"$$\\mathrm{ELBO}(Q) = \\int q(z)\\log p(D|z)p(z)dz - \\int q(z)\\log q(z)dz$$\n",
" \n",
"and we used the fact that\n",
"\n",
"$$\\int q(z)\\log p(D)dz = \\log p(D) \\int q(z)dz = \\log p(D)$$\n",
" \n",
"The second term in the ELBO\n",
"\n",
"$$h(z)=-\\int q(z)\\log q(z)dz$$\n",
" \n",
"is know as the **differential entropy**. It turns out that distributions which allow you to compute the differential entropy analytically (or quickly) make for particularly easy and numerically efficient VI algorithms. This fact motivates the use of Gaussian distributions in one or more dimensions in many VI algorithms.\n",
"\n",
"Finally, since the **evidence**, $p(D)$, is constant with respect to $q(z)$ and its parameters $\\phi$, maximizing the ELBO is equivalent to minimizing the KL divergence.\n",
"\n",
"Here is our Student's-t example redone by minimizing the KL divergence."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 0.040695\n",
" Iterations: 56\n",
" Function evaluations: 108\n",
" final_simplex: (array([[-4.26771590e-06, 2.31270951e-01],\n",
" [ 5.19733032e-05, 2.31261077e-01],\n",
" [ 5.67321110e-05, 2.31314504e-01]]), array([0.04069546, 0.04069546, 0.04069546]))\n",
" fun: 0.04069545533493302\n",
" message: 'Optimization terminated successfully.'\n",
" nfev: 108\n",
" nit: 56\n",
" status: 0\n",
" success: True\n",
" x: array([-4.26771590e-06, 2.31270951e-01])\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def kl_vi(logp, n, mu_start, lnsigma_start):\n",
" \"\"\"vi with KL divergence\"\"\"\n",
" phi_start = np.array([mu_start, lnsigma_start])\n",
" \n",
" # Objective function. Computes the KL div of q and p.\n",
" def obj(phi):\n",
" # This term is -\\int q*log(q).\n",
" # Also known as the differential entropy.\n",
" # For a Gaussian, it can be computed exactly. \n",
" # See wikipedia or something.\n",
" entropy = phi[1] + 0.5*np.log(2.0 * np.pi) + 0.5\n",
"\n",
" # This is the grid, factor of 20 is a random choice.\n",
" _sigma = np.exp(phi[1]) # get sigma \n",
" z = np.linspace(phi[0] - 20.0*_sigma , phi[0] + 20.0*_sigma, n)\n",
" dz = z[1] - z[0] # factor needed for numerical integral\n",
" \n",
" # This term is \\int q*log(p)\n",
" logqz = logq(z, phi[0], phi[1])\n",
" qz = np.exp(logqz)\n",
"\n",
" return -entropy - np.sum(qz * logp(z) * dz)\n",
"\n",
" # Run the optimizer.\n",
" phi_hat = scipy.optimize.minimize(obj, phi_start,\n",
" method='Nelder-Mead',\n",
" options={'disp': True})\n",
" print(phi_hat)\n",
" return phi_hat['x'], phi_hat\n",
"\n",
"phi_hat, res = kl_vi(logp, 10000, 1.0, 0.0)\n",
"\n",
"z = np.linspace(-5.0, 5.0, 1000)\n",
"pz = np.exp(logp(z))\n",
"qz = np.exp(logq(z, phi_hat[0], phi_hat[1]))\n",
"\n",
"plt.figure(figsize=(8, 6))\n",
"plt.plot(z, pz, label='p(z) Student\\'s-t')\n",
"plt.plot(z, qz, label='q(z) Gaussian')\n",
"plt.xlabel('z')\n",
"plt.ylabel('PDF')\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Mean-field VI\n",
"\n",
"One natural route to take next is to specify some functional form for $q(z)$ and proceed to minimize the KL divergence directly. For PDFs in the exponential family, if we assume that $q(z)$ factorizes over $z$, then we can use the calculus of variations to derive sets of equations whose roots define a **mean-field approximation** to the PDF. This procedure is of course quite useful, but I am going to focus on numerical algorithms for arbitrary PDFs here.\n",
"\n",
"### Automated VI\n",
"\n",
"**Automatic differentiation variational inference** (ADVI) was introduced by [Kucukelbir et al.](https://arxiv.org/abs/1506.03431). It uses a Gaussian mean-field approximation for $q(z)$ along with the **reparametrization trick** to derive an expression for the ELBO that is amenable to gradient-based optimizers. One of the interesting properties of the family of ADVI algorithms is that they can operate on small batches of data as opposed to all of the data at once."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Better Variational Approximations\n",
"\n",
"Above we used a single Gaussian for $q(z)$. In more than one dimension, a Gaussian mean-field variational approximation (i.e., each parameter gets its own Gaussian) is very common and simple. However, this PDF is not terribly flexible. Lots of people have been thinking about better ways to do automated VI. Here are a few things to go read about on your own.\n",
"\n",
"* [Normalizing Flows](https://arxiv.org/abs/1505.05770): This method uses a specialized neural network to construct the variational approximation. It has the advantage of being able to represent arbitrarily complicated PDFs.\n",
"\n",
"* Full-rank VI: This method replaces the Gaussian mean-field approximation with multivariate Gaussian variational approximation. It is described in the original paper on ADVI.\n",
"\n",
"* [Stein Variational Inference](https://arxiv.org/abs/1608.04471): This method actually works to generate individual samples from the PDF but does not use MCMC. Instead it transforms these samples to have the proper PDF using gradient descent. Unlike the other methods discussed above, it does not result in a closed-form variational approximation. However, it is more closely related to VI as opposed to MCMC. A great demo of Stein VI is [here](https://chi-feng.github.io/mcmc-demo/app.html#SVGD,banana)."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda root]",
"language": "python",
"name": "conda-root-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment