{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exponential Machines\n", "\n", "[Exponential machines (Novikov et al., 2017)](https://arxiv.org/pdf/1605.03795.pdf) are predictors that are able to model all $2^N$ interactions between $N$ features. Those interactions are limited to being of degree 1, i.e. the regressor is of the form \n", "\n", "$$f(x_1, \\dots, x_N) = \\sum_{\\alpha \\subseteq \\{1, \\dots, N\\}} \\left( w_{\\alpha} \\cdot \\prod_{n \\in \\alpha} x_n \\right)$$\n", "\n", "and fitting the regressor means finding the best $w_{\\alpha}$ for all $2^N$ possible $\\alpha$'s. Besides the $L^2$ loss on the training data, the original paper also adds an $L^2$ regularization term (\"ridge\") on the set of weights $w$.\n", "\n", "We note that an exponential machine is equivalent to a TT-Tucker model with Tucker rank equal to 2: the first column of the Tucker factors should be a constant ($1$), and the second column should be linear ($x$). To this end, we can use for example a Legendre expansion of polynomials truncated to 2 basis elements. Note that this can be seen as a particular case of a [polynomial chaos expansion](pce.ipynb).\n", "\n", "We will try here a synthetic model with noise: $f^{\\mathrm{true}}(x_1, \\dots, x_5) = x_1 x_2 x_3 + x_1 x_2 x_3 x_4 x_5 + \\varepsilon$:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "torch.set_default_dtype(torch.float64)\n", "import tntorch as tn\n", "\n", "P = 100\n", "ntrain = int(P*0.75)\n", "N = 5\n", "ticks = 32 # We will use a 32^5 tensor\n", "\n", "X = torch.rand(P, N)*2 - 1 # Features between -1 and 1\n", "y = torch.prod(X, dim=1) + torch.prod(X[:, :3], dim=1)\n", "y += torch.randn(y.shape)*torch.std(y)/10 # Gaussian noise: 1/5th of the clean signal's sigma\n", "X = (X+1)/2*(ticks-1) # Make feature between 0 and ticks-1, i.e. indexable by the tensor\n", "\n", "# Split into train/test\n", "X_train = X[:ntrain]\n", "y_train = y[:ntrain]\n", "X_test = X[ntrain:]\n", "y_test = y[ntrain:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A TT-rank of 2 should be enough to fit this data set, since it arises from the sum of exactly two interactions." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "t = tn.rand(shape=[ticks]*N, ranks_tt=2, ranks_tucker=2, requires_grad=True)\n", "t.set_factors('legendre', requires_grad=False) # We set the factors to Legendre polynomials, and fix them (won't be changed during optimization) " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "iter: 0 | loss: 7.956270 | total time: 0.0022\n", "iter: 500 | loss: 0.475733 | total time: 0.9688\n", "iter: 1000 | loss: 0.071103 | total time: 1.8799\n", "iter: 1500 | loss: 0.024970 | total time: 2.8605\n", "iter: 2000 | loss: 0.013503 | total time: 3.9351\n", "iter: 2500 | loss: 0.009449 | total time: 5.0269\n", "iter: 3000 | loss: 0.007776 | total time: 6.1072\n", "iter: 3500 | loss: 0.007118 | total time: 7.1863\n", "iter: 3532 | loss: 0.007094 | total time: 7.2544 <- converged (tol=0.0001)\n" ] } ], "source": [ "def loss(t):\n", " return tn.relative_error(y_train, t[X_train])**2\n", "tn.optimize(t, loss)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test relative error: tensor(0.1051, grad_fn=)\n" ] } ], "source": [ "print('Test relative error:', tn.relative_error(y_test, t[X_test]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The tensor of weights ($\\mathcal{W}$ in the original paper) can be retrieved as the TT part of our TT-Tucker tensor:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5D TT tensor:\n", "\n", " 2 2 2 2 2\n", " | | | | |\n", " (0) (1) (2) (3) (4)\n", " / \\ / \\ / \\ / \\ / \\\n", "1 2 2 2 2 1" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "core = tn.Tensor(t.cores)\n", "core" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import numpy as np\n", "\n", "plt.figure()\n", "plt.bar(np.arange(core.size), np.sort(core.numpy().flatten()))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Despite the noise, the model correctly retrieved the two interacting components. Those indeed correspond to $x_1 x_2 x_3$ and $x_1 x_2 x_3 x_4 x_5$:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor(1.0280, grad_fn=)\n", "tensor(0.9253, grad_fn=)\n" ] } ], "source": [ "print(core[1, 1, 1, 0, 0])\n", "print(core[1, 1, 1, 1, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The orders of participating interactions (namely, 3 and 5) can be revealed as well by the [dimension distribution](sobol.ipynb):" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.bar(np.arange(1, N+1), tn.dimension_distribution(t).numpy())\n", "plt.xlabel('Order')\n", "plt.ylabel('Variance contribution')\n", "plt.title('Dimension distribution')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }