Created
January 11, 2025 18:02
-
-
Save ctralie/727b242198a67402b8743a3e1a08981f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "df2bae8a-673a-41e3-a28e-a64e5199dea5", | |
"metadata": {}, | |
"source": [ | |
"# Gradient Descent in Torch\n", | |
"## For Those Who Don't Care About Neural Nets" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "43924ef7-f61f-429d-afc5-0c9c37acb192", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import torch\n", | |
"import matplotlib.pyplot as plt\n", | |
"import time" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "6f3a7cbc-26dc-4899-a6bd-775f92ba8e44", | |
"metadata": {}, | |
"source": [ | |
"### Compute The Median\n", | |
"\n", | |
"A median $m$ of a set $X$ is the number that minimizes the sum of absolute differences between $m$ and all elements in the set\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "63a6178f-10de-4738-9e70-ee2ce96139ae", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7e0ccb347910>]" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"device = \"cpu\"\n", | |
"t = torch.linspace(-2, 2, 1000)\n", | |
"X = t**2\n", | |
"X = X.to(device)\n", | |
"plt.plot(X.cpu())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "363ae12a-0567-45c8-9782-4de628ad0f81", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.11725997924804688\n", | |
"m= tensor([0.9997], requires_grad=True)\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7e0c5b9c8e90>]" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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", | |
"text/plain": [ | |
"<Figure size 640x480 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"m = torch.tensor([0.0]).to(X) # Put my differentiable parameters onto the same device as\n", | |
"m = m.requires_grad_() # Make it differentiable\n", | |
"optimizer = torch.optim.Adam([m], lr=1e-2)\n", | |
"n_iters = 1000\n", | |
"losses = []\n", | |
"tic = time.time()\n", | |
"for i in range(n_iters):\n", | |
" ## Step 1: Clear accumulation of gradients from previous steps\n", | |
" optimizer.zero_grad()\n", | |
" ## Step 2: Compute loss function\n", | |
" loss = torch.sum(torch.abs(X-m))\n", | |
" losses.append(loss.item())\n", | |
" ## Step 3: Compute gradient of loss function wrt all parameters in the optimizer\n", | |
" loss.backward() \n", | |
" ## Step 4: Take a step of the optimizer against the gradient to minimize against loss\n", | |
" optimizer.step()\n", | |
"print(time.time()-tic) ## ~11 seconds for CPU\n", | |
"print(\"m=\", m)\n", | |
"plt.plot(losses)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "f748ef28-a4ec-4816-8d14-a165a438d1e9", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"tensor(0.9980)" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"torch.median(X)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "51e0246b-e94a-45f7-b63e-393d590a5268", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"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.11.10" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment