Skip to content

Instantly share code, notes, and snippets.

@ragulpr
Last active November 1, 2018 06:22
Show Gist options
  • Save ragulpr/1f88aee9fcc585600280ba2d6f323368 to your computer and use it in GitHub Desktop.
Save ragulpr/1f88aee9fcc585600280ba2d6f323368 to your computer and use it in GitHub Desktop.
(Most) Minimal example testing different implementations of torch.nn.gumbel_softmax for pull #13339
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Problem: learn to make `logits` into a hard assignment using gumbel softmax trick"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0.0a0+e475d3e\n"
]
}
],
"source": [
"%matplotlib inline\n",
"import torch\n",
"from torch import nn\n",
"import matplotlib.pyplot as plt\n",
"print(torch.__version__)\n",
"\n",
"def run_gumbel(fun,hard,title):\n",
" torch.manual_seed(1)\n",
"\n",
" n_features = 3\n",
" n = 1000\n",
"\n",
" losses = []\n",
" logits_estimated = nn.Parameter(torch.randn(n,n_features))\n",
" y_actual_onehot = torch.zeros(n,n_features)\n",
" y_actual_onehot[:,0] = 1\n",
"\n",
" optimiser = torch.optim.Adam([logits_estimated], lr = 1e-1) \n",
" mse = nn.MSELoss()\n",
"\n",
" for epoch in range(100):\n",
" optimiser.zero_grad()\n",
" y_estimated = fun(logits_estimated,tau=1,hard=hard)\n",
" loss = mse(y_estimated,y_actual_onehot)\n",
" loss.backward()\n",
" optimiser.step()\n",
"\n",
" losses.append(loss.data.numpy()) \n",
"\n",
" plt.plot(losses,label=title)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd4FFX3wPHv3U2vBBIgECShhxRCSAg1gNIVFAWVomBBFMtreX1BVESwi72jgogoKoqgoPQWakLvNQFCTSEhveze3x+R/SUQkgBZNpDzeZ48sDt37pyZlLN35s4ZpbVGCCGEADDYOgAhhBBVhyQFIYQQFpIUhBBCWEhSEEIIYSFJQQghhIUkBSGEEBaSFIQQQlhIUhBCCGEhSUEIIYSFna0DuFze3t7a39/f1mEIIcR1ZdOmTclaa5/y2l13ScHf35+4uDhbhyGEENcVpdSRirST00dCCCEsJCkIIYSwkKQghBDC4rq7piCqn4KCAhITE8nNzbV1KEJUeU5OTvj5+WFvb39F60tSEFVeYmIi7u7u+Pv7o5SydThCVFlaa1JSUkhMTCQgIOCK+pDTR6LKy83NpVatWpIQhCiHUopatWpd1ahakoK4LkhCEKJirvZ3pdokhZ3H03n7n73I40eFEOLSqk1S2Hz0LF+sOMS6Qym2DkUIq5owYQKTJ0++6P0vv/yS77//vlK20bVrV5vdRPrdd99x4sSJy2738MMPs3v37kqJ4Y8//mDixIkAjBgxgtmzZ1dKv1AU9xNPPAHAp59+yrRp0yqt74qoNknh7ogG1PVw4sMlB2S0IKzCZDLZOoQyPfroo9x///22DuOqXWlS+Oabb2jZsmWlxPDOO+8wevToq+5Ha43ZbL7k8gcffJCPP/74qrdzOapNUnCyN/JY18ZsTEhl3WEZLYiKS0hIoEWLFgwfPpzQ0FAGDhxIdnY2UFR2ZeLEiXTq1Ilff/2VrVu30q5dO0JDQxkwYABnz54Fij5ZP/3003To0IHg4GA2btwIQGpqKnfccQehoaG0a9eO7du3A7By5UrCwsIICwujdevWZGRkAPDuu+8SGRlJaGgor7zyiiXG119/nebNm9O9e3f27dtX6n4UH0F07dqVZ555hujoaAIDA4mNjeXOO++kadOmvPTSS+Xud3GLFi2iffv2hIeHM2jQIDIzMy3HZty4cbRv356IiAg2b95Mr169aNy4MV9++aVl/dL2KSEhgcDAQEaOHElQUBA9e/YkJyeH2bNnExcXx9ChQwkLCyMnJ4eJEycSGRlJcHAwjzzyCFrrUtsVH9389NNPhISEEBwczJgxYyyxuLm58eKLL9KqVSvatWvH6dOnL9rf/fv34+joiLe3t+W9VatW0aFDBxo1amQZNWRmZnLLLbcQHh5OSEgIc+fOLbFvo0ePJjw8nGPHjjFt2jSaNWtGly5dWLNmjaVfFxcX/P39LT8v14TW+rr6atOmjb5SOfmFuu3ri/WgL9dqs9l8xf2Ia2v37t2W/0+Yt1Pf/eXaSv2aMG9nmduPj4/XgI6JidFaa/3AAw/od999V2utdcOGDfXbb79taRsSEqJXrFihtdb65Zdf1v/5z3+01lp36dJFP/zww1prrVeuXKmDgoK01lo/8cQTesKECVprrZcuXapbtWqltdb6tttus2wvIyNDFxQU6IULF+qRI0dqs9msTSaTvvXWW/XKlSt1XFycDg4O1llZWTo9PV03btzYEl9xr7zyiuX9Ll266P/9739aa60//PBD7evrq0+cOKFzc3N1/fr1dXJycpn73aVLFx0bG6uTkpJ0586ddWZmptZa67feeku/+uqrlmPz+eefa621fvrpp3VISIg+d+6cPnPmjPbx8dFa60vuU3x8vDYajXrLli1aa60HDRqkZ8yYUWLb56WkpFj+P2zYMD1v3rxS251/ffz4cd2gQQN95swZXVBQoLt166bnzJmjtdYasKz//PPP60mTJl10HKdOnaqfffZZy+vhw4frgQMHapPJpHft2qUbN26stda6oKBAp6ena621TkpK0o0bN9Zms1nHx8drpZRet26d1lrrEydOWOLJy8vTHTp00I8//ril/9dee01Pnjz5ojjKUvx35jwgTlfgb2y1GSlA0WhhdNcmbIyX0YK4PA0aNKBjx44ADBs2jJiYGMuye+65B4D09HTS0tLo0qULAMOHD2fVqlWWdoMHDwYgOjqac+fOkZaWRkxMDPfddx8AN998MykpKaSnp9OxY0eeffZZPv74Y9LS0rCzs2PRokUsWrSI1q1bEx4ezt69ezlw4ACrV69mwIABuLi44OHhQf/+/Su0T+fbhYSEEBQUhK+vL46OjjRq1Ihjx46Vu98A69evZ/fu3XTs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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def gumbel_softmax_proposed(logits, tau=1, hard=False, eps=1e-10, dim = -1):\n",
" if eps != 1e-10:\n",
" warnings.warn(\"`eps` parameter is deprecated.\", DeprecationWarning)\n",
"\n",
" y_soft = logits.new(logits.shape)\n",
" y_soft = (logits - y_soft.exponential_().log()) / tau # Gumbel noise\n",
" y_soft = y_soft.softmax(dim) # Gumbel softmax noise\n",
" \n",
" if hard:\n",
" # Straight through.\n",
" index = y_soft.max(dim, keepdim=True)[1]\n",
" y_hard = logits.new_zeros(logits.shape).scatter_(dim, index, 1.0)\n",
" return y_hard - y_soft.detach() + y_soft\n",
" else:\n",
" # Reparametrization trick.\n",
" return y_soft\n",
"\n",
"def gumbel_softmax_relaxedonehot(logits, tau=1, hard=False, eps=1e-10):\n",
" if eps != 1e-10:\n",
" warnings.warn(\"`eps` parameter is deprecated.\", DeprecationWarning)\n",
"\n",
" dist = torch.distributions.RelaxedOneHotCategorical(\n",
" temperature=tau, logits=logits, validate_args=False)\n",
" y_soft = dist.rsample()\n",
" \n",
" if hard:\n",
" # Straight through.\n",
" _, index = y_soft.max(-1, keepdim=True)\n",
" y_hard = logits.new_zeros(*logits.shape).scatter_(-1, index, 1.0)\n",
" return y_hard - y_soft.detach() + y_soft\n",
" else:\n",
" # Reparametrization trick.\n",
" return y_soft\n",
"\n",
"# run_gumbel(gumbel_softmax_proposed,hard=True, title='proposed implementation (hard)')\n",
"run_gumbel(gumbel_softmax_proposed,hard=False,title='proposed implementation (soft)')\n",
"# run_gumbel(gumbel_softmax_relaxedonehot,hard=True, title='RelaxedOneHotCategorical (hard)')\n",
"run_gumbel(gumbel_softmax_relaxedonehot,hard=False,title='RelaxedOneHotCategorical (soft)')\n",
"# run_gumbel(torch.nn.functional.gumbel_softmax, hard=True,title='old implementation (hard)')\n",
"run_gumbel(torch.nn.functional.gumbel_softmax, hard=False,title='old implementation (soft)')\n",
"\n",
"plt.ylabel('loss')\n",
"plt.xlabel('training step') \n",
"plt.legend()\n",
"plt.show()\n",
"\n",
"run_gumbel(gumbel_softmax_proposed,hard=True, title='proposed implementation (hard)')\n",
"# run_gumbel(gumbel_softmax_proposed,hard=False,title='proposed implementation (soft)')\n",
"run_gumbel(gumbel_softmax_relaxedonehot,hard=True, title='RelaxedOneHotCategorical (hard)')\n",
"# run_gumbel(gumbel_softmax_relaxedonehot,hard=False,title='RelaxedOneHotCategorical (soft)')\n",
"run_gumbel(torch.nn.functional.gumbel_softmax, hard=True,title='old implementation (hard)')\n",
"# run_gumbel(torch.nn.functional.gumbel_softmax, hard=False,title='old implementation (soft)')\n",
"\n",
"plt.ylabel('loss')\n",
"plt.xlabel('training step') \n",
"plt.legend()\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Calibration:\n",
"logits = torch.ones(1000000,3).cumsum(-1)/5-1\n",
"tau = 5\n",
"y_soft = gumbel_softmax_proposed(logits,tau=3)\n",
"y_soft2 = gumbel_softmax_relaxedonehot(logits,tau=3)\n",
"a = y_soft.data.numpy().flatten()\n",
"b = y_soft2.data.numpy().flatten()\n",
"a.sort()\n",
"b.sort()\n",
"plt.hist(a)\n",
"plt.hist(b)\n",
"plt.xlim(0,1)\n",
"plt.show()\n",
"\n",
"plt.plot([0,1],[0,1],color='b',ls=':',label='sought')\n",
"plt.plot(a,b,label='actual')\n",
"plt.title('Calibration')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Timings \n",
"def time_run(fun):\n",
" torch.manual_seed(1)\n",
"\n",
" n_features = 10\n",
" n_batch = 100\n",
"\n",
" logits = torch.randn(n_batch,n_features)\n",
" z = 0\n",
" for epoch in range(100000):\n",
" y_estimated = fun(logits,hard=True)\n",
" z = z+y_estimated[0,0]\n",
" return z"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"11.7 s ± 349 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"time_run(gumbel_softmax_proposed)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"24.2 s ± 930 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"time_run(gumbel_softmax_relaxedonehot)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"15.7 s ± 1.1 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
"source": [
"%%timeit\n",
"time_run(torch.nn.functional.gumbel_softmax)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "pytorch-source",
"language": "python",
"name": "pytorch-source"
},
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment