├── README.md ├── notebooks ├── Notebook 1 - Understanding the KLD.ipynb ├── Notebook 2 - Bayesian Linear Regression.ipynb ├── Notebook 3 - Bayesian Logistic Regression, Laplace Approximation.ipynb ├── Notebook 4 - Bayesian Logistic Regression, ELBO.ipynb ├── Notebook 5 - Bayesian Neural Network.ipynb ├── Notebook 6 - Variational Autoencoders.ipynb ├── Notebook 7 - Discriminators.ipynb ├── Notebook 8 - Generative Adversarial Networks.ipynb └── Notebook 9 - Generative Adversarial Networks.ipynb └── slides.pdf /README.md: -------------------------------------------------------------------------------- 1 | # Materials for my talk, Deep Probabilistic Methods with Pytorch 2 | -------------------------------------------------------------------------------- /notebooks/Notebook 2 - Bayesian Linear Regression.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Bayesian Linear Regression\n", 8 | "\n", 9 | "Bayesian Linear Regression covers regression which is Linear in the parameters. Using a basis function, $\\phi(x)$ we can trivially include 'non-linear' functions under the bracket of Linear Regression.\n", 10 | "\n", 11 | "## The Model\n", 12 | "\n", 13 | "We model the weights, $\\mathbf{W}$, as having a prior Normal distribution.\n", 14 | "\n", 15 | "$\\mathbf{W} \\sim \\mathcal{N}(0, \\alpha^{-1}\\mathbf{I})$\n", 16 | "\n", 17 | "$\\mathbf{y} \\sim \\mathcal{N}(\\Phi \\mathbf{W}, \\beta^{-1} \\mathbf{I})$\n", 18 | "\n", 19 | "Where $\\Phi$ is the matrix of basis functions (rows correspond to samples, columns to features)." 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "## Inference\n", 27 | "\n", 28 | "This is a conjugate model, so we know $P(\\mathbf{W} \\mid \\mathbf{y}, \\mathbf{X})$ is also a Normal distribution.\n", 29 | "\n", 30 | "We can find this by first recognizing $P(\\mathbf{W}, \\mathbf{y} \\mid \\mathbf{X}) \\propto P(\\mathbf{W}\\mid \\mathbf{y} , \\mathbf{X})$, and discarding terms terms independent of $\\mathbf{W}$, combining what remains into a normal, and renormalizing (see PRML Bishop for more details).\n", 31 | "\n", 32 | "Doing this gives us:\n", 33 | "\n", 34 | "$P(\\mathbf{W} \\mid \\mathbf{y}, \\mathbf{X}) = \\mathcal{N}(\\mathbf{\\mu}, \\mathbf{\\Sigma})$\n", 35 | "\n", 36 | "$\\Sigma = (\\alpha \\mathbf{I} + \\beta \\mathbf{\\Phi}^{T}\\mathbf{\\Phi})^{-1}$
\n", 37 | "$\\mu = \\beta \\Sigma \\mathbf{\\Phi}^{T} \\mathbf{y}$" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "## Generating Data" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": 1, 50 | "metadata": { 51 | "collapsed": true 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "import numpy as np\n", 56 | "import matplotlib.pyplot as plt\n", 57 | "from scipy.stats import multivariate_normal, norm\n", 58 | "%matplotlib inline" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 2, 64 | "metadata": { 65 | "collapsed": true 66 | }, 67 | "outputs": [], 68 | "source": [ 69 | "x = np.random.uniform(low=-3, high=5, size=(40,1))\n", 70 | "y = 0.1*x**3 - 3*x + 2 + np.random.normal(scale=0.3, size=x.shape)" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 3, 76 | "metadata": {}, 77 | "outputs": [ 78 | { 79 | "data": { 80 | "text/plain": [ 81 | "" 82 | ] 83 | }, 84 | "execution_count": 3, 85 | "metadata": {}, 86 | "output_type": "execute_result" 87 | }, 88 | { 89 | "data": { 90 | "image/png": "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\nyx7uLwAAAABJRU5ErkJggg==\n", 91 | "text/plain": [ 92 | "" 93 | ] 94 | }, 95 | "metadata": {}, 96 | "output_type": "display_data" 97 | } 98 | ], 99 | "source": [ 100 | "plt.scatter(x,y)" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 4, 106 | "metadata": { 107 | "collapsed": true 108 | }, 109 | "outputs": [], 110 | "source": [ 111 | "def phi(x):\n", 112 | " design_matrix = np.concatenate([np.ones(x.shape), x, x**2, x**3], axis=1)\n", 113 | " return design_matrix\n", 114 | " " 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 5, 120 | "metadata": {}, 121 | "outputs": [ 122 | { 123 | "name": "stdout", 124 | "output_type": "stream", 125 | "text": [ 126 | "(40, 1) (40, 4)\n" 127 | ] 128 | } 129 | ], 130 | "source": [ 131 | "print(x.shape, phi(x).shape)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": {}, 137 | "source": [ 138 | "## Model\n", 139 | "\n" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 6, 145 | "metadata": { 146 | "collapsed": true 147 | }, 148 | "outputs": [], 149 | "source": [ 150 | "alpha = 1\n", 151 | "beta = 1/0.4\n", 152 | "\n", 153 | "posterior_precision =alpha * np.identity(phi(x).shape[1])+ beta * np.dot(phi(x).T, phi(x))\n", 154 | "posterior_mean = beta * np.dot(np.linalg.inv(posterior_precision),np.dot(phi(x).T, y))" 155 | ] 156 | }, 157 | { 158 | "cell_type": "code", 159 | "execution_count": 7, 160 | "metadata": {}, 161 | "outputs": [ 162 | { 163 | "data": { 164 | "image/png": "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\nRK5CYII=\n", 165 | "text/plain": [ 166 | "" 167 | ] 168 | }, 169 | "metadata": {}, 170 | "output_type": "display_data" 171 | } 172 | ], 173 | "source": [ 174 | "plt.scatter(x,y, c='k')\n", 175 | "ar = np.arange(-5,6, 0.1).reshape(-1,1)\n", 176 | "for i in range(4):\n", 177 | " w_sample = np.random.multivariate_normal(posterior_mean.ravel(), \n", 178 | " np.linalg.inv(posterior_precision))\n", 179 | " plt.plot(ar, np.dot(phi(ar), w_sample), c='r')" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "## Predictive Distribution\n", 187 | "\n", 188 | "Now we have the posterior, we can compute the preditive distribution:\n", 189 | "\n", 190 | "$P(y^{*} \\mid x^{*}) = \\int P(y^{*} \\mid w, x^{*})P(w \\mid X, y) dw = \\mathcal{N}(t^{*} \\mid m_{n}^{T} \\phi(x^{*}), \\sigma_{n}^{2})$\n", 191 | "\n", 192 | "$m_{n} = Posterior \\ mean$
\n", 193 | "$S_{n} = Posterior \\ Covariance$
\n", 194 | "\n", 195 | "$\\sigma_{n}^{2} = \\frac{1}{\\beta} + \\phi (x) S_{n} \\phi(x)^{T}$
" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": 8, 201 | "metadata": {}, 202 | "outputs": [], 203 | "source": [ 204 | "xs, ys = np.meshgrid(np.arange(-3,6,0.01), np.arange(-5,10,0.01))" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 9, 210 | "metadata": {}, 211 | "outputs": [], 212 | "source": [ 213 | "px = phi(xs.reshape(-1,1))" 214 | ] 215 | }, 216 | { 217 | "cell_type": "code", 218 | "execution_count": 10, 219 | "metadata": { 220 | "collapsed": true 221 | }, 222 | "outputs": [], 223 | "source": [ 224 | "sn = np.linalg.inv(posterior_precision)" 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "execution_count": 11, 230 | "metadata": {}, 231 | "outputs": [], 232 | "source": [ 233 | "predictive_var = 1/beta + (px @ sn * px).sum(axis=1)\n", 234 | "predictive_mean = px @ posterior_mean" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": 12, 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [ 243 | "z = norm.pdf(ys.ravel(), loc = predictive_mean.ravel(), scale=predictive_var**0.5)" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 13, 249 | "metadata": {}, 250 | "outputs": [ 251 | { 252 | "data": { 253 | "text/plain": [ 254 | "" 255 | ] 256 | }, 257 | "execution_count": 13, 258 | "metadata": {}, 259 | "output_type": "execute_result" 260 | }, 261 | { 262 | "data": { 263 | "image/png": "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\n", 264 | "text/plain": [ 265 | "" 266 | ] 267 | }, 268 | "metadata": {}, 269 | "output_type": "display_data" 270 | } 271 | ], 272 | "source": [ 273 | "plt.contourf(xs, ys, z.reshape(xs.shape))\n", 274 | "plt.colorbar()\n", 275 | "plt.scatter(x,y, c='r')" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": 14, 281 | "metadata": {}, 282 | "outputs": [ 283 | { 284 | "data": { 285 | "text/plain": [ 286 | "(-5, 4)" 287 | ] 288 | }, 289 | "execution_count": 14, 290 | "metadata": {}, 291 | "output_type": "execute_result" 292 | }, 293 | { 294 | "data": { 295 | "image/png": "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\nYII=\n", 296 | "text/plain": [ 297 | "" 298 | ] 299 | }, 300 | "metadata": {}, 301 | "output_type": "display_data" 302 | } 303 | ], 304 | "source": [ 305 | "plt.contourf(xs, ys, z.reshape(xs.shape))\n", 306 | "plt.colorbar()\n", 307 | "plt.scatter(x,y, c='r')\n", 308 | "plt.xlim([4,6])\n", 309 | "plt.ylim([-5,4])" 310 | ] 311 | }, 312 | { 313 | "cell_type": "markdown", 314 | "metadata": {}, 315 | "source": [ 316 | "# Summary\n", 317 | "\n", 318 | "Having a nice closed form solution makes things nice and straight forward.\n", 319 | "\n", 320 | "Using a Bayesian predictive distribution means we get uncertainty estimates that reflect what we learnt from our training data - we are less certain about predictions that extrapolate our data or occur in an area of low data density." 321 | ] 322 | } 323 | ], 324 | "metadata": { 325 | "anaconda-cloud": {}, 326 | "kernelspec": { 327 | "display_name": "Python 3", 328 | "language": "python", 329 | "name": "python3" 330 | }, 331 | "language_info": { 332 | "codemirror_mode": { 333 | "name": "ipython", 334 | "version": 3 335 | }, 336 | "file_extension": ".py", 337 | "mimetype": "text/x-python", 338 | "name": "python", 339 | "nbconvert_exporter": "python", 340 | "pygments_lexer": "ipython3", 341 | "version": "3.6.2" 342 | } 343 | }, 344 | "nbformat": 4, 345 | "nbformat_minor": 2 346 | } 347 | -------------------------------------------------------------------------------- /notebooks/Notebook 5 - Bayesian Neural Network.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Bayesian Neural Network\n", 8 | "\n", 9 | "\n", 10 | "## The Model\n", 11 | "\n", 12 | "The model is a small extention of Logistic Regression. In Logistic Regression the likelihood is a linear function of the prior. In a neural network, it is any (non-linear) function of the prior. \n", 13 | "\n", 14 | "$P(\\mathbf{w}) = \\mathcal{N}(\\mathbf{0}, \\alpha^{-1}\\mathbf{I})$\n", 15 | "\n", 16 | "$P(\\mathbf{y} \\mid \\mathbf{X}, \\mathbf{w} ) = \\sigma(\\mathcal{N}(\\mathbf{f(X,w)}, \\beta^{-1}\\mathbf{I}))$\n" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": { 23 | "collapsed": true 24 | }, 25 | "outputs": [], 26 | "source": [ 27 | "import numpy as np\n", 28 | "import torch\n", 29 | "import matplotlib.pyplot as plt\n", 30 | "import sklearn as skl\n", 31 | "from sklearn.datasets import make_classification\n", 32 | "%matplotlib inline" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/plain": [ 43 | "torch.Size([100])" 44 | ] 45 | }, 46 | "execution_count": 2, 47 | "metadata": {}, 48 | "output_type": "execute_result" 49 | } 50 | ], 51 | "source": [ 52 | "a = torch.ones(200)\n", 53 | "a[100:200].shape" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 14, 59 | "metadata": { 60 | "collapsed": true 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "class BayesianNeuralNetworkELBO(torch.nn.Module):\n", 65 | " def __init__(self, in_features, out_features):\n", 66 | " super(BayesianNeuralNetworkELBO, self).__init__()\n", 67 | " self.hidden_size = 5\n", 68 | " self.l1_shape = (in_features, self.hidden_size)\n", 69 | " self.l2_shape = (self.hidden_size, out_features)\n", 70 | " self.bce = torch.nn.BCEWithLogitsLoss()\n", 71 | " self.relu = torch.nn.ReLU()\n", 72 | " self.tanh = torch.nn.Tanh()\n", 73 | " self.sigmoid = torch.nn.Sigmoid()\n", 74 | " \n", 75 | " def forward(self, x, w):\n", 76 | " n_l1 = self.l1_shape[0]*self.l1_shape[1]\n", 77 | " n_l2 =self.l2_shape[0]*self.l2_shape[1]\n", 78 | " \n", 79 | " w1 = w[:n_l1].view(self.l1_shape)\n", 80 | " w2 = w[n_l1:n_l1+n_l2].view(self.l2_shape)\n", 81 | " \n", 82 | " a1 = self.tanh(torch.matmul(x, w1))\n", 83 | " return torch.matmul(a1, w2)\n", 84 | " \n", 85 | " def forward_with_sigmoid(self, x, w):\n", 86 | " return self.sigmoid(self.forward(x,w))\n", 87 | " \n", 88 | " def loss(self, x, y, w, approx_mean, approx_chl_flat):\n", 89 | " \n", 90 | " y_hat = self.forward(x,w)\n", 91 | " app_cov = vec_to_ldiag(approx_chl_flat, 20)\n", 92 | " q_cov =torch.matmul(app_cov, app_cov.transpose(0,1))\n", 93 | "\n", 94 | " return self.bce(y_hat, y)-self.analytical_KLD(approx_mean, q_cov ,\n", 95 | " torch.zeros_like(approx_mean), \n", 96 | " torch.eye(q_cov.shape[0]))/(x.shape[0]*x.shape[1])\n", 97 | " \n", 98 | " \n", 99 | " def analytical_KLD(self, m1, c1, m2, c2):\n", 100 | " \n", 101 | " trace = torch.trace(torch.matmul(torch.inverse(c2), c1))\n", 102 | " dmu = (m2 - m1).reshape(-1,1)\n", 103 | " mhlbs = torch.matmul(torch.matmul(dmu.transpose(0,1), torch.inverse(c2)), dmu)\n", 104 | " det_ratio = torch.log(torch.det(c2))-torch.log(torch.det(c1))\n", 105 | " return 0.5*(det_ratio+trace+mhlbs+c2.shape[0])" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "execution_count": 15, 111 | "metadata": { 112 | "collapsed": true 113 | }, 114 | "outputs": [], 115 | "source": [ 116 | "bnn = BayesianNeuralNetworkELBO(3,1)" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 16, 122 | "metadata": {}, 123 | "outputs": [ 124 | { 125 | "data": { 126 | "image/png": "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\n", 127 | "text/plain": [ 128 | "" 129 | ] 130 | }, 131 | "metadata": {}, 132 | "output_type": "display_data" 133 | } 134 | ], 135 | "source": [ 136 | "x, y = make_classification(n_samples=2000, flip_y=0, n_features=2, n_informative=2, n_redundant=0, class_sep=3.0)\n", 137 | "plt.scatter(x[:,0], x[:,1], c=y)\n", 138 | "x_1s = np.concatenate([np.ones((x.shape[0],1)), x], axis=1)" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 17, 144 | "metadata": { 145 | "collapsed": true 146 | }, 147 | "outputs": [], 148 | "source": [ 149 | "def vec_to_ldiag(vec, size):\n", 150 | " c = torch.zeros(size, size)\n", 151 | " c[torch.tril(torch.ones(size, size)) == 1] = vec\n", 152 | " c[torch.eye(size).byte()] = torch.nn.functional.sigmoid(c[torch.eye(size).byte()])\n", 153 | " return c\n", 154 | "\n", 155 | "approx_mean = torch.nn.Parameter(torch.ones(20))\n", 156 | "approx_cov_params = torch.nn.Parameter(torch.ones(210).float())\n", 157 | "\n", 158 | "approx_chl = vec_to_ldiag(approx_cov_params, 20)\n", 159 | "\n", 160 | "\n", 161 | "mvn = torch.distributions.MultivariateNormal(approx_mean, scale_tril=approx_chl)\n", 162 | "\n", 163 | "opt = torch.optim.Adam([approx_mean, approx_cov_params], lr=0.05)" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 18, 169 | "metadata": { 170 | "collapsed": true 171 | }, 172 | "outputs": [], 173 | "source": [ 174 | "x_t = torch.autograd.Variable(torch.from_numpy(x_1s).float())\n", 175 | "y_t = torch.autograd.Variable(torch.from_numpy(y.reshape(-1,1)).float())\n", 176 | "for t in range(70000):\n", 177 | " opt.zero_grad()\n", 178 | " w=mvn.rsample()\n", 179 | " q_cov = vec_to_ldiag(approx_cov_params, 20)\n", 180 | " \n", 181 | " loss = bnn.loss(x_t,y_t, w, approx_mean, approx_cov_params)\n", 182 | " loss.backward(retain_graph=True)\n", 183 | " opt.step()" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 21, 189 | "metadata": {}, 190 | "outputs": [ 191 | { 192 | "data": { 193 | "image/png": "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\n", 194 | "text/plain": [ 195 | "" 196 | ] 197 | }, 198 | "metadata": {}, 199 | "output_type": "display_data" 200 | } 201 | ], 202 | "source": [ 203 | "h=0.01\n", 204 | "x_min, x_max = x[:, 0].min() - .5, x[:, 0].max() + .5\n", 205 | "y_min, y_max = x[:, 1].min() - .5, x[:, 1].max() + .5\n", 206 | "xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", 207 | "\n", 208 | "xy_1s = np.c_[np.ones(len(xx.ravel())), xx.ravel(), yy.ravel()]\n", 209 | "\n", 210 | "Z = bnn.forward_with_sigmoid(torch.from_numpy(xy_1s).float(), approx_mean).data.numpy()\n", 211 | "\n", 212 | "# Put the result into a cololr plot\n", 213 | "Z = Z.reshape(xx.shape)\n", 214 | "plt.figure(1, figsize=(4, 3))\n", 215 | "plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)\n", 216 | "\n", 217 | "# Plot also the training points\n", 218 | "plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)\n", 219 | "\n", 220 | "plt.xlim(xx.min(), xx.max())\n", 221 | "plt.ylim(yy.min(), yy.max())\n", 222 | "plt.xticks(())\n", 223 | "plt.yticks(())\n", 224 | "plt.colorbar()\n", 225 | "plt.show()" 226 | ] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": { 231 | "collapsed": true 232 | }, 233 | "source": [ 234 | "# Summary\n", 235 | "\n", 236 | "In this post we have shown how we can use the ELBO to train a Bayesian neural network." 237 | ] 238 | } 239 | ], 240 | "metadata": { 241 | "kernelspec": { 242 | "display_name": "Python 3", 243 | "language": "python", 244 | "name": "python3" 245 | }, 246 | "language_info": { 247 | "codemirror_mode": { 248 | "name": "ipython", 249 | "version": 3 250 | }, 251 | "file_extension": ".py", 252 | "mimetype": "text/x-python", 253 | "name": "python", 254 | "nbconvert_exporter": "python", 255 | "pygments_lexer": "ipython3", 256 | "version": "3.6.2" 257 | } 258 | }, 259 | "nbformat": 4, 260 | "nbformat_minor": 2 261 | } 262 | -------------------------------------------------------------------------------- /notebooks/Notebook 6 - Variational Autoencoders.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Variational Autoencoders\n", 8 | "\n", 9 | "This notebook implements a basic variational autoencoder on a toy dataset so we are able to visualise the relevant representations." 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "## A note on differentiable sampling\n", 17 | "\n", 18 | "In order for the gradients of quantities computed by sampling to be correctly computed, samples should be reparameterised. \n", 19 | "\n", 20 | "As a short example, imagine computing $E_{q}[ln \\ q(z)]$. I can compute this by Monte Carlo, by sampling from q, putting the sampled z into the $ln \\ q(z)$ function, and averaging the results. However, there is a double dependency on the parameters of q here - once inside the log, and once in the sampling procedure. If we move the mean of q, it affects both our samples and the value of the log function.\n", 21 | "\n", 22 | "For a normal, we can encode the dependency using the reparameterisation trick.\n", 23 | "\n", 24 | "If we sample from a standard gaussian $m \\sim \\mathcal{N}(0,1)$, we can use this sample to sample from any gaussian $\\mathcal{N}(\\mu,\\sigma^{2})$ by $z=\\mu + \\sigma m$" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 19, 30 | "metadata": { 31 | "collapsed": true 32 | }, 33 | "outputs": [], 34 | "source": [ 35 | "import torch\n", 36 | "from torch import nn\n", 37 | "from torch.autograd import Variable\n", 38 | "\n", 39 | "import numpy as np\n", 40 | "import matplotlib.pyplot as plt\n", 41 | "%matplotlib inline\n", 42 | "plt.style.use('seaborn-darkgrid')" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": { 49 | "collapsed": true 50 | }, 51 | "outputs": [], 52 | "source": [ 53 | "representation_size = 2\n", 54 | "input_size = 4\n", 55 | "n_samples = 2000\n", 56 | "batch_size = 5" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 3, 62 | "metadata": { 63 | "collapsed": true 64 | }, 65 | "outputs": [], 66 | "source": [ 67 | "n_samples_per_batch = n_samples//input_size\n", 68 | "\n", 69 | "y = np.array([i for i in range(input_size) for _ in range(n_samples_per_batch)])\n", 70 | "\n", 71 | "d = np.identity(input_size)\n", 72 | "x = np.array([d[i] for i in y], dtype=np.float32)" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 4, 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "name": "stdout", 82 | "output_type": "stream", 83 | "text": [ 84 | "[[ 1. 0. 0. 0.]\n", 85 | " [ 1. 0. 0. 0.]\n", 86 | " [ 0. 1. 0. 0.]\n", 87 | " [ 0. 1. 0. 0.]\n", 88 | " [ 0. 0. 1. 0.]\n", 89 | " [ 0. 0. 1. 0.]\n", 90 | " [ 0. 0. 0. 1.]\n", 91 | " [ 0. 0. 0. 1.]]\n" 92 | ] 93 | } 94 | ], 95 | "source": [ 96 | "print(x[[10, 58 ,610, 790, 1123, 1258, 1506, 1988]])" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 5, 102 | "metadata": { 103 | "collapsed": true 104 | }, 105 | "outputs": [], 106 | "source": [ 107 | "class VAE(nn.Module):\n", 108 | " def __init__(self):\n", 109 | " super(VAE, self).__init__()\n", 110 | " self.en1 = nn.Linear(input_size, 200)\n", 111 | " self.en_mu = nn.Linear(200, representation_size)\n", 112 | " self.en_std = nn.Linear(200, representation_size)\n", 113 | " self.de1 = nn.Linear(representation_size, 200)\n", 114 | " self.de2 = nn.Linear(200, input_size)\n", 115 | " self.relu = nn.ReLU()\n", 116 | " self.sigmoid = nn.Sigmoid()\n", 117 | " \n", 118 | " def encode(self, x):\n", 119 | " \"\"\"Encode a batch of samples, and return posterior parameters for each point.\"\"\"\n", 120 | " h1 = self.relu(self.en1(x))\n", 121 | " return self.en_mu(h1), self.en_std(h1)\n", 122 | " \n", 123 | " def decode(self, z):\n", 124 | " \"\"\"Decode a batch of latent variables\"\"\"\n", 125 | " \n", 126 | " h2 = self.relu(self.de1(z))\n", 127 | " return self.sigmoid(self.de2(h2))\n", 128 | " \n", 129 | " def reparam(self, mu, logvar):\n", 130 | " \"\"\"Reparameterisation trick to sample z values. \n", 131 | " This is stochastic during training, and returns the mode during evaluation.\"\"\"\n", 132 | " \n", 133 | " if self.training:\n", 134 | " std = logvar.mul(0.5).exp_()\n", 135 | " eps = Variable(std.data.new(std.size()).normal_())\n", 136 | " return eps.mul(std).add_(mu)\n", 137 | " else:\n", 138 | " return mu\n", 139 | " \n", 140 | " \n", 141 | " def forward(self, x):\n", 142 | " \"\"\"Takes a batch of samples, encodes them, and then decodes them again to compare.\"\"\"\n", 143 | " mu, logvar = self.encode(x.view(-1, input_size))\n", 144 | " z = self.reparam(mu, logvar)\n", 145 | " return self.decode(z), mu, logvar\n", 146 | " \n", 147 | " def loss(self, reconstruction, x, mu, logvar):\n", 148 | " \"\"\"ELBO assuming entries of x are binary variables, with closed form KLD.\"\"\"\n", 149 | " \n", 150 | " bce = torch.nn.functional.binary_cross_entropy(reconstruction, x.view(-1, input_size))\n", 151 | " KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())\n", 152 | " # Normalise by same number of elements as in reconstruction\n", 153 | " KLD /= x.view(-1, input_size).data.shape[0] * input_size\n", 154 | "\n", 155 | " return bce + KLD\n", 156 | " \n", 157 | " def get_z(self, x):\n", 158 | " \"\"\"Encode a batch of data points, x, into their z representations.\"\"\"\n", 159 | " \n", 160 | " mu, logvar = self.encode(x.view(-1, input_size))\n", 161 | " return self.reparam(mu, logvar)" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 6, 167 | "metadata": { 168 | "collapsed": true 169 | }, 170 | "outputs": [], 171 | "source": [ 172 | "model = VAE()" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 7, 178 | "metadata": { 179 | "collapsed": true 180 | }, 181 | "outputs": [], 182 | "source": [ 183 | "optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)" 184 | ] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "execution_count": 29, 189 | "metadata": { 190 | "collapsed": true 191 | }, 192 | "outputs": [], 193 | "source": [ 194 | "def train(epoch, batches_per_epoch = 501, log_interval=500):\n", 195 | " model.train()\n", 196 | " \n", 197 | " ind = np.arange(x.shape[0])\n", 198 | " for i in range(batches_per_epoch):\n", 199 | " data = torch.from_numpy(x[np.random.choice(ind, size=batch_size)])\n", 200 | " data = Variable(data, requires_grad=False)\n", 201 | " \n", 202 | " optimizer.zero_grad()\n", 203 | " recon_batch, mu, logvar = model(data)\n", 204 | " \n", 205 | " loss = model.loss(recon_batch, data, mu, logvar)\n", 206 | " loss.backward()\n", 207 | " \n", 208 | " optimizer.step()\n", 209 | " if (i % log_interval == 0) and (epoch % 5 ==0):\n", 210 | " #Print progress\n", 211 | " print('Train Epoch: {} [{}/{}]\\tLoss: {:.6f}'.format(\n", 212 | " epoch, i * batch_size, batch_size*batches_per_epoch,\n", 213 | " loss.data[0] / len(data)))\n", 214 | "\n" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 30, 220 | "metadata": {}, 221 | "outputs": [ 222 | { 223 | "name": "stdout", 224 | "output_type": "stream", 225 | "text": [ 226 | "Train Epoch: 5 [0/2505]\tLoss: 0.071952\n", 227 | "Train Epoch: 5 [2500/2505]\tLoss: 0.066423\n", 228 | "Train Epoch: 10 [0/2505]\tLoss: 0.118553\n", 229 | "Train Epoch: 10 [2500/2505]\tLoss: 0.070104\n", 230 | "Train Epoch: 15 [0/2505]\tLoss: 0.131283\n", 231 | "Train Epoch: 15 [2500/2505]\tLoss: 0.099707\n", 232 | "Train Epoch: 20 [0/2505]\tLoss: 0.086306\n", 233 | "Train Epoch: 20 [2500/2505]\tLoss: 0.070170\n", 234 | "Train Epoch: 25 [0/2505]\tLoss: 0.069376\n", 235 | "Train Epoch: 25 [2500/2505]\tLoss: 0.073217\n" 236 | ] 237 | } 238 | ], 239 | "source": [ 240 | "print_examples = False #Change to true if you want to see some examples at each step!\n", 241 | "for epoch in range(1, 30):\n", 242 | " train(epoch)\n", 243 | " if print_examples:\n", 244 | " test(epoch)" 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": 31, 250 | "metadata": { 251 | "collapsed": true 252 | }, 253 | "outputs": [], 254 | "source": [ 255 | "data = Variable(torch.from_numpy(x), requires_grad=False)\n", 256 | "model.train()\n", 257 | "zs = model.get_z(data).data.numpy()" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 32, 263 | "metadata": { 264 | "collapsed": true 265 | }, 266 | "outputs": [], 267 | "source": [ 268 | "colors = np.array(['r', 'g', 'b', 'y'])" 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "execution_count": 33, 274 | "metadata": {}, 275 | "outputs": [ 276 | { 277 | "data": { 278 | "text/plain": [ 279 | "" 280 | ] 281 | }, 282 | "execution_count": 33, 283 | "metadata": {}, 284 | "output_type": "execute_result" 285 | }, 286 | { 287 | "data": { 288 | "image/png": "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\nt+u8U8oAAAAASUVORK5CYII=\n", 289 | "text/plain": [ 290 | "" 291 | ] 292 | }, 293 | "metadata": {}, 294 | "output_type": "display_data" 295 | } 296 | ], 297 | "source": [ 298 | "plt.scatter(zs[:,0], zs[:, 1], c=colors[y])" 299 | ] 300 | }, 301 | { 302 | "cell_type": "markdown", 303 | "metadata": {}, 304 | "source": [ 305 | "# Summary\n", 306 | "\n", 307 | "In this notebook, we have shown how we can learn joint and posterior distributions over a latent variable using VAEs, and how the latent variable has analogues to a traditional autoencoder." 308 | ] 309 | } 310 | ], 311 | "metadata": { 312 | "kernelspec": { 313 | "display_name": "Python 3", 314 | "language": "python", 315 | "name": "python3" 316 | }, 317 | "language_info": { 318 | "codemirror_mode": { 319 | "name": "ipython", 320 | "version": 3 321 | }, 322 | "file_extension": ".py", 323 | "mimetype": "text/x-python", 324 | "name": "python", 325 | "nbconvert_exporter": "python", 326 | "pygments_lexer": "ipython3", 327 | "version": "3.6.2" 328 | } 329 | }, 330 | "nbformat": 4, 331 | "nbformat_minor": 2 332 | } 333 | -------------------------------------------------------------------------------- /slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrisorm/pydata-2018/7c0036e7afd9ae040e2fd302b8e11a149c07fc7e/slides.pdf --------------------------------------------------------------------------------