{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Signature Inversion\n", "\n", "This notebook follows Section 3.6 of [Deep Signature Transforms](https://arxiv.org/pdf/1905.08494.pdf). PyTorch code can be found at [this](https://github.com/patrick-kidger/Deep-Signature-Transforms/blob/master/src/example_signature_inversion.ipynb)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import equinox as eqx\n", "import jax\n", "import jax.numpy as jnp\n", "import jax.random as jrandom\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import optax\n", "from signax import signature\n", "\n", "jax.config.update(\"jax_platform_name\", \"cpu\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "seed = 1234\n", "key = jrandom.PRNGKey(seed)\n", "signature_depth = 12\n", "learning_rate = 2 * 1e-3\n", "num_training_iters = 5000" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Preprocessing data\n", "Here we consider number 0" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# number zero (PenDigit)\n", "path = [29, 97, 0, 57, 22, 10, 68, 0, 100, 40, 83, 90, 37, 100, 12, 57]\n", "path = np.array(path, dtype=float).reshape(-1, 2)\n", "# rescale into range (-1,1)\n", "path = -1.0 + 2 * (path - np.min(path)) / (np.max(path) - np.min(path))\n", "path = jnp.array(path)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Let's visualize the data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-1.1, 1.1, -1.1, 1.1)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(*path.T, label=\"Original path\", linewidth=10, linestyle=\"-\")\n", "plt.axis(\"off\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Compute signature of the given data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "sig = signature(path, depth=signature_depth)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Model\n", "\n", "This model is quite simple: set of parameters (in `eqx.nn.Linear`) represents the path.\n", "\n", "The model outputs the signature of the learnable parameters." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "class InvertSignature(eqx.Module):\n", " path_length: int\n", " signature_depth: int\n", "\n", " # path represented as weight of linear layer\n", " # can instead use `jnp.ndarray`\n", " path: eqx.nn.Linear\n", "\n", " def __init__(self, path_length, signature_depth, *, key) -> None:\n", " self.path_length = path_length\n", " self.signature_depth = signature_depth\n", "\n", " self.path = eqx.nn.Linear(\n", " in_features=1,\n", " out_features=2 * path_length,\n", " use_bias=False,\n", " key=key,\n", " )\n", "\n", " def generate_path(self, x):\n", " x = self.path(x)\n", " return jnp.reshape(x, (self.path_length, 2))\n", "\n", " def __call__(self, x):\n", " x = self.generate_path(x)\n", " return signature(path=x, depth=signature_depth)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Model instantiation" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "model = InvertSignature(\n", " path_length=path.shape[0], signature_depth=signature_depth, key=key\n", ")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Create optimizer" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "optim = optax.adam(learning_rate=learning_rate)\n", "opt_state = optim.init(eqx.filter(model, eqx.is_array))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "A normalization term to compute the loss. The idea here is to penalize more higher order of signatures" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "normalization = [\n", " np.floor(np.log(i + 1) / np.log(2))\n", " for i in range(1, 2 ** (signature_depth + 1) - 1)\n", "]\n", "normalization = jnp.array(normalization)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In fact, the input of the model is fixed" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "x = jnp.ones((1, 1))\n", "y = sig" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Compute loss in Equinox style" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "@eqx.filter_value_and_grad\n", "def compute_loss(model):\n", " pred_sig = model(x)\n", " diff = y - pred_sig\n", " diff = diff * normalization\n", " return jnp.log(jnp.mean(diff**2))\n", "\n", "\n", "@eqx.filter_jit\n", "def make_step(model, opt_state):\n", " loss, grads = compute_loss(model)\n", " updates, opt_state = optim.update(grads, opt_state)\n", " model = eqx.apply_updates(model, updates)\n", " return loss, model, opt_state" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Training step" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iter=0 \t loss=2.1267\n", "Iter=500 \t loss=-7.2773\n", "Iter=1000 \t loss=-7.7294\n", "Iter=1500 \t loss=-8.0810\n", "Iter=2000 \t loss=-8.3676\n", "Iter=2500 \t loss=-8.6448\n", "Iter=3000 \t loss=-8.9190\n", "Iter=3500 \t loss=-9.2010\n", "Iter=4000 \t loss=-9.4967\n", "Iter=4500 \t loss=-9.8067\n" ] } ], "source": [ "for i in range(num_training_iters):\n", " loss, model, opt_state = make_step(model, opt_state)\n", " loss = loss.item()\n", " if i % 500 == 0:\n", " print(f\"Iter={i} \\t loss={loss:.4f}\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Helper function to refine path\n", "The following two functions taken from [this file](https://github.com/patrick-kidger/Deep-Signature-Transforms/blob/master/src/signature_inversion.py)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def _get_tree_reduced_steps(X, order=4, steps=4, tol=0.1):\n", " if len(X) < steps:\n", " return X\n", "\n", " dim = X.shape[1]\n", "\n", " # slide over a window size = `steps``\n", " for i in range(steps - 1, len(X)):\n", " # no redudancy in path -> compute its signature\n", " new_path = X[i - steps + 1 : i + 1] # noqa: E203\n", " new_path_sig = signature(new_path, order)\n", "\n", " # reduce the path with the first and the last\n", " new_path2 = jnp.r_[\n", " X[i - steps + 1].reshape(-1, dim),\n", " X[i].reshape(-1, dim),\n", " ]\n", " new_path2_sig = signature(new_path2, order)\n", "\n", " # compute the difference between two signatures\n", " norm = jnp.linalg.norm(new_path_sig - new_path2_sig)\n", " if norm < tol:\n", " # if it is reducible, the perform the same procedure on the\n", " # next sub path\n", " return _get_tree_reduced_steps(np.r_[X[: i - steps + 2], X[i:]])\n", "\n", " return X\n", "\n", "\n", "def get_tree_reduced(X, order=4, tol=0.1):\n", " \"\"\"Removes tree-like pieces of the path.\"\"\"\n", " X = jnp.r_[X, [X[-1]]]\n", "\n", " for step in range(3, len(X) + 1):\n", " X = _get_tree_reduced_steps(X, order, step, tol)\n", "\n", " if (X[-1] == X[-2]).all():\n", " return X[:-1]\n", "\n", " return X" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Plot result" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-1.111672592163086, 1.113952350616455, -1.1, 1.1)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "generated_path = model.generate_path(x)\n", "generated_path += path[0] - generated_path[0]\n", "generated_path = get_tree_reduced(generated_path, tol=1e-2)\n", "\n", "plt.plot(\n", " *path.T,\n", " label=\"Original path\",\n", " linewidth=10,\n", " linestyle=\"-\",\n", ")\n", "plt.plot(\n", " *generated_path.T,\n", " label=\"Generated path\",\n", " linewidth=10,\n", " linestyle=\"--\",\n", ")\n", "plt.axis(\"off\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.7 ('base')", "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.9.7" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "f7d1fba74dfd24f4e28e69f7ae18d3d17d4ecc25efd86b65572743c77fabf4a5" } } }, "nbformat": 4, "nbformat_minor": 2 }