Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Raw File Download
Permalink

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
content badge Iframe embedding
swh:1:cnt:f57b023e82c788776a2c24661dff932cc4654fb3
Citations

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
{
 "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=<DivBackward1>)\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": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "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=<SqueezeBackward0>)\n",
      "tensor(0.9253, grad_fn=<SqueezeBackward0>)\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": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "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
}

back to top

Software Heritage — Copyright (C) 2015–2025, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Contact— JavaScript license information— Web API