Skip to content

Instantly share code, notes, and snippets.

@dfm
Created June 28, 2022 22:38
Show Gist options
  • Save dfm/dcda297166b0e152f873cc83a7bc611d to your computer and use it in GitHub Desktop.
Save dfm/dcda297166b0e152f873cc83a7bc611d to your computer and use it in GitHub Desktop.
intro-to-jax-part3.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "intro-to-jax-part3.ipynb",
"provenance": [],
"collapsed_sections": [
"vVJ-9lAbSlpM"
],
"authorship_tag": "ABX9TyOgb/spOGOlyUfRSJHDbnmM",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/dfm/dcda297166b0e152f873cc83a7bc611d/intro-to-jax-part3.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"id": "46DyV01VQnYu"
},
"outputs": [],
"source": [
"%pip install -q jaxopt optax"
]
},
{
"cell_type": "markdown",
"source": [
"# !!SPOILER WARNING!!\n",
"\n",
"# Linear regression in JAX\n",
"\n",
"In this section, everyone will take a minute to implement linear regression in JAX to fit the \"diabetes\" dataset from sklearn.\n",
"This notebook walks through a few possible solutions; don't look through this if you want an opportunity to implement this yourself.\n",
"\n",
"Start by loading the data:"
],
"metadata": {
"id": "8EIIne_cR8Ub"
}
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"from sklearn import datasets\n",
"\n",
"x, y = datasets.load_diabetes(return_X_y=True)\n",
"x = x[:, 2]\n",
"\n",
"plt.plot(x, y, \".k\");"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "V675Ho1DQ7Hq",
"outputId": "76c34ae8-c44d-4825-d21a-bfec3b359733"
},
"execution_count": 2,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## Solution 1\n",
"\n",
"Directly solve the linear system:"
],
"metadata": {
"id": "vVJ-9lAbSlpM"
}
},
{
"cell_type": "code",
"source": [
"import jax\n",
"import jax.numpy as jnp\n",
"\n",
"A = jnp.vander(x, 2)\n",
"w = jnp.linalg.lstsq(A, y)[0]\n",
"\n",
"x_test = jnp.linspace(x.min(), x.max(), 50)\n",
"plt.plot(x, y, \".k\")\n",
"plt.plot(x_test, jnp.vander(x_test, 2) @ w);"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 72
},
"id": "priwCPhURUTv",
"outputId": "4a828d5e-4e0d-48a5-bb04-ecd975772056"
},
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## Solution 2\n",
"\n",
"Define a loss function and optimize using [jaxopt](https://github.com/google/jaxopt):\n"
],
"metadata": {
"id": "W7bAvjWqTJZv"
}
},
{
"cell_type": "code",
"source": [
"import jax.numpy as jnp\n",
"import jaxopt\n",
"\n",
"def model(params, x):\n",
" return params[\"slope\"] * x + params[\"intercept\"]\n",
"\n",
"def loss(params):\n",
" y_pred = model(params, x)\n",
" return jnp.sum(jnp.square(y - y_pred))\n",
"\n",
"init = {\n",
" \"slope\": 0.0,\n",
" \"intercept\": 100.0,\n",
"}\n",
"opt = jaxopt.ScipyMinimize(fun=loss)\n",
"soln = opt.run(init)\n",
"\n",
"x_test = jnp.linspace(x.min(), x.max(), 50)\n",
"plt.plot(x, y, \".k\")\n",
"plt.plot(x_test, model(soln.params, x_test));"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "Gm89ZIGVStgD",
"outputId": "1f9a849a-4491-4a9b-805e-63525650bd13"
},
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## Solution 3\n",
"\n",
"Define a loss function and optimize using [optax](https://github.com/deepmind/optax):"
],
"metadata": {
"id": "WSIO7UsSUhQK"
}
},
{
"cell_type": "code",
"source": [
"import jax\n",
"import jax.numpy as jnp\n",
"import optax\n",
"\n",
"def model(params, x):\n",
" return params[\"slope\"] * x + params[\"intercept\"]\n",
"\n",
"def loss(params):\n",
" y_pred = model(params, x)\n",
" return jnp.sum(jnp.square(y - y_pred))\n",
"\n",
"params = {\n",
" \"slope\": 0.0,\n",
" \"intercept\": 100.0,\n",
"}\n",
"opt = optax.adam(10.0)\n",
"opt_state = opt.init(params)\n",
"\n",
"@jax.jit\n",
"def train(params, opt_state):\n",
" value, grad = jax.value_and_grad(loss)(params)\n",
" updates, opt_state = opt.update(grad, opt_state)\n",
" params = optax.apply_updates(params, updates)\n",
" return value, params, opt_state\n",
"\n",
"losses = []\n",
"for _ in range(1000):\n",
" value, params, opt_state = train(params, opt_state)\n",
" losses.append(value)\n",
"\n",
"plt.plot(losses)\n",
"plt.ylabel(\"loss\")\n",
"plt.xlabel(\"step\")\n",
"\n",
"plt.figure()\n",
"x_test = jnp.linspace(x.min(), x.max(), 50)\n",
"plt.plot(x, y, \".k\")\n",
"plt.plot(x_test, model(params, x_test));"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 538
},
"id": "4137D5ZDURzQ",
"outputId": "aaad32e5-abfe-42ab-a671-aa994239cad3"
},
"execution_count": 5,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
""
],
"metadata": {
"id": "_6qkWgfJVmk9"
},
"execution_count": 5,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment