diff --git a/docs/source/notebooks/bayesian_neural_network_opvi-advi.ipynb b/docs/source/notebooks/bayesian_neural_network_opvi-advi.ipynb new file mode 100644 index 0000000000..66c75cf91d --- /dev/null +++ b/docs/source/notebooks/bayesian_neural_network_opvi-advi.ipynb @@ -0,0 +1,865 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Variational Inference: Bayesian Neural Networks\n", + "\n", + "(c) 2016 by Thomas Wiecki & Maxim Kochurov (opvi)\n", + "\n", + "Original blog post: http://twiecki.github.io/blog/2016/06/01/bayesian-deep-learning/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## Current trends in Machine Learning\n", + "\n", + "There are currently three big trends in machine learning: **Probabilistic Programming**, **Deep Learning** and \"**Big Data**\". Inside of PP, a lot of innovation is in making things scale using **Variational Inference**. In this blog post, I will show how to use **Variational Inference** in [PyMC3](http://pymc-devs.github.io/pymc3/) to fit a simple Bayesian Neural Network. I will also discuss how bridging Probabilistic Programming and Deep Learning can open up very interesting avenues to explore in future research.\n", + "\n", + "### Probabilistic Programming at scale\n", + "**Probabilistic Programming** allows very flexible creation of custom probabilistic models and is mainly concerned with **insight** and learning from your data. The approach is inherently **Bayesian** so we can specify **priors** to inform and constrain our models and get uncertainty estimation in form of a **posterior** distribution. Using [MCMC sampling algorithms](http://twiecki.github.io/blog/2015/11/10/mcmc-sampling/) we can draw samples from this posterior to very flexibly estimate these models. [PyMC3](http://pymc-devs.github.io/pymc3/) and [Stan](http://mc-stan.org/) are the current state-of-the-art tools to consruct and estimate these models. One major drawback of sampling, however, is that it's often very slow, especially for high-dimensional models. That's why more recently, **variational inference** algorithms have been developed that are almost as flexible as MCMC but much faster. Instead of drawing samples from the posterior, these algorithms instead fit a distribution (e.g. normal) to the posterior turning a sampling problem into and optimization problem. [ADVI](http://arxiv.org/abs/1506.03431) -- Automatic Differentation Variational Inference -- is implemented in [PyMC3](http://pymc-devs.github.io/pymc3/) and [Stan](http://mc-stan.org/), as well as a new package called [Edward](https://github.com/blei-lab/edward/) which is mainly concerned with Variational Inference. \n", + "\n", + "Unfortunately, when it comes to traditional ML problems like classification or (non-linear) regression, Probabilistic Programming often plays second fiddle (in terms of accuracy and scalability) to more algorithmic approaches like [ensemble learning](https://en.wikipedia.org/wiki/Ensemble_learning) (e.g. [random forests](https://en.wikipedia.org/wiki/Random_forest) or [gradient boosted regression trees](https://en.wikipedia.org/wiki/Boosting_(machine_learning)).\n", + "\n", + "### Deep Learning\n", + "\n", + "Now in its third renaissance, deep learning has been making headlines repeatadly by dominating almost any object recognition benchmark, [kicking ass at Atari games](https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf), and [beating the world-champion Lee Sedol at Go](http://www.nature.com/nature/journal/v529/n7587/full/nature16961.html). From a statistical point, Neural Networks are extremely good non-linear function approximators and representation learners. While mostly known for classification, they have been extended to unsupervised learning with [AutoEncoders](https://arxiv.org/abs/1312.6114) and in all sorts of other interesting ways (e.g. [Recurrent Networks](https://en.wikipedia.org/wiki/Recurrent_neural_network), or [MDNs](http://cbonnett.github.io/MDN_EDWARD_KERAS_TF.html) to estimate multimodal distributions). Why do they work so well? No one really knows as the statistical properties are still not fully understood.\n", + "\n", + "A large part of the innoviation in deep learning is the ability to train these extremely complex models. This rests on several pillars:\n", + "* Speed: facilitating the GPU allowed for much faster processing.\n", + "* Software: frameworks like [Theano](http://deeplearning.net/software/theano/) and [TensorFlow](https://www.tensorflow.org/) allow flexible creation of abstract models that can then be optimized and compiled to CPU or GPU.\n", + "* Learning algorithms: training on sub-sets of the data -- stochastic gradient descent -- allows us to train these models on massive amounts of data. Techniques like drop-out avoid overfitting.\n", + "* Architectural: A lot of innovation comes from changing the input layers, like for convolutional neural nets, or the output layers, like for [MDNs](http://cbonnett.github.io/MDN_EDWARD_KERAS_TF.html).\n", + "\n", + "### Bridging Deep Learning and Probabilistic Programming\n", + "On one hand we Probabilistic Programming which allows us to build rather small and focused models in a very principled and well-understood way to gain insight into our data; on the other hand we have deep learning which uses many heuristics to train huge and highly complex models that are amazing at prediction. Recent innovations in variational inference allow probabilistic programming to scale model complexity as well as data size. We are thus at the cusp of being able to combine these two approaches to hopefully unlock new innovations in Machine Learning. For more motivation, see also [Dustin Tran's](https://twitter.com/dustinvtran) recent [blog post](http://dustintran.com/blog/a-quick-update-edward-and-some-motivations/).\n", + "\n", + "While this would allow Probabilistic Programming to be applied to a much wider set of interesting problems, I believe this bridging also holds great promise for innovations in Deep Learning. Some ideas are:\n", + "* **Uncertainty in predictions**: As we will see below, the Bayesian Neural Network informs us about the uncertainty in its predictions. I think uncertainty is an underappreciated concept in Machine Learning as it's clearly important for real-world applications. But it could also be useful in training. For example, we could train the model specifically on samples it is most uncertain about.\n", + "* **Uncertainty in representations**: We also get uncertainty estimates of our weights which could inform us about the stability of the learned representations of the network.\n", + "* **Regularization with priors**: Weights are often L2-regularized to avoid overfitting, this very naturally becomes a Gaussian prior for the weight coefficients. We could, however, imagine all kinds of other priors, like spike-and-slab to enforce sparsity (this would be more like using the L1-norm).\n", + "* **Transfer learning with informed priors**: If we wanted to train a network on a new object recognition data set, we could bootstrap the learning by placing informed priors centered around weights retrieved from other pre-trained networks, like [GoogLeNet](https://arxiv.org/abs/1409.4842). \n", + "* **Hierarchical Neural Networks**: A very powerful approach in Probabilistic Programming is hierarchical modeling that allows pooling of things that were learned on sub-groups to the overall population (see my tutorial on [Hierarchical Linear Regression in PyMC3](http://twiecki.github.io/blog/2014/03/17/bayesian-glms-3/)). Applied to Neural Networks, in hierarchical data sets, we could train individual neural nets to specialize on sub-groups while still being informed about representations of the overall population. For example, imagine a network trained to classify car models from pictures of cars. We could train a hierarchical neural network where a sub-neural network is trained to tell apart models from only a single manufacturer. The intuition being that all cars from a certain manufactures share certain similarities so it would make sense to train individual networks that specialize on brands. However, due to the individual networks being connected at a higher layer, they would still share information with the other specialized sub-networks about features that are useful to all brands. Interestingly, different layers of the network could be informed by various levels of the hierarchy -- e.g. early layers that extract visual lines could be identical in all sub-networks while the higher-order representations would be different. The hierarchical model would learn all that from the data.\n", + "* **Other hybrid architectures**: We can more freely build all kinds of neural networks. For example, Bayesian non-parametrics could be used to flexibly adjust the size and shape of the hidden layers to optimally scale the network architecture to the problem at hand during training. Currently, this requires costly hyper-parameter optimization and a lot of tribal knowledge." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## Bayesian Neural Networks in PyMC3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Generating data\n", + "\n", + "First, lets generate some toy data -- a simple binary classification problem that's not linearly separable." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import theano\n", + "floatX = theano.config.floatX\n", + "import pymc3 as pm\n", + "import theano.tensor as T\n", + "import sklearn\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from warnings import filterwarnings\n", + "filterwarnings('ignore')\n", + "sns.set_style('white')\n", + "from sklearn import datasets\n", + "from sklearn.preprocessing import scale\n", + "from sklearn.cross_validation import train_test_split\n", + "from sklearn.datasets import make_moons" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "X, Y = make_moons(noise=0.2, random_state=0, n_samples=1000)\n", + "X = scale(X)\n", + "X = X.astype(floatX)\n", + "Y = Y.astype(floatX)\n", + "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=.5)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.scatter(X[Y==0, 0], X[Y==0, 1], label='Class 0')\n", + "ax.scatter(X[Y==1, 0], X[Y==1, 1], color='r', label='Class 1')\n", + "sns.despine(); ax.legend()\n", + "ax.set(xlabel='X', ylabel='Y', title='Toy binary classification data set');" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Model specification\n", + "\n", + "A neural network is quite simple. The basic unit is a [perceptron](https://en.wikipedia.org/wiki/Perceptron) which is nothing more than [logistic regression](http://pymc-devs.github.io/pymc3/notebooks/posterior_predictive.html#Prediction). We use many of these in parallel and then stack them up to get hidden layers. Here we will use 2 hidden layers with 5 neurons each which is sufficient for such a simple problem." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "def construct_nn(ann_input, ann_output):\n", + " n_hidden = 5\n", + " \n", + " # Initialize random weights between each layer\n", + " init_1 = np.random.randn(X.shape[1], n_hidden).astype(floatX)\n", + " init_2 = np.random.randn(n_hidden, n_hidden).astype(floatX)\n", + " init_out = np.random.randn(n_hidden).astype(floatX)\n", + " \n", + " with pm.Model() as neural_network:\n", + " # Weights from input to hidden layer\n", + " weights_in_1 = pm.Normal('w_in_1', 0, sd=1, \n", + " shape=(X.shape[1], n_hidden), \n", + " testval=init_1)\n", + " \n", + " # Weights from 1st to 2nd layer\n", + " weights_1_2 = pm.Normal('w_1_2', 0, sd=1, \n", + " shape=(n_hidden, n_hidden), \n", + " testval=init_2)\n", + " \n", + " # Weights from hidden layer to output\n", + " weights_2_out = pm.Normal('w_2_out', 0, sd=1, \n", + " shape=(n_hidden,), \n", + " testval=init_out)\n", + " \n", + " # Build neural-network using tanh activation function\n", + " act_1 = pm.math.tanh(pm.math.dot(ann_input, \n", + " weights_in_1))\n", + " act_2 = pm.math.tanh(pm.math.dot(act_1, \n", + " weights_1_2))\n", + " act_out = pm.math.sigmoid(pm.math.dot(act_2, \n", + " weights_2_out))\n", + " \n", + " # Binary classification -> Bernoulli likelihood\n", + " out = pm.Bernoulli('out', \n", + " act_out,\n", + " observed=ann_output,\n", + " total_size=Y_train.shape[0] # IMPORTANT for minibatches\n", + " )\n", + " return neural_network\n", + "\n", + "# Trick: Turn inputs and outputs into shared variables. \n", + "# It's still the same thing, but we can later change the values of the shared variable \n", + "# (to switch in the test-data later) and pymc3 will just use the new data. \n", + "# Kind-of like a pointer we can redirect.\n", + "# For more info, see: http://deeplearning.net/software/theano/library/compile/shared.html\n", + "ann_input = theano.shared(X_train)\n", + "ann_output = theano.shared(Y_train)\n", + "neural_network = construct_nn(ann_input, ann_output)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "That's not so bad. The `Normal` priors help regularize the weights. Usually we would add a constant `b` to the inputs but I omitted it here to keep the code cleaner." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Variational Inference: Scaling model complexity\n", + "\n", + "We could now just run a MCMC sampler like [`NUTS`](http://pymc-devs.github.io/pymc3/api.html#nuts) which works pretty well in this case but as I already mentioned, this will become very slow as we scale our model up to deeper architectures with more layers.\n", + "\n", + "Instead, we will use the brand-new [ADVI](http://pymc-devs.github.io/pymc3/api.html#advi) variational inference algorithm which was recently added to `PyMC3`. This is much faster and will scale better. Note, that this is a mean-field approximation so we ignore correlations in the posterior." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING (theano.tensor.blas): We did not found a dynamic library into the library_dir of the library we use for blas. If you use ATLAS, make sure to compile it with dynamics library.\n", + "Average Loss = 131.3: 100%|██████████| 20000/20000 [00:22<00:00, 880.39it/s] \n", + "Finished [100%]: Average Loss = 131.32\n", + "Average Loss = 128.89: 100%|██████████| 10000/10000 [00:10<00:00, 997.84it/s]\n", + "Finished [100%]: Average Loss = 128.92\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 33 s, sys: 1min 39s, total: 2min 12s\n", + "Wall time: 36.2 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "with neural_network:\n", + " # Run ADVI to estimate posterior means, standard deviations, and the evidence lower bound (ELBO)\n", + " # here is a good chance to demonstrate `cost_part_grad_scale` parameter usage\n", + " # the reason is described here: approximateinference.org/accepted/RoederEtAl2016.pdf\n", + " # to be short it is used to reduce variance of gradient on final iterations\n", + " s = theano.shared(pm.floatX(1))\n", + " inference = pm.ADVI(cost_part_grad_scale=s)\n", + " # ADVI has nearly converged\n", + " inference.fit(n=20000)\n", + " # It is time to set `s` to zero\n", + " s.set_value(0)\n", + " approx = inference.fit(n=10000)\n", + " # or you can just use `pm.fit` if you don't need ELBO history, ADVI will be used as default\n", + " #approx = pm.fit(n=30000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "~ 30 sec on my laptop. That's pretty good considering that NUTS is having a really hard time. Further below we make this even faster. To make it really fly, we probably want to run the Neural Network on the GPU.\n", + "\n", + "As samples are more convenient to work with, we can very quickly draw samples from the variational posterior using `approx.sample_vp()` (this is just sampling from Normal distributions, so not at all the same like MCMC):" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "trace = approx.sample_vp(draws=5000)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Plotting the objective function (ELBO) we can see that the optimization slowly improves the fit over time." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(inference.hist)\n", + "plt.ylabel('ELBO')\n", + "plt.xlabel('iteration');" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Now that we trained our model, lets predict on the hold-out set using a posterior predictive check (PPC). \n", + "\n", + "1. We can use [`sample_ppc()`](http://pymc-devs.github.io/pymc3/api.html#pymc3.sampling.sample_ppc) to generate new data (in this case class predictions) from the posterior (sampled from the variational estimation).\n", + "2. It is better to get the node directly and build theano graph using our approximation (`approx.sample_node`) , we get a lot of speed up" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "sigmoid.0" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We can get predicted probability from model\n", + "neural_network.out.distribution.p" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# create symbolic input\n", + "x = T.matrix('X')\n", + "# symbolic number of samples is supported, we build vectorized posterior on the fly\n", + "n = T.iscalar('n')\n", + "# Do not forget test_values or set theano.config.compute_test_value = 'off'\n", + "x.tag.test_value = np.empty_like(X_train[:10])\n", + "n.tag.test_value = 100\n", + "_sample_proba = approx.sample_node(neural_network.out.distribution.p, size=n,\n", + " more_replacements={ann_input:x})\n", + "# It is time to compile the function\n", + "# No updates are needed for Approximation random generator \n", + "# Efficient vectorized form of sampling is used\n", + "sample_proba = theano.function([x, n], _sample_proba)\n", + "\n", + "# Create bechmark functions\n", + "def production_step1():\n", + " ann_input.set_value(X_test)\n", + " ann_output.set_value(Y_test)\n", + " ppc = pm.sample_ppc(trace, model=neural_network, samples=500, progressbar=False)\n", + "\n", + " # Use probability of > 0.5 to assume prediction of class 1\n", + " pred = ppc['out'].mean(axis=0) > 0.5\n", + " \n", + "def production_step2():\n", + " sample_proba(X_test, 500).mean(0) > 0.5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "See the difference" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 loop, best of 3: 6.88 s per loop\n" + ] + } + ], + "source": [ + "%timeit production_step1()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 loop, best of 3: 153 ms per loop\n" + ] + } + ], + "source": [ + "%timeit production_step2()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "pred = sample_proba(X_test, 500).mean(0) > 0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "ax.scatter(X_test[pred==0, 0], X_test[pred==0, 1])\n", + "ax.scatter(X_test[pred==1, 0], X_test[pred==1, 1], color='r')\n", + "sns.despine()\n", + "ax.set(title='Predicted labels in testing set', xlabel='X', ylabel='Y');" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy = 96.39999999999999%\n" + ] + } + ], + "source": [ + "print('Accuracy = {}%'.format((Y_test == pred).mean() * 100))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Hey, our neural network did all right!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## Lets look at what the classifier has learned\n", + "\n", + "For this, we evaluate the class probability predictions on a grid over the whole input space." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "grid = np.mgrid[-3:3:100j,-3:3:100j].astype(floatX)\n", + "grid_2d = grid.reshape(2, -1).T\n", + "dummy_out = np.ones(grid.shape[1], dtype=np.int8)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# Creater posterior predictive samples\n", + "ppc = sample_proba(grid_2d ,500)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Probability surface" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nrhHRYQxsRERERA5EqboWpbDG6hpRMQY2IiIiogpgo5FyDGtE5RjYiIiIiGzyorrmRDVX1xjWiLQx\nsBEREREFjFMhicgqBjYiIiIiGypVXatmrK4R6WNgIyIiIgoQq2slz8OwRmSIgY2IiIjIolqprnEq\nJFF4MLARERERWVBLbfyDwuoakTkGNiIiIqIARCWscSokUbgwsBERERGZ4FRIIqoUBjYiIiIin0Wl\nuhYUVteIrGNgIyIiIjIQleoap0ISVScGNiIiIiIfBVVdc4NhjSi8GNiIiIiIdLitrnEqJBG5xcBG\nREREVMNYXSMKNwY2IiIiIg21UF1jWCMKPwY2IiIioojiVEii6sfARkRERFQiKtU1N1hdI4oGBjYi\nIiKiCqvWqZBE5B4DGxEREVGBSlTX7IrKVEhW14jcY2AjIiIimsapkB4+D8MakScY2IiIiIgiJArV\nNYY1ioqNGzfioosuwoUXXoiHHnqo7Pb33nsPq1atwkc/+lF85jOfQW9vb/62tWvXYsWKFVixYgXW\nrl3r2zkysBERERGB1TWiWpPNZnHXXXfh4YcfxvPPP4/nnnsOf/rTn4ru84//+I+49NJL8eyzz+KG\nG27AvffeCwAYHBzEAw88gKeeego/+9nP8MADD2BoaMiX82RgIyIiIqqAam00wuoaRcUbb7yBY489\nFt3d3aivr8fKlSvx8ssvF91n586dWLJkCQBgyZIl+ds3bdqEpUuXor29HW1tbVi6dCleffVVX86T\ngY2IiIhqHhuNeINhjaKkr68Ps2bNyn+dTCbR19dXdJ8TTzwRL774IgDgpZdeQiqVwqFDhywd65WY\nL49KRERERLo4FZIoZ86SJehoavL8cQfGxoB1r7h+nK9+9av4h3/4B6xduxZnnnkmkskkJEny4Ayt\nY2AjIiKimlbt1TVOhSTSlkwmi5qI9PX1IZlMlt3ngQceAACkUim8+OKLaG1tRTKZxNatW4uOXbRo\nkS/nySmRREREVLOi0GiEUyGJ/LFw4ULs2rULe/bsweTkJJ5//nmcd955RfcZGBiALMsAgIceegiX\nX345AODss8/Gpk2bMDQ0hKGhIWzatAlnn322L+fJChsRERFRQDgVkig8YrEY7rzzTlx77bXIZrO4\n/PLLMW/ePNx///1YsGABzj//fGzduhX33XcfBEHAmWeeiTVr1gAA2tvbccMNN+CKK64AANx4441o\n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\nYKj/BTppFNp0miO5AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cmap = sns.diverging_palette(250, 12, s=85, l=25, as_cmap=True)\n", + "fig, ax = plt.subplots(figsize=(16, 9))\n", + "contour = ax.contourf(grid[0], grid[1], ppc.mean(axis=0).reshape(100, 100), cmap=cmap)\n", + "ax.scatter(X_test[pred==0, 0], X_test[pred==0, 1])\n", + "ax.scatter(X_test[pred==1, 0], X_test[pred==1, 1], color='r')\n", + "cbar = plt.colorbar(contour, ax=ax)\n", + "_ = ax.set(xlim=(-3, 3), ylim=(-3, 3), xlabel='X', ylabel='Y');\n", + "cbar.ax.set_ylabel('Posterior predictive mean probability of class label = 0');" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Uncertainty in predicted value\n", + "\n", + "So far, everything I showed we could have done with a non-Bayesian Neural Network. The mean of the posterior predictive for each class-label should be identical to maximum likelihood predicted values. However, we can also look at the standard deviation of the posterior predictive to get a sense for the uncertainty in our predictions. Here is what that looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2wAAAIaCAYAAABcYM45AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmYU/W9P/B3kplk9hXIIOIIsmgRZVeuChVaRLi0Cri0\n1Pq0LrfXUrm1trXaS/1pl+vWq21V2mtdetF6r/uCIl6oonVBwcomIjsoMzJLMlv25PdHTCaTOXvO\nyTkneb+ex0dmkpOcCTPDeefz+X6+jkQikQARERERERFZjtPsEyAiIiIiIiJhDGxEREREREQWxcBG\nRERERERkUQxsREREREREFsXARkREREREZFEMbERERERERBZVYtYTh0IhLFu2DOFwGLFYDOeddx6u\nvfZas06HiIiIiIiKzMaNG/GrX/0K8XgcF110Ea6++uoBt//1r3/FY489BqfTiYqKCtx6660YM2YM\n/v73v+Ouu+5CJBJBaWkpfvzjH2PmzJmGnKPDrH3YEokE+vr6UFlZiUgkgm9+85u46aabMGnSJDNO\nh4iIiIiIikiqaPTQQw/B6/Vi6dKl+O1vf4sxY8ak79PT04OqqioAwPr16/HYY4/hz3/+M3bu3InG\nxkZ4vV7s3r0bV1xxBd544w1DztO0lkiHw4HKykoAQDQaRTQahcPhMOt0iIiIiIioiGzduhXNzc0Y\nOXIk3G43Fi5ciPXr1w+4TyqsAUAgEEjnlS996Uvwer0AgLFjxyIUCiEcDhtynqa1RALJVLt48WIc\nOnQI3/zmN3H66aeL3jcYDGL79u0YOnQoXC5XHs+SiIiIiMi6YrEYjh07hlNPPRVlZWVmn45iPp8P\nPT09hj1+VVUV6urqRG9vbW1FU1NT+mOv14utW7cOut+jjz6Khx56CJFIBI888sig21955RV86Utf\ngtvt1ufEs5ga2FwuF5577jl0dXXh+9//Pnbv3o1x48YJ3nf79u1YtmxZns+QiIiIiMgeHn30UUyb\nNs3s01DE5/PhzDNmIoG4Yc9RW1uLdevWSYY2JZYtW4Zly5bhhRdewP3334/bbrstfdsnn3yCO++8\nEw8++GCupyvK1MCWUlNTgzPOOANvvPGGaGAbOnQoAODhP96HJu+wfJ4eERERFZC+w4dyfoyug58r\nvq/vcJfk7S1HpSsMh1qkj9/X3qHoPPZ2fKrofvl2UsMI1ceMbmxQdL8TmmoUP2bT8Cr5OwmoG6n8\nOZSoaVZ/nft5ewe+d/Mv09fLdtDT04ME4mh0NMNpQCSJI4p2/0H09PSIBjav14uWlpb0x62trek2\nRyELFy7EzTffnP64paUFy5cvx2233YYTTjhBt3PPZlpg6+joQElJCWpqahAMBvHWW2/hqquuEr1/\nqg2yyTsMI44bnq/TJCIiogLSs38faofldlHr33MUFfXKAkP7fh+GVou/u//p4S40lItf8O/91Idq\nt3iQ2P35MZS7yhWdS4nDmHatXCk9/5RxCv/+ThqhvKoyQmPoahyVW+UmW+2Y3K5x7bhsyIkSQ743\nowrGKk6cOBEHDhzA4cOH4fV6sWbNGtx1110D7nPgwAGceOKJAIDXXnsNzc3NAICuri5cffXV+NGP\nfoSpU6fqffoDmBbYPv/8c9xwww2IxWJIJBKYP38+zj33XLNOh4iIiKhg7WrLvapohJOHqKtKKA1r\nahRKWCP1SkpKsHLlSlx55ZWIxWJYsmQJxo4di3vuuQennnoq5s6di9WrV+Ptt99OF5pS7ZCrV6/G\noUOHcO+99+Lee+8FADz44INobGzU/zx1f0SFTj75ZDz77LNmPT0REREVmZ79+3J+DP+eo4rv277f\nl9Nz7f1U+vjdnx/L6fHNpjasqaGmuqYFw1rhmD17NmbPnj3gcytWrEj/+ec//7ngcddccw2uueYa\nQ88txbSx/kRERETF7FOZtW16sWJ1TUtYs0orJMMa5RsDGxERERW8QquuFRurhDW9MayREgxsRERE\nRHmWa3VNaTtkIVTXCnndGpESDGxERERU0Fhdsw6uW+vH6hopxcBGRERElEfFWl3jurV+DGukBgMb\nERERkU5YXdMPwxpREgMbERERFax8t0PKyVd1zWrsvG5NTwxrpAUDGxEREZEOrFRds1I7pBXWrVlh\nyAjDGmnFwEZEREQFidU181ll3ZoWnAhJVsHARkRERJSjXKtrerJSdU0trlsjGoyBjYiIiEhAPqtr\ncu2QxVBd47o1ImEMbERERFRw9GiHVMpK1TWr4Lq1JIY10gMDGxEREVEWu1bXrNAOyXVrSQxrpBcG\nNiIiIioorK6Zxyphzex1awxrpCcGNiIiIiKDFFt1TS2rrFvjREiyMgY2IiIiKhhWG+VfTOy6bo0T\nIcnqGNiIiIiINJBrhyym6ppVWiHNxrBGRmBgIyIiooLA6po5rBLWzK6uMayRURjYiIiIiFQyurqm\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "cmap = sns.cubehelix_palette(light=1, as_cmap=True)\n", + "fig, ax = plt.subplots(figsize=(16, 9))\n", + "contour = ax.contourf(grid[0], grid[1], ppc.std(axis=0).reshape(100, 100), cmap=cmap)\n", + "ax.scatter(X_test[pred==0, 0], X_test[pred==0, 1])\n", + "ax.scatter(X_test[pred==1, 0], X_test[pred==1, 1], color='r')\n", + "cbar = plt.colorbar(contour, ax=ax)\n", + "_ = ax.set(xlim=(-3, 3), ylim=(-3, 3), xlabel='X', ylabel='Y');\n", + "cbar.ax.set_ylabel('Uncertainty (posterior predictive standard deviation)');" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "We can see that very close to the decision boundary, our uncertainty as to which label to predict is highest. You can imagine that associating predictions with uncertainty is a critical property for many applications like health care. To further maximize accuracy, we might want to train the model primarily on samples from that high-uncertainty region." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## Mini-batch ADVI: Scaling data size\n", + "\n", + "So far, we have trained our model on all data at once. Obviously this won't scale to something like ImageNet. Moreover, training on mini-batches of data (stochastic gradient descent) avoids local minima and can lead to faster convergence.\n", + "\n", + "Fortunately, ADVI can be run on mini-batches as well. It just requires some setting up:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# Generator that returns mini-batches in each iteration\n", + "def create_minibatch(data):\n", + " rng = np.random.RandomState(0)\n", + " \n", + " while True:\n", + " # Return random data samples of set size 100 each iteration\n", + " ixs = rng.randint(len(data), size=50)\n", + " yield data[ixs]\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Minibatch ADVI" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "All you need to train with minibatches is to wrap python generators with `pm.generator` function\n", + "The rest code should work without changes, let's see it" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Average Loss = 126.51: 100%|██████████| 40000/40000 [00:23<00:00, 1711.01it/s]\n", + "Finished [100%]: Average Loss = 126.74\n" + ] + } + ], + "source": [ + "minibatch_x = pm.generator(create_minibatch(X_train))\n", + "minibatch_y = pm.generator(create_minibatch(Y_train))\n", + "neural_network_minibatch = construct_nn(minibatch_x, minibatch_y)\n", + "with neural_network_minibatch:\n", + " inference = pm.ADVI()\n", + " approx = inference.fit(40000)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfsAAAFYCAYAAABUA1WSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3WdAVFf6P/DvgGJDsTJEgxpsSaz5JW7CqrhCgERAiGXz\nT3Ej6yZZY3SNibElatSoKRpXjYklRaNx7aBiRwWxN0QUVBAEFGaUXqTNnP8L5MoAMxSnwPX7eeNw\nbnsud+S595xzz1EIIQSIiIhItqwsHQARERGZFpM9ERGRzDHZExERyRyTPRERkcwx2RMREclcA0sH\nYAr5+fmIjIxEu3btYG1tbelwiIiITEqj0eDevXvo1asXGjduXGG5LJN9ZGQk3nnnHUuHQUREZFYb\nN27ESy+9VKFclsm+Xbt2AEpO2sHBwcLREBERmVZKSgreeecdKf+VJ8tkX1p17+DggKefftrC0RAR\nEZmHvqZrdtAjIiKSOSZ7IiIimWOyJyIikjkmeyIiIpljsiciIpI5JnsiIiKZY7InIiKSOSZ7IiIi\nmTNZsk9OTsbo0aMxdOhQeHl5Yd26dQCAjIwM+Pv7w8PDA/7+/sjMzAQACCEwf/58uLu7w8fHB1ev\nXpX2tXPnTnh4eMDDwwM7d+40VchERESyZLJkb21tjWnTpmHv3r3YvHkz/vzzT8TExGD16tVwdnbG\nwYMH4ezsjNWrVwMAQkNDER8fj4MHD2LevHmYM2cOgJKbgxUrVmDLli3YunUrVqxYId0gmMvFaDUS\nVdlmPSYREZGxmCzZ29vbo2fPngAAW1tbODk5QaVSITg4GH5+fgAAPz8/HD58GACkcoVCgX79+iEr\nKwtqtRphYWEYMGAAWrZsCTs7OwwYMADHjx83VdgVaLUC8387g193X616ZSIiojrILG32SUlJiIqK\nQt++fZGamgp7e3sAJRPWpKamAgBUKpXOpDUODg5QqVQVypVKJVQqlTnClhQVa1FYpDHrMYmIiIzF\n5Mk+NzcXEydOxIwZM2Bra6uzTKFQQKFQmDoEIiKiJ5pJk31RUREmTpwIHx8feHh4AADatGkDtVoN\nAFCr1WjdujWAkif2lJQUaduUlBQolcoK5SqVCkql0pRhExERyYrJkr0QAjNnzoSTkxP8/f2lcldX\nVwQEBAAAAgIC4ObmplMuhEB4eDiaN28Oe3t7DBw4EGFhYcjMzERmZibCwsIwcOBAU4VNREQkOyab\nz/7ChQsIDAxE9+7d4evrCwCYPHkyPvjgA0yaNAnbtm1D+/btsXTpUgDA4MGDERISAnd3dzRp0gQL\nFiwAALRs2RIfffQRRo4cCQAYP348WrZsaaqwiYiIZMdkyf6ll17C9evXK11W+s59WQqFArNnz650\n/ZEjR0rJnoiIiGqGI+gRERHJHJM9ERGRzDHZExERyRyTPRERkcwx2RMREckckz0REZHMMdkTERHJ\nHJM9ERGRzDHZExERyRyTPRERkcwx2RMREckckz0REZHMMdkTERHJHJM9ERGRzDHZExERyRyTPRER\nkcwx2RMREckckz0REZHMMdkTERHJHJM9ERGRzDHZExERyRyTPRERkcwx2RMREckckz0REZHMMdkT\nERHJHJM9ERGRzDUw1Y6nT5+OY8eOoU2bNtizZw8AYNKkSYiLiwMAZGdno3nz5ggMDERSUhKGDh2K\nZ555BgDQt29fzJ07FwAQGRmJ6dOnIz8/H4MHD8bMmTOhUChMFTYREZHsmCzZDx8+HO+++y6mTp0q\nlS1dulT6vGjRItja2ko/d+zYEYGBgRX2M2fOHMybNw99+/bF+++/j9DQUAwePNhUYRMREcmOyarx\n+/fvDzs7u0qXCSGwb98+eHt7G9yHWq1GTk4O+vXrB4VCAT8/PwQHB5siXCIiItmySJv9+fPn0aZN\nG3Tu3FkqS0pKgp+fH959912cP38eAKBSqeDg4CCt4+DgAJVKZe5wiYiI6jWTVeMbsmfPHp2nent7\nexw9ehStWrVCZGQkxo8fj6CgIEuERkREJDtmT/bFxcU4dOgQduzYIZXZ2NjAxsYGANCrVy907NgR\ncXFxUCqVSElJkdZLSUmBUqk0d8hERET1mtmr8U+ePAknJyed6vm0tDRoNBoAQGJiIuLj4+Ho6Ah7\ne3vY2toiPDwcQggEBATAzc3N3CETERHVayZ7sp88eTLOnj2L9PR0uLi4YMKECRg1ahT27t0LLy8v\nnXXPnTuHZcuWoUGDBrCyssJXX32Fli1bAgBmz54tvXrn4uICFxcXU4VMREQkSyZL9kuWLKm0fNGi\nRRXKPD094enpWen6vXv3lt7TJyIioprjCHpEREQyx2RPREQkc0z2REREMsdkT0REJHNM9kRERDLH\nZE9ERCRzTPZEREQyx2RPREQkc0z2REREMsdkT0REJHNM9kRERDLHZE9ERCRzTPZEREQyx2RPREQk\nc0z2REREMsdkT0REJHNM9kRERDLHZE9ERCRzTPZEREQyx2RPREQkc0z2REREMsdkT0REJHNM9kRE\nRDLHZE9ERCRzTPZEREQyx2RPREQkcyZL9tOnT4ezszO8vb2lsuXLl2PQoEHw9fWFr68vQkJCpGWr\nVq2Cu7s7PD09cfz4cak8NDQUnp6ecHd3x+rVq00VLhERkWw1MNWOhw8fjnfffRdTp07VKR8zZgzG\njh2rUxYTE4OgoCAEBQVBpVLB398fBw4cAADMnTsXv/32G5RKJUaOHAlXV1d07drVVGETERHJjsmS\nff/+/ZGUlFStdYODg+Hl5QUbGxs4OjqiU6dOiIiIAAB06tQJjo6OAAAvLy8EBwcz2RMREdWA2dvs\nN27cCB8fH0yfPh2ZmZkAAJVKBQcHB2kdpVIJlUqlt5yIiIiqz6zJ/q233sKhQ4cQGBgIe3t7LFq0\nyJyHJyIieiKZNdm3bdsW1tbWsLKywqhRo3DlyhUAJU/sKSkp0noqlQpKpVJvOREREVWfWZO9Wq2W\nPh8+fBjdunUDALi6uiIoKAiFhYVITExEfHw8+vTpg969eyM+Ph6JiYkoLCxEUFAQXF1dzRkyERFR\nvWeyDnqTJ0/G2bNnkZ6eDhcXF0yYMAFnz55FdHQ0AKBDhw6YO3cuAKBbt254/fXXMXToUFhbW2PW\nrFmwtrYGAMyaNQv/+te/oNFoMGLECOkGgYiIiKrHZMl+yZIlFcpGjRqld/1x48Zh3LhxFcoHDx6M\nwYMHGzW22khJzbV0CERERLXCEfSqSZ3+AKcjky0dBhERUY0x2dfA5Rv3LB0CERFRjTHZExERyRyT\nPRERkcwx2RMREckckz0REZHMMdkTERHJHJM9ERGRzDHZExERyRyTPRERkcwx2RMREckckz0REZHM\nMdkTERHJHJM9ERGRzDHZExERyRyTPRERkcwx2RMREckckz0REZHMMdkTERHJHJM9ERGRzDHZExER\nyRyTPRERkcwx2RMREckckz0REZHMMdnXwJ4TccjILrB0GERERDVismQ/ffp0ODs7w9vbWyr75ptv\n8Nprr8HHxwfjx49HVlYWACApKQl9+vSBr68vfH19MWvWLGmbyMhI+Pj4wN3dHfPnz4cQwlQhV8vS\n/1206PGJiIhqymTJfvjw4Vi7dq1O2YABA7Bnzx7s3r0bnTt3xqpVq6RlHTt2RGBgIAIDAzF37lyp\nfM6cOZg3bx4OHjyI+Ph4hIaGmirkaklJzbXo8YmIiGrKZMm+f//+sLOz0ykbOHAgGjRoAADo168f\nUlJSDO5DrVYjJycH/fr1g0KhgJ+fH4KDg00VMhERkSxZrM1++/btcHFxkX5OSkqCn58f3n33XZw/\nfx4AoFKp4ODgIK3j4OAAlUpl9liJiIjqswaWOOhPP/0Ea2trDBs2DABgb2+Po0ePolWrVoiMjMT4\n8eMRFBRkidCIiIhkx+zJfseOHTh27Bh+//13KBQKAICNjQ1sbGwAAL169ULHjh0RFxcHpVKpU9Wf\nkpICpVJp7pB1FGks20GQiIiopsxajR8aGoq1a9fip59+QpMmTaTytLQ0aDQaAEBiYiLi4+Ph6OgI\ne3t72NraIjw8HEIIBAQEwM3NzZwhV6BOy7Po8YmIiGrKZE/2kydPxtmzZ5Geng4XFxdMmDABq1ev\nRmFhIfz9/QEAffv2xdy5c3Hu3DksW7YMDRo0gJWVFb766iu0bNkSADB79mxMnz4d+fn5cHFx0Wnn\nJyIioqqZLNkvWbKkQtmoUaMqXdfT0xOenp6VLuvduzf27Nlj1NiIiIieJBxBj4iISOaY7ImIiGSO\nyZ6IiEjmmOyJiIhkjsmeiIhI5pjsiYiIZI7JvgoPB/kjIiKqt5jsiYiIZI7JnoiISOaY7Gvhm/Xn\n8Nvuq5YOg4iIqFqY7Gsh7PJd7DgWY+kwiIiIqoXJnoiISOaY7ImIiGSOyZ6IiEjmqpziVqPRICgo\nCNHR0QCAHj16wNvbG9bW1iYPjoiIiB6fwSf7lJQU+Pj4YMOGDSgqKkJRURH+/PNP+Pj4IDk52Vwx\nEhER0WMw+GS/cOFC/P3vf8eYMWN0yn///XcsXLgQy5YtM2VsREREZAQGn+yvXbtWIdEDwJgxYxAV\nFWWqmIiIiMiIDCZ7BQeGJyIiqvcMJvuOHTvi4MGDFcoPHDiAjh07miwoIiIiMh6Dbfaff/45/vnP\nf+LAgQPo27cvACA8PBxnz57Fr7/+apYAiYiI6PEYfLLv3r07goKC4OTkhPPnz+P8+fPo0qULgoKC\n0L17d3PFSERERI+hyvfs7ezsMH78eHPEUu9cib2P3l3aWjoMIiIigww+2efk5GDt2rXYunUrioqK\nsHDhQvj4+GDChAl8zx7AjJUnLB0CERFRlQwm+xkzZuDq1asIDg7G6NGjkZeXhylTpqBjx46YPXu2\nuWIkIiKix2CwGj82NhZBQUEoKirCwIEDsWnTJigUCri4uMDb29tcMRIREdFjMPhkb2NjAwBo2LAh\nnnrqKZ337hs2bFjlzqdPnw5nZ2edG4OMjAz4+/vDw8MD/v7+yMzMBAAIITB//ny4u7vDx8cHV69e\nlbbZuXMnPDw84OHhgZ07d9bsDImIiJ5wBpN9dnY2QkJCEBISgtzcXOlzSEgIcnJyqtz58OHDsXbt\nWp2y1atXw9nZGQcPHoSzszNWr14NAAgNDUV8fDwOHjyIefPmYc6cOQBKbg5WrFiBLVu2YOvWrVix\nYoV0g0BERERVM1iN/9RTT0nJ2sHBQSdxOzg4VLnz/v37IykpSacsODgYf/zxBwDAz88Po0ePxpQp\nUxAcHAw/Pz8oFAr069cPWVlZUKvVOHv2LAYMGICWLVsCAAYMGIDjx4+zGYGIiKiaDCb70qRcmezs\n7FodMDU1Ffb29gCAdu3aITU1FQCgUql0biAcHBygUqkqlCuVSqhUqlodm4iI6ElksBrfEB8fn8c+\nuEKh4Pj7REREJlbrZC+EqNV2bdq0gVqtBgCo1Wq0bt0aQMkTe0pKirReSkoKlEplhXKVSgWlUlnb\nsImIiJ44tU72tX0id3V1RUBAAAAgICAAbm5uOuVCCISHh6N58+awt7fHwIEDERYWhszMTGRmZiIs\nLAwDBw6sbdhG99P2y9h3Kt7SYRAREellsM0+JiZG77Li4uIqdz558mScPXsW6enpcHFxwYQJE/DB\nBx9g0qRJ2LZtG9q3b4+lS5cCAAYPHoyQkBC4u7ujSZMmWLBgAQCgZcuW+OijjzBy5EgAwPjx46XO\nenXB3pPxAIDXnTtbNA4iIiJ9DCb7Dz74QO+yRo0aVbnzJUuWVFq+bt26CmUKhULvqHwjR46Ukj0R\nERHVTJW98Tt06FDpssjISJMERERERMZlsM3+448/lj6Xf7L+8ssvTRNRPXXi8l08KKi6aYOIiMjc\nDCb7sj3uy7fR17Y3vlwtWn8OM3/iLHhERFT3GEz2ZXvcl+99z/fjK7qZmGHpEIiIiCow2GZfUFCA\n2NhYCCF0PpcuIyIiorrPYLLPz8/H+++/L/1c9jOf7ImIiOoHg8n+yJEj5oqDiIiITKTWI+gRERFR\n/cBkT0REJHNM9kRERDLHZE9ERCRzTPZEREQyx2RPREQkc0z2REREMsdkT0REJHNM9kRERDLHZE9E\nRCRzTPZEREQyx2RPREQkc0z2REREMsdkT0REJHNM9ka292QchBCWDoOIiEjCZG9kP22PwPkoFQqL\nNJYOhYiICADQwNIByNF3Gy7gQUExRgzpijHePS0dDhERPeH4ZG8CDwqKAQDbj8ZYOBIiIiImeyIi\nItkzezX+rVu38Mknn0g/JyYmYuLEicjOzsaWLVvQunVrAMDkyZMxePBgAMCqVauwbds2WFlZ4Ysv\nvsCgQYPMHTYREVG9ZfZk7+TkhMDAQACARqOBi4sL3N3dsWPHDowZMwZjx47VWT8mJgZBQUEICgqC\nSqWCv78/Dhw4AGtra3OH/liKijVIUufgmfZ2lg6FiIieMBatxj916hQcHR3RoUMHvesEBwfDy8sL\nNjY2cHR0RKdOnRAREWHGKI1j8caLmLj4GC7fvGfpUIiI6Alj0WQfFBQEb29v6eeNGzfCx8cH06dP\nR2ZmJgBApVLBwcFBWkepVEKlUpk91sd1IuIuACA2KcPCkRAR0ZPGYsm+sLAQR44cwWuvvQYAeOut\nt3Do0CEEBgbC3t4eixYtslRo9IS7fOMedh2PtXQYRERGY7FkHxoaip49e6Jt27YAgLZt28La2hpW\nVlYYNWoUrly5AqDkST4lJUXaTqVSQalUWiRmejJ8seok1gREoqhYa+lQiIiMwmLJPigoCF5eXtLP\narVa+nz48GF069YNAODq6oqgoCAUFhYiMTER8fHx6NOnj9njpScRhz0mInmwyAh6eXl5OHnyJObO\nnSuVfffdd4iOjgYAdOjQQVrWrVs3vP766xg6dCisra0xa9asetcT35QKijTYfuQmPF7uhLYtm1g6\nHCIiqoMskuybNm2KM2fO6JR99913etcfN24cxo0bZ+qw6qVdobHYdPA6zl5LwdJP/mbpcIiIqA7i\nCHpmZuwJ8TJyCgAAyfdzjbtjAqCwdABEREbBZE9ERCRzTPZEREQyxyluTWzX8VjcTORAOkREZDlM\n9ia2JiDS0iFQLSnYZE9EMsFqfCIiIpljsjczDtNCRETmxmRPREQkc0z2RHqwyZ6I5ILJnoiISOaY\n7ImIiGSOyd7CVGl5GPZZII6cT7B0KEREJFNM9hZ27GIihAB+2HTJ0qEQEZFMMdmbmSg3E45Wa6FA\nqEp8TZKI5ILJ3oLOR6nw54FoS4dBREQyx2RvZmWnog0MibVgJERE9KRgsjezlNQ8S4dARERPGCZ7\nMxNsCSYiIjNjsrckDtFGRERmwGRvZoIP9kREZGZM9kRERDLHZG9mZd+zZy0+ERGZA5O9BbFGn4iI\nzIHJnoiISOaY7C3IGNX4JyOSjbAXIiKSMyZ7MzN2b/z7GQ8AsP2fiIj0a2CpA7u6uqJZs2awsrKC\ntbU1duzYgYyMDHzyySe4c+cOOnTogKVLl8LOzg5CCHz99dcICQlB48aNsWjRIvTs2dNSoRuNQsEU\nTUREpmfRJ/t169YhMDAQO3bsAACsXr0azs7OOHjwIJydnbF69WoAQGhoKOLj43Hw4EHMmzcPc+bM\nsWDUj6f8rHdERESmVqeq8YODg+Hn5wcA8PPzw+HDh3XKFQoF+vXrh6ysLKjVakuGahQJqmxLh0BE\nRE8Aiyb7sWPHYvjw4di8eTMAIDU1Ffb29gCAdu3aITU1FQCgUqng4OAgbefg4ACVSmX+gI0g+na6\n9Lm0vZ3qpqoqYe7ey0FKaq7hlYiI6gCLtdlv2rQJSqUSqamp8Pf3h5OTk85yhUIh2zbtkItJyMkr\ntHQY9Jg+XBQMANi92NfCkZCxfPvHecQnZ2Ll526WDoXIqCyW7JVKJQCgTZs2cHd3R0REBNq0aQO1\nWg17e3uo1Wq0bt1aWjclJUXaNiUlRdq+Pvp+4wU0b9rQqPtkTwCix3c8/I6lQyAyCYtU4+fl5SEn\nJ0f6fOLECXTr1g2urq4ICAgAAAQEBMDNreTuurRcCIHw8HA0b95cqu6Xo4vX1Zix8gQeFBRbOpQ6\nJyO7ADN/OoEbCelVr0xERAAs9GSfmpqK8ePHAwA0Gg28vb3h4uKC3r17Y9KkSdi2bRvat2+PpUuX\nAgAGDx6MkJAQuLu7o0mTJliwYIElwjYy/U0Us1efAgCEXkqC5yudzRSP8R08cxsObZqiT9d2Rtvn\n9qM3ERFzH7NXn8Km+UONtl8iIjmzSLJ3dHTErl27KpS3atUK69atq1CuUCgwe/Zsc4RmNvq6IwSE\nxFS5bXxyFi5Gq/DG37rW6Jj5hcW4dScTz3VubZb+EMu3hAMwbpu29mGvOS1fYTQbIQTu3MtBh3a2\nsu1HQyR3derVuydJVm7lHfR+2XW1ym0nfH8Uv+25VuOq7MUbL2DqijCcu/Z4bzJoNFpotEy2T4rt\nR2Mw7psj2Hcq3tKhEFEtMdnXY9Vp0y8o0kD7MDGfjizp5HjrbuZjHfed2fvxz3kHH2sfVH+ciLgL\nAI99k2hMV2+l8uaDqAYs1hufqlZVTbWh5UIIXItLw7Qfw9DNsSUW/8fFaHHlPihC7oMio+2PqKam\n/RgGAHB9yRGNGlpbOBqiuo/JXqbORakw75czAICbiRkY9lnFPhJENVEXh3oWbE4iqhZW49ch5Tvn\nVdUXau/JOOlzXn4xQi4mQaPRAoCU6OWqDuYd2WKXPKL6j8m+DinfOa+qhFbaBl/q+40X4Pf5blyJ\nuW/s0ABAavsvVVSsMclxDFEw9RAR1RiTvQzN+OmEweW3k7NqvM8ft12G75RdyC/TKXD/qdsV1tt7\nMg5TVxyXahieNNdvpyEzp8DSYRAR6WCyfwKFXb5b4232n4oHAKSk5UllufkVO+n9tD0C1+LScPf+\nkzdBTHp2Pj5bdhwfLjxs6VBMoi62nNTFmIjqIib7OmzX8VhcvZWqU1a+Kt2YElXZmPZjGO7ey0GS\nOhs/bLpYYcKeuMd8bU/OSsdOyM2X1zDHHEeHqP5jsq/DElU50itGawKv4Mj5RGTmGqeKuPQd/cIi\nDfILSz4v3xKOq7dS8eGiYMxdewZHzidia/BNne2W/HlR+vwk5ACNRosN+6Jw516O4fW0Ahv3R5sp\nKiKimmGyrwc0Gi12hd7CD5suGq2D2t9nBAEA3pwZhFHTSz6XHYI2+eE87aU3AoY8KCjWacsHzPE0\n+CjWuLuZOp0FU1JzcfBMxf4EtRFyKQmbD9/AlGXHkZKaC3V6XqXrnbuWglNXkqvcX0BILA6cjjdK\nbGbHOnOieovJvh64cF0tfTZmEt0afAPFmpK/4Jdv3MP12xWH3w25mKR/Bw9j+fuMIIx6ePMgLTJR\nti/dbel9yZXY+5i4+Bi+/eO8tM5H3x7B8i3hiL6d9phHE8jJK+mXkJ1XiPcXHMbY+YcqXTOvmlX3\nv+yKxIqtlx8zrqpl5RYa7W0JvgFBVP8x2dcDZd+Zj4xNNbBmzazfGyV9/mLVyUrXqW37c2GR/kQj\nhMBvu69W6I9QqqBIgwW/n0VkbMVXCPMLNTr/xiaV9CEo+xpiUXHJmwDZeuYfkDuNVuCdWfvw4aJg\nS4dicnVxoB+iuojJvp5ZtP6cpUOQbNinv426bNv+vfQHCD6XIE2eE3snEzuOxUj9Eco7fikJp64k\nY/rKExVe4buf8UD6vGzzJfyyK/JxTsFo6lIntuKHv7N76Q+qWLNmnsTEqk7Pw/moujMnAFFtMdlT\nlXaFxupdFhBS+bL4Mu/y/3P+QSz93yV89t8QbNwfjeLiRwn80JnbCL+hxrqga1JZ2Rn13vpyLwBA\nnZaHL34+gQRV9qNtzyYYjLt0L6q0PFwq0xSSfD8XP267zPH9q6sO3ciY29j5h/DV2tNGv3EiMjeO\njU9VWhOo/+m5Jk/WMUmZiEnKxIvP2Utlyx7OeQ8ALz2nRE+nNjrbPCgoqa5f/OcFXIsz3AYfEBIL\nv8FdpJ9L29v/9XVJO/uf815H86Y2mP/bGSSkZMO2SUO85/V8teM3pHw+1Gi0sLZ+dC+dnVeI5k1t\njHIsMr/c/CK0QxNLh1EnRcbeR/t2trif8QCtWzRG25b8PdVFfLKvgqk6mj3J9P1GK+sgCABnIpOr\nTPRAyY1HQZm+Aj9suqiz/O0v9yEgJAYZ2SWvL+ZVMihQrZX7nlwuM2Rx0Ik4vP3lPoReMtDZsR54\n8irxH3kSmzCqIz07H9NXnsCYuQfw6X9D4c+pr+ssJnsymm+q2Z/gRkJGpeX67qvO1mAe9cxsw+MQ\nlJ9/4OqtVMTdzUROXiGS1NkV1jdUq1FKCFFh8KHfdl9FzoMibDp4HT/viAAAhF66o3cfGo3WpAMm\nPQ5T3O7mPiiqcuwCqvtKa894L1T3sRqfjKa6w/CuDrhSafmvu69iyIuOSEjRTbqP81S14+hNvcv2\nnozH3pPxOmXbFnnX+Bgrtl6u8F5/fHIW3vpib7X38eYXe2Fn2wi/zHSv8fHLqw91UR8uOozMnEJs\n/noomjZuaOlwiHRoNFrcy3gAhzbNLB2K0fDJnuqU0XP2Y9fxWzplVXXEK+tBuUGAfttzrcI6hu4d\n8sp02kvNzK/WMY0xgE9BoQbqtIoD9uTlF2H93mtIzZRXB7HMnJKakAcF8hpaWJ/f91zFGj03uaSf\nEAKHztyu8P0vKtaY9Lvz7YbzeH/BYcQkVV4LWR8x2ZOs/FKNavfsPP3v35dt839/gXEntCkwMPaA\nPtuO3MTW4Jv4Zv35qlc2NVbV1tr2ozEVbmKfVA8KinG3mk04Z66mYNmWcMxYqTuT59tf7pNGATWW\ngJBYHLuQCAA4GVEyGmYskz1R3XTpxr3H2r58E0JlNh+6jiPnq1/bUCpRpbvv6NtpWLjuLKLjK+98\nKISQOhPqG6a3LK1WIO5uptHb/tlJtW63Sa8JvIJ/LzpcpzoRZuYU4Mj5BJ3XaEv9Z8kxfLgouFpT\nQac+HFej/CyapYNqVeVaXCpup1RvSu9fdkVi8Z8Xq16xFm6nZGFr8A2LXiO22ROVMe/XM1Wus8FI\nE95MWXbSnunHAAAgAElEQVQcwKOniLIu37iHL1adRMvmjQBUL9nsDruFtYGRePPV7jWOJTL2PrJy\nC/HXPu1rvG1d8KCgGL/sioSvSxc4KptbOhyz2hVaUmNQrNGiYQNrC0dT4uvfziLq4U2s60sddZYl\nP0zc6dkFsLNtZNI4pq4oGbhr92LfWm1vrNz88XdHAQA9OrVCn67tjLPTGuKTPVEdo9UKafji0if7\ntKx87DwWgxkrT1T6tARAGukt7LL+Xv/6TF95AgvXnZOm6a2MMFCPr9EKhF2+gysxFYc4Lt3nT9sv\nY+/JuBrHVh27j9/CgdO38aWeYZ8fV3WeyIw1F4EclCb6lNSqa6QMNm/JrFapunNomAKTPVEdo2/O\ngF93X8WV2PuVduQDILWp37mXW/nyavjo25Lx9G+nZOHu/ZJ21Sg9zQxlHT6bgG/Wn8eMn07ojFZ4\nIVqFd2btw+bD17H3ZDx+2h6hdx9arcCcNad0ZgXcuD8au6vR1l3aWau045+5Ld8SjuFT9yA9u3qd\nOi1JoxUGx5jQaAWu3kqV5pgw5EK02uDyTQev610mhMCJy3cxctoeHDM04VY5Kam1/35bWqIqG0II\npGeZ/3vCZE9kJmV7928+XPkfwfm/nsGMn05UuqwqccmZepcVFGkwcvoenL2Woncd4FGy/Pi7o/hw\noe5EOoZmvyvbLjpr9Sn4fBqIoBNxUpNHUFjlT/QnI5JxI6FkMCVVWh4uRKt1ZgX836Hrel/VBIBP\nfgipdHwEfdYFXTM8k2MZVT2pr9oZgd92l4zbUPpGxoyVJ/D7nqt6txFCVJjvwViqW+U8eWkI3py5\nV+/57T8Vj2k/huHX3VV3dq1sBM3yPedLbxors+9Uyfdi74nKvx+VPdj/uM30s0aWKvsrPRFxFz6f\nBiIm0XCnPUN9ZtbvjcLk/4biH18dMPucC2ZP9snJyRg9ejSGDh0KLy8vrFu3DgCwfPlyDBo0CL6+\nvvD19UVISIi0zapVq+Du7g5PT08cP37c3CETGZ2+SYTOXDWcjAHd6nSNVmBNwBWEXkoy+FS7dNNF\nFBRqdGZQrI4L0Y/+IOmrxhdCVPr0/fOOiCr/MK4OuIJP/xuKI+cTDTYT6HP3fi5+3a0/uZaPc9uR\nm/h+44Vqrf/Fz4abBPaExWHHsRidsiR1DrYfjdGzBTDss13w+3w3lpcZJrpU+eaZ4+F3cCayYn+O\nsmraGXP/qXjculNyU1g6FHV5UQ9Hq7wQZfipXZ8xc3VH0Ss2UENQ/gYlI7sAny8/jsjY+1i88QLO\nVTKgVtkZNYuKtcgvKMai9eekm0ajehhgWlY+Fq0rGTTsFwM3QRv2R8F3yi6p+a0ypf8nzJ3szd5B\nz9raGtOmTUPPnj2Rk5ODESNGYMCAAQCAMWPGYOzYsTrrx8TEICgoCEFBQVCpVPD398eBAwdgbV03\nOqIQmdutO5n48ueTeM/reTRt3LDkla4q7oGTy1V97jsVj5XbLuMDv9548Vl7nWV/7Hs09fGcNad1\nlhVrtPhtz1W4vuiILk+3BADcy6h6DICMMj2v8yt5P/qHTRfh1MFO7/b3Mx7oHXM9JjEDnRxaAAC0\nQqCoWIuYxAwUa7Xo3aVtlbEJIbAl+AZ6OT1ad94vZ6o1RHNtHTxzGxP+3k/6eU3AFew6fgsbvnoN\n1tZW2LAvCkEPn3YNdS67dVd/bU5lqvNUbOxm8urcjpQeMyAkBlHxaZi+Un/tVtm3QzYfvo4WzWxw\n4vJdnLh8F3M/cMYLPez1blteUbHGYKfGldsj4NTBDp8te/QfTF8Nyo6jN7H50A0AQFR8Kpx7G+7s\nau6e+WZ/sre3t0fPnj0BALa2tnBycoJKpf8OJzg4GF5eXrCxsYGjoyM6deqEiAj97X5EcvfN+vNQ\npz/AdxsuVPnu/omIu1Cn5+k8DUXE3MPKh3/0VwdcqTDv/ZbDN/Tv7/Jd7Aq9hUk/hMB/7gEA1Xu6\nLPt3bZSe96NLnziBknbZsq9mGUpS6dkF0h9OrVZg+NTd+HzFcYOdGcv6Zv15bNgXrTPlcvnmDq0Q\nmPvLaYyZewAajVbnD3V+YcWbl7HzDyIqLg15+UUY8/D3ZEjpO/jvLziEt77YKyX6qpSNY8zcAwg+\nV/1XQos1WlyLS4VWK3DwzG2cuqJbi6AVApsPXZeaaDRagZCLSRWGhq46yJIR6a7FpeLtL/dJxRqN\nQEGZV+jyC4sN1oqUKtunJTUjX6fmYM6aUwBKXlX9aXvl35m0rHzkFxbjRMRdDJ+6B8cNDGMNQCfR\nG1J2AK8Fv5/DiGl7DK5v7rfwLPrqXVJSEqKiotC3b19cvHgRGzduREBAAHr16oVp06bBzs4OKpUK\nffv2lbZRKpUGbw6I6JHSqseyZv5Uux7rQugmtvuZ+UhIyapQlW0M5Qc0KtuhrDodx0p9sPAwXnfu\njD5d2yKuzFPwnwei4fqSIxzaNMOJiKqHed586IZUpbwzJFZnSuZR0yvevKjTH+DzFdVLEmXb8PVV\nrZe6l/4AWiGgbN0UgG7CyM4rwtL/XcJznVtjw/5ovO/XC62aNwZQ0m6eXO5d9fe+KrkJ+ffwPtL8\nDbsX+0rjLavS8rBhfzQ27I/G7sW+OHIuAcu2hMPaSoFfvnBHG7vqzW5XrNHC7/PdFco/WfqoqVah\nUCC4BiNlltIKgcoGiP5m/blK5+DQaLR476sDaGnbCB0dSl7R3B12C4Ne6FDtY1b2RH6yku9QYZHG\nYM2Bud+4t1iyz83NxcSJEzFjxgzY2trirbfewkcffQSFQoH//ve/WLRoERYuXGip8IjqBUuP8LXr\n+C0En0s0y7FOXUmGo9JWpwagKuq0PJ3EXGrTwes4fC4BK6e4Vms/ZftSVLa/2tp9/JbBDohAyXlf\nv52Gp+1t8d/NJW39pVX7xZV09iutqRFCYOo/+peUletsWVZpoi+lrxa/dOIijVbgn/MO4oM3+hiM\nu1R1h7Ut0tQ8/R05n4iBfXWrywNDY/VOtlX8sKYnI6cAnRS1G4+hfPOORiuwsJKbaqDkTZa2em6K\nzF2Nb5FkX1RUhIkTJ8LHxwceHh4AgLZtH7WXjRo1Cv/+978BlDzJp6Q8+o+mUqmgVCrNGzBRHbU1\nWP9EP8YWEXMfEeXeozfXtL3ZeYVY8PtZAMB/3nyhwvL45OqNklbWvfQHepsUzOHw2dtVJnoA0nmX\ndTslCxqNkAaNqUzY5buw330V/j49HytOADh05rZOk5FWVLxJ0Kc6Ke3qrVS80uspg+totALWVhVv\nRcpOwKUVwNpqDJldVlR8Gm4mPurcp+/V1/LSs/PxjzmGm2gM1aKZuxrf7G32QgjMnDkTTk5O8Pf3\nl8rV6kc9Pw8fPoxu3boBAFxdXREUFITCwkIkJiYiPj4effpU746SiEyrqmpnYynbtru/zHv4pap6\n37suKn1Kr42PvzuK/yw5VuV6NW1iWbE1HLGV1Jws2xKOPXpenzSWyl7jK2vRuoo3PY+j7AA3k5eG\nSp/vVWNoagBY9hjXDyjppBkZW3EQKlMx+5P9hQsXEBgYiO7du8PXt6QqavLkydizZw+io0teR+rQ\noQPmzp0LAOjWrRtef/11DB06FNbW1pg1axZ74hM9YdTpj3r8X79tglesZKwm4xAcOP34MziWt7ia\nrzpW5XRkit55JGrjpp7XQiubKbMyxnh1buOBaCz8aOBj76c6zJ7sX3rpJVy/XnFAkcGDB+vdZty4\ncRg3bpwpwzKop1ObalftEBHVJZaeMbG6U0VXx5TljzfOSnXaydOqMbpdTZsK9DH2pFWGcAS9apjy\n7ouWDoGIqFZq059BbqJvp2HKstBK35yojcDQWKPsx5g1FVXhrHfVUN1XTIiIqO6ZUs135c3NjA/2\nfLInIiKSOyZ7IiIimWOyJyIikjkmeyIiIpljsiciIpI5JvsaGv63rpYOgYiIqEaY7GvI36cn3Po7\nAgD+rwbzJhMREVkK37Ovhf+8+QL+NawXbJvaQKNn+kYiIqK6gk/2taBQKGDb1AYAYG1thV+/8LBw\nRERERPox2RtBu1ZN8PGofnjTvXuly6e91x9D/9rZvEERERE9xGr8alo/xxOFRVq9yz1f6QQA2Hzo\nRoVlA/q0x4A+7bH3ZHy1jvWac2fsP1W9dYmIiKrCJ/tqatW8MZStm9Z4u95d2tZo/dedO2P8yL4Y\n/fpzNT6WsTzXuXWl5d9NGGTmSIiIyBj4ZG8iv3zhjkYNrdGimY3edZx7P4UHBcUIv3EPAND/eSX+\nPbwPAODvr3bHH/uizBJred9OGASfTwMBAAHfDUNWbgGsFArY2Taq9j7e9nwWLz1nD1Vant4pNjfO\nfR3vzNpnlJiJiEg/PtmbiH2rprCzbQSFQqF3nRlj/oLmTR/dDMwa+wqsrPSvXx0LPxoAAHimfQu0\nb9sMQEmfgj/nvV6r/VlbKdCqeWMp0f/Tp2eV22z+eije8uiBbo6tMLBvB6n8peeU0ucfpwxBi2Y2\nePe1Z2sVV5en7XR+/nHKkCq3GTGEYyQQ0ZOJT/ZmNP/Dv+KLVSd1yt7zeh7Hw+/g41H9KqzfvGlD\ntGhmgzv3cqt9jF5d2uKXme5o27IJVgdcwd37cWjaqAGaN7WBc++ncOpKcrX28/ssD2TlFlYof+Nv\nXXHqSjJUaXlIy8qvdNumjRtWWv53t+5wfdERLWxt0NGhBQDgTfceeKaDHeb9ckZar+vTdrifkY+M\nnAIAJc0KbVs2wcej+urs+88D0dh08DpaNHu0v7JmjX0Zc8vsd/TQ57HjWAyEGaeVJCKqC5jszahv\n93YYO6wXftkVKZUpWzfF7sW+la7/x1evQwHg0/+GICYpU2fZtx8PgkPbpoi7m4UkVTYuXFejl1Mb\nAID9w74Fb3n0QHZeId7y6KGzbSeH5pjhX1KrkJFdgI++PVLh2G3smqCNXZNK4/rm44EAgGGf7dIp\nVyiA7Yt8DPwGgEEvdKhQ9pfnHaQbkVljX0a/7u1wJSYVs9ecAgA4dbCTmjfKetvzWfTt1g5OHUqe\n8mf6/wXnrqlw8MxtAIBtk0e1Jj2d2sDaSoHfvvTAmLkHy51rY6Rmlty4bFnghb/PCEL3ji1xIyHD\n4LkAgPfAZ7AnLK7K9YiILInJ3sh+/cIDOQ8qPhGX8hvcBYfP3sbtlOwq92X9sEp/4UcDkZKWhwnf\nHwUADHnxaTz3TEknulY9GuP/ethjmEuXCtvb2TbClHdfqlAuALRvawsAaN7UBl+974zrCen480A0\nWrdoXGVcpU0T62d7wspKgXdn7wcANLS2QsMG+luGmjXR/3WbOvolpGUVoF2rkhuMF3q0w9/+72mc\nuZpscIjing9vcADglV5P4ZVeT0nJvnunVnB5oQMGv/A0+j9f0oTQxq4J1s/2xKQfjsHXpQuaNG6I\nV/s74rsNF3A6MhmNbayxZYEXGjW0hu+URzczwwY54UK0SqeWJeBbH5y5msJkT0S1Mm5ExYcYU2Gy\nN7J2rZpICUufZZ8OgbYGdcmNGzVA56dawN/7ecQlZ+E/b75Qq9hKuw+UP/T/PWuP/3vWHj4Dn0Ej\nG+tq76/VwxuD1//aGfsMvFb48zQ3RMWlVVrVXsra2krn96ZQKPDpOy9WO5ayAr71gUKhgJWVotKb\nnVYtGmPd7Nd0ymaM+Qu0WgGFQoEmjUr+W/w4ZQjGf1dyg/XOa89i9NDncDMhA8u3hENAwNraCg5t\nmkn7+OStFzDkRUepxmPHNz4YPrXi6IrvvvYsNuyPrlD+8zQ3/HtRcLXOsXwThSFtWzbB/YwH1VqX\n9KvOK7HtWjVB/+eUUKc/wPkolVnisjRHZXMkqqp+eDGlzk+1wJAXHfHbnqtSWbMmDZH7oKjS9Xt1\naYPI2NQaHcMUr0Q3sDZftzkmewuwslLACjXviDd8SLfHOu7LPR1wMiIZgyupSgcgjQpYU6WdDBs2\nrPxGoUM7W3RoZ1urfdeGdS3/A5XvHNnRoQW2LvBC40aP/pv07toWP09zk3526mCHBR8NwDNPtajw\n+2vYwAqrprmheTMbvP1lyVsHQ158Gm+696iQ7DfNe11n+9++9ECLZjbQagVsGlrjVGQyFq07B6Dk\nOvZ/3gE7vvHGmsBIvO7cGVNXHMeDAg0AYNf3w7B8SzgOnU3AiCFd8f88euDohSSs3HZZ2v8vM90x\ncfFR5OYX47nOrREVn6YTz5oZr8KhTTMUFGmw9fANvPScEk+1bYZ/zj+EwiKNzrqbvx6KtYGRuBCt\nwvhR/bAm4ApSUvMAlNT+NG7UAH+fEQRA9wbIUWmLRFUO3ny1O7o6tsRznVtLtUSV6eTQHD6DumDF\n1vAKv+dfv/DA6Dn7MahfB/h790S7Vk2kN0o8Xu4k1faUWjR+IE5HJiMgJBYA8LZHD/w/jx6YvfoU\nLt24h4UfDYA6PQ/7T91GQZEGvi5OcH2pI8YN74Ov1p5Gj06tEHb5LoYNckJUfBrSMvPxn//3Atq2\nfHTDGh2fhhMRd/G0fXMp5t2LfZGQkiXdRK783BUxSRk4diEJVlYKnRsEf++eSFJnY/zIvtJ389+L\ngqFOz8OQFx3RuX0LRNy8j2c7t0aLZjbweLkThBBSzVvy/VzEJGYg6V4OBvVrj/ZtbXEtLhXJ93Ox\n6dB1jHLrjoJCjU6zIgCMdO2G3AdF2HcqHuNG9EFhkQa/7LqKZZ/+DYVFGvzv0A0M6PMUTl5Jxqdv\nv4hmTRri7v0crAu6hveGPo8Py9ywLpnkgslLQzH8b13h2t8R24/cxBt/64qJi48BKPn/8MbfuqKg\nSIPwG/ewcX+0TlLdssALhUUanL2agq6OLXEjIR2er3QGAKRmPoBWC9g2bSjdoA8f0hV37+dAqxVo\n39YWMUkZaNq4AcZ9cwTPdmoF38Fd0LtLW9jZNsL5KBW2H70JIUpeef5+4wUp7qn/eAldn26JsMt3\nsS7oGjZ89RrsbBvBtklDuLzQAYVFGhRrBGLvZCAqLg3p2QVYNL6keVMIgd/2XIM6PQ8D+rRHSmou\nTkcmI/dBMZZOHozGNg3w2bJQXL+dbta/ixAylJiYKLp37y4SExMtHUqdotVqRfL9HKHVao2636zc\nAvHV2lPiRkKaUfdbX6VlPRAJKVk6ZbkPCoU6LU/6+bs/zgvvyQFi86Hr4tqtVKl857Gb4vSVuxX2\nqdFoRWBojFCl5eo9bvh1tUjNfKB3eUxiukhSZ+uUFWu0olijFTcT0kXug0Ixe/VJEXHznsHzu52c\nKfznHRC/77kq8vKLKo01/IZa7AqNlcoiY++LyNj7QgghHuQXiWJNyXew/HdRo9HqlGk0WnH5ploU\nF2uksqzcAvHPeQdE8LkEoUrNFTl5hXpjLd3XjYQ0kZdfJO6l54mj5xOEVqsVhUUacfZqsigsKjZ4\nvo/rQUGRmLPmlM7v9cDpeOn3UV5EzD1xJabya6DVaqXfnbEUFWvEhWiVOHXlrogoc9yy16Hs778q\nO47eFEEnbokiA9u899V+MWNlWKXLtFqtuHMvW2iMeJ730vOqPIfQi0li5k9hIju3wGjH1Scnr1Dn\nd20MVeU9hRDy65uclJQENzc3BAcH4+mnn7Z0OESVKtZozVqNR1RXiDI1EGQcVeU9/qUhshAmenpS\nMdGbH//aEBERyRyTPRERkczVm2QfGhoKT09PuLu7Y/Xq1ZYOh4iIqN6oF8leo9Fg7ty5WLt2LYKC\ngrBnzx7ExMRYOiwiIqJ6oV4k+4iICHTq1AmOjo6wsbGBl5cXgoOrN/gIERHRk65eJHuVSgUHBwfp\nZ6VSCZXqyRidioiI6HHVi2RPREREtVcvkr1SqURKSor0s0qlglKpNLAFERERlaoXyb53796Ij49H\nYmIiCgsLERQUBFdXV0uHRUREVC/Ui4lwGjRogFmzZuFf//oXNBoNRowYgW7dHm9SGCIioidFvUj2\nADB48GAMHjy4WutqNCWzcpWt+iciIpKr0nxXmv/KqzfJvibu3bsHAHjnnXcsHAkREZH53Lt3D506\ndapQLstZ7/Lz8xEZGYl27drB2rryOdaJiIjkQqPR4N69e+jVqxcaN25cYbkskz0RERE9Ui964xMR\nEVHtMdkTERHJHJM9ERGRzDHZExERyRyTfRVCQ0Ph6ekJd3d3rF692tLh6OXq6gofHx/4+vpi+PDh\nAICMjAz4+/vDw8MD/v7+yMzMBAAIITB//ny4u7vDx8cHV69elfazc+dOeHh4wMPDAzt37jRL7NOn\nT4ezszO8vb2lMmPGHhkZCR8fH7i7u2P+/PkwVZ/Uys5j+fLlGDRoEHx9feHr64uQkBBp2apVq+Du\n7g5PT08cP35cKtf3nUtMTMSoUaPg7u6OSZMmobCw0CTnAQDJyckYPXo0hg4dCi8vL6xbtw5A/bwu\n+s6lvl2bgoICjBw5EsOGDYOXlxeWLVtm8NiFhYWYNGkS3N3dMWrUKCQlJdX6/Mx1LtOmTYOrq6t0\nTaKiogDU7e9XKY1GAz8/P3z44YcA6uB1EaRXcXGxcHNzEwkJCaKgoED4+PiImzdvWjqsSg0ZMkSk\npqbqlH3zzTdi1apVQgghVq1aJb799lshhBDHjh0TY8eOFVqtVly6dEmMHDlSCCFEenq6cHV1Fenp\n6SIjI0O4urqKjIwMk8d+9uxZERkZKby8vEwS+4gRI8SlS5eEVqsVY8eOFceOHTPbeSxbtkysXbu2\nwro3b94UPj4+oqCgQCQkJAg3NzdRXFxs8Ds3ceJEsWfPHiGEEF9++aXYuHGjSc5DCCFUKpWIjIwU\nQgiRnZ0tPDw8xM2bN+vlddF3LvXt2mi1WpGTkyOEEKKwsFCMHDlSXLp0Se+xN2zYIL788kshhBB7\n9uwR//nPf2p9fuY6l6lTp4p9+/ZVWL8uf79K/frrr2Ly5Mnigw8+EELo/05Y6rrwyd6AiIgIdOrU\nCY6OjrCxsYGXlxeCg4MtHVa1BQcHw8/PDwDg5+eHw4cP65QrFAr069cPWVlZUKvVCAsLw4ABA9Cy\nZUvY2dlhwIABOneXptK/f3/Y2dmZJHa1Wo2cnBz069cPCoUCfn5+JruGlZ2HPsHBwfDy8oKNjQ0c\nHR3RqVMnRERE6P3OCSFw+vRpeHp6AgDeeOMNk34X7e3t0bNnTwCAra0tnJycoFKp6uV10Xcu+tTV\na6NQKNCsWTMAQHFxMYqLi6FQKPQe+8iRI3jjjTcAAJ6enjh16hSEEDU+P1PQdy761OXvF1Ayet2x\nY8cwcuRIADD4nbDUdWGyN0ClUsHBwUH6WalUGvwjYWljx47F8OHDsXnzZgBAamoq7O3tAQDt2rVD\namoqgIrn5eDgAJVKVafO11ix61vfnDZu3AgfHx9Mnz5dqvaubryl5enp6WjRogUaNGhg9vNISkpC\nVFQU+vbtW++vS9lzAerftdFoNPD19cVf//pX/PWvf4Wjo6PeY6tUKjz11FMASuYXad68OdLT02t8\nfqZS/lxKr8kPP/wAHx8fLFiwQKr6ruvfrwULFmDKlCmwsipJqYa+E5a6Lkz2MrFp0ybs3LkTa9as\nwcaNG3Hu3Dmd5QqFwuCdc11Wn2N/6623cOjQIQQGBsLe3h6LFi2ydEg1kpubi4kTJ2LGjBmwtbXV\nWVbfrkv5c6mP18ba2hqBgYEICQlBREQEbt26ZemQaq38udy4cQOTJ0/G/v37sX37dmRmZtbpflKl\njh49itatW6NXr16WDsUgJnsDlEqlzmQ6KpUKSqXSghHpVxpXmzZt4O7ujoiICLRp0wZqtRoAoFar\n0bp1a2ndsueVkpICpVJZp87XWLHrW99c2rZtC2tra1hZWWHUqFG4cuVKpeehL97S8latWiErKwvF\nxcVmO4+ioiJMnDgRPj4+8PDwAFB/r0tl51Kfr02LFi3w8ssvIzw8XO+xlUolkpOTAZRUlWdnZ6NV\nq1Y1Pj9TKz2X48ePw97eHgqFAjY2Nhg+fLjea1KXvl8XL17EkSNH4OrqismTJ+P06dP4+uuv69x1\nYbI3oHfv3oiPj0diYiIKCwsRFBQEV1dXS4dVQV5eHnJycqTPJ06cQLdu3eDq6oqAgAAAQEBAANzc\n3ABAKhdCIDw8HM2bN4e9vT0GDhyIsLAwZGZmIjMzE2FhYRg4cKBFzslYsdvb28PW1hbh4eEQQujs\nyxxKEyMAHD58WJqa2dXVFUFBQSgsLERiYiLi4+PRp08fvd85hUKBl19+GQcOHABQ0gPZlN9FIQRm\nzpwJJycn+Pv7S+X18broO5f6dm3S0tKQlZUFoGT+j5MnT6JLly56j+3q6ir1Tj9w4ABeeeUVKBSK\nGp+fKVR2Lk5OTtI1EUJUuCZ19fv16aefIjQ0FEeOHMGSJUvwyiuvYPHixXXvutSq2+ET5NixY8LD\nw0O4ubmJlStXWjqcSiUkJAgfHx/h4+Mjhg4dKsWZlpYm/vGPfwh3d3fx3nvvifT0dCFESU/YOXPm\nCDc3N+Ht7S0iIiKkfW3dulW8+uqr4tVXXxXbtm0zS/yffPKJGDBggHj++efFoEGDxJYtW4wae0RE\nhPDy8hJubm7iq6++Elqt1mzn8dlnnwlvb2/h7e0tPvzwQ6FSqaT1V65cKdzc3ISHh4dOT2F937mE\nhAQxYsQI8eqrr4oJEyaIgoICk5yHEEKcO3dOdO/eXXh7e4thw4aJYcOGiWPHjtXL66LvXOrbtYmK\nihK+vr7C29tbeHl5ieXLlxs8dn5+vpgwYYJ49dVXxYgRI0RCQkKtz89c5zJ69Gip7NNPP5V67Nfl\n71dZp0+flnrj17XrwolwiIiIZI7V+ERERDLHZE9ERCRzTPZEREQyx2RPREQkc0z2REREMsdkT/QE\n8vX1RX5+PgDg999/l4a9NaakpCRp6OZS77//PhISEox+LCIyjMme6AkUGBiIxo0bAwDWr19fq2Rf\nOjqYPnfu3KmQ7NesWYOOHTvW+FhE9Hj4nj3RE6hHjx64ePEi1q9fjx9//BFPP/00GjVqhMWLF6Nj\nx06oFR4AAAKuSURBVI744YcfcO7cORQWFqJHjx6YM2cOmjVrhmnTpsHa2hpxcXHIzc1FYGAgPv30\nU8TFxaGoqAgdO3bEggULYGdnBy8vLyQlJaFz587o1KkTli1bBldXV/z888/o3r07bt++jVmzZiEt\nLQ0NGjTAJ598AhcXFym+Tz75BIcOHUJGRgY+//xzaQYxIqqFWg4URET1WPfu3aXRyYYMGSKuX78u\nLfvxxx/Fjz/+KP387bffiiVLlgghhJg6dap44403RG5urrQ8NTVV+rxkyRLx3XffCSFKRhN74403\ndI5b9lgjR44UW7ZsEUKUzOX9l7/8RdpX9+7dxR9//CGEEOL8+fNi4MCBxjlxoidUA0vfbBBR3XLk\nyBHk5ORI43oXFhbi2WeflZa/9tpraNq0qfRzYGAgdu/ejaKiIuTl5aFz585VHiMnJwdRUVEYMWIE\nAKBr16547rnnEB4eLo37PXToUABAv379oFarUVBQgEaNGhnrNImeKEz2RKRDCIHZs2fD2dm50uVl\nE/358+exadMm/O9//0Pr1q2xe/dubNmyxShxlCZ2a2trACV9BJjsiWqHHfSInnDNmjVDdna29LOr\nqyt+//13qbd+Tk4OYmNjK902KysLtra2aNmyJQoLC7F9+3Zpma2trTQbY3m2trZ47rnnpNm/YmNj\nER0djX79+hnrtIioDCZ7oifcP/7xD8yYMQO+vr6IiYnBBx98gGeffRYjR46Ej48P3n77bb3JftCg\nQejYsSM8PT3x7rvv4vnnn5eW9ejRA8888wy8vb0xceLECtt+//332LVrF3x8fPDZZ5/h22+/RevW\nrU12nkRPMvbGJyIikjk+2RMREckckz0REZHMMdkTERHJHJM9ERGRzDHZExERyRyTPRERkcwx2RMR\nEckckz0REZHM/X8yJ/lQvOiodwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(inference.hist)\n", + "plt.ylabel('ELBO')\n", + "plt.xlabel('iteration');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It works!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## Summary\n", + "\n", + "Hopefully this blog post demonstrated a very powerful new inference algorithm available in [PyMC3](http://pymc-devs.github.io/pymc3/): [ADVI](http://pymc-devs.github.io/pymc3/api.html#advi). I also think bridging the gap between Probabilistic Programming and Deep Learning can open up many new avenues for innovation in this space, as discussed above. Specifically, a hierarchical neural network sounds pretty bad-ass. These are really exciting times.\n", + "\n", + "## Next steps\n", + "\n", + "[`Theano`](http://deeplearning.net/software/theano/), which is used by `PyMC3` as its computational backend, was mainly developed for estimating neural networks and there are great libraries like [`Lasagne`](https://github.com/Lasagne/Lasagne) that build on top of `Theano` to make construction of the most common neural network architectures easy. Ideally, we wouldn't have to build the models by hand as I did above, but use the convenient syntax of `Lasagne` to construct the architecture, define our priors, and run ADVI. \n", + "\n", + "You can also run this example on the GPU by setting `device = gpu` and `floatX = float32` in your `.theanorc`.\n", + "\n", + "You might also argue that the above network isn't really deep, but note that we could easily extend it to have more layers, including convolutional ones to train on more challenging data sets.\n", + "\n", + "\n", + "## Acknowledgements\n", + "\n", + "[Taku Yoshioka](https://github.com/taku-y) did a lot of work on ADVI in PyMC3, including the mini-batch implementation as well as the sampling from the variational posterior. I'd also like to the thank the Stan guys (specifically Alp Kucukelbir and Daniel Lee) for deriving ADVI and teaching us about it. Thanks also to Chris Fonnesbeck, Andrew Campbell, Taku Yoshioka, and Peadar Coyle for useful comments on an earlier draft. After that [Maxim Kochurov](https://github.com/ferrine) implemented OPVI framework, as a unified interface for variational (including minibatch training and AEVB) methods" + ] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.4.3" + }, + "latex_envs": { + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 0 + }, + "nav_menu": {}, + "toc": { + "navigate_menu": true, + "number_sections": true, + "sideBar": true, + "threshold": 6, + "toc_cell": false, + "toc_section_display": "block", + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/pymc3/distributions/dist_math.py b/pymc3/distributions/dist_math.py index 22aa4c6085..e609ed011b 100644 --- a/pymc3/distributions/dist_math.py +++ b/pymc3/distributions/dist_math.py @@ -9,6 +9,9 @@ import theano.tensor as tt from .special import gammaln +from ..math import logdet as _logdet + +c = - 0.5 * np.log(2 * np.pi) def bound(logp, *conditions, **kwargs): @@ -96,3 +99,117 @@ def i1(x): x**9 / 1474560 + x**11 / 176947200 + x**13 / 29727129600, np.e**x / (2 * np.pi * x)**0.5 * (1 - 3 / (8 * x) + 15 / (128 * x**2) + 315 / (3072 * x**3) + 14175 / (98304 * x**4))) + + +def sd2rho(sd): + """ + `sd -> rho` theano converter + :math:`mu + sd*e = mu + log(1+exp(rho))*e`""" + return tt.log(tt.exp(sd) - 1) + + +def rho2sd(rho): + """ + `rho -> sd` theano converter + :math:`mu + sd*e = mu + log(1+exp(rho))*e`""" + return tt.log1p(tt.exp(rho)) + + +def log_normal(x, mean, **kwargs): + """ + Calculate logarithm of normal distribution at point `x` + with given `mean` and `std` + Parameters + ---------- + x : Tensor + point of evaluation + mean : Tensor + mean of normal distribution + kwargs : one of parameters `{sd, tau, w, rho}` + Notes + ----- + There are four variants for density parametrization. + They are: + 1) standard deviation - `std` + 2) `w`, logarithm of `std` :math:`w = log(std)` + 3) `rho` that follows this equation :math:`rho = log(exp(std) - 1)` + 4) `tau` that follows this equation :math:`tau = std^{-1}` + ---- + """ + sd = kwargs.get('sd') + w = kwargs.get('w') + rho = kwargs.get('rho') + tau = kwargs.get('tau') + eps = kwargs.get('eps', 0.0) + check = sum(map(lambda a: a is not None, [sd, w, rho, tau])) + if check > 1: + raise ValueError('more than one required kwarg is passed') + if check == 0: + raise ValueError('none of required kwarg is passed') + if sd is not None: + std = sd + elif w is not None: + std = tt.exp(w) + elif rho is not None: + std = rho2sd(rho) + else: + std = tau**(-1) + std += eps + return c - tt.log(tt.abs_(std)) - (x - mean) ** 2 / (2 * std ** 2) + + +def log_normal_mv(x, mean, gpu_compat=False, **kwargs): + """ + Calculate logarithm of normal distribution at point `x` + with given `mean` and `sigma` matrix + Parameters + ---------- + x : Tensor + point of evaluation + mean : Tensor + mean of normal distribution + kwargs : one of parameters `{cov, tau, chol}` + + Flags + ---------- + gpu_compat : False, because LogDet is not GPU compatible yet. + If this is set as true, the GPU compatible (but numerically unstable) log(det) is used. + + Notes + ----- + There are three variants for density parametrization. + They are: + 1) covariance matrix - `cov` + 2) precision matrix - `tau`, + 3) cholesky decomposition matrix - `chol` + ---- + """ + if gpu_compat: + def logdet(m): + return tt.log(tt.abs_(tt.nlinalg.det(m))) + else: + logdet = _logdet + + T = kwargs.get('tau') + S = kwargs.get('cov') + L = kwargs.get('chol') + check = sum(map(lambda a: a is not None, [T, S, L])) + if check > 1: + raise ValueError('more than one required kwarg is passed') + if check == 0: + raise ValueError('none of required kwarg is passed') + # avoid unnecessary computations + if L is not None: + S = L.dot(L.T) + T = tt.nlinalg.matrix_inverse(S) + log_det = -logdet(S) + elif T is not None: + log_det = logdet(T) + else: + T = tt.nlinalg.matrix_inverse(S) + log_det = -logdet(S) + delta = x - mean + k = S.shape[0] + result = k * tt.log(2 * np.pi) - log_det + result += delta.dot(T).dot(delta) + return -1 / 2. * result diff --git a/pymc3/math.py b/pymc3/math.py index bf58294814..c4a307ac1b 100644 --- a/pymc3/math.py +++ b/pymc3/math.py @@ -37,13 +37,17 @@ def logit(p): return tt.log(p / (1 - p)) +def flatten_list(tensors): + return tt.concatenate([var.ravel() for var in tensors]) + + class LogDet(Op): """Computes the logarithm of absolute determinant of a square matrix M, log(abs(det(M))), on CPU. Avoids det(M) overflow/ underflow. Note: Once PR #3959 (https://github.com/Theano/Theano/pull/3959/) by harpone is merged, - this must be removed. + this must be removed. """ def make_node(self, x): x = theano.tensor.as_tensor_variable(x) diff --git a/pymc3/memoize.py b/pymc3/memoize.py index 5d25e03b87..e936190099 100644 --- a/pymc3/memoize.py +++ b/pymc3/memoize.py @@ -1,4 +1,5 @@ import functools +import pickle def memoize(obj): @@ -23,8 +24,16 @@ def hashable(a): Turn some unhashable objects into hashable ones. """ if isinstance(a, dict): - return hashable(a.items()) + return hashable(tuple((hashable(a1), hashable(a2)) for a1, a2 in a.items())) try: - return tuple(map(hashable, a)) - except: - return a + return hash(a) + except TypeError: + pass + # Not hashable >>> + try: + return hash(pickle.dumps(a)) + except Exception: + if hasattr(a, '__dict__'): + return hashable(a.__dict__) + else: + return id(a) diff --git a/pymc3/model.py b/pymc3/model.py index 090d89885a..c7b46e89d5 100644 --- a/pymc3/model.py +++ b/pymc3/model.py @@ -1,14 +1,15 @@ +import collections import threading import six import numpy as np import scipy.sparse as sps -import theano -import theano.tensor as tt import theano.sparse as sparse +from theano import theano, tensor as tt from theano.tensor.var import TensorVariable import pymc3 as pm +from pymc3.math import flatten_list from .memoize import memoize from .theanof import gradient, hessian, inputvars, generator from .vartypes import typefilter, discrete_types, continuous_types, isgenerator @@ -19,6 +20,8 @@ 'Point', 'Deterministic', 'Potential' ] +FlatView = collections.namedtuple('FlatView', 'input, replacements, view') + class InstanceMethod(object): """Class for hiding references to instance methods so they can be pickled. @@ -172,8 +175,10 @@ def fastd2logp(self, vars=None): @property def logpt(self): """Theano scalar of log-probability of the model""" - - return tt.sum(self.logp_elemwiset) * self.scaling + if getattr(self, 'total_size', None) is not None: + return tt.sum(self.logp_elemwiset) * self.scaling + else: + return tt.sum(self.logp_elemwiset) @property def scaling(self): @@ -659,6 +664,33 @@ def profile(self, outs, n=1000, point=None, profile=True, *args, **kwargs): return f.profile + def flatten(self, vars=None): + """Flattens model's input and returns: + FlatView with + * input vector variable + * replacements `input_var -> vars` + * view {variable: VarMap} + + Parameters + ---------- + vars : list of variables or None + if None, then all model.free_RVs are used for flattening input + + Returns + ------- + flat_view + """ + if vars is None: + vars = self.free_RVs + order = ArrayOrdering(vars) + inputvar = tt.vector('flat_view', dtype=theano.config.floatX) + inputvar.tag.test_value = flatten_list(vars).tag.test_value + replacements = {self.named_vars[name]: inputvar[slc].reshape(shape).astype(dtype) + for name, slc, shape, dtype in order.vmap} + view = {vm.var: vm for vm in order.vmap} + flat_view = FlatView(inputvar, replacements, view) + return flat_view + def fn(outs, mode=None, model=None, *args, **kwargs): """Compiles a Theano function which returns the values of `outs` and diff --git a/pymc3/tests/helpers.py b/pymc3/tests/helpers.py index f23c7481e1..efbd1468e7 100644 --- a/pymc3/tests/helpers.py +++ b/pymc3/tests/helpers.py @@ -1,6 +1,8 @@ import unittest -import numpy.random as nr from logging.handlers import BufferingHandler +import numpy.random as nr +from theano.sandbox.rng_mrg import MRG_RandomStreams +from ..theanof import set_tt_rng, tt_rng class SeededTest(unittest.TestCase): @@ -12,6 +14,11 @@ def setUpClass(cls): def setUp(self): nr.seed(self.random_seed) + self.old_tt_rng = tt_rng() + set_tt_rng(MRG_RandomStreams(self.random_seed)) + + def tearDown(self): + set_tt_rng(self.old_tt_rng) class TestHandler(BufferingHandler): def __init__(self, matcher): diff --git a/pymc3/tests/test_examples.py b/pymc3/tests/test_examples.py index 926fd0929a..91b5533d0f 100644 --- a/pymc3/tests/test_examples.py +++ b/pymc3/tests/test_examples.py @@ -234,6 +234,7 @@ class TestLatentOccupancy(SeededTest): Copyright (c) 2008 University of Otago. All rights reserved. """ def setUp(self): + super(TestLatentOccupancy, self).setUp() # Sample size n = 100 # True mean count, given occupancy diff --git a/pymc3/tests/test_math.py b/pymc3/tests/test_math.py index d160df5f8b..7073817238 100644 --- a/pymc3/tests/test_math.py +++ b/pymc3/tests/test_math.py @@ -4,13 +4,15 @@ from pymc3.math import LogDet, logdet, probit, invprobit from .helpers import SeededTest + def test_probit(): p = np.array([0.01, 0.25, 0.5, 0.75, 0.99]) np.testing.assert_allclose(invprobit(probit(p)).eval(), p, atol=1e-5) -class TestLogDet(SeededTest): +class TestLogDet(SeededTest): def setUp(self): + super(TestLogDet, self).setUp() utt.seed_rng() self.op_class = LogDet self.op = logdet diff --git a/pymc3/tests/test_variational_inference.py b/pymc3/tests/test_variational_inference.py new file mode 100644 index 0000000000..4dac00663e --- /dev/null +++ b/pymc3/tests/test_variational_inference.py @@ -0,0 +1,244 @@ +from six.moves import cPickle as pickle +import unittest +import numpy as np +from theano import theano, tensor as tt +import pymc3 as pm +from pymc3 import Model, Normal +from pymc3.variational.inference import ( + KL, MeanField, ADVI, FullRankADVI, + fit +) + +from pymc3.tests import models +from pymc3.tests.helpers import SeededTest + + +class TestELBO(SeededTest): + def test_elbo(self): + mu0 = 1.5 + sigma = 1.0 + y_obs = np.array([1.6, 1.4]) + + post_mu = np.array([1.88], dtype=theano.config.floatX) + post_sd = np.array([1], dtype=theano.config.floatX) + # Create a model for test + with Model() as model: + mu = Normal('mu', mu=mu0, sd=sigma) + Normal('y', mu=mu, sd=1, observed=y_obs) + + # Create variational gradient tensor + mean_field = MeanField(model=model) + elbo = -KL(mean_field)()(mean_field.random()) + + mean_field.shared_params['mu'].set_value(post_mu) + mean_field.shared_params['rho'].set_value(np.log(np.exp(post_sd) - 1)) + + f = theano.function([], elbo) + elbo_mc = sum(f() for _ in range(10000)) / 10000 + + # Exact value + elbo_true = (-0.5 * ( + 3 + 3 * post_mu ** 2 - 2 * (y_obs[0] + y_obs[1] + mu0) * post_mu + + y_obs[0] ** 2 + y_obs[1] ** 2 + mu0 ** 2 + 3 * np.log(2 * np.pi)) + + 0.5 * (np.log(2 * np.pi) + 1)) + np.testing.assert_allclose(elbo_mc, elbo_true, rtol=0, atol=1e-1) + + +class TestApproximates: + class Base(SeededTest): + inference = None + NITER = 30000 + + def test_vars_view(self): + _, model, _ = models.multidimensional_model() + with model: + app = self.inference().approx + posterior = app.random(10) + x_sampled = app.view(posterior, 'x').eval() + self.assertEqual(x_sampled.shape, (10,) + model['x'].dshape) + + def test_vars_view_dynamic_size(self): + _, model, _ = models.multidimensional_model() + with model: + app = self.inference().approx + i = tt.iscalar('i') + i.tag.test_value = 1 + posterior = app.random(i) + x_sampled = app.view(posterior, 'x').eval({i: 10}) + self.assertEqual(x_sampled.shape, (10,) + model['x'].dshape) + x_sampled = app.view(posterior, 'x').eval({i: 1}) + self.assertEqual(x_sampled.shape, (1,) + model['x'].dshape) + + def test_vars_view_dynamic_size_numpy(self): + _, model, _ = models.multidimensional_model() + with model: + app = self.inference().approx + i = tt.iscalar('i') + i.tag.test_value = 1 + x_sampled = app.view(app.random_fn(10), 'x') + self.assertEqual(x_sampled.shape, (10,) + model['x'].dshape) + x_sampled = app.view(app.random_fn(1), 'x') + self.assertEqual(x_sampled.shape, (1,) + model['x'].dshape) + x_sampled = app.view(app.random_fn(), 'x') + self.assertEqual(x_sampled.shape, () + model['x'].dshape) + + def test_sample_vp(self): + n_samples = 100 + xs = np.random.binomial(n=1, p=0.2, size=n_samples) + with pm.Model(): + p = pm.Beta('p', alpha=1, beta=1) + pm.Binomial('xs', n=1, p=p, observed=xs) + app = self.inference().approx + trace = app.sample_vp(draws=1, hide_transformed=True) + self.assertListEqual(trace.varnames, ['p']) + self.assertEqual(len(trace), 1) + trace = app.sample_vp(draws=10, hide_transformed=False) + self.assertListEqual(sorted(trace.varnames), ['p', 'p_logodds_']) + self.assertEqual(len(trace), 10) + + def test_sample_node(self): + n_samples = 100 + xs = np.random.binomial(n=1, p=0.2, size=n_samples) + with pm.Model(): + p = pm.Beta('p', alpha=1, beta=1) + pm.Binomial('xs', n=1, p=p, observed=xs) + app = self.inference().approx + app.sample_node(p).eval() # should be evaluated without errors + + def test_optimizer_with_full_data(self): + n = 1000 + sd0 = 2. + mu0 = 4. + sd = 3. + mu = -5. + + data = sd * np.random.randn(n) + mu + + d = n / sd ** 2 + 1 / sd0 ** 2 + mu_post = (n * np.mean(data) / sd ** 2 + mu0 / sd0 ** 2) / d + + with Model(): + mu_ = Normal('mu', mu=mu0, sd=sd0, testval=0) + Normal('x', mu=mu_, sd=sd, observed=data) + pm.Deterministic('mu_sq', mu_**2) + inf = self.inference() + self.assertEqual(len(inf.hist), 0) + inf.fit(10) + self.assertEqual(len(inf.hist), 10) + self.assertFalse(np.isnan(inf.hist).any()) + approx = inf.fit(self.NITER) + self.assertEqual(len(inf.hist), self.NITER + 10) + self.assertFalse(np.isnan(inf.hist).any()) + trace = approx.sample_vp(10000) + np.testing.assert_allclose(np.mean(trace['mu']), mu_post, rtol=0.1) + np.testing.assert_allclose(np.std(trace['mu']), np.sqrt(1. / d), rtol=0.2) + + def test_optimizer_minibatch_with_generator(self): + n = 1000 + sd0 = 2. + mu0 = 4. + sd = 3. + mu = -5. + + data = sd * np.random.randn(n) + mu + + d = n / sd**2 + 1 / sd0**2 + mu_post = (n * np.mean(data) / sd**2 + mu0 / sd0**2) / d + + def create_minibatch(data): + while True: + data = np.roll(data, 100, axis=0) + yield data[:100] + + minibatches = create_minibatch(data) + with Model(): + mu_ = Normal('mu', mu=mu0, sd=sd0, testval=0) + Normal('x', mu=mu_, sd=sd, observed=minibatches, total_size=n) + inf = self.inference() + approx = inf.fit(self.NITER) + trace = approx.sample_vp(10000) + np.testing.assert_allclose(np.mean(trace['mu']), mu_post, rtol=0.4) + np.testing.assert_allclose(np.std(trace['mu']), np.sqrt(1. / d), rtol=0.4) + + def test_optimizer_minibatch_with_callback(self): + n = 1000 + sd0 = 2. + mu0 = 4. + sd = 3. + mu = -5. + + data = sd * np.random.randn(n) + mu + + d = n / sd ** 2 + 1 / sd0 ** 2 + mu_post = (n * np.mean(data) / sd ** 2 + mu0 / sd0 ** 2) / d + + def create_minibatch(data): + while True: + data = np.roll(data, 100, axis=0) + yield data[:100] + + minibatches = create_minibatch(data) + with Model(): + data_t = theano.shared(next(minibatches)) + + def cb(*_): + data_t.set_value(next(minibatches)) + mu_ = Normal('mu', mu=mu0, sd=sd0, testval=0) + Normal('x', mu=mu_, sd=sd, observed=data_t, total_size=n) + inf = self.inference() + approx = inf.fit(self.NITER, callbacks=[cb]) + trace = approx.sample_vp(10000) + np.testing.assert_allclose(np.mean(trace['mu']), mu_post, rtol=0.4) + np.testing.assert_allclose(np.std(trace['mu']), np.sqrt(1. / d), rtol=0.4) + + def test_pickling(self): + with models.multidimensional_model()[1]: + inference = self.inference() + + inference = pickle.loads(pickle.dumps(inference)) + inference.fit(20) + + def test_aevb(self): + _, model, _ = models.exponential_beta() + x = model.x + y = model.y + mu = theano.shared(x.init_value) * 2 + sd = theano.shared(x.init_value) * 3 + with model: + inference = self.inference(local_rv={y: (mu, sd)}) + inference.fit(3) + + +class TestMeanField(TestApproximates.Base): + inference = ADVI + + def test_approximate(self): + with models.multidimensional_model()[1]: + fit(10, method='advi') + + +class TestFullRank(TestApproximates.Base): + inference = FullRankADVI + + def test_from_mean_field(self): + with models.multidimensional_model()[1]: + advi = ADVI() + full_rank = FullRankADVI.from_mean_field(advi.approx) + full_rank.fit(20) + + def test_from_advi(self): + with models.multidimensional_model()[1]: + advi = ADVI() + full_rank = FullRankADVI.from_advi(advi) + full_rank.fit(20) + + def test_combined(self): + with models.multidimensional_model()[1]: + fit(10, method='advi->fullrank_advi', frac=.5) + + def test_approximate(self): + with models.multidimensional_model()[1]: + fit(10, method='fullrank_advi') + +if __name__ == '__main__': + unittest.main() diff --git a/pymc3/theanof.py b/pymc3/theanof.py index 1f1b35fe6d..b1a99a5d17 100644 --- a/pymc3/theanof.py +++ b/pymc3/theanof.py @@ -1,19 +1,29 @@ import numpy as np import theano -from .vartypes import typefilter, continuous_types from theano import theano, scalar, tensor as tt +from theano.sandbox.rng_mrg import MRG_RandomStreams from theano.gof.graph import inputs from theano.gof import Op from theano.configparser import change_flags + +from .vartypes import typefilter, continuous_types from .memoize import memoize from .blocking import ArrayOrdering from .data import DataGenerator -__all__ = ['gradient', 'hessian', 'hessian_diag', 'inputvars', - 'cont_inputs', 'floatX', 'jacobian', - 'CallableTensor', 'join_nonshared_inputs', - 'make_shared_replacements', 'generator'] +__all__ = ['gradient', + 'hessian', + 'hessian_diag', + 'inputvars', + 'cont_inputs', + 'floatX', + 'jacobian', + 'CallableTensor', + 'join_nonshared_inputs', + 'make_shared_replacements', + 'generator', + 'GradScale'] def inputvars(a): @@ -60,6 +70,7 @@ def floatX(X): Theano derivative functions """ + def gradient1(f, v): """flat gradient of f wrt v""" return tt.flatten(tt.grad(f, v, disconnected_inputs='warn')) @@ -100,6 +111,17 @@ def jacobian(f, vars=None): return empty_gradient +def jacobian_diag(f, x): + idx = tt.arange(f.shape[0], dtype='int32') + + def grad_ii(i): + return theano.grad(f[i], x)[i] + + return theano.scan(grad_ii, sequences=[idx], + n_steps=f.shape[0], + name='jacobian_diag')[0] + + @memoize def hessian(f, vars=None): return -jacobian(gradient(f, vars), vars) @@ -325,3 +347,58 @@ def generator(gen, default=None): - var.set_default(value) : sets new default value (None erases default value) """ return GeneratorOp(gen, default)() + + +@change_flags(compute_test_value='off') +def launch_rng(rng): + """ + Helper function for safe launch of theano random generator. + If not launched, there will be problems with test_value + + Parameters + ---------- + rng : `theano.sandbox.rng_mrg.MRG_RandomStreams` instance + """ + state = rng.rstate + rng.inc_rstate() + rng.set_rstate(state) + +_tt_rng = MRG_RandomStreams() +launch_rng(_tt_rng) + + +def tt_rng(): + """ + Get the package-level random number generator. + + Returns + ------- + `theano.sandbox.rng_mrg.MRG_RandomStreams` instance + `theano.sandbox.rng_mrg.MRG_RandomStreams` + instance passed to the most recent call of `set_tt_rng` + """ + return _tt_rng + + +def set_tt_rng(new_rng): + """ + Set the package-level random number generator. + + Parameters + ---------- + new_rng : `theano.sandbox.rng_mrg.MRG_RandomStreams` instance + The random number generator to use. + """ + # pylint: disable=global-statement + global _tt_rng + # pylint: enable=global-statement + _tt_rng = new_rng + launch_rng(_tt_rng) + + +class GradScale(theano.compile.ViewOp): + def __init__(self, multiplier): + self.multiplier = multiplier + + def grad(self, args, g_outs): + return [self.multiplier * g_out for g_out in g_outs] diff --git a/pymc3/variational/__init__.py b/pymc3/variational/__init__.py index 8211c23b62..63d35470fc 100644 --- a/pymc3/variational/__init__.py +++ b/pymc3/variational/__init__.py @@ -1,18 +1,25 @@ from .advi import advi, sample_vp from .advi_minibatch import advi_minibatch -from .updates import (sgd, - apply_momentum, - momentum, - apply_nesterov_momentum, - nesterov_momentum, - adagrad, - rmsprop, - adadelta, - adam, - adamax, - norm_constraint, - total_norm_constraint +from .updates import ( + sgd, + apply_momentum, + momentum, + apply_nesterov_momentum, + nesterov_momentum, + adagrad, + rmsprop, + adadelta, + adam, + adamax, + norm_constraint, + total_norm_constraint ) from .svgd import svgd + +from .inference import ( + ADVI, + FullRankADVI, + fit, +) diff --git a/pymc3/variational/inference.py b/pymc3/variational/inference.py new file mode 100644 index 0000000000..cfaed1c7f9 --- /dev/null +++ b/pymc3/variational/inference.py @@ -0,0 +1,544 @@ +from __future__ import division + +import logging + +import numpy as np +import theano +from theano import tensor as tt +import tqdm + +import pymc3 as pm +from pymc3.distributions.dist_math import log_normal, rho2sd, log_normal_mv +from pymc3.variational.opvi import Operator, Approximation, TestFunction + +logger = logging.getLogger(__name__) + +__all__ = [ + 'TestFunction', + 'KL', + 'MeanField', + 'FullRank', + 'ADVI', + 'FullRankADVI', + 'Inference' +] +# OPERATORS + + +class KL(Operator): + """ + Operator based on Kullback Leibler Divergence + .. math:: + + KL[q(v)||p(v)] = \int q(v)\log\\frac{q(v)}{p(v)}dv + """ + def apply(self, f): + z = self.input + return self.logq(z) - self.logp(z) + +# APPROXIMATIONS + + +class MeanField(Approximation): + """ + Mean Field approximation to the posterior where spherical Gaussian family + is fitted to minimize KL divergence from True posterior. It is assumed + that latent space variables are uncorrelated that is the main drawback + of the method + + Parameters + ---------- + local_rv : dict + mapping {model_variable -> local_variable} + Local Vars are used for Autoencoding Variational Bayes + See (AEVB; Kingma and Welling, 2014) for details + + model : PyMC3 model for inference + + cost_part_grad_scale : float or scalar tensor + Scaling score part of gradient can be useful near optimum for + archiving better convergence properties. Common schedule is + 1 at the start and 0 in the end. So slow decay will be ok. + See (Sticking the Landing; Geoffrey Roeder, + Yuhuai Wu, David Duvenaud, 2016) for details + + References + ---------- + Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 + Sticking the Landing: A Simple Reduced-Variance Gradient for ADVI + approximateinference.org/accepted/RoederEtAl2016.pdf + """ + @property + def mu(self): + return self.shared_params['mu'] + + @property + def rho(self): + return self.shared_params['rho'] + + @property + def cov(self): + return tt.diag(rho2sd(self.rho)) + + def create_shared_params(self): + return {'mu': theano.shared( + self.input.tag.test_value[self.global_slc]), + 'rho': theano.shared( + np.zeros((self.global_size,), dtype=theano.config.floatX)) + } + + def log_q_W_global(self, z): + """ + log_q_W samples over q for global vars + Gradient wrt mu, rho in density parametrization + is set to zero to lower variance of ELBO + """ + mu = self.scale_grad(self.mu) + rho = self.scale_grad(self.rho) + z = z[self.global_slc] + logq = tt.sum(log_normal(z, mu, rho=rho)) + return logq + + def random_global(self, size=None, no_rand=False): + initial = self.initial(size, no_rand, l=self.global_size) + sd = rho2sd(self.rho) + mu = self.mu + return sd * initial + mu + + +class FullRank(Approximation): + """ + Full Rank approximation to the posterior where Multivariate Gaussian family + is fitted to minimize KL divergence from True posterior. In contrast to + MeanField approach correlations between variables are taken in account. The + main drawback of the method is computational cost. + + Parameters + ---------- + local_rv : dict + mapping {model_variable -> local_variable} + Local Vars are used for Autoencoding Variational Bayes + See (AEVB; Kingma and Welling, 2014) for details + + model : PyMC3 model for inference + + cost_part_grad_scale : float or scalar tensor + Scaling score part of gradient can be useful near optimum for + archiving better convergence properties. Common schedule is + 1 at the start and 0 in the end. So slow decay will be ok. + See (Sticking the Landing; Geoffrey Roeder, + Yuhuai Wu, David Duvenaud, 2016) for details + + References + ---------- + Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 + Sticking the Landing: A Simple Reduced-Variance Gradient for ADVI + approximateinference.org/accepted/RoederEtAl2016.pdf + """ + def __init__(self, local_rv=None, model=None, cost_part_grad_scale=1, gpu_compat=False): + super(FullRank, self).__init__( + local_rv=local_rv, model=model, + cost_part_grad_scale=cost_part_grad_scale + ) + self.gpu_compat = gpu_compat + + @property + def L(self): + return self.shared_params['L_tril'][self.tril_index_matrix] + + @property + def mu(self): + return self.shared_params['mu'] + + @property + def cov(self): + L = self.L + return L.dot(L.T) + + @property + def num_tril_entries(self): + n = self.global_size + return int(n * (n + 1) / 2) + + @property + def tril_index_matrix(self): + n = self.global_size + num_tril_entries = self.num_tril_entries + tril_index_matrix = np.zeros([n, n], dtype=int) + tril_index_matrix[np.tril_indices(n)] = np.arange(num_tril_entries) + tril_index_matrix[np.tril_indices(n)[::-1]] = np.arange(num_tril_entries) + return tril_index_matrix + + def create_shared_params(self): + n = self.global_size + L_tril = ( + np.eye(n) + [np.tril_indices(n)] + .astype(theano.config.floatX) + ) + return {'mu': theano.shared( + self.input.tag.test_value[self.global_slc]), + 'L_tril': theano.shared(L_tril) + } + + def log_q_W_global(self, z): + """ + log_q_W samples over q for global vars + Gradient wrt mu, rho in density parametrization + is set to zero to lower variance of ELBO + """ + mu = self.scale_grad(self.mu) + L = self.scale_grad(self.L) + z = z[self.global_slc] + return log_normal_mv(z, mu, chol=L, gpu_compat=self.gpu_compat) + + def random_global(self, size=None, no_rand=False): + # (samples, dim) or (dim, ) + initial = self.initial(size, no_rand, l=self.global_size).T + # (dim, dim) + L = self.L + # (dim, ) + mu = self.mu + # x = Az + m, but it assumes z is vector + # When we get z with shape (samples, dim) + # we need to transpose Az + return L.dot(initial).T + mu + + @classmethod + def from_mean_field(cls, mean_field, gpu_compat=False): + """ + Construct FullRank from MeanField approximation + + Parameters + ---------- + mean_field : MeanField + approximation to start with + + Flags + ----- + gpu_compat : bool + use GPU compatible version or not + + Returns + ------- + FullRank + """ + full_rank = object.__new__(cls) # type: FullRank + full_rank.gpu_compat = gpu_compat + full_rank.__dict__.update(mean_field.__dict__) + full_rank.shared_params = full_rank.create_shared_params() + full_rank.shared_params['mu'].set_value( + mean_field.shared_params['mu'].get_value() + ) + rho = mean_field.shared_params['rho'].get_value() + n = full_rank.global_size + L_tril = ( + np.diag(np.log1p(np.exp(rho))) # rho2sd + [np.tril_indices(n)] + .astype(theano.config.floatX) + ) + full_rank.shared_params['L_tril'].set_value(L_tril) + return full_rank + + +class Inference(object): + """ + Base class for Variational Inference + + Communicates Operator, Approximation and Test Function to build Objective Function + + Parameters + ---------- + op : Operator class + approx : Approximation class or instance + tf : TestFunction instance + local_rv : list + model : PyMC3 Model + kwargs : kwargs for Approximation + """ + def __init__(self, op, approx, tf, local_rv=None, model=None, **kwargs): + self.hist = np.asarray(()) + if isinstance(approx, type) and issubclass(approx, Approximation): + approx = approx( + local_rv=local_rv, + model=model, **kwargs) + elif isinstance(approx, Approximation): + pass + else: + raise TypeError('approx should be Approximation instance or Approximation subclass') + self.objective = op(approx)(tf) + + approx = property(lambda self: self.objective.approx) + + def run_profiling(self, n=1000, score=True, **kwargs): + fn_kwargs = kwargs.pop('fn_kwargs', dict()) + fn_kwargs.update(profile=True) + step_func = self.objective.step_function( + score=score, fn_kwargs=fn_kwargs, + **kwargs + ) + progress = tqdm.trange(n) + try: + for _ in progress: + step_func() + except KeyboardInterrupt: + pass + finally: + progress.close() + return step_func.profile + + def fit(self, n=10000, score=True, callbacks=None, callback_every=1, + **kwargs): + """ + Performs Operator Variational Inference + + Parameters + ---------- + n : int + number of iterations + score : bool + evaluate loss on each iteration or not + callbacks : list[function : (Approximation, losses, i) -> any] + callback_every : int + call callback functions on `callback_every` step + kwargs : kwargs for ObjectiveFunction.step_function + + Returns + ------- + Approximation + """ + if callbacks is None: + callbacks = [] + step_func = self.objective.step_function(score=score, **kwargs) + i = 0 + scores = np.empty(n) + scores[:] = np.nan + progress = tqdm.trange(n) + if score: + try: + for i in progress: + e = step_func() + if np.isnan(e): + scores = scores[:i] + self.hist = np.concatenate([self.hist, scores]) + raise FloatingPointError('NaN occurred in optimization.') + scores[i] = e + if i % 10 == 0: + avg_elbo = scores[max(0, i - 1000):i+1].mean() + progress.set_description('Average Loss = {:,.5g}'.format(avg_elbo)) + if i % callback_every == 0: + for callback in callbacks: + callback(self.approx, scores[:i+1], i) + except KeyboardInterrupt: + scores = scores[:i] + if n < 10: + logger.info('Interrupted at {:,d} [{:.0f}%]: Loss = {:,.5g}'.format( + i, 100 * i // n, scores[i])) + else: + avg_elbo = scores[min(0, i - 1000):i].mean() + logger.info('Interrupted at {:,d} [{:.0f}%]: Average Loss = {:,.5g}'.format( + i, 100 * i // n, avg_elbo)) + else: + if n < 10: + logger.info('Finished [100%]: Loss = {:,.5g}'.format(scores[-1])) + else: + avg_elbo = scores[max(0, i - 1000):i].mean() + logger.info('Finished [100%]: Average Loss = {:,.5g}'.format(avg_elbo)) + finally: + progress.close() + else: + try: + for _ in progress: + step_func() + except KeyboardInterrupt: + pass + finally: + progress.close() + self.hist = np.concatenate([self.hist, scores]) + return self.approx + + +class ADVI(Inference): + """ + Automatic Differentiation Variational Inference (ADVI) + + Parameters + ---------- + local_rv : dict + mapping {model_variable -> local_variable} + Local Vars are used for Autoencoding Variational Bayes + See (AEVB; Kingma and Welling, 2014) for details + + model : PyMC3 model for inference + + cost_part_grad_scale : float or scalar tensor + Scaling score part of gradient can be useful near optimum for + archiving better convergence properties. Common schedule is + 1 at the start and 0 in the end. So slow decay will be ok. + See (Sticking the Landing; Geoffrey Roeder, + Yuhuai Wu, David Duvenaud, 2016) for details + + References + ---------- + - Kucukelbir, A., Tran, D., Ranganath, R., Gelman, A., + and Blei, D. M. (2016). Automatic Differentiation Variational + Inference. arXiv preprint arXiv:1603.00788. + + - Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 + Sticking the Landing: A Simple Reduced-Variance Gradient for ADVI + approximateinference.org/accepted/RoederEtAl2016.pdf + + - Kingma, D. P., & Welling, M. (2014). + Auto-Encoding Variational Bayes. stat, 1050, 1. + """ + def __init__(self, local_rv=None, model=None, cost_part_grad_scale=1): + super(ADVI, self).__init__( + KL, MeanField, None, + local_rv=local_rv, model=model, cost_part_grad_scale=cost_part_grad_scale) + + +class FullRankADVI(Inference): + """ + Full Rank Automatic Differentiation Variational Inference (ADVI) + + Parameters + ---------- + local_rv : dict + mapping {model_variable -> local_variable} + Local Vars are used for Autoencoding Variational Bayes + See (AEVB; Kingma and Welling, 2014) for details + + model : PyMC3 model for inference + + cost_part_grad_scale : float or scalar tensor + Scaling score part of gradient can be useful near optimum for + archiving better convergence properties. Common schedule is + 1 at the start and 0 in the end. So slow decay will be ok. + See (Sticking the Landing; Geoffrey Roeder, + Yuhuai Wu, David Duvenaud, 2016) for details + + References + ---------- + - Kucukelbir, A., Tran, D., Ranganath, R., Gelman, A., + and Blei, D. M. (2016). Automatic Differentiation Variational + Inference. arXiv preprint arXiv:1603.00788. + + - Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 + Sticking the Landing: A Simple Reduced-Variance Gradient for ADVI + approximateinference.org/accepted/RoederEtAl2016.pdf + + - Kingma, D. P., & Welling, M. (2014). + Auto-Encoding Variational Bayes. stat, 1050, 1. + """ + def __init__(self, local_rv=None, model=None, cost_part_grad_scale=1, gpu_compat=False): + super(FullRankADVI, self).__init__( + KL, FullRank, None, + local_rv=local_rv, model=model, cost_part_grad_scale=cost_part_grad_scale, gpu_compat=gpu_compat) + + @classmethod + def from_mean_field(cls, mean_field, gpu_compat=False): + """ + Construct FullRankADVI from MeanField approximation + + Parameters + ---------- + mean_field : MeanField + approximation to start with + + Flags + ----- + gpu_compat : bool + use GPU compatible version or not + + Returns + ------- + FullRankADVI + """ + full_rank = FullRank.from_mean_field(mean_field, gpu_compat) + inference = object.__new__(cls) + objective = KL(full_rank)(None) + inference.objective = objective + inference.hist = np.asarray(()) + return inference + + @classmethod + def from_advi(cls, advi, gpu_compat=False): + """ + Construct FullRankADVI from ADVI + + Parameters + ---------- + advi : ADVI + + Flags + ----- + gpu_compat : bool + use GPU compatible version or not + + Returns + ------- + FullRankADVI + """ + inference = cls.from_mean_field(advi.approx, gpu_compat) + inference.hist = advi.hist + return inference + + +def fit(n=10000, local_rv=None, method='advi', model=None, **kwargs): + """ + Handy shortcut for using inference methods in functional way + + Parameters + ---------- + n : int + number of iterations + local_rv : dict + mapping {model_variable -> local_variable} + Local Vars are used for Autoencoding Variational Bayes + See (AEVB; Kingma and Welling, 2014) for details + method : str or Inference + string name is case insensitive in {'advi', 'fullrank_advi', 'advi->fullrank_advi'} + model : None or Model + frac : float + if method is 'advi->fullrank_advi' represents advi fraction when training + kwargs : kwargs for Inference.fit + + Returns + ------- + Approximation + """ + if model is None: + model = pm.modelcontext(model) + _select = dict( + advi=ADVI, + fullrank_advi=FullRankADVI, + ) + if isinstance(method, str) and method.lower() == 'advi->fullrank_advi': + frac = kwargs.pop('frac', .5) + if not 0. < frac < 1.: + raise ValueError('frac should be in (0, 1)') + n1 = int(n * frac) + n2 = n-n1 + inference = ADVI(local_rv=local_rv, model=model) + logger.info('fitting advi ...') + inference.fit(n1, **kwargs) + inference = FullRankADVI.from_advi(inference) + logger.info('fitting fullrank advi ...') + return inference.fit(n2, **kwargs) + + elif isinstance(method, str): + try: + inference = _select[method.lower()]( + local_rv=local_rv, model=model + ) + except KeyError: + raise KeyError('method should be one of %s ' + 'or Inference instance' % + set(_select.keys())) + elif isinstance(method, Inference): + inference = method + else: + raise TypeError('method should be one of %s ' + 'or Inference instance' % + set(_select.keys())) + return inference.fit(n, **kwargs) diff --git a/pymc3/variational/opvi.py b/pymc3/variational/opvi.py new file mode 100644 index 0000000000..8d694b2698 --- /dev/null +++ b/pymc3/variational/opvi.py @@ -0,0 +1,808 @@ +import numpy as np +import theano +import theano.tensor as tt + +import pymc3 as pm +from .updates import adam +from ..distributions.dist_math import rho2sd, log_normal +from ..model import modelcontext, ArrayOrdering +from ..theanof import tt_rng, memoize, change_flags, GradScale + + +class ObjectiveUpdates(theano.OrderedUpdates): + """ + OrderedUpdates extension for storing loss + """ + loss = None + + +class Operator(object): + """ + Base class for Operator + + Parameters + ---------- + approx : Approximation + + Subclassing + ----------- + For implementing Custom operator it is needed to define `.apply(f)` method + """ + + NEED_F = False + + def __init__(self, approx): + self.model = approx.model + self.approx = approx + + flat_view = property(lambda self: self.approx.flat_view) + input = property(lambda self: self.approx.flat_view.input) + + def logp(self, z): + p = self.approx.to_flat_input(self.model.logpt) + p = theano.clone(p, {self.input: z}) + return p + + def logq(self, z): + return self.approx.logq(z) + + def apply(self, f): + """ + Operator itself + .. math:: + + (O^{p,q}f_{\theta})(z) + + Parameters + ---------- + f : function or None + function that takes `z = self.input` and returns + same dimension output + + Returns + ------- + symbolically applied operator + """ + raise NotImplementedError + + def __call__(self, f=None): + if f is None: + if self.NEED_F: + raise ValueError('Operator %s requires TestFunction' % self) + else: + f = TestFunction() + elif not isinstance(f, TestFunction): + f = TestFunction.from_function(f) + f.setup(self.approx.total_size) + return ObjectiveFunction(self, f) + + def __getstate__(self): + # pickle only important parts + return self.approx + + def __setstate__(self, approx): + self.__init__(approx) + + def __str__(self): + return '%(op)s[%(ap)s]' % dict(op=self.__class__.__name__, + ap=self.approx.__class__.__name__) + + +class ObjectiveFunction(object): + """ + Helper class for construction loss and updates for variational inference + + Parameters + ---------- + op : Operator + tf : TestFunction + """ + def __init__(self, op, tf): + self.op = op + self.tf = tf + + obj_params = property(lambda self: self.op.approx.params) + test_params = property(lambda self: self.tf.params) + approx = property(lambda self: self.op.approx) + + def random(self, size=None): + """ + Posterior distribution from initial latent space + + Parameters + ---------- + size : int + number of samples from distribution + + Returns + ------- + posterior space (theano) + """ + return self.op.approx.random(size) + + def __call__(self, z): + if z.ndim > 1: + a = theano.scan( + lambda z_: theano.clone(self.op.apply(self.tf), {self.op.input: z_}), + sequences=z, n_steps=z.shape[0])[0].mean() + else: + a = theano.clone(self.op.apply(self.tf), {self.op.input: z}) + return tt.abs_(a) + + def updates(self, obj_n_mc=None, tf_n_mc=None, obj_optimizer=adam, test_optimizer=adam, + more_obj_params=None, more_tf_params=None, more_updates=None): + """ + Calculates gradients for objective function, test function and then + constructs updates for optimization step + + Parameters + ---------- + obj_n_mc : int + Number of monte carlo samples used for approximation of objective gradients + tf_n_mc : int + Number of monte carlo samples used for approximation of test function gradients + obj_optimizer : function (loss, params) -> updates + Optimizer that is used for objective params + test_optimizer : function (loss, params) -> updates + Optimizer that is used for test function params + more_obj_params : list + Add custom params for objective optimizer + more_tf_params : list + Add custom params for test function optimizer + more_updates : dict + Add custom updates to resulting updates + + Returns + ------- + ObjectiveUpdates + """ + if more_obj_params is None: + more_obj_params = [] + if more_tf_params is None: + more_tf_params = [] + if more_updates is None: + more_updates = dict() + resulting_updates = ObjectiveUpdates() + + if self.test_params: + tf_z = self.random(tf_n_mc) + tf_target = -self(tf_z) + resulting_updates.update(test_optimizer(tf_target, self.test_params + more_tf_params)) + else: + pass + obj_z = self.random(obj_n_mc) + obj_target = self(obj_z) + resulting_updates.update(obj_optimizer(obj_target, self.obj_params + more_obj_params)) + resulting_updates.update(more_updates) + resulting_updates.loss = obj_target + return resulting_updates + + @memoize + def step_function(self, obj_n_mc=None, tf_n_mc=None, + obj_optimizer=adam, test_optimizer=adam, + more_obj_params=None, more_tf_params=None, + more_updates=None, score=False, + fn_kwargs=None): + """ + Step function that should be called on each optimization step. + + Generally it solves the following problem: + .. math:: + + \textbf{\lambda^{*}} = \inf_{\lambda} \sup_{\theta} t(\mathbb{E}_{\lambda}[(O^{p,q}f_{\theta})(z)]) + + Parameters + ---------- + obj_n_mc : int + Number of monte carlo samples used for approximation of objective gradients + tf_n_mc : int + Number of monte carlo samples used for approximation of test function gradients + obj_optimizer : function (loss, params) -> updates + Optimizer that is used for objective params + test_optimizer : function (loss, params) -> updates + Optimizer that is used for test function params + more_obj_params : list + Add custom params for objective optimizer + more_tf_params : list + Add custom params for test function optimizer + more_updates : dict + Add custom updates to resulting updates + score : bool + calculate loss on each step? Defaults to False for speed + fn_kwargs : dict + Add kwargs to theano.function (e.g. `{'profile': True}`) + Returns + ------- + theano.function + """ + if fn_kwargs is None: + fn_kwargs = {} + updates = self.updates(obj_n_mc=obj_n_mc, tf_n_mc=tf_n_mc, + obj_optimizer=obj_optimizer, + test_optimizer=test_optimizer, + more_obj_params=more_obj_params, + more_tf_params=more_tf_params, + more_updates=more_updates) + if score: + step_fn = theano.function([], updates.loss, updates=updates, **fn_kwargs) + else: + step_fn = theano.function([], None, updates=updates, **fn_kwargs) + return step_fn + + @memoize + def score_function(self, sc_n_mc=None, fn_kwargs=None): + if fn_kwargs is None: + fn_kwargs = {} + return theano.function([], self(self.random(sc_n_mc)), **fn_kwargs) + + def __getstate__(self): + return self.op, self.tf + + def __setstate__(self, state): + self.__init__(*state) + + +def cast_to_list(params): + """ + Helper function for getting a list from + usable representation of parameters + + Parameters + ---------- + params : {list|tuple|dict|theano.shared|None} + + Returns + ------- + list + """ + if isinstance(params, list): + return params + elif isinstance(params, tuple): + return list(params) + elif isinstance(params, dict): + return list(params.values()) + elif isinstance(params, theano.compile.SharedVariable): + return [params] + elif params is None: + return [] + else: + raise TypeError('Unknown type %s for %r, need list, dict or shared variable') + + +class TestFunction(object): + def __init__(self): + self._inited = False + self.shared_params = None + + def create_shared_params(self, dim): + """ + Returns + ------- + {dict|list|theano.shared} + """ + pass + + @property + def params(self): + return cast_to_list(self.shared_params) + + def __call__(self, z): + raise NotImplementedError + + def setup(self, dim): + if not self._inited: + self._setup(dim) + self.shared_params = self.create_shared_params(dim) + self._inited = True + + def _setup(self, dim): + """ + Does some preparation stuff before calling `.create_shared_params()` + + Parameters + ---------- + dim : int dimension of posterior distribution + """ + pass + + @classmethod + def from_function(cls, f): + if not callable(f): + raise ValueError('Need callable, got %r' % f) + obj = TestFunction() + obj.__call__ = f + return obj + + +class Approximation(object): + """ + Base class for approximations. + + Parameters + ---------- + local_rv : dict + mapping {model_variable -> local_variable} + Local Vars are used for Autoencoding Variational Bayes + See (AEVB; Kingma and Welling, 2014) for details + + model : PyMC3 model for inference + + cost_part_grad_scale : float or scalar tensor + Scaling score part of gradient can be useful near optimum for + archiving better convergence properties. Common schedule is + 1 at the start and 0 in the end. So slow decay will be ok. + See (Sticking the Landing; Geoffrey Roeder, + Yuhuai Wu, David Duvenaud, 2016) for details + + Subclassing + ----------- + Defining an approximation needs + custom implementation of the following methods: + - `.create_shared_params()` + Returns {dict|list|theano.shared} + + - `.random_global(size=None, no_rand=False)` + Generate samples from posterior. If `no_rand==False`: + sample from MAP of initial distribution. + Returns TensorVariable + + - `.log_q_W_global(z)` + It is needed only if used with operator + that requires :math:`logq` of an approximation + Returns Scalar + + Notes + ----- + There are some defaults for approximation classes that can be + optionally overriden. + - `initial_dist_name` + string that represents name of the initial distribution. + In most cases if will be `uniform` or `normal` + - `initial_dist_map` + float where initial distribution has maximum density + + References + ---------- + - Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 + Sticking the Landing: A Simple Reduced-Variance Gradient for ADVI + approximateinference.org/accepted/RoederEtAl2016.pdf + + - Kingma, D. P., & Welling, M. (2014). + Auto-Encoding Variational Bayes. stat, 1050, 1. + """ + initial_dist_name = 'normal' + initial_dist_map = 0. + + def __init__(self, local_rv=None, model=None, cost_part_grad_scale=1): + model = modelcontext(model) + self.model = model + self.check_model(model) + if local_rv is None: + local_rv = {} + + def get_transformed(v): + if hasattr(v, 'transformed'): + return v.transformed + return v + + known = {get_transformed(k): v for k, v in local_rv.items()} + self.known = known + self.local_vars = [v for v in model.free_RVs if v in known] + self.global_vars = [v for v in model.free_RVs if v not in known] + self.order = ArrayOrdering(self.local_vars + self.global_vars) + self.flat_view = model.flatten( + vars=self.local_vars + self.global_vars + ) + self.grad_scale_op = GradScale(cost_part_grad_scale) + self.shared_params = self.create_shared_params() + + def __getstate__(self): + state = self.__dict__.copy() + # can be inferred from the rest parts + state.pop('flat_view') + state.pop('order') + return state + + def __setstate__(self, state): + self.__dict__.update(state) + self.order = ArrayOrdering(self.local_vars + self.global_vars) + self.flat_view = self.model.flatten( + vars=self.local_vars + self.global_vars + ) + + _view = property(lambda self: self.flat_view.view) + input = property(lambda self: self.flat_view.input) + + @staticmethod + def check_model(model): + """ + Checks that model is valid for variational inference + """ + vars_ = [var for var in model.vars if not isinstance(var, pm.model.ObservedRV)] + if any([var.dtype in pm.discrete_types for var in vars_]): + raise ValueError('Model should not include discrete RVs') + + def create_shared_params(self): + """ + Returns + ------- + {dict|list|theano.shared} + """ + pass + + def _local_mu_rho(self): + mu = [] + rho = [] + for var in self.local_vars: + mu.append(self.known[var][0].ravel()) + rho.append(self.known[var][1].ravel()) + mu = tt.concatenate(mu) + rho = tt.concatenate(rho) + return mu, rho + + def construct_replacements(self, include=None, exclude=None, + more_replacements=None): + """ + Construct replacements with given conditions + + Parameters + ---------- + include : list + latent variables to be replaced + exclude : list + latent variables to be excluded for replacements + more_replacements : dict + add custom replacements to graph, e.g. change input source + + Returns + ------- + dict + Replacements + """ + if include is not None and exclude is not None: + raise ValueError('Only one parameter is supported {include|exclude}, got two') + if include is not None: + replacements = {k: v for k, v + in self.flat_view.replacements.items() if k in include} + elif exclude is not None: + replacements = {k: v for k, v + in self.flat_view.replacements.items() if k not in exclude} + else: + replacements = self.flat_view.replacements + if more_replacements is not None: + replacements.update(more_replacements) + return replacements + + def apply_replacements(self, node, deterministic=False, + include=None, exclude=None, + more_replacements=None): + """ + Replace variables in graph with variational approximation. By default, replaces all variables + + Parameters + ---------- + node : Variable + node for replacements + deterministic : bool + whether to use zeros as initial distribution + if True - zero initial point will produce constant latent variables + include : list + latent variables to be replaced + exclude : list + latent variables to be excluded for replacements + more_replacements : dict + add custom replacements to graph, e.g. change input source + + Returns + ------- + node with replacements + """ + replacements = self.construct_replacements( + include, exclude, more_replacements + ) + node = theano.clone(node, replacements, strict=False) + posterior = self.random(no_rand=deterministic) + return theano.clone(node, {self.input: posterior}) + + def sample_node(self, node, size=100, + more_replacements=None): + if more_replacements is not None: + node = theano.clone(node, more_replacements) + posterior = self.random(size) + node = self.to_flat_input(node) + + def sample(z): return theano.clone(node, {self.input: z}) + nodes, _ = theano.scan(sample, posterior, n_steps=size) + return nodes + + def scale_grad(self, inp): + """ + Rescale gradient of input + + References + ---------- + - Geoffrey Roeder, Yuhuai Wu, David Duvenaud, 2016 + Sticking the Landing: A Simple Reduced-Variance Gradient for ADVI + approximateinference.org/accepted/RoederEtAl2016.pdf + """ + return self.grad_scale_op(inp) + + def to_flat_input(self, node): + """ + Replaces vars with flattened view stored in self.input + """ + return theano.clone(node, self.flat_view.replacements, strict=False) + + @property + def params(self): + return cast_to_list(self.shared_params) + + def initial(self, size, no_rand=False, l=None): + """ + Initial distribution for constructing posterior + + Parameters + ---------- + size : int - number of samples + no_rand : bool - return zeros if True + l : length of sample, defaults to latent space dim + + Returns + ------- + Tensor + sampled latent space shape == size + latent_dim + """ + + theano_condition_is_here = isinstance(no_rand, tt.Variable) + if l is None: + l = self.total_size + if size is None: + shape = (l, ) + else: + shape = (size, l) + if theano_condition_is_here: + no_rand = tt.as_tensor(no_rand) + sample = getattr(tt_rng(), self.initial_dist_name)(shape) + space = tt.switch( + no_rand, + tt.ones_like(sample) * self.initial_dist_map, + sample + ) + else: + if no_rand: + return tt.ones(shape) * self.initial_dist_map + else: + return getattr(tt_rng(), self.initial_dist_name)(shape) + return space + + def random_local(self, size=None, no_rand=False): + """ + Implements posterior distribution from initial latent space + + Parameters + ---------- + size : number of samples from distribution + no_rand : whether use deterministic distribution + + Returns + ------- + local posterior space + """ + + mu, rho = self._local_mu_rho() + e = self.initial(size, no_rand, self.local_size) + return e * rho2sd(rho) + mu + + def random_global(self, size=None, no_rand=False): + """ + Implements posterior distribution from initial latent space + + Parameters + ---------- + size : number of samples from distribution + no_rand : whether use deterministic distribution + + Returns + ------- + global posterior space + """ + raise NotImplementedError + + def random(self, size=None, no_rand=False): + """ + Implements posterior distribution from initial latent space + + Parameters + ---------- + size : number of samples from distribution + no_rand : whether use deterministic distribution + + Returns + ------- + posterior space (theano) + """ + if size is None: + ax = 0 + else: + ax = 1 + if self.local_vars and self.global_vars: + return tt.concatenate([ + self.random_local(size, no_rand), + self.random_global(size, no_rand) + ], axis=ax) + elif self.local_vars: + return self.random_local(size, no_rand) + elif self.global_vars: + return self.random_global(size, no_rand) + else: + raise ValueError('No FreeVARs in model') + + @property + @memoize + @change_flags(compute_test_value='off') + def random_fn(self): + """ + Implements posterior distribution from initial latent space + + Parameters + ---------- + size : number of samples from distribution + no_rand : whether use deterministic distribution + + Returns + ------- + posterior space (numpy) + """ + In = theano.In + size = tt.iscalar('size') + no_rand = tt.bscalar('no_rand') + posterior = self.random(size, no_rand) + fn = theano.function([In(size, 'size', 1, allow_downcast=True), + In(no_rand, 'no_rand', 0, allow_downcast=True)], + posterior) + + def inner(size=None, no_rand=False): + if size is None: + return fn(1, int(no_rand))[0] + else: + return fn(size, int(no_rand)) + + return inner + + def sample_vp(self, draws=1, hide_transformed=False): + """ + Draw samples from variational posterior. + + Parameters + ---------- + draws : int + Number of random samples. + hide_transformed : bool + If False, transformed variables are also sampled. Default is True. + + Returns + ------- + trace : pymc3.backends.base.MultiTrace + Samples drawn from the variational posterior. + """ + if hide_transformed: + vars_sampled = [v_ for v_ in self.model.unobserved_RVs + if not str(v_).endswith('_')] + else: + vars_sampled = [v_ for v_ in self.model.unobserved_RVs] + posterior = self.random_fn(draws) + names = [var.name for var in self.local_vars + self.global_vars] + samples = {name: self.view(posterior, name) + for name in names} + + def points(): + for i in range(draws): + yield {name: samples[name][i] + for name in names} + + trace = pm.sampling.NDArray(model=self.model, vars=vars_sampled) + try: + trace.setup(draws=draws, chain=0) + for point in points(): + trace.record(point) + finally: + trace.close() + return pm.sampling.MultiTrace([trace]) + + def log_q_W_local(self, z): + """ + log_q_W samples over q for local vars + Gradient wrt mu, rho in density parametrization + is set to zero to lower variance of ELBO + """ + if not self.local_vars: + return tt.constant(0) + mu, rho = self._local_mu_rho() + mu = self.scale_grad(mu) + rho = self.scale_grad(rho) + logp = log_normal(z[self.local_slc], mu, rho=rho) + scaling = [] + for var in self.local_vars: + scaling.append(tt.ones(var.dsize)*var.scaling) + scaling = tt.concatenate(scaling) + + if z.ndim > 1: + logp *= scaling[:, None] + else: + logp *= scaling + return self.to_flat_input(tt.sum(logp)) + + def log_q_W_global(self, z): + """ + log_q_W samples over q for global vars + """ + raise NotImplementedError + + def logq(self, z): + """ + Total logq for approximation + """ + return self.log_q_W_global(z) + self.log_q_W_local(z) + + def view(self, space, name, reshape=True): + """ + Construct view on a variable from flattened `space` + + Parameters + ---------- + space : space to take view of variable from + name : str + name of variable + reshape : bool + whether to reshape variable from vectorized view + + Returns + ------- + variable view + """ + theano_is_here = isinstance(space, tt.TensorVariable) + slc = self._view[name].slc + _, _, _shape, dtype = self._view[name] + if space.ndim == 2: + view = space[:, slc] + elif space.ndim < 2: + view = space[slc] + else: + raise ValueError('Space should have no more than 2 dims, got %d' % space.ndim) + if reshape: + if len(_shape) > 0: + if theano_is_here: + shape = tt.concatenate([space.shape[:-1], + tt.as_tensor(_shape)]) + else: + shape = np.concatenate([space.shape[:-1], + _shape]).astype(int) + + else: + shape = space.shape[:-1] + if theano_is_here: + view = view.reshape(shape, ndim=space.ndim + len(_shape) - 1) + else: + view = view.reshape(shape) + return view.astype(dtype) + + @property + def total_size(self): + return self.order.dimensions + + @property + def local_size(self): + size = sum([0] + [v.dsize for v in self.local_vars]) + return size + + @property + def global_size(self): + return self.total_size - self.local_size + + @property + def local_slc(self): + return slice(0, self.local_size) + + @property + def global_slc(self): + return slice(self.local_size, self.total_size)