{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Latent Function Inference with Pyro + GPyTorch (Low-Level Interface)\n", "\n", "## Overview\n", "\n", "In this example, we will give an overview of the low-level Pyro-GPyTorch integration.\n", "The low-level interface makes it possible to write GP models in a Pyro-style -- i.e. defining your own `model` and `guide` functions.\n", "\n", "These are the key differences between the high-level and low-level interface:\n", "\n", "**High level interface**\n", "\n", "- Base class is `gpytorch.models.PyroGP`.\n", "- GPyTorch automatically defines the `model` and `guide` functions for Pyro.\n", "- Best used when *prediction* is the primary goal\n", "\n", "**Low level interface**\n", "\n", "- Base class is `gpytorch.models.ApproximateGP`.\n", "- User defines the `model` and `guide` functions for Pyro.\n", "- Best used when *inference* is the primary goal" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import math\n", "import torch\n", "import pyro\n", "import tqdm\n", "import gpytorch\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This example uses a GP to infer a latent function $\\lambda(x)$, which parameterises the exponential distribution:\n", "\n", "$$y \\sim \\text{Exponential} (\\lambda),$$\n", "\n", "where:\n", "\n", "$$\\lambda = \\exp(f) \\in (0,+\\infty)$$\n", "\n", "is a GP link function, which transforms the latent gaussian process variable:\n", "\n", "$$f \\sim GP \\in (-\\infty,+\\infty).$$\n", "\n", "\n", "In other words, given inputs $X$ and observations $Y$ drawn from exponential distribution with $\\lambda = \\lambda(X)$, we want to find $\\lambda(X)$." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Samples from exp. distrib.')" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Here we specify a 'true' latent function lambda\n", "scale = lambda x: np.sin(2 * math.pi * x) + 1 \n", "\n", "# Generate synthetic data\n", "# here we generate some synthetic samples\n", "NSamp = 100\n", "\n", "X = np.linspace(0, 1, 100) \n", "\n", "fig, (lambdaf, samples) = plt.subplots(1, 2, figsize=(10, 3))\n", "\n", "lambdaf.plot(X,scale(X))\n", "lambdaf.set_xlabel('x')\n", "lambdaf.set_ylabel('$\\lambda$')\n", "lambdaf.set_title('Latent function')\n", "\n", "Y = np.zeros_like(X)\n", "for i,x in enumerate(X):\n", " Y[i] = np.random.exponential(scale(x), 1)\n", "samples.scatter(X,Y)\n", "samples.set_xlabel('x')\n", "samples.set_ylabel('y')\n", "samples.set_title('Samples from exp. distrib.')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "train_x = torch.tensor(X).float()\n", "train_y = torch.tensor(Y).float()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using the low-level Pyro/GPyTorch interface\n", "\n", "The low-level iterface should look familiar if you've written Pyro models/guides before. We'll use a `gpytorch.models.ApproximateGP` object to model the GP. To use the low-level interface, this object needs to define 3 functions:\n", "\n", "- `forward(x)` - which computes the prior GP mean and covariance at the supplied times.\n", "- `guide(x)` - which defines the approximate GP posterior.\n", "- `model(x)` - which does the following 3 things\n", "\n", " - Computes the GP prior at `x`\n", " - Converts GP function samples into scale function samples, using the link function defined above.\n", " - Sample from the observed distribution `p(y | f)`. (This takes the place of a gpytorch `Likelihood` that we would've used in the high-level interface)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class PVGPRegressionModel(gpytorch.models.ApproximateGP):\n", " def __init__(self, num_inducing=64, name_prefix=\"mixture_gp\"):\n", " self.name_prefix = name_prefix\n", " \n", " # Define all the variational stuff\n", " inducing_points = torch.linspace(0, 1, num_inducing)\n", " variational_strategy = gpytorch.variational.VariationalStrategy(\n", " self, inducing_points,\n", " gpytorch.variational.CholeskyVariationalDistribution(num_inducing_points=num_inducing)\n", " )\n", " \n", " # Standard initializtation\n", " super().__init__(variational_strategy)\n", " \n", " # Mean, covar, likelihood\n", " self.mean_module = gpytorch.means.ConstantMean()\n", " self.covar_module = gpytorch.kernels.ScaleKernel(gpytorch.kernels.RBFKernel())\n", "\n", " def forward(self, x):\n", " mean = self.mean_module(x)\n", " covar = self.covar_module(x)\n", " return gpytorch.distributions.MultivariateNormal(mean, covar)\n", " \n", " def guide(self, x, y):\n", " # Get q(f) - variational (guide) distribution of latent function\n", " function_dist = self.pyro_guide(x)\n", "\n", " # Use a plate here to mark conditional independencies\n", " with pyro.plate(self.name_prefix + \".data_plate\", dim=-1):\n", " # Sample from latent function distribution\n", " pyro.sample(self.name_prefix + \".f(x)\", function_dist)\n", " \n", " def model(self, x, y):\n", " pyro.module(self.name_prefix + \".gp\", self)\n", " \n", " # Get p(f) - prior distribution of latent function\n", " function_dist = self.pyro_model(x)\n", " \n", " # Use a plate here to mark conditional independencies\n", " with pyro.plate(self.name_prefix + \".data_plate\", dim=-1):\n", " # Sample from latent function distribution\n", " function_samples = pyro.sample(self.name_prefix + \".f(x)\", function_dist)\n", " \n", " # Use the link function to convert GP samples into scale samples\n", " scale_samples = function_samples.exp()\n", "\n", " # Sample from observed distribution\n", " return pyro.sample(\n", " self.name_prefix + \".y\",\n", " pyro.distributions.Exponential(scale_samples.reciprocal()), # rate = 1 / scale\n", " obs=y\n", " )" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "model = PVGPRegressionModel()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Performing inference with Pyro\n", "\n", "Unlike all the other examples in this library, `PyroGP` models use Pyro's inference and optimization classes (rather than the classes provided by PyTorch).\n", "\n", "If you are unfamiliar with Pyro's inference tools, we recommend checking out the [Pyro SVI tutorial](http://pyro.ai/examples/svi_part_i.html)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "257d4e41d82b4db3b927a0ab3b001f8a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(IntProgress(value=0, max=200), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "CPU times: user 41.1 s, sys: 2.78 s, total: 43.9 s\n", "Wall time: 6.54 s\n" ] } ], "source": [ "# this is for running the notebook in our testing framework\n", "import os\n", "smoke_test = ('CI' in os.environ)\n", "num_iter = 2 if smoke_test else 200\n", "num_particles = 1 if smoke_test else 256\n", "\n", "\n", "def train():\n", " optimizer = pyro.optim.Adam({\"lr\": 0.1})\n", " elbo = pyro.infer.Trace_ELBO(num_particles=num_particles, vectorize_particles=True, retain_graph=True)\n", " svi = pyro.infer.SVI(model.model, model.guide, optimizer, elbo)\n", "\n", " model.train()\n", " iterator = tqdm.notebook.tqdm(range(num_iter))\n", " for i in iterator:\n", " model.zero_grad()\n", " loss = svi.step(train_x, train_y)\n", " iterator.set_postfix(loss=loss, lengthscale=model.covar_module.base_kernel.lengthscale.item())\n", " \n", "%time train()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we are only performing inference over the GP latent function (and its associated hyperparameters). In later examples, we will see that this basic loop also performs inference over any additional latent variables that we define." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making predictions\n", "\n", "For some problems, we simply want to use Pyro to perform inference over latent variables. However, we can also use the models' (approximate) predictive posterior distribution. Making predictions with a PyroGP model is exactly the same as for standard GPyTorch models." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Here's a quick helper function for getting smoothed percentile values from samples\n", "def percentiles_from_samples(samples, percentiles=[0.05, 0.5, 0.95]):\n", " num_samples = samples.size(0)\n", " samples = samples.sort(dim=0)[0]\n", " \n", " # Get samples corresponding to percentile\n", " percentile_samples = [samples[int(num_samples * percentile)] for percentile in percentiles]\n", " \n", " # Smooth the samples\n", " kernel = torch.full((1, 1, 5), fill_value=0.2)\n", " percentiles_samples = [\n", " torch.nn.functional.conv1d(percentile_sample.view(1, 1, -1), kernel, padding=2).view(-1)\n", " for percentile_sample in percentile_samples\n", " ]\n", " \n", " return percentile_samples" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# define test set (optionally on GPU)\n", "denser = 2 # make test set 2 times denser then the training set\n", "test_x = torch.linspace(0, 1, denser * NSamp).float()#.cuda()\n", "\n", "model.eval()\n", "with torch.no_grad():\n", " output = model(test_x)\n", "\n", "# Get E[exp(f)] via f_i ~ GP, 1/n \\sum_{i=1}^{n} exp(f_i).\n", "# Similarly get the 5th and 95th percentiles\n", "samples = output(torch.Size([1000])).exp()\n", "lower, mean, upper = percentiles_from_samples(samples)\n", "\n", "# Draw some simulated y values\n", "scale_sim = model(train_x)().exp()\n", "y_sim = pyro.distributions.Exponential(scale_sim.reciprocal())()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# visualize the result\n", "fig, (func, samp) = plt.subplots(1, 2, figsize=(12, 3))\n", "line, = func.plot(test_x, mean.detach().cpu().numpy(), label='GP prediction')\n", "func.fill_between(\n", " test_x, lower.detach().cpu().numpy(),\n", " upper.detach().cpu().numpy(), color=line.get_color(), alpha=0.5\n", ")\n", "\n", "func.plot(test_x, scale(test_x), label='True latent function')\n", "func.legend()\n", "\n", "# sample from p(y|D,x) = \\int p(y|f) p(f|D,x) df (doubly stochastic)\n", "samp.scatter(train_x, train_y, alpha = 0.5, label='True train data')\n", "samp.scatter(train_x, y_sim.cpu().detach().numpy(), alpha=0.5, label='Sample from the model')\n", "samp.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Next steps\n", "\n", "This example probably could've also been done (slightly easier) using the high-level Pyro integration, or using GPyTorch's native SVGP implementation. The low-level interface really comes in handy when a gpytorch Likelihood is difficult to define. For an example of this, see the [next example](./Cox_Process_Example.ipynb) which uses the low-level interface to infer the intensity function of a Cox process." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }