{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Variational inference in Bayesian neural networks\n", "\n", "This article demonstrates how to implement and train a Bayesian neural network with Keras following the approach described in [Weight Uncertainty in Neural Networks](https://arxiv.org/abs/1505.05424) (*Bayes by Backprop*). The implementation is kept simple for illustration purposes and uses Keras 2.2.4 and Tensorflow 1.12.0. For more advanced implementations of Bayesian methods for neural networks consider using [Tensorflow Probability](https://www.tensorflow.org/probability), for example.\n", "\n", "Bayesian neural networks differ from plain neural networks in that their weights are assigned a probability distribution instead of a single value or point estimate. These probability distributions describe the uncertainty in weights and can be used to estimate uncertainty in predictions. Training a Bayesian neural network via variational inference learns the parameters of these distributions instead of the weights directly.\n", "\n", "## Probabilistic model\n", "\n", "A neural network can be viewed as probabilistic model $p(y \\lvert \\mathbf{x},\\mathbf{w})$. For classification, $y$ is a set of classes and $p(y \\lvert \\mathbf{x},\\mathbf{w})$ is a categorical distribution. For regression, $y$ is a continuous variable and $p(y \\lvert \\mathbf{x},\\mathbf{w})$ is a Gaussian distribution. \n", "\n", "Given a training dataset $\\mathcal{D} = \\left\\{\\mathbf{x}^{(i)}, y^{(i)}\\right\\}$ we can construct the likelihood function $p(\\mathcal{D} \\lvert \\mathbf{w}) = \\prod_i p(y^{(i)} \\lvert \\mathbf{x}^{(i)}, \\mathbf{w})$ which is a function of parameters $\\mathbf{w}$. Maximizing the likelihood function gives the maximimum likelihood estimate (MLE) of $\\mathbf{w}$. The usual optimization objective during training is the negative log likelihood. For a categorical distribution this is the *cross entropy* error function, for a Gaussian distribution this is proportional to the *sum of squares* error function. MLE can lead to severe overfitting though.\n", "\n", "Multiplying the likelihood with a prior distribution $p(\\mathbf{w})$ is, by Bayes theorem, proportional to the posterior distribution $p(\\mathbf{w} \\lvert \\mathcal{D}) \\propto p(\\mathcal{D} \\lvert \\mathbf{w}) p(\\mathbf{w})$. Maximizing $p(\\mathcal{D} \\lvert \\mathbf{w}) p(\\mathbf{w})$ gives the maximum a posteriori (MAP) estimate of $\\mathbf{w}$. Computing the MAP estimate has a regularizing effect and can prevent overfitting. The optimization objectives here are the same as for MLE plus a regularization term coming from the log prior.\n", "\n", "Both MLE and MAP give point estimates of parameters. If we instead had a full posterior distribution over parameters we could make predictions that take weight uncertainty into account. This is covered by the posterior predictive distribution $p(y \\lvert \\mathbf{x},\\mathcal{D}) = \\int p(y \\lvert \\mathbf{x}, \\mathbf{w}) p(\\mathbf{w} \\lvert \\mathcal{D}) d\\mathbf{w}$ in which the parameters have been marginalized out. This is equivalent to averaging predictions from an ensemble of neural networks weighted by the posterior probabilities of their parameters $\\mathbf{w}$. \n", "\n", "## Variational inference\n", "\n", "Unfortunately, an analytical solution for the posterior $p(\\mathbf{w} \\lvert \\mathcal{D})$ in neural networks is untractable. We therefore have to approximate the true posterior with a variational distribution $q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})$ of known functional form whose parameters we want to estimate. This can be done by minimizing the [Kullback-Leibler divergence](https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence) between $q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})$ and the true posterior $p(\\mathbf{w} \\lvert \\mathcal{D})$ w.r.t. to $\\boldsymbol{\\theta}$. As shown in [Appendix](#Appendix), the corresponding optimization objective or cost function is\n", "\n", "$$\n", "\\mathcal{F}(\\mathcal{D},\\boldsymbol{\\theta}) = \n", "\\mathrm{KL}(q(\\mathbf{w} \\lvert \\boldsymbol{\\theta}) \\mid\\mid p(\\mathbf{w})) -\n", "\\mathbb{E}_{q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})} \\log p(\\mathcal{D} \\lvert \\mathbf{w})\n", "\\tag{1}\n", "$$\n", "\n", "This is known as the *variational free energy*. The first term is the Kullback-Leibler divergence between the variational distribution $q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})$ and the prior $p(\\mathbf{w})$ and is called the *complexity cost*. The second term is the expected value of the likelihood w.r.t. the variational distribution and is called the *likelihood cost*. By re-arranging the KL term, the cost function can also be written as \n", "\n", "$$\n", "\\mathcal{F}(\\mathcal{D},\\boldsymbol{\\theta}) = \n", "\\mathbb{E}_{q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})} \\log q(\\mathbf{w} \\lvert \\boldsymbol{\\theta}) -\n", "\\mathbb{E}_{q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})} \\log p(\\mathbf{w}) -\n", "\\mathbb{E}_{q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})} \\log p(\\mathcal{D} \\lvert \\mathbf{w})\n", "\\tag{2}\n", "$$\n", "\n", "We see that all three terms in equation $2$ are expectations w.r.t. the variational distribution $q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})$. The cost function can therefore be approximated by drawing samples $\\mathbf{w}^{(i)}$ from $q(\\mathbf{w} \\lvert \\boldsymbol{\\theta})$.\n", "\n", "$$\n", "\\mathcal{F}(\\mathcal{D},\\boldsymbol{\\theta}) \\approx {1 \\over N} \\sum_{i=1}^N \\left[\n", "\\log q(\\mathbf{w}^{(i)} \\lvert \\boldsymbol{\\theta}) -\n", "\\log p(\\mathbf{w}^{(i)}) -\n", "\\log p(\\mathcal{D} \\lvert \\mathbf{w}^{(i)})\\right]\n", "\\tag{3}\n", "$$\n", "\n", "\n", "In the following example, we'll use a Gaussian distribution for the variational posterior, parameterized by $\\boldsymbol{\\theta} = (\\boldsymbol{\\mu}, \\boldsymbol{\\sigma})$ where $\\boldsymbol{\\mu}$ is the mean vector of the distribution and $\\boldsymbol{\\sigma}$ the standard deviation vector. The elements of $\\boldsymbol{\\sigma}$ are the elements of a diagonal covariance matrix which means that weights are assumed to be uncorrelated. Instead of parameterizing the neural network with weights $\\mathbf{w}$ directly we parameterize it with $\\boldsymbol{\\mu}$ and $\\boldsymbol{\\sigma}$ and therefore double the number of parameters compared to a plain neural network. \n", "\n", "## Network training\n", "\n", "A training iteration consists of a forward-pass and and backward-pass. During a forward pass a single sample is drawn from the variational posterior distribution. It is used to evaluate the approximate cost function defined by equation $3$. The first two terms of the cost function are data-independent and can be evaluated layer-wise, the last term is data-dependent and is evaluated at the end of the forward-pass. During a backward-pass, gradients of $\\boldsymbol{\\mu}$ and $\\boldsymbol{\\sigma}$ are calculated via backpropagation so that their values can be updated by an optimizer.\n", "\n", "Since a forward pass involves a stochastic sampling step we have to apply the so-called *re-parameterization trick* for backpropagation to work. The trick is to sample from a parameter-free distribution and then transform the sampled $\\boldsymbol{\\epsilon}$ with a deterministic function $t(\\boldsymbol{\\mu}, \\boldsymbol{\\sigma}, \\boldsymbol{\\epsilon})$ for which a gradient can be defined. Here, $\\boldsymbol{\\epsilon}$ is drawn from a standard normal distribution i.e. $\\boldsymbol{\\epsilon} \\sim \\mathcal{N}(\\mathbf{0}, \\mathbf{I})$ and function $t(\\boldsymbol{\\mu}, \\boldsymbol{\\sigma}, \\boldsymbol{\\epsilon}) = \\boldsymbol{\\mu} + \\boldsymbol{\\sigma} \\odot \\boldsymbol{\\epsilon}$ shifts the sample by mean $\\boldsymbol{\\mu}$ and scales it with $\\boldsymbol{\\sigma}$ where $\\odot$ is element-wise multiplication.\n", "\n", "For numeric stability we will parameterize the network with $\\boldsymbol{\\rho}$ instead of $\\boldsymbol{\\sigma}$ directly and transform $\\boldsymbol{\\rho}$ with the softplus function to obtain $\\boldsymbol{\\sigma} = \\log(1 + \\exp(\\boldsymbol{\\rho}))$. This ensures that $\\boldsymbol{\\sigma}$ is always positive. As prior, a scale mixture of two Gaussians is used $p(\\mathbf{w}) = \\pi \\mathcal{N}(\\mathbf{w} \\lvert 0,\\sigma_1^2) + (1 - \\pi) \\mathcal{N}(\\mathbf{w} \\lvert 0,\\sigma_2^2)$ where $\\sigma_1$, $\\sigma_2$ and $\\pi$ are hyper-parameters i.e. they are not learned during training.\n", "\n", "## Uncertainty characterization\n", "\n", "Uncertainty in predictions that arise from the uncertainty in weights is called [epistemic uncertainty](https://en.wikipedia.org/wiki/Uncertainty_quantification). This kind of uncertainty can be reduced if we get more data. Consequently, epistemic uncertainty is higher in regions of no or little training data and lower in regions of more training data. Epistemic uncertainty is covered by the variational posterior distribution. Uncertainty coming from the inherent noise in training data is an example of [aleatoric uncertainty](https://en.wikipedia.org/wiki/Uncertainty_quantification). It cannot be reduced if we get more data. Aleatoric uncertainty is covered by the probability distribution used to define the likelihood function. \n", "\n", "## Implementation example\n", "\n", "Variational inference of neural network parameters is now demonstrated on a simple regression problem. We therefore use a Gaussian distribution for $p(y \\lvert \\mathbf{x},\\mathbf{w})$. The training dataset consists of 32 noisy samples X, y drawn from a sinusoidal function." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "