{ "cells": [ { "cell_type": "markdown", "id": "754f146e", "metadata": {}, "source": [ "# Week 9 lecture demo: one network, by hand, in numpy, and in PyTorch\n", "Companion to the **NN_BASICS** note. Four short demos:\n", "1. The by-hand example of NN_BASICS §7 (2-2-1 sigmoid network, x = (-3, 1), t = 0, every weight into unit i equals i): forward, backward, one update, in numpy.\n", "2. The same network in PyTorch: `loss.backward()` computes the same gradients.\n", "3. Gradient checking (NN_BASICS §9): centered vs one-sided finite differences.\n", "4. Why stacking helps: a small network learns XOR (NN_BASICS §2), and we look at its decision boundary.\n", "\n", "Runs on a CPU in a few seconds." ] }, { "cell_type": "code", "execution_count": 1, "id": "68f958a2", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:31:59.455488Z", "iopub.status.busy": "2026-09-29T22:31:59.455148Z", "iopub.status.idle": "2026-09-29T22:32:00.219215Z", "shell.execute_reply": "2026-09-29T22:32:00.218754Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import torch\n", "import matplotlib.pyplot as plt\n", "np.set_printoptions(precision=6, suppress=True)\n", "sigmoid = lambda a: 1 / (1 + np.exp(-a))" ] }, { "cell_type": "markdown", "id": "540e7da6", "metadata": {}, "source": [ "## 1. The by-hand example in numpy\n", "Row-vector convention: `x` includes the bias input $x^0=1$; row $j$ of `W1` holds hidden unit $j$'s weights $(w_{j0}, w_{j1}, w_{j2})$; `w2` holds the output unit's $(w_{k0}, w_{k1}, w_{k2})$." ] }, { "cell_type": "code", "execution_count": 2, "id": "06c4706a", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:00.220793Z", "iopub.status.busy": "2026-09-29T22:32:00.220654Z", "iopub.status.idle": "2026-09-29T22:32:00.224117Z", "shell.execute_reply": "2026-09-29T22:32:00.223759Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "net_j = [-1. -2.] y_j = [0.26894142 0.11920292]\n", "net_k = 4.164433 z = 0.984699 J = 0.484816\n" ] } ], "source": [ "x = np.array([1., -3., 1.]) # (x^0, x^1, x^2)\n", "t = 0.0\n", "W1 = np.array([[1., 1., 1.], # all weights into hidden unit 1 equal 1\n", " [2., 2., 2.]]) # all weights into hidden unit 2 equal 2\n", "w2 = np.array([3., 3., 3.]) # all weights into the output unit equal 3\n", "\n", "def forward(W1, w2):\n", " net_j = W1 @ x\n", " y = np.r_[1.0, sigmoid(net_j)] # prepend y^0 = 1 for the output bias\n", " net_k = w2 @ y\n", " z = sigmoid(net_k)\n", " J = 0.5 * (t - z) ** 2\n", " return net_j, y, net_k, z, J\n", "\n", "net_j, y, net_k, z, J = forward(W1, w2)\n", "print('net_j =', net_j, ' y_j =', y[1:])\n", "print('net_k =', round(net_k, 6), ' z =', round(z, 6), ' J =', round(J, 6))" ] }, { "cell_type": "code", "execution_count": 3, "id": "81ee27a5", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:00.225244Z", "iopub.status.busy": "2026-09-29T22:32:00.225155Z", "iopub.status.idle": "2026-09-29T22:32:00.227651Z", "shell.execute_reply": "2026-09-29T22:32:00.227082Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "delta_k = 0.014836\n", "dJ/dw_k = [0.01483613 0.00399005 0.00176851]\n", "delta_j = [0.00875088 0.00467309]\n", "dJ/dW1 =\n", " [[ 0.00875088 -0.02625263 0.00875088]\n", " [ 0.00467309 -0.01401928 0.00467309]]\n" ] } ], "source": [ "# backward pass: NN_BASICS Equations 5 and 6\n", "delta_k = (z - t) * z * (1 - z) # output error signal\n", "grad_w2 = delta_k * y # dJ/dw_kj = delta_k * y_j\n", "delta_j = delta_k * w2[1:] * y[1:] * (1 - y[1:]) # (sum_k delta_k w_kj) f'(net_j)\n", "grad_W1 = np.outer(delta_j, x) # dJ/dw_ji = delta_j * x^i\n", "print('delta_k =', round(delta_k, 6))\n", "print('dJ/dw_k =', grad_w2)\n", "print('delta_j =', delta_j)\n", "print('dJ/dW1 =\\n', grad_W1)" ] }, { "cell_type": "code", "execution_count": 4, "id": "d251b5dc", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:00.228726Z", "iopub.status.busy": "2026-09-29T22:32:00.228646Z", "iopub.status.idle": "2026-09-29T22:32:00.230989Z", "shell.execute_reply": "2026-09-29T22:32:00.230660Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "new J = 0.483464 (was 0.484816 )\n", "f'(net_k) = 0.015067\n", "cross-entropy error signal would be z - t = 0.984699 -> 66.4 times larger\n" ] } ], "source": [ "eta = 1.0\n", "W1_new, w2_new = W1 - eta * grad_W1, w2 - eta * grad_w2\n", "print('new J =', round(forward(W1_new, w2_new)[4], 6), ' (was', round(J, 6), ')')\n", "# the step is tiny because the output sigmoid is saturated: f'(net_k) = z(1-z)\n", "print(\"f'(net_k) =\", round(z * (1 - z), 6))\n", "print('cross-entropy error signal would be z - t =', round(z - t, 6),\n", " '->', round((z - t) / delta_k, 1), 'times larger')" ] }, { "cell_type": "markdown", "id": "f9d645d8", "metadata": {}, "source": [ "## 2. The same network in PyTorch\n", "We write only the forward pass; `J.backward()` runs the reverse loop. PyTorch's `nn.Linear` stores its weight as (out x in), i.e. in the lecture's $w_{kj}$ orientation, with the bias separate." ] }, { "cell_type": "code", "execution_count": 5, "id": "ad37bd7e", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:00.232147Z", "iopub.status.busy": "2026-09-29T22:32:00.232073Z", "iopub.status.idle": "2026-09-29T22:32:00.251448Z", "shell.execute_reply": "2026-09-29T22:32:00.251008Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "J = 0.4848162858884045\n", "PyTorch dJ/dW1 (without bias column):\n", " [[-0.02625263 0.00875088]\n", " [-0.01401928 0.00467309]]\n", "PyTorch dJ/dw_k (without bias): [[0.00399005 0.00176851]]\n", "numpy backprop == PyTorch autograd\n" ] } ], "source": [ "torch.set_default_dtype(torch.float64)\n", "lin1, lin2 = torch.nn.Linear(2, 2), torch.nn.Linear(2, 1)\n", "with torch.no_grad():\n", " lin1.weight.copy_(torch.tensor(W1[:, 1:])); lin1.bias.copy_(torch.tensor(W1[:, 0]))\n", " lin2.weight.copy_(torch.tensor(w2[None, 1:])); lin2.bias.copy_(torch.tensor(w2[:1]))\n", "xt = torch.tensor([[-3., 1.]])\n", "zt = torch.sigmoid(lin2(torch.sigmoid(lin1(xt))))\n", "Jt = 0.5 * (0.0 - zt).pow(2).sum()\n", "Jt.backward()\n", "print('J =', Jt.item())\n", "print('PyTorch dJ/dW1 (without bias column):\\n', lin1.weight.grad.numpy())\n", "print('PyTorch dJ/dw_k (without bias):', lin2.weight.grad.numpy())\n", "assert np.allclose(lin1.weight.grad.numpy(), grad_W1[:, 1:]) and np.allclose(lin1.bias.grad.numpy(), grad_W1[:, 0])\n", "assert np.allclose(lin2.weight.grad.numpy()[0], grad_w2[1:]) and np.allclose(lin2.bias.grad.numpy(), grad_w2[:1])\n", "print('numpy backprop == PyTorch autograd')" ] }, { "cell_type": "markdown", "id": "054aab39", "metadata": {}, "source": [ "## 3. Gradient checking\n", "Perturb one weight, $w_{k1}$, by $\\pm\\varepsilon$ and compare the finite difference with backprop's value." ] }, { "cell_type": "code", "execution_count": 6, "id": "a84c1525", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:00.252792Z", "iopub.status.busy": "2026-09-29T22:32:00.252693Z", "iopub.status.idle": "2026-09-29T22:32:00.255290Z", "shell.execute_reply": "2026-09-29T22:32:00.254904Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "eps=1e-02 centered rel.err=1.0e-06 one-sided rel.err=1.3e-03\n", "eps=1e-04 centered rel.err=2.0e-10 one-sided rel.err=1.3e-05\n", "eps=1e-05 centered rel.err=2.2e-09 one-sided rel.err=1.3e-06\n", "eps=1e-07 centered rel.err=1.9e-07 one-sided rel.err=4.0e-07\n" ] } ], "source": [ "def J_of(w_k1):\n", " w = w2.copy(); w[1] = w_k1\n", " return forward(W1, w)[4]\n", "g_bp = grad_w2[1]\n", "for eps in [1e-2, 1e-4, 1e-5, 1e-7]:\n", " centered = (J_of(w2[1] + eps) - J_of(w2[1] - eps)) / (2 * eps)\n", " onesided = (J_of(w2[1] + eps) - J_of(w2[1])) / eps\n", " rel = lambda g: abs(g - g_bp) / max(abs(g), abs(g_bp))\n", " print(f'eps={eps:.0e} centered rel.err={rel(centered):.1e} one-sided rel.err={rel(onesided):.1e}')" ] }, { "cell_type": "markdown", "id": "a88b88b7", "metadata": {}, "source": [ "## 4. Why stack neurons: XOR\n", "Four points, labels $\\pm1$ given by XOR; no single line separates them. A single neuron (logistic regression) cannot fit them; a network with one small hidden layer can. The hidden layer *learns* the features that make the problem separable." ] }, { "cell_type": "code", "execution_count": 7, "id": "bf005d5c", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:00.256420Z", "iopub.status.busy": "2026-09-29T22:32:00.256327Z", "iopub.status.idle": "2026-09-29T22:32:01.364413Z", "shell.execute_reply": "2026-09-29T22:32:01.363960Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "one neuron final loss: 0.6931 (log 2 = 0.693: no better than guessing)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "2-4-1 network final loss: 0.0001\n" ] } ], "source": [ "torch.manual_seed(0)\n", "X = torch.tensor([[-1., -1.], [1., -1.], [-1., 1.], [1., 1.]])\n", "Y = torch.tensor([0., 1., 1., 0.]) # XOR, as 0/1 labels for cross-entropy\n", "\n", "def train(model, steps=2000):\n", " opt = torch.optim.Adam(model.parameters(), lr=0.05)\n", " for _ in range(steps):\n", " loss = torch.nn.functional.binary_cross_entropy_with_logits(model(X).squeeze(1), Y)\n", " opt.zero_grad(); loss.backward(); opt.step()\n", " return loss.item()\n", "\n", "single = torch.nn.Linear(2, 1) # one neuron\n", "net = torch.nn.Sequential(torch.nn.Linear(2, 4), torch.nn.Tanh(), torch.nn.Linear(4, 1))\n", "print('one neuron final loss:', round(train(single), 4), ' (log 2 = 0.693: no better than guessing)')\n", "print('2-4-1 network final loss:', round(train(net), 4))" ] }, { "cell_type": "code", "execution_count": 8, "id": "a12cc5fd", "metadata": { "execution": { "iopub.execute_input": "2026-09-29T22:32:01.365785Z", "iopub.status.busy": "2026-09-29T22:32:01.365606Z", "iopub.status.idle": "2026-09-29T22:32:01.538882Z", "shell.execute_reply": "2026-09-29T22:32:01.538502Z" } }, "outputs": [ { "data": { "image/png": "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NRHPcfbwHBc4PMc1xHNc9JzjIj705OTkqEtz2bx5s1rTYwwOkfC9SHuenBS+//57V8iRNh5pf/F1ml2gvg95NaWwsFCtKRk+fLi67YcffkB9fb0ryNghk7dEMH4nVpKSktTxys9SJrAJOWZ5/5prrnH7vcrHZUKYTibWGSsmoeDP92Im7XFLly7Fcccdh0giP3vz2PBw+J0Eivx30Vz/TVDw8BxnD89xgcNzXEM8x0XROU6LIRs3btQWLlyo3XXXXVqLFi3U23IpKSlx3adPnz7aBx98oN6W22+88UZt9uzZ2vr167XvvvtOGzZsmNarVy+tsrIyor4Xcf/992stW7bUPv74Y23JkiVqKl23bt20ioqKEH0XmnbMMcdoQ4cO1ebMmaP99ttv6md7zjnnuD6+efNm9X3Ix8WaNWu0u+++W5s3b576ncj30r17d+3www9v1uN+66231OS7GTNmqCl0l19+ufrZbt++XX38ggsu0G699VbX/WfOnKklJCRo//3vf7Xly5drd9xxh5aYmKgtXbpUCzVfvxf5N/f1119ra9eu1ebPn6+dffbZWkpKirZs2bIQfhfO/171/w7kT9sjjzyi3pb/VoR8D/K96NatW6elpaVpN910k/qdPPXUU1p8fLz21VdfaaHm6/fy6KOPah999JG2evVq9W9KphvGxcWpv1kUO3iO4zkuUHiO4zkuGs9xMRV6ZPy0/HDNFxmFp5P3ZdynKC8v144++mgtJydHPUHt0qWLNnHiRNeTwUj6XvSx1bfddpvWtm1b9ST3yCOP1FauXKmF0u7du1XIkeCWmZmpXXzxxQ2CmwQb4/eVn5+vAk7r1q3V99CzZ0/1pLWoqKjZj/2JJ57QOnfurCUlJanxnr///nuDsdryOzJ65513tN69e6v7y6jkzz//XAsXvnwv119/veu+8m/puOOO0xYsWKCFmj7S0nzRj12u5XsxP2bIkCHqe5HwbPzvJZK+lwceeEDr0aOHCp/y38bYsWO1H374IYTfAYUCz3E8xwUSz3E8x0XbOc4h/xes0hMREREREVGocZ8eIiIiIiKKagw9REREREQU1Rh6iIiIiIgoqjH0EBERERFRVGPoISIiIiKiqMbQQ0REREREUY2hh4iIiIiIohpDDxERERERRTWGHiIiIiIiimoMPUREREREFNUYeoiIiIiIKKox9BAREREREaLZ/wM7MNuBsu+nYwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "g = torch.linspace(-1.6, 1.6, 200)\n", "G = torch.stack(torch.meshgrid(g, g, indexing='xy'), -1).reshape(-1, 2)\n", "fig, axes = plt.subplots(1, 2, figsize=(9, 4))\n", "for ax, model, title in [(axes[0], single, 'one neuron'), (axes[1], net, '2-4-1 network')]:\n", " with torch.no_grad():\n", " P = torch.sigmoid(model(G)).reshape(200, 200)\n", " ax.contourf(g, g, P, levels=20, cmap='RdBu_r', alpha=0.7)\n", " ax.contour(g, g, P, levels=[0.5], colors='k')\n", " ax.scatter(X[:, 0], X[:, 1], c=['b' if v == 0 else 'r' for v in Y], s=120, edgecolors='k')\n", " ax.set_title(title); ax.set_aspect('equal')\n", "plt.tight_layout(); plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.14.0" } }, "nbformat": 4, "nbformat_minor": 5 }