Skip to content

Instantly share code, notes, and snippets.

@springcoil
Created October 26, 2016 17:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save springcoil/ba9acd345153393af694326433f6c636 to your computer and use it in GitHub Desktop.
Save springcoil/ba9acd345153393af694326433f6c636 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"toc": "true"
},
"source": [
"# Table of Contents\n",
" <p><div class=\"lev1 toc-item\"><a href=\"#Normalizing-flow-in-PyMC3\" data-toc-modified-id=\"Normalizing-flow-in-PyMC3-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Normalizing flow in PyMC3</a></div><div class=\"lev2 toc-item\"><a href=\"#Limitation-of-meanfield-ADVI\" data-toc-modified-id=\"Limitation-of-meanfield-ADVI-1.1\"><span class=\"toc-item-num\">1.1&nbsp;&nbsp;</span>Limitation of meanfield ADVI</a></div><div class=\"lev2 toc-item\"><a href=\"#A-beta-binomial-model-for-overdispersion\" data-toc-modified-id=\"A-beta-binomial-model-for-overdispersion-1.2\"><span class=\"toc-item-num\">1.2&nbsp;&nbsp;</span>A beta-binomial model for overdispersion</a></div><div class=\"lev3 toc-item\"><a href=\"#MCMC\" data-toc-modified-id=\"MCMC-1.2.1\"><span class=\"toc-item-num\">1.2.1&nbsp;&nbsp;</span>MCMC</a></div><div class=\"lev3 toc-item\"><a href=\"#Gaussian-meanfield-ADVI\" data-toc-modified-id=\"Gaussian-meanfield-ADVI-1.2.2\"><span class=\"toc-item-num\">1.2.2&nbsp;&nbsp;</span>Gaussian meanfield ADVI</a></div><div class=\"lev2 toc-item\"><a href=\"#Normalizing-flow\" data-toc-modified-id=\"Normalizing-flow-1.3\"><span class=\"toc-item-num\">1.3&nbsp;&nbsp;</span>Normalizing flow</a></div><div class=\"lev3 toc-item\"><a href=\"#Interface\" data-toc-modified-id=\"Interface-1.3.1\"><span class=\"toc-item-num\">1.3.1&nbsp;&nbsp;</span>Interface</a></div><div class=\"lev3 toc-item\"><a href=\"#Inverse-autoregressive-flow\" data-toc-modified-id=\"Inverse-autoregressive-flow-1.3.2\"><span class=\"toc-item-num\">1.3.2&nbsp;&nbsp;</span>Inverse autoregressive flow</a></div><div class=\"lev3 toc-item\"><a href=\"#Masked-autoencoder-(MADE)\" data-toc-modified-id=\"Masked-autoencoder-(MADE)-1.3.3\"><span class=\"toc-item-num\">1.3.3&nbsp;&nbsp;</span>Masked autoencoder (MADE)</a></div><div class=\"lev3 toc-item\"><a href=\"#Test-logdet-of-the-Jacobian-of-IAF\" data-toc-modified-id=\"Test-logdet-of-the-Jacobian-of-IAF-1.3.4\"><span class=\"toc-item-num\">1.3.4&nbsp;&nbsp;</span>Test logdet of the Jacobian of IAF</a></div><div class=\"lev3 toc-item\"><a href=\"#ADVI-with-IAF\" data-toc-modified-id=\"ADVI-with-IAF-1.3.5\"><span class=\"toc-item-num\">1.3.5&nbsp;&nbsp;</span>ADVI with IAF</a></div><div class=\"lev2 toc-item\"><a href=\"#References\" data-toc-modified-id=\"References-1.4\"><span class=\"toc-item-num\">1.4&nbsp;&nbsp;</span>References</a></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Normalizing flow in PyMC3\n",
"\n",
"- (Original code by Taku Yoshioka and notes by Peadar Coyle)\n",
"Firstly it is worth commenting on the motivations for variational inference.\n",
"* One of the major justifications for Variational Inference is the possibility of scaling probabilisitic modelling\n",
"to increasingly complex problems on increasingly large data sets. \n",
"## Uses\n",
"* Large scale topic models (for example LDA and Hierarchical Dirichlet Processes)\n",
"* Semi-supervised classification\n",
"* Generative models of images\n",
"## Limitations\n",
"One of the major limitations of Variational Bayes or Variational Inference (VI) is that they require intractable\n",
"posterior distributions to be approximationed by a class of known probabilistic distributions. \n",
"\n",
"**Objections** Unlike Markov-Chain-Monte-Carlo (MCMC), even in the asymptotic regime we are unable to recover the true posterior distribution. \n",
"\n",
"One of the overarching ideas of VI is that more faithful posterior approximations = better performance.\n",
"\n",
"## Normalized flows\n",
"One solution is the specification of approximate posterior distributions using normalized flows, a tool for constructing complex distributions by transforming a distribution through a series of invertible mappings. \n",
"Inference with normalizing flows provides a tighter, modified variational lower bound with additional terms that only add terms with linear time complexity. \n",
"\n",
"* It has been shown that nromalizing flows admit infinitesimal flows that allow us to specify a class of posterior approximations that in the asymptotic regime is able to recover the true posterior distribution, overcoming the limitations of variational inference. \n",
"\n",
"Let us consider a general probabilistic model with observations $\\mathbf{x}$, latent variables $\\mathbf{z}$ over which we must integrate, and model parameters $\\theta$. We introduce an approximate posterior distribution for the latent variables $q_{\\phi}(\\mathbf{z} | \\mathbf{x})$nand follow the variational principles to obtain a bound of marginal likelihood. \n",
"\n",
"$$\\log p_{\\theta}(\\mathbf{x}) = \\log \\int_{p_{\\theta}} (\\mathbf{x} | \\mathbf{z} )p(\\mathbf{z}) d\\mathbf{z}$$\n",
"$$= log \\int \\dfrac{q_{\\phi}(\\mathbf{z}|\\mathbf{x})}{q_{\\phi}(\\mathbf{z}|\\mathbf{x})}{p_{\\theta}} (\\mathbf{x} | \\mathbf{z} )p(\\mathbf{z}) d\\mathbf{z}$$ \n",
"$$\\geq -\\Delta_{KL} [q_{\\phi}(\\mathbf{z} | \\mathbf{x}) | p(\\mathbf{z})] + \\mathbb{E}_{q}[\\log p_{\\theta}(\\mathbf{x}| \\mathbf{z})] = -\\mathcal{F}(\\mathbf{x})$$\n",
"\n",
"* Note $\\Delta$ is the gradient\n",
"* Note that the last step is via Jensen's inequality. \n",
"* $p_{\\theta}(\\mathbf{x} | \\mathbf{z})$ is a likelihood function and $p(\\mathbf{z})$ is a prior over the latent variables\n",
"* The bound is the negative free energy (if you adopt a statistical mechanics paradigm) or the Evidence Lower Bound (ELBO).\n",
"\n",
"* The first term is the KL divergence between the approximate posterior and the prior distribution - we can consider this the **regularizer**.\n",
"\n",
"* This bound provides a unified objective function of optimization of both the parameters $\\theta$ and $\\phi$ of the model and variational approximations respectively. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Variational Approximation\n",
"There are roughly speaking two things. Choosing the deriviative (explain)\n",
"Choosing the richest, computationally feasible approximate posterior distribution. $q(\\cdots)$\n",
"\n",
"### Normalizing flows\n",
"By examinining the bound above, we can see that the optimal variational distribution is one that allows the KL-divergence to be zero. \n",
"This one for which $q_{\\phi}(z|x) = p_{\\theta}(z|x)$\n",
"Where $q \\equiv$ true posterior distribution. \n",
"A *normalizing flow* describes the transfromation of a probability density through a sequence of invertible mappings. By repeatedly applying the rule of change of variables, the initial density 'flows' through a sequence of invertible mappings. \n",
"\n",
"TODO: Add in more explanations."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"IPython.notebook.set_autosave_interval(0)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Autosave disabled\n"
]
}
],
"source": [
"%autosave 0\n",
"%matplotlib inline\n",
"import sys, os\n",
"sys.path.insert(0, os.path.expanduser('~/Code/pymc3'))\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import pymc3 as pm\n",
"from pymc3.distributions.discrete import BetaBinomial\n",
"import seaborn as sns\n",
"from theano import config, shared, function\n",
"from theano.gradient import jacobian\n",
"import theano.tensor as tt\n",
"\n",
"config.floatX = 'float32'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Limitation of meanfield ADVI"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## A beta-binomial model for overdispersion"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def get_model():\n",
" # Data and model adapted from Albert (2009)\n",
" data = np.array(\n",
" [(0, 1083), (0, 855), (2, 3461), (0, 657), (1, 1208), \n",
" (1, 1025), (0, 527), (2, 1668), (1, 583), (3, 582), \n",
" (0, 917), (1, 857), (1, 680), (1, 917), (54, 53637),\n",
" (0, 874), (0, 395), (1, 581), (3, 588), (0, 383)]\n",
" )\n",
" xs, ns = data[:, 0], data[:, 1]\n",
"\n",
" with pm.Model() as model:\n",
" def logp(mk):\n",
" m = tt.nnet.sigmoid(mk[0])\n",
" k = tt.exp(mk[1])\n",
" return -1 * (tt.log(m) + tt.log(1 - m) + 2 * tt.log(1 + k))\n",
"\n",
" # Prior\n",
" mk = pm.DensityDist('mk', logp, shape=(2,), testval=np.array([0.1, 0.1]).astype('float32'))\n",
"\n",
" # Reparametrization for beta-binomial distribution\n",
" m = tt.nnet.sigmoid(mk[0])\n",
" k = tt.exp(mk[1])\n",
" alpha = k * m\n",
" beta = k * (1 - m)\n",
" \n",
" # Likelihood\n",
" BetaBinomial('x', alpha=alpha, beta=beta, n=ns, observed=xs)\n",
" \n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def plot_samples(trace):\n",
" m = trace['mk'][1000:, 0]\n",
" k = trace['mk'][1000:, 1]\n",
" df = pd.DataFrame({'logit m': m, 'log k': k})\n",
" sns.jointplot(x=\"logit m\", y=\"log k\", data=df, xlim=[-7.7, -5.5], ylim=[4, 11])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### MCMC"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 11000/11000 [00:11<00:00, 954.14it/s]\n"
]
},
{
"data": {
"image/png": "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\nCAQCgRAT/H/XlEAKNMCB9wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x115720e10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with get_model() as model:\n",
" step = pm.NUTS()\n",
" trace = pm.sample(11000, step=step)\n",
" \n",
"plot_samples(trace)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Gaussian meanfield ADVI"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/peadarcoyle/anaconda/envs/pymc3_dev/lib/python3.5/site-packages/Theano-0.8.2-py3.5.egg/theano/tensor/signal/downsample.py:6: UserWarning: downsample module has been moved to the theano.tensor.signal.pool module.\n",
" \"downsample module has been moved to the theano.tensor.signal.pool module.\")\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteration 0 [0%]: ELBO = -95.63\n",
"Iteration 1000 [10%]: Average ELBO = -57.76\n",
"Iteration 2000 [20%]: Average ELBO = -48.27\n",
"Iteration 3000 [30%]: Average ELBO = -45.9\n",
"Iteration 4000 [40%]: Average ELBO = -43.39\n",
"Iteration 5000 [50%]: Average ELBO = -38.73\n",
"Iteration 6000 [60%]: Average ELBO = -36.57\n",
"Iteration 7000 [70%]: Average ELBO = -36.44\n",
"Iteration 8000 [80%]: Average ELBO = -36.57\n",
"Iteration 9000 [90%]: Average ELBO = -36.53\n",
"Finished [100%]: ELBO = -36.08\n"
]
},
{
"data": {
"image/png": "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\nBEEogv8HGW5wFt/TGDkAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x115a86cc0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import lasagne\n",
"from collections import OrderedDict\n",
"\n",
"adam = lambda loss, param: lasagne.updates.adam(loss, [param], learning_rate=0.01)\n",
"\n",
"with get_model() as model:\n",
" x = model.basic_RVs[1]\n",
" vparams = pm.variational.advi_minibatch(n=10000, optimizer=adam, minibatch_tensors=[], minibatches=[], \n",
" observed_RVs=OrderedDict({x: 1}), local_RVs=OrderedDict())\n",
" trace = pm.variational.sample_vp(vparams, 10000)\n",
" \n",
"plot_samples(trace)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normalizing flow"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Interface"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from abc import ABCMeta, abstractmethod\n",
"\n",
"class NormalizingFlow:\n",
" __metaclass__ = ABCMeta\n",
" \n",
" @abstractmethod\n",
" def init_model_params(self, d):\n",
" \"\"\"Initialize model parameters\n",
" \n",
" This method is called in ADVI inference functions, because \n",
" the dimension of parameter vector is difficult to know before \n",
" inference. \n",
" \n",
" d : int\n",
" Dimension of parameter vector.\n",
" \"\"\"\n",
" pass\n",
" \n",
" @abstractmethod\n",
" def trans(self, z_pre):\n",
" \"\"\"Transform variable (vector). \"\"\"\n",
" pass\n",
" \n",
" @abstractmethod\n",
" def ldj(self, z_pre):\n",
" \"\"\"Returns logdet of Jacobian. \"\"\"\n",
" pass\n",
" \n",
" @abstractmethod\n",
" def get_params(self):\n",
" \"\"\"Returns parameters. \"\"\"\n",
" pass"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Inverse autoregressive flow"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class SimpleMadeIAF(NormalizingFlow):\n",
" \"\"\"An inverse autoregressive flow: (z - f1(z, h1, g1)) / f2(z, h2, g2)\n",
" \n",
" f[1/2] are MADEs, whose connectivity constraints are deterministically set. \n",
" h[1/2] are the activation functions of the hidden layers in f[1/2]. \n",
" g[1/2] are the activation functions of the output layers in f[1/2]. \n",
" The number of units in all layers are same with the dimension of the \n",
" random variable in ADVI. \n",
" \n",
" Parameters\n",
" ----------\n",
" ns : list of int\n",
" The numbers of units in all layers, shared for f1 and f2.\n",
" hs : (tensor -> tensor, tensor -> tensor)\n",
" Elementwise activation function of the hidden layers in f[1/2].\n",
" gs : (tensor -> tensor, tensor -> tensor)\n",
" Elementwise activation function of the output layer in f[1/2].\n",
" rev_order : bool\n",
" If true, the order of connectivity constraints is reversed.\n",
" random_seed : int or None\n",
" Random seed for initialization of weight matrices.\n",
"\n",
" Example\n",
" -------\n",
" ls = (1, 1)\n",
" hs = (tt.nnet.sigmoid, tt.nnet.sigmoid)\n",
" gs = ((lambda x: x), tt.nnet.softplus)\n",
" SimpleMadeIAF(ls, hs, gs, 'upper')\n",
" \"\"\"\n",
" def __init__(self, ns, hs, gs, rev_order=False, random_seed=None):\n",
" self.ns = ns\n",
" self.hs = hs\n",
" self.gs = gs\n",
" self.model_params = None\n",
" self.rev_order = rev_order\n",
" self.rng = np.random.RandomState(random_seed)\n",
" \n",
" def init_model_params(self, d):\n",
" self.d = d\n",
" w1s, b1s = _init_made_params([d] + self.ns + [d], self.rng) # f1\n",
" w2s, b2s = _init_made_params([d] + self.ns + [d], self.rng) # f2\n",
" self.wss = (w1s, w2s)\n",
" self.bss = (b1s, b2s)\n",
" self.model_params = w1s + w2s + b1s + b2s\n",
"\n",
" # Masks\n",
" self.mask1s = _create_made_masks(self.d, self.ns, self.rev_order)\n",
" self.mask2s = _create_made_masks(self.d, self.ns, self.rev_order)\n",
" \n",
" def trans(self, zs):\n",
" \"\"\"Transform random variables and compute log determinant of Jacobian.\n",
" \n",
" Parameters\n",
" ----------\n",
" zs : tensor, shape=(n_mc_samples, dim_rv)\n",
" Random variables. n_mc_samples denotes the number of Monte Carlo samples\n",
" in ADVI. dim_rv is the dimension of (concatenated) random variables. \n",
" \n",
" Returns\n",
" -------\n",
" (zs_new, ldjs) : (tensor, tensor)\n",
" Transformed random variables and log determinant of Jacobians.\n",
" zs_new.shape is the same with zs. ldjs.shape = (n_mc_samples,). \n",
" \"\"\"\n",
" # Outputs of MADEs\n",
" n_layers = len(self.ns)\n",
" h1, h2 = self.hs\n",
" g1, g2 = self.gs\n",
" w1s, w2s = self.wss\n",
" b1s, b2s = self.bss\n",
" \n",
" def f(zs, n_layers, h, g, ws, bs, masks):\n",
" \"\"\"MADE\"\"\"\n",
" xs = zs\n",
" for l in range(n_layers):\n",
" xs = h(xs.dot(masks[l] * ws[l]) + bs[l])\n",
" return g(xs.dot(masks[n_layers] * ws[n_layers]) + bs[n_layers])\n",
" \n",
" f1s = f(zs, n_layers, h1, g1, w1s, b1s, self.mask1s)\n",
" f2s = f(zs, n_layers, h2, g2, w2s, b2s, self.mask2s)\n",
" \n",
" # Outputs\n",
" zs_new = (zs - f1s) / f2s\n",
" \n",
" # Log determinant of Jacobian\n",
" ldjs = -tt.sum(tt.log(f2s), axis=-1)\n",
" \n",
" return zs_new, ldjs\n",
" \n",
" def get_params(self):\n",
" if self.model_params is None:\n",
" raise RuntimeError(\"get_params() was invoked before trans().\")\n",
" else:\n",
" return self.model_params"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Masked autoencoder (MADE)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def _init_made_params(ns, rng):\n",
" \"\"\"Initialize model parameters of a MADE.\n",
" \n",
" Parameters\n",
" ----------\n",
" l : int\n",
" The numbers of units in all layers, \n",
" including the input and output layers.\n",
" rng : numpy.random.RandomState\n",
" Random number generator.\n",
" \n",
" Returns\n",
" -------\n",
" (ws, bs) : (List[shared], List[shared])\n",
" Model parameters (weights and biases).\n",
" \"\"\"\n",
" ws = list()\n",
" bs = list()\n",
" for l in range(len(ns) - 1):\n",
" d_in = ns[l]\n",
" d_out = ns[l + 1]\n",
" ws.append(shared(0.01 * rng.randn(d_in, d_out).astype('float32')))\n",
" bs.append(shared(0.01 * rng.randn(d_out).astype('float32')))\n",
"\n",
" return ws, bs\n",
"\n",
"\n",
"def _create_made_mask(d_pre, d, m_pre, output_layer, rev_order=False):\n",
" \"\"\"Create a mask for MADE.\n",
" \n",
" Parameters\n",
" ----------\n",
" d_pre : int\n",
" The number of rows in the weight matrix. \n",
" d : int\n",
" The number of columns in the weight matrix. \n",
" m_pre : numpy.ndarray, shape=(d_pre,)\n",
" The number of inputs to the units in the previous layer.\n",
" output_layer : bool\n",
" True for the output layer. \n",
" rev_order : bool\n",
" If true, the order of connectivity constraints is reversed. \n",
" It is used only for the output layer. \n",
" \n",
" Returns\n",
" -------\n",
" m, mask : (numpy.ndarray, numpy.ndarray)\n",
" Mask indices and Mask.\n",
" \"\"\"\n",
" d_input = np.max(m_pre)\n",
" mask = np.zeros((d_pre, d)).astype('float32')\n",
" \n",
" if not output_layer:\n",
" m = np.arange(1, d_input).astype(int)\n",
" if len(m) < d:\n",
" m = np.hstack((m, (d_input - 1) * np.ones(d - len(m))))\n",
" \n",
" for ix_col in range(d):\n",
" ixs_row = np.where(m_pre <= m[ix_col])[0]\n",
" (mask[:, ix_col])[ixs_row] = 1\n",
"\n",
" else:\n",
" m = np.arange(1, d + 1)\n",
" if rev_order:\n",
" m = m[::-1]\n",
" for ix_col in range(d):\n",
" ixs_row = np.where(m_pre < m[ix_col])[0]\n",
" mask[ixs_row, ix_col] = 1\n",
" \n",
" return m, mask\n",
"\n",
"\n",
"def _create_made_masks(d, ns, rev_order=False):\n",
" \"\"\"Create masks for all layers.\n",
" \n",
" Parameters\n",
" ----------\n",
" d : int\n",
" Input dimension.\n",
" ns : list of int\n",
" The numbers of units in all hidden layers. \n",
" rev_order : bool\n",
" If true, the order of connectivity constraints is reversed.\n",
" \n",
" Returns\n",
" -------\n",
" masks : List[numpy.ndarray]\n",
" List of masks.\n",
" \"\"\"\n",
" # The number of layers\n",
" n_layers = len(ns)\n",
" \n",
" # Mask indices for the input layer\n",
" m = np.arange(1, d + 1).astype(int)\n",
" if rev_order:\n",
" m = m[::-1]\n",
" masks = list()\n",
" \n",
" d_pre = d\n",
" for l, n in zip(range(n_layers), ns):\n",
" m, mask = _create_made_mask(d_pre, n, m, output_layer=False)\n",
" masks.append(mask)\n",
" d_pre = n\n",
" _, mask = _create_made_mask(d_pre, d, m, output_layer=True, \n",
" rev_order=rev_order)\n",
"\n",
" masks.append(mask)\n",
" \n",
" return masks"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test logdet of the Jacobian of IAF"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[array(0.03311258554458618, dtype=float32), array(0.03311264514923096, dtype=float32)]\n",
"[array(0.0650162324309349, dtype=float32), array(0.06501622498035431, dtype=float32)]\n",
"[array(0.0008600028231739998, dtype=float32), array(0.0008599635912105441, dtype=float32)]\n",
"[array(-0.018910568207502365, dtype=float32), array(-0.018910527229309082, dtype=float32)]\n",
"[array(0.9090602397918701, dtype=float32), array(0.9090602397918701, dtype=float32)]\n"
]
}
],
"source": [
"def test_iaf_ldj(d=3, rev_order=True, random_seed=0):\n",
" # Random vector\n",
" z = tt.vector(dtype='float32')\n",
" z.tag.test_value = np.ones(d).astype('float32')\n",
" \n",
" # Triangular MADE-IAF\n",
" ns = [(d + 10)]\n",
" hs = (tt.nnet.softplus, tt.nnet.softplus)\n",
" gs = ((lambda x: x), tt.exp)\n",
" iaf = SimpleMadeIAF(ns, hs, gs, rev_order, random_seed)\n",
" iaf.init_model_params(d)\n",
" z_trans, ldj = iaf.trans(z)\n",
" \n",
" # Exact computation\n",
" j = jacobian(z_trans, z).reshape((d, d))\n",
" ldj_true = tt.log(tt.nlinalg.det(tt.abs_(j)))\n",
" \n",
" f = function([z], [ldj, ldj_true])\n",
" print(f(10 + np.arange(d).astype('float32')))\n",
" \n",
"test_iaf_ldj(d=3, rev_order=False)\n",
"test_iaf_ldj(d=3, rev_order=True)\n",
"test_iaf_ldj(d=3, rev_order=False, random_seed=1)\n",
"test_iaf_ldj(d=3, rev_order=True, random_seed=1)\n",
"test_iaf_ldj(d=100, rev_order=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### ADVI with IAF"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iteration 0 [0%]: ELBO = -61.43\n",
"Iteration 1000 [10%]: Average ELBO = -45.48\n",
"Iteration 2000 [20%]: Average ELBO = -36.52\n",
"Iteration 3000 [30%]: Average ELBO = -36.58\n",
"Iteration 4000 [40%]: Average ELBO = -36.44\n",
"Iteration 5000 [50%]: Average ELBO = -36.55\n",
"Iteration 6000 [60%]: Average ELBO = -36.51\n",
"Iteration 7000 [70%]: Average ELBO = -36.45\n",
"Iteration 8000 [80%]: Average ELBO = -36.5\n",
"Iteration 9000 [90%]: Average ELBO = -36.56\n",
"Finished [100%]: ELBO = -36.56\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11e4f48d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n_unitss = [4]\n",
"hs = (tt.nnet.sigmoid, tt.nnet.sigmoid)\n",
"gs = (tt.nnet.softplus, tt.exp)\n",
"iaf1 = SimpleMadeIAF(n_unitss, hs, gs, rev_order=False, random_seed=0)\n",
"iaf2 = SimpleMadeIAF(n_unitss, hs, gs, rev_order=True, random_seed=1)\n",
"nfs = [iaf2, iaf1]\n",
"\n",
"with get_model() as model:\n",
" x = model.basic_RVs[1]\n",
" vparams = pm.variational.advi_minibatch(n=10000, optimizer=adam, minibatch_tensors=[], minibatches=[], \n",
" observed_RVs=OrderedDict({x: 1}), local_RVs=OrderedDict(), \n",
" global_NFs=nfs)\n",
" trace = pm.variational.sample_vp(vparams, 10000, global_NFs=nfs)\n",
" \n",
"plot_samples(trace)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## References\n",
"* Rezende, D. J., & Mohamed, S. (2015). Variational inference with normalizing flows. arXiv preprint arXiv:1505.05770.\n",
"* Salimans, T., Kingma, D. P., & Welling, M. (2015). Markov chain Monte Carlo and variational inference: Bridging the gap. In International Conference on Machine Learning (pp. 1218-1226).\n",
"* Albert, J. (2009). Bayesian computation with R. Springer Science & Business Media.\n",
"* Kingma, D. P., Salimans, T., & Welling, M. (2016). Improving variational inference with inverse autoregressive flow. arXiv preprint arXiv:1606.04934.\n",
"* Germain, M., Gregor, K., Murray, I., & Larochelle, H. (2015, February). Made: masked autoencoder for distribution estimation. In International Conference on Machine Learning (pp. 881-889)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda env:pymc3_dev]",
"language": "python",
"name": "conda-env-pymc3_dev-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
},
"nav_menu": {},
"toc": {
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 6,
"toc_cell": true,
"toc_section_display": "block",
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment