{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "-_L4OiekjBRp" }, "source": [ "# Sinkhorn Divergence Hessians" ] }, { "cell_type": "markdown", "metadata": { "id": "jzzs0FmbPpvY" }, "source": [ "## Samples two point clouds, computes their Sinkhorn divergence\n", "\n", "We show in colab how OTT and JAX can be used to compute automatically the Hessian of the {func}`~ott.tools.sinkhorn_divergence.sinkhorn_divergence` w.r.t. the input variables, such as weights ``a`` or locations ``x``." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import sys\n", "\n", "if \"google.colab\" in sys.modules:\n", " !pip install -q git+https://github.com/ott-jax/ott@main" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "from ott.geometry import pointcloud\n", "from ott.solvers.linear import implicit_differentiation as implicit_lib\n", "from ott.tools import sinkhorn_divergence" ] }, { "cell_type": "markdown", "metadata": { "id": "1mTq29HkSFnU" }, "source": [ "Sample two random point clouds of dimension `dim`" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "0jfa6mSiWAw6" }, "outputs": [], "source": [ "def sample(n, m, dim):\n", " rngs = jax.random.split(jax.random.PRNGKey(0), 6)\n", " x = jax.random.uniform(rngs[0], (n, dim))\n", " y = jax.random.uniform(rngs[1], (m, dim))\n", " a = jax.random.uniform(rngs[2], (n,)) + 0.1\n", " b = jax.random.uniform(rngs[3], (m,)) + 0.1\n", " a = a / jnp.sum(a)\n", " b = b / jnp.sum(b)\n", " return a, x, b, y" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "79peUzQOVqcJ" }, "outputs": [], "source": [ "a, x, b, y = sample(15, 17, 3)" ] }, { "cell_type": "markdown", "metadata": { "id": "kOtW4xTTSJhg" }, "source": [ "As usual in JAX, we define a custom loss that outputs the quantity of interest, and is defined using relevant inputs as arguments, i.e. parameters against which we may want to differentiate. We add to `a` and `x` the ``implicit`` auxiliary flag which will be used to switch between unrolling and implicit differentiation of the {class}`~ott.solvers.linear.sinkhorn.Sinkhorn` algorithm (see this excellent [tutorial](http://implicit-layers-tutorial.org/implicit_functions/) for a deep dive on their differences).\n", "\n", "The loss outputs the Sinkhorn divergence between two point clouds." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "38KEITACSR1D" }, "outputs": [], "source": [ "def loss(a, x, implicit):\n", " return sinkhorn_divergence.sinkhorn_divergence(\n", " pointcloud.PointCloud,\n", " x,\n", " y, # this part defines geometry\n", " a=a,\n", " b=b, # this sets weights\n", " sinkhorn_kwargs={\n", " \"implicit_diff\": implicit_lib.ImplicitDiff(\n", " precondition_fun=lambda x: x\n", " ),\n", " \"use_danskin\": False,\n", " }, # to be used by the Sinkhorn algorithm\n", " ).divergence" ] }, { "cell_type": "markdown", "metadata": { "id": "tnrx9dMnVDxD" }, "source": [ "Let's parse the three lines in the call to {func}`~ott.tools.sinkhorn_divergence.sinkhorn_divergence` above:\n", "\n", "- The first one defines the point cloud geometry between `x` and `y` that will define the cost matrix. Here we could have added details on `epsilon` regularization (or scheduler), as well as alternative definitions of the cost function (here assumed by default to be squared Euclidean distance). We stick to the default setting.\n", "\n", "- The second one sets the respective weight vectors `a` and `b`. Those are simply two histograms of size ``n`` and `m`, both sum to 1, in the so-called balanced setting.\n", "\n", "- The third one passes on arguments to the three {class}`~ott.solvers.linear.sinkhorn.Sinkhorn` solvers that will be called, to compare ``x`` with `y`, `x` with `x` and `y` with `y` with their respective weights `a` and `b`. Rather than focusing on the several numerical options available to parameterize {class}`~ott.solvers.linear.sinkhorn.Sinkhorn`'s behavior, we instruct JAX on how it should differentiate the outputs of the sinkhorn algorithm. The `use_danskin` flag specifies whether the outputted potentials should be freezed when differentiating. Since we aim for 2nd order differentiation here, we must set this to ``False`` (if we wanted to compute gradients, ``True`` would have resulted in faster yet almost equivalent computations)." ] }, { "cell_type": "markdown", "metadata": { "id": "hjIAe7ducbaH" }, "source": [ "## Computing Hessians" ] }, { "cell_type": "markdown", "metadata": { "id": "StMRwYUJVuOY" }, "source": [ "Let's now plot Hessians of this output w.r.t. either `a` or `x`. \n", "\n", "- The Hessian w.r.t. `a` will be a $n \\times n$ matrix, with the convention that `a` has size $n$. \n", "- Because `x` is itself a matrix of 3D coordinates, the Hessian w.r.t. `x` will be a 4D tensor of size $n \\times 3 \\times n \\times 3$.\n", "\n", "To plot both Hessians, we loop on arg 0 or 1 of `loss`, and plot all (or part for `x`) of those Hessians, to check they match:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 939 }, "id": "JRBYQmh9WzLY", "outputId": "a8c38778-3887-4931-dd04-1e7915403c94" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--- Time: Implicit Hessian w.r.t. a\n", "11.2 ms ± 24.1 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "--- Time: Unrolled Hessian w.r.t. a\n", "11.2 ms ± 13.5 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "--- Time: Implicit Hessian w.r.t. x\n", "35.2 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n", "--- Time: Unrolled Hessian w.r.t. x\n", "35.2 ms ± 289 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] }, { "data": { "image/png": "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s88+07/+9a/Ae1GZvw8qkp2drVatWum6665TTEyM/vrXv+qXv/yl/H6/Ro8eHfTcnTt36qc//aluv/12jRgxQi+++KJGjhypTp06BfK7Ij179tSf/vSnwOPDhw/rk08+UVRUlNavX6+2bdtKKs3+Bg0anDWnK/p++aEGDRooOztbd999t2688cbAoLzsNex46qmndN1112nYsGEqLi7WK6+8optuuklvvPGGBg0aZLsezo+xWW8hYs2fP9+SZG3atCmwb8SIEZYka8aMGYF93377rRUfH295PB7rlVdeCezftm2bJcmaOnVquZqdOnWyiouLA/ufeOIJS5L1+uuvB/b17t3b6t27d+Dxrl27LEnW/PnzA/t69eplJSYmWnv27Anq3e/3l3vNXbt2Bfa1atUqqPa5SDrn9sP3qV+/flabNm2sEydOBPXUrVs3q3nz5oF97dq1swYNGnTG1/32228tSdZvfvObs/Z3+ntVUlJiFRUVlauVmppq3XbbbYF9Ze9p/fr1rcOHDwf2v/7665Yk669//etZX3f06NFWampq4PGECROsXr16WSkpKVZ2drZlWZZ16NAhy+PxWE899dQZ60iyoqKirE8++eSsr7dkyRJLkrV69eqzPu9sTpw4Yfl8vqB9u3btsrxer/Xwww9XuS7OX35+viXJWv7hJdaqXZc6ui3/8BJLkpWfnx/qLxMIqalTp1qSrG+++abCj5+ej6tXr7YkWZdffnlQrjz11FOWJOujjz4K7Ovdu7clyZo7d25QzVmzZlmSrJdeeimwr7i42OratatVp04dq6CgILD/TH83lGX40aNHrbp161p33HFH0Gvs37/fSk5ODtrfvn17q2HDhtaRI0cC+95++21LktWkSZMzv0mnfT1n236Yz4888oiVkJBgff7550F1Jk6caEVHR1t79+61LMuy7rnnHispKckqKSk542uf6+8Dyzr1b/lDx48fL/e8AQMGWBdffHHQviZNmliSrHXr1gX25eXlWV6v17rvvvvO+rplWfzpp59almVZy5cvt7xer3XddddZN998c+B5bdu2tW688cYz1jnT98vpvvnmm3LfF1Vx+ntTXFxstW7d2rrqqqvOqy7sMT3rOa26hvrFL34R+P+6deuqRYsWSkhI0JAhQwL7W7Roobp16+rLL78s9/l33nln0Izk3XffrZiYGP3973+vdA/ffPON1q1bp9tuu02NGzcO+pgbtza4/vrrtXLlynLbAw88EPS8w4cP65///KeGDBmio0eP6uDBgzp48KAOHTqkAQMGaMeOHdq3b5+k0vfuk08+0Y4dOyp8zfj4eMXGxmrNmjXnPO38h6KjowPXIfv9fh0+fFglJSXq3LmzcnJyyj3/5ptv1gUXXBB4XDbLW9G/3Q/17NlTBw4c0Pbt2yWVHiXu1auXevbsqfXr10sqnU22LOucM8e9e/dWy5YtK/01VpXX61VUVOmvJp/Pp0OHDqlOnTpq0aJFhe8Nqp+pi3QA4WzUqFFB61ucKSe8Xq9GjRoVtO/vf/+70tLSNHTo0MC+WrVqady4cSosLNTatWsr3cfKlSt15MgRDR06NJCvBw8eVHR0tLp06RK4fOjrr7/W1q1bNWLECCUnJwc+/+qrr7aVNU2bNq0w+1966aVyz12yZIl69uypCy64IKi3/v37y+fzad26dZJKs//YsWNBp0if7lx/H5xJfHx84P/z8/N18OBB9e7dW19++aXy8/ODntuyZcugbG7QoIFatGhRqeyXFPh61q9fryuuuEJXX311IPuPHDmijz/++JzZX9H3i1t++N58++23ys/PV8+ePcn+EDE16zmtugaKi4sLXP9RJjk5WY0aNSo3KE1OTq5wUNe8efOgx3Xq1FHDhg1trUJc9sv7TLdZcFqjRo3Uv3//cvv/85//BD3euXOnLMvS5MmTNXny5Apr5eXl6aKLLtLDDz+s66+/Xpdeeqlat26tH/3oRxo+fHjgdCGv16uZM2fqvvvuU2pqqv7rv/5L1157rW699dazXsMrSQsXLtTvfvc7bdu2TSdPngzsP/0Ud0nlDi6UDZTPNSAvC73169erUaNG+uCDD/Too4+qQYMGgdtbrF+/XklJSWrXrt1Za1XUlxv8fr+eeuopPfvss9q1a5d8Pl/gY/Xr16+WHgAgnFV0gLmyOXHRRReVWyRyz549at68eeDAZJmy02337NlT6d7KBotXXXVVhR9PSkoKqnn63xuSbB0MTUhIqDD7K/p7ZceOHfrwww/L/Y1UJi8vT5L0y1/+Uq+++qoGDhyoiy66SNdcc42GDBmiH/3oR4HnnuvvgzP517/+palTp+rdd9/V8ePHgz6Wn58fdKDg9H9TqfTf9VzZn5qaqubNm2v9+vW66667tH79evXt21e9evXS2LFj9eWXX+qzzz6T3+8/5+C4ou8Xt7zxxht69NFHtXXrVhUVFQX2c69oVCcGxzXQmVZ+PtN+6wcLM5mgbNGN+++/XwMGDKjwOc2aNZNUeh3tF198oddff11vv/22fv/73+v//u//NHfu3MDs/Pjx4zV48GAtW7ZMK1as0OTJk5WVlaV//vOf6tChQ4X1X3rpJY0cOVI33HCDHnjgAaWkpCg6OlpZWVn64osvyj2/qv926enpyszM1Lp169S0aVNZlqWuXbuqQYMGuueee7Rnzx6tX79e3bp1K/dH0el+eETXTTNmzNDkyZN122236ZFHHlG9evUUFRWl8ePHl1swBaFRuoKls3+sOF0PiFRldwE40y2Ajh8/XuGdAiqbE27/Li/7Pf3HP/6xwoPEoVy92e/36+qrr9b//u//VvjxSy+9VJKUkpKirVu3asWKFXrzzTf15ptvav78+br11lsDi5RV5u+D033xxRfq16+fLrvsMj355JPKyMhQbGys/v73v+v//u//ymXc+fzd1qNHD61atUrfffedtmzZoilTpqh169aqW7eu1q9fr88++0x16tQ5498pZaor+9evX6/rrrtOvXr10rPPPquGDRuqVq1amj9/frnFY1E9TM16Bseo0I4dO9S3b9/A48LCQn399df67//+70rXuPjiiyVJH3/8se3Xd/MoYVlftWrVqvBo8+nq1aunUaNGadSoUSosLFSvXr00bdq0oPC75JJLdN999+m+++7Tjh071L59e/3ud7+r8LQuSXrttdd08cUX6y9/+UvQ1zp16tTz/OrK69mzp9atW6fMzEy1b99eiYmJateunZKTk/XWW28pJydH06dPd+S1nPh3e+2119S3b1+98MILQfuPHDmiCy+88Lzro2aYNm1aue/bFi1aaNu2bSHqCHBGkyZNJEnbt29XRkZG0MeOHz+u3NxcXXPNNY6/5ocffii/3x90oLTs56msp8q45JJLJJUOMM+WsWU1KzotuexSIKddcsklKiwsrFT2x8bGavDgwRo8eLD8fr9++ctfat68eZo8eXLgAHpl/j74ob/+9a8qKirS8uXLg2aFT79ThRN69uyp+fPn65VXXpHP5wscBO/Ro0dgcNytWzdHbqXpRPb/+c9/VlxcnFasWCGv1xvYP3/+/POujcgViqwP/xO/ERLPPfdc0Km+2dnZKikp0cCBAytdo0GDBurVq5defPFF7d27N+hj5zrqmZCQoCNHjtjqubJSUlLUp08fzZs3T19//XW5j3/zzTeB/z906FDQx+rUqaNmzZoFTvc5fvy4Tpw4EfScSy65RImJiUGnBJ2uLIx++D689957evfdd+1/QefQs2dP7d69W4sXLw6cPhUVFaVu3brpySef1MmTJ4NOq9q2bVu5f6+K5Ofna9u2bUHXSCUkJEhShf92X3/9dblTyCsSHR1d7vtjyZIlgevAEXp+Rcnn8FaVeym2atVKX3/9dWDbsGGDC18tUL369eun2NhYZWdnl5tJfO6552xncWX893//t/bv36/FixcH9pWUlOiZZ55RnTp11Lt370rXGjBggJKSkjRjxowKf9+XZWzDhg3Vvn17LVy4MChHVq5cqU8//fQ8vpozGzJkiN59912tWLGi3MeOHDmikpISSeWzPyoqKnC6dFm2n+vvg4pUlP35+fmuDADLcn3mzJlq27Zt4HTtnj17atWqVdq8eXNQ9u/du7dSA46TJ09q27ZtQX8/ld33uKLsr+hvhYpER0fL4/EEXUq1e/duLVu27Jw9wR2mZj0zx6hQcXGx+vXrpyFDhmj79u169tln1aNHD1133XW26jz99NPq0aOHOnbsqDvvvFOZmZnavXu3/va3v2nr1q1n/LxOnTopOztbjz76qJo1a6aUlJQzXr9UFXPmzFGPHj3Upk0b3XHHHbr44ot14MABvfvuu/rPf/4TuKduy5Yt1adPH3Xq1En16tXT5s2b9dprr2nMmDGSpM8//zzwPrVs2VIxMTFaunSpDhw4oFtuueWMr3/ttdfqL3/5i2688UYNGjRIu3bt0ty5c9WyZcsKbz11PsrCb/v27ZoxY0Zgf69evfTmm28G7ptc5vLLL1fv3r3PeX/ipUuXatSoUZo/f75GjhwpSWrfvr2io6M1c+ZM5efny+v1Bu7nOGnSJC1cuFC7du064y2upNL35uGHH9aoUaPUrVs3ffTRR3r55ZcDM/4IPTcW1fBV4fKOmJiYc17bD0SalJQUTZkyRQ899JB69eql6667TrVr19Y777yjP/3pT7rmmms0ePBgR1/zzjvv1Lx58zRy5Eht2bJFTZs21WuvvaZ//etfmjVrlhITEytdKykpSdnZ2Ro+fLg6duyoW265RQ0aNNDevXv1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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzEAAAIQCAYAAACxEeCnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABmgElEQVR4nO3deVxUZf//8fcMCBiy5AKIkqhZai4YKmGuSZGZZdmd+vNOJdMWsYzu7rTb1O4WstUW01b1rkyzxcrKMkzNJE3MuzQ1K1NTwS3BJdnm/P7wy9yODLI4c2bh9Xw8zqM4c+aca4Zx3lznc53rWAzDMAQAAAAAPsLq6QYAAAAAQHXQiQEAAADgU+jEAAAAAPApdGIAAAAA+BQ6MQAAAAB8Cp0YAAAAAD6FTgwAAAAAn0InBgAAAIBPoRMDAAAAwKf4VCemd+/e6t27t/3n33//XRaLRXPmzKnWfubMmSOLxaLff//dpe3zJqe/V3CvtWvXKigoSDt27PB0U6osPj5eI0eOtP+8fPlyWSwWLV++3C3HW7JkierVq6f9+/e7Zf8A/JPFYtHUqVPtP7sjw0eOHKn4+HiX7c9Tpk6dKovF4ulm1BpHjx5VVFSU3nrrLU83pcqcfdZP/zfmSgcPHlRoaKg+/fRTl++7Wp2Ysi+OdevWubwhnvbiiy9WqzNksViUnp7u9DF/fp+8zU8//aSpU6d6vEP6r3/9S0OHDlWzZs3s69auXas77rhDiYmJqlOnzlkFy+rVqzV16lQdPnzYBa31jCuvvFLnn3++MjMzPd0UAKco+8P3wIEDTh9v164dJ8X+T+/evdWuXTunj5WdWH3yySdNblXtc/z4cU2dOtVtJ92q6tlnn1VYWJiGDBliX7d3715NmDBBffr0UVhY2FmdHNyzZ4+mTp2qDRs2uKbBHtCgQQPdcssteuCBB1y+b5+qxJyuWbNm+uuvv3TTTTdV63k33XST/vrrL4c/OKvbifF2X3zxhb744gtPN8PtfvrpJz344IMe7cRs2LBBX375pW677TaH9Z9++qleffVVWSwWtWjR4qyOsXr1aj344INu7cT07NlTf/31l3r27Om2Y9x666166aWXdOTIEbcdAwBqq0mTJumvv/7ydDPc7vjx43rwwQc92okpLi7Ws88+q1tuuUUBAQH29Vu3btW0adO0e/dutW/f/qyOsWfPHj344INu78T89ddfmjRpktv2f9ttt2n9+vVatmyZS/fr050Yi8WikJAQhw9PVQQEBCgkJMSvS65BQUEKCgrydDNcxmaz6cSJE55uhlOzZ8/Weeedp0suucRh/e233678/HytW7dOl19+uYdaV3VWq1UhISGyWt33tTBo0CAVFhZq4cKFbjsGAO92/PhxTzfBbwUGBiokJMTTzXApb/28LF68WPv379eNN97osD4xMVEHDx7Uzz//rIyMDA+1rnpCQkIUGBjotv23adNG7dq1c3mx4Kz/Whk5cqTq1aunnTt36uqrr1a9evXUpEkTzZgxQ5L0448/6rLLLlNoaKiaNWumefPmOTy/bOjVypUrdeutt6pBgwYKDw/X8OHD9eeff57x2BVdE7NlyxbdeOONatSokerWrasLL7xQ//rXv8ods+zsfXx8vDZt2qQVK1bIYrHIYrG4pXS+ZcsW3XDDDapfv75CQkLUuXNnffTRRw7bFBcX68EHH1SrVq0UEhKiBg0aqHv37lq6dKl9m9zcXKWlpalp06YKDg5W48aNde211zpUI06/JqaoqEiTJ09WYmKiIiIiFBoaqh49euirr75yOP6p5fCXX35ZLVu2VHBwsLp06aLvvvvujK/v8OHDCggI0HPPPWdfd+DAAVmtVjVo0ECGYdjX33777YqJialwX2XD9d566y1ddNFFCg4O1pIlSxy2mTNnjv72t79Jkvr06WP/3VXnzIxhGOrTp48aNWqkffv22dcXFRWpffv2atmypY4dO3bGfSxatEiXXXZZuU5xdHS06tatW6V2PP/887rooot0zjnn6Nxzz1Xnzp3t/1amTp2qe++9V5LUvHlz++s8U/Vp27ZtGjRokGJiYhQSEqKmTZtqyJAhys/Pr/A5FV0Ts2bNGl111VU699xzFRoaqg4dOujZZ5912KYqn21JioqKUocOHfThhx9W6X0B4H3KviveeecdPfLII2ratKlCQkLUt29f/fLLLw7blg2/ysnJUc+ePXXOOefo/vvvlyTt27dPo0aNUnR0tEJCQtSxY0fNnTu3xu367LPP1KNHD4WGhiosLEz9+/fXpk2bym23aNEitWvXTiEhIWrXrp0++OCDGh+zKg4fPqzx48crLi5OwcHBOv/88zVt2jTZbDaH7ebPn6/ExESFhYUpPDxc7du3d/iurcrfB86uiZk9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1pIlS/Tee+/pxRdf1OTJk/Xggw/WaJ9PPfWURo4caf8c3XnnncrMzNS3335brbHflanOZ7tM2XtVdm0PAM8qm82qoql5jx8/7nTGq6rmhLu/y8u+h9544w2nE8a4c9alythsNl1++eX65z//6fTxCy64QNLJSU82bNigzz//XJ999pk+++wzzZ49W8OHD7dPdlCVvw9O9+uvv6pv375q3bq1nn76acXFxSkoKEiffvqpnnnmmXJ/MJ/N323du3dXVlaW/vrrL+Xk5Gjy5Mlq166dIiMj9fXXX2vz5s2qV69ehX+nlDE7+3/77Td7R/jHH3+s0nPq168vi8VyVtlft25drVy5Ul999ZU++eQTLVmyRAsWLNBll12mL774otoz70rSjTfeqB49euiDDz7QF198oSeeeELTpk3T+++/r379+tW4rc5U9bNdxh3Z77l/2afZtm2b+vTpY//56NGj2rt3r6666qoq76PsXhwbN26s9vHdeVa4rF116tSx91DPpH79+kpLS1NaWpqOHj2qnj17aurUqQ5fUi1bttQ999yje+65R9u2bVNCQoKeeuopp+VsSXr33XfVokULvf/++w6vtexsuSv16NFDK1euVPPmzZWQkKCwsDB17NhRERERWrJkidavX1/jP85P56rf2969ezVu3DhdccUVCgoKsv9Rfuq9hJxp3bq1JGn79u1ndfzQ0FANHjxYgwcPVlFRka6//no98sgjmjhxYo2nA2/fvr3at2+vSZMmafXq1br00ks1a9YsPfzww1V6ftmMKxs3bqzwc1vdz7Z08r1q2LBhhRMTADBX2ffc1q1bFRcX5/DY8ePHtWvXLl1xxRUuP+YPP/wgm83mcEJry5YtDm2qirLvqqioqDN+D5Xt09lwrLIh0K7WsmVLHT16tErfj0FBQRowYIAGDBggm82mO+64Qy+99JIeeOAB+8mgqvx9cKqPP/5YhYWF+uijjxyqLKfPTOoKPXr00OzZszV//nyVlpbaT1Z2797d3onp1q1bjf44P52rst9ms2nkyJEKDw/X+PHj9eijj+qGG24oN9Pa6QIDA9WyZcuzzn6r1aq+ffuqb9++evrpp/Xoo4/qX//6l7766iulpKTU6HU2btxYd9xxh+644w7t27dPF198sR555JEqd2IaNWqk8PDwSv+Wrs5nW/rf30nVmXypMl5zn5iXX35ZxcXF9p9nzpypkpKSavUcGzVqpJ49e+r111/Xzp07HR6r7CxCaGio224kGBUVpd69e+ull17S3r17yz2+f/9++/+XXWNRpl69ejr//PPtFYLjx4+Xu19Ky5YtFRYWZt/GmbIvjVPfhzVr1ig7O7v6L6gSPXr00O+//64FCxbYy8ZWq1XdunXT008/reLiYody8pYtW8r9vpzJz8/Xli1bHMrfZTOHOfvd7d27V1u2bHH4XFVk9OjRstlseu211/Tyyy8rMDBQo0aNqvRz06RJE8XFxWndunWVHqMip//Og4KC1LZtWxmGYW/7mV7n6QoKClRSUuKwrn379rJarWf8jJzu4osvVvPmzTV9+vRyxy17X6rz2S6Tk5NTpSoXAHP07dtXQUFBmjlzZrkz8y+//HK1s7gqrrrqKuXm5mrBggX2dSUlJXr++edVr1499erVq8r7Sk1NVXh4uB599FGn3/dl30ONGzdWQkKC5s6d65AjS5cu1U8//XQWr6ZiN954o7Kzs/X555+Xe+zw4cP27+rTc8Bqtdpn2yr73q7s7wNnnGV/fn6+Zs+eXYNXc2ZluT5t2jR16NDBft1Rjx49lJWVpXXr1jlk/86dO+2d1jMpLi7Wli1bHDLmnHPOkeQ8E539rVCRp59+WqtXr9bLL7+shx56SN26ddPtt99epes2kpOTzyr7Dx06VG5d2UyxZb/T6mR/aWlpudccFRWl2NjYamW/1WrVwIED9fHHHzt9fWWfpap+tsvk5OQoIiLijLPcVZfXVGKKiorUt29f3Xjjjdq6datefPFFde/eXddcc0219vPcc8+pe/fuuvjiizVmzBg1b95cv//+uz755JMz3vE0MTFRM2fO1MMPP6zzzz9fUVFRuuyyy87yVf3PjBkz1L17d7Vv316jR49WixYtlJeXp+zsbP3xxx/2+cjbtm2r3r17KzExUfXr19e6devs0+VJ0s8//2x/n9q2bavAwEB98MEHysvL05AhQyo8/tVXX633339f1113nfr376/t27dr1qxZatu2rdMpoc9G2ZfU1q1bHS6O79mzpz777DP7fWfKtGnTRr169ar0/i4ffPCB0tLSNHv2bI0cOVLSyX/wAQEBmjZtmvLz8xUcHGyfD3/ixImaO3eutm/fXuHU09LJOfQ/+eQTzZkzxz7U6vnnn9ff//53zZw5U3fccccZ23Xttdfqgw8+kGEYDmdNduzYoTfeeEOS7F8EZVWQZs2a6aabbpIkXXHFFYqJidGll16q6Ohobd68WS+88IL69++vsLAwSSc/n5L0r3/9S0OGDFGdOnU0YMAAp9M/L1u2TOnp6frb3/6mCy64QCUlJXrjjTcUEBCgQYMGnfG1nMpqtWrmzJkaMGCAEhISlJaWpsaNG2vLli3atGmT/Yurqp9t6eQY2R9++KHctJ4APCcqKkqTJ0/WpEmT1LNnT11zzTU655xztHr1ar399tu64oorNGDAAJcec8yYMXrppZc0cuRI5eTkKD4+Xu+++66++eYbTZ8+3f7dVxXh4eGaOXOmbrrpJl188cUaMmSIGjVqpJ07d+qTTz7RpZdeqhdeeEGSlJmZqf79+6t79+66+eabdejQIft9ulydhdLJ6y0++ugjXX311fapio8dO6Yff/xR7777rn7//Xc1bNhQt9xyiw4dOqTLLrtMTZs21Y4dO/T8888rISHBfua6sr8PnCkbXTBgwADdeuutOnr0qF555RVFRUU5PfF0Ns4//3zFxMRo69atGjdunH19z549dd9990mSQydm+PDhWrFiRaUnC3fv3q02bdpoxIgR9nuk1K1bV23bttWCBQt0wQUXqH79+mrXrp39vj+n/63gzObNm/XAAw9o5MiR9s/3nDlzlJCQoDvuuEPvvPPOGdt17bXX6o033tDPP/9cbuhUWdaX3afojTfe0KpVqySdnNpZOnmN08qVK9W/f381a9ZM+/bt04svvqimTZuqe/fukk6epI6MjNSsWbMUFham0NBQJSUlOb1m+MiRI2ratKluuOEGdezYUfXq1dOXX36p7777Tk899dQZX8vpHn30UX3xxRfq1auXxowZozZt2mjv3r1auHChVq1apcjIyCp/tsssXbpUAwYMcO3Ip+pMZVbRFMuhoaHltu3Vq5fTaWObNWvmMEVg2T5XrFhhjBkzxjj33HONevXqGcOGDTMOHjxYbp+VTbFsGIaxceNG47rrrjMiIyONkJAQ48ILLzQeeOCBcsc8dbra3Nxco3///kZYWJghqdLpliVVOI2ds/fJMAzj119/NYYPH27ExMQYderUMZo0aWJcffXVxrvvvmvf5uGHHza6du1qREZGGnXr1jVat25tPPLII/bppw8cOGCMHTvWaN26tREaGmpEREQYSUlJxjvvvHPG98pmsxmPPvqo0axZMyM4ONjo1KmTsXjx4nJT7ZW9p86mcFY1pjOMiooqN43uqlWrDElGjx49yu339Pfb2ftb9r6e/vt+5ZVXjBYtWhgBAQEOUxmWTf99pmmJd+3aZURERBgDBgwo99h1111nhIaGGr/99tsZX+v69esNScbXX3/tsL5sGlJny6mv96WXXjJ69uxpNGjQwAgODjZatmxp3HvvvUZ+fr7D/h566CGjSZMmhtVqPePr+u2334ybb77ZaNmypRESEmLUr1/f6NOnj/Hll186bFfZFMtlVq1aZVx++eVGWFiYERoaanTo0MF4/vnnHbapymfbMAxj5syZxjnnnOMwfSoA7/Dmm28al1xyiREaGmoEBwcbrVu3Nh588EGH6dMN43/fFadP4+4skyv6W8AwDCMvL89IS0szGjZsaAQFBRnt27d3OpXs6dnjLMPL2pWammpEREQYISEhRsuWLY2RI0ca69atc9juvffeM9q0aWMEBwcbbdu2Nd5//32n0846c6bXU1F+HjlyxJg4caJx/vnnG0FBQUbDhg2Nbt26GU8++aQ92999913jiiuuMKKiooygoCDjvPPOM2699VZj79699v1U9veBYTifYvmjjz4yOnToYISEhBjx8fHGtGnTjNdff73ce3j632envuaq3oLib3/7W7lpdIuKioxzzjnHCAoKMv766y+H/Z7eVmfvb9n7empeGcbJKXsTExONoKAgh89IRX8rnKqkpMTo0qWL0bRpU4fptg3jf1OFVzYVcGFhodGwYUPjoYceKvdYRdl/6uvNysoyrr32WiM2NtYICgoyYmNjjaFDh5absvjDDz802rZtawQGBp7xdRUWFhr33nuv0bFjR3ted+zY0XjxxRcdtqvKFMuGYRg7duwwhg8fbjRq1MgIDg42WrRoYYwdO9ZhWvWqfLYNwzA2b95sSCr3d8jZsvxf4z1mzpw5SktL03fffed0KjfAF/Tt21exsbH2yguc69Spk3r37q1nnnnG000BAOCsPPTQQ5o9e7a2bdvmkmt9/NX48eO1cuVK5eTkuLQS4zXXxAC+7NFHH9WCBQuqNS1obbNkyRJt27ZNEydO9HRTAAA4a3fffbeOHj2q+fPne7opXuvgwYN69dVX9fDDD7t8Ei2vuSYG8GVJSUkqKirydDO82pVXXumWMecA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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for arg in [0, 1]:\n", " # Compute Hessians using either unrolling or implicit differentiation.\n", " hess_loss_imp = jax.jit(\n", " jax.hessian(lambda a, x: loss(a, x, True), argnums=arg)\n", " )\n", " print(\"--- Time: Implicit Hessian w.r.t. \" + (\"a\" if arg == 0 else \"x\"))\n", " %timeit _ = hess_loss_imp(a, x).block_until_ready()\n", " hess_imp = hess_loss_imp(a, x)\n", "\n", " hess_loss_back = jax.jit(\n", " jax.hessian(lambda a, x: loss(a, x, False), argnums=arg)\n", " )\n", " print(\"--- Time: Unrolled Hessian w.r.t. \" + (\"a\" if arg == 0 else \"x\"))\n", " %timeit _ = hess_loss_back(a, x).block_until_ready()\n", " hess_back = hess_loss_back(a, x)\n", "\n", " # Since we are solving balanced OT problems, Hessians w.r.t. weights are\n", " # only defined up to the orthogonal space of 1s.\n", " # For that reason we remove that contribution and check the\n", " # resulting matrices are equal.\n", " if arg == 0:\n", " hess_imp -= jnp.mean(hess_imp, axis=1)[:, None]\n", " hess_back -= jnp.mean(hess_back, axis=1)[:, None]\n", " fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))\n", " im = ax1.imshow(hess_imp if arg == 0 else hess_imp[0, 0, :, :])\n", " ax1.set_title(\n", " \"Implicit Hessian w.r.t. \" + (\"a\" if arg == 0 else \"x (1st slice)\")\n", " )\n", " fig.colorbar(im, ax=ax1)\n", " im = ax2.imshow(hess_back if arg == 0 else hess_back[0, 0, :, :])\n", " ax2.set_title(\n", " \"Unrolled Hessian w.r.t. \" + (\"a\" if arg == 0 else \"x (1st slice)\")\n", " )\n", " fig.colorbar(im, ax=ax2)" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "Hessians.ipynb", "provenance": [] }, "kernelspec": { "display_name": "ott", "language": "python", "name": "ott" }, "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.10.6" } }, "nbformat": 4, "nbformat_minor": 1 }