From b8fc18ca1a47c118a8d03867cff9560ea215086b Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Sun, 6 Oct 2024 13:46:23 +0200 Subject: [PATCH] updated book --- .../_build/.doctrees/environment.pickle | Bin 415723 -> 458091 bytes .../_build/.doctrees/exercisesweek41.doctree | Bin 0 -> 250992 bytes .../_build/.doctrees/intro.doctree | Bin 53069 -> 52853 bytes .../_build/.doctrees/week40.doctree | Bin 631326 -> 633149 bytes .../_build/.doctrees/week41.doctree | Bin 0 -> 496664 bytes .../html/_images/exercisesweek41_16_2.png | Bin 0 -> 22314 bytes .../html/_images/exercisesweek41_22_1.png | Bin 0 -> 20216 bytes .../html/_images/exercisesweek41_22_2.png | Bin 0 -> 21287 bytes .../html/_images/exercisesweek41_39_2.png | Bin 0 -> 20636 bytes .../html/_images/exercisesweek41_41_1.png | Bin 0 -> 31965 bytes .../html/_images/exercisesweek41_5_1.png | Bin 0 -> 21480 bytes .../_build/html/_images/week40_100_1.png | Bin 22123 -> 22560 bytes .../_build/html/_images/week40_104_1.png | Bin 22220 -> 22326 bytes .../_build/html/_images/week40_34_1.png | Bin 20750 -> 21494 bytes .../_build/html/_images/week41_176_1.png | Bin 0 -> 4442 bytes .../_build/html/_images/week41_59_0.png | Bin 0 -> 18573 bytes .../_build/html/_images/week41_59_1.png | Bin 0 -> 14628 bytes .../_build/html/_images/week41_59_2.png | Bin 0 -> 31496 bytes .../_build/html/_images/week41_59_3.png | Bin 0 -> 17868 bytes .../html/_sources/exercisesweek41.ipynb | 1144 ++++ .../_build/html/_sources/week41.ipynb | 3972 ++++++++++++++ .../_build/html/exercisesweek41.html | 1740 ++++++ doc/LectureNotes/_build/html/genindex.html | 16 +- doc/LectureNotes/_build/html/intro.html | 18 +- doc/LectureNotes/_build/html/objects.inv | Bin 1104 -> 1141 bytes doc/LectureNotes/_build/html/search.html | 16 +- doc/LectureNotes/_build/html/searchindex.js | 2 +- doc/LectureNotes/_build/html/week40.html | 259 +- doc/LectureNotes/_build/html/week41.html | 3744 +++++++++++++ .../jupyter_execute/exercisesweek41.ipynb | 1512 +++++ .../_build/jupyter_execute/exercisesweek41.py | 815 +++ .../jupyter_execute/exercisesweek41_16_2.png | Bin 0 -> 22314 bytes .../jupyter_execute/exercisesweek41_22_1.png | Bin 0 -> 20216 bytes .../jupyter_execute/exercisesweek41_22_2.png | Bin 0 -> 21287 bytes .../jupyter_execute/exercisesweek41_39_2.png | Bin 0 -> 20636 bytes .../jupyter_execute/exercisesweek41_41_1.png | Bin 0 -> 31965 bytes .../jupyter_execute/exercisesweek41_5_1.png | Bin 0 -> 21480 bytes .../_build/jupyter_execute/week40.ipynb | 253 +- .../_build/jupyter_execute/week40_100_1.png | Bin 22123 -> 22560 bytes .../_build/jupyter_execute/week40_104_1.png | Bin 22220 -> 22326 bytes .../_build/jupyter_execute/week40_34_1.png | Bin 20750 -> 21494 bytes .../_build/jupyter_execute/week41.ipynb | 4842 +++++++++++++++++ .../_build/jupyter_execute/week41.py | 2271 ++++++++ .../_build/jupyter_execute/week41_176_1.png | Bin 0 -> 4442 bytes .../_build/jupyter_execute/week41_59_0.png | Bin 0 -> 18573 bytes .../_build/jupyter_execute/week41_59_1.png | Bin 0 -> 14628 bytes .../_build/jupyter_execute/week41_59_2.png | Bin 0 -> 31496 bytes .../_build/jupyter_execute/week41_59_3.png | Bin 0 -> 17868 bytes doc/LectureNotes/_toc.yml | 10 +- 49 files changed, 20322 insertions(+), 292 deletions(-) create mode 100644 doc/LectureNotes/_build/.doctrees/exercisesweek41.doctree create mode 100644 doc/LectureNotes/_build/.doctrees/week41.doctree create mode 100644 doc/LectureNotes/_build/html/_images/exercisesweek41_16_2.png create mode 100644 doc/LectureNotes/_build/html/_images/exercisesweek41_22_1.png create mode 100644 doc/LectureNotes/_build/html/_images/exercisesweek41_22_2.png create mode 100644 doc/LectureNotes/_build/html/_images/exercisesweek41_39_2.png create mode 100644 doc/LectureNotes/_build/html/_images/exercisesweek41_41_1.png create mode 100644 doc/LectureNotes/_build/html/_images/exercisesweek41_5_1.png create mode 100644 doc/LectureNotes/_build/html/_images/week41_176_1.png create mode 100644 doc/LectureNotes/_build/html/_images/week41_59_0.png create mode 100644 doc/LectureNotes/_build/html/_images/week41_59_1.png create mode 100644 doc/LectureNotes/_build/html/_images/week41_59_2.png create mode 100644 doc/LectureNotes/_build/html/_images/week41_59_3.png create mode 100644 doc/LectureNotes/_build/html/_sources/exercisesweek41.ipynb create mode 100644 doc/LectureNotes/_build/html/_sources/week41.ipynb create mode 100644 doc/LectureNotes/_build/html/exercisesweek41.html create mode 100644 doc/LectureNotes/_build/html/week41.html create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41.ipynb create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41.py create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41_16_2.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_2.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41_39_2.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41_41_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/exercisesweek41_5_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41.ipynb create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41.py create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41_176_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41_59_0.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41_59_1.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41_59_2.png create mode 100644 doc/LectureNotes/_build/jupyter_execute/week41_59_3.png diff --git a/doc/LectureNotes/_build/.doctrees/environment.pickle b/doc/LectureNotes/_build/.doctrees/environment.pickle index 9a98d1a0a3e78478b0739bc4a010d19cc088d2e5..6b08a37267221a60e15e0b393a3f596e52817d37 100644 GIT binary patch literal 458091 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

ho#77?RpR3&OOyFiaI|Cn)?rNw+- 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 diff --git a/doc/LectureNotes/_build/.doctrees/exercisesweek41.doctree b/doc/LectureNotes/_build/.doctrees/exercisesweek41.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a8f6bea3d05f98bd468c7b63108d906f4191ba8c GIT binary patch literal 250992 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/.doctrees/intro.doctree b/doc/LectureNotes/_build/.doctrees/intro.doctree index 47a9bcec2c4787db3ef3514a9d637b5623579a20..eb33e417e134086f918b74754691bb164f9cf174 100644 GIT binary patch delta 172 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 Qs+c9b*MEEC delta 108943 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%0Dc5=L5m@bg`sDBI-s1xY@1cC=@IChTe|o+5T#Ekq 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 SQ|+XRnZ|HF>szwZx&H_A>TU=C diff --git a/doc/LectureNotes/_build/.doctrees/week41.doctree b/doc/LectureNotes/_build/.doctrees/week41.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4399af0af880504ac42e78f0e39c1f3e83bbb9df GIT binary patch literal 496664 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�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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/exercisesweek41_22_1.png b/doc/LectureNotes/_build/html/_images/exercisesweek41_22_1.png new file mode 100644 index 0000000000000000000000000000000000000000..63a694a365d630555eeb7df1a452ffa33b2bc604 GIT binary patch literal 20216 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/exercisesweek41_22_2.png b/doc/LectureNotes/_build/html/_images/exercisesweek41_22_2.png new file mode 100644 index 0000000000000000000000000000000000000000..09b060bfd7f34c7c420fbdcfaa4ae253c4c2d4be GIT binary patch literal 21287 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 bo#i!AdP7N<6gv5UR_g5a-S5-l9d+V=m7WfA literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/exercisesweek41_39_2.png b/doc/LectureNotes/_build/html/_images/exercisesweek41_39_2.png new file mode 100644 index 0000000000000000000000000000000000000000..06ae2c745ee6e5edf82c5c9a059d9c005ab255c9 GIT binary patch literal 20636 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 JpPacw{x|IowdVi; literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/exercisesweek41_41_1.png b/doc/LectureNotes/_build/html/_images/exercisesweek41_41_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7b0e0a7a1ac621f1b099b87e4654bf1239b3bf GIT binary patch literal 31965 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/exercisesweek41_5_1.png b/doc/LectureNotes/_build/html/_images/exercisesweek41_5_1.png new file mode 100644 index 0000000000000000000000000000000000000000..16bdb0cc53db86461eaffbe00d4cb5f8f4237d79 GIT binary patch literal 21480 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/week40_100_1.png b/doc/LectureNotes/_build/html/_images/week40_100_1.png index 34e6443ac3be9f26cdb272af426e164605d2627a..a675ee5f071ecc1b747e1919ee448667b98bfc9a 100644 GIT binary patch literal 22560 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 R3=CVT_4XU>vTZ$o{1^MBX%PSb literal 22220 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 literal 20750 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 diff --git a/doc/LectureNotes/_build/html/_images/week41_176_1.png b/doc/LectureNotes/_build/html/_images/week41_176_1.png new file mode 100644 index 0000000000000000000000000000000000000000..72515c54f747a11094ae1345d84c712af699e2b6 GIT binary patch literal 4442 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∓1w4JB3+UANTj2!EmqO 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

h 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/week41_59_1.png b/doc/LectureNotes/_build/html/_images/week41_59_1.png new file mode 100644 index 0000000000000000000000000000000000000000..90948aee69ae83d1e057e5881a2fcc25bb6cab2e GIT binary patch literal 14628 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/week41_59_2.png b/doc/LectureNotes/_build/html/_images/week41_59_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a76574b3ebd5077d9730bd5957b9bf7f4b1b518b GIT binary patch literal 31496 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 V2_H_Fz*K6KhKiPQfuhBe{{=V`u<8H+ literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/html/_images/week41_59_3.png b/doc/LectureNotes/_build/html/_images/week41_59_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2c8902f26b17d512d53a6c2e8b355b39c41bdb GIT binary patch literal 17868 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 qty7?dl\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "bcb25e64", + "metadata": { + "editable": true + }, + "source": [ + "# Exercises week 41\n", + "**October 4-11, 2024**\n", + "\n", + "Date: **Deadline is Friday October 11 at midnight**" + ] + }, + { + "cell_type": "markdown", + "id": "bb01f126", + "metadata": { + "editable": true + }, + "source": [ + "# Overarching aims of the exercises this week\n", + "\n", + "The aim of the exercises this week is to get started with implementing\n", + "gradient methods of relevance for project 2. This exercise will also\n", + "be continued next week with the addition of automatic differentation.\n", + "Everything you develop here will be used in project 2. \n", + "\n", + "In order to get started, we will now replace in our standard ordinary\n", + "least squares (OLS) and Ridge regression codes (from project 1) the\n", + "matrix inversion algorithm with our own gradient descent (GD) and SGD\n", + "codes. You can use the Franke function or the terrain data from\n", + "project 1. **However, we recommend using a simpler function like**\n", + "$f(x)=a_0+a_1x+a_2x^2$ or higher-order one-dimensional polynomials.\n", + "You can obviously test your final codes against for example the Franke\n", + "function. Automatic differentiation will be discussed next week.\n", + "\n", + "You should include in your analysis of the GD and SGD codes the following elements\n", + "1. A plain gradient descent with a fixed learning rate (you will need to tune it) using the analytical expression of the gradients\n", + "\n", + "2. Add momentum to the plain GD code and compare convergence with a fixed learning rate (you may need to tune the learning rate), again using the analytical expression of the gradients.\n", + "\n", + "3. Repeat these steps for stochastic gradient descent with mini batches and a given number of epochs. Use a tunable learning rate as discussed in the lectures from week 39. Discuss the results as functions of the various parameters (size of batches, number of epochs etc)\n", + "\n", + "4. Implement the Adagrad method in order to tune the learning rate. Do this with and without momentum for plain gradient descent and SGD.\n", + "\n", + "5. Add RMSprop and Adam to your library of methods for tuning the learning rate.\n", + "\n", + "The lecture notes from weeks 39 and 40 contain more information and code examples. Feel free to use these examples.\n", + "\n", + "In summary, you should \n", + "perform an analysis of the results for OLS and Ridge regression as\n", + "function of the chosen learning rates, the number of mini-batches and\n", + "epochs as well as algorithm for scaling the learning rate. You can\n", + "also compare your own results with those that can be obtained using\n", + "for example **Scikit-Learn**'s various SGD options. Discuss your\n", + "results. For Ridge regression you need now to study the results as functions of the hyper-parameter $\\lambda$ and \n", + "the learning rate $\\eta$. Discuss your results.\n", + "\n", + "You will need your SGD code for the setup of the Neural Network and\n", + "Logistic Regression codes. You will find the Python [Seaborn\n", + "package](https://seaborn.pydata.org/generated/seaborn.heatmap.html)\n", + "useful when plotting the results as function of the learning rate\n", + "$\\eta$ and the hyper-parameter $\\lambda$ when you use Ridge\n", + "regression.\n", + "\n", + "We recommend reading chapter 8 on optimization from the textbook of [Goodfellow, Bengio and Courville](https://www.deeplearningbook.org/). This chapter contains many useful insights and discussions on the optimization part of machine learning." + ] + }, + { + "cell_type": "markdown", + "id": "d576598a", + "metadata": { + "editable": true + }, + "source": [ + "# Code examples from week 39 and 40" + ] + }, + { + "cell_type": "markdown", + "id": "2d07a903", + "metadata": { + "editable": true + }, + "source": [ + "## Code with a Number of Minibatches which varies, analytical gradient\n", + "\n", + "In the code here we vary the number of mini-batches." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "4db17153", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "# Importing various packages\n", + "from math import exp, sqrt\n", + "from random import random, seed\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 1000\n", + "\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = 2.0/n*X.T @ ((X @ theta)-y)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "xnew = np.array([[0],[2]])\n", + "Xnew = np.c_[np.ones((2,1)), xnew]\n", + "ypredict = Xnew.dot(theta)\n", + "ypredict2 = Xnew.dot(theta_linreg)\n", + "\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "t0, t1 = 5, 50\n", + "\n", + "def learning_schedule(t):\n", + " return t0/(t+t1)\n", + "\n", + "theta = np.random.randn(2,1)\n", + "\n", + "for epoch in range(n_epochs):\n", + "# Can you figure out a better way of setting up the contributions to each batch?\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (2.0/M)* xi.T @ ((xi @ theta)-yi)\n", + " eta = learning_schedule(epoch*m+i)\n", + " theta = theta - eta*gradients\n", + "print(\"theta from own sdg\")\n", + "print(theta)\n", + "\n", + "plt.plot(xnew, ypredict, \"r-\")\n", + "plt.plot(xnew, ypredict2, \"b-\")\n", + "plt.plot(x, y ,'ro')\n", + "plt.axis([0,2.0,0, 15.0])\n", + "plt.xlabel(r'$x$')\n", + "plt.ylabel(r'$y$')\n", + "plt.title(r'Random numbers ')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a815759a", + "metadata": { + "editable": true + }, + "source": [ + "In the above code, we have use replacement in setting up the\n", + "mini-batches. The discussion\n", + "[here](https://sebastianraschka.com/faq/docs/sgd-methods.html) may be\n", + "useful." + ] + }, + { + "cell_type": "markdown", + "id": "4dc76e73", + "metadata": { + "editable": true + }, + "source": [ + "## Momentum based GD\n", + "\n", + "The stochastic gradient descent (SGD) is almost always used with a\n", + "*momentum* or inertia term that serves as a memory of the direction we\n", + "are moving in parameter space. This is typically implemented as\n", + "follows" + ] + }, + { + "cell_type": "markdown", + "id": "2650be7b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "94cf4be5", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "

\n", + "\n", + "$$\n", + "\\begin{equation} \n", + "\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t},\n", + "\\label{_auto1} \\tag{1}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "2c744311", + "metadata": { + "editable": true + }, + "source": [ + "where we have introduced a momentum parameter $\\gamma$, with\n", + "$0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to\n", + "indicate the gradient is to be taken over a different mini-batch at\n", + "each step. We call this algorithm gradient descent with momentum\n", + "(GDM). From these equations, it is clear that $\\mathbf{v}_t$ is a\n", + "running average of recently encountered gradients and\n", + "$(1-\\gamma)^{-1}$ sets the characteristic time scale for the memory\n", + "used in the averaging procedure. Consistent with this, when\n", + "$\\gamma=0$, this just reduces down to ordinary SGD as discussed\n", + "earlier. An equivalent way of writing the updates is" + ] + }, + { + "cell_type": "markdown", + "id": "c0c1409c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8a20fde4", + "metadata": { + "editable": true + }, + "source": [ + "where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$." + ] + }, + { + "cell_type": "markdown", + "id": "80345cf7", + "metadata": { + "editable": true + }, + "source": [ + "## Algorithms and codes for Adagrad, RMSprop and Adam\n", + "\n", + "The algorithms we have implemented are well described in the text by [Goodfellow, Bengio and Courville, chapter 8](https://www.deeplearningbook.org/contents/optimization.html).\n", + "\n", + "The codes which implement these algorithms are discussed after our presentation of automatic differentiation." + ] + }, + { + "cell_type": "markdown", + "id": "9e073302", + "metadata": { + "editable": true + }, + "source": [ + "## Practical tips\n", + "\n", + "* **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.\n", + "\n", + "* **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.\n", + "\n", + "* **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings.\n", + "\n", + "* **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.\n", + "\n", + "Geron's text, see chapter 11, has several interesting discussions." + ] + }, + { + "cell_type": "markdown", + "id": "23fed8cc", + "metadata": { + "editable": true + }, + "source": [ + "## Using Automatic differentation with OLS\n", + "\n", + "We conclude the part on optmization by showing how we can make codes\n", + "for linear regression and logistic regression using **autograd**. The\n", + "first example shows results with ordinary leats squares." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2b199ebe", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients for OLS\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "def CostOLS(beta):\n", + " return (1.0/n)*np.sum((y-X @ beta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 1000\n", + "# define the gradient\n", + "training_gradient = grad(CostOLS)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = training_gradient(theta)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "xnew = np.array([[0],[2]])\n", + "Xnew = np.c_[np.ones((2,1)), xnew]\n", + "ypredict = Xnew.dot(theta)\n", + "ypredict2 = Xnew.dot(theta_linreg)\n", + "\n", + "plt.plot(xnew, ypredict, \"r-\")\n", + "plt.plot(xnew, ypredict2, \"b-\")\n", + "plt.plot(x, y ,'ro')\n", + "plt.axis([0,2.0,0, 15.0])\n", + "plt.xlabel(r'$x$')\n", + "plt.ylabel(r'$y$')\n", + "plt.title(r'Random numbers ')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e1d7695a", + "metadata": { + "editable": true + }, + "source": [ + "## Same code but now with momentum gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74404bdc", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients for OLS\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "def CostOLS(beta):\n", + " return (1.0/n)*np.sum((y-X @ beta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x#+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 30\n", + "\n", + "# define the gradient\n", + "training_gradient = grad(CostOLS)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = training_gradient(theta)\n", + " theta -= eta*gradients\n", + " print(iter,gradients[0],gradients[1])\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "# Now improve with momentum gradient descent\n", + "change = 0.0\n", + "delta_momentum = 0.3\n", + "for iter in range(Niterations):\n", + " # calculate gradient\n", + " gradients = training_gradient(theta)\n", + " # calculate update\n", + " new_change = eta*gradients+delta_momentum*change\n", + " # take a step\n", + " theta -= new_change\n", + " # save the change\n", + " change = new_change\n", + " print(iter,gradients[0],gradients[1])\n", + "print(\"theta from own gd wth momentum\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "398dee87", + "metadata": { + "editable": true + }, + "source": [ + "## But noen of these can compete with Newton's method" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f4f7ac9a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Newton's method\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "def CostOLS(beta):\n", + " return (1.0/n)*np.sum((y-X @ beta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(beta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "# Note that here the Hessian does not depend on the parameters beta\n", + "invH = np.linalg.pinv(H)\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "beta = np.random.randn(2,1)\n", + "Niterations = 5\n", + "\n", + "# define the gradient\n", + "training_gradient = grad(CostOLS)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = training_gradient(beta)\n", + " beta -= invH @ gradients\n", + " print(iter,gradients[0],gradients[1])\n", + "print(\"beta from own Newton code\")\n", + "print(beta)" + ] + }, + { + "cell_type": "markdown", + "id": "7fe85919", + "metadata": { + "editable": true + }, + "source": [ + "## Including Stochastic Gradient Descent with Autograd\n", + "In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using **autograd**." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f4ca22ee", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients using SGD\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 1000\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = (1.0/n)*training_gradient(y, X, theta)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "xnew = np.array([[0],[2]])\n", + "Xnew = np.c_[np.ones((2,1)), xnew]\n", + "ypredict = Xnew.dot(theta)\n", + "ypredict2 = Xnew.dot(theta_linreg)\n", + "\n", + "plt.plot(xnew, ypredict, \"r-\")\n", + "plt.plot(xnew, ypredict2, \"b-\")\n", + "plt.plot(x, y ,'ro')\n", + "plt.axis([0,2.0,0, 15.0])\n", + "plt.xlabel(r'$x$')\n", + "plt.ylabel(r'$y$')\n", + "plt.title(r'Random numbers ')\n", + "plt.show()\n", + "\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "t0, t1 = 5, 50\n", + "def learning_schedule(t):\n", + " return t0/(t+t1)\n", + "\n", + "theta = np.random.randn(2,1)\n", + "\n", + "for epoch in range(n_epochs):\n", + "# Can you figure out a better way of setting up the contributions to each batch?\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " eta = learning_schedule(epoch*m+i)\n", + " theta = theta - eta*gradients\n", + "print(\"theta from own sdg\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "81bbaf59", + "metadata": { + "editable": true + }, + "source": [ + "## Same code but now with momentum gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f2ecc922", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients using SGD\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 100\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = (1.0/n)*training_gradient(y, X, theta)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "t0, t1 = 5, 50\n", + "def learning_schedule(t):\n", + " return t0/(t+t1)\n", + "\n", + "theta = np.random.randn(2,1)\n", + "\n", + "change = 0.0\n", + "delta_momentum = 0.3\n", + "\n", + "for epoch in range(n_epochs):\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " eta = learning_schedule(epoch*m+i)\n", + " # calculate update\n", + " new_change = eta*gradients+delta_momentum*change\n", + " # take a step\n", + " theta -= new_change\n", + " # save the change\n", + " change = new_change\n", + "print(\"theta from own sdg with momentum\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "ddf05caf", + "metadata": { + "editable": true + }, + "source": [ + "## AdaGrad algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "8ac3a77b", + "metadata": { + "editable": true + }, + "source": [ + "## Similar (second order function now) problem but now with AdaGrad" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ec906255", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients using AdaGrad and Stochastic Gradient descent\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 1000\n", + "x = np.random.rand(n,1)\n", + "y = 2.0+3*x +4*x*x\n", + "\n", + "X = np.c_[np.ones((n,1)), x, x*x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "# Define parameters for Stochastic Gradient Descent\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "# Guess for unknown parameters theta\n", + "theta = np.random.randn(3,1)\n", + "\n", + "# Value for learning rate\n", + "eta = 0.01\n", + "# Including AdaGrad parameter to avoid possible division by zero\n", + "delta = 1e-8\n", + "for epoch in range(n_epochs):\n", + " Giter = 0.0\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " Giter += gradients*gradients\n", + " update = gradients*eta/(delta+np.sqrt(Giter))\n", + " theta -= update\n", + "print(\"theta from own AdaGrad\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "b540daef", + "metadata": { + "editable": true + }, + "source": [ + "Running this code we note an almost perfect agreement with the results from matrix inversion." + ] + }, + { + "cell_type": "markdown", + "id": "4fbc5639", + "metadata": { + "editable": true + }, + "source": [ + "## RMSProp algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "80820b57", + "metadata": { + "editable": true + }, + "source": [ + "## RMSprop for adaptive learning rate with Stochastic Gradient Descent" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a51a1f9f", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients using RMSprop and Stochastic Gradient descent\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 1000\n", + "x = np.random.rand(n,1)\n", + "y = 2.0+3*x +4*x*x# +np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x, x*x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "# Define parameters for Stochastic Gradient Descent\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "# Guess for unknown parameters theta\n", + "theta = np.random.randn(3,1)\n", + "\n", + "# Value for learning rate\n", + "eta = 0.01\n", + "# Value for parameter rho\n", + "rho = 0.99\n", + "# Including AdaGrad parameter to avoid possible division by zero\n", + "delta = 1e-8\n", + "for epoch in range(n_epochs):\n", + " Giter = 0.0\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + "\t# Accumulated gradient\n", + "\t# Scaling with rho the new and the previous results\n", + " Giter = (rho*Giter+(1-rho)*gradients*gradients)\n", + "\t# Taking the diagonal only and inverting\n", + " update = gradients*eta/(delta+np.sqrt(Giter))\n", + "\t# Hadamard product\n", + " theta -= update\n", + "print(\"theta from own RMSprop\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "1dbb8774", + "metadata": { + "editable": true + }, + "source": [ + "## ADAM algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "53f97773", + "metadata": { + "editable": true + }, + "source": [ + "## And finally [ADAM](https://arxiv.org/pdf/1412.6980.pdf)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "88a61340", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# Using Autograd to calculate gradients using RMSprop and Stochastic Gradient descent\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 1000\n", + "x = np.random.rand(n,1)\n", + "y = 2.0+3*x +4*x*x# +np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x, x*x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "# Define parameters for Stochastic Gradient Descent\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "# Guess for unknown parameters theta\n", + "theta = np.random.randn(3,1)\n", + "\n", + "# Value for learning rate\n", + "eta = 0.01\n", + "# Value for parameters beta1 and beta2, see https://arxiv.org/abs/1412.6980\n", + "beta1 = 0.9\n", + "beta2 = 0.999\n", + "# Including AdaGrad parameter to avoid possible division by zero\n", + "delta = 1e-7\n", + "iter = 0\n", + "for epoch in range(n_epochs):\n", + " first_moment = 0.0\n", + " second_moment = 0.0\n", + " iter += 1\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " # Computing moments first\n", + " first_moment = beta1*first_moment + (1-beta1)*gradients\n", + " second_moment = beta2*second_moment+(1-beta2)*gradients*gradients\n", + " first_term = first_moment/(1.0-beta1**iter)\n", + " second_term = second_moment/(1.0-beta2**iter)\n", + "\t# Scaling with rho the new and the previous results\n", + " update = eta*first_term/(np.sqrt(second_term)+delta)\n", + " theta -= update\n", + "print(\"theta from own ADAM\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "8e34a6cb", + "metadata": { + "editable": true + }, + "source": [ + "## Introducing [JAX](https://jax.readthedocs.io/en/latest/)\n", + "\n", + "Presently, instead of using **autograd**, we recommend using [JAX](https://jax.readthedocs.io/en/latest/)\n", + "\n", + "**JAX** is Autograd and [XLA (Accelerated Linear Algebra))](https://www.tensorflow.org/xla),\n", + "brought together for high-performance numerical computing and machine learning research.\n", + "It provides composable transformations of Python+NumPy programs: differentiate, vectorize, parallelize, Just-In-Time compile to GPU/TPU, and more." + ] + }, + { + "cell_type": "markdown", + "id": "04f74999", + "metadata": { + "editable": true + }, + "source": [ + "### Getting started with Jax, note the way we import numpy" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a5c7d572", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from jax import grad as jax_grad" + ] + }, + { + "cell_type": "markdown", + "id": "2c584b1d", + "metadata": { + "editable": true + }, + "source": [ + "### A warm-up example" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "651b82b4", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "def function(x):\n", + " return x**2\n", + "\n", + "def analytical_gradient(x):\n", + " return 2*x\n", + "\n", + "def gradient_descent(starting_point, learning_rate, num_iterations, solver=\"analytical\"):\n", + " x = starting_point\n", + " trajectory_x = [x]\n", + " trajectory_y = [function(x)]\n", + "\n", + " if solver == \"analytical\":\n", + " grad = analytical_gradient \n", + " elif solver == \"jax\":\n", + " grad = jax_grad(function)\n", + " x = jnp.float64(x)\n", + " learning_rate = jnp.float64(learning_rate)\n", + "\n", + " for _ in range(num_iterations):\n", + " \n", + " x = x - learning_rate * grad(x)\n", + " trajectory_x.append(x)\n", + " trajectory_y.append(function(x))\n", + "\n", + " return trajectory_x, trajectory_y\n", + "\n", + "x = np.linspace(-5, 5, 100)\n", + "plt.plot(x, function(x), label=\"f(x)\")\n", + "\n", + "descent_x, descent_y = gradient_descent(5, 0.1, 10, solver=\"analytical\")\n", + "jax_descend_x, jax_descend_y = gradient_descent(5, 0.1, 10, solver=\"jax\")\n", + "\n", + "plt.plot(descent_x, descent_y, label=\"Gradient descent\", marker=\"o\")\n", + "plt.plot(jax_descend_x, jax_descend_y, label=\"JAX\", marker=\"x\")" + ] + }, + { + "cell_type": "markdown", + "id": "245d5858", + "metadata": { + "editable": true + }, + "source": [ + "### A more advanced example" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "51bc9058", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "backend = np\n", + "\n", + "def function(x):\n", + " return x*backend.sin(x**2 + 1)\n", + "\n", + "def analytical_gradient(x):\n", + " return backend.sin(x**2 + 1) + 2*x**2*backend.cos(x**2 + 1)\n", + "\n", + "\n", + "x = np.linspace(-5, 5, 100)\n", + "plt.plot(x, function(x), label=\"f(x)\")\n", + "\n", + "descent_x, descent_y = gradient_descent(1, 0.01, 300, solver=\"analytical\")\n", + "\n", + "# Change the backend to JAX\n", + "backend = jnp\n", + "jax_descend_x, jax_descend_y = gradient_descent(1, 0.01, 300, solver=\"jax\")\n", + "\n", + "plt.scatter(descent_x, descent_y, label=\"Gradient descent\", marker=\"v\", s=10, color=\"red\") \n", + "plt.scatter(jax_descend_x, jax_descend_y, label=\"JAX\", marker=\"x\", s=5, color=\"black\")" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/LectureNotes/_build/html/_sources/week41.ipynb b/doc/LectureNotes/_build/html/_sources/week41.ipynb new file mode 100644 index 000000000..3def9b7f3 --- /dev/null +++ b/doc/LectureNotes/_build/html/_sources/week41.ipynb @@ -0,0 +1,3972 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4fed6eef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "6a758aaa", + "metadata": { + "editable": true + }, + "source": [ + "# Week 41 Neural networks and constructing a neural network code\n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo\n", + "\n", + "Date: **Week 41**" + ] + }, + { + "cell_type": "markdown", + "id": "7436d60f", + "metadata": { + "editable": true + }, + "source": [ + "## Plan for week 41, October 7-11" + ] + }, + { + "cell_type": "markdown", + "id": "4a06fa29", + "metadata": { + "editable": true + }, + "source": [ + "## Material for the lecture on Monday October 7, 2024\n", + "1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.\n", + "\n", + "2. Building our own Feed-forward Neural Network\n", + "\n", + "\n", + "\n", + "**Readings and Videos:**\n", + "\n", + "1. These lecture notes\n", + "\n", + "2. Rashcka et al chapter 11 \n", + "\n", + "3. For neural networks we recommend Goodfellow et al chapter 6.\n", + "\n", + "a. Neural Networks demystified at \n", + "\n", + "2. Building Neural Networks from scratch at \n", + "\n", + "3. Video on Neural Networks at \n", + "\n", + "4. Video on the back propagation algorithm at \n", + "\n", + "We also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at ." + ] + }, + { + "cell_type": "markdown", + "id": "c77f547a", + "metadata": { + "editable": true + }, + "source": [ + "## Material for the active learning sessions on Tuesday and Wednesday\n", + "* Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation\n", + "\n", + "* One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code\n", + "\n", + "* Discussion of project 2\n", + "\n", + "* Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent" + ] + }, + { + "cell_type": "markdown", + "id": "a1ba6a50", + "metadata": { + "editable": true + }, + "source": [ + "## Lecture Monday October 7" + ] + }, + { + "cell_type": "markdown", + "id": "9ef418c8", + "metadata": { + "editable": true + }, + "source": [ + "## Introduction to Neural networks\n", + "\n", + "Artificial neural networks are computational systems that can learn to\n", + "perform tasks by considering examples, generally without being\n", + "programmed with any task-specific rules. It is supposed to mimic a\n", + "biological system, wherein neurons interact by sending signals in the\n", + "form of mathematical functions between layers. All layers can contain\n", + "an arbitrary number of neurons, and each connection is represented by\n", + "a weight variable." + ] + }, + { + "cell_type": "markdown", + "id": "b58ec2e6", + "metadata": { + "editable": true + }, + "source": [ + "## Artificial neurons\n", + "\n", + "The field of artificial neural networks has a long history of\n", + "development, and is closely connected with the advancement of computer\n", + "science and computers in general. A model of artificial neurons was\n", + "first developed by McCulloch and Pitts in 1943 to study signal\n", + "processing in the brain and has later been refined by others. The\n", + "general idea is to mimic neural networks in the human brain, which is\n", + "composed of billions of neurons that communicate with each other by\n", + "sending electrical signals. Each neuron accumulates its incoming\n", + "signals, which must exceed an activation threshold to yield an\n", + "output. If the threshold is not overcome, the neuron remains inactive,\n", + "i.e. has zero output.\n", + "\n", + "This behaviour has inspired a simple mathematical model for an artificial neuron." + ] + }, + { + "cell_type": "markdown", + "id": "7d1b99e3", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y = f\\left(\\sum_{i=1}^n w_ix_i\\right) = f(u)\n", + "\\label{artificialNeuron} \\tag{1}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "367512fa", + "metadata": { + "editable": true + }, + "source": [ + "Here, the output $y$ of the neuron is the value of its activation function, which have as input\n", + "a weighted sum of signals $x_i, \\dots ,x_n$ received by $n$ other neurons.\n", + "\n", + "Conceptually, it is helpful to divide neural networks into four\n", + "categories:\n", + "1. general purpose neural networks for supervised learning,\n", + "\n", + "2. neural networks designed specifically for image processing, the most prominent example of this class being Convolutional Neural Networks (CNNs),\n", + "\n", + "3. neural networks for sequential data such as Recurrent Neural Networks (RNNs), and\n", + "\n", + "4. neural networks for unsupervised learning such as Deep Boltzmann Machines.\n", + "\n", + "In natural science, DNNs and CNNs have already found numerous\n", + "applications. In statistical physics, they have been applied to detect\n", + "phase transitions in 2D Ising and Potts models, lattice gauge\n", + "theories, and different phases of polymers, or solving the\n", + "Navier-Stokes equation in weather forecasting. Deep learning has also\n", + "found interesting applications in quantum physics. Various quantum\n", + "phase transitions can be detected and studied using DNNs and CNNs,\n", + "topological phases, and even non-equilibrium many-body\n", + "localization. Representing quantum states as DNNs quantum state\n", + "tomography are among some of the impressive achievements to reveal the\n", + "potential of DNNs to facilitate the study of quantum systems.\n", + "\n", + "In quantum information theory, it has been shown that one can perform\n", + "gate decompositions with the help of neural. \n", + "\n", + "The applications are not limited to the natural sciences. There is a\n", + "plethora of applications in essentially all disciplines, from the\n", + "humanities to life science and medicine." + ] + }, + { + "cell_type": "markdown", + "id": "3d79cfce", + "metadata": { + "editable": true + }, + "source": [ + "## Neural network types\n", + "\n", + "An artificial neural network (ANN), is a computational model that\n", + "consists of layers of connected neurons, or nodes or units. We will\n", + "refer to these interchangeably as units or nodes, and sometimes as\n", + "neurons.\n", + "\n", + "It is supposed to mimic a biological nervous system by letting each\n", + "neuron interact with other neurons by sending signals in the form of\n", + "mathematical functions between layers. A wide variety of different\n", + "ANNs have been developed, but most of them consist of an input layer,\n", + "an output layer and eventual layers in-between, called *hidden\n", + "layers*. All layers can contain an arbitrary number of nodes, and each\n", + "connection between two nodes is associated with a weight variable.\n", + "\n", + "Neural networks (also called neural nets) are neural-inspired\n", + "nonlinear models for supervised learning. As we will see, neural nets\n", + "can be viewed as natural, more powerful extensions of supervised\n", + "learning methods such as linear and logistic regression and soft-max\n", + "methods we discussed earlier." + ] + }, + { + "cell_type": "markdown", + "id": "cbcafcdc", + "metadata": { + "editable": true + }, + "source": [ + "## Feed-forward neural networks\n", + "\n", + "The feed-forward neural network (FFNN) was the first and simplest type\n", + "of ANNs that were devised. In this network, the information moves in\n", + "only one direction: forward through the layers.\n", + "\n", + "Nodes are represented by circles, while the arrows display the\n", + "connections between the nodes, including the direction of information\n", + "flow. Additionally, each arrow corresponds to a weight variable\n", + "(figure to come). We observe that each node in a layer is connected\n", + "to *all* nodes in the subsequent layer, making this a so-called\n", + "*fully-connected* FFNN." + ] + }, + { + "cell_type": "markdown", + "id": "1ab04b48", + "metadata": { + "editable": true + }, + "source": [ + "## Convolutional Neural Network\n", + "\n", + "A different variant of FFNNs are *convolutional neural networks*\n", + "(CNNs), which have a connectivity pattern inspired by the animal\n", + "visual cortex. Individual neurons in the visual cortex only respond to\n", + "stimuli from small sub-regions of the visual field, called a receptive\n", + "field. This makes the neurons well-suited to exploit the strong\n", + "spatially local correlation present in natural images. The response of\n", + "each neuron can be approximated mathematically as a convolution\n", + "operation. (figure to come)\n", + "\n", + "Convolutional neural networks emulate the behaviour of neurons in the\n", + "visual cortex by enforcing a *local* connectivity pattern between\n", + "nodes of adjacent layers: Each node in a convolutional layer is\n", + "connected only to a subset of the nodes in the previous layer, in\n", + "contrast to the fully-connected FFNN. Often, CNNs consist of several\n", + "convolutional layers that learn local features of the input, with a\n", + "fully-connected layer at the end, which gathers all the local data and\n", + "produces the outputs. They have wide applications in image and video\n", + "recognition." + ] + }, + { + "cell_type": "markdown", + "id": "e4cf80b3", + "metadata": { + "editable": true + }, + "source": [ + "## Recurrent neural networks\n", + "\n", + "So far we have only mentioned ANNs where information flows in one\n", + "direction: forward. *Recurrent neural networks* on the other hand,\n", + "have connections between nodes that form directed *cycles*. This\n", + "creates a form of internal memory which are able to capture\n", + "information on what has been calculated before; the output is\n", + "dependent on the previous computations. Recurrent NNs make use of\n", + "sequential information by performing the same task for every element\n", + "in a sequence, where each element depends on previous elements. An\n", + "example of such information is sentences, making recurrent NNs\n", + "especially well-suited for handwriting and speech recognition." + ] + }, + { + "cell_type": "markdown", + "id": "f27655c6", + "metadata": { + "editable": true + }, + "source": [ + "## Other types of networks\n", + "\n", + "There are many other kinds of ANNs that have been developed. One type\n", + "that is specifically designed for interpolation in multidimensional\n", + "space is the radial basis function (RBF) network. RBFs are typically\n", + "made up of three layers: an input layer, a hidden layer with\n", + "non-linear radial symmetric activation functions and a linear output\n", + "layer (''linear'' here means that each node in the output layer has a\n", + "linear activation function). The layers are normally fully-connected\n", + "and there are no cycles, thus RBFs can be viewed as a type of\n", + "fully-connected FFNN. They are however usually treated as a separate\n", + "type of NN due the unusual activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "fa00e7d8", + "metadata": { + "editable": true + }, + "source": [ + "## Multilayer perceptrons\n", + "\n", + "One uses often so-called fully-connected feed-forward neural networks\n", + "with three or more layers (an input layer, one or more hidden layers\n", + "and an output layer) consisting of neurons that have non-linear\n", + "activation functions.\n", + "\n", + "Such networks are often called *multilayer perceptrons* (MLPs)." + ] + }, + { + "cell_type": "markdown", + "id": "7b05bd13", + "metadata": { + "editable": true + }, + "source": [ + "## Why multilayer perceptrons?\n", + "\n", + "According to the *Universal approximation theorem*, a feed-forward\n", + "neural network with just a single hidden layer containing a finite\n", + "number of neurons can approximate a continuous multidimensional\n", + "function to arbitrary accuracy, assuming the activation function for\n", + "the hidden layer is a **non-constant, bounded and\n", + "monotonically-increasing continuous function**.\n", + "\n", + "Note that the requirements on the activation function only applies to\n", + "the hidden layer, the output nodes are always assumed to be linear, so\n", + "as to not restrict the range of output values." + ] + }, + { + "cell_type": "markdown", + "id": "3600caa3", + "metadata": { + "editable": true + }, + "source": [ + "## Illustration of a single perceptron model and a multi-perceptron model\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1: In a) we show a single perceptron model while in b) we dispay a network with two hidden layers, an input layer and an output layer.

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "99af52bb", + "metadata": { + "editable": true + }, + "source": [ + "## Examples of XOR, OR and AND gates\n", + "\n", + "Let us first try to fit various gates using standard linear\n", + "regression. The gates we are thinking of are the classical XOR, OR and\n", + "AND gates, well-known elements in computer science. The tables here\n", + "show how we can set up the inputs $x_1$ and $x_2$ in order to yield a\n", + "specific target $y_i$." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "04ecfb00", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Simple code that tests XOR, OR and AND gates with linear regression\n", + "\"\"\"\n", + "\n", + "import numpy as np\n", + "# Design matrix\n", + "X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)\n", + "print(f\"The X.TX matrix:{X.T @ X}\")\n", + "Xinv = np.linalg.pinv(X.T @ X)\n", + "print(f\"The invers of X.TX matrix:{Xinv}\")\n", + "\n", + "# The XOR gate \n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "ThetaXOR = Xinv @ X.T @ yXOR\n", + "print(f\"The values of theta for the XOR gate:{ThetaXOR}\")\n", + "print(f\"The linear regression prediction for the XOR gate:{X @ ThetaXOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "ThetaOR = Xinv @ X.T @ yOR\n", + "print(f\"The values of theta for the OR gate:{ThetaOR}\")\n", + "print(f\"The linear regression prediction for the OR gate:{X @ ThetaOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "ThetaAND = Xinv @ X.T @ yAND\n", + "print(f\"The values of theta for the AND gate:{ThetaAND}\")\n", + "print(f\"The linear regression prediction for the AND gate:{X @ ThetaAND}\")" + ] + }, + { + "cell_type": "markdown", + "id": "0026adeb", + "metadata": { + "editable": true + }, + "source": [ + "What is happening here?" + ] + }, + { + "cell_type": "markdown", + "id": "e23f3056", + "metadata": { + "editable": true + }, + "source": [ + "## Does Logistic Regression do a better Job?" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a30fe879", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "\"\"\"\n", + "Simple code that tests XOR and OR gates with linear regression\n", + "and logistic regression\n", + "\"\"\"\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.linear_model import LogisticRegression\n", + "import numpy as np\n", + "\n", + "# Design matrix\n", + "X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)\n", + "print(f\"The X.TX matrix:{X.T @ X}\")\n", + "Xinv = np.linalg.pinv(X.T @ X)\n", + "print(f\"The invers of X.TX matrix:{Xinv}\")\n", + "\n", + "# The XOR gate \n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "ThetaXOR = Xinv @ X.T @ yXOR\n", + "print(f\"The values of theta for the XOR gate:{ThetaXOR}\")\n", + "print(f\"The linear regression prediction for the XOR gate:{X @ ThetaXOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "ThetaOR = Xinv @ X.T @ yOR\n", + "print(f\"The values of theta for the OR gate:{ThetaOR}\")\n", + "print(f\"The linear regression prediction for the OR gate:{X @ ThetaOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "ThetaAND = Xinv @ X.T @ yAND\n", + "print(f\"The values of theta for the AND gate:{ThetaAND}\")\n", + "print(f\"The linear regression prediction for the AND gate:{X @ ThetaAND}\")\n", + "\n", + "# Now we change to logistic regression\n", + "\n", + "\n", + "# Logistic Regression\n", + "logreg = LogisticRegression()\n", + "logreg.fit(X, yOR)\n", + "print(\"Test set accuracy with Logistic Regression for OR gate: {:.2f}\".format(logreg.score(X,yOR)))\n", + "\n", + "logreg.fit(X, yXOR)\n", + "print(\"Test set accuracy with Logistic Regression for XOR gate: {:.2f}\".format(logreg.score(X,yXOR)))\n", + "\n", + "\n", + "logreg.fit(X, yAND)\n", + "print(\"Test set accuracy with Logistic Regression for AND gate: {:.2f}\".format(logreg.score(X,yAND)))" + ] + }, + { + "cell_type": "markdown", + "id": "7773ba9d", + "metadata": { + "editable": true + }, + "source": [ + "Not exactly impressive, but somewhat better." + ] + }, + { + "cell_type": "markdown", + "id": "4a85ef26", + "metadata": { + "editable": true + }, + "source": [ + "## Adding Neural Networks" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2f8dd9ef", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\n", + "# and now neural networks with Scikit-Learn and the XOR\n", + "\n", + "from sklearn.neural_network import MLPClassifier\n", + "from sklearn.datasets import make_classification\n", + "X, yXOR = make_classification(n_samples=100, random_state=1)\n", + "FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)\n", + "FFNN.predict_proba(X)\n", + "print(f\"Test set accuracy with Feed Forward Neural Network for XOR gate:{FFNN.score(X, yXOR)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5b0fb3ff", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "The output $y$ is produced via the activation function $f$" + ] + }, + { + "cell_type": "markdown", + "id": "f5c984c2", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "y = f\\left(\\sum_{i=1}^n w_ix_i + b_i\\right) = f(z),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9743f4cb", + "metadata": { + "editable": true + }, + "source": [ + "This function receives $x_i$ as inputs.\n", + "Here the activation $z=(\\sum_{i=1}^n w_ix_i+b_i)$. \n", + "In an FFNN of such neurons, the *inputs* $x_i$ are the *outputs* of\n", + "the neurons in the preceding layer. Furthermore, an MLP is\n", + "fully-connected, which means that each neuron receives a weighted sum\n", + "of the outputs of *all* neurons in the previous layer." + ] + }, + { + "cell_type": "markdown", + "id": "e89c3e3f", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "First, for each node $i$ in the first hidden layer, we calculate a weighted sum $z_i^1$ of the input coordinates $x_j$," + ] + }, + { + "cell_type": "markdown", + "id": "21c83fef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} z_i^1 = \\sum_{j=1}^{M} w_{ij}^1 x_j + b_i^1\n", + "\\label{_auto1} \\tag{2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3267338f", + "metadata": { + "editable": true + }, + "source": [ + "Here $b_i$ is the so-called bias which is normally needed in\n", + "case of zero activation weights or inputs. How to fix the biases and\n", + "the weights will be discussed below. The value of $z_i^1$ is the\n", + "argument to the activation function $f_i$ of each node $i$, The\n", + "variable $M$ stands for all possible inputs to a given node $i$ in the\n", + "first layer. We define the output $y_i^1$ of all neurons in layer 1 as" + ] + }, + { + "cell_type": "markdown", + "id": "04a1a613", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^1 = f(z_i^1) = f\\left(\\sum_{j=1}^M w_{ij}^1 x_j + b_i^1\\right)\n", + "\\label{outputLayer1} \\tag{3}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bc8b70e2", + "metadata": { + "editable": true + }, + "source": [ + "where we assume that all nodes in the same layer have identical\n", + "activation functions, hence the notation $f$. In general, we could assume in the more general case that different layers have different activation functions.\n", + "In this case we would identify these functions with a superscript $l$ for the $l$-th layer," + ] + }, + { + "cell_type": "markdown", + "id": "10686541", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^l = f^l(u_i^l) = f^l\\left(\\sum_{j=1}^{N_{l-1}} w_{ij}^l y_j^{l-1} + b_i^l\\right)\n", + "\\label{generalLayer} \\tag{4}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a92cdf36", + "metadata": { + "editable": true + }, + "source": [ + "where $N_l$ is the number of nodes in layer $l$. When the output of\n", + "all the nodes in the first hidden layer are computed, the values of\n", + "the subsequent layer can be calculated and so forth until the output\n", + "is obtained." + ] + }, + { + "cell_type": "markdown", + "id": "74dcfa13", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "The output of neuron $i$ in layer 2 is thus," + ] + }, + { + "cell_type": "markdown", + "id": "0147afef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^2 = f^2\\left(\\sum_{j=1}^N w_{ij}^2 y_j^1 + b_i^2\\right) \n", + "\\label{_auto2} \\tag{5}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4a4d5b2e", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} \n", + " = f^2\\left[\\sum_{j=1}^N w_{ij}^2f^1\\left(\\sum_{k=1}^M w_{jk}^1 x_k + b_j^1\\right) + b_i^2\\right]\n", + "\\label{outputLayer2} \\tag{6}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "31742756", + "metadata": { + "editable": true + }, + "source": [ + "where we have substituted $y_k^1$ with the inputs $x_k$. Finally, the ANN output reads" + ] + }, + { + "cell_type": "markdown", + "id": "123af90c", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^3 = f^3\\left(\\sum_{j=1}^N w_{ij}^3 y_j^2 + b_i^3\\right) \n", + "\\label{_auto3} \\tag{7}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "aeb7cc95", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} \n", + " = f_3\\left[\\sum_{j} w_{ij}^3 f^2\\left(\\sum_{k} w_{jk}^2 f^1\\left(\\sum_{m} w_{km}^1 x_m + b_k^1\\right) + b_j^2\\right)\n", + " + b_1^3\\right]\n", + "\\label{_auto4} \\tag{8}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3ab7d88c", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "We can generalize this expression to an MLP with $l$ hidden\n", + "layers. The complete functional form is," + ] + }, + { + "cell_type": "markdown", + "id": "9b07f5bb", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "y^{l+1}_i = f^{l+1}\\left[\\!\\sum_{j=1}^{N_l} w_{ij}^3 f^l\\left(\\sum_{k=1}^{N_{l-1}}w_{jk}^{l-1}\\left(\\dots f^1\\left(\\sum_{n=1}^{N_0} w_{mn}^1 x_n+ b_m^1\\right)\\dots\\right)+b_k^2\\right)+b_1^3\\right] \n", + "\\label{completeNN} \\tag{9}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e9b4beb5", + "metadata": { + "editable": true + }, + "source": [ + "which illustrates a basic property of MLPs: The only independent\n", + "variables are the input values $x_n$." + ] + }, + { + "cell_type": "markdown", + "id": "57213d71", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "This confirms that an MLP, despite its quite convoluted mathematical\n", + "form, is nothing more than an analytic function, specifically a\n", + "mapping of real-valued vectors $\\hat{x} \\in \\mathbb{R}^n \\rightarrow\n", + "\\hat{y} \\in \\mathbb{R}^m$.\n", + "\n", + "Furthermore, the flexibility and universality of an MLP can be\n", + "illustrated by realizing that the expression is essentially a nested\n", + "sum of scaled activation functions of the form" + ] + }, + { + "cell_type": "markdown", + "id": "85dc952c", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " f(x) = c_1 f(c_2 x + c_3) + c_4\n", + "\\label{_auto5} \\tag{10}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4a67580f", + "metadata": { + "editable": true + }, + "source": [ + "where the parameters $c_i$ are weights and biases. By adjusting these\n", + "parameters, the activation functions can be shifted up and down or\n", + "left and right, change slope or be rescaled which is the key to the\n", + "flexibility of a neural network." + ] + }, + { + "cell_type": "markdown", + "id": "19f79e3c", + "metadata": { + "editable": true + }, + "source": [ + "### Matrix-vector notation\n", + "\n", + "We can introduce a more convenient notation for the activations in an A NN. \n", + "\n", + "Additionally, we can represent the biases and activations\n", + "as layer-wise column vectors $\\hat{b}_l$ and $\\hat{y}_l$, so that the $i$-th element of each vector \n", + "is the bias $b_i^l$ and activation $y_i^l$ of node $i$ in layer $l$ respectively. \n", + "\n", + "We have that $\\mathrm{W}_l$ is an $N_{l-1} \\times N_l$ matrix, while $\\hat{b}_l$ and $\\hat{y}_l$ are $N_l \\times 1$ column vectors. \n", + "With this notation, the sum becomes a matrix-vector multiplication, and we can write\n", + "the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as" + ] + }, + { + "cell_type": "markdown", + "id": "e350b83c", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " \\hat{y}_2 = f_2(\\mathrm{W}_2 \\hat{y}_{1} + \\hat{b}_{2}) = \n", + " f_2\\left(\\left[\\begin{array}{ccc}\n", + " w^2_{11} &w^2_{12} &w^2_{13} \\\\\n", + " w^2_{21} &w^2_{22} &w^2_{23} \\\\\n", + " w^2_{31} &w^2_{32} &w^2_{33} \\\\\n", + " \\end{array} \\right] \\cdot\n", + " \\left[\\begin{array}{c}\n", + " y^1_1 \\\\\n", + " y^1_2 \\\\\n", + " y^1_3 \\\\\n", + " \\end{array}\\right] + \n", + " \\left[\\begin{array}{c}\n", + " b^2_1 \\\\\n", + " b^2_2 \\\\\n", + " b^2_3 \\\\\n", + " \\end{array}\\right]\\right).\n", + "\\label{_auto6} \\tag{11}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3b64eaf6", + "metadata": { + "editable": true + }, + "source": [ + "### Matrix-vector notation and activation\n", + "\n", + "The activation of node $i$ in layer 2 is" + ] + }, + { + "cell_type": "markdown", + "id": "dc8ca05e", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y^2_i = f_2\\Bigr(w^2_{i1}y^1_1 + w^2_{i2}y^1_2 + w^2_{i3}y^1_3 + b^2_i\\Bigr) = \n", + " f_2\\left(\\sum_{j=1}^3 w^2_{ij} y_j^1 + b^2_i\\right).\n", + "\\label{_auto7} \\tag{12}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "079a6c4b", + "metadata": { + "editable": true + }, + "source": [ + "This is not just a convenient and compact notation, but also a useful\n", + "and intuitive way to think about MLPs: The output is calculated by a\n", + "series of matrix-vector multiplications and vector additions that are\n", + "used as input to the activation functions. For each operation\n", + "$\\mathrm{W}_l \\hat{y}_{l-1}$ we move forward one layer." + ] + }, + { + "cell_type": "markdown", + "id": "3498dab8", + "metadata": { + "editable": true + }, + "source": [ + "### Activation functions\n", + "\n", + "A property that characterizes a neural network, other than its\n", + "connectivity, is the choice of activation function(s). As described\n", + "in, the following restrictions are imposed on an activation function\n", + "for a FFNN to fulfill the universal approximation theorem\n", + "\n", + " * Non-constant\n", + "\n", + " * Bounded\n", + "\n", + " * Monotonically-increasing\n", + "\n", + " * Continuous" + ] + }, + { + "cell_type": "markdown", + "id": "c0b93415", + "metadata": { + "editable": true + }, + "source": [ + "### Activation functions, Logistic and Hyperbolic ones\n", + "\n", + "The second requirement excludes all linear functions. Furthermore, in\n", + "a MLP with only linear activation functions, each layer simply\n", + "performs a linear transformation of its inputs.\n", + "\n", + "Regardless of the number of layers, the output of the NN will be\n", + "nothing but a linear function of the inputs. Thus we need to introduce\n", + "some kind of non-linearity to the NN to be able to fit non-linear\n", + "functions Typical examples are the logistic *Sigmoid*" + ] + }, + { + "cell_type": "markdown", + "id": "74a5d31d", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) = \\frac{1}{1 + e^{-x}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "539998aa", + "metadata": { + "editable": true + }, + "source": [ + "and the *hyperbolic tangent* function" + ] + }, + { + "cell_type": "markdown", + "id": "e4b4b760", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) = \\tanh(x)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b98e352b", + "metadata": { + "editable": true + }, + "source": [ + "### Relevance\n", + "\n", + "The *sigmoid* function are more biologically plausible because the\n", + "output of inactive neurons are zero. Such activation function are\n", + "called *one-sided*. However, it has been shown that the hyperbolic\n", + "tangent performs better than the sigmoid for training MLPs. has\n", + "become the most popular for *deep neural networks*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9f6ead02", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\"\"\"The sigmoid function (or the logistic curve) is a \n", + "function that takes any real number, z, and outputs a number (0,1).\n", + "It is useful in neural networks for assigning weights on a relative scale.\n", + "The value z is the weighted sum of parameters involved in the learning algorithm.\"\"\"\n", + "\n", + "import numpy\n", + "import matplotlib.pyplot as plt\n", + "import math as mt\n", + "\n", + "z = numpy.arange(-5, 5, .1)\n", + "sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))\n", + "sigma = sigma_fn(z)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, sigma)\n", + "ax.set_ylim([-0.1, 1.1])\n", + "ax.set_xlim([-5,5])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('sigmoid function')\n", + "\n", + "plt.show()\n", + "\n", + "\"\"\"Step Function\"\"\"\n", + "z = numpy.arange(-5, 5, .02)\n", + "step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)\n", + "step = step_fn(z)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, step)\n", + "ax.set_ylim([-0.5, 1.5])\n", + "ax.set_xlim([-5,5])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('step function')\n", + "\n", + "plt.show()\n", + "\n", + "\"\"\"Sine Function\"\"\"\n", + "z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)\n", + "t = numpy.sin(z)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, t)\n", + "ax.set_ylim([-1.0, 1.0])\n", + "ax.set_xlim([-2*mt.pi,2*mt.pi])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('sine function')\n", + "\n", + "plt.show()\n", + "\n", + "\"\"\"Plots a graph of the squashing function used by a rectified linear\n", + "unit\"\"\"\n", + "z = numpy.arange(-2, 2, .1)\n", + "zero = numpy.zeros(len(z))\n", + "y = numpy.max([zero, z], axis=0)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, y)\n", + "ax.set_ylim([-2.0, 2.0])\n", + "ax.set_xlim([-2.0, 2.0])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('Rectified linear unit')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "95f54888", + "metadata": { + "editable": true + }, + "source": [ + "## The multilayer perceptron (MLP)\n", + "\n", + "The multilayer perceptron is a very popular, and easy to implement approach, to deep learning. It consists of\n", + "1. A neural network with one or more layers of nodes between the input and the output nodes.\n", + "\n", + "2. The multilayer network structure, or architecture, or topology, consists of an input layer, one or more hidden layers, and one output layer.\n", + "\n", + "3. The input nodes pass values to the first hidden layer, its nodes pass the information on to the second and so on till we reach the output layer.\n", + "\n", + "As a convention it is normal to call a network with one layer of input units, one layer of hidden\n", + "units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.\n", + "\n", + "For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units.\n", + "Hereafter we will call the various entities of a layer for nodes.\n", + "There are also no connections within a single layer.\n", + "\n", + "The number of input nodes does not need to equal the number of output\n", + "nodes. This applies also to the hidden layers. Each layer may have its\n", + "own number of nodes and activation functions.\n", + "\n", + "The hidden layers have their name from the fact that they are not\n", + "linked to observables and as we will see below when we define the\n", + "so-called activation $\\hat{z}$, we can think of this as a basis\n", + "expansion of the original inputs $\\hat{x}$. The difference however\n", + "between neural networks and say linear regression is that now these\n", + "basis functions (which will correspond to the weights in the network)\n", + "are learned from data. This results in an important difference between\n", + "neural networks and deep learning approaches on one side and methods\n", + "like logistic regression or linear regression and their modifications on the other side." + ] + }, + { + "cell_type": "markdown", + "id": "91bf2419", + "metadata": { + "editable": true + }, + "source": [ + "## From one to many layers, the universal approximation theorem\n", + "\n", + "A neural network with only one layer, what we called the simple\n", + "perceptron, is best suited if we have a standard binary model with\n", + "clear (linear) boundaries between the outcomes. As such it could\n", + "equally well be replaced by standard linear regression or logistic\n", + "regression. Networks with one or more hidden layers approximate\n", + "systems with more complex boundaries.\n", + "\n", + "As stated earlier, \n", + "an important theorem in studies of neural networks, restated without\n", + "proof here, is the [universal approximation\n", + "theorem](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.441.7873&rep=rep1&type=pdf).\n", + "\n", + "It states that a feed-forward network with a single hidden layer\n", + "containing a finite number of neurons can approximate continuous\n", + "functions on compact subsets of real functions. The theorem thus\n", + "states that simple neural networks can represent a wide variety of\n", + "interesting functions when given appropriate parameters. It is the\n", + "multilayer feedforward architecture itself which gives neural networks\n", + "the potential of being universal approximators." + ] + }, + { + "cell_type": "markdown", + "id": "6500ed58", + "metadata": { + "editable": true + }, + "source": [ + "## Deriving the back propagation code for a multilayer perceptron model\n", + "\n", + "As we have seen now in a feed forward network, we can express the final output of our network in terms of basic matrix-vector multiplications.\n", + "The unknowwn quantities are our weights $w_{ij}$ and we need to find an algorithm for changing them so that our errors are as small as possible.\n", + "This leads us to the famous [back propagation algorithm](https://www.nature.com/articles/323533a0).\n", + "\n", + "The questions we want to ask are how do changes in the biases and the\n", + "weights in our network change the cost function and how can we use the\n", + "final output to modify the weights?\n", + "\n", + "To derive these equations let us start with a plain regression problem\n", + "and define our cost function as" + ] + }, + { + "cell_type": "markdown", + "id": "703f7235", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "{\\cal C}(\\hat{W}) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - t_i\\right)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "667ef874", + "metadata": { + "editable": true + }, + "source": [ + "where the $t_i$s are our $n$ targets (the values we want to\n", + "reproduce), while the outputs of the network after having propagated\n", + "all inputs $\\hat{x}$ are given by $y_i$. Below we will demonstrate\n", + "how the basic equations arising from the back propagation algorithm\n", + "can be modified in order to study classification problems with $K$\n", + "classes." + ] + }, + { + "cell_type": "markdown", + "id": "dd53c6c8", + "metadata": { + "editable": true + }, + "source": [ + "## Definitions\n", + "\n", + "With our definition of the targets $\\hat{t}$, the outputs of the\n", + "network $\\hat{y}$ and the inputs $\\hat{x}$ we\n", + "define now the activation $z_j^l$ of node/neuron/unit $j$ of the\n", + "$l$-th layer as a function of the bias, the weights which add up from\n", + "the previous layer $l-1$ and the forward passes/outputs\n", + "$\\hat{a}^{l-1}$ from the previous layer as" + ] + }, + { + "cell_type": "markdown", + "id": "4f58ed9b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_j^l = \\sum_{i=1}^{M_{l-1}}w_{ij}^la_i^{l-1}+b_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c60762cd", + "metadata": { + "editable": true + }, + "source": [ + "where $b_k^l$ are the biases from layer $l$. Here $M_{l-1}$\n", + "represents the total number of nodes/neurons/units of layer $l-1$. The\n", + "figure here illustrates this equation. We can rewrite this in a more\n", + "compact form as the matrix-vector products we discussed earlier," + ] + }, + { + "cell_type": "markdown", + "id": "5c1c5162", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\hat{z}^l = \\left(\\hat{W}^l\\right)^T\\hat{a}^{l-1}+\\hat{b}^l.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "080b6f9a", + "metadata": { + "editable": true + }, + "source": [ + "With the activation values $\\hat{z}^l$ we can in turn define the\n", + "output of layer $l$ as $\\hat{a}^l = f(\\hat{z}^l)$ where $f$ is our\n", + "activation function. In the examples here we will use the sigmoid\n", + "function discussed in our logistic regression lectures. We will also use the same activation function $f$ for all layers\n", + "and their nodes. It means we have" + ] + }, + { + "cell_type": "markdown", + "id": "12e261bb", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a_j^l = f(z_j^l) = \\frac{1}{1+\\exp{-(z_j^l)}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "49a48c09", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives and the chain rule\n", + "\n", + "From the definition of the activation $z_j^l$ we have" + ] + }, + { + "cell_type": "markdown", + "id": "6dc08f48", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z_j^l}{\\partial w_{ij}^l} = a_i^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b8211d41", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "96822eda", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z_j^l}{\\partial a_i^{l-1}} = w_{ji}^l.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f0b1660f", + "metadata": { + "editable": true + }, + "source": [ + "With our definition of the activation function we have that (note that this function depends only on $z_j^l$)" + ] + }, + { + "cell_type": "markdown", + "id": "df85f033", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a_j^l}{\\partial z_j^{l}} = a_j^l(1-a_j^l)=f(z_j^l)(1-f(z_j^l)).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ea90d738", + "metadata": { + "editable": true + }, + "source": [ + "## Derivative of the cost function\n", + "\n", + "With these definitions we can now compute the derivative of the cost function in terms of the weights.\n", + "\n", + "Let us specialize to the output layer $l=L$. Our cost function is" + ] + }, + { + "cell_type": "markdown", + "id": "fafb43b4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "{\\cal C}(\\hat{W^L}) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - t_i\\right)^2=\\frac{1}{2}\\sum_{i=1}^n\\left(a_i^L - t_i\\right)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "41afcc45", + "metadata": { + "editable": true + }, + "source": [ + "The derivative of this function with respect to the weights is" + ] + }, + { + "cell_type": "markdown", + "id": "aed16939", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\left(a_j^L - t_j\\right)\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4ece624c", + "metadata": { + "editable": true + }, + "source": [ + "The last partial derivative can easily be computed and reads (by applying the chain rule)" + ] + }, + { + "cell_type": "markdown", + "id": "7fbf4fe4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}} = \\frac{\\partial a_j^L}{\\partial z_{j}^{L}}\\frac{\\partial z_j^L}{\\partial w_{jk}^{L}}=a_j^L(1-a_j^L)a_k^{L-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "dba0e4a4", + "metadata": { + "editable": true + }, + "source": [ + "## Bringing it together, first back propagation equation\n", + "\n", + "We have thus" + ] + }, + { + "cell_type": "markdown", + "id": "c32147af", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\left(a_j^L - t_j\\right)a_j^L(1-a_j^L)a_k^{L-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4b6176c8", + "metadata": { + "editable": true + }, + "source": [ + "Defining" + ] + }, + { + "cell_type": "markdown", + "id": "b87747a4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = a_j^L(1-a_j^L)\\left(a_j^L - t_j\\right) = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1547289e", + "metadata": { + "editable": true + }, + "source": [ + "and using the Hadamard product of two vectors we can write this as" + ] + }, + { + "cell_type": "markdown", + "id": "ef9854e4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\hat{\\delta}^L = f'(\\hat{z}^L)\\circ\\frac{\\partial {\\cal C}}{\\partial (\\hat{a}^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c9ce87bb", + "metadata": { + "editable": true + }, + "source": [ + "This is an important expression. The second term on the right handside\n", + "measures how fast the cost function is changing as a function of the $j$th\n", + "output activation. If, for example, the cost function doesn't depend\n", + "much on a particular output node $j$, then $\\delta_j^L$ will be small,\n", + "which is what we would expect. The first term on the right, measures\n", + "how fast the activation function $f$ is changing at a given activation\n", + "value $z_j^L$.\n", + "\n", + "Notice that everything in the above equations is easily computed. In\n", + "particular, we compute $z_j^L$ while computing the behaviour of the\n", + "network, and it is only a small additional overhead to compute\n", + "$f'(z^L_j)$. The exact form of the derivative with respect to the\n", + "output depends on the form of the cost function.\n", + "However, provided the cost function is known there should be little\n", + "trouble in calculating" + ] + }, + { + "cell_type": "markdown", + "id": "5b74b869", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "42b1eab9", + "metadata": { + "editable": true + }, + "source": [ + "With the definition of $\\delta_j^L$ we have a more compact definition of the derivative of the cost function in terms of the weights, namely" + ] + }, + { + "cell_type": "markdown", + "id": "27331743", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8f1b672f", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives in terms of $z_j^L$\n", + "\n", + "It is also easy to see that our previous equation can be written as" + ] + }, + { + "cell_type": "markdown", + "id": "543a0ba2", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L =\\frac{\\partial {\\cal C}}{\\partial z_j^L}= \\frac{\\partial {\\cal C}}{\\partial a_j^L}\\frac{\\partial a_j^L}{\\partial z_j^L},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "628ee133", + "metadata": { + "editable": true + }, + "source": [ + "which can also be interpreted as the partial derivative of the cost function with respect to the biases $b_j^L$, namely" + ] + }, + { + "cell_type": "markdown", + "id": "94f361e5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L}\\frac{\\partial b_j^L}{\\partial z_j^L}=\\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "13e5c5d5", + "metadata": { + "editable": true + }, + "source": [ + "That is, the error $\\delta_j^L$ is exactly equal to the rate of change of the cost function as a function of the bias." + ] + }, + { + "cell_type": "markdown", + "id": "4887a3d7", + "metadata": { + "editable": true + }, + "source": [ + "## Bringing it together\n", + "\n", + "We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are\n", + "\n", + "**The starting equations.**" + ] + }, + { + "cell_type": "markdown", + "id": "8f4d75dd", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1},\n", + "\\label{_auto8} \\tag{13}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "69864347", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "e654f179", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", + "\\label{_auto9} \\tag{14}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f650a917", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "b8169c55", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", + "\\label{_auto10} \\tag{15}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5567d66c", + "metadata": { + "editable": true + }, + "source": [ + "An interesting consequence of the above equations is that when the\n", + "activation $a_k^{L-1}$ is small, the gradient term, that is the\n", + "derivative of the cost function with respect to the weights, will also\n", + "tend to be small. We say then that the weight learns slowly, meaning\n", + "that it changes slowly when we minimize the weights via say gradient\n", + "descent. In this case we say the system learns slowly.\n", + "\n", + "Another interesting feature is that is when the activation function,\n", + "represented by the sigmoid function here, is rather flat when we move towards\n", + "its end values $0$ and $1$ (see the above Python codes). In these\n", + "cases, the derivatives of the activation function will also be close\n", + "to zero, meaning again that the gradients will be small and the\n", + "network learns slowly again.\n", + "\n", + "We need a fourth equation and we are set. We are going to propagate\n", + "backwards in order to the determine the weights and biases. In order\n", + "to do so we need to represent the error in the layer before the final\n", + "one $L-1$ in terms of the errors in the final output layer." + ] + }, + { + "cell_type": "markdown", + "id": "f5c09470", + "metadata": { + "editable": true + }, + "source": [ + "## Final back propagating equation\n", + "\n", + "We have that (replacing $L$ with a general layer $l$)" + ] + }, + { + "cell_type": "markdown", + "id": "d66ef5ca", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\frac{\\partial {\\cal C}}{\\partial z_j^l}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e96004a2", + "metadata": { + "editable": true + }, + "source": [ + "We want to express this in terms of the equations for layer $l+1$. Using the chain rule and summing over all $k$ entries we have" + ] + }, + { + "cell_type": "markdown", + "id": "0ee94485", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\sum_k \\frac{\\partial {\\cal C}}{\\partial z_k^{l+1}}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}}=\\sum_k \\delta_k^{l+1}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1c2ac190", + "metadata": { + "editable": true + }, + "source": [ + "and recalling that" + ] + }, + { + "cell_type": "markdown", + "id": "f89f9c76", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_j^{l+1} = \\sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f8293787", + "metadata": { + "editable": true + }, + "source": [ + "with $M_l$ being the number of nodes in layer $l$, we obtain" + ] + }, + { + "cell_type": "markdown", + "id": "a2914db3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "297a2622", + "metadata": { + "editable": true + }, + "source": [ + "This is our final equation.\n", + "\n", + "We are now ready to set up the algorithm for back propagation and learning the weights and biases." + ] + }, + { + "cell_type": "markdown", + "id": "c952f57b", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm\n", + "\n", + "The four equations provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "First, we set up the input data $\\hat{x}$ and the activations\n", + "$\\hat{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\hat{a}^1$.\n", + "\n", + "Secondly, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\hat{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\hat{a}^l$ for\n", + "$l=2,3,\\dots,L$.\n", + "\n", + "Thereafter we compute the ouput error $\\hat{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "37d4f242", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ff2e732a", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,2$ as" + ] + }, + { + "cell_type": "markdown", + "id": "97a96714", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3ee8ad1b", + "metadata": { + "editable": true + }, + "source": [ + "Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,2$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "c4d2d1a1", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d412dae3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "64129a91", + "metadata": { + "editable": true + }, + "source": [ + "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training." + ] + }, + { + "cell_type": "markdown", + "id": "681d8bd9", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm\n", + "\n", + "The four equations above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "First, we set up the input data $\\boldsymbol{x}$ and the activations\n", + "$\\boldsymbol{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\boldsymbol{a}^1$.\n", + "\n", + "Secondly, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\boldsymbol{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\boldsymbol{a}^l$ for\n", + "$l=2,3,\\dots,L$.\n", + "\n", + "Thereafter we compute the ouput error $\\boldsymbol{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "62904d70", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bb5b2dde", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,2$ as" + ] + }, + { + "cell_type": "markdown", + "id": "51828c66", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c4124232", + "metadata": { + "editable": true + }, + "source": [ + "Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,2$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "80791bf2", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "107737c9", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "720ad834", + "metadata": { + "editable": true + }, + "source": [ + "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training." + ] + }, + { + "cell_type": "markdown", + "id": "6854da89", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm\n", + "\n", + "The four equations derived discussed above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "First, we set up the input data $\\boldsymbol{x}$ and the activations\n", + "$\\boldsymbol{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\boldsymbol{a}^1$.\n", + "\n", + "Secondly, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\boldsymbol{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\boldsymbol{a}^l$ for\n", + "$l=2,3,\\dots,L$.\n", + "\n", + "Thereafter we compute the ouput error $\\boldsymbol{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "b5c0c6c7", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "43403932", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,2$ as" + ] + }, + { + "cell_type": "markdown", + "id": "08f3064e", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f5d698a4", + "metadata": { + "editable": true + }, + "source": [ + "Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,2$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "3ae56fb5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b822ca59", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e0593696", + "metadata": { + "editable": true + }, + "source": [ + "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training." + ] + }, + { + "cell_type": "markdown", + "id": "c77a2a17", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up a Multi-layer perceptron model for classification\n", + "\n", + "We are now gong to develop an example based on the MNIST data\n", + "base. This is a classification problem and we need to use our\n", + "cross-entropy function we discussed in connection with logistic\n", + "regression. The cross-entropy defines our cost function for the\n", + "classificaton problems with neural networks.\n", + "\n", + "In binary classification with two classes $(0, 1)$ we define the\n", + "logistic/sigmoid function as the probability that a particular input\n", + "is in class $0$ or $1$. This is possible because the logistic\n", + "function takes any input from the real numbers and inputs a number\n", + "between 0 and 1, and can therefore be interpreted as a probability. It\n", + "also has other nice properties, such as a derivative that is simple to\n", + "calculate.\n", + "\n", + "For an input $\\boldsymbol{a}$ from the hidden layer, the probability that the input $\\boldsymbol{x}$\n", + "is in class 0 or 1 is just. We let $\\theta$ represent the unknown weights and biases to be adjusted by our equations). The variable $x$\n", + "represents our activation values $z$. We have" + ] + }, + { + "cell_type": "markdown", + "id": "093f5d87", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(y = 0 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) = \\frac{1}{1 + \\exp{(- \\boldsymbol{x}})} ,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7bd03f69", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "fe5226a0", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(y = 1 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) = 1 - P(y = 0 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) ,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "45f1532a", + "metadata": { + "editable": true + }, + "source": [ + "where $y \\in \\{0, 1\\}$ and $\\boldsymbol{\\theta}$ represents the weights and biases\n", + "of our network." + ] + }, + { + "cell_type": "markdown", + "id": "1b07418e", + "metadata": { + "editable": true + }, + "source": [ + "## Defining the cost function\n", + "\n", + "Our cost function is given as (see the Logistic regression lectures)" + ] + }, + { + "cell_type": "markdown", + "id": "c7f5232f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{\\theta}) = - \\ln P(\\mathcal{D} \\mid \\boldsymbol{\\theta}) = - \\sum_{i=1}^n\n", + "y_i \\ln[P(y_i = 0)] + (1 - y_i) \\ln [1 - P(y_i = 0)] = \\sum_{i=1}^n \\mathcal{L}_i(\\boldsymbol{\\theta}) .\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e1af7b47", + "metadata": { + "editable": true + }, + "source": [ + "This last equality means that we can interpret our *cost* function as a sum over the *loss* function\n", + "for each point in the dataset $\\mathcal{L}_i(\\boldsymbol{\\theta})$. \n", + "The negative sign is just so that we can think about our algorithm as minimizing a positive number, rather\n", + "than maximizing a negative number. \n", + "\n", + "In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: \n", + "\n", + "$y = 5 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$ and\n", + "\n", + "$y = 1 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$ \n", + "\n", + "i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset (numbers from $0$ to $9$).. \n", + "\n", + "If $\\boldsymbol{x}_i$ is the $i$-th input (image), $y_{ic}$ refers to the $c$-th component of the $i$-th\n", + "output vector $\\boldsymbol{y}_i$. \n", + "The probability of $\\boldsymbol{x}_i$ being in class $c$ will be given by the softmax function:" + ] + }, + { + "cell_type": "markdown", + "id": "db469d35", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(y_{ic} = 1 \\mid \\boldsymbol{x}_i, \\boldsymbol{\\theta}) = \\frac{\\exp{((\\boldsymbol{a}_i^{hidden})^T \\boldsymbol{w}_c)}}\n", + "{\\sum_{c'=0}^{C-1} \\exp{((\\boldsymbol{a}_i^{hidden})^T \\boldsymbol{w}_{c'})}} ,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "deb48962", + "metadata": { + "editable": true + }, + "source": [ + "which reduces to the logistic function in the binary case. \n", + "The likelihood of this $C$-class classifier\n", + "is now given as:" + ] + }, + { + "cell_type": "markdown", + "id": "36443e39", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(\\mathcal{D} \\mid \\boldsymbol{\\theta}) = \\prod_{i=1}^n \\prod_{c=0}^{C-1} [P(y_{ic} = 1)]^{y_{ic}} .\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8076d9fa", + "metadata": { + "editable": true + }, + "source": [ + "Again we take the negative log-likelihood to define our cost function:" + ] + }, + { + "cell_type": "markdown", + "id": "292dad0a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{\\theta}) = - \\log{P(\\mathcal{D} \\mid \\boldsymbol{\\theta})}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7803b746", + "metadata": { + "editable": true + }, + "source": [ + "See the logistic regression lectures for a full definition of the cost function.\n", + "\n", + "The back propagation equations need now only a small change, namely the definition of a new cost function. We are thus ready to use the same equations as before!" + ] + }, + { + "cell_type": "markdown", + "id": "a71f1366", + "metadata": { + "editable": true + }, + "source": [ + "## Example: binary classification problem\n", + "\n", + "As an example of the above, relevant for project 2 as well, let us consider a binary class. As discussed in our logistic regression lectures, we defined a cost function in terms of the parameters $\\beta$ as" + ] + }, + { + "cell_type": "markdown", + "id": "25efb288", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{\\beta}) = - \\sum_{i=1}^n \\left(y_i\\log{p(y_i \\vert x_i,\\boldsymbol{\\beta})}+(1-y_i)\\log{1-p(y_i \\vert x_i,\\boldsymbol{\\beta})}\\right),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6192694f", + "metadata": { + "editable": true + }, + "source": [ + "where we had defined the logistic (sigmoid) function" + ] + }, + { + "cell_type": "markdown", + "id": "f6786106", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "p(y_i =1\\vert x_i,\\boldsymbol{\\beta})=\\frac{\\exp{(\\beta_0+\\beta_1 x_i)}}{1+\\exp{(\\beta_0+\\beta_1 x_i)}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "be663cac", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "a6953973", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "p(y_i =0\\vert x_i,\\boldsymbol{\\beta})=1-p(y_i =1\\vert x_i,\\boldsymbol{\\beta}).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "de08816b", + "metadata": { + "editable": true + }, + "source": [ + "The parameters $\\boldsymbol{\\beta}$ were defined using a minimization method like gradient descent or Newton-Raphson's method. \n", + "\n", + "Now we replace $x_i$ with the activation $z_i^l$ for a given layer $l$ and the outputs as $y_i=a_i^l=f(z_i^l)$, with $z_i^l$ now being a function of the weights $w_{ij}^l$ and biases $b_i^l$. \n", + "We have then" + ] + }, + { + "cell_type": "markdown", + "id": "d9b14b33", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a_i^l = y_i = \\frac{\\exp{(z_i^l)}}{1+\\exp{(z_i^l)}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8072c452", + "metadata": { + "editable": true + }, + "source": [ + "with" + ] + }, + { + "cell_type": "markdown", + "id": "34a5cb25", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_i^l = \\sum_{j}w_{ij}^l a_j^{l-1}+b_i^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "833dc972", + "metadata": { + "editable": true + }, + "source": [ + "where the superscript $l-1$ indicates that these are the outputs from layer $l-1$.\n", + "Our cost function at the final layer $l=L$ is now" + ] + }, + { + "cell_type": "markdown", + "id": "3c52b850", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{W}) = - \\sum_{i=1}^n \\left(t_i\\log{a_i^L}+(1-t_i)\\log{(1-a_i^L)}\\right),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "01c24d99", + "metadata": { + "editable": true + }, + "source": [ + "where we have defined the targets $t_i$. The derivatives of the cost function with respect to the output $a_i^L$ are then easily calculated and we get" + ] + }, + { + "cell_type": "markdown", + "id": "692fbd5a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial \\mathcal{C}(\\boldsymbol{W})}{\\partial a_i^L} = \\frac{a_i^L-t_i}{a_i^L(1-a_i^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "cdd8c203", + "metadata": { + "editable": true + }, + "source": [ + "In case we use another activation function than the logistic one, we need to evaluate other derivatives." + ] + }, + { + "cell_type": "markdown", + "id": "1e7eba9c", + "metadata": { + "editable": true + }, + "source": [ + "## The Softmax function\n", + "In case we employ the more general case given by the Softmax equation, we need to evaluate the derivative of the activation function with respect to the activation $z_i^l$, that is we need" + ] + }, + { + "cell_type": "markdown", + "id": "8ca62ded", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f(z_i^l)}{\\partial w_{jk}^l} =\n", + "\\frac{\\partial f(z_i^l)}{\\partial z_j^l} \\frac{\\partial z_j^l}{\\partial w_{jk}^l}= \\frac{\\partial f(z_i^l)}{\\partial z_j^l}a_k^{l-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "479d6d33", + "metadata": { + "editable": true + }, + "source": [ + "For the Softmax function we have" + ] + }, + { + "cell_type": "markdown", + "id": "3a63ba14", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(z_i^l) = \\frac{\\exp{(z_i^l)}}{\\sum_{m=1}^K\\exp{(z_m^l)}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bed10528", + "metadata": { + "editable": true + }, + "source": [ + "Its derivative with respect to $z_j^l$ gives" + ] + }, + { + "cell_type": "markdown", + "id": "6a77ac39", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f(z_i^l)}{\\partial z_j^l}= f(z_i^l)\\left(\\delta_{ij}-f(z_j^l)\\right),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7fd16de8", + "metadata": { + "editable": true + }, + "source": [ + "which in case of the simply binary model reduces to having $i=j$." + ] + }, + { + "cell_type": "markdown", + "id": "a598757e", + "metadata": { + "editable": true + }, + "source": [ + "## Developing a code for doing neural networks with back propagation\n", + "\n", + "One can identify a set of key steps when using neural networks to solve supervised learning problems: \n", + "\n", + "1. Collect and pre-process data \n", + "\n", + "2. Define model and architecture \n", + "\n", + "3. Choose cost function and optimizer \n", + "\n", + "4. Train the model \n", + "\n", + "5. Evaluate model performance on test data \n", + "\n", + "6. Adjust hyperparameters (if necessary, network architecture)" + ] + }, + { + "cell_type": "markdown", + "id": "0dc69031", + "metadata": { + "editable": true + }, + "source": [ + "## Collect and pre-process data\n", + "\n", + "Here we will be using the MNIST dataset, which is readily available through the **scikit-learn**\n", + "package. You may also find it for example [here](http://yann.lecun.com/exdb/mnist/). \n", + "The *MNIST* (Modified National Institute of Standards and Technology) database is a large database\n", + "of handwritten digits that is commonly used for training various image processing systems. \n", + "The MNIST dataset consists of 70 000 images of size $28\\times 28$ pixels, each labeled from 0 to 9. \n", + "The scikit-learn dataset we will use consists of a selection of 1797 images of size $8\\times 8$ collected and processed from this database. \n", + "\n", + "To feed data into a feed-forward neural network we need to represent\n", + "the inputs as a design/feature matrix $X = (n_{inputs}, n_{features})$. Each\n", + "row represents an *input*, in this case a handwritten digit, and\n", + "each column represents a *feature*, in this case a pixel. The\n", + "correct answers, also known as *labels* or *targets* are\n", + "represented as a 1D array of integers \n", + "$Y = (n_{inputs}) = (5, 3, 1, 8,...)$.\n", + "\n", + "As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from\n", + "measurements of height (in m) \n", + "and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example: \n", + "\n", + "$$ X = \\begin{bmatrix}\n", + "1.85 & 81\\\\\n", + "1.71 & 65\\\\\n", + "1.95 & 103\\\\\n", + "1.55 & 42\\\\\n", + "1.63 & 56\n", + "\\end{bmatrix} ,$$ \n", + "\n", + "and the targets would be: \n", + "\n", + "$$ Y = (23.7, 22.2, 27.1, 17.5, 21.1) $$ \n", + "\n", + "Since each input image is a 2D matrix, we need to flatten the image\n", + "(i.e. \"unravel\" the 2D matrix into a 1D array) to turn the data into a\n", + "design/feature matrix. This means we lose all spatial information in the\n", + "image, such as locality and translational invariance. More complicated\n", + "architectures such as Convolutional Neural Networks can take advantage\n", + "of such information, and are most commonly applied when analyzing\n", + "images." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d7c49d9c", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# display images in notebook\n", + "%matplotlib inline\n", + "plt.rcParams['figure.figsize'] = (12,12)\n", + "\n", + "\n", + "# download MNIST dataset\n", + "digits = datasets.load_digits()\n", + "\n", + "# define inputs and labels\n", + "inputs = digits.images\n", + "labels = digits.target\n", + "\n", + "print(\"inputs = (n_inputs, pixel_width, pixel_height) = \" + str(inputs.shape))\n", + "print(\"labels = (n_inputs) = \" + str(labels.shape))\n", + "\n", + "\n", + "# flatten the image\n", + "# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64\n", + "n_inputs = len(inputs)\n", + "inputs = inputs.reshape(n_inputs, -1)\n", + "print(\"X = (n_inputs, n_features) = \" + str(inputs.shape))\n", + "\n", + "\n", + "# choose some random images to display\n", + "indices = np.arange(n_inputs)\n", + "random_indices = np.random.choice(indices, size=5)\n", + "\n", + "for i, image in enumerate(digits.images[random_indices]):\n", + " plt.subplot(1, 5, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", + " plt.title(\"Label: %d\" % digits.target[random_indices[i]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "672723bb", + "metadata": { + "editable": true + }, + "source": [ + "## Train and test datasets\n", + "\n", + "Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions. \n", + "\n", + "We will reserve $80 \\%$ of our dataset for training and $20 \\%$ for testing. \n", + "\n", + "It is important that the train and test datasets are drawn randomly from our dataset, to ensure\n", + "no bias in the sampling. \n", + "Say you are taking measurements of weather data to predict the weather in the coming 5 days.\n", + "You don't want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data\n", + "collected from 12.00 to 24.00." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3b0db869", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "# one-liner from scikit-learn library\n", + "train_size = 0.8\n", + "test_size = 1 - train_size\n", + "X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,\n", + " test_size=test_size)\n", + "\n", + "# equivalently in numpy\n", + "def train_test_split_numpy(inputs, labels, train_size, test_size):\n", + " n_inputs = len(inputs)\n", + " inputs_shuffled = inputs.copy()\n", + " labels_shuffled = labels.copy()\n", + " \n", + " np.random.shuffle(inputs_shuffled)\n", + " np.random.shuffle(labels_shuffled)\n", + " \n", + " train_end = int(n_inputs*train_size)\n", + " X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:]\n", + " Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:]\n", + " \n", + " return X_train, X_test, Y_train, Y_test\n", + "\n", + "#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size)\n", + "\n", + "print(\"Number of training images: \" + str(len(X_train)))\n", + "print(\"Number of test images: \" + str(len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "id": "a52c7acf", + "metadata": { + "editable": true + }, + "source": [ + "## Define model and architecture\n", + "\n", + "Our simple feed-forward neural network will consist of an *input* layer, a single *hidden* layer and an *output* layer. The activation $y$ of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have \n", + "\n", + "$$ z = \\sum_{i=1}^n w_i a_i ,$$\n", + "\n", + "$$ y = f(z) ,$$\n", + "\n", + "where $f$ is the activation function, $a_i$ represents input from neuron $i$ in the preceding layer\n", + "and $w_i$ is the weight to input $i$. \n", + "The activation of the neurons in the input layer is just the features (e.g. a pixel value). \n", + "\n", + "The simplest activation function for a neuron is the *Heaviside* function:\n", + "\n", + "$$ f(z) = \n", + "\\begin{cases}\n", + "1, & z > 0\\\\\n", + "0, & \\text{otherwise}\n", + "\\end{cases}\n", + "$$\n", + "\n", + "A feed-forward neural network with this activation is known as a *perceptron*. \n", + "For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer. \n", + "This activation can be generalized to $k$ classes (using e.g. the *one-against-all* strategy), \n", + "and we call these architectures *multiclass perceptrons*. \n", + "\n", + "However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and \n", + "Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function. \n", + "\n", + "Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU). \n", + "We will be using the sigmoid function $\\sigma(x)$: \n", + "\n", + "$$ f(x) = \\sigma(x) = \\frac{1}{1 + e^{-x}} ,$$\n", + "\n", + "which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "f1ef08f4", + "metadata": { + "editable": true + }, + "source": [ + "## Layers\n", + "\n", + "* Input \n", + "\n", + "Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons. \n", + "\n", + "* Hidden layer\n", + "\n", + "We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer. \n", + "Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer. \n", + "\n", + "* Output\n", + "\n", + "If we were building a binary classifier, it would be sufficient with a single neuron in the output layer,\n", + "which could output 0 or 1 according to the Heaviside function. This would be an example of a *hard* classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a *soft* classifier, which outputs the probability of being in class 0 or 1. \n", + "\n", + "For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class. \n", + "\n", + "Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons $j = 0,1,...,9$. The activation of each output neuron $j$ will be according to the *softmax* function: \n", + "\n", + "$$ P(\\text{class $j$} \\mid \\text{input $\\boldsymbol{a}$}) = \\frac{\\exp{(\\boldsymbol{a}^T \\boldsymbol{w}_j)}}\n", + "{\\sum_{c=0}^{9} \\exp{(\\boldsymbol{a}^T \\boldsymbol{w}_c)}} ,$$ \n", + "\n", + "i.e. each neuron $j$ outputs the probability of being in class $j$ given an input from the hidden layer $\\boldsymbol{a}$, with $\\boldsymbol{w}_j$ the weights of neuron $j$ to the inputs. \n", + "The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. \n", + "The exponent is just the weighted sum of inputs as before: \n", + "\n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i+b_j.$$ \n", + "\n", + "Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500\n", + "weights to the output layer." + ] + }, + { + "cell_type": "markdown", + "id": "867b3b89", + "metadata": { + "editable": true + }, + "source": [ + "## Weights and biases\n", + "\n", + "Typically weights are initialized with small values distributed around zero, drawn from a uniform\n", + "or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless. \n", + "\n", + "Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range\n", + "of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: \n", + "\n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i + b_j.$$ \n", + "\n", + "The bias weights $\\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8ec462da", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# building our neural network\n", + "\n", + "n_inputs, n_features = X_train.shape\n", + "n_hidden_neurons = 50\n", + "n_categories = 10\n", + "\n", + "# we make the weights normally distributed using numpy.random.randn\n", + "\n", + "# weights and bias in the hidden layer\n", + "hidden_weights = np.random.randn(n_features, n_hidden_neurons)\n", + "hidden_bias = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "output_weights = np.random.randn(n_hidden_neurons, n_categories)\n", + "output_bias = np.zeros(n_categories) + 0.01" + ] + }, + { + "cell_type": "markdown", + "id": "cf228009", + "metadata": { + "editable": true + }, + "source": [ + "## Feed-forward pass\n", + "\n", + "Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. \n", + "For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: \n", + "\n", + "$$ z_{j}^{l} = \\sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$\n", + "\n", + "this is then passed through our activation function \n", + "\n", + "$$ a_{j}^{l} = f(z_{j}^{l}) .$$ \n", + "\n", + "We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: \n", + "\n", + "$$ z_{j}^{L} = \\sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ \n", + "\n", + "Finally we calculate the output of neuron $j$ in the output layer using the softmax function: \n", + "\n", + "$$ a_{j}^{L} = \\frac{\\exp{(z_j^{L})}}\n", + "{\\sum_{c=0}^{C-1} \\exp{(z_c^{L})}} .$$" + ] + }, + { + "cell_type": "markdown", + "id": "c57ea8b9", + "metadata": { + "editable": true + }, + "source": [ + "## Matrix multiplications\n", + "\n", + "Since our data has the dimensions $X = (n_{inputs}, n_{features})$ and our weights to the hidden\n", + "layer have the dimensions \n", + "$W_{hidden} = (n_{features}, n_{hidden})$,\n", + "we can easily feed the network all our training data in one go by taking the matrix product \n", + "\n", + "$$ X W^{h} = (n_{inputs}, n_{hidden}),$$ \n", + "\n", + "and obtain a matrix that holds the weighted sum of inputs to the hidden layer\n", + "for each input image and each hidden neuron. \n", + "We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: \n", + "\n", + "$$ \\boldsymbol{z}^{l} = \\boldsymbol{X} \\boldsymbol{W}^{l} + \\boldsymbol{b}^{l} ,$$\n", + "\n", + "meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. \n", + "This is then passed through the activation: \n", + "\n", + "$$ \\boldsymbol{a}^{l} = f(\\boldsymbol{z}^l) .$$ \n", + "\n", + "This is fed to the output layer: \n", + "\n", + "$$ \\boldsymbol{z}^{L} = \\boldsymbol{a}^{L} \\boldsymbol{W}^{L} + \\boldsymbol{b}^{L} .$$\n", + "\n", + "Finally we receive our output values for each image and each category by passing it through the softmax function: \n", + "\n", + "$$ output = softmax (\\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .$$" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9c286c15", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# setup the feed-forward pass, subscript h = hidden layer\n", + "\n", + "def sigmoid(x):\n", + " return 1/(1 + np.exp(-x))\n", + "\n", + "def feed_forward(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " \n", + " return probabilities\n", + "\n", + "probabilities = feed_forward(X_train)\n", + "print(\"probabilities = (n_inputs, n_categories) = \" + str(probabilities.shape))\n", + "print(\"probability that image 0 is in category 0,1,2,...,9 = \\n\" + str(probabilities[0]))\n", + "print(\"probabilities sum up to: \" + str(probabilities[0].sum()))\n", + "print()\n", + "\n", + "# we obtain a prediction by taking the class with the highest likelihood\n", + "def predict(X):\n", + " probabilities = feed_forward(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + "predictions = predict(X_train)\n", + "print(\"predictions = (n_inputs) = \" + str(predictions.shape))\n", + "print(\"prediction for image 0: \" + str(predictions[0]))\n", + "print(\"correct label for image 0: \" + str(Y_train[0]))" + ] + }, + { + "cell_type": "markdown", + "id": "a6cf75c3", + "metadata": { + "editable": true + }, + "source": [ + "## Choose cost function and optimizer\n", + "\n", + "To measure how well our neural network is doing we need to introduce a cost function. \n", + "We will call the function that gives the error of a single sample output the *loss* function, and the function\n", + "that gives the total error of our network across all samples the *cost* function.\n", + "A typical choice for multiclass classification is the *cross-entropy* loss, also known as the negative log likelihood. \n", + "\n", + "In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: \n", + "\n", + "$$ y = 5 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$$ \n", + "\n", + "$$ y = 1 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$$ \n", + "\n", + "i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset. \n", + "\n", + "Let $y_{ic}$ denote the $c$-th component of the $i$-th one-hot vector. \n", + "We define the cost function $\\mathcal{C}$ as a sum over the cross-entropy loss for each point $\\boldsymbol{x}_i$ in the dataset.\n", + "\n", + "In the one-hot representation only one of the terms in the loss function is non-zero, namely the\n", + "probability of the correct category $c'$ \n", + "(i.e. the category $c'$ such that $y_{ic'} = 1$). This means that the cross entropy loss only punishes you for how wrong\n", + "you got the correct label. The probability of category $c$ is given by the softmax function. The vector $\\boldsymbol{\\theta}$ represents the parameters of our network, i.e. all the weights and biases." + ] + }, + { + "cell_type": "markdown", + "id": "e69ffdc8", + "metadata": { + "editable": true + }, + "source": [ + "## Optimizing the cost function\n", + "\n", + "The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is *gradient descent* and its generalizations. The idea behind gradient descent\n", + "is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a *local* minimum of the cost function. \n", + "Each parameter $\\theta$ is iteratively adjusted according to the rule \n", + "\n", + "$$ \\theta_{i+1} = \\theta_i - \\eta \\nabla \\mathcal{C}(\\theta_i) ,$$\n", + "\n", + "where $\\eta$ is known as the *learning rate*, which controls how big a step we take towards the minimum. \n", + "This update can be repeated for any number of iterations, or until we are satisfied with the result. \n", + "\n", + "A simple and effective improvement is a variant called *Batch Gradient Descent*. \n", + "Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient\n", + "on a subset of the data called a *minibatch*. \n", + "If there are $N$ data points and we have a minibatch size of $M$, the total number of batches\n", + "is $N/M$. \n", + "We denote each minibatch $B_k$, with $k = 1, 2,...,N/M$. The gradient then becomes: \n", + "\n", + "$$ \\nabla \\mathcal{C}(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\nabla \\mathcal{L}_i(\\theta) \\quad \\rightarrow \\quad\n", + "\\frac{1}{M} \\sum_{i \\in B_k} \\nabla \\mathcal{L}_i(\\theta) ,$$\n", + "\n", + "i.e. instead of averaging the loss over the entire dataset, we average over a minibatch. \n", + "\n", + "This has two important benefits: \n", + "1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima. \n", + "\n", + "2. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient. \n", + "\n", + "The various optmization methods, with codes and algorithms, are discussed in our lectures on [Gradient descent approaches](https://compphysics.github.io/MachineLearning/doc/pub/Splines/html/Splines-bs.html)." + ] + }, + { + "cell_type": "markdown", + "id": "ef19d1e0", + "metadata": { + "editable": true + }, + "source": [ + "## Regularization\n", + "\n", + "It is common to add an extra term to the cost function, proportional\n", + "to the size of the weights. This is equivalent to constraining the\n", + "size of the weights, so that they do not grow out of control.\n", + "Constraining the size of the weights means that the weights cannot\n", + "grow arbitrarily large to fit the training data, and in this way\n", + "reduces *overfitting*.\n", + "\n", + "We will measure the size of the weights using the so called *L2-norm*, meaning our cost function becomes: \n", + "\n", + "$$ \\mathcal{C}(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}_i(\\theta) \\quad \\rightarrow \\quad\n", + "\\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}_i(\\theta) + \\lambda \\lvert \\lvert \\boldsymbol{w} \\rvert \\rvert_2^2 \n", + "= \\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}(\\theta) + \\lambda \\sum_{ij} w_{ij}^2,$$ \n", + "\n", + "i.e. we sum up all the weights squared. The factor $\\lambda$ is known as a regularization parameter.\n", + "\n", + "In order to train the model, we need to calculate the derivative of\n", + "the cost function with respect to every bias and weight in the\n", + "network. In total our network has $(64 + 1)\\times 50=3250$ weights in\n", + "the hidden layer and $(50 + 1)\\times 10=510$ weights to the output\n", + "layer ($+1$ for the bias), and the gradient must be calculated for\n", + "every parameter. We use the *backpropagation* algorithm discussed\n", + "above. This is a clever use of the chain rule that allows us to\n", + "calculate the gradient efficently." + ] + }, + { + "cell_type": "markdown", + "id": "d93c5dfb", + "metadata": { + "editable": true + }, + "source": [ + "## Matrix multiplication\n", + "\n", + "To more efficently train our network these equations are implemented using matrix operations. \n", + "The error in the output layer is calculated simply as, with $\\boldsymbol{t}$ being our targets, \n", + "\n", + "$$ \\delta_L = \\boldsymbol{t} - \\boldsymbol{y} = (n_{inputs}, n_{categories}) .$$ \n", + "\n", + "The gradient for the output weights is calculated as \n", + "\n", + "$$ \\nabla W_{L} = \\boldsymbol{a}^T \\delta_L = (n_{hidden}, n_{categories}) ,$$\n", + "\n", + "where $\\boldsymbol{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. \n", + "Since we are going backwards we have to transpose the activation matrix. \n", + "\n", + "The gradient with respect to the output bias is then \n", + "\n", + "$$ \\nabla \\boldsymbol{b}_{L} = \\sum_{i=1}^{n_{inputs}} \\delta_L = (n_{categories}) .$$ \n", + "\n", + "The error in the hidden layer is \n", + "\n", + "$$ \\Delta_h = \\delta_L W_{L}^T \\circ f'(z_{h}) = \\delta_L W_{L}^T \\circ a_{h} \\circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ \n", + "\n", + "where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean\n", + "that we are summing up the products for each neuron in the output layer. The symbol $\\circ$ denotes\n", + "the *Hadamard product*, meaning element-wise multiplication. \n", + "\n", + "This again gives us the gradients in the hidden layer: \n", + "\n", + "$$ \\nabla W_{h} = X^T \\delta_h = (n_{features}, n_{hidden}) ,$$ \n", + "\n", + "$$ \\nabla b_{h} = \\sum_{i=1}^{n_{inputs}} \\delta_h = (n_{hidden}) .$$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0a62b82a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# to categorical turns our integer vector into a onehot representation\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "# one-hot in numpy\n", + "def to_categorical_numpy(integer_vector):\n", + " n_inputs = len(integer_vector)\n", + " n_categories = np.max(integer_vector) + 1\n", + " onehot_vector = np.zeros((n_inputs, n_categories))\n", + " onehot_vector[range(n_inputs), integer_vector] = 1\n", + " \n", + " return onehot_vector\n", + "\n", + "#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test)\n", + "Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test)\n", + "\n", + "def feed_forward_train(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " \n", + " # for backpropagation need activations in hidden and output layers\n", + " return a_h, probabilities\n", + "\n", + "def backpropagation(X, Y):\n", + " a_h, probabilities = feed_forward_train(X)\n", + " \n", + " # error in the output layer\n", + " error_output = probabilities - Y\n", + " # error in the hidden layer\n", + " error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h)\n", + " \n", + " # gradients for the output layer\n", + " output_weights_gradient = np.matmul(a_h.T, error_output)\n", + " output_bias_gradient = np.sum(error_output, axis=0)\n", + " \n", + " # gradient for the hidden layer\n", + " hidden_weights_gradient = np.matmul(X.T, error_hidden)\n", + " hidden_bias_gradient = np.sum(error_hidden, axis=0)\n", + "\n", + " return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient\n", + "\n", + "print(\"Old accuracy on training data: \" + str(accuracy_score(predict(X_train), Y_train)))\n", + "\n", + "eta = 0.01\n", + "lmbd = 0.01\n", + "for i in range(1000):\n", + " # calculate gradients\n", + " dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot)\n", + " \n", + " # regularization term gradients\n", + " dWo += lmbd * output_weights\n", + " dWh += lmbd * hidden_weights\n", + " \n", + " # update weights and biases\n", + " output_weights -= eta * dWo\n", + " output_bias -= eta * dBo\n", + " hidden_weights -= eta * dWh\n", + " hidden_bias -= eta * dBh\n", + "\n", + "print(\"New accuracy on training data: \" + str(accuracy_score(predict(X_train), Y_train)))" + ] + }, + { + "cell_type": "markdown", + "id": "b666f091", + "metadata": { + "editable": true + }, + "source": [ + "## Improving performance\n", + "\n", + "As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image. \n", + "In order to obtain a network that does something useful, we will have to do a bit more work. \n", + "\n", + "The choice of *hyperparameters* such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a *grid-search* is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates $\\eta = 10^{-6}, 10^{-5},...,10^{-1}$ with different regularization parameters $\\lambda = 10^{-6},...,10^{-0}$. \n", + "\n", + "Next, we haven't implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an *iteration*, and a full training period\n", + "going through the entire dataset ($n/M$ batches) an *epoch*.\n", + "\n", + "If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers. \n", + "Andrew Ng goes through some of these considerations in this [video](https://youtu.be/F1ka6a13S9I). You can find a summary of the video [here](https://kevinzakka.github.io/2016/09/26/applying-deep-learning/)." + ] + }, + { + "cell_type": "markdown", + "id": "79055893", + "metadata": { + "editable": true + }, + "source": [ + "## Full object-oriented implementation\n", + "\n", + "It is very natural to think of the network as an object, with specific instances of the network\n", + "being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "85af4a1c", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "class NeuralNetwork:\n", + " def __init__(\n", + " self,\n", + " X_data,\n", + " Y_data,\n", + " n_hidden_neurons=50,\n", + " n_categories=10,\n", + " epochs=10,\n", + " batch_size=100,\n", + " eta=0.1,\n", + " lmbd=0.0):\n", + "\n", + " self.X_data_full = X_data\n", + " self.Y_data_full = Y_data\n", + "\n", + " self.n_inputs = X_data.shape[0]\n", + " self.n_features = X_data.shape[1]\n", + " self.n_hidden_neurons = n_hidden_neurons\n", + " self.n_categories = n_categories\n", + "\n", + " self.epochs = epochs\n", + " self.batch_size = batch_size\n", + " self.iterations = self.n_inputs // self.batch_size\n", + " self.eta = eta\n", + " self.lmbd = lmbd\n", + "\n", + " self.create_biases_and_weights()\n", + "\n", + " def create_biases_and_weights(self):\n", + " self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons)\n", + " self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01\n", + "\n", + " self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories)\n", + " self.output_bias = np.zeros(self.n_categories) + 0.01\n", + "\n", + " def feed_forward(self):\n", + " # feed-forward for training\n", + " self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias\n", + " self.a_h = sigmoid(self.z_h)\n", + "\n", + " self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias\n", + "\n", + " exp_term = np.exp(self.z_o)\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + "\n", + " def feed_forward_out(self, X):\n", + " # feed-forward for output\n", + " z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias\n", + " a_h = sigmoid(z_h)\n", + "\n", + " z_o = np.matmul(a_h, self.output_weights) + self.output_bias\n", + " \n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " return probabilities\n", + "\n", + " def backpropagation(self):\n", + " error_output = self.probabilities - self.Y_data\n", + " error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h)\n", + "\n", + " self.output_weights_gradient = np.matmul(self.a_h.T, error_output)\n", + " self.output_bias_gradient = np.sum(error_output, axis=0)\n", + "\n", + " self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden)\n", + " self.hidden_bias_gradient = np.sum(error_hidden, axis=0)\n", + "\n", + " if self.lmbd > 0.0:\n", + " self.output_weights_gradient += self.lmbd * self.output_weights\n", + " self.hidden_weights_gradient += self.lmbd * self.hidden_weights\n", + "\n", + " self.output_weights -= self.eta * self.output_weights_gradient\n", + " self.output_bias -= self.eta * self.output_bias_gradient\n", + " self.hidden_weights -= self.eta * self.hidden_weights_gradient\n", + " self.hidden_bias -= self.eta * self.hidden_bias_gradient\n", + "\n", + " def predict(self, X):\n", + " probabilities = self.feed_forward_out(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + " def predict_probabilities(self, X):\n", + " probabilities = self.feed_forward_out(X)\n", + " return probabilities\n", + "\n", + " def train(self):\n", + " data_indices = np.arange(self.n_inputs)\n", + "\n", + " for i in range(self.epochs):\n", + " for j in range(self.iterations):\n", + " # pick datapoints with replacement\n", + " chosen_datapoints = np.random.choice(\n", + " data_indices, size=self.batch_size, replace=False\n", + " )\n", + "\n", + " # minibatch training data\n", + " self.X_data = self.X_data_full[chosen_datapoints]\n", + " self.Y_data = self.Y_data_full[chosen_datapoints]\n", + "\n", + " self.feed_forward()\n", + " self.backpropagation()" + ] + }, + { + "cell_type": "markdown", + "id": "d0ef37e8", + "metadata": { + "editable": true + }, + "source": [ + "## Evaluate model performance on test data\n", + "\n", + "To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data. \n", + "We measure the performance of the network using the *accuracy* score. \n", + "The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of $1$. \n", + "\n", + "$$ \\text{Accuracy} = \\frac{\\sum_{i=1}^n I(\\tilde{y}_i = y_i)}{n} ,$$ \n", + "\n", + "where $I$ is the indicator function, $1$ if $\\tilde{y}_i = y_i$ and $0$ otherwise." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d2891643", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "epochs = 100\n", + "batch_size = 100\n", + "\n", + "dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + "dnn.train()\n", + "test_predict = dnn.predict(X_test)\n", + "\n", + "# accuracy score from scikit library\n", + "print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + "\n", + "# equivalent in numpy\n", + "def accuracy_score_numpy(Y_test, Y_pred):\n", + " return np.sum(Y_test == Y_pred) / len(Y_test)\n", + "\n", + "#print(\"Accuracy score on test set: \", accuracy_score_numpy(Y_test, test_predict))" + ] + }, + { + "cell_type": "markdown", + "id": "5c91c8fc", + "metadata": { + "editable": true + }, + "source": [ + "## Adjust hyperparameters\n", + "\n", + "We now perform a grid search to find the optimal hyperparameters for the network. \n", + "Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\\%$ ($2\\%$ error rate)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c245d23d", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store the models for later use\n", + "DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "# grid search\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + " dnn.train()\n", + " \n", + " DNN_numpy[i][j] = dnn\n", + " \n", + " test_predict = dnn.predict(X_test)\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "ea3be61a", + "metadata": { + "editable": true + }, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d26e1748", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# visual representation of grid search\n", + "# uses seaborn heatmap, you can also do this with matplotlib imshow\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_numpy[i][j]\n", + " \n", + " train_pred = dnn.predict(X_train) \n", + " test_pred = dnn.predict(X_test)\n", + "\n", + " train_accuracy[i][j] = accuracy_score(Y_train, train_pred)\n", + " test_accuracy[i][j] = accuracy_score(Y_test, test_pred)\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "572f3f4b", + "metadata": { + "editable": true + }, + "source": [ + "## scikit-learn implementation\n", + "\n", + "**scikit-learn** focuses more\n", + "on traditional machine learning methods, such as regression,\n", + "clustering, decision trees, etc. As such, it has only two types of\n", + "neural networks: Multi Layer Perceptron outputting continuous values,\n", + "*MPLRegressor*, and Multi Layer Perceptron outputting labels,\n", + "*MLPClassifier*. We will see how simple it is to use these classes.\n", + "\n", + "**scikit-learn** implements a few improvements from our neural network,\n", + "such as early stopping, a varying learning rate, different\n", + "optimization methods, etc. We would therefore expect a better\n", + "performance overall." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "fdb38053", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "from sklearn.neural_network import MLPClassifier\n", + "# store models for later use\n", + "DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X_train, Y_train)\n", + " \n", + " DNN_scikit[i][j] = dnn\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", dnn.score(X_test, Y_test))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "5fc3dd13", + "metadata": { + "editable": true + }, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cd9e4505", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# optional\n", + "# visual representation of grid search\n", + "# uses seaborn heatmap, could probably do this in matplotlib\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_scikit[i][j]\n", + " \n", + " train_pred = dnn.predict(X_train) \n", + " test_pred = dnn.predict(X_test)\n", + "\n", + " train_accuracy[i][j] = accuracy_score(Y_train, train_pred)\n", + " test_accuracy[i][j] = accuracy_score(Y_test, test_pred)\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "30d61094", + "metadata": { + "editable": true + }, + "source": [ + "## Testing our code for the XOR, OR and AND gates\n", + "\n", + "Last week we discussed three different types of gates, the so-called\n", + "XOR, the OR and the AND gates. Their inputs and outputs can be\n", + "summarized using the following tables, first for the OR gate with\n", + "inputs $x_1$ and $x_2$ and outputs $y$:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 1
" + ] + }, + { + "cell_type": "markdown", + "id": "9b4cd63f", + "metadata": { + "editable": true + }, + "source": [ + "## The AND and XOR Gates\n", + "\n", + "The AND gate is defined as\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
$x_1$ $x_2$ $y$
0 0 0
0 1 0
1 0 0
1 1 1
\n", + "\n", + "And finally we have the XOR gate\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 0
" + ] + }, + { + "cell_type": "markdown", + "id": "1a2bd6f1", + "metadata": { + "editable": true + }, + "source": [ + "## Representing the Data Sets\n", + "\n", + "Our design matrix is defined by the input values $x_1$ and $x_2$. Since we have four possible outputs, our design matrix reads" + ] + }, + { + "cell_type": "markdown", + "id": "a569e669", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{X}=\\begin{bmatrix} 0 & 0 \\\\\n", + " 0 & 1 \\\\\n", + "\t\t 1 & 0 \\\\\n", + "\t\t 1 & 1 \\end{bmatrix},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "51363b82", + "metadata": { + "editable": true + }, + "source": [ + "while the vector of outputs is $\\boldsymbol{y}^T=[0,1,1,0]$ for the XOR gate, $\\boldsymbol{y}^T=[0,0,0,1]$ for the AND gate and $\\boldsymbol{y}^T=[0,1,1,1]$ for the OR gate." + ] + }, + { + "cell_type": "markdown", + "id": "e4172d21", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Neural Network\n", + "\n", + "We define first our design matrix and the various output vectors for the different gates." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b8640651", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Simple code that tests XOR, OR and AND gates with linear regression\n", + "\"\"\"\n", + "\n", + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "def sigmoid(x):\n", + " return 1/(1 + np.exp(-x))\n", + "\n", + "def feed_forward(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " probabilities = sigmoid(z_o)\n", + " return probabilities\n", + "\n", + "# we obtain a prediction by taking the class with the highest likelihood\n", + "def predict(X):\n", + " probabilities = feed_forward(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# Design matrix\n", + "X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)\n", + "\n", + "# The XOR gate\n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "# The OR gate\n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "# The AND gate\n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "\n", + "# Defining the neural network\n", + "n_inputs, n_features = X.shape\n", + "n_hidden_neurons = 2\n", + "n_categories = 2\n", + "n_features = 2\n", + "\n", + "# we make the weights normally distributed using numpy.random.randn\n", + "\n", + "# weights and bias in the hidden layer\n", + "hidden_weights = np.random.randn(n_features, n_hidden_neurons)\n", + "hidden_bias = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "output_weights = np.random.randn(n_hidden_neurons, n_categories)\n", + "output_bias = np.zeros(n_categories) + 0.01\n", + "\n", + "probabilities = feed_forward(X)\n", + "print(probabilities)\n", + "\n", + "\n", + "predictions = predict(X)\n", + "print(predictions)" + ] + }, + { + "cell_type": "markdown", + "id": "f6b2c036", + "metadata": { + "editable": true + }, + "source": [ + "Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above." + ] + }, + { + "cell_type": "markdown", + "id": "49fdf701", + "metadata": { + "editable": true + }, + "source": [ + "## The Code using Scikit-Learn" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "45dae979", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.neural_network import MLPClassifier\n", + "from sklearn.metrics import accuracy_score\n", + "import seaborn as sns\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# Design matrix\n", + "X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)\n", + "\n", + "# The XOR gate\n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "# The OR gate\n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "# The AND gate\n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "\n", + "# Defining the neural network\n", + "n_inputs, n_features = X.shape\n", + "n_hidden_neurons = 2\n", + "n_categories = 2\n", + "n_features = 2\n", + "\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store models for later use\n", + "DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "epochs = 100\n", + "\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X, yXOR)\n", + " DNN_scikit[i][j] = dnn\n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on data set: \", dnn.score(X, yXOR))\n", + " print()\n", + "\n", + "sns.set()\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_scikit[i][j]\n", + " test_pred = dnn.predict(X)\n", + " test_accuracy[i][j] = accuracy_score(yXOR, test_pred)\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/LectureNotes/_build/html/exercisesweek41.html b/doc/LectureNotes/_build/html/exercisesweek41.html new file mode 100644 index 000000000..57745c75e --- /dev/null +++ b/doc/LectureNotes/_build/html/exercisesweek41.html @@ -0,0 +1,1740 @@ + + + + + + + + Exercises week 41 — Applied Data Analysis and Machine Learning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/doc/LectureNotes/_build/html/genindex.html b/doc/LectureNotes/_build/html/genindex.html index 0c5ef9d9b..947294787 100644 --- a/doc/LectureNotes/_build/html/genindex.html +++ b/doc/LectureNotes/_build/html/genindex.html @@ -309,16 +309,14 @@ const thebe_selector_output = ".output, .cell_output" Week 40: Gradient descent methods (continued) and start Neural networks - -

- - Projects - -

- diff --git a/doc/LectureNotes/_build/html/intro.html b/doc/LectureNotes/_build/html/intro.html index af623126d..31a9aa07c 100644 --- a/doc/LectureNotes/_build/html/intro.html +++ b/doc/LectureNotes/_build/html/intro.html @@ -310,16 +310,14 @@ const thebe_selector_output = ".output, .cell_output" Week 40: Gradient descent methods (continued) and start Neural networks - -

- - Projects - -

- @@ -676,8 +674,6 @@ It provides composable transformations of Python+NumPy programs: differentiate,
-
-
- @@ -314,18 +313,6 @@ const thebe_selector_output = ".output, .cell_output" -

- - Projects - -

- @@ -1289,17 +1276,17 @@ We summarize some of these here for the methods we hvae studied in project one,
Parameters for OLS using gradient descent
-[[3.53732988]
- [4.06277313]
- [4.51728978]]
+[[4.14721582]
+ [2.54760497]
+ [5.2212296 ]]
 Parameters for Ridge using gradient descent
-[[3.62671667]
- [3.79849321]
- [4.63207408]]
+[[3.75424998]
+ [3.49608088]
+ [4.78010668]]
 Parameters for Lasso using gradient descent
-[[4.1547556 ]
- [2.58013829]
- [5.20288581]]
+[[3.62716271]
+ [3.82146046]
+ [4.64516328]]
 
@@ -1351,11 +1338,11 @@ Parameters for Lasso using gradient descent [[4.] [3.] [5.]] -0 [-27.10587277] [-37.81035098] -1 [1.16209264e-13] [2.08824304e-13] -2 [8.8817842e-17] [2.62242138e-16] -3 [-1.77635684e-17] [-1.50600514e-16] -4 [-3.37507799e-16] [-2.280464e-16] +0 [-25.77106886] [-35.02189606] +1 [3.49285045e-13] [4.71505132e-13] +2 [1.24344979e-16] [3.86639832e-16] +3 [9.05941988e-16] [1.48786826e-15] +4 [-7.99360578e-16] [-1.35823372e-15] beta from own Newton code [[4.] [3.] @@ -1616,6 +1603,9 @@ function.

gamma_j after 500 epochs: 9.97108e-05
 
+

+
+
@@ -1697,15 +1687,15 @@ function.

Own inversion
-[[4.30637636]
- [2.56947078]]
-Eigenvalues of Hessian Matrix:[0.30000613 4.12600095]
+[[4.16180248]
+ [2.8250103 ]]
+Eigenvalues of Hessian Matrix:[0.26646852 4.68110474]
 theta from own gd
-[[4.30637636]
- [2.56947078]]
+[[4.16180248]
+ [2.8250103 ]]
 theta from own sdg
-[[4.34759233]
- [2.63142731]]
+[[4.16257872]
+ [2.80576215]]
 
_images/week40_34_1.png @@ -2419,12 +2409,12 @@ first example shows results with ordinary leats squares.

Own inversion
-[[3.88064505]
- [2.99072374]]
-Eigenvalues of Hessian Matrix:[0.30141906 4.73853838]
+[[3.98246764]
+ [3.04018043]]
+Eigenvalues of Hessian Matrix:[0.31541884 4.4735968 ]
 theta from own gd
-[[3.88064505]
- [2.99072374]]
+[[3.98246764]
+ [3.04018043]]
 
_images/week40_100_1.png @@ -2495,73 +2485,73 @@ theta from own gd
Own inversion
 [[4.]
  [3.]]
-Eigenvalues of Hessian Matrix:[0.31702609 3.84351715]
-0 [-13.26083712] [-12.67834752]
-1 [-0.55020405] [0.5257011]
-2 [-0.50482139] [0.48233952]
-3 [-0.46318204] [0.44255455]
-4 [-0.42497724] [0.40605118]
-5 [-0.38992371] [0.37255873]
-6 [-0.3577615] [0.34182884]
-7 [-0.32825214] [0.31363366]
-8 [-0.30117681] [0.28776411]
-9 [-0.27633474] [0.26402837]
-10 [-0.25354173] [0.24225043]
-11 [-0.23262877] [0.22226881]
-12 [-0.21344077] [0.20393534]
-13 [-0.19583547] [0.18711407]
-14 [-0.17968231] [0.17168028]
-15 [-0.16486151] [0.15751952]
-16 [-0.15126318] [0.14452678]
-17 [-0.13878649] [0.13260573]
-18 [-0.12733892] [0.12166797]
-19 [-0.11683558] [0.11163239]
-20 [-0.10719859] [0.10242458]
-21 [-0.0983565] [0.09397626]
-22 [-0.09024373] [0.08622478]
-23 [-0.08280012] [0.07911268]
-24 [-0.07597049] [0.0725872]
-25 [-0.06970419] [0.06659997]
-26 [-0.06395476] [0.06110658]
-27 [-0.05867956] [0.0560663]
-28 [-0.05383947] [0.05144177]
-29 [-0.04939861] [0.04719868]
+Eigenvalues of Hessian Matrix:[0.32799141 4.41229845]
+0 [-16.27698328] [-18.5653087]
+1 [-0.44867801] [0.37354121]
+2 [-0.41532521] [0.34577375]
+3 [-0.38445171] [0.32007041]
+4 [-0.35587321] [0.29627774]
+5 [-0.32941912] [0.27425372]
+6 [-0.30493151] [0.25386687]
+7 [-0.2822642] [0.23499549]
+8 [-0.26128189] [0.21752693]
+9 [-0.24185931] [0.20135691]
+10 [-0.22388052] [0.1863889]
+11 [-0.2072382] [0.17253354]
+12 [-0.191833] [0.15970814]
+13 [-0.17757295] [0.14783612]
+14 [-0.16437294] [0.13684661]
+15 [-0.15215415] [0.12667402]
+16 [-0.14084366] [0.11725761]
+17 [-0.13037395] [0.10854118]
+18 [-0.12068251] [0.1004727]
+19 [-0.11171148] [0.09300398]
+20 [-0.10340733] [0.08609047]
+21 [-0.09572047] [0.07969087]
+22 [-0.08860502] [0.07376699]
+23 [-0.0820185] [0.06828347]
+24 [-0.0759216] [0.06320757]
+25 [-0.07027791] [0.05850899]
+26 [-0.06505375] [0.05415968]
+27 [-0.06021793] [0.05013368]
+28 [-0.05574159] [0.04640695]
+29 [-0.051598] [0.04295726]
 theta from own gd
-[[3.85703369]
- [3.13659941]]
-0 [-0.04532405] [0.04330558]
-1 [-0.04158557] [0.03973359]
-2 [-0.03703391] [0.03538463]
-3 [-0.03261373] [0.0311613]
-4 [-0.02859759] [0.02732402]
-5 [-0.02503392] [0.02391906]
-6 [-0.02189994] [0.02092464]
-7 [-0.01915337] [0.01830039]
-8 [-0.01674956] [0.01600363]
-9 [-0.01464686] [0.01399457]
-10 [-0.01280793] [0.01223754]
-11 [-0.01119981] [0.01070103]
-12 [-0.00979357] [0.00935742]
-13 [-0.0085639] [0.00818251]
-14 [-0.00748862] [0.00715512]
-15 [-0.00654835] [0.00625672]
-16 [-0.00572613] [0.00547113]
-17 [-0.00500716] [0.00478417]
-18 [-0.00437846] [0.00418347]
-19 [-0.0038287] [0.00365819]
-20 [-0.00334797] [0.00319887]
-21 [-0.0029276] [0.00279722]
-22 [-0.00256001] [0.002446]
-23 [-0.00223857] [0.00213888]
-24 [-0.0019575] [0.00187032]
-25 [-0.00171171] [0.00163548]
-26 [-0.00149679] [0.00143013]
-27 [-0.00130885] [0.00125057]
-28 [-0.00114451] [0.00109354]
-29 [-0.00100081] [0.00095624]
+[[3.85437905]
+ [3.12123488]]
+0 [-0.04776242] [0.039764]
+1 [-0.04421197] [0.03680811]
+2 [-0.0398603] [0.03318519]
+3 [-0.03559176] [0.02963147]
+4 [-0.03166546] [0.02636268]
+5 [-0.02813369] [0.02342235]
+6 [-0.02498282] [0.02079913]
+7 [-0.02218045] [0.01846605]
+8 [-0.01969093] [0.01639344]
+9 [-0.01748034] [0.01455304]
+10 [-0.01551775] [0.0129191]
+11 [-0.01377545] [0.01146857]
+12 [-0.01222875] [0.01018089]
+13 [-0.01085571] [0.00903778]
+14 [-0.00963683] [0.00802302]
+15 [-0.0085548] [0.00712219]
+16 [-0.00759427] [0.00632251]
+17 [-0.00674158] [0.00561262]
+18 [-0.00598464] [0.00498243]
+19 [-0.00531268] [0.004423]
+20 [-0.00471617] [0.00392639]
+21 [-0.00418664] [0.00348553]
+22 [-0.00371656] [0.00309418]
+23 [-0.00329927] [0.00274676]
+24 [-0.00292882] [0.00243835]
+25 [-0.00259997] [0.00216458]
+26 [-0.00230805] [0.00192154]
+27 [-0.0020489] [0.00170579]
+28 [-0.00181885] [0.00151426]
+29 [-0.00161463] [0.00134424]
 theta from own gd wth momentum
-[[3.99723951]
- [3.00263755]]
+[[3.99562995]
+ [3.00363823]]
 
@@ -2650,18 +2640,18 @@ theta from own gd wth momentum
Own inversion
-[[3.95935439]
- [3.09360113]]
-Eigenvalues of Hessian Matrix:[0.32606139 4.1033455 ]
+[[4.10426556]
+ [2.93942872]]
+Eigenvalues of Hessian Matrix:[0.31367041 4.07517385]
 theta from own gd
-[[3.95935439]
- [3.09360113]]
+[[4.10426556]
+ [2.93942872]]
 
_images/week40_104_1.png
theta from own sdg
-[[3.96916206]
- [3.10276112]]
+[[4.08587209]
+ [2.96301764]]
 
@@ -2743,15 +2733,17 @@ theta from own gd
Own inversion
-[[4.16532977]
- [2.86943859]]
-Eigenvalues of Hessian Matrix:[0.29633608 4.22128142]
+[[4.33528448]
+ [2.81889188]]
+Eigenvalues of Hessian Matrix:[0.30916402 4.51611732]
 theta from own gd
-[[4.16445858]
- [2.87020155]]
-theta from own sdg with momentum
-[[4.149433  ]
- [2.89654756]]
+[[4.33477019]
+ [2.81931348]]
+
+
+
theta from own sdg with momentum
+[[4.40800396]
+ [2.78459458]]
 
@@ -2820,9 +2812,9 @@ theta from own sdg with momentum
theta from own AdaGrad
-[[1.99415296]
- [3.03274273]
- [3.96850191]]
+[[2.00003828]
+ [2.99979896]
+ [4.00019258]]
 
@@ -2898,9 +2890,9 @@ theta from own sdg with momentum
theta from own RMSprop
-[[2.00022969]
- [2.99954278]
- [4.00046631]]
+[[2.01129731]
+ [3.01249445]
+ [4.00885858]]
 
@@ -2980,9 +2972,9 @@ theta from own sdg with momentum
theta from own ADAM
-[[1.99991245]
- [3.00042721]
- [3.99954434]]
+[[2.00001716]
+ [2.99992107]
+ [4.00007706]]
 
@@ -3103,7 +3095,7 @@ It provides composable transformations of Python+NumPy programs: differentiate, return asarray(x, dtype=self.dtype) -
[<matplotlib.lines.Line2D at 0x11975e550>]
+
[<matplotlib.lines.Line2D at 0x11753f700>]
 
_images/week40_120_2.png @@ -3138,7 +3130,7 @@ It provides composable transformations of Python+NumPy programs: differentiate,
-
<matplotlib.collections.PathCollection at 0x11b160a60>
+
<matplotlib.collections.PathCollection at 0x11bc3a1f0>
 
_images/week40_122_1.png @@ -3818,13 +3810,6 @@ become the most popular for deep neural networks

Week 39: Optimization and Gradient Methods

- -
-

next

-

Project 1 on Machine Learning, deadline October 7 (midnight), 2024

-
- -
diff --git a/doc/LectureNotes/_build/html/week41.html b/doc/LectureNotes/_build/html/week41.html new file mode 100644 index 000000000..55032c223 --- /dev/null +++ b/doc/LectureNotes/_build/html/week41.html @@ -0,0 +1,3744 @@ + + + + + + + + Week 41 Neural networks and constructing a neural network code — Applied Data Analysis and Machine Learning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+
+ +
+ + + + + + + + + + + + + + +
+ + +
+ +
+ Contents +
+ +
+
+
+
+
+ +
+

Week 41 Neural networks and constructing a neural network code

+ +
+
+ +
+

Contents

+
+ +
+
+
+ +
+ + +
+

Week 41 Neural networks and constructing a neural network code

+

Morten Hjorth-Jensen, Department of Physics, University of Oslo

+

Date: Week 41

+
+

Plan for week 41, October 7-11

+
+
+

Material for the lecture on Monday October 7, 2024

+
    +
  1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.

  2. +
  3. Building our own Feed-forward Neural Network

  4. +
+ + +

Readings and Videos:

+
    +
  1. These lecture notes

  2. +
  3. Rashcka et al chapter 11

  4. +
  5. For neural networks we recommend Goodfellow et al chapter 6.

  6. +
+

a. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&amp;list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&amp;ab_channel=WelchLabs

+
    +
  1. Building Neural Networks from scratch at https://www.youtube.com/watch?v=Wo5dMEP_BbI&amp;list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&amp;ab_channel=sentdex

  2. +
  3. Video on Neural Networks at https://www.youtube.com/watch?v=CqOfi41LfDw

  4. +
  5. Video on the back propagation algorithm at https://www.youtube.com/watch?v=Ilg3gGewQ5U

  6. +
+

We also recommend Michael Nielsen’s intuitive approach to the neural networks and the universal approximation theorem, see the slides at http://neuralnetworksanddeeplearning.com/chap4.html.

+
+
+

Material for the active learning sessions on Tuesday and Wednesday

+
    +
  • Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation

  • +
  • One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code

  • +
  • Discussion of project 2

  • +
  • Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent

  • +
+
+
+

Lecture Monday October 7

+
+
+

Introduction to Neural networks

+

Artificial neural networks are computational systems that can learn to +perform tasks by considering examples, generally without being +programmed with any task-specific rules. It is supposed to mimic a +biological system, wherein neurons interact by sending signals in the +form of mathematical functions between layers. All layers can contain +an arbitrary number of neurons, and each connection is represented by +a weight variable.

+
+
+

Artificial neurons

+

The field of artificial neural networks has a long history of +development, and is closely connected with the advancement of computer +science and computers in general. A model of artificial neurons was +first developed by McCulloch and Pitts in 1943 to study signal +processing in the brain and has later been refined by others. The +general idea is to mimic neural networks in the human brain, which is +composed of billions of neurons that communicate with each other by +sending electrical signals. Each neuron accumulates its incoming +signals, which must exceed an activation threshold to yield an +output. If the threshold is not overcome, the neuron remains inactive, +i.e. has zero output.

+

This behaviour has inspired a simple mathematical model for an artificial neuron.

+ +
+
+\[ +\begin{equation} + y = f\left(\sum_{i=1}^n w_ix_i\right) = f(u) +\label{artificialNeuron} \tag{1} +\end{equation} +\]
+

Here, the output \(y\) of the neuron is the value of its activation function, which have as input +a weighted sum of signals \(x_i, \dots ,x_n\) received by \(n\) other neurons.

+

Conceptually, it is helpful to divide neural networks into four +categories:

+
    +
  1. general purpose neural networks for supervised learning,

  2. +
  3. neural networks designed specifically for image processing, the most prominent example of this class being Convolutional Neural Networks (CNNs),

  4. +
  5. neural networks for sequential data such as Recurrent Neural Networks (RNNs), and

  6. +
  7. neural networks for unsupervised learning such as Deep Boltzmann Machines.

  8. +
+

In natural science, DNNs and CNNs have already found numerous +applications. In statistical physics, they have been applied to detect +phase transitions in 2D Ising and Potts models, lattice gauge +theories, and different phases of polymers, or solving the +Navier-Stokes equation in weather forecasting. Deep learning has also +found interesting applications in quantum physics. Various quantum +phase transitions can be detected and studied using DNNs and CNNs, +topological phases, and even non-equilibrium many-body +localization. Representing quantum states as DNNs quantum state +tomography are among some of the impressive achievements to reveal the +potential of DNNs to facilitate the study of quantum systems.

+

In quantum information theory, it has been shown that one can perform +gate decompositions with the help of neural.

+

The applications are not limited to the natural sciences. There is a +plethora of applications in essentially all disciplines, from the +humanities to life science and medicine.

+
+
+

Neural network types

+

An artificial neural network (ANN), is a computational model that +consists of layers of connected neurons, or nodes or units. We will +refer to these interchangeably as units or nodes, and sometimes as +neurons.

+

It is supposed to mimic a biological nervous system by letting each +neuron interact with other neurons by sending signals in the form of +mathematical functions between layers. A wide variety of different +ANNs have been developed, but most of them consist of an input layer, +an output layer and eventual layers in-between, called hidden +layers. All layers can contain an arbitrary number of nodes, and each +connection between two nodes is associated with a weight variable.

+

Neural networks (also called neural nets) are neural-inspired +nonlinear models for supervised learning. As we will see, neural nets +can be viewed as natural, more powerful extensions of supervised +learning methods such as linear and logistic regression and soft-max +methods we discussed earlier.

+
+
+

Feed-forward neural networks

+

The feed-forward neural network (FFNN) was the first and simplest type +of ANNs that were devised. In this network, the information moves in +only one direction: forward through the layers.

+

Nodes are represented by circles, while the arrows display the +connections between the nodes, including the direction of information +flow. Additionally, each arrow corresponds to a weight variable +(figure to come). We observe that each node in a layer is connected +to all nodes in the subsequent layer, making this a so-called +fully-connected FFNN.

+
+
+

Convolutional Neural Network

+

A different variant of FFNNs are convolutional neural networks +(CNNs), which have a connectivity pattern inspired by the animal +visual cortex. Individual neurons in the visual cortex only respond to +stimuli from small sub-regions of the visual field, called a receptive +field. This makes the neurons well-suited to exploit the strong +spatially local correlation present in natural images. The response of +each neuron can be approximated mathematically as a convolution +operation. (figure to come)

+

Convolutional neural networks emulate the behaviour of neurons in the +visual cortex by enforcing a local connectivity pattern between +nodes of adjacent layers: Each node in a convolutional layer is +connected only to a subset of the nodes in the previous layer, in +contrast to the fully-connected FFNN. Often, CNNs consist of several +convolutional layers that learn local features of the input, with a +fully-connected layer at the end, which gathers all the local data and +produces the outputs. They have wide applications in image and video +recognition.

+
+
+

Recurrent neural networks

+

So far we have only mentioned ANNs where information flows in one +direction: forward. Recurrent neural networks on the other hand, +have connections between nodes that form directed cycles. This +creates a form of internal memory which are able to capture +information on what has been calculated before; the output is +dependent on the previous computations. Recurrent NNs make use of +sequential information by performing the same task for every element +in a sequence, where each element depends on previous elements. An +example of such information is sentences, making recurrent NNs +especially well-suited for handwriting and speech recognition.

+
+
+

Other types of networks

+

There are many other kinds of ANNs that have been developed. One type +that is specifically designed for interpolation in multidimensional +space is the radial basis function (RBF) network. RBFs are typically +made up of three layers: an input layer, a hidden layer with +non-linear radial symmetric activation functions and a linear output +layer (‘’linear’’ here means that each node in the output layer has a +linear activation function). The layers are normally fully-connected +and there are no cycles, thus RBFs can be viewed as a type of +fully-connected FFNN. They are however usually treated as a separate +type of NN due the unusual activation functions.

+
+
+

Multilayer perceptrons

+

One uses often so-called fully-connected feed-forward neural networks +with three or more layers (an input layer, one or more hidden layers +and an output layer) consisting of neurons that have non-linear +activation functions.

+

Such networks are often called multilayer perceptrons (MLPs).

+
+
+

Why multilayer perceptrons?

+

According to the Universal approximation theorem, a feed-forward +neural network with just a single hidden layer containing a finite +number of neurons can approximate a continuous multidimensional +function to arbitrary accuracy, assuming the activation function for +the hidden layer is a non-constant, bounded and +monotonically-increasing continuous function.

+

Note that the requirements on the activation function only applies to +the hidden layer, the output nodes are always assumed to be linear, so +as to not restrict the range of output values.

+
+
+

Illustration of a single perceptron model and a multi-perceptron model

+ + +

Figure 1: In a) we show a single perceptron model while in b) we dispay a network with two hidden layers, an input layer and an output layer.

+
+
+

Examples of XOR, OR and AND gates

+

Let us first try to fit various gates using standard linear +regression. The gates we are thinking of are the classical XOR, OR and +AND gates, well-known elements in computer science. The tables here +show how we can set up the inputs \(x_1\) and \(x_2\) in order to yield a +specific target \(y_i\).

+
+
+
"""
+Simple code that tests XOR, OR and AND gates with linear regression
+"""
+
+import numpy as np
+# Design matrix
+X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
+print(f"The X.TX  matrix:{X.T @ X}")
+Xinv = np.linalg.pinv(X.T @ X)
+print(f"The invers of X.TX  matrix:{Xinv}")
+
+# The XOR gate 
+yXOR = np.array( [ 0, 1 ,1, 0])
+ThetaXOR  = Xinv @ X.T @ yXOR
+print(f"The values of theta for the XOR gate:{ThetaXOR}")
+print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
+
+
+# The OR gate 
+yOR = np.array( [ 0, 1 ,1, 1])
+ThetaOR  = Xinv @ X.T @ yOR
+print(f"The values of theta for the OR gate:{ThetaOR}")
+print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
+
+
+# The OR gate 
+yAND = np.array( [ 0, 0 ,0, 1])
+ThetaAND  = Xinv @ X.T @ yAND
+print(f"The values of theta for the AND gate:{ThetaAND}")
+print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
+
+
+
+
+
The X.TX  matrix:[[4. 2. 2.]
+ [2. 2. 1.]
+ [2. 1. 2.]]
+The invers of X.TX  matrix:[[ 7.50000000e-01 -5.00000000e-01 -5.00000000e-01]
+ [-5.00000000e-01  1.00000000e+00 -2.27693602e-16]
+ [-5.00000000e-01  9.94484047e-17  1.00000000e+00]]
+The values of theta for the XOR gate:[ 5.00000000e-01 -2.22044605e-16 -1.11022302e-16]
+The linear regression prediction  for the XOR gate:[0.5 0.5 0.5 0.5]
+The values of theta for the OR gate:[0.25 0.5  0.5 ]
+The linear regression prediction  for the OR gate:[0.25 0.75 0.75 1.25]
+The values of theta for the AND gate:[-0.25  0.5   0.5 ]
+The linear regression prediction  for the AND gate:[-0.25  0.25  0.25  0.75]
+
+
+
+
+

What is happening here?

+
+
+

Does Logistic Regression do a better Job?

+
+
+
%matplotlib inline
+
+"""
+Simple code that tests XOR and OR gates with linear regression
+and logistic regression
+"""
+
+import matplotlib.pyplot as plt
+from sklearn.linear_model import LogisticRegression
+import numpy as np
+
+# Design matrix
+X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
+print(f"The X.TX  matrix:{X.T @ X}")
+Xinv = np.linalg.pinv(X.T @ X)
+print(f"The invers of X.TX  matrix:{Xinv}")
+
+# The XOR gate 
+yXOR = np.array( [ 0, 1 ,1, 0])
+ThetaXOR  = Xinv @ X.T @ yXOR
+print(f"The values of theta for the XOR gate:{ThetaXOR}")
+print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
+
+
+# The OR gate 
+yOR = np.array( [ 0, 1 ,1, 1])
+ThetaOR  = Xinv @ X.T @ yOR
+print(f"The values of theta for the OR gate:{ThetaOR}")
+print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
+
+
+# The OR gate 
+yAND = np.array( [ 0, 0 ,0, 1])
+ThetaAND  = Xinv @ X.T @ yAND
+print(f"The values of theta for the AND gate:{ThetaAND}")
+print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
+
+# Now we change to logistic regression
+
+
+# Logistic Regression
+logreg = LogisticRegression()
+logreg.fit(X, yOR)
+print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR)))
+
+logreg.fit(X, yXOR)
+print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR)))
+
+
+logreg.fit(X, yAND)
+print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND)))
+
+
+
+
+
The X.TX  matrix:[[4. 2. 2.]
+ [2. 2. 1.]
+ [2. 1. 2.]]
+The invers of X.TX  matrix:[[ 7.50000000e-01 -5.00000000e-01 -5.00000000e-01]
+ [-5.00000000e-01  1.00000000e+00 -2.27693602e-16]
+ [-5.00000000e-01  9.94484047e-17  1.00000000e+00]]
+The values of theta for the XOR gate:[ 5.00000000e-01 -2.22044605e-16 -1.11022302e-16]
+The linear regression prediction  for the XOR gate:[0.5 0.5 0.5 0.5]
+The values of theta for the OR gate:[0.25 0.5  0.5 ]
+The linear regression prediction  for the OR gate:[0.25 0.75 0.75 1.25]
+The values of theta for the AND gate:[-0.25  0.5   0.5 ]
+The linear regression prediction  for the AND gate:[-0.25  0.25  0.25  0.75]
+Test set accuracy with Logistic Regression for OR gate: 0.75
+Test set accuracy with Logistic Regression for XOR gate: 0.50
+Test set accuracy with Logistic Regression for AND gate: 0.75
+
+
+
+
+

Not exactly impressive, but somewhat better.

+
+
+

Adding Neural Networks

+
+
+
# and now neural networks with Scikit-Learn and the XOR
+
+from sklearn.neural_network import MLPClassifier
+from sklearn.datasets import make_classification
+X, yXOR = make_classification(n_samples=100, random_state=1)
+FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)
+FFNN.predict_proba(X)
+print(f"Test set accuracy with Feed Forward Neural Network  for XOR gate:{FFNN.score(X, yXOR)}")
+
+
+
+
+
Test set accuracy with Feed Forward Neural Network  for XOR gate:1.0
+
+
+
+
+
+
+

Mathematical model

+

The output \(y\) is produced via the activation function \(f\)

+
+\[ +y = f\left(\sum_{i=1}^n w_ix_i + b_i\right) = f(z), +\]
+

This function receives \(x_i\) as inputs. +Here the activation \(z=(\sum_{i=1}^n w_ix_i+b_i)\). +In an FFNN of such neurons, the inputs \(x_i\) are the outputs of +the neurons in the preceding layer. Furthermore, an MLP is +fully-connected, which means that each neuron receives a weighted sum +of the outputs of all neurons in the previous layer.

+
+
+

Mathematical model

+

First, for each node \(i\) in the first hidden layer, we calculate a weighted sum \(z_i^1\) of the input coordinates \(x_j\),

+ +
+
+\[ +\begin{equation} z_i^1 = \sum_{j=1}^{M} w_{ij}^1 x_j + b_i^1 +\label{_auto1} \tag{2} +\end{equation} +\]
+

Here \(b_i\) is the so-called bias which is normally needed in +case of zero activation weights or inputs. How to fix the biases and +the weights will be discussed below. The value of \(z_i^1\) is the +argument to the activation function \(f_i\) of each node \(i\), The +variable \(M\) stands for all possible inputs to a given node \(i\) in the +first layer. We define the output \(y_i^1\) of all neurons in layer 1 as

+ +
+
+\[ +\begin{equation} + y_i^1 = f(z_i^1) = f\left(\sum_{j=1}^M w_{ij}^1 x_j + b_i^1\right) +\label{outputLayer1} \tag{3} +\end{equation} +\]
+

where we assume that all nodes in the same layer have identical +activation functions, hence the notation \(f\). In general, we could assume in the more general case that different layers have different activation functions. +In this case we would identify these functions with a superscript \(l\) for the \(l\)-th layer,

+ +
+
+\[ +\begin{equation} + y_i^l = f^l(u_i^l) = f^l\left(\sum_{j=1}^{N_{l-1}} w_{ij}^l y_j^{l-1} + b_i^l\right) +\label{generalLayer} \tag{4} +\end{equation} +\]
+

where \(N_l\) is the number of nodes in layer \(l\). When the output of +all the nodes in the first hidden layer are computed, the values of +the subsequent layer can be calculated and so forth until the output +is obtained.

+
+
+

Mathematical model

+

The output of neuron \(i\) in layer 2 is thus,

+ +
+
+\[ +\begin{equation} + y_i^2 = f^2\left(\sum_{j=1}^N w_{ij}^2 y_j^1 + b_i^2\right) +\label{_auto2} \tag{5} +\end{equation} +\]
+ +
+
+\[ +\begin{equation} + = f^2\left[\sum_{j=1}^N w_{ij}^2f^1\left(\sum_{k=1}^M w_{jk}^1 x_k + b_j^1\right) + b_i^2\right] +\label{outputLayer2} \tag{6} +\end{equation} +\]
+

where we have substituted \(y_k^1\) with the inputs \(x_k\). Finally, the ANN output reads

+ +
+
+\[ +\begin{equation} + y_i^3 = f^3\left(\sum_{j=1}^N w_{ij}^3 y_j^2 + b_i^3\right) +\label{_auto3} \tag{7} +\end{equation} +\]
+ +
+
+\[ +\begin{equation} + = f_3\left[\sum_{j} w_{ij}^3 f^2\left(\sum_{k} w_{jk}^2 f^1\left(\sum_{m} w_{km}^1 x_m + b_k^1\right) + b_j^2\right) + + b_1^3\right] +\label{_auto4} \tag{8} +\end{equation} +\]
+
+
+

Mathematical model

+

We can generalize this expression to an MLP with \(l\) hidden +layers. The complete functional form is,

+ +
+
+\[ +\begin{equation} +y^{l+1}_i = f^{l+1}\left[\!\sum_{j=1}^{N_l} w_{ij}^3 f^l\left(\sum_{k=1}^{N_{l-1}}w_{jk}^{l-1}\left(\dots f^1\left(\sum_{n=1}^{N_0} w_{mn}^1 x_n+ b_m^1\right)\dots\right)+b_k^2\right)+b_1^3\right] +\label{completeNN} \tag{9} +\end{equation} +\]
+

which illustrates a basic property of MLPs: The only independent +variables are the input values \(x_n\).

+
+
+

Mathematical model

+

This confirms that an MLP, despite its quite convoluted mathematical +form, is nothing more than an analytic function, specifically a +mapping of real-valued vectors \(\hat{x} \in \mathbb{R}^n \rightarrow +\hat{y} \in \mathbb{R}^m\).

+

Furthermore, the flexibility and universality of an MLP can be +illustrated by realizing that the expression is essentially a nested +sum of scaled activation functions of the form

+ +
+
+\[ +\begin{equation} + f(x) = c_1 f(c_2 x + c_3) + c_4 +\label{_auto5} \tag{10} +\end{equation} +\]
+

where the parameters \(c_i\) are weights and biases. By adjusting these +parameters, the activation functions can be shifted up and down or +left and right, change slope or be rescaled which is the key to the +flexibility of a neural network.

+
+

Matrix-vector notation

+

We can introduce a more convenient notation for the activations in an A NN.

+

Additionally, we can represent the biases and activations +as layer-wise column vectors \(\hat{b}_l\) and \(\hat{y}_l\), so that the \(i\)-th element of each vector +is the bias \(b_i^l\) and activation \(y_i^l\) of node \(i\) in layer \(l\) respectively.

+

We have that \(\mathrm{W}_l\) is an \(N_{l-1} \times N_l\) matrix, while \(\hat{b}_l\) and \(\hat{y}_l\) are \(N_l \times 1\) column vectors. +With this notation, the sum becomes a matrix-vector multiplication, and we can write +the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as

+ +
+
+\[\begin{split} +\begin{equation} + \hat{y}_2 = f_2(\mathrm{W}_2 \hat{y}_{1} + \hat{b}_{2}) = + f_2\left(\left[\begin{array}{ccc} + w^2_{11} &w^2_{12} &w^2_{13} \\ + w^2_{21} &w^2_{22} &w^2_{23} \\ + w^2_{31} &w^2_{32} &w^2_{33} \\ + \end{array} \right] \cdot + \left[\begin{array}{c} + y^1_1 \\ + y^1_2 \\ + y^1_3 \\ + \end{array}\right] + + \left[\begin{array}{c} + b^2_1 \\ + b^2_2 \\ + b^2_3 \\ + \end{array}\right]\right). +\label{_auto6} \tag{11} +\end{equation} +\end{split}\]
+
+
+

Matrix-vector notation and activation

+

The activation of node \(i\) in layer 2 is

+ +
+
+\[ +\begin{equation} + y^2_i = f_2\Bigr(w^2_{i1}y^1_1 + w^2_{i2}y^1_2 + w^2_{i3}y^1_3 + b^2_i\Bigr) = + f_2\left(\sum_{j=1}^3 w^2_{ij} y_j^1 + b^2_i\right). +\label{_auto7} \tag{12} +\end{equation} +\]
+

This is not just a convenient and compact notation, but also a useful +and intuitive way to think about MLPs: The output is calculated by a +series of matrix-vector multiplications and vector additions that are +used as input to the activation functions. For each operation +\(\mathrm{W}_l \hat{y}_{l-1}\) we move forward one layer.

+
+
+

Activation functions

+

A property that characterizes a neural network, other than its +connectivity, is the choice of activation function(s). As described +in, the following restrictions are imposed on an activation function +for a FFNN to fulfill the universal approximation theorem

+
    +
  • Non-constant

  • +
  • Bounded

  • +
  • Monotonically-increasing

  • +
  • Continuous

  • +
+
+
+

Activation functions, Logistic and Hyperbolic ones

+

The second requirement excludes all linear functions. Furthermore, in +a MLP with only linear activation functions, each layer simply +performs a linear transformation of its inputs.

+

Regardless of the number of layers, the output of the NN will be +nothing but a linear function of the inputs. Thus we need to introduce +some kind of non-linearity to the NN to be able to fit non-linear +functions Typical examples are the logistic Sigmoid

+
+\[ +f(x) = \frac{1}{1 + e^{-x}}, +\]
+

and the hyperbolic tangent function

+
+\[ +f(x) = \tanh(x) +\]
+
+
+

Relevance

+

The sigmoid function are more biologically plausible because the +output of inactive neurons are zero. Such activation function are +called one-sided. However, it has been shown that the hyperbolic +tangent performs better than the sigmoid for training MLPs. has +become the most popular for deep neural networks

+
+
+
"""The sigmoid function (or the logistic curve) is a 
+function that takes any real number, z, and outputs a number (0,1).
+It is useful in neural networks for assigning weights on a relative scale.
+The value z is the weighted sum of parameters involved in the learning algorithm."""
+
+import numpy
+import matplotlib.pyplot as plt
+import math as mt
+
+z = numpy.arange(-5, 5, .1)
+sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))
+sigma = sigma_fn(z)
+
+fig = plt.figure()
+ax = fig.add_subplot(111)
+ax.plot(z, sigma)
+ax.set_ylim([-0.1, 1.1])
+ax.set_xlim([-5,5])
+ax.grid(True)
+ax.set_xlabel('z')
+ax.set_title('sigmoid function')
+
+plt.show()
+
+"""Step Function"""
+z = numpy.arange(-5, 5, .02)
+step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)
+step = step_fn(z)
+
+fig = plt.figure()
+ax = fig.add_subplot(111)
+ax.plot(z, step)
+ax.set_ylim([-0.5, 1.5])
+ax.set_xlim([-5,5])
+ax.grid(True)
+ax.set_xlabel('z')
+ax.set_title('step function')
+
+plt.show()
+
+"""Sine Function"""
+z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)
+t = numpy.sin(z)
+
+fig = plt.figure()
+ax = fig.add_subplot(111)
+ax.plot(z, t)
+ax.set_ylim([-1.0, 1.0])
+ax.set_xlim([-2*mt.pi,2*mt.pi])
+ax.grid(True)
+ax.set_xlabel('z')
+ax.set_title('sine function')
+
+plt.show()
+
+"""Plots a graph of the squashing function used by a rectified linear
+unit"""
+z = numpy.arange(-2, 2, .1)
+zero = numpy.zeros(len(z))
+y = numpy.max([zero, z], axis=0)
+
+fig = plt.figure()
+ax = fig.add_subplot(111)
+ax.plot(z, y)
+ax.set_ylim([-2.0, 2.0])
+ax.set_xlim([-2.0, 2.0])
+ax.grid(True)
+ax.set_xlabel('z')
+ax.set_title('Rectified linear unit')
+
+plt.show()
+
+
+
+
+_images/week41_59_0.png +_images/week41_59_1.png +_images/week41_59_2.png +_images/week41_59_3.png +
+
+
+
+
+

The multilayer perceptron (MLP)

+

The multilayer perceptron is a very popular, and easy to implement approach, to deep learning. It consists of

+
    +
  1. A neural network with one or more layers of nodes between the input and the output nodes.

  2. +
  3. The multilayer network structure, or architecture, or topology, consists of an input layer, one or more hidden layers, and one output layer.

  4. +
  5. The input nodes pass values to the first hidden layer, its nodes pass the information on to the second and so on till we reach the output layer.

  6. +
+

As a convention it is normal to call a network with one layer of input units, one layer of hidden +units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.

+

For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +Hereafter we will call the various entities of a layer for nodes. +There are also no connections within a single layer.

+

The number of input nodes does not need to equal the number of output +nodes. This applies also to the hidden layers. Each layer may have its +own number of nodes and activation functions.

+

The hidden layers have their name from the fact that they are not +linked to observables and as we will see below when we define the +so-called activation \(\hat{z}\), we can think of this as a basis +expansion of the original inputs \(\hat{x}\). The difference however +between neural networks and say linear regression is that now these +basis functions (which will correspond to the weights in the network) +are learned from data. This results in an important difference between +neural networks and deep learning approaches on one side and methods +like logistic regression or linear regression and their modifications on the other side.

+
+
+

From one to many layers, the universal approximation theorem

+

A neural network with only one layer, what we called the simple +perceptron, is best suited if we have a standard binary model with +clear (linear) boundaries between the outcomes. As such it could +equally well be replaced by standard linear regression or logistic +regression. Networks with one or more hidden layers approximate +systems with more complex boundaries.

+

As stated earlier, +an important theorem in studies of neural networks, restated without +proof here, is the universal approximation +theorem.

+

It states that a feed-forward network with a single hidden layer +containing a finite number of neurons can approximate continuous +functions on compact subsets of real functions. The theorem thus +states that simple neural networks can represent a wide variety of +interesting functions when given appropriate parameters. It is the +multilayer feedforward architecture itself which gives neural networks +the potential of being universal approximators.

+
+
+

Deriving the back propagation code for a multilayer perceptron model

+

As we have seen now in a feed forward network, we can express the final output of our network in terms of basic matrix-vector multiplications. +The unknowwn quantities are our weights \(w_{ij}\) and we need to find an algorithm for changing them so that our errors are as small as possible. +This leads us to the famous back propagation algorithm.

+

The questions we want to ask are how do changes in the biases and the +weights in our network change the cost function and how can we use the +final output to modify the weights?

+

To derive these equations let us start with a plain regression problem +and define our cost function as

+
+\[ +{\cal C}(\hat{W}) = \frac{1}{2}\sum_{i=1}^n\left(y_i - t_i\right)^2, +\]
+

where the \(t_i\)s are our \(n\) targets (the values we want to +reproduce), while the outputs of the network after having propagated +all inputs \(\hat{x}\) are given by \(y_i\). Below we will demonstrate +how the basic equations arising from the back propagation algorithm +can be modified in order to study classification problems with \(K\) +classes.

+
+
+

Definitions

+

With our definition of the targets \(\hat{t}\), the outputs of the +network \(\hat{y}\) and the inputs \(\hat{x}\) we +define now the activation \(z_j^l\) of node/neuron/unit \(j\) of the +\(l\)-th layer as a function of the bias, the weights which add up from +the previous layer \(l-1\) and the forward passes/outputs +\(\hat{a}^{l-1}\) from the previous layer as

+
+\[ +z_j^l = \sum_{i=1}^{M_{l-1}}w_{ij}^la_i^{l-1}+b_j^l, +\]
+

where \(b_k^l\) are the biases from layer \(l\). Here \(M_{l-1}\) +represents the total number of nodes/neurons/units of layer \(l-1\). The +figure here illustrates this equation. We can rewrite this in a more +compact form as the matrix-vector products we discussed earlier,

+
+\[ +\hat{z}^l = \left(\hat{W}^l\right)^T\hat{a}^{l-1}+\hat{b}^l. +\]
+

With the activation values \(\hat{z}^l\) we can in turn define the +output of layer \(l\) as \(\hat{a}^l = f(\hat{z}^l)\) where \(f\) is our +activation function. In the examples here we will use the sigmoid +function discussed in our logistic regression lectures. We will also use the same activation function \(f\) for all layers +and their nodes. It means we have

+
+\[ +a_j^l = f(z_j^l) = \frac{1}{1+\exp{-(z_j^l)}}. +\]
+
+
+

Derivatives and the chain rule

+

From the definition of the activation \(z_j^l\) we have

+
+\[ +\frac{\partial z_j^l}{\partial w_{ij}^l} = a_i^{l-1}, +\]
+

and

+
+\[ +\frac{\partial z_j^l}{\partial a_i^{l-1}} = w_{ji}^l. +\]
+

With our definition of the activation function we have that (note that this function depends only on \(z_j^l\))

+
+\[ +\frac{\partial a_j^l}{\partial z_j^{l}} = a_j^l(1-a_j^l)=f(z_j^l)(1-f(z_j^l)). +\]
+
+
+

Derivative of the cost function

+

With these definitions we can now compute the derivative of the cost function in terms of the weights.

+

Let us specialize to the output layer \(l=L\). Our cost function is

+
+\[ +{\cal C}(\hat{W^L}) = \frac{1}{2}\sum_{i=1}^n\left(y_i - t_i\right)^2=\frac{1}{2}\sum_{i=1}^n\left(a_i^L - t_i\right)^2, +\]
+

The derivative of this function with respect to the weights is

+
+\[ +\frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \left(a_j^L - t_j\right)\frac{\partial a_j^L}{\partial w_{jk}^{L}}, +\]
+

The last partial derivative can easily be computed and reads (by applying the chain rule)

+
+\[ +\frac{\partial a_j^L}{\partial w_{jk}^{L}} = \frac{\partial a_j^L}{\partial z_{j}^{L}}\frac{\partial z_j^L}{\partial w_{jk}^{L}}=a_j^L(1-a_j^L)a_k^{L-1}, +\]
+
+
+

Bringing it together, first back propagation equation

+

We have thus

+
+\[ +\frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \left(a_j^L - t_j\right)a_j^L(1-a_j^L)a_k^{L-1}, +\]
+

Defining

+
+\[ +\delta_j^L = a_j^L(1-a_j^L)\left(a_j^L - t_j\right) = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}, +\]
+

and using the Hadamard product of two vectors we can write this as

+
+\[ +\hat{\delta}^L = f'(\hat{z}^L)\circ\frac{\partial {\cal C}}{\partial (\hat{a}^L)}. +\]
+

This is an important expression. The second term on the right handside +measures how fast the cost function is changing as a function of the \(j\)th +output activation. If, for example, the cost function doesn’t depend +much on a particular output node \(j\), then \(\delta_j^L\) will be small, +which is what we would expect. The first term on the right, measures +how fast the activation function \(f\) is changing at a given activation +value \(z_j^L\).

+

Notice that everything in the above equations is easily computed. In +particular, we compute \(z_j^L\) while computing the behaviour of the +network, and it is only a small additional overhead to compute +\(f'(z^L_j)\). The exact form of the derivative with respect to the +output depends on the form of the cost function. +However, provided the cost function is known there should be little +trouble in calculating

+
+\[ +\frac{\partial {\cal C}}{\partial (a_j^L)} +\]
+

With the definition of \(\delta_j^L\) we have a more compact definition of the derivative of the cost function in terms of the weights, namely

+
+\[ +\frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \delta_j^La_k^{L-1}. +\]
+
+
+

Derivatives in terms of \(z_j^L\)

+

It is also easy to see that our previous equation can be written as

+
+\[ +\delta_j^L =\frac{\partial {\cal C}}{\partial z_j^L}= \frac{\partial {\cal C}}{\partial a_j^L}\frac{\partial a_j^L}{\partial z_j^L}, +\]
+

which can also be interpreted as the partial derivative of the cost function with respect to the biases \(b_j^L\), namely

+
+\[ +\delta_j^L = \frac{\partial {\cal C}}{\partial b_j^L}\frac{\partial b_j^L}{\partial z_j^L}=\frac{\partial {\cal C}}{\partial b_j^L}, +\]
+

That is, the error \(\delta_j^L\) is exactly equal to the rate of change of the cost function as a function of the bias.

+
+
+

Bringing it together

+

We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are

+

The starting equations.

+ +
+
+\[ +\begin{equation} +\frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \delta_j^La_k^{L-1}, +\label{_auto8} \tag{13} +\end{equation} +\]
+

and

+ +
+
+\[ +\begin{equation} +\delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}, +\label{_auto9} \tag{14} +\end{equation} +\]
+

and

+ +
+
+\[ +\begin{equation} +\delta_j^L = \frac{\partial {\cal C}}{\partial b_j^L}, +\label{_auto10} \tag{15} +\end{equation} +\]
+

An interesting consequence of the above equations is that when the +activation \(a_k^{L-1}\) is small, the gradient term, that is the +derivative of the cost function with respect to the weights, will also +tend to be small. We say then that the weight learns slowly, meaning +that it changes slowly when we minimize the weights via say gradient +descent. In this case we say the system learns slowly.

+

Another interesting feature is that is when the activation function, +represented by the sigmoid function here, is rather flat when we move towards +its end values \(0\) and \(1\) (see the above Python codes). In these +cases, the derivatives of the activation function will also be close +to zero, meaning again that the gradients will be small and the +network learns slowly again.

+

We need a fourth equation and we are set. We are going to propagate +backwards in order to the determine the weights and biases. In order +to do so we need to represent the error in the layer before the final +one \(L-1\) in terms of the errors in the final output layer.

+
+
+

Final back propagating equation

+

We have that (replacing \(L\) with a general layer \(l\))

+
+\[ +\delta_j^l =\frac{\partial {\cal C}}{\partial z_j^l}. +\]
+

We want to express this in terms of the equations for layer \(l+1\). Using the chain rule and summing over all \(k\) entries we have

+
+\[ +\delta_j^l =\sum_k \frac{\partial {\cal C}}{\partial z_k^{l+1}}\frac{\partial z_k^{l+1}}{\partial z_j^{l}}=\sum_k \delta_k^{l+1}\frac{\partial z_k^{l+1}}{\partial z_j^{l}}, +\]
+

and recalling that

+
+\[ +z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, +\]
+

with \(M_l\) being the number of nodes in layer \(l\), we obtain

+
+\[ +\delta_j^l =\sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l), +\]
+

This is our final equation.

+

We are now ready to set up the algorithm for back propagation and learning the weights and biases.

+
+
+

Setting up the Back propagation algorithm

+

The four equations provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.

+

First, we set up the input data \(\hat{x}\) and the activations +\(\hat{z}_1\) of the input layer and compute the activation function and +the pertinent outputs \(\hat{a}^1\).

+

Secondly, we perform then the feed forward till we reach the output +layer and compute all \(\hat{z}_l\) of the input layer and compute the +activation function and the pertinent outputs \(\hat{a}^l\) for +\(l=2,3,\dots,L\).

+

Thereafter we compute the ouput error \(\hat{\delta}^L\) by computing all

+
+\[ +\delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}. +\]
+

Then we compute the back propagate error for each \(l=L-1,L-2,\dots,2\) as

+
+\[ +\delta_j^l = \sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l). +\]
+

Finally, we update the weights and the biases using gradient descent for each \(l=L-1,L-2,\dots,2\) and update the weights and biases according to the rules

+
+\[ +w_{jk}^l\leftarrow = w_{jk}^l- \eta \delta_j^la_k^{l-1}, +\]
+
+\[ +b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta \delta_j^l, +\]
+

The parameter \(\eta\) is the learning parameter discussed in connection with the gradient descent methods. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.

+
+
+

Setting up the Back propagation algorithm

+

The four equations above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.

+

First, we set up the input data \(\boldsymbol{x}\) and the activations +\(\boldsymbol{z}_1\) of the input layer and compute the activation function and +the pertinent outputs \(\boldsymbol{a}^1\).

+

Secondly, we perform then the feed forward till we reach the output +layer and compute all \(\boldsymbol{z}_l\) of the input layer and compute the +activation function and the pertinent outputs \(\boldsymbol{a}^l\) for +\(l=2,3,\dots,L\).

+

Thereafter we compute the ouput error \(\boldsymbol{\delta}^L\) by computing all

+
+\[ +\delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}. +\]
+

Then we compute the back propagate error for each \(l=L-1,L-2,\dots,2\) as

+
+\[ +\delta_j^l = \sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l). +\]
+

Finally, we update the weights and the biases using gradient descent for each \(l=L-1,L-2,\dots,2\) and update the weights and biases according to the rules

+
+\[ +w_{jk}^l\leftarrow = w_{jk}^l- \eta \delta_j^la_k^{l-1}, +\]
+
+\[ +b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta \delta_j^l, +\]
+

The parameter \(\eta\) is the learning parameter discussed in connection with the gradient descent methods. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.

+
+
+

Setting up the Back propagation algorithm

+

The four equations derived discussed above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.

+

First, we set up the input data \(\boldsymbol{x}\) and the activations +\(\boldsymbol{z}_1\) of the input layer and compute the activation function and +the pertinent outputs \(\boldsymbol{a}^1\).

+

Secondly, we perform then the feed forward till we reach the output +layer and compute all \(\boldsymbol{z}_l\) of the input layer and compute the +activation function and the pertinent outputs \(\boldsymbol{a}^l\) for +\(l=2,3,\dots,L\).

+

Thereafter we compute the ouput error \(\boldsymbol{\delta}^L\) by computing all

+
+\[ +\delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}. +\]
+

Then we compute the back propagate error for each \(l=L-1,L-2,\dots,2\) as

+
+\[ +\delta_j^l = \sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l). +\]
+

Finally, we update the weights and the biases using gradient descent for each \(l=L-1,L-2,\dots,2\) and update the weights and biases according to the rules

+
+\[ +w_{jk}^l\leftarrow = w_{jk}^l- \eta \delta_j^la_k^{l-1}, +\]
+
+\[ +b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta \delta_j^l, +\]
+

The parameter \(\eta\) is the learning parameter discussed in connection with the gradient descent methods. +Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training.

+
+
+

Setting up a Multi-layer perceptron model for classification

+

We are now gong to develop an example based on the MNIST data +base. This is a classification problem and we need to use our +cross-entropy function we discussed in connection with logistic +regression. The cross-entropy defines our cost function for the +classificaton problems with neural networks.

+

In binary classification with two classes \((0, 1)\) we define the +logistic/sigmoid function as the probability that a particular input +is in class \(0\) or \(1\). This is possible because the logistic +function takes any input from the real numbers and inputs a number +between 0 and 1, and can therefore be interpreted as a probability. It +also has other nice properties, such as a derivative that is simple to +calculate.

+

For an input \(\boldsymbol{a}\) from the hidden layer, the probability that the input \(\boldsymbol{x}\) +is in class 0 or 1 is just. We let \(\theta\) represent the unknown weights and biases to be adjusted by our equations). The variable \(x\) +represents our activation values \(z\). We have

+
+\[ +P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp{(- \boldsymbol{x}})} , +\]
+

and

+
+\[ +P(y = 1 \mid \boldsymbol{x}, \boldsymbol{\theta}) = 1 - P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) , +\]
+

where \(y \in \{0, 1\}\) and \(\boldsymbol{\theta}\) represents the weights and biases +of our network.

+
+
+

Defining the cost function

+

Our cost function is given as (see the Logistic regression lectures)

+
+\[ +\mathcal{C}(\boldsymbol{\theta}) = - \ln P(\mathcal{D} \mid \boldsymbol{\theta}) = - \sum_{i=1}^n +y_i \ln[P(y_i = 0)] + (1 - y_i) \ln [1 - P(y_i = 0)] = \sum_{i=1}^n \mathcal{L}_i(\boldsymbol{\theta}) . +\]
+

This last equality means that we can interpret our cost function as a sum over the loss function +for each point in the dataset \(\mathcal{L}_i(\boldsymbol{\theta})\).
+The negative sign is just so that we can think about our algorithm as minimizing a positive number, rather +than maximizing a negative number.

+

In multiclass classification it is common to treat each integer label as a so called one-hot vector:

+

\(y = 5 \quad \rightarrow \quad \boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,\) and

+

\(y = 1 \quad \rightarrow \quad \boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,\)

+

i.e. a binary bit string of length \(C\), where \(C = 10\) is the number of classes in the MNIST dataset (numbers from \(0\) to \(9\))..

+

If \(\boldsymbol{x}_i\) is the \(i\)-th input (image), \(y_{ic}\) refers to the \(c\)-th component of the \(i\)-th +output vector \(\boldsymbol{y}_i\).
+The probability of \(\boldsymbol{x}_i\) being in class \(c\) will be given by the softmax function:

+
+\[ +P(y_{ic} = 1 \mid \boldsymbol{x}_i, \boldsymbol{\theta}) = \frac{\exp{((\boldsymbol{a}_i^{hidden})^T \boldsymbol{w}_c)}} +{\sum_{c'=0}^{C-1} \exp{((\boldsymbol{a}_i^{hidden})^T \boldsymbol{w}_{c'})}} , +\]
+

which reduces to the logistic function in the binary case.
+The likelihood of this \(C\)-class classifier +is now given as:

+
+\[ +P(\mathcal{D} \mid \boldsymbol{\theta}) = \prod_{i=1}^n \prod_{c=0}^{C-1} [P(y_{ic} = 1)]^{y_{ic}} . +\]
+

Again we take the negative log-likelihood to define our cost function:

+
+\[ +\mathcal{C}(\boldsymbol{\theta}) = - \log{P(\mathcal{D} \mid \boldsymbol{\theta})}. +\]
+

See the logistic regression lectures for a full definition of the cost function.

+

The back propagation equations need now only a small change, namely the definition of a new cost function. We are thus ready to use the same equations as before!

+
+
+

Example: binary classification problem

+

As an example of the above, relevant for project 2 as well, let us consider a binary class. As discussed in our logistic regression lectures, we defined a cost function in terms of the parameters \(\beta\) as

+
+\[ +\mathcal{C}(\boldsymbol{\beta}) = - \sum_{i=1}^n \left(y_i\log{p(y_i \vert x_i,\boldsymbol{\beta})}+(1-y_i)\log{1-p(y_i \vert x_i,\boldsymbol{\beta})}\right), +\]
+

where we had defined the logistic (sigmoid) function

+
+\[ +p(y_i =1\vert x_i,\boldsymbol{\beta})=\frac{\exp{(\beta_0+\beta_1 x_i)}}{1+\exp{(\beta_0+\beta_1 x_i)}}, +\]
+

and

+
+\[ +p(y_i =0\vert x_i,\boldsymbol{\beta})=1-p(y_i =1\vert x_i,\boldsymbol{\beta}). +\]
+

The parameters \(\boldsymbol{\beta}\) were defined using a minimization method like gradient descent or Newton-Raphson’s method.

+

Now we replace \(x_i\) with the activation \(z_i^l\) for a given layer \(l\) and the outputs as \(y_i=a_i^l=f(z_i^l)\), with \(z_i^l\) now being a function of the weights \(w_{ij}^l\) and biases \(b_i^l\). +We have then

+
+\[ +a_i^l = y_i = \frac{\exp{(z_i^l)}}{1+\exp{(z_i^l)}}, +\]
+

with

+
+\[ +z_i^l = \sum_{j}w_{ij}^l a_j^{l-1}+b_i^l, +\]
+

where the superscript \(l-1\) indicates that these are the outputs from layer \(l-1\). +Our cost function at the final layer \(l=L\) is now

+
+\[ +\mathcal{C}(\boldsymbol{W}) = - \sum_{i=1}^n \left(t_i\log{a_i^L}+(1-t_i)\log{(1-a_i^L)}\right), +\]
+

where we have defined the targets \(t_i\). The derivatives of the cost function with respect to the output \(a_i^L\) are then easily calculated and we get

+
+\[ +\frac{\partial \mathcal{C}(\boldsymbol{W})}{\partial a_i^L} = \frac{a_i^L-t_i}{a_i^L(1-a_i^L)}. +\]
+

In case we use another activation function than the logistic one, we need to evaluate other derivatives.

+
+
+

The Softmax function

+

In case we employ the more general case given by the Softmax equation, we need to evaluate the derivative of the activation function with respect to the activation \(z_i^l\), that is we need

+
+\[ +\frac{\partial f(z_i^l)}{\partial w_{jk}^l} = +\frac{\partial f(z_i^l)}{\partial z_j^l} \frac{\partial z_j^l}{\partial w_{jk}^l}= \frac{\partial f(z_i^l)}{\partial z_j^l}a_k^{l-1}. +\]
+

For the Softmax function we have

+
+\[ +f(z_i^l) = \frac{\exp{(z_i^l)}}{\sum_{m=1}^K\exp{(z_m^l)}}. +\]
+

Its derivative with respect to \(z_j^l\) gives

+
+\[ +\frac{\partial f(z_i^l)}{\partial z_j^l}= f(z_i^l)\left(\delta_{ij}-f(z_j^l)\right), +\]
+

which in case of the simply binary model reduces to having \(i=j\).

+
+
+

Developing a code for doing neural networks with back propagation

+

One can identify a set of key steps when using neural networks to solve supervised learning problems:

+
    +
  1. Collect and pre-process data

  2. +
  3. Define model and architecture

  4. +
  5. Choose cost function and optimizer

  6. +
  7. Train the model

  8. +
  9. Evaluate model performance on test data

  10. +
  11. Adjust hyperparameters (if necessary, network architecture)

  12. +
+
+
+

Collect and pre-process data

+

Here we will be using the MNIST dataset, which is readily available through the scikit-learn +package. You may also find it for example here.
+The MNIST (Modified National Institute of Standards and Technology) database is a large database +of handwritten digits that is commonly used for training various image processing systems.
+The MNIST dataset consists of 70 000 images of size \(28\times 28\) pixels, each labeled from 0 to 9.
+The scikit-learn dataset we will use consists of a selection of 1797 images of size \(8\times 8\) collected and processed from this database.

+

To feed data into a feed-forward neural network we need to represent +the inputs as a design/feature matrix \(X = (n_{inputs}, n_{features})\). Each +row represents an input, in this case a handwritten digit, and +each column represents a feature, in this case a pixel. The +correct answers, also known as labels or targets are +represented as a 1D array of integers +\(Y = (n_{inputs}) = (5, 3, 1, 8,...)\).

+

As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from +measurements of height (in m)
+and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example:

+
+\[\begin{split} X = \begin{bmatrix} +1.85 & 81\\ +1.71 & 65\\ +1.95 & 103\\ +1.55 & 42\\ +1.63 & 56 +\end{bmatrix} ,\end{split}\]
+

and the targets would be:

+
+\[ Y = (23.7, 22.2, 27.1, 17.5, 21.1) \]
+

Since each input image is a 2D matrix, we need to flatten the image +(i.e. “unravel” the 2D matrix into a 1D array) to turn the data into a +design/feature matrix. This means we lose all spatial information in the +image, such as locality and translational invariance. More complicated +architectures such as Convolutional Neural Networks can take advantage +of such information, and are most commonly applied when analyzing +images.

+
+
+
# import necessary packages
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn import datasets
+
+
+# ensure the same random numbers appear every time
+np.random.seed(0)
+
+# display images in notebook
+%matplotlib inline
+plt.rcParams['figure.figsize'] = (12,12)
+
+
+# download MNIST dataset
+digits = datasets.load_digits()
+
+# define inputs and labels
+inputs = digits.images
+labels = digits.target
+
+print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape))
+print("labels = (n_inputs) = " + str(labels.shape))
+
+
+# flatten the image
+# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64
+n_inputs = len(inputs)
+inputs = inputs.reshape(n_inputs, -1)
+print("X = (n_inputs, n_features) = " + str(inputs.shape))
+
+
+# choose some random images to display
+indices = np.arange(n_inputs)
+random_indices = np.random.choice(indices, size=5)
+
+for i, image in enumerate(digits.images[random_indices]):
+    plt.subplot(1, 5, i+1)
+    plt.axis('off')
+    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
+    plt.title("Label: %d" % digits.target[random_indices[i]])
+plt.show()
+
+
+
+
+
inputs = (n_inputs, pixel_width, pixel_height) = (1797, 8, 8)
+labels = (n_inputs) = (1797,)
+X = (n_inputs, n_features) = (1797, 64)
+
+
+_images/week41_176_1.png +
+
+
+
+

Train and test datasets

+

Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions.

+

We will reserve \(80 \%\) of our dataset for training and \(20 \%\) for testing.

+

It is important that the train and test datasets are drawn randomly from our dataset, to ensure +no bias in the sampling.
+Say you are taking measurements of weather data to predict the weather in the coming 5 days. +You don’t want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data +collected from 12.00 to 24.00.

+
+
+
from sklearn.model_selection import train_test_split
+
+# one-liner from scikit-learn library
+train_size = 0.8
+test_size = 1 - train_size
+X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,
+                                                    test_size=test_size)
+
+# equivalently in numpy
+def train_test_split_numpy(inputs, labels, train_size, test_size):
+    n_inputs = len(inputs)
+    inputs_shuffled = inputs.copy()
+    labels_shuffled = labels.copy()
+    
+    np.random.shuffle(inputs_shuffled)
+    np.random.shuffle(labels_shuffled)
+    
+    train_end = int(n_inputs*train_size)
+    X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:]
+    Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:]
+    
+    return X_train, X_test, Y_train, Y_test
+
+#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size)
+
+print("Number of training images: " + str(len(X_train)))
+print("Number of test images: " + str(len(X_test)))
+
+
+
+
+
Number of training images: 1437
+Number of test images: 360
+
+
+
+
+
+
+

Define model and architecture

+

Our simple feed-forward neural network will consist of an input layer, a single hidden layer and an output layer. The activation \(y\) of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have

+
+\[ z = \sum_{i=1}^n w_i a_i ,\]
+
+\[ y = f(z) ,\]
+

where \(f\) is the activation function, \(a_i\) represents input from neuron \(i\) in the preceding layer +and \(w_i\) is the weight to input \(i\).
+The activation of the neurons in the input layer is just the features (e.g. a pixel value).

+

The simplest activation function for a neuron is the Heaviside function:

+
+\[\begin{split} f(z) = +\begin{cases} +1, & z > 0\\ +0, & \text{otherwise} +\end{cases} +\end{split}\]
+

A feed-forward neural network with this activation is known as a perceptron.
+For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer.
+This activation can be generalized to \(k\) classes (using e.g. the one-against-all strategy), +and we call these architectures multiclass perceptrons.

+

However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and
+Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function.

+

Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU).
+We will be using the sigmoid function \(\sigma(x)\):

+
+\[ f(x) = \sigma(x) = \frac{1}{1 + e^{-x}} ,\]
+

which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions.

+
+
+

Layers

+
    +
  • Input

  • +
+

Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons.

+
    +
  • Hidden layer

  • +
+

We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer.
+Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer.

+
    +
  • Output

  • +
+

If we were building a binary classifier, it would be sufficient with a single neuron in the output layer, +which could output 0 or 1 according to the Heaviside function. This would be an example of a hard classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a soft classifier, which outputs the probability of being in class 0 or 1.

+

For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class.

+

Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons \(j = 0,1,...,9\). The activation of each output neuron \(j\) will be according to the softmax function:

+
+\[ P(\text{class $j$} \mid \text{input $\boldsymbol{a}$}) = \frac{\exp{(\boldsymbol{a}^T \boldsymbol{w}_j)}} +{\sum_{c=0}^{9} \exp{(\boldsymbol{a}^T \boldsymbol{w}_c)}} ,\]
+

i.e. each neuron \(j\) outputs the probability of being in class \(j\) given an input from the hidden layer \(\boldsymbol{a}\), with \(\boldsymbol{w}_j\) the weights of neuron \(j\) to the inputs.
+The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1.
+The exponent is just the weighted sum of inputs as before:

+
+\[ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.\]
+

Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 +weights to the output layer.

+
+
+

Weights and biases

+

Typically weights are initialized with small values distributed around zero, drawn from a uniform +or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless.

+

Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range +of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron \(j\), \(b_j\):

+
+\[ z_j = \sum_{i=1}^n w_ {ij} a_i + b_j.\]
+

The bias weights \(\boldsymbol{b}\) are often initialized to zero, but a small value like \(0.01\) ensures all neurons have some output which can be backpropagated in the first training cycle.

+
+
+
# building our neural network
+
+n_inputs, n_features = X_train.shape
+n_hidden_neurons = 50
+n_categories = 10
+
+# we make the weights normally distributed using numpy.random.randn
+
+# weights and bias in the hidden layer
+hidden_weights = np.random.randn(n_features, n_hidden_neurons)
+hidden_bias = np.zeros(n_hidden_neurons) + 0.01
+
+# weights and bias in the output layer
+output_weights = np.random.randn(n_hidden_neurons, n_categories)
+output_bias = np.zeros(n_categories) + 0.01
+
+
+
+
+
+
+

Feed-forward pass

+

Denote \(F\) the number of features, \(H\) the number of hidden neurons and \(C\) the number of categories.
+For each input image we calculate a weighted sum of input features (pixel values) to each neuron \(j\) in the hidden layer \(l\):

+
+\[ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},\]
+

this is then passed through our activation function

+
+\[ a_{j}^{l} = f(z_{j}^{l}) .\]
+

We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron \(j\) in the output layer:

+
+\[ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.\]
+

Finally we calculate the output of neuron \(j\) in the output layer using the softmax function:

+
+\[ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +{\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .\]
+
+
+

Matrix multiplications

+

Since our data has the dimensions \(X = (n_{inputs}, n_{features})\) and our weights to the hidden +layer have the dimensions
+\(W_{hidden} = (n_{features}, n_{hidden})\), +we can easily feed the network all our training data in one go by taking the matrix product

+
+\[ X W^{h} = (n_{inputs}, n_{hidden}),\]
+

and obtain a matrix that holds the weighted sum of inputs to the hidden layer +for each input image and each hidden neuron.
+We also add the bias to obtain a matrix of weighted sums to the hidden layer \(Z^{h}\):

+
+\[ \boldsymbol{z}^{l} = \boldsymbol{X} \boldsymbol{W}^{l} + \boldsymbol{b}^{l} ,\]
+

meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image.
+This is then passed through the activation:

+
+\[ \boldsymbol{a}^{l} = f(\boldsymbol{z}^l) .\]
+

This is fed to the output layer:

+
+\[ \boldsymbol{z}^{L} = \boldsymbol{a}^{L} \boldsymbol{W}^{L} + \boldsymbol{b}^{L} .\]
+

Finally we receive our output values for each image and each category by passing it through the softmax function:

+
+\[ output = softmax (\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .\]
+
+
+
# setup the feed-forward pass, subscript h = hidden layer
+
+def sigmoid(x):
+    return 1/(1 + np.exp(-x))
+
+def feed_forward(X):
+    # weighted sum of inputs to the hidden layer
+    z_h = np.matmul(X, hidden_weights) + hidden_bias
+    # activation in the hidden layer
+    a_h = sigmoid(z_h)
+    
+    # weighted sum of inputs to the output layer
+    z_o = np.matmul(a_h, output_weights) + output_bias
+    # softmax output
+    # axis 0 holds each input and axis 1 the probabilities of each category
+    exp_term = np.exp(z_o)
+    probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+    
+    return probabilities
+
+probabilities = feed_forward(X_train)
+print("probabilities = (n_inputs, n_categories) = " + str(probabilities.shape))
+print("probability that image 0 is in category 0,1,2,...,9 = \n" + str(probabilities[0]))
+print("probabilities sum up to: " + str(probabilities[0].sum()))
+print()
+
+# we obtain a prediction by taking the class with the highest likelihood
+def predict(X):
+    probabilities = feed_forward(X)
+    return np.argmax(probabilities, axis=1)
+
+predictions = predict(X_train)
+print("predictions = (n_inputs) = " + str(predictions.shape))
+print("prediction for image 0: " + str(predictions[0]))
+print("correct label for image 0: " + str(Y_train[0]))
+
+
+
+
+
probabilities = (n_inputs, n_categories) = (1437, 10)
+probability that image 0 is in category 0,1,2,...,9 = 
+[5.41511965e-04 2.17174962e-03 8.84355903e-03 1.44970586e-03
+ 1.10378326e-04 5.08318298e-09 2.03256632e-04 1.92507116e-03
+ 9.84443254e-01 3.11507992e-04]
+probabilities sum up to: 1.0
+
+predictions = (n_inputs) = (1437,)
+prediction for image 0: 8
+correct label for image 0: 6
+
+
+
+
+
+
+

Choose cost function and optimizer

+

To measure how well our neural network is doing we need to introduce a cost function.
+We will call the function that gives the error of a single sample output the loss function, and the function +that gives the total error of our network across all samples the cost function. +A typical choice for multiclass classification is the cross-entropy loss, also known as the negative log likelihood.

+

In multiclass classification it is common to treat each integer label as a so called one-hot vector:

+
+\[ y = 5 \quad \rightarrow \quad \boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,\]
+
+\[ y = 1 \quad \rightarrow \quad \boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,\]
+

i.e. a binary bit string of length \(C\), where \(C = 10\) is the number of classes in the MNIST dataset.

+

Let \(y_{ic}\) denote the \(c\)-th component of the \(i\)-th one-hot vector.
+We define the cost function \(\mathcal{C}\) as a sum over the cross-entropy loss for each point \(\boldsymbol{x}_i\) in the dataset.

+

In the one-hot representation only one of the terms in the loss function is non-zero, namely the +probability of the correct category \(c'\)
+(i.e. the category \(c'\) such that \(y_{ic'} = 1\)). This means that the cross entropy loss only punishes you for how wrong +you got the correct label. The probability of category \(c\) is given by the softmax function. The vector \(\boldsymbol{\theta}\) represents the parameters of our network, i.e. all the weights and biases.

+
+
+

Optimizing the cost function

+

The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is gradient descent and its generalizations. The idea behind gradient descent +is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a local minimum of the cost function.
+Each parameter \(\theta\) is iteratively adjusted according to the rule

+
+\[ \theta_{i+1} = \theta_i - \eta \nabla \mathcal{C}(\theta_i) ,\]
+

where \(\eta\) is known as the learning rate, which controls how big a step we take towards the minimum.
+This update can be repeated for any number of iterations, or until we are satisfied with the result.

+

A simple and effective improvement is a variant called Batch Gradient Descent.
+Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient +on a subset of the data called a minibatch.
+If there are \(N\) data points and we have a minibatch size of \(M\), the total number of batches +is \(N/M\).
+We denote each minibatch \(B_k\), with \(k = 1, 2,...,N/M\). The gradient then becomes:

+
+\[ \nabla \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \nabla \mathcal{L}_i(\theta) \quad \rightarrow \quad +\frac{1}{M} \sum_{i \in B_k} \nabla \mathcal{L}_i(\theta) ,\]
+

i.e. instead of averaging the loss over the entire dataset, we average over a minibatch.

+

This has two important benefits:

+
    +
  1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima.

  2. +
  3. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient.

  4. +
+

The various optmization methods, with codes and algorithms, are discussed in our lectures on Gradient descent approaches.

+
+
+

Regularization

+

It is common to add an extra term to the cost function, proportional +to the size of the weights. This is equivalent to constraining the +size of the weights, so that they do not grow out of control. +Constraining the size of the weights means that the weights cannot +grow arbitrarily large to fit the training data, and in this way +reduces overfitting.

+

We will measure the size of the weights using the so called L2-norm, meaning our cost function becomes:

+
+\[ \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) \quad \rightarrow \quad +\frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) + \lambda \lvert \lvert \boldsymbol{w} \rvert \rvert_2^2 += \frac{1}{N} \sum_{i=1}^N \mathcal{L}(\theta) + \lambda \sum_{ij} w_{ij}^2,\]
+

i.e. we sum up all the weights squared. The factor \(\lambda\) is known as a regularization parameter.

+

In order to train the model, we need to calculate the derivative of +the cost function with respect to every bias and weight in the +network. In total our network has \((64 + 1)\times 50=3250\) weights in +the hidden layer and \((50 + 1)\times 10=510\) weights to the output +layer (\(+1\) for the bias), and the gradient must be calculated for +every parameter. We use the backpropagation algorithm discussed +above. This is a clever use of the chain rule that allows us to +calculate the gradient efficently.

+
+
+

Matrix multiplication

+

To more efficently train our network these equations are implemented using matrix operations.
+The error in the output layer is calculated simply as, with \(\boldsymbol{t}\) being our targets,

+
+\[ \delta_L = \boldsymbol{t} - \boldsymbol{y} = (n_{inputs}, n_{categories}) .\]
+

The gradient for the output weights is calculated as

+
+\[ \nabla W_{L} = \boldsymbol{a}^T \delta_L = (n_{hidden}, n_{categories}) ,\]
+

where \(\boldsymbol{a} = (n_{inputs}, n_{hidden})\). This simply means that we are summing up the gradients for each input.
+Since we are going backwards we have to transpose the activation matrix.

+

The gradient with respect to the output bias is then

+
+\[ \nabla \boldsymbol{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .\]
+

The error in the hidden layer is

+
+\[ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,\]
+

where \(f'(a_{h})\) is the derivative of the activation in the hidden layer. The matrix products mean +that we are summing up the products for each neuron in the output layer. The symbol \(\circ\) denotes +the Hadamard product, meaning element-wise multiplication.

+

This again gives us the gradients in the hidden layer:

+
+\[ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,\]
+
+\[ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .\]
+
+
+
# to categorical turns our integer vector into a onehot representation
+from sklearn.metrics import accuracy_score
+
+# one-hot in numpy
+def to_categorical_numpy(integer_vector):
+    n_inputs = len(integer_vector)
+    n_categories = np.max(integer_vector) + 1
+    onehot_vector = np.zeros((n_inputs, n_categories))
+    onehot_vector[range(n_inputs), integer_vector] = 1
+    
+    return onehot_vector
+
+#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test)
+Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test)
+
+def feed_forward_train(X):
+    # weighted sum of inputs to the hidden layer
+    z_h = np.matmul(X, hidden_weights) + hidden_bias
+    # activation in the hidden layer
+    a_h = sigmoid(z_h)
+    
+    # weighted sum of inputs to the output layer
+    z_o = np.matmul(a_h, output_weights) + output_bias
+    # softmax output
+    # axis 0 holds each input and axis 1 the probabilities of each category
+    exp_term = np.exp(z_o)
+    probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+    
+    # for backpropagation need activations in hidden and output layers
+    return a_h, probabilities
+
+def backpropagation(X, Y):
+    a_h, probabilities = feed_forward_train(X)
+    
+    # error in the output layer
+    error_output = probabilities - Y
+    # error in the hidden layer
+    error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h)
+    
+    # gradients for the output layer
+    output_weights_gradient = np.matmul(a_h.T, error_output)
+    output_bias_gradient = np.sum(error_output, axis=0)
+    
+    # gradient for the hidden layer
+    hidden_weights_gradient = np.matmul(X.T, error_hidden)
+    hidden_bias_gradient = np.sum(error_hidden, axis=0)
+
+    return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient
+
+print("Old accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train)))
+
+eta = 0.01
+lmbd = 0.01
+for i in range(1000):
+    # calculate gradients
+    dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot)
+    
+    # regularization term gradients
+    dWo += lmbd * output_weights
+    dWh += lmbd * hidden_weights
+    
+    # update weights and biases
+    output_weights -= eta * dWo
+    output_bias -= eta * dBo
+    hidden_weights -= eta * dWh
+    hidden_bias -= eta * dBh
+
+print("New accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train)))
+
+
+
+
+
Old accuracy on training data: 0.1440501043841336
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
New accuracy on training data: 0.09951287404314545
+
+
+
+
+
+
+

Improving performance

+

As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image.
+In order to obtain a network that does something useful, we will have to do a bit more work.

+

The choice of hyperparameters such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a grid-search is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates \(\eta = 10^{-6}, 10^{-5},...,10^{-1}\) with different regularization parameters \(\lambda = 10^{-6},...,10^{-0}\).

+

Next, we haven’t implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an iteration, and a full training period +going through the entire dataset (\(n/M\) batches) an epoch.

+

If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers.
+Andrew Ng goes through some of these considerations in this video. You can find a summary of the video here.

+
+
+

Full object-oriented implementation

+

It is very natural to think of the network as an object, with specific instances of the network +being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below.

+
+
+
class NeuralNetwork:
+    def __init__(
+            self,
+            X_data,
+            Y_data,
+            n_hidden_neurons=50,
+            n_categories=10,
+            epochs=10,
+            batch_size=100,
+            eta=0.1,
+            lmbd=0.0):
+
+        self.X_data_full = X_data
+        self.Y_data_full = Y_data
+
+        self.n_inputs = X_data.shape[0]
+        self.n_features = X_data.shape[1]
+        self.n_hidden_neurons = n_hidden_neurons
+        self.n_categories = n_categories
+
+        self.epochs = epochs
+        self.batch_size = batch_size
+        self.iterations = self.n_inputs // self.batch_size
+        self.eta = eta
+        self.lmbd = lmbd
+
+        self.create_biases_and_weights()
+
+    def create_biases_and_weights(self):
+        self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons)
+        self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01
+
+        self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories)
+        self.output_bias = np.zeros(self.n_categories) + 0.01
+
+    def feed_forward(self):
+        # feed-forward for training
+        self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias
+        self.a_h = sigmoid(self.z_h)
+
+        self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias
+
+        exp_term = np.exp(self.z_o)
+        self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+    def feed_forward_out(self, X):
+        # feed-forward for output
+        z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias
+        a_h = sigmoid(z_h)
+
+        z_o = np.matmul(a_h, self.output_weights) + self.output_bias
+        
+        exp_term = np.exp(z_o)
+        probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+        return probabilities
+
+    def backpropagation(self):
+        error_output = self.probabilities - self.Y_data
+        error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h)
+
+        self.output_weights_gradient = np.matmul(self.a_h.T, error_output)
+        self.output_bias_gradient = np.sum(error_output, axis=0)
+
+        self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden)
+        self.hidden_bias_gradient = np.sum(error_hidden, axis=0)
+
+        if self.lmbd > 0.0:
+            self.output_weights_gradient += self.lmbd * self.output_weights
+            self.hidden_weights_gradient += self.lmbd * self.hidden_weights
+
+        self.output_weights -= self.eta * self.output_weights_gradient
+        self.output_bias -= self.eta * self.output_bias_gradient
+        self.hidden_weights -= self.eta * self.hidden_weights_gradient
+        self.hidden_bias -= self.eta * self.hidden_bias_gradient
+
+    def predict(self, X):
+        probabilities = self.feed_forward_out(X)
+        return np.argmax(probabilities, axis=1)
+
+    def predict_probabilities(self, X):
+        probabilities = self.feed_forward_out(X)
+        return probabilities
+
+    def train(self):
+        data_indices = np.arange(self.n_inputs)
+
+        for i in range(self.epochs):
+            for j in range(self.iterations):
+                # pick datapoints with replacement
+                chosen_datapoints = np.random.choice(
+                    data_indices, size=self.batch_size, replace=False
+                )
+
+                # minibatch training data
+                self.X_data = self.X_data_full[chosen_datapoints]
+                self.Y_data = self.Y_data_full[chosen_datapoints]
+
+                self.feed_forward()
+                self.backpropagation()
+
+
+
+
+
+
+

Evaluate model performance on test data

+

To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data.
+We measure the performance of the network using the accuracy score.
+The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of \(1\).

+
+\[ \text{Accuracy} = \frac{\sum_{i=1}^n I(\tilde{y}_i = y_i)}{n} ,\]
+

where \(I\) is the indicator function, \(1\) if \(\tilde{y}_i = y_i\) and \(0\) otherwise.

+
+
+
epochs = 100
+batch_size = 100
+
+dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,
+                    n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)
+dnn.train()
+test_predict = dnn.predict(X_test)
+
+# accuracy score from scikit library
+print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
+
+# equivalent in numpy
+def accuracy_score_numpy(Y_test, Y_pred):
+    return np.sum(Y_test == Y_pred) / len(Y_test)
+
+#print("Accuracy score on test set: ", accuracy_score_numpy(Y_test, test_predict))
+
+
+
+
+
Accuracy score on test set:  0.9444444444444444
+
+
+
+
+
+
+

Adjust hyperparameters

+

We now perform a grid search to find the optimal hyperparameters for the network.
+Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around \(98\%\) (\(2\%\) error rate).

+
+
+
eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+# store the models for later use
+DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+
+# grid search
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,
+                            n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)
+        dnn.train()
+        
+        DNN_numpy[i][j] = dnn
+        
+        test_predict = dnn.predict(X_test)
+        
+        print("Learning rate  = ", eta)
+        print("Lambda = ", lmbd)
+        print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict))
+        print()
+
+
+
+
+
Learning rate  =  1e-05
+Lambda =  1e-05
+Accuracy score on test set:  0.11666666666666667
+
+
+
Learning rate  =  1e-05
+Lambda =  0.0001
+Accuracy score on test set:  0.20833333333333334
+
+
+
Learning rate  =  1e-05
+Lambda =  0.001
+Accuracy score on test set:  0.12222222222222222
+
+
+
Learning rate  =  1e-05
+Lambda =  0.01
+Accuracy score on test set:  0.14722222222222223
+
+
+
Learning rate  =  1e-05
+Lambda =  0.1
+Accuracy score on test set:  0.17777777777777778
+
+
+
Learning rate  =  1e-05
+Lambda =  1.0
+Accuracy score on test set:  0.16111111111111112
+
+
+
Learning rate  =  1e-05
+Lambda =  10.0
+Accuracy score on test set:  0.20277777777777778
+
+
+
Learning rate  =  0.0001
+Lambda =  1e-05
+Accuracy score on test set:  0.5305555555555556
+
+
+
Learning rate  =  0.0001
+Lambda =  0.0001
+Accuracy score on test set:  0.5944444444444444
+
+
+
Learning rate  =  0.0001
+Lambda =  0.001
+Accuracy score on test set:  0.5888888888888889
+
+
+
Learning rate  =  0.0001
+Lambda =  0.01
+Accuracy score on test set:  0.6111111111111112
+
+
+
Learning rate  =  0.0001
+Lambda =  0.1
+Accuracy score on test set:  0.5222222222222223
+
+
+
Learning rate  =  0.0001
+Lambda =  1.0
+Accuracy score on test set:  0.5555555555555556
+
+
+
Learning rate  =  0.0001
+Lambda =  10.0
+Accuracy score on test set:  0.8055555555555556
+
+
+
Learning rate  =  0.001
+Lambda =  1e-05
+Accuracy score on test set:  0.85
+
+
+
Learning rate  =  0.001
+Lambda =  0.0001
+Accuracy score on test set:  0.85
+
+
+
Learning rate  =  0.001
+Lambda =  0.001
+Accuracy score on test set:  0.875
+
+
+
Learning rate  =  0.001
+Lambda =  0.01
+Accuracy score on test set:  0.8666666666666667
+
+
+
Learning rate  =  0.001
+Lambda =  0.1
+Accuracy score on test set:  0.8638888888888889
+
+
+
Learning rate  =  0.001
+Lambda =  1.0
+Accuracy score on test set:  0.9555555555555556
+
+
+
Learning rate  =  0.001
+Lambda =  10.0
+Accuracy score on test set:  0.925
+
+
+
Learning rate  =  0.01
+Lambda =  1e-05
+Accuracy score on test set:  0.9472222222222222
+
+
+
Learning rate  =  0.01
+Lambda =  0.0001
+Accuracy score on test set:  0.9277777777777778
+
+
+
Learning rate  =  0.01
+Lambda =  0.001
+Accuracy score on test set:  0.9472222222222222
+
+
+
Learning rate  =  0.01
+Lambda =  0.01
+Accuracy score on test set:  0.9305555555555556
+
+
+
Learning rate  =  0.01
+Lambda =  0.1
+Accuracy score on test set:  0.9555555555555556
+
+
+
Learning rate  =  0.01
+Lambda =  1.0
+Accuracy score on test set:  0.7694444444444445
+
+
+
Learning rate  =  0.01
+Lambda =  10.0
+Accuracy score on test set:  0.19166666666666668
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  1e-05
+Accuracy score on test set:  0.10555555555555556
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  0.0001
+Accuracy score on test set:  0.08611111111111111
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  0.001
+Accuracy score on test set:  0.10555555555555556
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  0.01
+Accuracy score on test set:  0.08888888888888889
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  0.1
+Accuracy score on test set:  0.08611111111111111
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  1.0
+Accuracy score on test set:  0.08888888888888889
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  0.1
+Lambda =  10.0
+Accuracy score on test set:  0.09166666666666666
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  1.0
+Lambda =  1e-05
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  1.0
+Lambda =  0.0001
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  1.0
+Lambda =  0.001
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  1.0
+Lambda =  0.01
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  1.0
+Lambda =  0.1
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+
+
+
Learning rate  =  1.0
+Lambda =  1.0
+Accuracy score on test set:  0.10555555555555556
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  1.0
+Lambda =  10.0
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  10.0
+Lambda =  1e-05
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  10.0
+Lambda =  0.0001
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  10.0
+Lambda =  0.001
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
Learning rate  =  10.0
+Lambda =  0.01
+Accuracy score on test set:  0.07777777777777778
+
+
+
/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp
+  return 1/(1 + np.exp(-x))
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp
+  exp_term = np.exp(self.z_o)
+/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide
+  self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)
+
+
+
---------------------------------------------------------------------------
+KeyboardInterrupt                         Traceback (most recent call last)
+Cell In[12], line 11
+      8 for j, lmbd in enumerate(lmbd_vals):
+      9     dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,
+     10                         n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)
+---> 11     dnn.train()
+     13     DNN_numpy[i][j] = dnn
+     15     test_predict = dnn.predict(X_test)
+
+Cell In[10], line 99, in NeuralNetwork.train(self)
+     96 self.Y_data = self.Y_data_full[chosen_datapoints]
+     98 self.feed_forward()
+---> 99 self.backpropagation()
+
+Cell In[10], line 64, in NeuralNetwork.backpropagation(self)
+     61 self.output_weights_gradient = np.matmul(self.a_h.T, error_output)
+     62 self.output_bias_gradient = np.sum(error_output, axis=0)
+---> 64 self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden)
+     65 self.hidden_bias_gradient = np.sum(error_hidden, axis=0)
+     67 if self.lmbd > 0.0:
+
+KeyboardInterrupt: 
+
+
+
+
+
+
+

Visualization

+
+
+
# visual representation of grid search
+# uses seaborn heatmap, you can also do this with matplotlib imshow
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        dnn = DNN_numpy[i][j]
+        
+        train_pred = dnn.predict(X_train) 
+        test_pred = dnn.predict(X_test)
+
+        train_accuracy[i][j] = accuracy_score(Y_train, train_pred)
+        test_accuracy[i][j] = accuracy_score(Y_test, test_pred)
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+
+
+
+
+
+

scikit-learn implementation

+

scikit-learn focuses more +on traditional machine learning methods, such as regression, +clustering, decision trees, etc. As such, it has only two types of +neural networks: Multi Layer Perceptron outputting continuous values, +MPLRegressor, and Multi Layer Perceptron outputting labels, +MLPClassifier. We will see how simple it is to use these classes.

+

scikit-learn implements a few improvements from our neural network, +such as early stopping, a varying learning rate, different +optimization methods, etc. We would therefore expect a better +performance overall.

+
+
+
from sklearn.neural_network import MLPClassifier
+# store models for later use
+DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
+                            alpha=lmbd, learning_rate_init=eta, max_iter=epochs)
+        dnn.fit(X_train, Y_train)
+        
+        DNN_scikit[i][j] = dnn
+        
+        print("Learning rate  = ", eta)
+        print("Lambda = ", lmbd)
+        print("Accuracy score on test set: ", dnn.score(X_test, Y_test))
+        print()
+
+
+
+
+
+
+

Visualization

+
+
+
# optional
+# visual representation of grid search
+# uses seaborn heatmap, could probably do this in matplotlib
+import seaborn as sns
+
+sns.set()
+
+train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        dnn = DNN_scikit[i][j]
+        
+        train_pred = dnn.predict(X_train) 
+        test_pred = dnn.predict(X_test)
+
+        train_accuracy[i][j] = accuracy_score(Y_train, train_pred)
+        test_accuracy[i][j] = accuracy_score(Y_test, test_pred)
+
+        
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Training Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+
+
+
+
+
+

Testing our code for the XOR, OR and AND gates

+

Last week we discussed three different types of gates, the so-called +XOR, the OR and the AND gates. Their inputs and outputs can be +summarized using the following tables, first for the OR gate with +inputs \(x_1\) and \(x_2\) and outputs \(y\):

+ + + + + + + + + + +
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 1
+
+

The AND and XOR Gates

+

The AND gate is defined as

+ + + + + + + + + + +
$x_1$ $x_2$ $y$
0 0 0
0 1 0
1 0 0
1 1 1
+

And finally we have the XOR gate

+ + + + + + + + + + +
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 0
+
+

Representing the Data Sets

+

Our design matrix is defined by the input values \(x_1\) and \(x_2\). Since we have four possible outputs, our design matrix reads

+
+\[\begin{split} +\boldsymbol{X}=\begin{bmatrix} 0 & 0 \\ + 0 & 1 \\ + 1 & 0 \\ + 1 & 1 \end{bmatrix}, +\end{split}\]
+

while the vector of outputs is \(\boldsymbol{y}^T=[0,1,1,0]\) for the XOR gate, \(\boldsymbol{y}^T=[0,0,0,1]\) for the AND gate and \(\boldsymbol{y}^T=[0,1,1,1]\) for the OR gate.

+
+
+

Setting up the Neural Network

+

We define first our design matrix and the various output vectors for the different gates.

+
+
+
"""
+Simple code that tests XOR, OR and AND gates with linear regression
+"""
+
+# import necessary packages
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn import datasets
+
+def sigmoid(x):
+    return 1/(1 + np.exp(-x))
+
+def feed_forward(X):
+    # weighted sum of inputs to the hidden layer
+    z_h = np.matmul(X, hidden_weights) + hidden_bias
+    # activation in the hidden layer
+    a_h = sigmoid(z_h)
+    
+    # weighted sum of inputs to the output layer
+    z_o = np.matmul(a_h, output_weights) + output_bias
+    # softmax output
+    # axis 0 holds each input and axis 1 the probabilities of each category
+    probabilities = sigmoid(z_o)
+    return probabilities
+
+# we obtain a prediction by taking the class with the highest likelihood
+def predict(X):
+    probabilities = feed_forward(X)
+    return np.argmax(probabilities, axis=1)
+
+# ensure the same random numbers appear every time
+np.random.seed(0)
+
+# Design matrix
+X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)
+
+# The XOR gate
+yXOR = np.array( [ 0, 1 ,1, 0])
+# The OR gate
+yOR = np.array( [ 0, 1 ,1, 1])
+# The AND gate
+yAND = np.array( [ 0, 0 ,0, 1])
+
+# Defining the neural network
+n_inputs, n_features = X.shape
+n_hidden_neurons = 2
+n_categories = 2
+n_features = 2
+
+# we make the weights normally distributed using numpy.random.randn
+
+# weights and bias in the hidden layer
+hidden_weights = np.random.randn(n_features, n_hidden_neurons)
+hidden_bias = np.zeros(n_hidden_neurons) + 0.01
+
+# weights and bias in the output layer
+output_weights = np.random.randn(n_hidden_neurons, n_categories)
+output_bias = np.zeros(n_categories) + 0.01
+
+probabilities = feed_forward(X)
+print(probabilities)
+
+
+predictions = predict(X)
+print(predictions)
+
+
+
+
+

Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above.

+
+
+

The Code using Scikit-Learn

+
+
+
# import necessary packages
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn.neural_network import MLPClassifier
+from sklearn.metrics import accuracy_score
+import seaborn as sns
+
+# ensure the same random numbers appear every time
+np.random.seed(0)
+
+# Design matrix
+X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)
+
+# The XOR gate
+yXOR = np.array( [ 0, 1 ,1, 0])
+# The OR gate
+yOR = np.array( [ 0, 1 ,1, 1])
+# The AND gate
+yAND = np.array( [ 0, 0 ,0, 1])
+
+# Defining the neural network
+n_inputs, n_features = X.shape
+n_hidden_neurons = 2
+n_categories = 2
+n_features = 2
+
+eta_vals = np.logspace(-5, 1, 7)
+lmbd_vals = np.logspace(-5, 1, 7)
+# store models for later use
+DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)
+epochs = 100
+
+for i, eta in enumerate(eta_vals):
+    for j, lmbd in enumerate(lmbd_vals):
+        dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',
+                            alpha=lmbd, learning_rate_init=eta, max_iter=epochs)
+        dnn.fit(X, yXOR)
+        DNN_scikit[i][j] = dnn
+        print("Learning rate  = ", eta)
+        print("Lambda = ", lmbd)
+        print("Accuracy score on data set: ", dnn.score(X, yXOR))
+        print()
+
+sns.set()
+test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))
+for i in range(len(eta_vals)):
+    for j in range(len(lmbd_vals)):
+        dnn = DNN_scikit[i][j]
+        test_pred = dnn.predict(X)
+        test_accuracy[i][j] = accuracy_score(yXOR, test_pred)
+
+fig, ax = plt.subplots(figsize = (10, 10))
+sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis")
+ax.set_title("Test Accuracy")
+ax.set_ylabel("$\eta$")
+ax.set_xlabel("$\lambda$")
+plt.show()
+
+
+
+
+
+
+ + + + +
+ + + + + +
+
+
+

+ + By Morten Hjorth-Jensen
+ + © Copyright 2021.
+

+
+
+ + +
+
+ + + + + \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41.ipynb b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41.ipynb new file mode 100644 index 000000000..a20d6cb54 --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41.ipynb @@ -0,0 +1,1512 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4b4c06bc", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "bcb25e64", + "metadata": { + "editable": true + }, + "source": [ + "# Exercises week 41\n", + "**October 4-11, 2024**\n", + "\n", + "Date: **Deadline is Friday October 11 at midnight**" + ] + }, + { + "cell_type": "markdown", + "id": "bb01f126", + "metadata": { + "editable": true + }, + "source": [ + "# Overarching aims of the exercises this week\n", + "\n", + "The aim of the exercises this week is to get started with implementing\n", + "gradient methods of relevance for project 2. This exercise will also\n", + "be continued next week with the addition of automatic differentation.\n", + "Everything you develop here will be used in project 2. \n", + "\n", + "In order to get started, we will now replace in our standard ordinary\n", + "least squares (OLS) and Ridge regression codes (from project 1) the\n", + "matrix inversion algorithm with our own gradient descent (GD) and SGD\n", + "codes. You can use the Franke function or the terrain data from\n", + "project 1. **However, we recommend using a simpler function like**\n", + "$f(x)=a_0+a_1x+a_2x^2$ or higher-order one-dimensional polynomials.\n", + "You can obviously test your final codes against for example the Franke\n", + "function. Automatic differentiation will be discussed next week.\n", + "\n", + "You should include in your analysis of the GD and SGD codes the following elements\n", + "1. A plain gradient descent with a fixed learning rate (you will need to tune it) using the analytical expression of the gradients\n", + "\n", + "2. Add momentum to the plain GD code and compare convergence with a fixed learning rate (you may need to tune the learning rate), again using the analytical expression of the gradients.\n", + "\n", + "3. Repeat these steps for stochastic gradient descent with mini batches and a given number of epochs. Use a tunable learning rate as discussed in the lectures from week 39. Discuss the results as functions of the various parameters (size of batches, number of epochs etc)\n", + "\n", + "4. Implement the Adagrad method in order to tune the learning rate. Do this with and without momentum for plain gradient descent and SGD.\n", + "\n", + "5. Add RMSprop and Adam to your library of methods for tuning the learning rate.\n", + "\n", + "The lecture notes from weeks 39 and 40 contain more information and code examples. Feel free to use these examples.\n", + "\n", + "In summary, you should \n", + "perform an analysis of the results for OLS and Ridge regression as\n", + "function of the chosen learning rates, the number of mini-batches and\n", + "epochs as well as algorithm for scaling the learning rate. You can\n", + "also compare your own results with those that can be obtained using\n", + "for example **Scikit-Learn**'s various SGD options. Discuss your\n", + "results. For Ridge regression you need now to study the results as functions of the hyper-parameter $\\lambda$ and \n", + "the learning rate $\\eta$. Discuss your results.\n", + "\n", + "You will need your SGD code for the setup of the Neural Network and\n", + "Logistic Regression codes. You will find the Python [Seaborn\n", + "package](https://seaborn.pydata.org/generated/seaborn.heatmap.html)\n", + "useful when plotting the results as function of the learning rate\n", + "$\\eta$ and the hyper-parameter $\\lambda$ when you use Ridge\n", + "regression.\n", + "\n", + "We recommend reading chapter 8 on optimization from the textbook of [Goodfellow, Bengio and Courville](https://www.deeplearningbook.org/). This chapter contains many useful insights and discussions on the optimization part of machine learning." + ] + }, + { + "cell_type": "markdown", + "id": "d576598a", + "metadata": { + "editable": true + }, + "source": [ + "# Code examples from week 39 and 40" + ] + }, + { + "cell_type": "markdown", + "id": "2d07a903", + "metadata": { + "editable": true + }, + "source": [ + "## Code with a Number of Minibatches which varies, analytical gradient\n", + "\n", + "In the code here we vary the number of mini-batches." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "4db17153", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[4.16413938]\n", + " [2.88594444]]\n", + "Eigenvalues of Hessian Matrix:[0.2965315 4.059181 ]\n", + "theta from own gd\n", + "[[4.16413938]\n", + " [2.88594444]]\n", + "theta from own sdg\n", + "[[4.11131389]\n", + " [2.89069029]]\n" + ] + }, + { + "data": { + "image/png": "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adOwc+dObNy4EVVVVRg+fDjKy8u9XTQiIiLyASohhPB2IRxx/vx5tGzZElu2bMHAgQPtek5paSlCQ0NRUlKCkJAQN5eQiIiIXMFT1+8At+3ZTUpKSgAAYWFhVrfR6XTQ6XSmx6WlpW4vFxEREcmT5G+T1SSEwKxZs9C/f38kJydb3W7BggUIDQ01/cTGxnqwlERERCQnsrpNNm3aNHz77bfYtm0bYmJirG5nqWYoNjaWt8mIiIhkhLfJbjFjxgx89dVXyMvLqzMIAYBarYZarfZQyYiIiEjOJB+GhBCYMWMG1q5di9zcXMTHx3u7SERERORDJB+Gpk2bhszMTHz55Zdo0qQJiouLAQChoaFo2LChl0tHREREcif5NkMqlcri8hUrVmDq1Kl27YNd64mIiOSHbYb+IPGsRkRERDInq671RERERK7GMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKxjBEREREisYwRERERIrGMERERESKJpsw9PbbbyM+Ph5BQUHo3r07tm7d6u0iERERkQ+QRRhavXo1MjIy8MILL2Dv3r0YMGAANBoNTp065e2iERERkcyphBDC24WwpXfv3ujWrRveeecd07KEhASMGzcOCxYssPn80tJShIaGoqSkBCEhIe4sKhEREbmIp67fkq8ZunHjBnbv3o3hw4ebLR8+fDi2b9/upVIRERGRrwjwdgFsuXDhAvR6PSIiIsyWR0REoLi42OJzdDoddDqd6XFJSQkAQ8IkIiIieTBet919E0vyYchIpVKZPRZC1FpmtGDBAsybN6/W8tjYWLeUjYiIiNzn4sWLCA0Nddv+JR+GmjdvDn9//1q1QOfOnatVW2Q0e/ZszJo1y/T4ypUraNOmDU6dOuXWN1NqSktLERsbi8LCQkW1leJx87iVgMfN41aCkpIStG7dGmFhYW59HcmHocDAQHTv3h0bN27E+PHjTcs3btyIsWPHWnyOWq2GWq2utTw0NFRRXyKjkJAQHreC8LiVhcetLEo9bj8/9zZxlnwYAoBZs2YhPT0dPXr0QN++fbF8+XKcOnUKjz/+uLeLRkRERDInizB099134+LFi/jHP/6BoqIiJCcnIzs7G23atPF20YiIiEjmZBGGAODJJ5/Ek08+6dRz1Wo15syZY/HWmS/jcfO4lYDHzeNWAh63e49bFoMuEhEREbmL5AddJCIiInInhiEiIiJSNIYhIiIiUjSGISIiIlI0WYaht99+G/Hx8QgKCkL37t2xdevWOrffsmULunfvjqCgILRt2xbLli2rtc2aNWuQmJgItVqNxMRErF271l3Fd5ojx52VlYVhw4ahRYsWCAkJQd++fbFhwwazbVauXAmVSlXrp6Kiwt2H4hBHjjs3N9fiMR06dMhsO1/7vKdOnWrxuJOSkkzbyOHzzsvLw5gxYxAVFQWVSoV169bZfI4vnN+OHrevnN+OHrevnN+OHrevnN8LFixAz5490aRJE7Rs2RLjxo3D4cOHbT7PE+e47MLQ6tWrkZGRgRdeeAF79+7FgAEDoNFocOrUKYvbFxQUIDU1FQMGDMDevXvxt7/9DTNnzsSaNWtM2+zYsQN333030tPT8csvvyA9PR0TJ07Ejz/+6KnDssnR487Ly8OwYcOQnZ2N3bt3IyUlBWPGjMHevXvNtgsJCUFRUZHZT1BQkCcOyS6OHrfR4cOHzY6pffv2pnW++HkvXrzY7HgLCwsRFhaGv/zlL2bbSf3zLi8vR+fOnbFkyRK7tveV89vR4/aV89vR4zaS+/nt6HH7yvm9ZcsWTJs2DTt37sTGjRtRVVWF4cOHo7y83OpzPHaOC5np1auXePzxx82WdezYUTz//PMWt/+///s/0bFjR7Nljz32mOjTp4/p8cSJE8XIkSPNthkxYoS45557XFTq+nP0uC1JTEwU8+bNMz1esWKFCA0NdVUR3cLR487JyREAxOXLl63uUwmf99q1a4VKpRInTpwwLZPD510TALF27do6t/GV87sme47bEjme3zXZc9y+cn7X5Mzn7QvntxBCnDt3TgAQW7ZssbqNp85xWdUM3bhxA7t378bw4cPNlg8fPhzbt2+3+JwdO3bU2n7EiBH4+eefUVlZWec21vbpac4c962qq6tx9erVWpPdlZWVoU2bNoiJicHo0aNr/WXpTfU57q5duyIyMhJDhgxBTk6O2TolfN7vv/8+hg4dWmuUdil/3s7whfPbFeR4fteHnM9vV/CV87ukpAQA6pyE1VPnuKzC0IULF6DX62vNVh8REVFrVnuj4uJii9tXVVXhwoULdW5jbZ+e5sxx3+pf//oXysvLMXHiRNOyjh07YuXKlfjqq6+watUqBAUFoV+/fjh69KhLy+8sZ447MjISy5cvx5o1a5CVlYUOHTpgyJAhyMvLM23j6593UVERtFotHn74YbPlUv+8neEL57cryPH8doYvnN/15SvntxACs2bNQv/+/ZGcnGx1O0+d47KZjqMmlUpl9lgIUWuZre1vXe7oPr3B2TKuWrUKc+fOxZdffomWLVualvfp0wd9+vQxPe7Xrx+6deuGt956C2+++abrCl5Pjhx3hw4d0KFDB9Pjvn37orCwEK+//joGDhzo1D69xdkyrly5Ek2bNsW4cePMlsvl83aUr5zfzpL7+e0IXzq/neUr5/f06dPx66+/Ytu2bTa39cQ5LquaoebNm8Pf379W2jt37lytVGjUqlUri9sHBAQgPDy8zm2s7dPTnDluo9WrV+Ohhx7CZ599hqFDh9a5rZ+fH3r27CmZvyTqc9w19enTx+yYfPnzFkLggw8+QHp6OgIDA+vcVmqftzN84fyuDzmf364it/O7Pnzl/J4xYwa++uor5OTkICYmps5tPXWOyyoMBQYGonv37ti4caPZ8o0bN+KOO+6w+Jy+ffvW2v67775Djx490KBBgzq3sbZPT3PmuAHDX4xTp05FZmYmRo0aZfN1hBDYt28fIiMj611mV3D2uG+1d+9es2Py1c8bMPTWOHbsGB566CGbryO1z9sZvnB+O0vu57eryO38rg+5n99CCEyfPh1ZWVnYvHkz4uPjbT7HY+e43U2tJeLTTz8VDRo0EO+//744cOCAyMjIEI0aNTK1qn/++edFenq6afvffvtNBAcHi6efflocOHBAvP/++6JBgwbiiy++MG3zww8/CH9/f/HPf/5THDx4UPzzn/8UAQEBYufOnR4/PmscPe7MzEwREBAgli5dKoqKikw/V65cMW0zd+5csX79enH8+HGxd+9e8cADD4iAgADx448/evz4rHH0uP/973+LtWvXiiNHjoj9+/eL559/XgAQa9asMW3ji5+30X333Sd69+5tcZ9y+LyvXr0q9u7dK/bu3SsAiDfeeEPs3btXnDx5Ugjhu+e3o8ftK+e3o8ftK+e3o8dtJPfz+4knnhChoaEiNzfX7Ht77do10zbeOsdlF4aEEGLp0qWiTZs2IjAwUHTr1s2sW96UKVPEoEGDzLbPzc0VXbt2FYGBgSIuLk688847tfb5+eefiw4dOogGDRqIjh07mp1cUuHIcQ8aNEgAqPUzZcoU0zYZGRmidevWIjAwULRo0UIMHz5cbN++3YNHZB9HjnvhwoWiXbt2IigoSDRr1kz0799ffPvtt7X26WuftxBCXLlyRTRs2FAsX77c4v7k8Hkbu05b+9766vnt6HH7yvnt6HH7yvntzPfcF85vS8cMQKxYscK0jbfOcdUfBSQiIiJSJFm1GSIiIiJyNYYhIiIiUjSGISIiIlI0hiEiIiJSNIYhIiIiUjSGISIiIlI0hiEiIiJSNIYhIiIiUjSGISIiIlI0hiEiIiJSNIYhIpKlVatWISgoCGfOnDEte/jhh9GpUyeUlJR4sWREJDecm4yIZEkIgS5dumDAgAFYsmQJ5s2bh//85z/YuXMnoqOjvV08IpKRAG8XgIjIGSqVCvPnz8eECRMQFRWFxYsXY+vWrQxCROQw1gwRkax169YN+fn5+O677zBo0CBvF4eIZIhthohItjZs2IBDhw5Br9cjIiLC28UhIplizRARydKePXswePBgLF26FJ9++imCg4Px+eefe7tYRCRDbDNERLJz4sQJjBo1Cs8//zzS09ORmJiInj17Yvfu3ejevbu3i0dEMsOaISKSlUuXLqFfv34YOHAg3n33XdPysWPHQqfTYf369V4sHRHJEcMQERERKRobUBMREZGiMQwRERGRojEMERERkaIxDBEREZGiMQwRERGRojEMERERkaIxDBEREZGiMQwRERGRojEMERERkaIxDBEREZGiMQwRERGRojEMERERkaL9P1H6jezKdyEWAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_5_1.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "\n", + "# Importing various packages\n", + "from math import exp, sqrt\n", + "from random import random, seed\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 1000\n", + "\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = 2.0/n*X.T @ ((X @ theta)-y)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "xnew = np.array([[0],[2]])\n", + "Xnew = np.c_[np.ones((2,1)), xnew]\n", + "ypredict = Xnew.dot(theta)\n", + "ypredict2 = Xnew.dot(theta_linreg)\n", + "\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "t0, t1 = 5, 50\n", + "\n", + "def learning_schedule(t):\n", + " return t0/(t+t1)\n", + "\n", + "theta = np.random.randn(2,1)\n", + "\n", + "for epoch in range(n_epochs):\n", + "# Can you figure out a better way of setting up the contributions to each batch?\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (2.0/M)* xi.T @ ((xi @ theta)-yi)\n", + " eta = learning_schedule(epoch*m+i)\n", + " theta = theta - eta*gradients\n", + "print(\"theta from own sdg\")\n", + "print(theta)\n", + "\n", + "plt.plot(xnew, ypredict, \"r-\")\n", + "plt.plot(xnew, ypredict2, \"b-\")\n", + "plt.plot(x, y ,'ro')\n", + "plt.axis([0,2.0,0, 15.0])\n", + "plt.xlabel(r'$x$')\n", + "plt.ylabel(r'$y$')\n", + "plt.title(r'Random numbers ')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "a815759a", + "metadata": { + "editable": true + }, + "source": [ + "In the above code, we have use replacement in setting up the\n", + "mini-batches. The discussion\n", + "[here](https://sebastianraschka.com/faq/docs/sgd-methods.html) may be\n", + "useful." + ] + }, + { + "cell_type": "markdown", + "id": "4dc76e73", + "metadata": { + "editable": true + }, + "source": [ + "## Momentum based GD\n", + "\n", + "The stochastic gradient descent (SGD) is almost always used with a\n", + "*momentum* or inertia term that serves as a memory of the direction we\n", + "are moving in parameter space. This is typically implemented as\n", + "follows" + ] + }, + { + "cell_type": "markdown", + "id": "2650be7b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "94cf4be5", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} \n", + "\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t},\n", + "\\label{_auto1} \\tag{1}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "2c744311", + "metadata": { + "editable": true + }, + "source": [ + "where we have introduced a momentum parameter $\\gamma$, with\n", + "$0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to\n", + "indicate the gradient is to be taken over a different mini-batch at\n", + "each step. We call this algorithm gradient descent with momentum\n", + "(GDM). From these equations, it is clear that $\\mathbf{v}_t$ is a\n", + "running average of recently encountered gradients and\n", + "$(1-\\gamma)^{-1}$ sets the characteristic time scale for the memory\n", + "used in the averaging procedure. Consistent with this, when\n", + "$\\gamma=0$, this just reduces down to ordinary SGD as discussed\n", + "earlier. An equivalent way of writing the updates is" + ] + }, + { + "cell_type": "markdown", + "id": "c0c1409c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8a20fde4", + "metadata": { + "editable": true + }, + "source": [ + "where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$." + ] + }, + { + "cell_type": "markdown", + "id": "80345cf7", + "metadata": { + "editable": true + }, + "source": [ + "## Algorithms and codes for Adagrad, RMSprop and Adam\n", + "\n", + "The algorithms we have implemented are well described in the text by [Goodfellow, Bengio and Courville, chapter 8](https://www.deeplearningbook.org/contents/optimization.html).\n", + "\n", + "The codes which implement these algorithms are discussed after our presentation of automatic differentiation." + ] + }, + { + "cell_type": "markdown", + "id": "9e073302", + "metadata": { + "editable": true + }, + "source": [ + "## Practical tips\n", + "\n", + "* **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.\n", + "\n", + "* **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.\n", + "\n", + "* **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings.\n", + "\n", + "* **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.\n", + "\n", + "Geron's text, see chapter 11, has several interesting discussions." + ] + }, + { + "cell_type": "markdown", + "id": "23fed8cc", + "metadata": { + "editable": true + }, + "source": [ + "## Using Automatic differentation with OLS\n", + "\n", + "We conclude the part on optmization by showing how we can make codes\n", + "for linear regression and logistic regression using **autograd**. The\n", + "first example shows results with ordinary leats squares." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2b199ebe", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[3.89044267]\n", + " [3.11620886]]\n", + "Eigenvalues of Hessian Matrix:[0.31812561 4.63042739]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own gd\n", + "[[3.89044267]\n", + " [3.11620886]]\n" + ] + }, + { + "data": { + "image/png": "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f7uDL76/68OX39/u4C/v75KSEgCoswirt97jPhUMXbx4EXq9vla1+ujo6FpV7U2KioqsHl9VVYWLFy/WeYytc3qbK9dd0xtvvIHS0lKMHz/evC0lJQXLly/H2rVrsWLFCoSGhmLAgAE4duyYW9vvKleuOyYmBkuWLMHq1auRk5ODdu3a4c4778SWLVvMx/j77/v8+fP44osv8Nhjj1lsl/vv2xX+8P52B198f7vCH97f9eUv728hBLKysjBw4ECkpqbaPM5b73GfKcdRnUqlsngshKi1zd7xNbc7e04puNrGFStWYO7cudBqtYiKijJv79u3L/r27Wt+PGDAAHTv3h3vvvsu3nnnHfc1vJ6cue527dqhXbt25sf9+vVDYWEhXn/9dQwaNMilc0rF1TYuX74cTZs2RXp6usV2X/l9O8tf3t+u8vX3tzP86f3tKn95fz/99NPYu3cvvv32W7vHeuM97lM9Q82bN0dgYGCtaK+4uLhWVGjSsmVLq8cHBQUhMjKyzmNsndPbXLluk08++QSPPvooPv30UwwdOrTOYwMCAtCrVy/ZfJOoz3VX17dvX4tr8ufftxAC//nPfzBp0iSEhITUeazcft+u8If3d3348vvbXXzt/V0f/vL+njZtGtauXYu8vDzEx8fXeay33uM+FQyFhISgR48e2LBhg8X2DRs2oH///laf069fv1rHf/311+jZsyeCg4PrPMbWOb3NlesGjN8YH374YWRnZ2PUqFF2X0cIgT179iAmJqbebXYHV6+7pt27d1tck7/+vgHjbI3jx4/j0Ucftfs6cvt9u8If3t+u8vX3t7v42vu7Pnz9/S2EwNNPP42cnBxs2rQJSUlJdp/jtfe4w6nWMvHxxx+L4OBgsXTpUnHw4EGRmZkpGjVqZM6qnzlzppg0aZL5+F9++UU0bNhQPPfcc+LgwYNi6dKlIjg4WKxatcp8zHfffScCAwPF//3f/4lDhw6J//u//xNBQUFix44dXr8+W5y97uzsbBEUFCTee+89cf78efPPlStXzMfMnTtXfPnll+LEiRNi9+7d4pFHHhFBQUHi+++/9/r12eLsdb/11ltizZo14ujRo2L//v1i5syZAoBYvXq1+Rh//H2bPPjgg6JPnz5Wz+kLv++rV6+K3bt3i927dwsA4s033xS7d+8Wp06dEkL47/vb2ev2l/e3s9ftL+9vZ6/bxNff30899ZQIDw8X+fn5Fn+3169fNx8j1Xvc54IhIYR47733ROvWrUVISIjo3r27xbS8yZMnizvuuMPi+Pz8fNGtWzcREhIiEhMTxT/+8Y9a51y5cqVo166dCA4OFikpKRZvLrlw5rrvuOMOAaDWz+TJk83HZGZmilatWomQkBDRokULMXz4cLFt2zYvXpFjnLnuV199Vdx2220iNDRUNGvWTAwcOFCsX7++1jn97fcthBBXrlwRDRo0EEuWLLF6Pl/4fZumTtv6u/XX97ez1+0v729nr9tf3t+u/J37w/vb2jUDEMuWLTMfI9V7XHWzgURERESK5FM5Q0RERETuxmCIiIiIFI3BEBERESkagyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKxmCIiIiIFI3BEBH5pBUrViA0NBRnz541b3vsscfQuXNnlJSUSNgyIvI1rE1GRD5JCIGuXbsiLS0NixYtwrx58/Dvf/8bO3bsQFxcnNTNIyIfEiR1A4iIXKFSqfDyyy9j3LhxiI2Nxdtvv42tW7cyECIip7FniIh8Wvfu3XHgwAF8/fXXuOOOO6RuDhH5IOYMEZHP+uqrr3D48GHo9XpER0dL3Rwi8lHsGSIin7Rr1y4MHjwY7733Hj7++GM0bNgQK1eulLpZROSDmDNERD7n5MmTGDVqFGbOnIlJkyahQ4cO6NWrF3766Sf06NFD6uYRkY9hzxAR+ZTLly9jwIABGDRoEP75z3+at2s0GpSXl+PLL7+UsHVE5IsYDBEREZGiMYGaiIiIFI3BEBERESkagyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKxmCIiIiIFI3BEBERESkagyEiIiJSNAZDREREpGj/DyfcRT7ljAaNAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_16_2.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# Using Autograd to calculate gradients for OLS\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "def CostOLS(beta):\n", + " return (1.0/n)*np.sum((y-X @ beta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 1000\n", + "# define the gradient\n", + "training_gradient = grad(CostOLS)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = training_gradient(theta)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "xnew = np.array([[0],[2]])\n", + "Xnew = np.c_[np.ones((2,1)), xnew]\n", + "ypredict = Xnew.dot(theta)\n", + "ypredict2 = Xnew.dot(theta_linreg)\n", + "\n", + "plt.plot(xnew, ypredict, \"r-\")\n", + "plt.plot(xnew, ypredict2, \"b-\")\n", + "plt.plot(x, y ,'ro')\n", + "plt.axis([0,2.0,0, 15.0])\n", + "plt.xlabel(r'$x$')\n", + "plt.ylabel(r'$y$')\n", + "plt.title(r'Random numbers ')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e1d7695a", + "metadata": { + "editable": true + }, + "source": [ + "## Same code but now with momentum gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "74404bdc", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[4.]\n", + " [3.]]\n", + "Eigenvalues of Hessian Matrix:[0.331075 4.25018094]\n", + "0 [-10.99619572] [-12.63347711]\n", + "1 [-0.06146873] [0.05293756]\n", + "2 [-0.05668052] [0.0488139]\n", + "3 [-0.0522653] [0.04501146]\n", + "4 [-0.048194] [0.04150522]\n", + "5 [-0.04443985] [0.0382721]\n", + "6 [-0.04097813] [0.03529083]\n", + "7 [-0.03778607] [0.03254179]\n", + "8 [-0.03484266] [0.03000689]\n", + "9 [-0.03212854] [0.02766946]\n", + "10 [-0.02962583] [0.0255141]\n", + "11 [-0.02731808] [0.02352663]\n", + "12 [-0.02519009] [0.02169399]\n", + "13 [-0.02322786] [0.0200041]\n", + "14 [-0.02141849] [0.01844584]\n", + "15 [-0.01975006] [0.01700897]\n", + "16 [-0.0182116] [0.01568403]\n", + "17 [-0.01679297] [0.0144623]\n", + "18 [-0.01548486] [0.01333573]\n", + "19 [-0.01427864] [0.01229692]\n", + "20 [-0.01316638] [0.01133903]\n", + "21 [-0.01214076] [0.01045576]\n", + "22 [-0.01119504] [0.00964129]\n", + "23 [-0.01032298] [0.00889027]\n", + "24 [-0.00951885] [0.00819774]\n", + "25 [-0.00877737] [0.00755917]\n", + "26 [-0.00809364] [0.00697033]\n", + "27 [-0.00746317] [0.00642737]\n", + "28 [-0.00688182] [0.0059267]\n", + "29 [-0.00634575] [0.00546503]\n", + "theta from own gd\n", + "[[3.98232596]\n", + " [3.01522108]]\n", + "0 [-0.00585143] [0.00503932]\n", + "1 [-0.00539563] [0.00464677]\n", + "2 [-0.00483858] [0.00416704]\n", + "3 [-0.00429456] [0.00369852]\n", + "4 [-0.00379682] [0.00326986]\n", + "5 [-0.00335174] [0.00288656]\n", + "6 [-0.00295713] [0.00254671]\n", + "7 [-0.00260839] [0.00224638]\n", + "8 [-0.00230059] [0.00198129]\n", + "9 [-0.00202904] [0.00174743]\n", + "10 [-0.00178952] [0.00154115]\n", + "11 [-0.00157826] [0.00135922]\n", + "12 [-0.00139195] [0.00119876]\n", + "13 [-0.00122762] [0.00105724]\n", + "14 [-0.0010827] [0.00093243]\n", + "15 [-0.00095488] [0.00082235]\n", + "16 [-0.00084215] [0.00072527]\n", + "17 [-0.00074274] [0.00063965]\n", + "18 [-0.00065505] [0.00056414]\n", + "19 [-0.00057772] [0.00049754]\n", + "20 [-0.00050952] [0.0004388]\n", + "21 [-0.00044937] [0.000387]\n", + "22 [-0.00039632] [0.00034132]\n", + "23 [-0.00034953] [0.00030102]\n", + "24 [-0.00030827] [0.00026549]\n", + "25 [-0.00027188] [0.00023414]\n", + "26 [-0.00023978] [0.0002065]\n", + "27 [-0.00021147] [0.00018212]\n", + "28 [-0.00018651] [0.00016062]\n", + "29 [-0.00016449] [0.00014166]\n", + "theta from own gd wth momentum\n", + "[[3.99956181]\n", + " [3.00037737]]\n" + ] + } + ], + "source": [ + "# Using Autograd to calculate gradients for OLS\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "def CostOLS(beta):\n", + " return (1.0/n)*np.sum((y-X @ beta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x#+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 30\n", + "\n", + "# define the gradient\n", + "training_gradient = grad(CostOLS)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = training_gradient(theta)\n", + " theta -= eta*gradients\n", + " print(iter,gradients[0],gradients[1])\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "# Now improve with momentum gradient descent\n", + "change = 0.0\n", + "delta_momentum = 0.3\n", + "for iter in range(Niterations):\n", + " # calculate gradient\n", + " gradients = training_gradient(theta)\n", + " # calculate update\n", + " new_change = eta*gradients+delta_momentum*change\n", + " # take a step\n", + " theta -= new_change\n", + " # save the change\n", + " change = new_change\n", + " print(iter,gradients[0],gradients[1])\n", + "print(\"theta from own gd wth momentum\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "398dee87", + "metadata": { + "editable": true + }, + "source": [ + "## But noen of these can compete with Newton's method" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f4f7ac9a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[3.95845431]\n", + " [3.1424112 ]]\n", + "Eigenvalues of Hessian Matrix:[0.31758645 4.42644801]\n", + "0 [-17.28364423] [-20.62918713]\n", + "1 [-1.11891833e-14] [-3.34599467e-15]\n", + "2 [4.62954328e-16] [6.26536626e-16]\n", + "3 [-6.85866294e-16] [-8.50258788e-16]\n", + "4 [4.62954328e-16] [6.26536626e-16]\n", + "beta from own Newton code\n", + "[[3.95845431]\n", + " [3.1424112 ]]\n" + ] + } + ], + "source": [ + "# Using Newton's method\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "def CostOLS(beta):\n", + " return (1.0/n)*np.sum((y-X @ beta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(beta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "# Note that here the Hessian does not depend on the parameters beta\n", + "invH = np.linalg.pinv(H)\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "beta = np.random.randn(2,1)\n", + "Niterations = 5\n", + "\n", + "# define the gradient\n", + "training_gradient = grad(CostOLS)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = training_gradient(beta)\n", + " beta -= invH @ gradients\n", + " print(iter,gradients[0],gradients[1])\n", + "print(\"beta from own Newton code\")\n", + "print(beta)" + ] + }, + { + "cell_type": "markdown", + "id": "7fe85919", + "metadata": { + "editable": true + }, + "source": [ + "## Including Stochastic Gradient Descent with Autograd\n", + "In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using **autograd**." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f4ca22ee", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[4.21392756]\n", + " [2.76329289]]\n", + "Eigenvalues of Hessian Matrix:[0.24999088 4.37057274]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own gd\n", + "[[4.21392756]\n", + " [2.76329289]]\n" + ] + }, + { + "data": { + "image/png": "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PNxHJSMiIiItU30wJITAo48+ihUrViA/Px8pKSn+LhIREREFENUHQ1OnTkV2djZWrVqFyMhIFBcXAwCio6PRqFEjP5eOiIiItE71fYYkSbK7fPHixbjnnntk7YND64mIiLSHfYZ+p/JYjYiIiDROU0PriYiIiJTGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNc0EwwtWLAAKSkpiIiIQN++fbFx40Z/F4mIiIgCgCaCoY8//hjTpk3D008/jR07diA9PR033HADjh496u+iERERkcZJQgjh70I4M3DgQPTp0wdvv/22dVlqairGjRuHuXPnOn1/aWkpoqOjUVJSgqioKG8WlYiIiBTiq+e36muGKisr8cMPP8BgMNgsNxgM2LRpk59KRURERIEixN8FcOb06dMwmUxo3bq1zfLWrVujuLjY7nsqKipQUVFh/b2kpASAOcIkIiIibbA8t73diKX6YMhCkiSb34UQ9ZZZzJ07F1lZWfWWJyYmeqVsRERE5D1nzpxBdHS01/av+mCoRYsWCA4OrlcLdPLkyXq1RRazZs3C9OnTrb+fP38e7dq1w9GjR716MtWmtLQUiYmJKCws1FVfKR43j1sPeNw8bj0oKSlBUlISYmJivPo5qg+GwsLC0LdvX6xevRo333yzdfnq1asxduxYu+8JDw9HeHh4veXR0dG6+hJZREVF8bh1hMetLzxufdHrcQcFebeLs+qDIQCYPn06Jk2ahH79+mHw4MFYtGgRjh49ioceesjfRSMiIiKN00QwdNttt+HMmTN47rnncOLECXTv3h3/+9//0K5dO38XjYiIiDROE8EQAEyZMgVTpkxx673h4eGYPXu23aazQMbj5nHrAY+bx60HPG7vHrcm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baZNmyaSkpJEWFiYaNmypTAYDGLTpk0+PCJ5XDnul19+WXTo0EFERESI5s2bi6FDh4ovv/yy3j4D7XoLIcT58+dFo0aNxKJFi+zuTwvX2zJ02tH3NlDvb1ePO1Dub1ePO1Dub3e+54Fwf9s7ZgBi8eLF1m38dY9LvxeQiIiISJc01WeIiIiISGkMhoiIiEjXGAwRERGRrjEYIiIiIl1jMERERES6xmCIiIiIdI3BEBEREekagyEiIiLSNQZDREREpGsMhoiIiEjXGAwRkSYtXboUERERKCoqsi67//770aNHD5SUlPixZESkNZybjIg0SQiBXr16IT09HfPnz0dWVhbeffddbNmyBfHx8f4uHhFpSIi/C0BE5A5JkvDiiy9i/PjxiIuLwxtvvIGNGzcyECIil7FmiIg0rU+fPti9ezeMRiOGDRvm7+IQkQaxzxARaVZubi727dsHk8mE1q1b+7s4RKRRrBkiIk3avn07hg8fjrfeegvLli1D48aN8cknn/i7WESkQewzRESac/jwYdx0002YOXMmJk2ahLS0NPTv3x8//PAD+vbt6+/iEZHGsGaIiDTl7NmzGDJkCK655hr861//si4fO3YsKioq8PXXX/uxdESkRQyGiIiISNfYgZqIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESka/8PYAjYcKf1AIYAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_2.png" + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own sdg\n", + "[[4.15847501]\n", + " [2.79503363]]\n" + ] + } + ], + "source": [ + "# Using Autograd to calculate gradients using SGD\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 1000\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = (1.0/n)*training_gradient(y, X, theta)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "xnew = np.array([[0],[2]])\n", + "Xnew = np.c_[np.ones((2,1)), xnew]\n", + "ypredict = Xnew.dot(theta)\n", + "ypredict2 = Xnew.dot(theta_linreg)\n", + "\n", + "plt.plot(xnew, ypredict, \"r-\")\n", + "plt.plot(xnew, ypredict2, \"b-\")\n", + "plt.plot(x, y ,'ro')\n", + "plt.axis([0,2.0,0, 15.0])\n", + "plt.xlabel(r'$x$')\n", + "plt.ylabel(r'$y$')\n", + "plt.title(r'Random numbers ')\n", + "plt.show()\n", + "\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "t0, t1 = 5, 50\n", + "def learning_schedule(t):\n", + " return t0/(t+t1)\n", + "\n", + "theta = np.random.randn(2,1)\n", + "\n", + "for epoch in range(n_epochs):\n", + "# Can you figure out a better way of setting up the contributions to each batch?\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " eta = learning_schedule(epoch*m+i)\n", + " theta = theta - eta*gradients\n", + "print(\"theta from own sdg\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "81bbaf59", + "metadata": { + "editable": true + }, + "source": [ + "## Same code but now with momentum gradient descent" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f2ecc922", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[4.02970225]\n", + " [3.04000457]]\n", + "Eigenvalues of Hessian Matrix:[0.28225179 4.44767398]\n", + "theta from own gd\n", + "[[4.02930753]\n", + " [3.04033524]]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own sdg with momentum" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "[[4.0292555 ]\n", + " [3.02413786]]\n" + ] + } + ], + "source": [ + "# Using Autograd to calculate gradients using SGD\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 100\n", + "x = 2*np.random.rand(n,1)\n", + "y = 4+3*x+np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "# Hessian matrix\n", + "H = (2.0/n)* XT_X\n", + "EigValues, EigVectors = np.linalg.eig(H)\n", + "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", + "\n", + "theta = np.random.randn(2,1)\n", + "eta = 1.0/np.max(EigValues)\n", + "Niterations = 100\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "\n", + "for iter in range(Niterations):\n", + " gradients = (1.0/n)*training_gradient(y, X, theta)\n", + " theta -= eta*gradients\n", + "print(\"theta from own gd\")\n", + "print(theta)\n", + "\n", + "\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "t0, t1 = 5, 50\n", + "def learning_schedule(t):\n", + " return t0/(t+t1)\n", + "\n", + "theta = np.random.randn(2,1)\n", + "\n", + "change = 0.0\n", + "delta_momentum = 0.3\n", + "\n", + "for epoch in range(n_epochs):\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " eta = learning_schedule(epoch*m+i)\n", + " # calculate update\n", + " new_change = eta*gradients+delta_momentum*change\n", + " # take a step\n", + " theta -= new_change\n", + " # save the change\n", + " change = new_change\n", + "print(\"theta from own sdg with momentum\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "ddf05caf", + "metadata": { + "editable": true + }, + "source": [ + "## AdaGrad algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "8ac3a77b", + "metadata": { + "editable": true + }, + "source": [ + "## Similar (second order function now) problem but now with AdaGrad" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ec906255", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[2.]\n", + " [3.]\n", + " [4.]]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own AdaGrad\n", + "[[1.99997644]\n", + " [3.00011577]\n", + " [3.99989296]]\n" + ] + } + ], + "source": [ + "# Using Autograd to calculate gradients using AdaGrad and Stochastic Gradient descent\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 1000\n", + "x = np.random.rand(n,1)\n", + "y = 2.0+3*x +4*x*x\n", + "\n", + "X = np.c_[np.ones((n,1)), x, x*x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "# Define parameters for Stochastic Gradient Descent\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "# Guess for unknown parameters theta\n", + "theta = np.random.randn(3,1)\n", + "\n", + "# Value for learning rate\n", + "eta = 0.01\n", + "# Including AdaGrad parameter to avoid possible division by zero\n", + "delta = 1e-8\n", + "for epoch in range(n_epochs):\n", + " Giter = 0.0\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " Giter += gradients*gradients\n", + " update = gradients*eta/(delta+np.sqrt(Giter))\n", + " theta -= update\n", + "print(\"theta from own AdaGrad\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "b540daef", + "metadata": { + "editable": true + }, + "source": [ + "Running this code we note an almost perfect agreement with the results from matrix inversion." + ] + }, + { + "cell_type": "markdown", + "id": "4fbc5639", + "metadata": { + "editable": true + }, + "source": [ + "## RMSProp algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "80820b57", + "metadata": { + "editable": true + }, + "source": [ + "## RMSprop for adaptive learning rate with Stochastic Gradient Descent" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a51a1f9f", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[2.]\n", + " [3.]\n", + " [4.]]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own RMSprop\n", + "[[2.00211924]\n", + " [3.00515889]\n", + " [4.01229102]]\n" + ] + } + ], + "source": [ + "# Using Autograd to calculate gradients using RMSprop and Stochastic Gradient descent\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 1000\n", + "x = np.random.rand(n,1)\n", + "y = 2.0+3*x +4*x*x# +np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x, x*x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "# Define parameters for Stochastic Gradient Descent\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "# Guess for unknown parameters theta\n", + "theta = np.random.randn(3,1)\n", + "\n", + "# Value for learning rate\n", + "eta = 0.01\n", + "# Value for parameter rho\n", + "rho = 0.99\n", + "# Including AdaGrad parameter to avoid possible division by zero\n", + "delta = 1e-8\n", + "for epoch in range(n_epochs):\n", + " Giter = 0.0\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + "\t# Accumulated gradient\n", + "\t# Scaling with rho the new and the previous results\n", + " Giter = (rho*Giter+(1-rho)*gradients*gradients)\n", + "\t# Taking the diagonal only and inverting\n", + " update = gradients*eta/(delta+np.sqrt(Giter))\n", + "\t# Hadamard product\n", + " theta -= update\n", + "print(\"theta from own RMSprop\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "1dbb8774", + "metadata": { + "editable": true + }, + "source": [ + "## ADAM algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "53f97773", + "metadata": { + "editable": true + }, + "source": [ + "## And finally [ADAM](https://arxiv.org/pdf/1412.6980.pdf)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "88a61340", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Own inversion\n", + "[[2.]\n", + " [3.]\n", + " [4.]]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta from own ADAM\n", + "[[2.00013955]\n", + " [2.99942911]\n", + " [4.00048158]]\n" + ] + } + ], + "source": [ + "# Using Autograd to calculate gradients using RMSprop and Stochastic Gradient descent\n", + "# OLS example\n", + "from random import random, seed\n", + "import numpy as np\n", + "import autograd.numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from autograd import grad\n", + "\n", + "# Note change from previous example\n", + "def CostOLS(y,X,theta):\n", + " return np.sum((y-X @ theta)**2)\n", + "\n", + "n = 1000\n", + "x = np.random.rand(n,1)\n", + "y = 2.0+3*x +4*x*x# +np.random.randn(n,1)\n", + "\n", + "X = np.c_[np.ones((n,1)), x, x*x]\n", + "XT_X = X.T @ X\n", + "theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", + "print(\"Own inversion\")\n", + "print(theta_linreg)\n", + "\n", + "\n", + "# Note that we request the derivative wrt third argument (theta, 2 here)\n", + "training_gradient = grad(CostOLS,2)\n", + "# Define parameters for Stochastic Gradient Descent\n", + "n_epochs = 50\n", + "M = 5 #size of each minibatch\n", + "m = int(n/M) #number of minibatches\n", + "# Guess for unknown parameters theta\n", + "theta = np.random.randn(3,1)\n", + "\n", + "# Value for learning rate\n", + "eta = 0.01\n", + "# Value for parameters beta1 and beta2, see https://arxiv.org/abs/1412.6980\n", + "beta1 = 0.9\n", + "beta2 = 0.999\n", + "# Including AdaGrad parameter to avoid possible division by zero\n", + "delta = 1e-7\n", + "iter = 0\n", + "for epoch in range(n_epochs):\n", + " first_moment = 0.0\n", + " second_moment = 0.0\n", + " iter += 1\n", + " for i in range(m):\n", + " random_index = M*np.random.randint(m)\n", + " xi = X[random_index:random_index+M]\n", + " yi = y[random_index:random_index+M]\n", + " gradients = (1.0/M)*training_gradient(yi, xi, theta)\n", + " # Computing moments first\n", + " first_moment = beta1*first_moment + (1-beta1)*gradients\n", + " second_moment = beta2*second_moment+(1-beta2)*gradients*gradients\n", + " first_term = first_moment/(1.0-beta1**iter)\n", + " second_term = second_moment/(1.0-beta2**iter)\n", + "\t# Scaling with rho the new and the previous results\n", + " update = eta*first_term/(np.sqrt(second_term)+delta)\n", + " theta -= update\n", + "print(\"theta from own ADAM\")\n", + "print(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "8e34a6cb", + "metadata": { + "editable": true + }, + "source": [ + "## Introducing [JAX](https://jax.readthedocs.io/en/latest/)\n", + "\n", + "Presently, instead of using **autograd**, we recommend using [JAX](https://jax.readthedocs.io/en/latest/)\n", + "\n", + "**JAX** is Autograd and [XLA (Accelerated Linear Algebra))](https://www.tensorflow.org/xla),\n", + "brought together for high-performance numerical computing and machine learning research.\n", + "It provides composable transformations of Python+NumPy programs: differentiate, vectorize, parallelize, Just-In-Time compile to GPU/TPU, and more." + ] + }, + { + "cell_type": "markdown", + "id": "04f74999", + "metadata": { + "editable": true + }, + "source": [ + "### Getting started with Jax, note the way we import numpy" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a5c7d572", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import jax\n", + "import jax.numpy as jnp\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from jax import grad as jax_grad" + ] + }, + { + "cell_type": "markdown", + "id": "2c584b1d", + "metadata": { + "editable": true + }, + "source": [ + "### A warm-up example" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "651b82b4", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/jax/_src/numpy/lax_numpy.py:173: UserWarning: Explicitly requested dtype float64 requested in asarray is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n", + " return asarray(x, dtype=self.dtype)\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_39_2.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "def function(x):\n", + " return x**2\n", + "\n", + "def analytical_gradient(x):\n", + " return 2*x\n", + "\n", + "def gradient_descent(starting_point, learning_rate, num_iterations, solver=\"analytical\"):\n", + " x = starting_point\n", + " trajectory_x = [x]\n", + " trajectory_y = [function(x)]\n", + "\n", + " if solver == \"analytical\":\n", + " grad = analytical_gradient \n", + " elif solver == \"jax\":\n", + " grad = jax_grad(function)\n", + " x = jnp.float64(x)\n", + " learning_rate = jnp.float64(learning_rate)\n", + "\n", + " for _ in range(num_iterations):\n", + " \n", + " x = x - learning_rate * grad(x)\n", + " trajectory_x.append(x)\n", + " trajectory_y.append(function(x))\n", + "\n", + " return trajectory_x, trajectory_y\n", + "\n", + "x = np.linspace(-5, 5, 100)\n", + "plt.plot(x, function(x), label=\"f(x)\")\n", + "\n", + "descent_x, descent_y = gradient_descent(5, 0.1, 10, solver=\"analytical\")\n", + "jax_descend_x, jax_descend_y = gradient_descent(5, 0.1, 10, solver=\"jax\")\n", + "\n", + "plt.plot(descent_x, descent_y, label=\"Gradient descent\", marker=\"o\")\n", + "plt.plot(jax_descend_x, jax_descend_y, label=\"JAX\", marker=\"x\")" + ] + }, + { + "cell_type": "markdown", + "id": "245d5858", + "metadata": { + "editable": true + }, + "source": [ + "### A more advanced example" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "51bc9058", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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CIVCuP322xEKhbw+yryG/p7dgf6e3YH+nt2D/q7tIbVZlSAIgiCI+Q0pIgRBEARBeAYVIgRBEARBeAYVIgRBEARBeAYVIgRBEARBeAYVIhVOMpnE2rVroSgKXn75Za+PM6/Yt28frrnmGqxYsQK1tbVYtWoVbr/9dqRSKa+PNi+47777sGLFCoTDYaxbtw5/+tOfvD7SvGLz5s045ZRTEIlE0N7ejksvvRS7du3y+ljzns2bN0NRFNx0001eH6VioEKkwrnllluwePFir48xL9m5cydyuRy+/e1v4/XXX8fXvvY1fOtb38Ktt97q9dEqnsceeww33XQTbrvtNrz00ks488wzcfHFF+PAgQNeH23e8Mwzz+C6667D1q1b8dRTTyGTyeCCCy5APB73+mjzlm3btuGBBx7AiSee6PVRKgoa361gfvOb3+Dmm2/GT3/6Uxx33HF46aWXsHbtWq+PNa+56667cP/992Pv3r1eH6Wi2bBhA04++WTcf//92sdWr16NSy+9FJs3b/bwZPOXw4cPo729Hc888wzOOussr48z75icnMTJJ5+M++67D3feeSfWrl2Lr3/9614fqyIgRaRCGRgYwCc+8Ql8//vfR11dndfHqRrGx8fR0tLi9TEqmlQqhe3bt+OCCy6Y8fELLrgAzz77rEenmv+Mj48DAL1/BXHdddfhve99L84//3yvj1JxSL30jiiOqqq4+uqrce2112L9+vXYt2+f10eqCvbs2YN7770XX/nKV7w+SkUzNDSEbDaLjo6OGR/v6OhAf3+/R6ea36iqiptvvhlnnHEGjj/+eK+PM+949NFH8eKLL2Lbtm1eH6UiIUVEIu644w4oilL21wsvvIB7770XsVgMmzZt8vrIFYnZv2cjvb29uOiii3DZZZfh4x//uEcnn18oijLj96qqHvExgg/XX389duzYgUceecTro8w7enp6cOONN+Lhhx9GOBz2+jgVCXlEJGJoaAhDQ0NlP2f58uW4/PLL8atf/WrGRTubzcLv9+PKK6/EQw89JPqoFY3Zv2d2Uent7cU555yDDRs24Lvf/S58PqrfnZBKpVBXV4cf//jH+OAHP6h9/MYbb8TLL7+MZ555xsPTzT9uuOEGPP744/jjH/+IFStWeH2cecfjjz+OD37wg/D7/drHstksFEWBz+dDMpmc8WfEkVAhUoEcOHAAsVhM+31vby8uvPBC/OQnP8GGDRvQ2dnp4enmF4cOHcI555yDdevW4eGHH6YLCic2bNiAdevW4b777tM+tmbNGnzgAx8gsyonVFXFDTfcgJ///Od4+umncfTRR3t9pHnJxMQE9u/fP+NjH/vYx3Dsscfi05/+NLXCTEAekQpk6dKlM37f0NAAAFi1ahUVIRzp7e3F2WefjaVLl+Luu+/G4cOHtT9buHChhyerfG6++WZcddVVWL9+PU477TQ88MADOHDgAK699lqvjzZvuO666/DDH/4Qv/jFLxCJRDT/TWNjI2praz0+3fwhEokcUWzU19ejtbWVihCTUCFCECXYsmULdu/ejd27dx9R4JGQ6IyPfOQjGB4exhe+8AX09fXh+OOPxxNPPIFly5Z5fbR5AxuNPvvss2d8/MEHH8TVV1/t/oEIogTUmiEIgiAIwjPIdUcQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGdQIUIQBEEQhGf8P6ZyOHzGZunmAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_41_1.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "backend = np\n", + "\n", + "def function(x):\n", + " return x*backend.sin(x**2 + 1)\n", + "\n", + "def analytical_gradient(x):\n", + " return backend.sin(x**2 + 1) + 2*x**2*backend.cos(x**2 + 1)\n", + "\n", + "\n", + "x = np.linspace(-5, 5, 100)\n", + "plt.plot(x, function(x), label=\"f(x)\")\n", + "\n", + "descent_x, descent_y = gradient_descent(1, 0.01, 300, solver=\"analytical\")\n", + "\n", + "# Change the backend to JAX\n", + "backend = jnp\n", + "jax_descend_x, jax_descend_y = gradient_descent(1, 0.01, 300, solver=\"jax\")\n", + "\n", + "plt.scatter(descent_x, descent_y, label=\"Gradient descent\", marker=\"v\", s=10, color=\"red\") \n", + "plt.scatter(jax_descend_x, jax_descend_y, label=\"JAX\", marker=\"x\", s=5, color=\"black\")" + ] + } + ], + "metadata": { + "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.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41.py b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41.py new file mode 100644 index 000000000..08b9cf5c0 --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41.py @@ -0,0 +1,815 @@ +#!/usr/bin/env python +# coding: utf-8 + +# +# + +# # Exercises week 41 +# **October 4-11, 2024** +# +# Date: **Deadline is Friday October 11 at midnight** + +# # Overarching aims of the exercises this week +# +# The aim of the exercises this week is to get started with implementing +# gradient methods of relevance for project 2. This exercise will also +# be continued next week with the addition of automatic differentation. +# Everything you develop here will be used in project 2. +# +# In order to get started, we will now replace in our standard ordinary +# least squares (OLS) and Ridge regression codes (from project 1) the +# matrix inversion algorithm with our own gradient descent (GD) and SGD +# codes. You can use the Franke function or the terrain data from +# project 1. **However, we recommend using a simpler function like** +# $f(x)=a_0+a_1x+a_2x^2$ or higher-order one-dimensional polynomials. +# You can obviously test your final codes against for example the Franke +# function. Automatic differentiation will be discussed next week. +# +# You should include in your analysis of the GD and SGD codes the following elements +# 1. A plain gradient descent with a fixed learning rate (you will need to tune it) using the analytical expression of the gradients +# +# 2. Add momentum to the plain GD code and compare convergence with a fixed learning rate (you may need to tune the learning rate), again using the analytical expression of the gradients. +# +# 3. Repeat these steps for stochastic gradient descent with mini batches and a given number of epochs. Use a tunable learning rate as discussed in the lectures from week 39. Discuss the results as functions of the various parameters (size of batches, number of epochs etc) +# +# 4. Implement the Adagrad method in order to tune the learning rate. Do this with and without momentum for plain gradient descent and SGD. +# +# 5. Add RMSprop and Adam to your library of methods for tuning the learning rate. +# +# The lecture notes from weeks 39 and 40 contain more information and code examples. Feel free to use these examples. +# +# In summary, you should +# perform an analysis of the results for OLS and Ridge regression as +# function of the chosen learning rates, the number of mini-batches and +# epochs as well as algorithm for scaling the learning rate. You can +# also compare your own results with those that can be obtained using +# for example **Scikit-Learn**'s various SGD options. Discuss your +# results. For Ridge regression you need now to study the results as functions of the hyper-parameter $\lambda$ and +# the learning rate $\eta$. Discuss your results. +# +# You will need your SGD code for the setup of the Neural Network and +# Logistic Regression codes. You will find the Python [Seaborn +# package](https://seaborn.pydata.org/generated/seaborn.heatmap.html) +# useful when plotting the results as function of the learning rate +# $\eta$ and the hyper-parameter $\lambda$ when you use Ridge +# regression. +# +# We recommend reading chapter 8 on optimization from the textbook of [Goodfellow, Bengio and Courville](https://www.deeplearningbook.org/). This chapter contains many useful insights and discussions on the optimization part of machine learning. + +# # Code examples from week 39 and 40 + +# ## Code with a Number of Minibatches which varies, analytical gradient +# +# In the code here we vary the number of mini-batches. + +# In[1]: + + +get_ipython().run_line_magic('matplotlib', 'inline') + +# Importing various packages +from math import exp, sqrt +from random import random, seed +import numpy as np +import matplotlib.pyplot as plt + +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x+np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") + +theta = np.random.randn(2,1) +eta = 1.0/np.max(EigValues) +Niterations = 1000 + + +for iter in range(Niterations): + gradients = 2.0/n*X.T @ ((X @ theta)-y) + theta -= eta*gradients +print("theta from own gd") +print(theta) + +xnew = np.array([[0],[2]]) +Xnew = np.c_[np.ones((2,1)), xnew] +ypredict = Xnew.dot(theta) +ypredict2 = Xnew.dot(theta_linreg) + +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +t0, t1 = 5, 50 + +def learning_schedule(t): + return t0/(t+t1) + +theta = np.random.randn(2,1) + +for epoch in range(n_epochs): +# Can you figure out a better way of setting up the contributions to each batch? + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (2.0/M)* xi.T @ ((xi @ theta)-yi) + eta = learning_schedule(epoch*m+i) + theta = theta - eta*gradients +print("theta from own sdg") +print(theta) + +plt.plot(xnew, ypredict, "r-") +plt.plot(xnew, ypredict2, "b-") +plt.plot(x, y ,'ro') +plt.axis([0,2.0,0, 15.0]) +plt.xlabel(r'$x$') +plt.ylabel(r'$y$') +plt.title(r'Random numbers ') +plt.show() + + +# In the above code, we have use replacement in setting up the +# mini-batches. The discussion +# [here](https://sebastianraschka.com/faq/docs/sgd-methods.html) may be +# useful. + +# ## Momentum based GD +# +# The stochastic gradient descent (SGD) is almost always used with a +# *momentum* or inertia term that serves as a memory of the direction we +# are moving in parameter space. This is typically implemented as +# follows + +# $$ +# \mathbf{v}_{t}=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber +# $$ + +# +#
+# +# $$ +# \begin{equation} +# \boldsymbol{\theta}_{t+1}= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +# \label{_auto1} \tag{1} +# \end{equation} +# $$ + +# where we have introduced a momentum parameter $\gamma$, with +# $0\le\gamma\le 1$, and for brevity we dropped the explicit notation to +# indicate the gradient is to be taken over a different mini-batch at +# each step. We call this algorithm gradient descent with momentum +# (GDM). From these equations, it is clear that $\mathbf{v}_t$ is a +# running average of recently encountered gradients and +# $(1-\gamma)^{-1}$ sets the characteristic time scale for the memory +# used in the averaging procedure. Consistent with this, when +# $\gamma=0$, this just reduces down to ordinary SGD as discussed +# earlier. An equivalent way of writing the updates is + +# $$ +# \Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +# $$ + +# where we have defined $\Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1}$. + +# ## Algorithms and codes for Adagrad, RMSprop and Adam +# +# The algorithms we have implemented are well described in the text by [Goodfellow, Bengio and Courville, chapter 8](https://www.deeplearningbook.org/contents/optimization.html). +# +# The codes which implement these algorithms are discussed after our presentation of automatic differentiation. + +# ## Practical tips +# +# * **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented. +# +# * **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case. +# +# * **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings. +# +# * **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications. +# +# Geron's text, see chapter 11, has several interesting discussions. + +# ## Using Automatic differentation with OLS +# +# We conclude the part on optmization by showing how we can make codes +# for linear regression and logistic regression using **autograd**. The +# first example shows results with ordinary leats squares. + +# In[2]: + + +# Using Autograd to calculate gradients for OLS +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +def CostOLS(beta): + return (1.0/n)*np.sum((y-X @ beta)**2) + +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x+np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") + +theta = np.random.randn(2,1) +eta = 1.0/np.max(EigValues) +Niterations = 1000 +# define the gradient +training_gradient = grad(CostOLS) + +for iter in range(Niterations): + gradients = training_gradient(theta) + theta -= eta*gradients +print("theta from own gd") +print(theta) + +xnew = np.array([[0],[2]]) +Xnew = np.c_[np.ones((2,1)), xnew] +ypredict = Xnew.dot(theta) +ypredict2 = Xnew.dot(theta_linreg) + +plt.plot(xnew, ypredict, "r-") +plt.plot(xnew, ypredict2, "b-") +plt.plot(x, y ,'ro') +plt.axis([0,2.0,0, 15.0]) +plt.xlabel(r'$x$') +plt.ylabel(r'$y$') +plt.title(r'Random numbers ') +plt.show() + + +# ## Same code but now with momentum gradient descent + +# In[3]: + + +# Using Autograd to calculate gradients for OLS +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +def CostOLS(beta): + return (1.0/n)*np.sum((y-X @ beta)**2) + +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x#+np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") + +theta = np.random.randn(2,1) +eta = 1.0/np.max(EigValues) +Niterations = 30 + +# define the gradient +training_gradient = grad(CostOLS) + +for iter in range(Niterations): + gradients = training_gradient(theta) + theta -= eta*gradients + print(iter,gradients[0],gradients[1]) +print("theta from own gd") +print(theta) + +# Now improve with momentum gradient descent +change = 0.0 +delta_momentum = 0.3 +for iter in range(Niterations): + # calculate gradient + gradients = training_gradient(theta) + # calculate update + new_change = eta*gradients+delta_momentum*change + # take a step + theta -= new_change + # save the change + change = new_change + print(iter,gradients[0],gradients[1]) +print("theta from own gd wth momentum") +print(theta) + + +# ## But noen of these can compete with Newton's method + +# In[4]: + + +# Using Newton's method +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +def CostOLS(beta): + return (1.0/n)*np.sum((y-X @ beta)**2) + +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x+np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(beta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +# Note that here the Hessian does not depend on the parameters beta +invH = np.linalg.pinv(H) +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") + +beta = np.random.randn(2,1) +Niterations = 5 + +# define the gradient +training_gradient = grad(CostOLS) + +for iter in range(Niterations): + gradients = training_gradient(beta) + beta -= invH @ gradients + print(iter,gradients[0],gradients[1]) +print("beta from own Newton code") +print(beta) + + +# ## Including Stochastic Gradient Descent with Autograd +# In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using **autograd**. + +# In[5]: + + +# Using Autograd to calculate gradients using SGD +# OLS example +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +# Note change from previous example +def CostOLS(y,X,theta): + return np.sum((y-X @ theta)**2) + +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x+np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") + +theta = np.random.randn(2,1) +eta = 1.0/np.max(EigValues) +Niterations = 1000 + +# Note that we request the derivative wrt third argument (theta, 2 here) +training_gradient = grad(CostOLS,2) + +for iter in range(Niterations): + gradients = (1.0/n)*training_gradient(y, X, theta) + theta -= eta*gradients +print("theta from own gd") +print(theta) + +xnew = np.array([[0],[2]]) +Xnew = np.c_[np.ones((2,1)), xnew] +ypredict = Xnew.dot(theta) +ypredict2 = Xnew.dot(theta_linreg) + +plt.plot(xnew, ypredict, "r-") +plt.plot(xnew, ypredict2, "b-") +plt.plot(x, y ,'ro') +plt.axis([0,2.0,0, 15.0]) +plt.xlabel(r'$x$') +plt.ylabel(r'$y$') +plt.title(r'Random numbers ') +plt.show() + +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +t0, t1 = 5, 50 +def learning_schedule(t): + return t0/(t+t1) + +theta = np.random.randn(2,1) + +for epoch in range(n_epochs): +# Can you figure out a better way of setting up the contributions to each batch? + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (1.0/M)*training_gradient(yi, xi, theta) + eta = learning_schedule(epoch*m+i) + theta = theta - eta*gradients +print("theta from own sdg") +print(theta) + + +# ## Same code but now with momentum gradient descent + +# In[6]: + + +# Using Autograd to calculate gradients using SGD +# OLS example +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +# Note change from previous example +def CostOLS(y,X,theta): + return np.sum((y-X @ theta)**2) + +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x+np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") + +theta = np.random.randn(2,1) +eta = 1.0/np.max(EigValues) +Niterations = 100 + +# Note that we request the derivative wrt third argument (theta, 2 here) +training_gradient = grad(CostOLS,2) + +for iter in range(Niterations): + gradients = (1.0/n)*training_gradient(y, X, theta) + theta -= eta*gradients +print("theta from own gd") +print(theta) + + +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +t0, t1 = 5, 50 +def learning_schedule(t): + return t0/(t+t1) + +theta = np.random.randn(2,1) + +change = 0.0 +delta_momentum = 0.3 + +for epoch in range(n_epochs): + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (1.0/M)*training_gradient(yi, xi, theta) + eta = learning_schedule(epoch*m+i) + # calculate update + new_change = eta*gradients+delta_momentum*change + # take a step + theta -= new_change + # save the change + change = new_change +print("theta from own sdg with momentum") +print(theta) + + +# ## AdaGrad algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html) +# +# +# +# +#

Figure 1:

+# + +# ## Similar (second order function now) problem but now with AdaGrad + +# In[7]: + + +# Using Autograd to calculate gradients using AdaGrad and Stochastic Gradient descent +# OLS example +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +# Note change from previous example +def CostOLS(y,X,theta): + return np.sum((y-X @ theta)**2) + +n = 1000 +x = np.random.rand(n,1) +y = 2.0+3*x +4*x*x + +X = np.c_[np.ones((n,1)), x, x*x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) + + +# Note that we request the derivative wrt third argument (theta, 2 here) +training_gradient = grad(CostOLS,2) +# Define parameters for Stochastic Gradient Descent +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +# Guess for unknown parameters theta +theta = np.random.randn(3,1) + +# Value for learning rate +eta = 0.01 +# Including AdaGrad parameter to avoid possible division by zero +delta = 1e-8 +for epoch in range(n_epochs): + Giter = 0.0 + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (1.0/M)*training_gradient(yi, xi, theta) + Giter += gradients*gradients + update = gradients*eta/(delta+np.sqrt(Giter)) + theta -= update +print("theta from own AdaGrad") +print(theta) + + +# Running this code we note an almost perfect agreement with the results from matrix inversion. + +# ## RMSProp algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html) +# +# +# +# +#

Figure 1:

+# + +# ## RMSprop for adaptive learning rate with Stochastic Gradient Descent + +# In[8]: + + +# Using Autograd to calculate gradients using RMSprop and Stochastic Gradient descent +# OLS example +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +# Note change from previous example +def CostOLS(y,X,theta): + return np.sum((y-X @ theta)**2) + +n = 1000 +x = np.random.rand(n,1) +y = 2.0+3*x +4*x*x# +np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x, x*x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) + + +# Note that we request the derivative wrt third argument (theta, 2 here) +training_gradient = grad(CostOLS,2) +# Define parameters for Stochastic Gradient Descent +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +# Guess for unknown parameters theta +theta = np.random.randn(3,1) + +# Value for learning rate +eta = 0.01 +# Value for parameter rho +rho = 0.99 +# Including AdaGrad parameter to avoid possible division by zero +delta = 1e-8 +for epoch in range(n_epochs): + Giter = 0.0 + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (1.0/M)*training_gradient(yi, xi, theta) + # Accumulated gradient + # Scaling with rho the new and the previous results + Giter = (rho*Giter+(1-rho)*gradients*gradients) + # Taking the diagonal only and inverting + update = gradients*eta/(delta+np.sqrt(Giter)) + # Hadamard product + theta -= update +print("theta from own RMSprop") +print(theta) + + +# ## ADAM algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html) +# +# +# +# +#

Figure 1:

+# + +# ## And finally [ADAM](https://arxiv.org/pdf/1412.6980.pdf) + +# In[9]: + + +# Using Autograd to calculate gradients using RMSprop and Stochastic Gradient descent +# OLS example +from random import random, seed +import numpy as np +import autograd.numpy as np +import matplotlib.pyplot as plt +from autograd import grad + +# Note change from previous example +def CostOLS(y,X,theta): + return np.sum((y-X @ theta)**2) + +n = 1000 +x = np.random.rand(n,1) +y = 2.0+3*x +4*x*x# +np.random.randn(n,1) + +X = np.c_[np.ones((n,1)), x, x*x] +XT_X = X.T @ X +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) + + +# Note that we request the derivative wrt third argument (theta, 2 here) +training_gradient = grad(CostOLS,2) +# Define parameters for Stochastic Gradient Descent +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +# Guess for unknown parameters theta +theta = np.random.randn(3,1) + +# Value for learning rate +eta = 0.01 +# Value for parameters beta1 and beta2, see https://arxiv.org/abs/1412.6980 +beta1 = 0.9 +beta2 = 0.999 +# Including AdaGrad parameter to avoid possible division by zero +delta = 1e-7 +iter = 0 +for epoch in range(n_epochs): + first_moment = 0.0 + second_moment = 0.0 + iter += 1 + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (1.0/M)*training_gradient(yi, xi, theta) + # Computing moments first + first_moment = beta1*first_moment + (1-beta1)*gradients + second_moment = beta2*second_moment+(1-beta2)*gradients*gradients + first_term = first_moment/(1.0-beta1**iter) + second_term = second_moment/(1.0-beta2**iter) + # Scaling with rho the new and the previous results + update = eta*first_term/(np.sqrt(second_term)+delta) + theta -= update +print("theta from own ADAM") +print(theta) + + +# ## Introducing [JAX](https://jax.readthedocs.io/en/latest/) +# +# Presently, instead of using **autograd**, we recommend using [JAX](https://jax.readthedocs.io/en/latest/) +# +# **JAX** is Autograd and [XLA (Accelerated Linear Algebra))](https://www.tensorflow.org/xla), +# brought together for high-performance numerical computing and machine learning research. +# It provides composable transformations of Python+NumPy programs: differentiate, vectorize, parallelize, Just-In-Time compile to GPU/TPU, and more. + +# ### Getting started with Jax, note the way we import numpy + +# In[10]: + + +import jax +import jax.numpy as jnp +import numpy as np +import matplotlib.pyplot as plt + +from jax import grad as jax_grad + + +# ### A warm-up example + +# In[11]: + + +def function(x): + return x**2 + +def analytical_gradient(x): + return 2*x + +def gradient_descent(starting_point, learning_rate, num_iterations, solver="analytical"): + x = starting_point + trajectory_x = [x] + trajectory_y = [function(x)] + + if solver == "analytical": + grad = analytical_gradient + elif solver == "jax": + grad = jax_grad(function) + x = jnp.float64(x) + learning_rate = jnp.float64(learning_rate) + + for _ in range(num_iterations): + + x = x - learning_rate * grad(x) + trajectory_x.append(x) + trajectory_y.append(function(x)) + + return trajectory_x, trajectory_y + +x = np.linspace(-5, 5, 100) +plt.plot(x, function(x), label="f(x)") + +descent_x, descent_y = gradient_descent(5, 0.1, 10, solver="analytical") +jax_descend_x, jax_descend_y = gradient_descent(5, 0.1, 10, solver="jax") + +plt.plot(descent_x, descent_y, label="Gradient descent", marker="o") +plt.plot(jax_descend_x, jax_descend_y, label="JAX", marker="x") + + +# ### A more advanced example + +# In[12]: + + +backend = np + +def function(x): + return x*backend.sin(x**2 + 1) + +def analytical_gradient(x): + return backend.sin(x**2 + 1) + 2*x**2*backend.cos(x**2 + 1) + + +x = np.linspace(-5, 5, 100) +plt.plot(x, function(x), label="f(x)") + +descent_x, descent_y = gradient_descent(1, 0.01, 300, solver="analytical") + +# Change the backend to JAX +backend = jnp +jax_descend_x, jax_descend_y = gradient_descent(1, 0.01, 300, solver="jax") + +plt.scatter(descent_x, descent_y, label="Gradient descent", marker="v", s=10, color="red") +plt.scatter(jax_descend_x, jax_descend_y, label="JAX", marker="x", s=5, color="black") + diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_16_2.png b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_16_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4ada48eec6fa961e0a18c3c1c9777957fcbe1371 GIT binary patch literal 22314 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_1.png b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_1.png new file mode 100644 index 0000000000000000000000000000000000000000..63a694a365d630555eeb7df1a452ffa33b2bc604 GIT binary patch literal 20216 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_2.png b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_22_2.png new file mode 100644 index 0000000000000000000000000000000000000000..09b060bfd7f34c7c420fbdcfaa4ae253c4c2d4be GIT binary patch literal 21287 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 bo#i!AdP7N<6gv5UR_g5a-S5-l9d+V=m7WfA literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_39_2.png b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_39_2.png new file mode 100644 index 0000000000000000000000000000000000000000..06ae2c745ee6e5edf82c5c9a059d9c005ab255c9 GIT binary patch literal 20636 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 JpPacw{x|IowdVi; literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_41_1.png b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_41_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7b0e0a7a1ac621f1b099b87e4654bf1239b3bf GIT binary patch literal 31965 zcmbrlhc}$v7dAWuQN!p$h#}GI=)H^~hqD8Mk zMDIcPZqM&s?;r4fYq884_c>?Z`d3;0+Fbx!t_8OYzPR1m4lB5 ze8bmCO9T87_f|6Y)^|sE`&oI~fi$hWU%I$^yEs}u_OPc zI=MN&85Fj^UsZ-iM?A&{e!A`jn=^&qeMD|Y5rY5wQtI{p(+8I2Q>^bPgTF@S=HgXZ zv6Xb&WFE+q;mDIc)qzt{P*51R`3nTMA7#c&M5(&F^R=|Jw8`N8_khUO@89zF_VzO) zDJ^8NFbL@AmSxOgVr~3xG>%oYF?V!zHSeyB`GayI@Kj=~a*+Y@?q9Gdt6oES1pNPx z)c-HHx9U+;vd!`l~8cyE0m4U@v+o)Qhn| zucIQ0ALc6*<6K3r(PnB`U)|^iACtCz`A@C7xEid2pzyE8U2CbI?o&aYs6I4EcE7O_ zUEGNe@P7!Xr0`+-W2Hz-*6~2*Hv{FLez8gR^C}~1Xnm!ni^Z1=VXMA?%?S8=k>&G3@V+KyxvrfvCs06FvjW@!e@EVy@ z>NAGilOto`;U1|cA~{nxlBL+)sgq;51%S*05fF01iahN$rW!n z-vNj1B`Lzdj<~0ctlTNxM40kGUYFA4W|W|;=Fn!YUH5vrB7`w75qK`$oxh0F=4GKo zFr=Cak|pXMUC93FcS+WKpqdIR(P7IXBHF}kL9XqBfmXlx_z~= zff(cKBl$vh=*(oZtt!mJ0s%H;-l_?r$72HNB1-vF-TGiZWIxE`=I>^FC`WazH4Ej$ zZCqDWA*))-J}@(my)knk``;xa^%nH#ZflavCA)d>p%NeuW@3{qRgE<@5SKPS;637d z97#z8C{R}+4j&lxl^$WZ>r~zSDuqK2mi=RV{58FM8<lNp!3Ee+HKzD@}Ds!=)gJGwmUgc=zwuxh+WGU}FJ4QpZEki(b+8 zS8|WTUCvbDR^ug_v`kFXp{FM&NQuR4)*mXFa7A1nR<-}lMOT7km|O(q2mXLZH6n&3 z_odn{w=1ABXLU&-#C?oG+%o@uYj^LTGaU*S=-?OVs7|DCf5pb2sxoS)GMSYkfsI=x z(uburPj;7X{YLNVdYMH%Q!-{IkA=OwKI|L0Fb)ZkHhum)>EaWLl749tgD(EhoP({R zRP|j+0NbI>R<(XCa!Uk$X2>I7cep^t0Ra>n`Pev7m6bs*NNDL%S+qC2Kp$EkaQVA* zAy{1HEz{DI|GP3|1tbBnYKu-E^`2}$bZi@=?~YK#XY&;y2+H~VSg9E2f9tsk7H~l1 zs~)j?PCHnNIxi#`jG+h}P$E&80>3n2uVWcPQ&Qa!;q2mT@&B3wJ_Z*UH zr%+-_tZ@J3>cgPtggVT65!P$1E)l&I3@L}dh0OOKov$|%0E0Yw^i68j7F5NMi4hQp zpc$MChP{}ET^$JHj0HwivU@xSs}UV5sDw zIN-p)A5zT@QR9TIKNXLG6rwpPo5-0n9cXw%L}v{z1wBHM+4qqG81 zEM`-Li5g*kt-K*g1jkv{Y+ZWOMSOrMRNwuBiamM{VaOeQ=tSj0u|UT){rrOe9gFTd+5G0SNiGr>9b(XJ3DGD%nU0W*1u= z$BGQXqJk({hCnShE~*RJqrv8Nas39I7F!dOTMPBkIyW6^V8DT21XpNH^y%HNCr?-Jq(c0)w`Y{N3oXDHH<&&Iya_oaK%4 zwB6Up%0AQs7bpNH+S>dpWy%(@5^QH(BW?(NWX-UUBVAZw7mGB6>ES9BD;vR#nFZym z=m5C`lw2-Vm0;d!`1-K^N>1i)C^YdjWs0pln1GHF?1TZ-JER`R0Vy1Z>qp&p(u1)U z|J>s3uJWF=j#FiQ8}|B*$(@rV?M_wWVBCuffJJgaYz^PN_l#35%SR&JFv$?Wk29ym z!XDZ$oeB-#eus()iR>Pl7&ChoLm)#e3RQFgVU)an77ABji=E5x?R;f6XJP* z(y)SL$cJ&i3iE$SZ%weTS79@IQElafFl^y;XE%Xc8>i@UcP;SLJJprbt0j_?l_g15rFr9#&3Wf zt1HH2d?zCCKzmP(=@ZcP<84ZaSckP%17yF7NjyZ+fKqW@{hhmcQt@5mBkGlkXhobp%s5)rY)e&1`5fv09@H-;mD2OsBH-cq z_4%ARQxuR;3f5!L;RV8LXq94b=aO^K4 zE5EPK#dAPR6OlMo86k=upucP}qJcJydC|b?QrwHu%lc#j#JF2g$g4Qj1|+0wPaG|w z|Lx_o@A=#MiO5Jm+e#R8pbsaZ>#>`F60GoWVQ=Nr+0w|K2j6uJFb9W=cXN3)BAO2w9 zsepYOD>5zQlq(3)#$h#A*KZJkL!)#}$%{DUqEvOiC+){2`RDxrya*=*jkaDIeS3Db z*{Xt24FN1ou$wUDY4;Xyvb+8Sb@e~DM*Hs>a4My-p<*eblwww*eGss&HR7szw44r8 z$yuXf>mV34V2c;`#?ME)wBG;Ma(byfkh1U(IurB23!4#%1~AY9dFL^faT+l=oG_)3|2D>G06p8)TBr~GE4pnf*zNOnkaHm_HiOFb zR4fF}1rn?z$I%t193->)lv9mvMr`Q7{HYR6CDwNsg27?-QY3$psz@o}Y5CB% z_6W$w%Ekx#rtgek<`VqTzu*3>>H+j3#olBe{k7L&VOF%8FxR16fwkWvmaQJWz7?hF zsKk03VC~lOOA6v6FZ;82CNkzX`YQTZc@hx9c*->9TY^>bM{$=W+3lGOz~v7Kn)ZVo zc~`+6`d}awRhm$dO#q1t%=Q;%|~Zb2Jsm9v3lAh{pd< zD>&&Uji1|%oqNCN)cbQ1J*{q?$t)+0?CLnA52UOqvNb>ZUCQTtm1zZk z3(uNc7FyZLr8$Os87bQgULE`5PAvXMo+QFX&845k$LZH3;^)qu* zbj(=i48D0pZy*pR<=++F%zF636vfC|0o$YKTZn`GaCYrbqy(eOF)O`PYp4A@5u5G!yd4_9hJe&q_Gu& zD3_xg;sB@5xg1hPcO1j*T$Od`@tuMhzmS|CfuwYf`BZ^?s}09>a4Om6Puxq}nFcIW zt}FwMwtK&bg{RcBHZ^oKl@Zt9`|huTt^F-dG+SzQUOZs6#6@-}ba<;iv{IO&il+$a zK-%%P(v*tzJ8Dnx1_dqU z@3e5N?gXFyfU!oOE`Jw~jpBq1G3h}RaSlXAQA(|Rj@3Mucy6xvSfBtPyGf=-7`k$f zWjdA-I8+G1w1?9nDTL+Xc#k=IVlt8_>G{@a3W8tn04X&2uKlk{w>$t|0W6iSQbo4`Cb;|} zTA{}*81I?oM+XFPlu2W7G=6>%Y?YA`a%BQoP9fP{JV(DNH^A%g|4bA1QyeL~&-mkw zdbd22dFz@24l6B%U9JDQ9wS(ej~IB(ttvX`D+I&)MKz&z^{9UC^zUF^XTvIMC0q7= zu*sNju`U(JbfEGX8GL{y^c0VAVXEj~dlhr!;crUv-wby-(ys_SQf*NR*A=r21=j5! z>!@<1->X)H(|0NF)~NFj$+qcwFdTzY)Mt@>?8N{WV6~Jf)f#N2t#~I{%xgWoQ8i_i4s}wfoop&;@aomB?Y` zi(tY;r;&=st)zqcNLJ`&SF0WZE~hO)B`#cqMwhs>E@X~1?LS)vl382oOq0eJ&QCi% zVQsoFRM8i=OW4mI4SO%M0nXV?{ZT#s$_HckeDVgkL3nHZ8wRj$EN)bEV-geGp|2ls zBvF1cAA%)&5<;N*<=h{m*j=0bF#PpsVtwdho}3_gCPZ(z^7|s?B0B`DLtEXx)n$*n0hoX7ic^1>GY6mjFKum$bYb(OAK`(a-`%y{GQT;1o25_H$ zFTRb6?57E!v0F^w>l3K4GE=7kPD=+2lD|T)r!_d8eu=6KnVz1BMJ%w-%L%#K>?gC* zagKhBj?alwSWl0F5~bKxogQ3K0x9#>d)wOyhqhY#5{cB)xAkoC{_ibEDN{_MR5d$e>~L{?Ml9z~y{K%w6EUsCq9ur* zuQy*1egb#_AfqRR#vvCo54FID){*ZM+8R~5>}0jik$36+aZX+N+Y;Ye4>Oh)E1#}O zuXonfQGUcBPRjGbhRxV-I~HSznKRo=UpO8i`{OeX%}S6++8p6s@L|3%1r*$NkCtXB zL`S4kp~3U$x@RB3<|6HLdKNbl)IL^^A6prM1?H3d z8|?w0BhaE!{KC0p84S)xYGfF|=0z$V66JoT0vjUlbi5(?0RTdp;FKPgu9CkSdax7Z zc|&b%Ua_N6k1_J#^L{b_J^-(xh83rpo$+3S6XF&CGk#uD-7C9!#OZpEuMvT7z1S@X zOEjV7x!kNEjOrh?C12Cu%lM=IbqM`S4~`Y$^t5!F$7?Yi4x>~WBgA8jQspg$=;Q0L z)T1NQ1xN|tFhYH(k5?eg*7b z0uZ(E2FYG4X^^|Ia25;sgG(}YoZQ%>SO>y30=U8mxraHWKp4JU9P%wNyMPjFmVU~> zQO+NPJ6ZiJ1R(xTQtJlay(kPxLHOCmQ+VX#4ZfJ(60o+N?%Me~%@D19w) z+!R%u-QC?!CqLBdoTqtH_HojR~wajjSS#v!j#WOaC*l(I5rgI zdsg=d`fW~-*n~2rPT_fPX}U8seo@p0Ar=8%-O`+3Lj>Cu{aR3PU_Kgxjx4wQsqUVt zdVV;eug#n~upB|eD<{Pp6VyVR8UJ~RzI$`cnZeq@3gHC=TN~%zN5?dC&6dhwEbs1Z zvi~;uqgVd*7O!F&H`pdx^)qnpU6)YoN-$>(fHcLL5UkJOxFD~jW|4rS0XF;Vo3Hno zU_n8WP3}vH^}`bC>*{mLz@xOK&+I&dsZxqRkC}D;lY?r41y;aV#4K$9dEC=xH_cGg zN^FQ^V8~I1_9*BW4J@K2(xr z%g}&O$73#jJym8qeBreK%-;6|HoLV4*f7Wp99#Oaf1{^n8d2?WTtz2XLEaOLIA3N3 zFlR!eyf;kIPS!}5GGr4KvrFeIo$2iT9^ksVN)Uu`NRA}@j+iBbMo!4IMVPej&d*mW zi~+^#n=Xq0E0mBhTLW_`m&HD^bD$**C_mSw(4SU&5MWZJ1?;b_P^hh=J0|P?!dRw@$=-_SCaT8fs+~ zOjC9}HH483qzgMukX_ke`m!3g3L|^h%bThU$K!&X`5Plq{7Fb9CD_jiRO|{q-pCa3 zG4d__XJ3i}1RM_c=q3?e-jux+&kenFtTe7G+}Vs#V2)Jy^+YBmT^NlmmoA?EITMcg z)(U;tg@x+TuckFTwVnLyZn)6mM|+oWfDVq|Kaj_IIc>-G)xFD3n{2WxE96(vf_?on zY^5HTHc7>c3DgGILws}yrV*8eFa6DD+AJo9DU|l^jlr?7(WRxNo10J#ZSDAAlR0Cw zRwGFp5Fx{v)q8N2VD6ao6C^)?$1BUultoHci8=!Bfok1Mpw}|EvO&MeZho;9qsSt` z^%PLz4e)QqI4{lOrY?Wx==`yDA5>$Z5*MVz6l$7?-#4WpObIz(3X|>a>+?99v9}p3 zRGO^;I9rYN!P(w4NY_}U(>E6EPm*1dRsy4_4EVUoWaFqX`#)XH8zE% zh)NE~wJG#t20W@6!5Leeu>H0IVr}Jw_tJd{g+{0K`E|?7ZaZHiOFz=)YGm9<@X_UI zt?eysq=vam+&*$}#b2q>GRA@9-W-m-KNzPWEquD%y+N9@e5gjy^?Z@H!AK&@x$%DC z=YzkLl`nLXrh{yLN{hu(+4+tmt@WJ4vUp(g8JQlEqud!OgDj9f4p#Xjzr0q7ck)%(3ud1!Qp`cl7cvl4qx9FJNJUhf!;Cw(u zn4+XnC~;i|bTX*}U>zxq+L1bbS#I&U-QaVD^AjTakq9SBr~U_RrbxqPrRp-IzA ziG`j$O!q+XF9n!Ucz}gHbcR6?w_Mz1JGVQ`DVh*WFs8q!kq&=-y+}zss1M~0fTgdJ z3pgHFH&9WgfCs2j%>Gea{2P|X2_|$4+TVVY=Qrj-w4#4kH?p~{ZHuQTP!RfJ6QE?H zTl7rTa!2{#)=6xnykc;t5;c0FB*eqGs?}}NFPEd52Te^yE-M1;!`@ae< z4~e$W`1?SRV7Ar*ucTLU0wI#2G#Q6l%TOQ=e-P|ZCu|dyrr?ZF^{n4cd~E{?r;yCr zxPIX@LKay^R#$?oog_7v%GRJZT?(kldZz#zS|<)dRvlg~L&0h6w$lK0e3a7g*vL_R zUyKu?&*2=Ws#w6E{6&~0sAZe${_*ny?QNIrV=q1_H)g<8YtDOX-I23U*eO^WLB{oh zf?C*AANF%Q1~4A+_t1dKhj6;Wr}jU;bh`w>V9wD}5b`cUFqcQGR4F3e+t^(f>;VKG zU2r*0{kAt}d^4dWbch|ob1EzrLZvxEHc13UD|cayx0cdkq8v^&w5X`F%n2*#AjG;? zh=%(X6zBAEqdz2pDna+NC^X-fwIZag7iYun#KkgXxbn+buB)z}Z;binrRg+NbshN79_s5rgAh z>7v^+<`xuK-SolWM)#*yRv!R{7Q8}tsKp5WTT6L3T!Ikefapgtk>^?8Bn-5%u0DrO zoelA)6KCnas^bucgSnL9%3dKPi#`USfg1$C_Q9jgia3kD6@ksKs^|n5Q;MUWQ~;!7 z_sWVW&rCI)xE3=30TB_>p9^yMc8^rx%GUh(!5a-Pp&{z-YM}6NHEQtw_MwT2zaJ$E z&E|`7H4yG9vA>B2_U_%7WUf2rClAax4LKJ(r~!^O=7A{`mLP_f+(7`puLr32`vkGO zQslqn36pg98lJXS`We}yQz{zANMnl^r54`n(8@&Z(z<5;zn*V!m2g13FY3wUJ0f!a zQRMDo9^>=XW-)gie3vYd-ZA;qi+$pp?NM2$)-#xf7=*K zXIWAXFXj|1(8L&9OwDiW%Kjv-dGx)4IS132`NAcwx8?CLdxL$b;x1ib+!lTFd-Qk9 zac?&o$j}-yW&#CQVlC6gh%LBiBjB-Py?&Y*aB(gO$DcT4-J4vkST2|~K%@F76>F{z zWEc_NkX1P0uU!j20)^Y36MIR3<@*!R=oW}|J(=U7>XXJSmcl0$T3)%C13$Aeb>WY5 ze2kGgAJJ{B-0YCRM0~z_bfW3Jcz^g7K(NWAssP=`j#SaI3R&9A_0nfxlLLT5WB7+v8vIQM3%;JkD*o=jUz0XVWL$f8dMYT$)dIzY%yg{uA( zHzv=--O1_xFVmXsQSXtwEq==lSA! zt!aLSni38_B34WiaPj0eN?;&s?_8DfzksC|S^?o5)F^B%4KZzNB`M;}Pul;EFtm%` ztHjBmdi@vHw9hnoS&buL@!Kn%8GHR6)~jpNc#mPcQO~Vch$+T16e*|Fw4=i-1hwgl zwvTu9D}mV;&9Q`VUCL@Tzu7Lycv;p=6M&i&#B>eql;fFK|Kp9>BdwcGvtn3S4Bu#Z zTrzHQ6iarTtN37T;ng*!rf%wAzM^kJBRc#tBv3ta(`U*lpRUvW@DT@uyy%O7hGCg$ z8vgyy!{rdcC#v8vHpC7GB*Evhi@kX|^t}QcF0DIR09ife5c9!x9!b`YOkb*%hWb)3 z(m9@5W)AON@aD@N9A>@|3grVZSGbjGm!osEFQz}9N(pC_C=G{Hsi#B*)|GT~TXkRIdA z7KzhAf2kp%!1lt!J^D~Nx}hwl?K<<1l8_<-Hdd{l!C-xk>b^MfVJ_Q5Mj|!f@7-aKn|R=hJCCYurm@(EKs78`|_Fe0Gq;)U!b_g z5dVB`Nxh^%H(3GFUsyPGXycZN@<~`nDp0o|G&UO`K7hl>sk=4by zzwyHtZ_gQ1yhUQ#6(nqpydE|04+cX<_UYvf-~4_Yu}lC(OXQ?uo#ZPv1Fi-NqlGYD zko)e5GnhhWx2l)y)gO@q^<~^0c_e(waF;U2-7Y1_q8PZAkF;jQB zPC=61=ee4DM_vm-QG!+0TK~o;5?5v9rbNiXV9eGBvHfo#>SS%p z<##2~8UpdjM<3pDK)`C0U^twFw8QW}o#NJW0{*G6QCUg{MjkEtZZe$5HP|Q|@&;2r zn;N+Q2zib~sgpTO>FdB?ln^#<@&4h0fk-KC<>wrhH>^p>Hscu}P~`oY=(N2KtY8G2 z39d8cxy=jFc?h<1>E>tjPic(qch6Qo1$7c#4Y27Qy3FAl(0zFen)u5RG(M~*8*9(xxau1o^4(<=$z8Pop;4K#ri zT8&hGXH#Ky+?p{VAtbN6_v-6YM3;OX3!S!dy^~SASHNf5q1u*^rLyFG?N4%kqA$10 zJEKX`AJWO=hp!$N*$p^dq~%1)@<A^A9ohTNW4Sw)|b$&5JtNCfZ-8 zU9vl;SE?(~IB>x9I~X?BG><@cQ2Wv1t_ls30{3X2DBi@WY5)g42wN}{K)W-zc{K~;3_joq6=Y4h+ zXj+s@JOJ45VM;{UF&&&hpvQ_h? zyY>m*kg58K9^9O>oXfi%uZn$5E%`3lKQfw;9gx-L}Pr-NRSwG}FGa3=x9>aEgCHY3s?^TcTf91s({m~CPb5awn-EcH8n(D zU6rB0yz1oKYXWF@N@HbZeDySQvl?J_o*}EB85_aKAN2X1PN5R2lB44?{nC((`+JpS zx|B+B-jlhy9?Ec*AvT5G48rB<4&}XQ`h$#DSQA(G4)Vfys9&@YwCg;2^RHFlqMond z{5F(4RkDdeHRyFT|YRT6!w4_n=Zv2af_E z21r#6sR!3r9rv2&BSx?;JjWFpLQdRZ(`MKp+OR#9t=mORdgzt79EKU+GH{Z!jD$po z3U|8`G&^^kn{ufG%KKtV5_&e^SJ2*@w0WMeEPK;1-FhpEwUy=fmjmLmG?YxV);jzg z3IwdRZ{t$2hE!nQD!RWwX+68gM(8*>;oXoH6&T^$cv)f_iR-%jYcdmSUDZfh2Ommd z2DJQa|B301da_9V0NM9y&TWv3`RaUa@!g-gt?eK(Q-8{j`fIcohr6^_Yv&;07zt1_ zuW>j`D)C@%p|b}kc@S$?<)P8Eukgy*`J?-wi|=V>{zZPFI}Cbos(+PaD-MRPKDyvB zY>bPH!KCK{A@y08KCcB~#VBO3gF7+(ieTbBj0>f_GHgd4bm6jS2Xr94FF<6fz(%)t zi|Rj9KN=$w6sM|TV4%1(jZ`uQdyYu^i-y~6f=O`iRFKr%zrY4@>1&gqf_sq^{qhH?=GorI2-bH z8tLy|etb|s%Ir5HEk@LtnDD+}x5h1E_1NZUvXuXz|EVooG#Q*yL;5dk`@{mtQqbbP ziy;dNN~Ny=qZ8f~{jg1#KejcjRek<8Nu6J~xSY4&XEh-Jrd+D0AT2zgL0#^0bGc~g z)src`^P!&ehslH1Z`pyc>~y$Ek7NJf2C0;gx3!$OuU~gQdH=ZHjwns>EB$5&HfH}O2-JBo#bk348x;P6S~rih zTVEglg@3^Z>>kzUiue{c2eF{=+v_|xsn#Im+-)>XEipLP2_GaxQ%!&-L}|wAE2Tfg z2AzuB!=R=SjGRV4Hs0tvVTQc!JTWW2(7o{4E^z>TQZP_23bdIA_o2}0na(TC>E_P& zd8~YH*?BsT9~wrw%taeofX4T)*kIFPAQ1mi>wW&SAw^JlwIx~ip%}K+rs(`#>yo>+ z86oJRl&PaIfRZyM6iXQn!oLVH6@Yw{?!MVm#A3o0frkel7~gaRNFB_4**H$m9D4&- z1E-Kmwjvrn_+>*DtGMT(U3046MybGzh{-lI`LQbaw}+#3bX}k>Wuv^Tbu6(jQwgqr zt`)b!wS1(EKiBqjHi>Z7*APm>CO><+ab$ly@I(@K$!mY|pZi2}Nf zZMYSjoOFX`Hg#LCbNWA&2wbd5CjV@GbP95t`ve}@nY(Wxr_p~BGwoBzOxd~E?QyLg z6{vJ+qX7o%AV2YURoEfL=5Y<4cWZ;|QlG!O4gPmy+brFUYNd2|%FIC@g*?7 z%;B)-A4uLT%SWS;0!jT+>6so}Lqqt`N}%FANE?^j^zz=ej3--{Ss%-Ll+AM82xR7% zvrvYqx5?#ePS{O-Ed-}uCGPgLMGMraII>4^CIJCgAlHdfm}!6vcWr_0GD7!36&=0W zV&{%R&!RM&CeW`}s{pYrct(6d$-h)Yah!ZyPS;)@CfB}g&*Bs81(P~LeiCYNj^yc_ zla-3r?;n(r>NDd@$2(pgNI4?+-+-`Y{^-+4!>1-<9U@TchxUwwgR^C=#UD4rwJr zph~)*Q2I|?P!H(GFzDgUIXai)>ZMW#=!ur)06KMm_`P^AmqzJFQ|4s^a~Jh8Rwv+v zkbTCHuvwk3Z|`-->&RyYbcwHDQs~_aI)OwMarp2W@;Y>y>>GpNxb5fjGSlYo?;qMK z>nkgz!xtPe>oqkb58j!H#nSM-#~D^!EKyL*P6#O@8<@{)XwsS?1%y8UzOvEQ5R3Bq`S} zZ6kWG%k>h62IA@xY_yEGNT9XWD)l~oHo;#sG+|+iI0ODfIV-bnHghG}yEJA_OdsZ- zxbIYzLDpf2r*7mEbhv=^9tuNoyAazbJ(u?6{PxAmZtAF|rdon3;e8mv%`E$y7+>q< z6wQ9k1U21Ae%|Lxu|U7+;=}YFub}8JGKn0QxDVl2W?;H3Ef$u3N$O1@Vg0_tS0h?) zM7uqldpEvlvEJnhdLnP&uQJs9e8;+6T{s~-_aiqi+)y^@bg$_Q7jm;bB!^r?=#4h! zpzl17Q*!+oKK-Ju!VmacOjNh5*!-1-*v4r@gjmX#-gDrSff9bQyI1Je`V&z2zWc)d zq2mypn^Q8vAfg>_ex4iB~vf0q66Ulv!_}2h@=}_4DBY%?08_c~GLtpPD z@`zoJ^C@Vuec)1{eV_McN%lC#?Df2nAX3gY8b3MjyN$B1E-8Cz+Z(vJa+{=MpCo)` zSH?RYmYeF26yTh$HkmYW?#)n%+FMFMs0`Z_OIUBfiKOxK9F;h>CftpRQ$J zzz#IRn2&-lh3sNs zK9Zp2a#1`f8O*%H;ht_v6n-l&@-WdO-hVUQa(6v*|0Ea4V%5|T$L`!p1En8KU+qtz zFi1ZveW*1h_-uVG*W_I}b9|xITpR_d2&Dn|DAqVKVKdkFq29uRg9~7B9ao%P>e_O= z;!$7oLcytgw|JmYs#tsz^S-R}N)vq0#lkQa&lh85^52yrhFoajds~YFx^ei;Q^bAu z+lya2x9d~MINIdII;@Mw#?W>TRYv=XKl-2tpFDf!plmFcs4DfXgY2-YGSGp0pY*r4 z$Bdakx|NT!C>5l{Dm0nit(vwurL9%KOmc}FSyloVq1 zb|>c3G8>CfWe+bHpfum3JH8ZqLdRalyppedHAD4k>koENnWt0Rrg+X4ppx|!BRG7a z@>vz#XMmQHoViNuwj;LK^bQuy81M+{vaaiwdJfGrnFI>7y46dv zPZz6gOgMyl(!1`XM=K*;G-yTZ+Xp9M`-tM0pd)(k>B_I|#>7|y@5q#aj+pwScOBB> zrF3xT&&6Et6>QsecuSq4UXMG|)%@;p(V7f?*hC24U75a=?u%v8yE9G2Y!p=76+^qE z(S$)qFS6Bu&CTojmD5dp=9TKvh$f1kYa;iKW6L;etFnS2Ph$IC)db^;?TOi%2ZLP; z0$G7nSt#$+PluA}srd~FUg(MVIyprd79g2L2>jA_$Yrs<cxrZA0r+5}{%vWAkqE$YV{VuqX}{q&F~ za8f=`qNjZE-v6@f);L9a)ps)rYYm5FZ=r7V4;310s2*0g-}h0;iF+XtTfnyWwcovi zU|p~bi+^Pm&ulR}WC$C`TF)2~ZT45xYLfKd%6tX-6U@LX`;TmH$U3w=q^iGjeVx5H z`0eZbbk~w!@ju<@nFJl~g+nul`E8Ln*G<2)^R!pCx9~3L+EBEmi21lrzJIKp@TPJD z5(!f>_!YM~N-0eRIz_cw$cSVDX|RV#j}AH>-)!rH!g)KG4*eN~eHJf6v&l&AH=cKg zb#T}R^;SX5p%rmDu!dN=t7#)VzIx8NCdL!4gXav1pbK_LXx^7;YFsMFD3`jV*QC~S zC_xO+VkBihk7f1)h0kAs@Io7IAxkV?3Kmm|P*X2|8Kd!Plzt-2{p9oxq~5zfYM>wU z`+VsQDF@Mn<@Rnz{(eDLGUGf^K7X#HaFiS_4Kwi6tA8cZaIm|yQzqh%89}G(V zi3mE;lw%2!Ywk>?xQ%d*7|$LfqZ0xO1JUn$NLlou5F_q>EBI0Y@{7(1VFze4PgpUktY^i@TPEU-4$sAI&s8+ zD_S0h-)Po4U)?LTm=y|^f(%oF-TtZb7TK9piLIFcW#8yb63voiOgYe<<~mq9z2&hF zpU<_5o@jJV3EUMHQv8~zFB=(UbVDDZNt8nON9C4OHsR;7EN(so+Y;!L@z~6}eF0wk zj4%P*^BT1Z(D%Ev&v0@nrn20k0t4FQ_g}?H@04@qfz;>Xkf~Fsd#4txUE0T!HKA0~ zFT6-(ZVr=dPPZp7E~h&ZffkYZu-kukq9zi8V?0_fk66s(kjH8Fp=j*Ci=5ggI?%%? z{M0l_2(#m5K`A__He)RLVSGV#JKajhU#ZNIzxUa1K&z6sk&F9_NP~S|Ag>=|?=30S z^;(Ida(tE(e{3{3lM4{#VlQ+Y0cQPVl9Xdz?0#FFGhLEYv1zyP?7+P|YD>rG;JVv` ztl{s?_IPA3ki~i&E=%o?XkNVhib}G0`4!h6Xo5((xV9CHHRcvsdruE^Dzb6hl`&+3 z$V&8wjU4M2hynD2oy}zr5V656P8~!+f|VZ&$Xw14VMCLVCLCLPcv{kMXmP0PuR!k0 zm@t*yxYQJNHva4N4x23+i|9;L(Ss<%p#%QlH@%I=;eTN_Cud~SyE9q`VC?Fds?_`a^G%2S~V;tKgK{(ekRUxv!mY1FpLF;$_dy6;xa4O&>h)GD8voM84 zMK-;Ck`fZ5OJVER*Bh9uv7bN7{%vn>lLttVuz6Ae<+imcl*rn!JQ%!8YV|3j+KJfq zP1KnxtxBV)9Q;@`58X*S-X12q{ZC#a_q<~?bmq~)v@k^YXTnX4Ow@o;E)K{W_ciU( zN4v#F>$tCJ%bKP2dgZp<__aj>IC+-B0)UN#5-iH3s0}~w325l_p_(s;Sa%5Pze7yU z*yy9t)Q>*QHaJoMy(Wzo($dmy45S>q2)O-PE8qv(^lm{mZIZVO+-`2myYJZ*d-?;S zKG=UuboI1*N#=ih)tG+PJEhfdvtR@^yA1`&xy-F?aTOO|g63NSeL@}0qBdR|E9p|+ z-5v#f?rmv=$ZTtY`8X#~=fjnz5B><9ELdwvL(WPO5m@4;lf(r{^scV12Uq`8%9vii zeyvi*3L+znA|w3l&gl(w<}^7gd+B)T!?I~05Gt@J1}$iZqzxF^eh_?>@#Ug>SiZPk z{5Q&G9@y<+Nz#lxw@MuTz}2AI*p{7oi(6g1XX&nmQ|gbWR){pO~1iTxjv} z-!3mj1Yehz=63xq&Eq}#!1I-5Rr;3>cx3~;0^ILXh1)s&M)O{is+$a)s$vWvA z(+gJbPvKkh1=qx69)97~c-fv7CEmlzn!^c^e^8a-bc6(TVnmlvx7Q=LJ$~)SkJ|oj zWL->@%0%6}|6qC6xrXZBkCH|yVutfd6p%WF78xr~!1S`BV9 zhSJ(=Y2GihItxq;K#-9^%+*z49SRRdZ3K&A8j*a}5RrnZs^xcV<&(5pBEejLE#8v5r zpwEpoMgQ7vai5UE5S2_ZVLtCg(&*uo#J3xw@HO0w_yn%!qtcXpQ(wBp+)qeI6o~aHhBu14CG^de%B$lVbZV#!hsC zAg{$P<0&9!_Q*(eH@pjVoq4$gzh7>e&2|RAJ4YYRv9fM04qmj4qBg(E`43e3nOq6OneB^x403!v3Ehm zC7S>x`}5egMajLml-9eh5v=z{EJ9OpGo6F20F?3xo?bkC7h)!uTF)Symu3J?`6I-* z!Wx!G1u1tKHss77&+v>EX&;mauecrv{#e(`r=wqZhhef_$8I{=!LUGmII+{-nEs?X ze)sOr=*_u>qUIH$Et`tK!Imph`W6b3W1CA48szDe8o{f3J;rtv(HDe_ewtccqfGV- zn6qtj<(thped|5Kp$GZsmQ454#tOhe5F8-=@1NXcQDqOmh5D;T6EA9mm5o0-L2@WE zSvmdy1hrS9YfK@i=24uZ^xwFyEf;GQ*6N^~aZXCu#3orp96xQ_@CggLvdfev)A^ll=T!v%x6 zV+6xM`ZP<(G%wi)-!}VtxH`Ud7Bw@|Gbxb}4sM$Vxh?`y#5R%D&CMymwBbHANc$?f z+-V#*9Ly(`E*u&0qMa?Ntt7JBx2>+qdXhXp3;ruJvp@kyZdU#s?E%MZ!enBAszrE@ zwaP~qq`eeDhB32$=ol&rTndeEufGsNO4OmxICfojKxBsJ9hsSa7flW zm^%AY&#^xf7skDD|7Kt%mtkhid=%(Dq@SlcqS{XO+r?M=EBRQa8p5-G<0rL;R-Ec+ zK!nc^D@k)*%DF|DNhuE2bw>PN`qf9F7r3fwu zuF?T_vK_lBfILS*?P>m|uL2p>M z@r)tqx&GwA|JU1FMn(CBf4@UXD?r3gq%4Izk#(nv@QE!|3|0!mAFmvo&y{{Cy7=Xvp*^Xi-zv)15pX71Sc zwfDZR>-+i6{7$rBgc5FgNUF4siw$1ia)bRFs^v~gY$~m*s$!YKoy9_#g+G?cIqiir zZtp2tPr~6zNK%H9uZ4`O1>w?-Zlmk-)Etb2j&;1!^kq&=MmHPq3Yi*6zb`2$M;~Nv zpIt>Fjv{giohK57PD}(I&{#!~7f8-q{5b>VU6#Sc09f-c@%ADsHz8lgh%*D0xh!m* z7>DeZ$8#S1m(At7kEaYBe#MT? z+P19f27_o__E4o%>6rtUyinv`7kAG5#4b9d z)KzwhW3Qgj6BbDIC`(Z6*e875-jZrrQkUn(z3$SsCq3CzVhd=|8ex#50Bi!+$#q$RQA5lHo|}6 zYwuVvzkbJRY1@uB4Ro#Zr*yI?wQ7Mhm1O99 zh+^91{q|H(B8ao1@vQ`H0v3576_ySfX!R^evw4pI-HsBhQ#Iu%&i-eYGoTT2rbMXa z5ftZ`PH+BN;HTWTB^k!>xObR`NzVPzO_CL)kex}}BhME^v}3-YAf&QuvD|irUO7F& zgM?K52^}@_#f6Akbx}(E8d1vDl?5}3NI~P+%_M<0Yu6;7S+=(gn1oawM|nAfq`@ec zKBL)cKygv>JiC0rqQ>#UHKm<(Fscu8X#Evr2woA0dg=&zbcQ7UdeYxY1}PURkwd6D zWK#ka|M5z@4cH!?fAPY1I&Ayn<6>o9$LDXdeRY#J_t{EQV|dr6REQ?0+~H)hmI_e85R*F^uH31A4S-W zsqj;)pFxRg^E-T(eywI#k`OMrKh_stz5ia3p8erP)IaOnxh@o;w#Dgj&7g<7<;W<^%e}&jN^%CUm$@H8zqUILO{}kp}k32A*~%WLiG6*!Jc%QI&CCF@ril}PVy33 zlLbcqwB=XG1ej^m7O-U}rL{CrUWM549wS0TZ|M<|T)wjtW#%DNcmV4D_-bylKy%Wr zQAw()5UHS?MdPOLOP}7>!7MHm6`k`ii%Id&9QylS&Kg zOnBXz*_XPZi;j9W;Y8CJm>=Kg#2GD6{!_!H1wdq_sIEx*GOz7h#KR^emEZ-n3shn=vn%(_|DtyU^97@crX39917UN26PYUW&^wR!mehvK zYz%@|j_!>Q-pwC%>f1?KE#j@ONdYxmmS#A9E?wb)rJ~0f*C<%~QP~!?p4#-qtD<%^ zq+hprMxYL_O}2G>p6&LNXC9CG>wM$1>55PJ#-08M3KFjU+j{6~8-oK^%WM63eU@R7 z^G9_Uj8T+wP}y|fBM0`pP1+Z=gDtgyRe+g2SgbwhabvjQY_Cg@T#hnu>#Y)+M?e#t z!JNWcU*Cthppg);0^66Jp(ewKQwHhOX^}UCm(?SeBDZeiPhDLa-g?=D@AsU#Ybs^s z>U&O1im0jr+Pc7G9KT6JcG?3MtmK26Qb&T7Gt+}9UyP=LmCm?4`%e?Nf6H)Wwz6p5 z!8rZ9c!7ti;piu96*cx8?JPi*>}?}hDAXbg&HFp7`h^tky(r@Mld?JNBEV6N#o7+0cCr7O@` z-q>CK{Ivj-CHIn^tiZNWy%&LcFZKM_gOqCXf6W4EuQzP=wKqU{zsiraz%WqPT?BTZ zrhM6VbKqq=&A&9NFJ++g8SMAV_u&*_hRfPsib!N3#qMJ;KhWzXXbDl0IEN|n&mo|* zLs27rn5Av8c0wD_T@a{r*tj`NW~&g?aa?4q1J5|@>*Y|u?~EpO1n?(2hurUgMswUd zUmSOJ#LLONvL?4QpyZ+m3s@PX>VJJ8qFHy&wxCT+cCqFdd44#3KwhgGq}+45xW!fw z)v5z@C7K`3mrROhYz%0i+drJ&oA>44DNaHba>7m zfFN{{+35uJd)ef9wl5z&f))o-wgj5{d@L8^gN=klZ**uRfdKwr$^~{i(}(K8w_#2 z_}M<`4x-R>g}#qF>`qKc4i!zkTpxlSiSt?5u8H7>!^Fcgk*^u(ogamBVcs0B^o=NF zT>vT>^!m+B`ch_oEZ`bvZN}{b(=sSv*7@@~CYos+FBfiot131MJya%|ly`Zu%jEaH z>HL@`GD>|e6hhrnY`5&9?0fve;ANkWo#?D2b~&`=L2@x&N1reoxP#}RZ^e434TVXP z-kLP@U#`%K`_BDa_0}ZKjttT`wrOf&4_)FQB~peVPza)teGd*6C^qlP;1Ggit3!#3 z<CfaO zjpn%8^`fJ{)oiH{fD5@~#*NW~_+ys%4~Ac$FBWr@4;l!VuNDLj7Wp!lmXdHtxblgH z`5fB64?L|eaiRu0X_-z3j~cfTW!4-YxSTOu_Keq=x4(C`#kMm923rS8g|lzM&wCs)Q=nKl8x<*58V6&%p3RN@zC7t;cxh zxTismJYSMAG(mttECC6s+(ZhkzRqk_GVohsu=<<_o^ruNp&LFqASY(?FocSVM*Kz+ z{AMA##0P#+imy0#@1^VL;h27>QM}Xh1j_=msW%*s5>#OE;@lnb3zF-fc-7GpdC2mq z|0wo1?(y%zFUNC5COa|rD(2!FAbiZssm7_pssAhHcRs`iaUHu1WN4ilk7z|?|eFQ^-VVsVGVwO_tkC(9GL$nrv zb-ZvnuBY7!`@B}H{`zym%`S{L4U{9y&tCvJlp)22J3ghkdM`3-@+VLANOjvto@&-AnJvN(#cY*kd?kx%LuR8X_L=n164R2Fr^KT? zgk)53Q$mwf6!I+A&)>WZlljHnyXd67SR}u79V;ElV(n@vu=mg@(Tk?{(9dm$8i)_o z8vj%E(a+6*(?jYYmiB*>X{98Ojs-dQhXQ?C9U(`Juan_9i@!iW&tmQjrC8%S&s<8h z65EW>Jsh3ES-Di} z+4td=3#GkYS7Cy@Q3(1-!wsM14LP@43ztS3n#|apK0IT^5GG8X59nvRaxu*1LRK6~ zK~`v+(YaxFhUqxEY;@4=5d5(&%Grj$*CA`Svo6)X?wWkcMtN){0VW5=#WEz9WcZa( zI#3tRhOyO#&OK?gy`PhD=6vbJ>rlA7Cz&$$z$6ZYJ1kl3p+gO`^=9_N>)gEM!;xKH zQCk`@8UopJL4hz_I%~ljlCYC)8$XuVB6M|GPVn=Y6m{D>&&jU+C4*`s&?k?F{Xlfk_1hjzD89SbL~u7pTTuoXH^0=W~iI z1G}%B8SJw)deKh>Mi>}x7jpgFZN|HKLxIiO<%AKmTCjJ0FCZB;?%|Q+dhwOeLU6Ij z5a>F}T^{S(1S?m3!B7shg~SoGaB-w{Mg`78_U6BT?O$-la{}$e;aacoz&b`exrw(Lrjcp@7t&355y>w3L*s{>jxYqphWC7N&uM5koPBLjJnv zer+)*N4MQq=2-=bM3GB`6v|kb5D>=Z%0=;)+b%zcA8zTJxtTJy4m!92cLIo(2Am;1 z#tlr9HY;3t4GwP@x9=BG3}jP*XK6#0@AlvCKP~d?I@gXJ6MHd(@8=fSDr=9UPUNZE zY8b47XrLQvPJr5U`KWnlm@E`(x^%;El_o`K6n&h;|3!wqRq2 zkOZV!w00QrCkt1$GmG*!jJsQ=ZN03&3)~|G5$Lsa(D1gavey^~1QfiD2GFLA72;Ele<`*C1Tp9DrOzdNE5cGCfde$Sc^?Q*V8v zdXfh!L`E{LfM*mDjvmm_&SQ*G0Eh|HP2v zBT*YqQXru@3(eUX{uZ=Y?DvJj`jxhArmiBAnd#-|nt8!=+^)$j0pi}k4r8dmCKUQ^ zp^p?B)&3Y^iyVotW@C0M*9F922JF47v^;*lF+A+$kKs-M$X{9@$pC{^mpI0m!uC!B z1hTV!$LC{{Z)nyf#WkJBoAIL+K&&wwc}F2=7x znw%k`w#U012C1RyEfApAXoskcH*&Ki!scE(D3&X+S*^}3D8$oij*85i2YsrrVUWW~ z*O0+yxwTxpD)V+abTTm3!@+#;@5oz?oB>H{Lgr#va}jY1t-drs3xgV4hkM{~hr1^? zjD-|v4Gq$VBdq~gV{q)eZ@esz{>RY0q{OZz-H4%DkwW@!2^MkeD75`uuna43FF8~# zUM=>j_#E=G;h7N1c-u!u1-(xTJ{b<3ADW=(XYPFN!d`5c zDmjkF0@}bthOJ#x_tsyB-S2wi@L1v_Q1w^0Hb{(T!6c}VY$jZN?N5ynl5Rya+M_lT zzn!z-q`_XQ3Tbm9*m+es)Lni&B{4QAx38b>M5$lH)KfgVMFL&!!U*S}M7d$%8FYil zzN>etuNMHVLZMYX3m%*R9qRSWpU|S(vDls!eRY_Wlxm?kR3Ug1W|W&yF&qitO~Rai zLnbt<+trN>zI-=^4&)3XQu;hMt*1(qHgSg*wEyQ(8VZ9VMf7i2Uh75l~XKnO^iqV}CwWPXUEE$^# zTDSRB$~K?_Q*`Ity5eUjc1eb5f|vBesY(Egn^9XTC<&)i`7Hg>Un78)ijNi4YBS!h zS5n7haVoT`vcMDrmKEG?!sw;wVg7GTK+{j$m2?2OSSHZC`e8B~G{sP#XTCTE$uYKI zcFU*qYg*5nULfAuS+JetsWluj>QA3agq~exdm?zKVW+>zwgGxb{7O9m6<>*lb$;+%r-{D!lGIVAYN93+p;a}Q z8g}=O7Gf07m^~-4aVbI@p*@x?{PjtAR;w4v-yTrfzF=@eh9lc#;800%aUHnJk4zgq zbHNQw37bbDHqR4)rn+3(9DnxOGUG%PSixPi=y)_7bsnk$B-Ty8i))Y>t8JrzI8uf` zQW-Y!T!PlJ_uP6|Ey?b}&%WiT^*QSy{A=Po5=6FfboI|`a}&4+XZtiz|ECZIVtu)XBSo~ zGzQoO02{gVkLCfsQTH0q7-%R+H4>;%KSe2;`7GiLWC zvMu#k%E#!|M?|*6o1&fuqr=t<29}#0?Ay0>K%y{5lIjKLE;jZ8Fw6OovdxRmzJX%A z)@!|^35ful+2AtBgnSo%WWb4-;=&hg$dva@NMJ^kfgbhgCKMhl9a6b@tF43aPl$(L zVDU3gQmQbrC^O17v*Pu=)A;Pt*t;2g^;Blh1X?f&YRkP$fHC`ION6ZKvG-8a_SQtz z4QwZiUV%Zt__$GlQ3XlWw6D1Ky>-^a4CQ@Y1liTM_LXC8G!jveglr&tfVVdv)d_Z=LH_)=P#Pdt6)(Mad%J540D_w9wpOVAYXZF5^(-S|qAn4hW+JoMr~ zi3;Wv_Yk5$Pbq*p!o2c!U;dHOx#)U)Sk?3vfLHFAosEy|6gv5kR!zOm&;3-cs_hTM zjo%Nm>%z!ULmh&Zxnh4s>Z-X-bynsBu2$h6 zO|eTK7I{sX`Y2zupMo9e@w!2)TrT}~7<~v*0WmCxFc|X~P`Ejp5pjRex5;(!@y2)s zDV7nk)p+Kp#pghrT9^Q0fd-B%*Lp|Xm2CeP!GHi1dmqM1=Y->W+FVo?fD46p0xq>` zP8kt_x51PV$DSR&mP^5=ee+R~7>(ai%5pkn^sjz?gVcMQ4W1V38)ijZFm@8?6o3Tdr%i9Sqt1~c`J)x#8_8gi{< zB}7`HKn^-meUbEIb}d7P*3m1A;7%EyFawyRt!yi;_npZBfBztdLgHozP^O^&dAVMr zjB>T(R{g9?SqS7*?`X=_%EjmF{40FmKogLi%du3wyh2i+Jo0!%y~6e<;~%f>hU&v{ z2NmBR|958%r9;77LIH_E59K40C$DWkkS&wc;{3hC*T-04<9{BUDfzx>Ctjey{_@@R zy-*6oJ=mzn18e$t!wnQ`M*QssELRb9xm+0HEltt6_-;)Agou)*tTn(d8+U z7SdPlw{aJg+r9!gj-iN7CII(>W}^YFCYv4lwmaxn_8A(iLu3PDP&Cl74tL%w2NS=G zgX;6Wo*v&Hdy734S6iE#ZDPyGfxpznv1oLev0~C-Iilb{`BR>+5s*L^yC@L_;T-$t zEKsLN&2Q0~-$Jd~Lk(bW+r>Uy*8}K2PcyVco$crci#QsXweDT?39%P{_kwOK<*Hb* z#(1kL=S=s@cVywpqghI9ETC3(;`F7kkQ}t-WJ?|Or^|~jC%-5GRC0;qnZTWs1x)+# zP1uqVyj}XH(8wKP!kA>$#5J=h+N__n#3WGjt>In(!SHEufna$}-e1^f0G&n#w88XS z+y9V5^ia5@^Ws6sS@umOw8GJ2p=M(=P>Y;3aEfELX>YL&YCcDkqTa{+r)Osa)6;xw zcX?wM?DPmC8Dqqzs6&R|=87o(Ze9Re<14W~(<&5gyhC5Tq-a2LqMxOaX8MKG8|I~K zwFu9&iIVOjH^;)fewvt?;?fM77%@rM(8I<$n;zPYsfJs1?%RsCw#$*yWnV{C+5Yrl z*llYKk5#|r5G5U>4dRn6=Icy>fLc;z;aeww3qE^PfmZ7U2s~Vcykvj&H_QbC%#qMjr;~u8pa+RC1yF>NdoEU z61i3@g)B)*IW}q;_2A*x_pY7D6Jz1wx9AV2o2Zx{`kI{CDKYKTPvIfoAas39bFsB;j(#?!=aj znfGAqhkYxg+fVk;)J3ITs_I_3yluJw`s-ugo(0Po!vXBQXkGSgePY)mbo`Spo*lJx zzDDlpMC`_*6sEu;*s%a|5j+lg^Or9HNcxGvmQ4V=M`#^U=ao?3rhEY1(4 zB8F^j^@hhsdV)T@gJvW67bf4gB$98pAEWgP>9sE8SPS|Dt6(st`nnix)_Ty-Q*{mO zKq!XfbWF(OHGB4=!ef3c_3LPAeySR(ad`k~hfWQSi~;@M%S4bV2R!k{Wx8#pEVQz6 zEw~zWLM^%^G2g{eG%?UefXQ&r#-NX*Xo=$bX-PrFR755ez~}+t_6*TYr+4G6I%|>+ z^!jN(l(^1KLWi~f*R`tMe^igk*@%rqG-Engi9-pyC4(GWst19%~P5Kx> z&FrqF%&aAiAzL1fJj{;Ir+_+PEQ6I{Ccf<{7tUUHwjBX?kWL?WBMX6ill#zUeLrL< zT`*+GM;@SM4fDO8(|;>*%8rCJ(@qVI;8)+oMZu`+Y;V$4Die>@v@>wCN)HGDhfbIM9A1 z16-U9hpl3^K@?ho5z6djFbT9>>%Kb~m8687S9h420B`V3F0GMTJaVkk@g7ag2T=t? zQsO;Zy+VjW7KRjB{Hm`y4njvv*e_z*XvD-_j{1|_AktDA0Rw6W*+}&-fCS~%lZYiy z9p_WgJ`$RhrwB4IV(8Av&n^?YZJk+npBsjffa$yuL_iv zR1t=j<%c-H4ihK?G9&5`D{d$7k4`J46!MkUzCA*vq)y z@kKgHT-g;zgYeK%-j|N1<3Rmk)EI(IsYPysR`iGlczgG!alfd_G{J23uRHQ_eYimz1GgGGC4pl~xGk6c@ZPL@Ku zx!s*3HX-8|OKQk}GqvJACEI2TwS>PJ|D2XY zsS{pv*jF-OGBz#<0K}2XoS!9mXjSxw6x~h!2(;MoQ`xomVsIs3-~PxZIzIDqe|$g- zD|ozMKvp6LINU6sbRvA!dxJgPLktxV!kGZVk1wx9&GW2xJ367^5Qje~!SgekA1R*N zZQpXEEMc(So!}mfM+X3+(%l{k zV9LPny0)hW`S!vq)Ye-fu4{INQwLGMkA|GS?0xnZ?JgVMdHbXPW4h_WQ@J2puU5Nj zTnE|l&Me3{fsx;lk-J;qq{_s6kc||cuYUH*EzGP?yV_3?)iTd*0a|*~Qdy-|-XU31 zVjk5ZG(jF}frTPICfeqQ1F0-E|4-YzE_x9f=yN=$uk}iZN`5%NU9;u@`kMZYsJEbDvbFyXH$T_2zDUdff>QWGkR;B*q5|1T>Mo^)7SHDts&Ms zldJ${3`~!{0i+4NH*EZ?_zlvS&g4RR7nN;@q(H?7SjO9JZ3jiEa=9RY39UeZjR#N~ zE|{^#>O{~gTK)HF=W&1;`da3PD<9kdH+?=S^xuEPPe96}{*i5?%OL=HLnOqVhprw; z%q!k?SQ@iTM`1lvwC({TkN=3-pg9jTPu;dOc5nELrY4EBJVRj_$WXA{ksVIFHw%3f zYlt)o0tdl=z3s{EX(aU*>yOIpN%E@39!iYB-eY0;FY-BL&#GQBcwiEg;b|XKOV{=Q z7Caz0l_bNp=IdT(xQFeU2Ml|v*URqnwY!RpIL)#Gr1tcT)h0XdA>W0@Qb?i=bR zW4J&iSKZUxSFfxqq8uN}t`_^AlV;&4aV%%Q<;)U_{vNn6|CL2bhK|N1ql?MtI z{`gu?5iPRG{bL}pwi-c*)HF5V1VZNEqM$H=)QC=;pk^rzIDQhyx>Cx zFBG8ZOBi^CEHd-%JHNciS&S~}tIMFB!g;|BBew7BRC%l!XYivS@y8OsiAPzr1&Drj zy!+^0`@a5EEM%QR56xfi*oWwjN9N$$q9I_(W#6Y9fi{85ct)dl->y|ESs(uHZ@Ne%5j1-~JI2PRaU3C9(QTfV*`w0VD&W4tv^bmA|%x|gPQvgs< z-g;J|49dL1-T4%iB*?-9>^b?AX-l^!;tx>&SP#J(Tc4;8ZMj*1B(eOoP|FdywmQ@W zE+3?2Z;xV2z4D>L0>^Xt4N^P54nNdTat{!bfV}~EjKvp-QJ?F~3WlMvuA6Grbo zE-3RYY*$Gn!<+W&NZ1K?Y~hXvy#O%oWC%g&6UM?Dv-ceL9jWtd|jbw1s}p zf}yaOHMdd_o>KStjQ)_ANY4@typw1i+rGHt`(i%9lnD>)#;i%j8|=xS(}_^WID-Jp zgB;3%;K+)xOT5EI@?5zrR)%X3viA2%=Lr*;butNg^xas~7-vJahB5@H{{jJ=V2n&Z z)+-`Ehm%4NZ?t;ZXEy+VGCLej%ZPKDXs2%sxA19iu(c+Elml&Tq8)bV2eCeWKI6u! z#AdCDKqc9X_2cWPSu1S)B1U{r%3`7J$4q|@OTeISqJ{u$A^Gv@jyBA3j z90>V>eIs3(=eZE%L9Gg~QVD#|2)&t&vOkx4Zg2a_mnJETr3{k=#5ric&)VVOu#xSF zZNTlUJ9hTy-l#Y=p^OCz#D59SxT1%PZ@^)NrxrczDe0z$Vl!pnDrbTCg)>=VG|oDw z7WHSWqkNu}NmTtzQmq%bafs&pZcOm_&Z^C)3A%01P^c;t*hSpZV#NCXfE4^)YN*Hy z1nR|Nh|TfB7;x=#sAG^6Cj?Gn-m>}#6k*~bY2d>EU}F@d5|oGxH;jW#1y`a_+_0$% zROBDmfzsnpxZdYNmW5R@uo76pi-FD80UGl@Ec{s?q?X>T64ori3L?UXEN&Fi1X}`$ zzh8e3;IU}~!zsW#Bt;E8dUF0|eAb&ezOQ)_u8gFGVK5{rdIT>O7D{BH0(#x1+*k)J zd}-hY6fd3CzD?ztCZKJ zD{@%|wHO}7fA)HO`P(v7R2@R6llQti;5gGs7w|cqbmDu9CSQ5JC+AgfB zm))K4AZsR?h`%yrW8um+&!!8z>tIQnMNm72l$4@1Hw<<`!V+>VaBbK9>c|t@;wjU} z`{E=|CAdi{DO_xj6{s`IS1eF-moBKBe0#^I;Ii_rswIWuSfC=uRxt(c%2*q;*7Nz?!)qI&qESaF<#bnnQ{Bxy zjT;<_3wayFVTM9}#j!rCCderog^&aR@O%F(n=CK)E*ylJg;NyuRZ`ZAO^iSr`xkel zAsYP$-V&cu#9)OQ8poV-1KW=Hkq5)q1`O8w0@?58>oGq9L^M6LDjPihu??9RcoM;l zp*Zh%MSwvDxV{yrtoalZwc~*+DK)#e&Ov03wjl^$55T?+`1z&lMxj3zJO<^!0bTt- z9sP15zmzCDI?xnE)=G(1)A@IscWi%HBfC1>P430M?_wJ+G9gva+S%*jtJ{6AZLX?6 zgx81N1>(!@WR}CU=}}01b@v|LD)ZgBHplu8x^%ygPe;hGci@d?jP(#`!)+F~VVb5f zMV~K;G=2ZbYwUb9=??7hR#!MVVGUNqsyDfip#Fq?X77D0uz#|}RR@Fp-Ssv%hol|1 za_k(>M`so}ZjG%0WuCQQ-h~uxM3_XX^El}$#_PIW+ zDHu#OaH4bBtQfJpI6cU2MC~v2**$yq+t2w$h`TV86s}O$4Kw{11>AK6w;-^m+$%{Ro=7C3EE8v|& zN&21~m-$}2e&V?p=dqF=8g*Q&$@#K%Szk~UYN2V2J)oJlQ;7p$9croQ3RrQO6i*!- z?s4>6m^lo zz~Jp6tWFxA!cNbm_T_5iw8(=85Qtu(QSgr+>RNo?8%7$+Z@0M#)UMVoJ~R^^DukUOD5v8AZeJ6;R0i2eOTo& z4!i(Yh7IxG2l#+B4xjf7=w9?Yf68aNN}nI!R|otgo3TC}AO>JdL^}Z$5kO>W?E6(- zW&fkkPcoTcwDZHraH0ex)*Dau&t>C$zmZv>2_Dt)64M@U;=6@^wnRZKgVZ)?*$<}en+RrB1OEgnVqioS?M_kA&b|@4GrkSn-cX6iy#Jm9FmwI!T-`N#f{3Sv zHs_)>qp-e;EQyD9bXUvr9G?M0>X%-{YoBDXbn#4cR3(@Mz(mH}`l2f=!ew_iV&>?c zDU*%5G8C!`xPHT@3=sIl18me~dHggX*2@mnngqBXGhn4BRI-ekQY3YM$BIGliz1lLP-*N0rDP6qtXEAX;tlcnOn51~)U z|2aVZzg|`vb-{$z@e083CNcFru_=y*7mrpsF%{J;F#zy8Zbe0fL4`eyW7EYepcF2S z7UrwoZagcoY$FM3u_!REy6$)SE3IB?u-*~`7SY8II>3##e`+d9g|C6S?$zerslk3~ zUy=ye7yo(rOU;z&izPUR=9s>X%O?uQrW}qlJoVfM2Qe)y0w3_EZBn;Eb^n3p{nH6Kkw| zd%Q!h*z_&-HW3l%uDk`^F))OYD7hHmzi0k}}ef#{d+;1A~Ke2LfD)x?I7V6IJuT z0wR8Qm-K!$Gi|S|$oTm+f$yFMUY$u!jr6w3 zF4v-@FFmlQ;qiAsX?HGy&vK&jIk*lm0Q!ObAEtu6(@vVOu_jyAhK7dfm5d1IF`G}b z^GsLON*rlsoZ*7=M;Hv_uE3ic|BHV@>w0Fd`0LlNo#)?*%*}=}DT>}cJQbxO20l%e zc6LPa^1zV6_GE7nTaMYyH@mQJR}fF?Yu-MZ@8&LUmA@g$cA87`7X0Wdt=0dj(vaU0 zo~fI@xbH26nNE54_=~2#ekjw`amVotp>(d#dHXG=)*im5NZVA;_Lg6L(vH=$*Cc>i z_81%~nuc4?!zbCZV?J6s>W1%5AkamRcYGb=p;id^xhyZ3ki2W#8UuVw18$2tLrM)) z&wPL*^ZoiAxpSaw{T@PotAA{4b#`^>X6W@h&DfHW+xqY4*Ec((OR zsuI=5;5~!K#9YS3p^I!I7y09#c6Gk&0c=@az!mrM$@1)KZN)#_o|c}sVmce`a0Zjw z+^@9D2Nlh#GK?`K)~kbG;J(xS{SXND(WGIyjXi&C3FnK-r@5`V?e^K0&3xQ!1yy$`O` ztgKk=9ULU3CeMKb?QN}Rzeh$gD=Ol`DPlFj%INOsR~yn-+f#2R>)e^NW@6s0L`Hir zu+lLyw%=^rA^3Z6Fbmcy9aI_;0X97!J$=eO@ov49I@>6-^*#r_BdtUFW}BA*L>c&? w0SOz`n&F*pO8+9TE%xiNq4@v9H|NsXuA<)UsMRH4H4b^CppGb#Gk^1c0a!nuO#lD@ literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_5_1.png b/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_5_1.png new file mode 100644 index 0000000000000000000000000000000000000000..16bdb0cc53db86461eaffbe00d4cb5f8f4237d79 GIT binary patch literal 21480 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/week40.ipynb b/doc/LectureNotes/_build/jupyter_execute/week40.ipynb index 12f7f93f4..57872f439 100644 --- a/doc/LectureNotes/_build/jupyter_execute/week40.ipynb +++ b/doc/LectureNotes/_build/jupyter_execute/week40.ipynb @@ -145,17 +145,17 @@ "output_type": "stream", "text": [ "Parameters for OLS using gradient descent\n", - "[[3.53732988]\n", - " [4.06277313]\n", - " [4.51728978]]\n", + "[[4.14721582]\n", + " [2.54760497]\n", + " [5.2212296 ]]\n", "Parameters for Ridge using gradient descent\n", - "[[3.62671667]\n", - " [3.79849321]\n", - " [4.63207408]]\n", + "[[3.75424998]\n", + " [3.49608088]\n", + " [4.78010668]]\n", "Parameters for Lasso using gradient descent\n", - "[[4.1547556 ]\n", - " [2.58013829]\n", - " [5.20288581]]\n" + "[[3.62716271]\n", + " [3.82146046]\n", + " [4.64516328]]\n" ] } ], @@ -234,11 +234,11 @@ "[[4.]\n", " [3.]\n", " [5.]]\n", - "0 [-27.10587277] [-37.81035098]\n", - "1 [1.16209264e-13] [2.08824304e-13]\n", - "2 [8.8817842e-17] [2.62242138e-16]\n", - "3 [-1.77635684e-17] [-1.50600514e-16]\n", - "4 [-3.37507799e-16] [-2.280464e-16]\n", + "0 [-25.77106886] [-35.02189606]\n", + "1 [3.49285045e-13] [4.71505132e-13]\n", + "2 [1.24344979e-16] [3.86639832e-16]\n", + "3 [9.05941988e-16] [1.48786826e-15]\n", + "4 [-7.99360578e-16] [-1.35823372e-15]\n", "beta from own Newton code\n", "[[4.]\n", " [3.]\n", @@ -689,7 +689,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "gamma_j after 500 epochs: 9.97108e-05\n" + "gamma_j after 500 epochs: 9.97108e-05" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" ] } ], @@ -746,20 +753,20 @@ "output_type": "stream", "text": [ "Own inversion\n", - "[[4.30637636]\n", - " [2.56947078]]\n", - "Eigenvalues of Hessian Matrix:[0.30000613 4.12600095]\n", + "[[4.16180248]\n", + " [2.8250103 ]]\n", + "Eigenvalues of Hessian Matrix:[0.26646852 4.68110474]\n", "theta from own gd\n", - "[[4.30637636]\n", - " [2.56947078]]\n", + "[[4.16180248]\n", + " [2.8250103 ]]\n", "theta from own sdg\n", - "[[4.34759233]\n", - " [2.63142731]]\n" + "[[4.16257872]\n", + " [2.80576215]]\n" ] }, { "data": { - "image/png": "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Q55gQlYiIqKgw2DIU0zISkREFFS46KI3mJCViIgoaDAY8pZaE7IyjQgREZENBkNawjQiREREdjhmSCuYRoSIiMghBkNawDQiRERETik+GJo3bx569uyJyMhIxMXFYeTIkTh48GCgq6UuTCNCRETklOKDoY0bN2Ly5MnYtm0b1q1bh5qaGgwePBgVFRWBrpp6MI0IERGRU4ofQP3555/b3F+6dCni4uKwc+dO9O/fP0C1UhmmESEiInJK8cHQ9crKygAAMTExTstUVVWhqqrKer+8vNzn9VI0SxqR4mLH44Ykyfw404gQEZEGKb6brC4hBKZNm4Z+/fqhU6dOTsvNmzcP0dHR1pter/djLRWIaUSIiIicUlUwNGXKFOzduxcrV66st9zMmTNRVlZmvRUVFfmphgrGNCJEREQOqaab7IknnsDHH3+MTZs2ITk5ud6yOp0OOp3OTzVTEaYRISIisqP4YEgIgSeeeAKrV69GQUEBUlNTA10ldVNrGhEiIiIfUXwwNHnyZKxYsQJr165FZGQkSkpKAADR0dFo3LhxgGtHREREaicJ4Wh6kXJI1w/4vWrp0qUYP368W/soLy9HdHQ0ysrKEBUVJWPtiIiIyFf8df1WfMuQwmM1IiIiUjlVzSYjIiIikhuDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTVNNMPTGG28gNTUVERER6N69OzZv3hzoKhEREVEQUEUw9P777yMnJwezZs3C7t27kZ6ejrvuugvHjx8PdNWIiIhI5SQhhAh0JVy57bbbcOutt+If//iHdVv79u0xcuRIzJs3z+Xzy8vLER0djbKyMkRFRfmyqkRERCQTf12/Fd8ydOXKFezcuRODBw+22T548GBs2bIlQLUiIiKiYBEW6Aq4cvr0aZhMJrRq1cpme6tWrVBSUuLwOVVVVaiqqrLeLysrA2COMImIiEgdLNdtX3diKT4YspAkyea+EMJum8W8efMwZ84cu+16vd4ndSMiIiLfOXPmDKKjo322f8UHQy1atEBoaKhdK1Bpaalda5HFzJkzMW3aNOv98+fPo02bNjh+/LhP30ylKS8vh16vR1FRkabGSvG4edxawOPmcWtBWVkZWrdujZiYGJ++juKDofDwcHTv3h3r1q3Dvffea92+bt06jBgxwuFzdDoddDqd3fbo6GhNfYksoqKieNwawuPWFh63tmj1uENCfDvEWfHBEABMmzYN2dnZ6NGjB/r06YPFixfj+PHj+N3vfhfoqhEREZHKqSIYeuCBB3DmzBk8//zzOHXqFDp16oT//ve/aNOmTaCrRkRERCqnimAIACZNmoRJkyZ59VydTofnnnvOYddZMONx87i1gMfN49YCHrdvj1sViy4SERER+YriF10kIiIi8iUGQ0RERKRpDIaIiIhI0xgMERERkaapMhh64403kJqaioiICHTv3h2bN2+ut/zGjRvRvXt3RERE4MYbb8Sbb75pVyY3NxcdOnSATqdDhw4dsHr1al9V32ueHHdeXh4GDRqEli1bIioqCn369MEXX3xhU2bZsmWQJMnuVllZ6etD8Ygnx11QUODwmA4cOGBTLtg+7/Hjxzs87o4dO1rLqOHz3rRpE4YPH47ExERIkoQ1a9a4fE4wnN+eHnewnN+eHnewnN+eHnewnN/z5s1Dz549ERkZibi4OIwcORIHDx50+Tx/nOOqC4bef/995OTkYNasWdi9ezfS09Nx11134fjx4w7LFxYW4u6770Z6ejp2796NP/3pT5g6dSpyc3OtZbZu3YoHHngA2dnZ+O6775CdnY3Ro0fjm2++8ddhueTpcW/atAmDBg3Cf//7X+zcuRMGgwHDhw/H7t27bcpFRUXh1KlTNreIiAh/HJJbPD1ui4MHD9ocU9u2ba2PBePn/eqrr9ocb1FREWJiYnD//ffblFP6511RUYEuXbpg0aJFbpUPlvPb0+MOlvPb0+O2UPv57elxB8v5vXHjRkyePBnbtm3DunXrUFNTg8GDB6OiosLpc/x2jguV6dWrl/jd735nsy0tLU3MmDHDYfk//vGPIi0tzWbbY489Jnr37m29P3r0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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAHFCAYAAADxOP3DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTY0lEQVR4nO3dd3wUdf4/8NekEyCBUNIhAWkB6b3nELIWjiKHyoFgV0BFLIDlBD3k5Od5FlBORbhTAQvNr54bWgIookhRIVQNEEoMzQQS0nY/vz/WXbLJbrZkdmdm5/V8PPYRdmZ29jOzO8x7P5/35/ORhBACRERERDoVpHQBiIiIiJTEYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIhIhZYvXw5JkmyPkJAQxMfH4/bbb8fRo0cVK9fcuXMhSZJi768Fx48fhyRJeOWVV5QuChG5KUTpAhCRc8uWLUP79u1RWlqKb775BvPnz0dWVhYOHTqExo0bK108IqKAwGCISMU6deqEnj17AgCGDh0Kk8mE559/HuvWrcNdd92lcOlISRUVFbZaQyKqGzaTEWmINTD67bffbMtKS0vx+OOPo2vXroiOjkZMTAz69euH9evX13i9JEmYPn06PvjgA3To0AGRkZHo0qULvvjiixrbfvnll+jatSvCw8ORmprqtNmntLQUc+bMQWpqKsLCwpCYmIhp06bh999/t9suJSUFt9xyC7744gt069YN9erVQ4cOHWzvvXz5cnTo0AH169dH79698cMPP7g8H9bmxKysLDz00ENo2rQpmjRpgrFjx+LMmTM1jn3u3Lk19pGSkoIpU6bU2OeWLVtw3333oUmTJoiKisKdd96J4uJi5OfnY/z48WjUqBHi4+PxxBNPoKKiosZ+zWYz5s+fjxYtWiAiIgI9e/bE5s2ba2x39OhRTJgwAc2bN0d4eDg6dOiAxYsX222TnZ0NSZLwwQcf4PHHH0diYiLCw8Nx7NgxlJSU4IknnkBqaioiIiIQExODnj17YuXKlS7PHxFZ8CcFkYbk5uYCANq2bWtbVlZWhosXL+KJJ55AYmIiysvLsWnTJowdOxbLli3DnXfeabePL7/8Ert27cILL7yABg0aYOHChRgzZgwOHz6MVq1aAQA2b96MUaNGoV+/fli1ahVMJhMWLlxoF4QBgBACo0ePxubNmzFnzhwMGjQIP/30E55//nl8++23+PbbbxEeHm7b/scff8ScOXPwzDPPIDo6GvPmzcPYsWMxZ84cbN68GS+99BIkScKsWbNwyy23IDc3F/Xq1XN5Xu69917cfPPNWLFiBfLy8vDkk09i4sSJ2LJli9fn+t5778XYsWOxatUq7N27F08//TQqKytx+PBhjB07Fvfffz82bdqEl19+GQkJCZg5c6bd6xctWoSWLVvitddeg9lsxsKFC3HjjTdi69at6NevHwAgJycH/fv3R4sWLfDPf/4TcXFxyMzMxCOPPILz58/j+eeft9vnnDlz0K9fPyxZsgRBQUFo3rw5Zs6ciQ8++AB///vf0a1bNxQXF2P//v24cOGC18dOpDuCiFRn2bJlAoDYuXOnqKioEJcvXxZGo1HExcWJwYMHi4qKCqevraysFBUVFeKee+4R3bp1s1sHQMTGxoqioiLbsvz8fBEUFCQWLFhgW9anTx+RkJAgrl69altWVFQkYmJiRNX/NoxGowAgFi5caPc+H3/8sQAg3nnnHduyli1binr16olTp07Zlu3bt08AEPHx8aK4uNi2fN26dQKA+Pzzz906T1OnTrVbvnDhQgFAnD171u7Yn3/++Rr7aNmypZg8eXKNfT788MN2240ePVoAEK+++qrd8q5du4ru3bvbnufm5goATs/fDTfcYFuWkZEhkpKSRGFhod0+p0+fLiIiIsTFixeFEEJkZWUJAGLw4ME1yt+pUycxevToGsuJyH1sJiNSsb59+yI0NBQNGzaEwWBA48aNsX79+hp5Ip9++ikGDBiABg0aICQkBKGhoVi6dCkOHjxYY5/p6elo2LCh7XlsbCyaN2+OEydOAACKi4uxa9cujB07FhEREbbtGjZsiJEjR9rty1rzUrWZCQD+8pe/oH79+jWahbp27YrExETb8w4dOgCw5ENFRkbWWG4tkyt//vOf7Z537tzZo9c7csstt9g9t5bp5ptvrrHc0fs4O3/btm2DyWRCaWkpNm/ejDFjxiAyMhKVlZW2x0033YTS0lLs3LnTbp+33nprjffp3bs3vvrqK8yePRvZ2dm4evWq18dMpFcMhohU7L///S927dqFLVu24IEHHsDBgwdxxx132G2zZs0ajB8/HomJifjwww/x7bffYteuXbj77rtRWlpaY59NmjSpsSw8PNx2E7106RLMZjPi4uJqbFd92YULFxASEoJmzZrZLZckCXFxcTWaamJiYuyeh4WF1brcUfkdqX5M1qa5ugQGnpTVUTmdnb/y8nJcuXIFFy5cQGVlJd58802EhobaPW666SYAwPnz5+1eHx8fX2Ofb7zxBmbNmoV169YhPT0dMTExGD16tKJDMBBpDXOGiFSsQ4cOtqTp9PR0mEwmvPfee/jss88wbtw4AMCHH36I1NRUfPzxx3ZjAJWVlXn1no0bN4YkScjPz6+xrvqyJk2aoLKyEufOnbMLiIQQyM/PR69evbwqgy+Eh4c7PCe+yq1xdv7CwsLQoEEDhIaGIjg4GJMmTcK0adMc7iM1NdXuuaMxnurXr4958+Zh3rx5+O2332y1RCNHjsShQ4fkORiiAMeaISINWbhwIRo3boy//e1vMJvNACw3yLCwMLsbZX5+vsPeZO6w9uZas2aNXY3H5cuX8X//93922w4bNgyAJSCravXq1SguLratV4OUlBT89NNPdsu2bNmCK1eu+OT9nJ2/QYMGITg4GJGRkUhPT8fevXvRuXNn9OzZs8bDUS1ebWJjYzFlyhTccccdOHz4MEpKSuQ+LKKAxJohIg1p3Lgx5syZg6eeegorVqzAxIkTccstt2DNmjWYOnUqxo0bh7y8PLz44ouIj4/3uqnkxRdfhMFgwPDhw/H444/DZDLh5ZdfRv369XHx4kXbdsOHD0dGRgZmzZqFoqIiDBgwwNabrFu3bpg0aZJch15nkyZNwnPPPYe//e1vGDJkCHJycrBo0SJER0f75P2Cg4MxfPhwzJw5E2azGS+//DKKioowb9482zavv/46Bg4ciEGDBuGhhx5CSkoKLl++jGPHjuH//u//3OoN16dPH9xyyy3o3LkzGjdujIMHD+KDDz5Av3797PKwiMg5BkNEGvPwww9j0aJFeOGFF3DHHXfgrrvuQkFBAZYsWYL3338frVq1wuzZs3Hq1Cm7G68nhg8fjnXr1uHZZ5/Fbbfdhri4OEydOhVXr16126ckSVi3bh3mzp2LZcuWYf78+WjatCkmTZqEl156ya5bvdKefPJJFBUVYfny5XjllVfQu3dvfPLJJxg1apRP3m/69OkoLS3FI488goKCAnTs2BFffvklBgwYYNsmLS0Ne/bswYsvvohnn30WBQUFaNSoEdq0aWPLG3LlT3/6Ez7//HP861//QklJCRITE3HnnXfimWee8clxEQUiSQghlC4EERERkVKYM0RERES6xmCIiIiIdI3BEBEREekagyEiIiLSNQZDREREpGsMhoiIiEjXdDHOkNlsxpkzZ9CwYUOHw9kTERGR+gghcPnyZSQkJCAoyHf1N7oIhs6cOYPk5GSli0FEREReyMvLQ1JSks/2r4tgqGHDhgAsJzMqKkrh0hAREZE7ioqKkJycbLuP+4ougiFr01hUVBSDISIiIo3xdYoLE6iJiIhI1xgMERERka4xGCIiIiJdYzBEREREusZgiIiIiHSNwRARERHpGoMhIiIi0jUGQ0RERKRrDIaIiIhI1xgMERERka4xGCIiIiJdYzBEREREusZgiIiIiHSNwRARERHpGoMhIiIi0jUGQ0RERKRrDIaIiIhI1xQPhrZt24aRI0ciISEBkiRh3bp1Trd94IEHIEkSXnvtNb+Vj4iIiAKb4sFQcXExunTpgkWLFtW63bp16/Ddd98hISHBTyUjIiIiPQhRugA33ngjbrzxxlq3OX36NKZPn47MzEzcfPPNfioZERER6YHiNUOumM1mTJo0CU8++SQ6duyodHGIiIgowCheM+TKyy+/jJCQEDzyyCNuv6asrAxlZWW250VFRb4oGhEREQUAVdcM7d69G6+//jqWL18OSZLcft2CBQsQHR1teyQnJ/uwlERERKRlqg6Gtm/fjoKCArRo0QIhISEICQnBiRMn8PjjjyMlJcXp6+bMmYPCwkLbIy8vz3+FJiIiIk1RdTPZpEmTcMMNN9gty8jIwKRJk3DXXXc5fV14eDjCw8N9XTwiIiIKAIoHQ1euXMGxY8dsz3Nzc7Fv3z7ExMSgRYsWaNKkid32oaGhiIuLQ7t27fxdVCIiIgpAigdDP/zwA9LT023PZ86cCQCYPHkyli9frlCpiIiISC8UD4aGDh0KIYTb2x8/ftx3hSEiIiLdUXUCNREREZGvMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESka4oHQ9u2bcPIkSORkJAASZKwbt0627qKigrMmjUL119/PerXr4+EhATceeedOHPmjHIFJiIiooCieDBUXFyMLl26YNGiRTXWlZSUYM+ePXjuueewZ88erFmzBkeOHMGf//xnBUpKREREgUgSQgilC2ElSRLWrl2L0aNHO91m165d6N27N06cOIEWLVq4td+ioiJER0ejsLAQUVFRMpWWiIiIfMlf9+8Qn+3ZRwoLCyFJEho1auR0m7KyMpSVldmeFxUV+aFkREREpEWKN5N5orS0FLNnz8aECRNqjRAXLFiA6Oho2yM5OdmPpSQiIiIt0UwwVFFRgdtvvx1msxlvvfVWrdvOmTMHhYWFtkdeXp6fSklERERao4lmsoqKCowfPx65ubnYsmWLy3bD8PBwhIeH+6l0REREpGWqD4asgdDRo0eRlZWFJk2aKF0kIiIiCiCKB0NXrlzBsWPHbM9zc3Oxb98+xMTEICEhAePGjcOePXvwxRdfwGQyIT8/HwAQExODsLAwpYpNREREAULxrvXZ2dlIT0+vsXzy5MmYO3cuUlNTHb4uKysLQ4cOdes92LWeiIhIe3TTtX7o0KGoLR5T0TBIREREFIA005uMiIiIyBcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0jcEQERER6RqDISIiItI1BkNERESkawyGiIiISNcYDBEREZGuMRgiIiIiXWMwRERERLrGYIiIiIh0LUTpAhAREREBAEwmYPt24OxZID4e6NLFL2/LYIiIiIiUt2YN8OijwKlT15YlJPjlrRkMERERkbLWrAHGjQOEsF9+5oxf3p45Q0RERKQck8lSI1Q9EPIjBkNERESknO3b7ZvGFMBgiIiIiJRz9qzSJWDOEBERqVT1nkWDBgHBwUqXiuQWH690CVgzREREKrRmDZCSAqSnAxMmWP6mpFiWU2AZNAhI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PD3uf/3rX2Lt2rXiyJEjYv/+/WL27NkCgFi9erVtm0D8vK0mTpwo+vTp43CfWvi8L1++LPbu3Sv27t0rAIhXX31V7N27V5w4cUIIEbjXt6fHHSjXt6fHHSjXt6fHbaX16/uhhx4S0dHRIjs72+57W1JSYttGqWtcc8GQEEIsXrxYtGzZUoSFhYnu3bvbdcubPHmyGDJkiN322dnZolu3biIsLEykpKSIt99+u8Y+P/30U9GuXTsRGhoq2rdvb3dxqYUnxz1kyBABoMZj8uTJtm1mzJghWrRoIcLCwkSzZs3EiBEjxI4dO/x4RO7x5Lhffvll0bp1axERESEaN24sBg4cKL788ssa+wy0z1sIIX7//XdRr1498c477zjcnxY+b2vXaWff20C9vj097kC5vj097kC5vr35ngfC9e3omAGIZcuW2bZR6hqX/iggERERkS5pKmeIiIiISG4MhoiIiEjXGAwRERGRrjEYIiIiIl1jMERERES6xmCIiIiIdI3BEBEREekagyEiIiLSNQZDREREpGsMhoiIiEjXGAwRkSatXLkSEREROH36tG3Zvffei86dO6OwsFDBkhGR1nBuMiLSJCEEunbtikGDBmHRokWYN28e3nvvPezcuROJiYlKF4+INCRE6QIQEXlDkiTMnz8f48aNQ0JCAl5//XVs376dgRAReYw1Q0Skad27d8eBAwewYcMGDBkyROniEJEGMWeIiDQrMzMThw4dgslkQmxsrNLFISKNYs0QEWnSnj17MHToUCxevBirVq1CZGQkPv30U6WLRUQaxJwhItKc48eP4+abb8bs2bMxadIkpKWloVevXti9ezd69OihdPGISGNYM0REmnLx4kUMGDAAgwcPxr///W/b8lGjRqGsrAxGo1HB0hGRFjEYIiIiIl1jAjURERHpGoMhIiIi0jUGQ0RERKRrDIaIiIhI1xgMERERka4xGCIiIiJdYzBEREREusZgiIiIiHSNwRARERHpGoMhIiIi0jUGQ0RERKRrDIaIiIhI1/4/iJju0nujFHcAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -2082,17 +2089,17 @@ "output_type": "stream", "text": [ "Own inversion\n", - "[[3.88064505]\n", - " [2.99072374]]\n", - "Eigenvalues of Hessian Matrix:[0.30141906 4.73853838]\n", + "[[3.98246764]\n", + " [3.04018043]]\n", + "Eigenvalues of Hessian Matrix:[0.31541884 4.4735968 ]\n", "theta from own gd\n", - "[[3.88064505]\n", - " [2.99072374]]\n" + "[[3.98246764]\n", + " [3.04018043]]\n" ] }, { "data": { - "image/png": "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RESqxmCIiIiIVI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlVjMERERESqxmCIiIiIVI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlVjMERERESqxmCIiIiIVI3BEBEREamax4Ohbdu2ISUlBVFRUdBoNFi3bp15X2VlJZ5//nl07doVTZo0QVRUFB555BGcP3/ecw0mIiIir+LxYKi0tBTdu3fH8uXLa+27efMm9u3bhxdeeAH79u1DZmYmjh8/jt///vceaCkRERF5I40QQni6ESYajQZr167F+PHjbR6Tk5ODvn374syZM4iLi7PrvCUlJQgNDUVxcTFCQkIkai0RERG5kru+v/1cdmYXKS4uhkajQbNmzWweU15ejvLycvPjkpISN7SMiIiIlMjjw2SOKCsrw5w5czBp0qQ6I8RFixYhNDTU/BMbG+vGVhIREZGSKCYYqqysxAMPPACDwYC33367zmPnzp2L4uJi809eXp6bWklERERKo4hhssrKSkycOBG5ubnYsmVLveOGgYGBCAwMdFPriIiISMlkHwyZAqETJ04gKysL4eHhnm4SEREReRGPB0M3btzAyZMnzY9zc3Px008/ISwsDFFRUZgwYQL27dsHnU4HvV6PgoICAEBYWBgCAgI81WwiIiLyEh6fWp+dnY1hw4bV2j5lyhQsWLAACQkJVp+XlZWF5ORku16DU+uJiIiURzVT65OTk1FXPCajMkhERETkhRQzm4yIiIjIFRgMERERkaoxGCIiIiJVYzBEREREqsZgiIiIiFTN47PJiIiIiCzo9cD27cCpU255OQZDREREJB+ZmcCsWcC5c257SQZDREREJA+ZmcCECYCbawwyZ4iIiIg8T6839gh5oNgygyEiIiLyvO3b3To0Vh2DISIiIvK8Cxc89tLMGSIiIiLXMc0Mu3ABiIwEBg8GfH1rHxcZ6f62/YY9Q0REROQamZlAfDwwbBgwaZLx3/h44/aaBg8GYmIAjcbdrWQwRERERC5gmhlWMw8oP9+4vWZA5OsLLFtm/G83B0QMhoiIiEhadc0MM21LSzMeV11qKvD550B0tMubWB2DISIiIpJWfTPDhADy8ozH1ZSaCpw+DWRlAe++67ImVsdgiIiIiKRl78wwW8f5+gLJycB9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vHSp8TgiIiKSLQZDDZGaapw+Hx1tuT0mhtPqiYiIFEL2OUOyl5oKjBtnnDV24YIxR2jwYPYIERERKQSDISn4+gLJyZ5uBRERETmBw2RERESkagyGiIiISNUYDBEREZGqMRgiIiIiVWMwRERERKrGYIiIiIhUjcEQERERqRqDISIiIlI1BkNERESkagyGiIiISNUYDBEREZGqMRgiIiIiVWMwRERERKrGYIiIiIhUjcEQERERqRqDISIiIlI1BkNERESkagyGiIiISNUYDBEREZGqMRgiIiIiVWMwRERERKrGYIiIiIhUjcEQERERqRqDISIiIlI1BkNERESkagyGiIiISNUYDBEREZGqMRgiIiIiVWMwRERERKrGYIiIiIhUjcEQERERqRqDISIiIlI1BkNERESkaooJht5++20kJCQgKCgIvXr1wvbt2z3dJCIiIvICigiGVq9ejbS0NMybNw/79+/H4MGDMWbMGJw9e9bTTSMiIiKF0wghhKcbUZ+77roLPXv2xL///W/zts6dO2P8+PFYtGhRvc8vKSlBaGgoiouLERIS4sqmEhERkUTc9f0t+56hiooK7N27FyNHjrTYPnLkSOzcudNDrSIiIiJv4efpBtSnqKgIer0eERERFtsjIiJQUFBg9Tnl5eUoLy83Py4uLgZgjDCJiIhIGUzf264exJJ9MGSi0WgsHgsham0zWbRoERYuXFhre2xsrEvaRkRERK5z+fJlhIaGuuz8sg+GWrRoAV9f31q9QIWFhbV6i0zmzp2L2bNnmx9fu3YNbdq0wdmzZ116M+WmpKQEsbGxyMvLU1WuFK+b160GvG5etxoUFxcjLi4OYWFhLn0d2QdDAQEB6NWrFzZt2oR7773XvH3Tpk0YN26c1ecEBgYiMDCw1vbQ0FBV/RKZhISE8LpVhNetLrxudVHrdfv4uDbFWfbBEADMnj0bkydPRu/evdG/f3+88847OHv2LJ588klPN42IiIgUThHB0P3334/Lly/jxRdfxIULF5CUlISvv/4abdq08XTTiIiISOEUEQwBwPTp0zF9+nSnnhsYGIj58+dbHTrzZrxuXrca8Lp53WrA63btdSui6CIRERGRq8i+6CIRERGRKzEYIiIiIlVjMERERESqxmCIiIiIVE2RwdDbb7+NhIQEBAUFoVevXti+fXudx2/duhW9evVCUFAQ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", + "image/png": "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", "text/plain": [ "
" ] @@ -2183,73 +2190,73 @@ "Own inversion\n", "[[4.]\n", " [3.]]\n", - "Eigenvalues of Hessian Matrix:[0.31702609 3.84351715]\n", - "0 [-13.26083712] [-12.67834752]\n", - "1 [-0.55020405] [0.5257011]\n", - "2 [-0.50482139] [0.48233952]\n", - "3 [-0.46318204] [0.44255455]\n", - "4 [-0.42497724] [0.40605118]\n", - "5 [-0.38992371] [0.37255873]\n", - "6 [-0.3577615] [0.34182884]\n", - "7 [-0.32825214] [0.31363366]\n", - "8 [-0.30117681] [0.28776411]\n", - "9 [-0.27633474] [0.26402837]\n", - "10 [-0.25354173] [0.24225043]\n", - "11 [-0.23262877] [0.22226881]\n", - "12 [-0.21344077] [0.20393534]\n", - "13 [-0.19583547] [0.18711407]\n", - "14 [-0.17968231] [0.17168028]\n", - "15 [-0.16486151] [0.15751952]\n", - "16 [-0.15126318] [0.14452678]\n", - "17 [-0.13878649] [0.13260573]\n", - "18 [-0.12733892] [0.12166797]\n", - "19 [-0.11683558] [0.11163239]\n", - "20 [-0.10719859] [0.10242458]\n", - "21 [-0.0983565] [0.09397626]\n", - "22 [-0.09024373] [0.08622478]\n", - "23 [-0.08280012] [0.07911268]\n", - "24 [-0.07597049] [0.0725872]\n", - "25 [-0.06970419] [0.06659997]\n", - "26 [-0.06395476] [0.06110658]\n", - "27 [-0.05867956] [0.0560663]\n", - "28 [-0.05383947] [0.05144177]\n", - "29 [-0.04939861] [0.04719868]\n", + "Eigenvalues of Hessian Matrix:[0.32799141 4.41229845]\n", + "0 [-16.27698328] [-18.5653087]\n", + "1 [-0.44867801] [0.37354121]\n", + "2 [-0.41532521] [0.34577375]\n", + "3 [-0.38445171] [0.32007041]\n", + "4 [-0.35587321] [0.29627774]\n", + "5 [-0.32941912] [0.27425372]\n", + "6 [-0.30493151] [0.25386687]\n", + "7 [-0.2822642] [0.23499549]\n", + "8 [-0.26128189] [0.21752693]\n", + "9 [-0.24185931] [0.20135691]\n", + "10 [-0.22388052] [0.1863889]\n", + "11 [-0.2072382] [0.17253354]\n", + "12 [-0.191833] [0.15970814]\n", + "13 [-0.17757295] [0.14783612]\n", + "14 [-0.16437294] [0.13684661]\n", + "15 [-0.15215415] [0.12667402]\n", + "16 [-0.14084366] [0.11725761]\n", + "17 [-0.13037395] [0.10854118]\n", + "18 [-0.12068251] [0.1004727]\n", + "19 [-0.11171148] [0.09300398]\n", + "20 [-0.10340733] [0.08609047]\n", + "21 [-0.09572047] [0.07969087]\n", + "22 [-0.08860502] [0.07376699]\n", + "23 [-0.0820185] [0.06828347]\n", + "24 [-0.0759216] [0.06320757]\n", + "25 [-0.07027791] [0.05850899]\n", + "26 [-0.06505375] [0.05415968]\n", + "27 [-0.06021793] [0.05013368]\n", + "28 [-0.05574159] [0.04640695]\n", + "29 [-0.051598] [0.04295726]\n", "theta from own gd\n", - "[[3.85703369]\n", - " [3.13659941]]\n", - "0 [-0.04532405] [0.04330558]\n", - "1 [-0.04158557] [0.03973359]\n", - "2 [-0.03703391] [0.03538463]\n", - "3 [-0.03261373] [0.0311613]\n", - "4 [-0.02859759] [0.02732402]\n", - "5 [-0.02503392] [0.02391906]\n", - "6 [-0.02189994] [0.02092464]\n", - "7 [-0.01915337] [0.01830039]\n", - "8 [-0.01674956] [0.01600363]\n", - "9 [-0.01464686] [0.01399457]\n", - "10 [-0.01280793] [0.01223754]\n", - "11 [-0.01119981] [0.01070103]\n", - "12 [-0.00979357] [0.00935742]\n", - "13 [-0.0085639] [0.00818251]\n", - "14 [-0.00748862] [0.00715512]\n", - "15 [-0.00654835] [0.00625672]\n", - "16 [-0.00572613] [0.00547113]\n", - "17 [-0.00500716] [0.00478417]\n", - "18 [-0.00437846] [0.00418347]\n", - "19 [-0.0038287] [0.00365819]\n", - "20 [-0.00334797] [0.00319887]\n", - "21 [-0.0029276] [0.00279722]\n", - "22 [-0.00256001] [0.002446]\n", - "23 [-0.00223857] [0.00213888]\n", - "24 [-0.0019575] [0.00187032]\n", - "25 [-0.00171171] [0.00163548]\n", - "26 [-0.00149679] [0.00143013]\n", - "27 [-0.00130885] [0.00125057]\n", - "28 [-0.00114451] [0.00109354]\n", - "29 [-0.00100081] [0.00095624]\n", + "[[3.85437905]\n", + " [3.12123488]]\n", + "0 [-0.04776242] [0.039764]\n", + "1 [-0.04421197] [0.03680811]\n", + "2 [-0.0398603] [0.03318519]\n", + "3 [-0.03559176] [0.02963147]\n", + "4 [-0.03166546] [0.02636268]\n", + "5 [-0.02813369] [0.02342235]\n", + "6 [-0.02498282] [0.02079913]\n", + "7 [-0.02218045] [0.01846605]\n", + "8 [-0.01969093] [0.01639344]\n", + "9 [-0.01748034] [0.01455304]\n", + "10 [-0.01551775] [0.0129191]\n", + "11 [-0.01377545] [0.01146857]\n", + "12 [-0.01222875] [0.01018089]\n", + "13 [-0.01085571] [0.00903778]\n", + "14 [-0.00963683] [0.00802302]\n", + "15 [-0.0085548] [0.00712219]\n", + "16 [-0.00759427] [0.00632251]\n", + "17 [-0.00674158] [0.00561262]\n", + "18 [-0.00598464] [0.00498243]\n", + "19 [-0.00531268] [0.004423]\n", + "20 [-0.00471617] [0.00392639]\n", + "21 [-0.00418664] [0.00348553]\n", + "22 [-0.00371656] [0.00309418]\n", + "23 [-0.00329927] [0.00274676]\n", + "24 [-0.00292882] [0.00243835]\n", + "25 [-0.00259997] [0.00216458]\n", + "26 [-0.00230805] [0.00192154]\n", + "27 [-0.0020489] [0.00170579]\n", + "28 [-0.00181885] [0.00151426]\n", + "29 [-0.00161463] [0.00134424]\n", "theta from own gd wth momentum\n", - "[[3.99723951]\n", - " [3.00263755]]\n" + "[[3.99562995]\n", + " [3.00363823]]\n" ] } ], @@ -2334,17 +2341,17 @@ "output_type": "stream", "text": [ "Own inversion\n", - "[[3.95935439]\n", - " [3.09360113]]\n", - "Eigenvalues of Hessian Matrix:[0.32606139 4.1033455 ]\n", + "[[4.10426556]\n", + " [2.93942872]]\n", + "Eigenvalues of Hessian Matrix:[0.31367041 4.07517385]\n", "theta from own gd\n", - "[[3.95935439]\n", - " [3.09360113]]\n" + "[[4.10426556]\n", + " [2.93942872]]\n" ] }, { "data": { - "image/png": "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SE9Px/LlyxEUFISuXbvi+PHjLm2/s5w57qioKCxZsgQrV65EWloamjRpgj59+mDz5s2mbXz9/b5w4QLWrVuHJ5980my51N9vZ/jC99sV5Pj9doYvfL+ryle+30IITJkyBd26dUNycrLV7Tz1HZfNdBxlqVQqs8dCiArLbG1ffrmj+/QGZ9u4fPlyzJ49G1qtFhEREablnTp1QqdOnUyPu3btijZt2uD999/He++957qGV5Ejx92kSRM0adLE9Lhz587Izs7GwoUL0aNHD6f26S3OtnHZsmWoXbs2hg4darZcLu+3o3zl++0suX+/HeFL329n+cr3e+LEidi3bx+2bt1qc1tPfMdldWeobt268Pf3rxDt5ebmVogKjSIjIy1uHxAQgPDw8Eq3sbZPT3PmuI1WrFiBJ554Al9//TX69u1b6bZ+fn5o3769ZP6TqMpxl9WpUyezY/Ll91sIgc8++wyjR49GYGBgpdtK7f12hi98v6tCzt9vV5Hb97sqfOX7/fzzzyM9PR0ZGRmIjY2tdFtPfcdlFQwFBgaibdu2WL9+vdny9evXo0uXLhaf07lz5wrb//TTT2jXrh2qVatW6TbW9ulpzhw3YPiPcdy4cUhNTcWgQYNsvo4QAnv37kVUVFSV2+wKzh53eXv27DE7Jl99vwHDaI0TJ07giSeesPk6Unu/neEL329nyf377Spy+35Xhdy/30IITJw4EWlpadi4cSMSEhJsPsdj33G7U60l4quvvhLVqlUTn376qTh06JCYPHmyqFmzpimrfvr06WL06NGm7f/8809Ro0YN8eKLL4pDhw6JTz/9VFSrVk18++23pm1++eUX4e/vL/7v//5PHD58WPzf//2fCAgIEDt27PD48Vnj6HGnpqaKgIAA8cEHH4gLFy6Yfq5fv27aZvbs2eKHH34QJ0+eFHv27BGPPfaYCAgIEL/++qvHj88aR4/7nXfeEatWrRLHjh0TBw4cENOnTxcAxMqVK03b+OL7bfToo4+Kjh07WtynHN7vGzduiD179og9e/YIAOLtt98We/bsEadPnxZC+O7329Hj9pXvt6PH7Svfb0eP20ju3+/nnntOhIaGiszMTLPP7c2bN03beOs7LrtgSAghPvjgA9GwYUMRGBgo2rRpYzYsb+zYsaJnz55m22dmZorWrVuLwMBAER8fL/79739X2Oc333wjmjRpIqpVqyaaNm1q9uWSCkeOu2fPngJAhZ+xY8eatpk8ebJo0KCBCAwMFPXq1RP9+/cX27Zt8+AR2ceR454/f7649957RVBQkKhTp47o1q2bWLt2bYV9+tr7LYQQ169fF9WrVxdLliyxuD85vN/GodPWPre++v129Lh95fvt6HH7yvfbmc+5L3y/LR0zALF06VLTNt76jqvuNJCIiIhIkWSVM0RERETkagyGiIiISNEYDBEREZGiMRgiIiIiRWMwRERERIrGYIiIiIgUjcEQERERKRqDISIiIlI0BkNERESkaAyGiIiISNEYDBGRLC1fvhxBQUE4d+6cadmTTz6JFi1aIC8vz4stIyK54dxkRCRLQgi0atUK3bt3x+LFizFnzhx88skn2LFjB2JiYrzdPCKSkQBvN4CIyBkqlQpz587F8OHDER0djXfffRdbtmxhIEREDuOdISKStTZt2uDgwYP46aef0LNnT283h4hkiDlDRCRbP/74I44cOQKdTof69et7uzlEJFO8M0REsrR792706tULH3zwAb766ivUqFED33zzjbebRUQyxJwhIpKdU6dOYdCgQZg+fTpGjx6NpKQktG/fHrt27ULbtm293TwikhneGSIiWbl69Sq6du2KHj164OOPPzYt12g0KC4uxg8//ODF1hGRHDEYIiIiIkVjAjUREREpGoMhIiIiUjQGQ0RERKRoDIaIiIhI0RgMERERkaIxGCIiIiJFYzBEREREisZgiIiIiBSNwRAREREpGoMhIiIiUjQGQ0RERKRoDIaIiIhI0f4fAFlCtwL/Po0AAAAASUVORK5CYII=", + "image/png": "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/azax12z3hIREZHzcNZ6E0pLSwEAERERJreprq5GdXW17n1ZWZnLy0VERES+yeubyeoSQmDOnDno27cv0tPTTW63aNEihIeH614JCQluLCURERH5Ep9qJpsxYwaUSiV++OEHxMfHm9zOWM1QQkICm8mIiIh8CJvJ6pk5cya++OILbNu2zWwgBAByuRxyudxNJSMiIiJf5vXBkBACM2fOxPr165Gfn4/k5GRPF4mIiIj8iNcHQzNmzEB2djY2btyIJk2aoLi4GAAQHh6OBg0aeLh0RERE5Ou8PmdIJpMZXb5y5UpMmTLFqmOwaz0REZHvYc7QTV4eqxEREZGP86mu9URERETOxmCIiIiIJI3BEBEREUkagyEiIiKSNAZDREREJGkMhoiIiEjSGAwRERGRpDEYIiIiIkljMERERESSxmCIiIiIJI3BEBEREUkagyEiIiKSNAZDREREJGkMhoiIiEjSGAwRERGRpDEYIiIiIkljMERERESSxmCIiIiIJI3BEBEREUkagyEiIiKSNAZDREREJGkMhoiIiEjSGAwRERGRpDEYIiIiIkljMERERESSxmCIiIiIJI3BEBEREUkagyEiIiKSNAZDREREJGkMhoiIiEjSGAwRERGRpDEYIiIiIkljMERERESSxmCIiIiIJI3BEBEREUkagyEiIiKSNAZDREREJGkMhoiIiEjSfCYYevvtt5GcnIzQ0FB07doV27dv93SRiIiIyA/4RDC0Zs0azJ49G8899xz27duHjIwMjBgxAqdPn/Z00YiIiMjHyYQQwtOFsKRHjx7o0qUL3nnnHd2ylJQUjBkzBosWLbK4f1lZGcLDw1FaWoqwsDBXFpWIiIicxF3Pb6+vGbpx4wZ+/vlnDB06VG/50KFDsWPHDg+VioiIiPxFkKcLYMnFixehUqkQHR2ttzw6OhrFxcVG96murkZ1dbXufWlpKQBNhElERES+QfvcdnUjltcHQ1oymUzvvRDCYJnWokWLsGDBAoPlCQkJLikbERERuc6lS5cQHh7usuN7fTDUvHlzBAYGGtQClZSUGNQWac2dOxdz5szRvb969SoSExNx+vRpl36Y3qasrAwJCQkoLCyUVK4Ur5vXLQW8bl63FJSWlqJVq1aIiIhw6Xm8PhgKCQlB165dsWnTJtx111265Zs2bcLo0aON7iOXyyGXyw2Wh4eHS+pHpBUWFsbrlhBet7TwuqVFqtcdEODaFGevD4YAYM6cOZg0aRK6deuGXr16YcWKFTh9+jQeeeQRTxeNiIiIfJxPBEPjx4/HpUuX8I9//ANFRUVIT09Hbm4uEhMTPV00IiIi8nE+EQwBwPTp0zF9+nS79pXL5Zg3b57RpjN/xuvmdUsBr5vXLQW8btdet08MukhERETkKl4/6CIRERGRKzEYIiIiIkljMERERESSxmCIiIiIJM0ng6G3334bycnJCA0NRdeuXbF9+3az22/duhVdu3ZFaGgoWrdujXfffddgm3Xr1iE1NRVyuRypqalYv369q4pvN1uuOycnB0OGDEGLFi0QFhaGXr164dtvv9XbZtWqVZDJZAavqqoqV1+KTWy57vz8fKPXdOTIEb3t/O37njJlitHrTktL023jC9/3tm3bMGrUKMTGxkImk2HDhg0W9/GH+9vW6/aX+9vW6/aX+9vW6/aX+3vRokXo3r07mjRpgqioKIwZMwZHjx61uJ877nGfC4bWrFmD2bNn47nnnsO+ffuQkZGBESNG4PTp00a3LygoQGZmJjIyMrBv3z78/e9/x6xZs7Bu3TrdNjt37sT48eMxadIk/PLLL5g0aRLGjRuHH3/80V2XZZGt171t2zYMGTIEubm5+PnnnzFw4ECMGjUK+/bt09suLCwMRUVFeq/Q0FB3XJJVbL1uraNHj+pdU9u2bXXr/PH7XrZsmd71FhYWIiIiAvfcc4/edt7+fVdWVqJjx45Yvny5Vdv7y/1t63X7y/1t63Vr+fr9bet1+8v9vXXrVsyYMQO7du3Cpk2bUFtbi6FDh6KystLkPm67x4WPufPOO8Ujjzyit6x9+/bi2WefNbr9008/Ldq3b6+3bNq0aaJnz5669+PGjRPDhw/X22bYsGHi3nvvdVKpHWfrdRuTmpoqFixYoHu/cuVKER4e7qwiuoSt152XlycAiCtXrpg8phS+7/Xr1wuZTCZOnjypW+YL33ddAMT69evNbuMv93dd1ly3Mb54f9dlzXX7y/1dlz3ftz/c30IIUVJSIgCIrVu3mtzGXfe4T9UM3bhxAz///DOGDh2qt3zo0KHYsWOH0X127txpsP2wYcOwZ88e1NTUmN3G1DHdzZ7rrk+tVqO8vNxgsruKigokJiYiPj4eI0eONPiXpSc5ct2dO3dGTEwMBg0ahLy8PL11Uvi+P/jgAwwePNhglHZv/r7t4Q/3tzP44v3tCF++v53BX+7v0tJSADA7Cau77nGfCoYuXrwIlUplMFt9dHS0waz2WsXFxUa3r62txcWLF81uY+qY7mbPddf36quvorKyEuPGjdMta9++PVatWoUvvvgCq1evRmhoKPr06YPjx487tfz2sue6Y2JisGLFCqxbtw45OTlo164dBg0ahG3btum28ffvu6ioCF9//TUeeughveXe/n3bwx/ub2fwxfvbHv5wfzvKX+5vIQTmzJmDvn37Ij093eR27rrHfWY6jrpkMpneeyGEwTJL29dfbusxPcHeMq5evRrz58/Hxo0bERUVpVves2dP9OzZU/e+T58+6NKlC95880288cYbziu4g2y57nbt2qFdu3a697169UJhYSH+/e9/o1+/fnYd01PsLeOqVavQtGlTjBkzRm+5r3zftvKX+9tevn5/28Kf7m97+cv9/dhjj+HXX3/FDz/8YHFbd9zjPlUz1Lx5cwQGBhpEeyUlJQZRoVbLli2Nbh8UFITIyEiz25g6prvZc91aa9aswYMPPojPPvsMgwcPNrttQEAAunfv7jX/knDkuuvq2bOn3jX58/cthMCHH36ISZMmISQkxOy23vZ928Mf7m9H+PL97Sy+dn87wl/u75kzZ+KLL75AXl4e4uPjzW7rrnvcp4KhkJAQdO3aFZs2bdJbvmnTJvTu3dvoPr169TLY/rvvvkO3bt0QHBxsdhtTx3Q3e64b0PyLccqUKcjOzoZCobB4HiEE9u/fj5iYGIfL7Az2Xnd9+/bt07smf/2+AU1vjRMnTuDBBx+0eB5v+77t4Q/3t718/f52Fl+7vx3h6/e3EAKPPfYYcnJysGXLFiQnJ1vcx233uNWp1l7i008/FcHBweKDDz4Qhw4dErNnzxaNGjXSZdU/++yzYtKkSbrt//jjD9GwYUPxxBNPiEOHDokPPvhABAcHi7Vr1+q2+d///icCAwPFP//5T3H48GHxz3/+UwQFBYldu3a5/fpMsfW6s7OzRVBQkHjrrbdEUVGR7nX16lXdNvPnzxfffPON+P3338W+ffvE1KlTRVBQkPjxxx/dfn2m2Hrdr7/+uli/fr04duyYOHDggHj22WcFALFu3TrdNv74fWvdf//9okePHkaP6Qvfd3l5udi3b5/Yt2+fACBee+01sW/fPnHq1CkhhP/e37Zet7/c37Zet7/c37Zet5av39+PPvqoCA8PF/n5+Xq/22vXrum28dQ97nPBkBBCvPXWWyIxMVGEhISILl266HXLmzx5sujfv7/e9vn5+aJz584iJCREJCUliXfeecfgmJ9//rlo166dCA4OFu3bt9e7ubyFLdfdv39/AcDgNXnyZN02s2fPFq1atRIhISGiRYsWYujQoWLHjh1uvCLr2HLdixcvFm3atBGhoaGiWbNmom/fvkKpVBoc09++byGEuHr1qmjQoIFYsWKF0eP5wvet7Tpt6nfrr/e3rdftL/e3rdftL/e3Pb9zf7i/jV0zALFy5UrdNp66x2U3C0hEREQkST6VM0RERETkbAyGiIiISNIYDBEREZGkMRgiIiIiSWMwRERERJLGYIiIiIgkjcEQERERSRqDISIiIpI0BkNEREQkaQyGiIiISNIYDBGRT1q9ejVCQ0Nx9uxZ3bKHHnoIHTp0QGlpqQdLRkS+hnOTEZFPEkKgU6dOyMjIwPLly7FgwQK8//772LVrF+Li4jxdPCLyIUGeLgARkT1kMhkWLlyIsWPHIjY2FsuWLcP27dsZCBGRzVgzREQ+rUuXLjh48CC+++479O/f39PFISIfxJwhIvJZ3377LY4cOQKVSoXo6GhPF4eIfBRrhojIJ+3duxcDBgzAW2+9hU8//RQNGzbE559/7uliEZEPYs4QEfmckydPQqFQ4Nlnn8WkSZOQmpqK7t274+eff0bXrl09XTwi8jGsGSIin3L58mX06dMH/fr1w3vvvadbPnr0aFRXV+Obb77xYOmIyBcxGCIiIiJJYwI1ERERSRqDISIiIpI0BkNEREQkaQyGiIiISNIYDBEREZGkMRgiIiIiSWMwRERERJLGYIiIiIgkjcEQERERSRqDISIiIpI0BkNEREQkaQyGiIiISNL+HxvFMDCJWOu8AAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -2361,8 +2368,8 @@ "output_type": "stream", "text": [ "theta from own sdg\n", - "[[3.96916206]\n", - " [3.10276112]]\n" + "[[4.08587209]\n", + " [2.96301764]]\n" ] } ], @@ -2466,15 +2473,21 @@ "output_type": "stream", "text": [ "Own inversion\n", - "[[4.16532977]\n", - " [2.86943859]]\n", - "Eigenvalues of Hessian Matrix:[0.29633608 4.22128142]\n", + "[[4.33528448]\n", + " [2.81889188]]\n", + "Eigenvalues of Hessian Matrix:[0.30916402 4.51611732]\n", "theta from own gd\n", - "[[4.16445858]\n", - " [2.87020155]]\n", + "[[4.33477019]\n", + " [2.81931348]]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "theta from own sdg with momentum\n", - "[[4.149433 ]\n", - " [2.89654756]]\n" + "[[4.40800396]\n", + " [2.78459458]]\n" ] } ], @@ -2582,9 +2595,9 @@ "output_type": "stream", "text": [ "theta from own AdaGrad\n", - "[[1.99415296]\n", - " [3.03274273]\n", - " [3.96850191]]\n" + "[[2.00003828]\n", + " [2.99979896]\n", + " [4.00019258]]\n" ] } ], @@ -2683,9 +2696,9 @@ "output_type": "stream", "text": [ "theta from own RMSprop\n", - "[[2.00022969]\n", - " [2.99954278]\n", - " [4.00046631]]\n" + "[[2.01129731]\n", + " [3.01249445]\n", + " [4.00885858]]\n" ] } ], @@ -2780,9 +2793,9 @@ "output_type": "stream", "text": [ "theta from own ADAM\n", - "[[1.99991245]\n", - " [3.00042721]\n", - " [3.99954434]]\n" + "[[2.00001716]\n", + " [2.99992107]\n", + " [4.00007706]]\n" ] } ], @@ -2986,7 +2999,7 @@ { "data": { "text/plain": [ - "[]" + "[]" ] }, "execution_count": 25, @@ -3067,7 +3080,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 26, diff --git a/doc/LectureNotes/_build/jupyter_execute/week40_100_1.png b/doc/LectureNotes/_build/jupyter_execute/week40_100_1.png index 34e6443ac3be9f26cdb272af426e164605d2627a..a675ee5f071ecc1b747e1919ee448667b98bfc9a 100644 GIT binary patch literal 22560 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 R3=CVT_4XU>vTZ$o{1^MBX%PSb literal 22220 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 literal 20750 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 diff --git a/doc/LectureNotes/_build/jupyter_execute/week41.ipynb b/doc/LectureNotes/_build/jupyter_execute/week41.ipynb new file mode 100644 index 000000000..79903d776 --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/week41.ipynb @@ -0,0 +1,4842 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4fed6eef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "6a758aaa", + "metadata": { + "editable": true + }, + "source": [ + "# Week 41 Neural networks and constructing a neural network code\n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo\n", + "\n", + "Date: **Week 41**" + ] + }, + { + "cell_type": "markdown", + "id": "7436d60f", + "metadata": { + "editable": true + }, + "source": [ + "## Plan for week 41, October 7-11" + ] + }, + { + "cell_type": "markdown", + "id": "4a06fa29", + "metadata": { + "editable": true + }, + "source": [ + "## Material for the lecture on Monday October 7, 2024\n", + "1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.\n", + "\n", + "2. Building our own Feed-forward Neural Network\n", + "\n", + "\n", + "\n", + "**Readings and Videos:**\n", + "\n", + "1. These lecture notes\n", + "\n", + "2. Rashcka et al chapter 11 \n", + "\n", + "3. For neural networks we recommend Goodfellow et al chapter 6.\n", + "\n", + "a. Neural Networks demystified at \n", + "\n", + "2. Building Neural Networks from scratch at \n", + "\n", + "3. Video on Neural Networks at \n", + "\n", + "4. Video on the back propagation algorithm at \n", + "\n", + "We also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at ." + ] + }, + { + "cell_type": "markdown", + "id": "c77f547a", + "metadata": { + "editable": true + }, + "source": [ + "## Material for the active learning sessions on Tuesday and Wednesday\n", + "* Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation\n", + "\n", + "* One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code\n", + "\n", + "* Discussion of project 2\n", + "\n", + "* Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent" + ] + }, + { + "cell_type": "markdown", + "id": "a1ba6a50", + "metadata": { + "editable": true + }, + "source": [ + "## Lecture Monday October 7" + ] + }, + { + "cell_type": "markdown", + "id": "9ef418c8", + "metadata": { + "editable": true + }, + "source": [ + "## Introduction to Neural networks\n", + "\n", + "Artificial neural networks are computational systems that can learn to\n", + "perform tasks by considering examples, generally without being\n", + "programmed with any task-specific rules. It is supposed to mimic a\n", + "biological system, wherein neurons interact by sending signals in the\n", + "form of mathematical functions between layers. All layers can contain\n", + "an arbitrary number of neurons, and each connection is represented by\n", + "a weight variable." + ] + }, + { + "cell_type": "markdown", + "id": "b58ec2e6", + "metadata": { + "editable": true + }, + "source": [ + "## Artificial neurons\n", + "\n", + "The field of artificial neural networks has a long history of\n", + "development, and is closely connected with the advancement of computer\n", + "science and computers in general. A model of artificial neurons was\n", + "first developed by McCulloch and Pitts in 1943 to study signal\n", + "processing in the brain and has later been refined by others. The\n", + "general idea is to mimic neural networks in the human brain, which is\n", + "composed of billions of neurons that communicate with each other by\n", + "sending electrical signals. Each neuron accumulates its incoming\n", + "signals, which must exceed an activation threshold to yield an\n", + "output. If the threshold is not overcome, the neuron remains inactive,\n", + "i.e. has zero output.\n", + "\n", + "This behaviour has inspired a simple mathematical model for an artificial neuron." + ] + }, + { + "cell_type": "markdown", + "id": "7d1b99e3", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "

\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y = f\\left(\\sum_{i=1}^n w_ix_i\\right) = f(u)\n", + "\\label{artificialNeuron} \\tag{1}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "367512fa", + "metadata": { + "editable": true + }, + "source": [ + "Here, the output $y$ of the neuron is the value of its activation function, which have as input\n", + "a weighted sum of signals $x_i, \\dots ,x_n$ received by $n$ other neurons.\n", + "\n", + "Conceptually, it is helpful to divide neural networks into four\n", + "categories:\n", + "1. general purpose neural networks for supervised learning,\n", + "\n", + "2. neural networks designed specifically for image processing, the most prominent example of this class being Convolutional Neural Networks (CNNs),\n", + "\n", + "3. neural networks for sequential data such as Recurrent Neural Networks (RNNs), and\n", + "\n", + "4. neural networks for unsupervised learning such as Deep Boltzmann Machines.\n", + "\n", + "In natural science, DNNs and CNNs have already found numerous\n", + "applications. In statistical physics, they have been applied to detect\n", + "phase transitions in 2D Ising and Potts models, lattice gauge\n", + "theories, and different phases of polymers, or solving the\n", + "Navier-Stokes equation in weather forecasting. Deep learning has also\n", + "found interesting applications in quantum physics. Various quantum\n", + "phase transitions can be detected and studied using DNNs and CNNs,\n", + "topological phases, and even non-equilibrium many-body\n", + "localization. Representing quantum states as DNNs quantum state\n", + "tomography are among some of the impressive achievements to reveal the\n", + "potential of DNNs to facilitate the study of quantum systems.\n", + "\n", + "In quantum information theory, it has been shown that one can perform\n", + "gate decompositions with the help of neural. \n", + "\n", + "The applications are not limited to the natural sciences. There is a\n", + "plethora of applications in essentially all disciplines, from the\n", + "humanities to life science and medicine." + ] + }, + { + "cell_type": "markdown", + "id": "3d79cfce", + "metadata": { + "editable": true + }, + "source": [ + "## Neural network types\n", + "\n", + "An artificial neural network (ANN), is a computational model that\n", + "consists of layers of connected neurons, or nodes or units. We will\n", + "refer to these interchangeably as units or nodes, and sometimes as\n", + "neurons.\n", + "\n", + "It is supposed to mimic a biological nervous system by letting each\n", + "neuron interact with other neurons by sending signals in the form of\n", + "mathematical functions between layers. A wide variety of different\n", + "ANNs have been developed, but most of them consist of an input layer,\n", + "an output layer and eventual layers in-between, called *hidden\n", + "layers*. All layers can contain an arbitrary number of nodes, and each\n", + "connection between two nodes is associated with a weight variable.\n", + "\n", + "Neural networks (also called neural nets) are neural-inspired\n", + "nonlinear models for supervised learning. As we will see, neural nets\n", + "can be viewed as natural, more powerful extensions of supervised\n", + "learning methods such as linear and logistic regression and soft-max\n", + "methods we discussed earlier." + ] + }, + { + "cell_type": "markdown", + "id": "cbcafcdc", + "metadata": { + "editable": true + }, + "source": [ + "## Feed-forward neural networks\n", + "\n", + "The feed-forward neural network (FFNN) was the first and simplest type\n", + "of ANNs that were devised. In this network, the information moves in\n", + "only one direction: forward through the layers.\n", + "\n", + "Nodes are represented by circles, while the arrows display the\n", + "connections between the nodes, including the direction of information\n", + "flow. Additionally, each arrow corresponds to a weight variable\n", + "(figure to come). We observe that each node in a layer is connected\n", + "to *all* nodes in the subsequent layer, making this a so-called\n", + "*fully-connected* FFNN." + ] + }, + { + "cell_type": "markdown", + "id": "1ab04b48", + "metadata": { + "editable": true + }, + "source": [ + "## Convolutional Neural Network\n", + "\n", + "A different variant of FFNNs are *convolutional neural networks*\n", + "(CNNs), which have a connectivity pattern inspired by the animal\n", + "visual cortex. Individual neurons in the visual cortex only respond to\n", + "stimuli from small sub-regions of the visual field, called a receptive\n", + "field. This makes the neurons well-suited to exploit the strong\n", + "spatially local correlation present in natural images. The response of\n", + "each neuron can be approximated mathematically as a convolution\n", + "operation. (figure to come)\n", + "\n", + "Convolutional neural networks emulate the behaviour of neurons in the\n", + "visual cortex by enforcing a *local* connectivity pattern between\n", + "nodes of adjacent layers: Each node in a convolutional layer is\n", + "connected only to a subset of the nodes in the previous layer, in\n", + "contrast to the fully-connected FFNN. Often, CNNs consist of several\n", + "convolutional layers that learn local features of the input, with a\n", + "fully-connected layer at the end, which gathers all the local data and\n", + "produces the outputs. They have wide applications in image and video\n", + "recognition." + ] + }, + { + "cell_type": "markdown", + "id": "e4cf80b3", + "metadata": { + "editable": true + }, + "source": [ + "## Recurrent neural networks\n", + "\n", + "So far we have only mentioned ANNs where information flows in one\n", + "direction: forward. *Recurrent neural networks* on the other hand,\n", + "have connections between nodes that form directed *cycles*. This\n", + "creates a form of internal memory which are able to capture\n", + "information on what has been calculated before; the output is\n", + "dependent on the previous computations. Recurrent NNs make use of\n", + "sequential information by performing the same task for every element\n", + "in a sequence, where each element depends on previous elements. An\n", + "example of such information is sentences, making recurrent NNs\n", + "especially well-suited for handwriting and speech recognition." + ] + }, + { + "cell_type": "markdown", + "id": "f27655c6", + "metadata": { + "editable": true + }, + "source": [ + "## Other types of networks\n", + "\n", + "There are many other kinds of ANNs that have been developed. One type\n", + "that is specifically designed for interpolation in multidimensional\n", + "space is the radial basis function (RBF) network. RBFs are typically\n", + "made up of three layers: an input layer, a hidden layer with\n", + "non-linear radial symmetric activation functions and a linear output\n", + "layer (''linear'' here means that each node in the output layer has a\n", + "linear activation function). The layers are normally fully-connected\n", + "and there are no cycles, thus RBFs can be viewed as a type of\n", + "fully-connected FFNN. They are however usually treated as a separate\n", + "type of NN due the unusual activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "fa00e7d8", + "metadata": { + "editable": true + }, + "source": [ + "## Multilayer perceptrons\n", + "\n", + "One uses often so-called fully-connected feed-forward neural networks\n", + "with three or more layers (an input layer, one or more hidden layers\n", + "and an output layer) consisting of neurons that have non-linear\n", + "activation functions.\n", + "\n", + "Such networks are often called *multilayer perceptrons* (MLPs)." + ] + }, + { + "cell_type": "markdown", + "id": "7b05bd13", + "metadata": { + "editable": true + }, + "source": [ + "## Why multilayer perceptrons?\n", + "\n", + "According to the *Universal approximation theorem*, a feed-forward\n", + "neural network with just a single hidden layer containing a finite\n", + "number of neurons can approximate a continuous multidimensional\n", + "function to arbitrary accuracy, assuming the activation function for\n", + "the hidden layer is a **non-constant, bounded and\n", + "monotonically-increasing continuous function**.\n", + "\n", + "Note that the requirements on the activation function only applies to\n", + "the hidden layer, the output nodes are always assumed to be linear, so\n", + "as to not restrict the range of output values." + ] + }, + { + "cell_type": "markdown", + "id": "3600caa3", + "metadata": { + "editable": true + }, + "source": [ + "## Illustration of a single perceptron model and a multi-perceptron model\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1: In a) we show a single perceptron model while in b) we dispay a network with two hidden layers, an input layer and an output layer.

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "99af52bb", + "metadata": { + "editable": true + }, + "source": [ + "## Examples of XOR, OR and AND gates\n", + "\n", + "Let us first try to fit various gates using standard linear\n", + "regression. The gates we are thinking of are the classical XOR, OR and\n", + "AND gates, well-known elements in computer science. The tables here\n", + "show how we can set up the inputs $x_1$ and $x_2$ in order to yield a\n", + "specific target $y_i$." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "04ecfb00", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The X.TX matrix:[[4. 2. 2.]\n", + " [2. 2. 1.]\n", + " [2. 1. 2.]]\n", + "The invers of X.TX matrix:[[ 7.50000000e-01 -5.00000000e-01 -5.00000000e-01]\n", + " [-5.00000000e-01 1.00000000e+00 -2.27693602e-16]\n", + " [-5.00000000e-01 9.94484047e-17 1.00000000e+00]]\n", + "The values of theta for the XOR gate:[ 5.00000000e-01 -2.22044605e-16 -1.11022302e-16]\n", + "The linear regression prediction for the XOR gate:[0.5 0.5 0.5 0.5]\n", + "The values of theta for the OR gate:[0.25 0.5 0.5 ]\n", + "The linear regression prediction for the OR gate:[0.25 0.75 0.75 1.25]\n", + "The values of theta for the AND gate:[-0.25 0.5 0.5 ]\n", + "The linear regression prediction for the AND gate:[-0.25 0.25 0.25 0.75]\n" + ] + } + ], + "source": [ + "\"\"\"\n", + "Simple code that tests XOR, OR and AND gates with linear regression\n", + "\"\"\"\n", + "\n", + "import numpy as np\n", + "# Design matrix\n", + "X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)\n", + "print(f\"The X.TX matrix:{X.T @ X}\")\n", + "Xinv = np.linalg.pinv(X.T @ X)\n", + "print(f\"The invers of X.TX matrix:{Xinv}\")\n", + "\n", + "# The XOR gate \n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "ThetaXOR = Xinv @ X.T @ yXOR\n", + "print(f\"The values of theta for the XOR gate:{ThetaXOR}\")\n", + "print(f\"The linear regression prediction for the XOR gate:{X @ ThetaXOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "ThetaOR = Xinv @ X.T @ yOR\n", + "print(f\"The values of theta for the OR gate:{ThetaOR}\")\n", + "print(f\"The linear regression prediction for the OR gate:{X @ ThetaOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "ThetaAND = Xinv @ X.T @ yAND\n", + "print(f\"The values of theta for the AND gate:{ThetaAND}\")\n", + "print(f\"The linear regression prediction for the AND gate:{X @ ThetaAND}\")" + ] + }, + { + "cell_type": "markdown", + "id": "0026adeb", + "metadata": { + "editable": true + }, + "source": [ + "What is happening here?" + ] + }, + { + "cell_type": "markdown", + "id": "e23f3056", + "metadata": { + "editable": true + }, + "source": [ + "## Does Logistic Regression do a better Job?" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a30fe879", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The X.TX matrix:[[4. 2. 2.]\n", + " [2. 2. 1.]\n", + " [2. 1. 2.]]\n", + "The invers of X.TX matrix:[[ 7.50000000e-01 -5.00000000e-01 -5.00000000e-01]\n", + " [-5.00000000e-01 1.00000000e+00 -2.27693602e-16]\n", + " [-5.00000000e-01 9.94484047e-17 1.00000000e+00]]\n", + "The values of theta for the XOR gate:[ 5.00000000e-01 -2.22044605e-16 -1.11022302e-16]\n", + "The linear regression prediction for the XOR gate:[0.5 0.5 0.5 0.5]\n", + "The values of theta for the OR gate:[0.25 0.5 0.5 ]\n", + "The linear regression prediction for the OR gate:[0.25 0.75 0.75 1.25]\n", + "The values of theta for the AND gate:[-0.25 0.5 0.5 ]\n", + "The linear regression prediction for the AND gate:[-0.25 0.25 0.25 0.75]\n", + "Test set accuracy with Logistic Regression for OR gate: 0.75\n", + "Test set accuracy with Logistic Regression for XOR gate: 0.50\n", + "Test set accuracy with Logistic Regression for AND gate: 0.75\n" + ] + } + ], + "source": [ + "%matplotlib inline\n", + "\n", + "\"\"\"\n", + "Simple code that tests XOR and OR gates with linear regression\n", + "and logistic regression\n", + "\"\"\"\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.linear_model import LogisticRegression\n", + "import numpy as np\n", + "\n", + "# Design matrix\n", + "X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)\n", + "print(f\"The X.TX matrix:{X.T @ X}\")\n", + "Xinv = np.linalg.pinv(X.T @ X)\n", + "print(f\"The invers of X.TX matrix:{Xinv}\")\n", + "\n", + "# The XOR gate \n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "ThetaXOR = Xinv @ X.T @ yXOR\n", + "print(f\"The values of theta for the XOR gate:{ThetaXOR}\")\n", + "print(f\"The linear regression prediction for the XOR gate:{X @ ThetaXOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "ThetaOR = Xinv @ X.T @ yOR\n", + "print(f\"The values of theta for the OR gate:{ThetaOR}\")\n", + "print(f\"The linear regression prediction for the OR gate:{X @ ThetaOR}\")\n", + "\n", + "\n", + "# The OR gate \n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "ThetaAND = Xinv @ X.T @ yAND\n", + "print(f\"The values of theta for the AND gate:{ThetaAND}\")\n", + "print(f\"The linear regression prediction for the AND gate:{X @ ThetaAND}\")\n", + "\n", + "# Now we change to logistic regression\n", + "\n", + "\n", + "# Logistic Regression\n", + "logreg = LogisticRegression()\n", + "logreg.fit(X, yOR)\n", + "print(\"Test set accuracy with Logistic Regression for OR gate: {:.2f}\".format(logreg.score(X,yOR)))\n", + "\n", + "logreg.fit(X, yXOR)\n", + "print(\"Test set accuracy with Logistic Regression for XOR gate: {:.2f}\".format(logreg.score(X,yXOR)))\n", + "\n", + "\n", + "logreg.fit(X, yAND)\n", + "print(\"Test set accuracy with Logistic Regression for AND gate: {:.2f}\".format(logreg.score(X,yAND)))" + ] + }, + { + "cell_type": "markdown", + "id": "7773ba9d", + "metadata": { + "editable": true + }, + "source": [ + "Not exactly impressive, but somewhat better." + ] + }, + { + "cell_type": "markdown", + "id": "4a85ef26", + "metadata": { + "editable": true + }, + "source": [ + "## Adding Neural Networks" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2f8dd9ef", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test set accuracy with Feed Forward Neural Network for XOR gate:1.0\n" + ] + } + ], + "source": [ + "\n", + "# and now neural networks with Scikit-Learn and the XOR\n", + "\n", + "from sklearn.neural_network import MLPClassifier\n", + "from sklearn.datasets import make_classification\n", + "X, yXOR = make_classification(n_samples=100, random_state=1)\n", + "FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)\n", + "FFNN.predict_proba(X)\n", + "print(f\"Test set accuracy with Feed Forward Neural Network for XOR gate:{FFNN.score(X, yXOR)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5b0fb3ff", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "The output $y$ is produced via the activation function $f$" + ] + }, + { + "cell_type": "markdown", + "id": "f5c984c2", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "y = f\\left(\\sum_{i=1}^n w_ix_i + b_i\\right) = f(z),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9743f4cb", + "metadata": { + "editable": true + }, + "source": [ + "This function receives $x_i$ as inputs.\n", + "Here the activation $z=(\\sum_{i=1}^n w_ix_i+b_i)$. \n", + "In an FFNN of such neurons, the *inputs* $x_i$ are the *outputs* of\n", + "the neurons in the preceding layer. Furthermore, an MLP is\n", + "fully-connected, which means that each neuron receives a weighted sum\n", + "of the outputs of *all* neurons in the previous layer." + ] + }, + { + "cell_type": "markdown", + "id": "e89c3e3f", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "First, for each node $i$ in the first hidden layer, we calculate a weighted sum $z_i^1$ of the input coordinates $x_j$," + ] + }, + { + "cell_type": "markdown", + "id": "21c83fef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} z_i^1 = \\sum_{j=1}^{M} w_{ij}^1 x_j + b_i^1\n", + "\\label{_auto1} \\tag{2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3267338f", + "metadata": { + "editable": true + }, + "source": [ + "Here $b_i$ is the so-called bias which is normally needed in\n", + "case of zero activation weights or inputs. How to fix the biases and\n", + "the weights will be discussed below. The value of $z_i^1$ is the\n", + "argument to the activation function $f_i$ of each node $i$, The\n", + "variable $M$ stands for all possible inputs to a given node $i$ in the\n", + "first layer. We define the output $y_i^1$ of all neurons in layer 1 as" + ] + }, + { + "cell_type": "markdown", + "id": "04a1a613", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^1 = f(z_i^1) = f\\left(\\sum_{j=1}^M w_{ij}^1 x_j + b_i^1\\right)\n", + "\\label{outputLayer1} \\tag{3}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bc8b70e2", + "metadata": { + "editable": true + }, + "source": [ + "where we assume that all nodes in the same layer have identical\n", + "activation functions, hence the notation $f$. In general, we could assume in the more general case that different layers have different activation functions.\n", + "In this case we would identify these functions with a superscript $l$ for the $l$-th layer," + ] + }, + { + "cell_type": "markdown", + "id": "10686541", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^l = f^l(u_i^l) = f^l\\left(\\sum_{j=1}^{N_{l-1}} w_{ij}^l y_j^{l-1} + b_i^l\\right)\n", + "\\label{generalLayer} \\tag{4}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a92cdf36", + "metadata": { + "editable": true + }, + "source": [ + "where $N_l$ is the number of nodes in layer $l$. When the output of\n", + "all the nodes in the first hidden layer are computed, the values of\n", + "the subsequent layer can be calculated and so forth until the output\n", + "is obtained." + ] + }, + { + "cell_type": "markdown", + "id": "74dcfa13", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "The output of neuron $i$ in layer 2 is thus," + ] + }, + { + "cell_type": "markdown", + "id": "0147afef", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^2 = f^2\\left(\\sum_{j=1}^N w_{ij}^2 y_j^1 + b_i^2\\right) \n", + "\\label{_auto2} \\tag{5}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4a4d5b2e", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} \n", + " = f^2\\left[\\sum_{j=1}^N w_{ij}^2f^1\\left(\\sum_{k=1}^M w_{jk}^1 x_k + b_j^1\\right) + b_i^2\\right]\n", + "\\label{outputLayer2} \\tag{6}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "31742756", + "metadata": { + "editable": true + }, + "source": [ + "where we have substituted $y_k^1$ with the inputs $x_k$. Finally, the ANN output reads" + ] + }, + { + "cell_type": "markdown", + "id": "123af90c", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y_i^3 = f^3\\left(\\sum_{j=1}^N w_{ij}^3 y_j^2 + b_i^3\\right) \n", + "\\label{_auto3} \\tag{7}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "aeb7cc95", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation} \n", + " = f_3\\left[\\sum_{j} w_{ij}^3 f^2\\left(\\sum_{k} w_{jk}^2 f^1\\left(\\sum_{m} w_{km}^1 x_m + b_k^1\\right) + b_j^2\\right)\n", + " + b_1^3\\right]\n", + "\\label{_auto4} \\tag{8}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3ab7d88c", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "We can generalize this expression to an MLP with $l$ hidden\n", + "layers. The complete functional form is," + ] + }, + { + "cell_type": "markdown", + "id": "9b07f5bb", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "y^{l+1}_i = f^{l+1}\\left[\\!\\sum_{j=1}^{N_l} w_{ij}^3 f^l\\left(\\sum_{k=1}^{N_{l-1}}w_{jk}^{l-1}\\left(\\dots f^1\\left(\\sum_{n=1}^{N_0} w_{mn}^1 x_n+ b_m^1\\right)\\dots\\right)+b_k^2\\right)+b_1^3\\right] \n", + "\\label{completeNN} \\tag{9}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e9b4beb5", + "metadata": { + "editable": true + }, + "source": [ + "which illustrates a basic property of MLPs: The only independent\n", + "variables are the input values $x_n$." + ] + }, + { + "cell_type": "markdown", + "id": "57213d71", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematical model\n", + "\n", + "This confirms that an MLP, despite its quite convoluted mathematical\n", + "form, is nothing more than an analytic function, specifically a\n", + "mapping of real-valued vectors $\\hat{x} \\in \\mathbb{R}^n \\rightarrow\n", + "\\hat{y} \\in \\mathbb{R}^m$.\n", + "\n", + "Furthermore, the flexibility and universality of an MLP can be\n", + "illustrated by realizing that the expression is essentially a nested\n", + "sum of scaled activation functions of the form" + ] + }, + { + "cell_type": "markdown", + "id": "85dc952c", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " f(x) = c_1 f(c_2 x + c_3) + c_4\n", + "\\label{_auto5} \\tag{10}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4a67580f", + "metadata": { + "editable": true + }, + "source": [ + "where the parameters $c_i$ are weights and biases. By adjusting these\n", + "parameters, the activation functions can be shifted up and down or\n", + "left and right, change slope or be rescaled which is the key to the\n", + "flexibility of a neural network." + ] + }, + { + "cell_type": "markdown", + "id": "19f79e3c", + "metadata": { + "editable": true + }, + "source": [ + "### Matrix-vector notation\n", + "\n", + "We can introduce a more convenient notation for the activations in an A NN. \n", + "\n", + "Additionally, we can represent the biases and activations\n", + "as layer-wise column vectors $\\hat{b}_l$ and $\\hat{y}_l$, so that the $i$-th element of each vector \n", + "is the bias $b_i^l$ and activation $y_i^l$ of node $i$ in layer $l$ respectively. \n", + "\n", + "We have that $\\mathrm{W}_l$ is an $N_{l-1} \\times N_l$ matrix, while $\\hat{b}_l$ and $\\hat{y}_l$ are $N_l \\times 1$ column vectors. \n", + "With this notation, the sum becomes a matrix-vector multiplication, and we can write\n", + "the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as" + ] + }, + { + "cell_type": "markdown", + "id": "e350b83c", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " \\hat{y}_2 = f_2(\\mathrm{W}_2 \\hat{y}_{1} + \\hat{b}_{2}) = \n", + " f_2\\left(\\left[\\begin{array}{ccc}\n", + " w^2_{11} &w^2_{12} &w^2_{13} \\\\\n", + " w^2_{21} &w^2_{22} &w^2_{23} \\\\\n", + " w^2_{31} &w^2_{32} &w^2_{33} \\\\\n", + " \\end{array} \\right] \\cdot\n", + " \\left[\\begin{array}{c}\n", + " y^1_1 \\\\\n", + " y^1_2 \\\\\n", + " y^1_3 \\\\\n", + " \\end{array}\\right] + \n", + " \\left[\\begin{array}{c}\n", + " b^2_1 \\\\\n", + " b^2_2 \\\\\n", + " b^2_3 \\\\\n", + " \\end{array}\\right]\\right).\n", + "\\label{_auto6} \\tag{11}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3b64eaf6", + "metadata": { + "editable": true + }, + "source": [ + "### Matrix-vector notation and activation\n", + "\n", + "The activation of node $i$ in layer 2 is" + ] + }, + { + "cell_type": "markdown", + "id": "dc8ca05e", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y^2_i = f_2\\Bigr(w^2_{i1}y^1_1 + w^2_{i2}y^1_2 + w^2_{i3}y^1_3 + b^2_i\\Bigr) = \n", + " f_2\\left(\\sum_{j=1}^3 w^2_{ij} y_j^1 + b^2_i\\right).\n", + "\\label{_auto7} \\tag{12}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "079a6c4b", + "metadata": { + "editable": true + }, + "source": [ + "This is not just a convenient and compact notation, but also a useful\n", + "and intuitive way to think about MLPs: The output is calculated by a\n", + "series of matrix-vector multiplications and vector additions that are\n", + "used as input to the activation functions. For each operation\n", + "$\\mathrm{W}_l \\hat{y}_{l-1}$ we move forward one layer." + ] + }, + { + "cell_type": "markdown", + "id": "3498dab8", + "metadata": { + "editable": true + }, + "source": [ + "### Activation functions\n", + "\n", + "A property that characterizes a neural network, other than its\n", + "connectivity, is the choice of activation function(s). As described\n", + "in, the following restrictions are imposed on an activation function\n", + "for a FFNN to fulfill the universal approximation theorem\n", + "\n", + " * Non-constant\n", + "\n", + " * Bounded\n", + "\n", + " * Monotonically-increasing\n", + "\n", + " * Continuous" + ] + }, + { + "cell_type": "markdown", + "id": "c0b93415", + "metadata": { + "editable": true + }, + "source": [ + "### Activation functions, Logistic and Hyperbolic ones\n", + "\n", + "The second requirement excludes all linear functions. Furthermore, in\n", + "a MLP with only linear activation functions, each layer simply\n", + "performs a linear transformation of its inputs.\n", + "\n", + "Regardless of the number of layers, the output of the NN will be\n", + "nothing but a linear function of the inputs. Thus we need to introduce\n", + "some kind of non-linearity to the NN to be able to fit non-linear\n", + "functions Typical examples are the logistic *Sigmoid*" + ] + }, + { + "cell_type": "markdown", + "id": "74a5d31d", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) = \\frac{1}{1 + e^{-x}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "539998aa", + "metadata": { + "editable": true + }, + "source": [ + "and the *hyperbolic tangent* function" + ] + }, + { + "cell_type": "markdown", + "id": "e4b4b760", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) = \\tanh(x)\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b98e352b", + "metadata": { + "editable": true + }, + "source": [ + "### Relevance\n", + "\n", + "The *sigmoid* function are more biologically plausible because the\n", + "output of inactive neurons are zero. Such activation function are\n", + "called *one-sided*. However, it has been shown that the hyperbolic\n", + "tangent performs better than the sigmoid for training MLPs. has\n", + "become the most popular for *deep neural networks*" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9f6ead02", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "data": { + "image/png": "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XkWkiWVlZTFs2DASEhJ49tlnOXz4cNX3WrZsaWIyz5eamsro0aPp168fAwcO5NVXXyUzM5OJEyeaHc3r3Hnnnbz77rt8+umnhIWFVc3biYiIICgoyOR03iMsLKxG4QgJCSEqKsqjiwiojIiXW7JkCbt27WLXrl01iqB2Gp5Zo0aNIj8/n2nTppGdnU337t1ZtGgRbdu2NTua1zlxevWwYcOqLX/jjTcYN25c0wcSr6PDNCIiImIqzdITERERU6mMiIiIiKlURkRERMRUKiMiIiJiKpURERERMZXKiIiIiJhKZURERERMpTIiIiIiplIZEREREVOpjIiIiIipVEZExBR79+7FYrHU+Prt/VFExPPpRnkiYor4+Hiys7OrHufk5HDhhRdy3nnnmZhKRMygG+WJiOnKysoYNmwY0dHRfPrpp/j4aKetiDfRnhERMd348eMpKioiPT1dRUTEC6mMiIipnnzySRYvXsxPP/1EWFiY2XFExAQ6TCMipvnwww+54YYb+PLLL7ngggvMjiMiJlEZERFTbNq0iQEDBpCamsqdd95ZtTwgIIDIyEgTk4lIU1MZERFTzJ07l1tuuaXG8qFDh/Ldd981fSARMY3KiIiIiJhK09ZFRETEVCojIiIiYiqVERERETGVyoiIiIiYSmVERERETKUyIiIiIqZSGRERERFTqYyIiIiIqVRGRERExFQqIyIiImIqlRERERExlcqIiIiImOr/AbSpzJqxOet0AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week41_59_0.png" + } + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAHFCAYAAAD/kYOsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4kUlEQVR4nO3de3SU1b3/8c8EwoQIiQYkCW0IlEWBAAoEyYWCREwQBNGKQLVRFLAssIKpy5p6A/Q0R2slgILSQ02R67ER0BqRYA3gIVCBBKun8gMPGIRELkqGi5kMyfP7QzMwTghJZZjJnvdrrVn67Nnz5LvZTvj47OdisyzLEgAAgEFC/F0AAADApUbAAQAAxiHgAAAA4xBwAACAcQg4AADAOAQcAABgHAIOAAAwDgEHAAAYh4ADAACMQ8ABcFErVqxQbm6uX2v46quvNGHCBHXo0EE2m0233nqrX+v5/e9/r7Vr13q1FxUVyWazqaio6LLXBOAcG49qAHAxo0aN0scff6wDBw74rYaHHnpICxcu1J///Gd17dpVUVFR+ulPf+q3etq0aaOxY8cqLy/Po93hcOh///d/lZCQoIiICP8UB0At/V0AADTGxx9/rK5du+quu+7ydykNioiIUHJysr/LAIIeS1RAkDt69Kjuv/9+xcXFyW636+qrr9agQYO0ceNGSdLQoUP19ttv6/PPP5fNZnO/6lRXV+uZZ55Rjx493J+/9957dfToUY+f07lzZ40aNUpr1qzRNddco7CwMP3kJz/R/PnzG6zvwIEDstls2rhxo/71r3+5f35RUdEFl4PqPnP+0ZWJEyeqTZs22rdvn0aOHKk2bdooLi5Ov/nNb+R0Oj0+73Q6NWfOHPXs2VNhYWFq166d0tLStHXrVkmSzWbT6dOn9Ze//MVdz9ChQyVdeInqzTffVEpKisLDw9W2bVulp6eruLjYo8+sWbNks9n0ySef6Be/+IUiIyMVHR2t++67T5WVlQ3+OQHwxBEcIMhlZmZq165d+o//+A/99Kc/1YkTJ7Rr1y4dP35ckrRw4ULdf//9+uyzz7RmzRqPz9bW1mrMmDHasmWLHnnkEaWmpurzzz/XU089paFDh2rHjh1q3bq1u39paalmzpypWbNmKSYmRsuXL9eMGTNUXV2thx9+uN76YmNjVVxcrGnTpqmyslLLly+XJCUkJGjXrl1NGqvL5dItt9yiSZMm6Te/+Y02b96sp59+WpGRkXryySclSWfPntWIESO0ZcsWzZw5UzfccIPOnj2rbdu2qaysTKmpqSouLtYNN9ygtLQ0PfHEE5LU4HLUihUrdNdddykjI0MrV66U0+nUc889p6FDh+q9997Tz372M4/+t99+u8aPH69Jkybpn//8p7KzsyVJf/7zn5s0XiCoWQCCWps2bayZM2c22Ofmm2+24uPjvdpXrlxpSbLy8/M92j/88ENLkrVw4UJ3W3x8vGWz2azS0lKPvunp6VZERIR1+vTpBmu4/vrrrV69enm0vf/++5Yk6/333/do379/vyXJevXVV91t99xzjyXJ+u///m+PviNHjrS6d+/u3l66dKklyfrTn/7UYD1XXHGFdc8993i1f7+mmpoaq2PHjlafPn2smpoad7+TJ09aHTp0sFJTU91tTz31lCXJeu655zz2OW3aNCssLMyqra1tsCYA57BEBQS5gQMHKi8vT88884y2bdsml8vV6M/+7W9/05VXXqnRo0fr7Nmz7lffvn0VExPjtUzTq1cvXXvttR5td955pxwOR5OPxvw7bDabRo8e7dF2zTXX6PPPP3dvv/POOwoLC9N99913SX7mnj17dPjwYWVmZiok5Nyv3DZt2uj222/Xtm3bdObMGY/P3HLLLV41VlVV6ciRI5ekJiAYEHCAILd69Wrdc889+q//+i+lpKQoKipKd999tyoqKi762S+//FInTpxQq1atFBoa6vGqqKjQsWPHPPrHxMR47aOurW5JzJfCw8MVFhbm0Wa321VVVeXePnr0qDp27OgRRn6IunHFxsZ6vdexY0fV1tbq66+/9mhv166dV42S9M0331ySmoBgwDk4QJBr3769cnNzlZubq7KyMr355pt69NFHdeTIEa1fv/6in23Xrt0F+7Vt29Zju77QVNf2/b/UG6MurHz/JOHvB6umuPrqq/XBBx+otrb2koScunGVl5d7vXf48GGFhIToqquu+sE/B4AnjuAAcOvUqZMeeOABpaeneywZ2e32eo8ejBo1SsePH1dNTY0GDBjg9erevbtH/08++US7d+/2aFuxYoXatm2r/v37N7nezp07S5I++ugjj/Y333yzyfuqM2LECFVVVXnd3+b7LvRn8n3du3fXj370I61YsULWebcdO336tPLz891XVgG4tDiCAwSxyspKpaWl6c4771SPHj3Utm1bffjhh1q/fr1+/vOfu/v16dNHb7zxhhYtWqTExESFhIRowIABmjBhgpYvX66RI0dqxowZGjhwoEJDQ/XFF1/o/fff15gxY3Tbbbe599OxY0fdcsstmjVrlmJjY7Vs2TIVFhbq2Wef/bf+ko+JidGNN96onJwcXXXVVYqPj9d7772nN95449/+M/nFL36hV199VVOnTtWePXuUlpam2tpabd++XT179tSECRPcfyZFRUV66623FBsbq7Zt23oFOkkKCQnRc889p7vuukujRo3Sr371KzmdTv3hD3/QiRMn9J//+Z//dq0AGuDvs5wB+E9VVZU1depU65prrrEiIiKs1q1bW927d7eeeuopj6uavvrqK2vs2LHWlVdeadlsNuv8Xx0ul8t6/vnnrWuvvdYKCwuz2rRpY/Xo0cP61a9+Ze3du9fdLz4+3rr55putv/71r1avXr2sVq1aWZ07d7ZeeOGFRtVa31VUlmVZ5eXl1tixY62oqCgrMjLS+uUvf2nt2LGj3quorrjiCq/P1125dL5vvvnGevLJJ61u3bpZrVq1stq1a2fdcMMN1tatW919SktLrUGDBlnh4eGWJOv666+3LOvCV3atXbvWSkpKssLCwqwrrrjCGjZsmPU///M/9dZy9OhRj/ZXX33VkmTt37+/EX9SACzLsnhUA4DLonPnzurdu7f+9re/+bsUAEGAc3AAAIBxCDgAAMA4LFEBAADj+PQIzubNmzV69Gh17NhRNptNa9eubbB/3UPqvv/69NNPPfrl5+crISFBdrtdCQkJXs/HAQAAwc2nAef06dO69tpr9eKLLzbpc3v27FF5ebn71a1bN/d7xcXFGj9+vDIzM7V7925lZmZq3Lhx2r59+6UuHwAANFOXbYnKZrNpzZo1uvXWWy/Yp6ioSGlpafr666915ZVX1ttn/Pjxcjgceuedd9xtN910k6666iqtXLnyElcNAACao4C80V+/fv1UVVWlhIQEPf7440pLS3O/V1xcrIceesij//Dhw5Wbm3vB/TmdTo9budfW1uqrr75Su3btZLPZLnn9AADg0rMsSydPnmzU8+ICKuDExsZq8eLFSkxMlNPp1GuvvaZhw4apqKhIQ4YMkfTtc2uio6M9PhcdHd3ggwFzcnI0e/Zsn9YOAAAuj4MHD+rHP/5x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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week41_59_1.png" + } + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week41_59_2.png" + } + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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4+Nv6Hk9PT01ZcqUMpezzIy+6dsZ0Dd9OwP6rti+y30zMgAAQHXBh3oCAADTIugAAADTIugAAADTIugAAADTqvZB58CBA3rssccUHh4ub29vNW3aVFOmTFFBQcFVjzMMQ/Hx8apfv768vb0VFRWlnTt3VlLVFeOll15St27d5OPjc93vIjlixAhZLJYSX126dLFvoRXsRvo2w3yfPn1aw4YNk5+fn/z8/DRs2DCdOXPmqsdUx/meN2+ewsPD5eXlpcjISP3www9XHb9mzRpFRkbKy8tLTZo00fz58yup0opVnr6TkpJKzavFYtGePXsqseKbt3btWvXv31/169eXxWLRV199dc1jzDDf5e3bDPM9ffp0derUSb6+vgoMDNT999+v1NTUax5XEfNd7YPOnj17VFxcrLfffls7d+7U66+/rvnz52vy5MlXPW7GjBmaOXOm5syZo02bNik4OFi9evVSbm5uJVV+8woKCjRo0CA9+eST5TquT58+ysjIsH0tX77cThXax430bYb5jo2NVUpKilauXKmVK1cqJSVFw4YNu+Zx1Wm+Fy9erPHjx+vZZ59VcnKyunfvrr59+yo9Pb3M8WlpaerXr5+6d++u5ORkTZ48WePGjdOSJUsqufKbU96+L0lNTS0xt7feemslVVwxzp07p3bt2mnOnDnXNd4s813evi+pzvO9Zs0ajR49Whs2bFBiYqIKCwsVExOjc+fOXfGYCptvw4RmzJhhhIeHX/Hx4uJiIzg42Hj55Zdt+y5cuGD4+fkZ8+fPr4wSK9TChQsNPz+/6xo7fPhwY8CAAXatp7Jcb99mmO9du3YZkowNGzbY9q1fv96QZOzZs+eKx1W3+b799tuNkSNHltjXokUL45lnnilz/MSJE40WLVqU2PfnP//Z6NKli91qtIfy9r169WpDknH69OlKqK5ySDKWLl161TFmme/fup6+zTjfx48fNyQZa9asueKYiprvan9FpyzZ2dmqW7fuFR9PS0tTZmamYmJibPs8PT3Vs2dPrVu3rjJKdKikpCQFBgaqWbNmeuKJJ3T8+HFHl2RXZpjv9evXy8/PT507d7bt69Kli/z8/K7ZQ3WZ74KCAv38888l5kmSYmJirtjj+vXrS43v3bu3Nm/eLKvVardaK9KN9H1JRESEQkJCdNddd2n16tX2LLNKMMN83wwzzfelT0S42t/qippv0wWdX375RW+++aZGjhx5xTGXPm8rKCioxP6goKBSn8VlNn379tXHH3+s77//Xq+99po2bdqkO++8s8QnwJuNGeY7MzNTgYGBpfYHBgZetYfqNN8nT55UUVFRueYpMzOzzPGFhYU6efKk3WqtSDfSd0hIiN555x0tWbJEX375pZo3b6677rpLa9eurYySHcYM830jzDbfhmEoLi5Od9xxh1q3bn3FcRU131U26MTHx5d589VvvzZv3lzimKNHj6pPnz4aNGiQHn/88Ws+h8ViKbFtGEapfZXtRvouj8GDB+uee+5R69at1b9/f61YsUJ79+7Vt99+W4FdlJ+9+5aq/3yXVeu1eqiq83015Z2nssaXtb+qK0/fzZs31xNPPKEOHTqoa9eumjdvnu655x69+uqrlVGqQ5llvsvDbPM9ZswYbdu2TZ988sk1x1bEfNvts65u1pgxYzRkyJCrjgkLC7P999GjRxUdHa2uXbvqnXfeuepxwcHBki6mxZCQENv+48ePl0qPla28fd+skJAQhYaGat++fRV2zhthz77NMN/btm3TsWPHSj124sSJcvVQVea7LAEBAXJ1dS11FeNq8xQcHFzmeDc3N/n7+9ut1op0I32XpUuXLvroo48qurwqxQzzXVGq63yPHTtWy5Yt09q1a0t94PflKmq+q2zQCQgIUEBAwHWNPXLkiKKjoxUZGamFCxfKxeXqF6rCw8MVHBysxMRERURESLq4Tr5mzRq98sorN137zShP3xUhKytLhw4dKhEAHMGefZthvrt27ars7Gxt3LhRt99+uyTpp59+UnZ2trp163bdz1dV5rssHh4eioyMVGJioh544AHb/sTERA0YMKDMY7p27apvvvmmxL5Vq1apY8eOcnd3t2u9FeVG+i5LcnJylZzXimSG+a4o1W2+DcPQ2LFjtXTpUiUlJSk8PPyax1TYfJfr1uUq6MiRI8Ytt9xi3Hnnncbhw4eNjIwM29dvNW/e3Pjyyy9t2y+//LLh5+dnfPnll8b27duNoUOHGiEhIUZOTk5lt3DDDh48aCQnJxtTp041atasaSQnJxvJyclGbm6ubcxv+87NzTWefvppY926dUZaWpqxevVqo2vXrkaDBg1M3bdhmGO++/TpY7Rt29ZYv369sX79eqNNmzbGvffeW2JMdZ/vTz/91HB3dzcWLFhg7Nq1yxg/frxRo0YN48CBA4ZhGMYzzzxjDBs2zDb+119/NXx8fIynnnrK2LVrl7FgwQLD3d3d+OKLLxzVwg0pb9+vv/66sXTpUmPv3r3Gjh07jGeeecaQZCxZssRRLdyQ3Nxc2++vJGPmzJlGcnKycfDgQcMwzDvf5e3bDPP95JNPGn5+fkZSUlKJv9N5eXm2Mfaa72ofdBYuXGhIKvPrtyQZCxcutG0XFxcbU6ZMMYKDgw1PT0+jR48exvbt2yu5+pszfPjwMvtevXq1bcxv+87LyzNiYmKMevXqGe7u7kbjxo2N4cOHG+np6Y5p4AaVt2/DMMd8Z2VlGQ8//LDh6+tr+Pr6Gg8//HCpl5uaYb7nzp1rhIaGGh4eHkaHDh1KvPx0+PDhRs+ePUuMT0pKMiIiIgwPDw8jLCzMeOuttyq54opRnr5feeUVo2nTpoaXl5dRp04d44477jC+/fZbB1R9cy69bPryr+HDhxuGYd75Lm/fZpjvK/2d/u2/0/aab8v/FQAAAGA6VfZVVwAAADeLoAMAAEyLoAMAAEyLoAMAAEyLoAMAAEyLoAMAAEyLoAMAAEyLoAMAAEyLoAMAAEyLoAMAAEyLoAOgyjtw4IAsFkupr6ioKEeXBqCKc3N0AQBwLY0aNVJGRoZtOzMzU3fffbd69OjhwKoAVAd8qCeAauXChQuKiopSvXr19PXXX8vFhQvTAK6MKzoAqpXHHntMubm5SkxMJOQAuCaCDoBq4x//+IdWrlypjRs3ytfX19HlAKgGWLoCUC0sWbJEQ4cO1YoVK3TXXXc5uhwA1QRBB0CVt2PHDnXu3FlxcXEaPXq0bb+Hh4fq1q3rwMoAVHUEHQBVXkJCgh599NFS+3v27KmkpKTKLwhAtUHQAQAApsVLFgAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGkRdAAAgGn9P+9K8z/xjo0MAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week41_59_3.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "\"\"\"The sigmoid function (or the logistic curve) is a \n", + "function that takes any real number, z, and outputs a number (0,1).\n", + "It is useful in neural networks for assigning weights on a relative scale.\n", + "The value z is the weighted sum of parameters involved in the learning algorithm.\"\"\"\n", + "\n", + "import numpy\n", + "import matplotlib.pyplot as plt\n", + "import math as mt\n", + "\n", + "z = numpy.arange(-5, 5, .1)\n", + "sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))\n", + "sigma = sigma_fn(z)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, sigma)\n", + "ax.set_ylim([-0.1, 1.1])\n", + "ax.set_xlim([-5,5])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('sigmoid function')\n", + "\n", + "plt.show()\n", + "\n", + "\"\"\"Step Function\"\"\"\n", + "z = numpy.arange(-5, 5, .02)\n", + "step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)\n", + "step = step_fn(z)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, step)\n", + "ax.set_ylim([-0.5, 1.5])\n", + "ax.set_xlim([-5,5])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('step function')\n", + "\n", + "plt.show()\n", + "\n", + "\"\"\"Sine Function\"\"\"\n", + "z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)\n", + "t = numpy.sin(z)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, t)\n", + "ax.set_ylim([-1.0, 1.0])\n", + "ax.set_xlim([-2*mt.pi,2*mt.pi])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('sine function')\n", + "\n", + "plt.show()\n", + "\n", + "\"\"\"Plots a graph of the squashing function used by a rectified linear\n", + "unit\"\"\"\n", + "z = numpy.arange(-2, 2, .1)\n", + "zero = numpy.zeros(len(z))\n", + "y = numpy.max([zero, z], axis=0)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "ax.plot(z, y)\n", + "ax.set_ylim([-2.0, 2.0])\n", + "ax.set_xlim([-2.0, 2.0])\n", + "ax.grid(True)\n", + "ax.set_xlabel('z')\n", + "ax.set_title('Rectified linear unit')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "95f54888", + "metadata": { + "editable": true + }, + "source": [ + "## The multilayer perceptron (MLP)\n", + "\n", + "The multilayer perceptron is a very popular, and easy to implement approach, to deep learning. It consists of\n", + "1. A neural network with one or more layers of nodes between the input and the output nodes.\n", + "\n", + "2. The multilayer network structure, or architecture, or topology, consists of an input layer, one or more hidden layers, and one output layer.\n", + "\n", + "3. The input nodes pass values to the first hidden layer, its nodes pass the information on to the second and so on till we reach the output layer.\n", + "\n", + "As a convention it is normal to call a network with one layer of input units, one layer of hidden\n", + "units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc.\n", + "\n", + "For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units.\n", + "Hereafter we will call the various entities of a layer for nodes.\n", + "There are also no connections within a single layer.\n", + "\n", + "The number of input nodes does not need to equal the number of output\n", + "nodes. This applies also to the hidden layers. Each layer may have its\n", + "own number of nodes and activation functions.\n", + "\n", + "The hidden layers have their name from the fact that they are not\n", + "linked to observables and as we will see below when we define the\n", + "so-called activation $\\hat{z}$, we can think of this as a basis\n", + "expansion of the original inputs $\\hat{x}$. The difference however\n", + "between neural networks and say linear regression is that now these\n", + "basis functions (which will correspond to the weights in the network)\n", + "are learned from data. This results in an important difference between\n", + "neural networks and deep learning approaches on one side and methods\n", + "like logistic regression or linear regression and their modifications on the other side." + ] + }, + { + "cell_type": "markdown", + "id": "91bf2419", + "metadata": { + "editable": true + }, + "source": [ + "## From one to many layers, the universal approximation theorem\n", + "\n", + "A neural network with only one layer, what we called the simple\n", + "perceptron, is best suited if we have a standard binary model with\n", + "clear (linear) boundaries between the outcomes. As such it could\n", + "equally well be replaced by standard linear regression or logistic\n", + "regression. Networks with one or more hidden layers approximate\n", + "systems with more complex boundaries.\n", + "\n", + "As stated earlier, \n", + "an important theorem in studies of neural networks, restated without\n", + "proof here, is the [universal approximation\n", + "theorem](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.441.7873&rep=rep1&type=pdf).\n", + "\n", + "It states that a feed-forward network with a single hidden layer\n", + "containing a finite number of neurons can approximate continuous\n", + "functions on compact subsets of real functions. The theorem thus\n", + "states that simple neural networks can represent a wide variety of\n", + "interesting functions when given appropriate parameters. It is the\n", + "multilayer feedforward architecture itself which gives neural networks\n", + "the potential of being universal approximators." + ] + }, + { + "cell_type": "markdown", + "id": "6500ed58", + "metadata": { + "editable": true + }, + "source": [ + "## Deriving the back propagation code for a multilayer perceptron model\n", + "\n", + "As we have seen now in a feed forward network, we can express the final output of our network in terms of basic matrix-vector multiplications.\n", + "The unknowwn quantities are our weights $w_{ij}$ and we need to find an algorithm for changing them so that our errors are as small as possible.\n", + "This leads us to the famous [back propagation algorithm](https://www.nature.com/articles/323533a0).\n", + "\n", + "The questions we want to ask are how do changes in the biases and the\n", + "weights in our network change the cost function and how can we use the\n", + "final output to modify the weights?\n", + "\n", + "To derive these equations let us start with a plain regression problem\n", + "and define our cost function as" + ] + }, + { + "cell_type": "markdown", + "id": "703f7235", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "{\\cal C}(\\hat{W}) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - t_i\\right)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "667ef874", + "metadata": { + "editable": true + }, + "source": [ + "where the $t_i$s are our $n$ targets (the values we want to\n", + "reproduce), while the outputs of the network after having propagated\n", + "all inputs $\\hat{x}$ are given by $y_i$. Below we will demonstrate\n", + "how the basic equations arising from the back propagation algorithm\n", + "can be modified in order to study classification problems with $K$\n", + "classes." + ] + }, + { + "cell_type": "markdown", + "id": "dd53c6c8", + "metadata": { + "editable": true + }, + "source": [ + "## Definitions\n", + "\n", + "With our definition of the targets $\\hat{t}$, the outputs of the\n", + "network $\\hat{y}$ and the inputs $\\hat{x}$ we\n", + "define now the activation $z_j^l$ of node/neuron/unit $j$ of the\n", + "$l$-th layer as a function of the bias, the weights which add up from\n", + "the previous layer $l-1$ and the forward passes/outputs\n", + "$\\hat{a}^{l-1}$ from the previous layer as" + ] + }, + { + "cell_type": "markdown", + "id": "4f58ed9b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_j^l = \\sum_{i=1}^{M_{l-1}}w_{ij}^la_i^{l-1}+b_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c60762cd", + "metadata": { + "editable": true + }, + "source": [ + "where $b_k^l$ are the biases from layer $l$. Here $M_{l-1}$\n", + "represents the total number of nodes/neurons/units of layer $l-1$. The\n", + "figure here illustrates this equation. We can rewrite this in a more\n", + "compact form as the matrix-vector products we discussed earlier," + ] + }, + { + "cell_type": "markdown", + "id": "5c1c5162", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\hat{z}^l = \\left(\\hat{W}^l\\right)^T\\hat{a}^{l-1}+\\hat{b}^l.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "080b6f9a", + "metadata": { + "editable": true + }, + "source": [ + "With the activation values $\\hat{z}^l$ we can in turn define the\n", + "output of layer $l$ as $\\hat{a}^l = f(\\hat{z}^l)$ where $f$ is our\n", + "activation function. In the examples here we will use the sigmoid\n", + "function discussed in our logistic regression lectures. We will also use the same activation function $f$ for all layers\n", + "and their nodes. It means we have" + ] + }, + { + "cell_type": "markdown", + "id": "12e261bb", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a_j^l = f(z_j^l) = \\frac{1}{1+\\exp{-(z_j^l)}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "49a48c09", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives and the chain rule\n", + "\n", + "From the definition of the activation $z_j^l$ we have" + ] + }, + { + "cell_type": "markdown", + "id": "6dc08f48", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z_j^l}{\\partial w_{ij}^l} = a_i^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b8211d41", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "96822eda", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z_j^l}{\\partial a_i^{l-1}} = w_{ji}^l.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f0b1660f", + "metadata": { + "editable": true + }, + "source": [ + "With our definition of the activation function we have that (note that this function depends only on $z_j^l$)" + ] + }, + { + "cell_type": "markdown", + "id": "df85f033", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a_j^l}{\\partial z_j^{l}} = a_j^l(1-a_j^l)=f(z_j^l)(1-f(z_j^l)).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ea90d738", + "metadata": { + "editable": true + }, + "source": [ + "## Derivative of the cost function\n", + "\n", + "With these definitions we can now compute the derivative of the cost function in terms of the weights.\n", + "\n", + "Let us specialize to the output layer $l=L$. Our cost function is" + ] + }, + { + "cell_type": "markdown", + "id": "fafb43b4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "{\\cal C}(\\hat{W^L}) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - t_i\\right)^2=\\frac{1}{2}\\sum_{i=1}^n\\left(a_i^L - t_i\\right)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "41afcc45", + "metadata": { + "editable": true + }, + "source": [ + "The derivative of this function with respect to the weights is" + ] + }, + { + "cell_type": "markdown", + "id": "aed16939", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\left(a_j^L - t_j\\right)\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4ece624c", + "metadata": { + "editable": true + }, + "source": [ + "The last partial derivative can easily be computed and reads (by applying the chain rule)" + ] + }, + { + "cell_type": "markdown", + "id": "7fbf4fe4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}} = \\frac{\\partial a_j^L}{\\partial z_{j}^{L}}\\frac{\\partial z_j^L}{\\partial w_{jk}^{L}}=a_j^L(1-a_j^L)a_k^{L-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "dba0e4a4", + "metadata": { + "editable": true + }, + "source": [ + "## Bringing it together, first back propagation equation\n", + "\n", + "We have thus" + ] + }, + { + "cell_type": "markdown", + "id": "c32147af", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\left(a_j^L - t_j\\right)a_j^L(1-a_j^L)a_k^{L-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4b6176c8", + "metadata": { + "editable": true + }, + "source": [ + "Defining" + ] + }, + { + "cell_type": "markdown", + "id": "b87747a4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = a_j^L(1-a_j^L)\\left(a_j^L - t_j\\right) = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1547289e", + "metadata": { + "editable": true + }, + "source": [ + "and using the Hadamard product of two vectors we can write this as" + ] + }, + { + "cell_type": "markdown", + "id": "ef9854e4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\hat{\\delta}^L = f'(\\hat{z}^L)\\circ\\frac{\\partial {\\cal C}}{\\partial (\\hat{a}^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c9ce87bb", + "metadata": { + "editable": true + }, + "source": [ + "This is an important expression. The second term on the right handside\n", + "measures how fast the cost function is changing as a function of the $j$th\n", + "output activation. If, for example, the cost function doesn't depend\n", + "much on a particular output node $j$, then $\\delta_j^L$ will be small,\n", + "which is what we would expect. The first term on the right, measures\n", + "how fast the activation function $f$ is changing at a given activation\n", + "value $z_j^L$.\n", + "\n", + "Notice that everything in the above equations is easily computed. In\n", + "particular, we compute $z_j^L$ while computing the behaviour of the\n", + "network, and it is only a small additional overhead to compute\n", + "$f'(z^L_j)$. The exact form of the derivative with respect to the\n", + "output depends on the form of the cost function.\n", + "However, provided the cost function is known there should be little\n", + "trouble in calculating" + ] + }, + { + "cell_type": "markdown", + "id": "5b74b869", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "42b1eab9", + "metadata": { + "editable": true + }, + "source": [ + "With the definition of $\\delta_j^L$ we have a more compact definition of the derivative of the cost function in terms of the weights, namely" + ] + }, + { + "cell_type": "markdown", + "id": "27331743", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8f1b672f", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives in terms of $z_j^L$\n", + "\n", + "It is also easy to see that our previous equation can be written as" + ] + }, + { + "cell_type": "markdown", + "id": "543a0ba2", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L =\\frac{\\partial {\\cal C}}{\\partial z_j^L}= \\frac{\\partial {\\cal C}}{\\partial a_j^L}\\frac{\\partial a_j^L}{\\partial z_j^L},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "628ee133", + "metadata": { + "editable": true + }, + "source": [ + "which can also be interpreted as the partial derivative of the cost function with respect to the biases $b_j^L$, namely" + ] + }, + { + "cell_type": "markdown", + "id": "94f361e5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L}\\frac{\\partial b_j^L}{\\partial z_j^L}=\\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "13e5c5d5", + "metadata": { + "editable": true + }, + "source": [ + "That is, the error $\\delta_j^L$ is exactly equal to the rate of change of the cost function as a function of the bias." + ] + }, + { + "cell_type": "markdown", + "id": "4887a3d7", + "metadata": { + "editable": true + }, + "source": [ + "## Bringing it together\n", + "\n", + "We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are\n", + "\n", + "**The starting equations.**" + ] + }, + { + "cell_type": "markdown", + "id": "8f4d75dd", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1},\n", + "\\label{_auto8} \\tag{13}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "69864347", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "e654f179", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", + "\\label{_auto9} \\tag{14}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f650a917", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "b8169c55", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", + "\\label{_auto10} \\tag{15}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5567d66c", + "metadata": { + "editable": true + }, + "source": [ + "An interesting consequence of the above equations is that when the\n", + "activation $a_k^{L-1}$ is small, the gradient term, that is the\n", + "derivative of the cost function with respect to the weights, will also\n", + "tend to be small. We say then that the weight learns slowly, meaning\n", + "that it changes slowly when we minimize the weights via say gradient\n", + "descent. In this case we say the system learns slowly.\n", + "\n", + "Another interesting feature is that is when the activation function,\n", + "represented by the sigmoid function here, is rather flat when we move towards\n", + "its end values $0$ and $1$ (see the above Python codes). In these\n", + "cases, the derivatives of the activation function will also be close\n", + "to zero, meaning again that the gradients will be small and the\n", + "network learns slowly again.\n", + "\n", + "We need a fourth equation and we are set. We are going to propagate\n", + "backwards in order to the determine the weights and biases. In order\n", + "to do so we need to represent the error in the layer before the final\n", + "one $L-1$ in terms of the errors in the final output layer." + ] + }, + { + "cell_type": "markdown", + "id": "f5c09470", + "metadata": { + "editable": true + }, + "source": [ + "## Final back propagating equation\n", + "\n", + "We have that (replacing $L$ with a general layer $l$)" + ] + }, + { + "cell_type": "markdown", + "id": "d66ef5ca", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\frac{\\partial {\\cal C}}{\\partial z_j^l}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e96004a2", + "metadata": { + "editable": true + }, + "source": [ + "We want to express this in terms of the equations for layer $l+1$. Using the chain rule and summing over all $k$ entries we have" + ] + }, + { + "cell_type": "markdown", + "id": "0ee94485", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\sum_k \\frac{\\partial {\\cal C}}{\\partial z_k^{l+1}}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}}=\\sum_k \\delta_k^{l+1}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1c2ac190", + "metadata": { + "editable": true + }, + "source": [ + "and recalling that" + ] + }, + { + "cell_type": "markdown", + "id": "f89f9c76", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_j^{l+1} = \\sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f8293787", + "metadata": { + "editable": true + }, + "source": [ + "with $M_l$ being the number of nodes in layer $l$, we obtain" + ] + }, + { + "cell_type": "markdown", + "id": "a2914db3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "297a2622", + "metadata": { + "editable": true + }, + "source": [ + "This is our final equation.\n", + "\n", + "We are now ready to set up the algorithm for back propagation and learning the weights and biases." + ] + }, + { + "cell_type": "markdown", + "id": "c952f57b", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm\n", + "\n", + "The four equations provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "First, we set up the input data $\\hat{x}$ and the activations\n", + "$\\hat{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\hat{a}^1$.\n", + "\n", + "Secondly, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\hat{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\hat{a}^l$ for\n", + "$l=2,3,\\dots,L$.\n", + "\n", + "Thereafter we compute the ouput error $\\hat{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "37d4f242", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ff2e732a", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,2$ as" + ] + }, + { + "cell_type": "markdown", + "id": "97a96714", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3ee8ad1b", + "metadata": { + "editable": true + }, + "source": [ + "Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,2$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "c4d2d1a1", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d412dae3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "64129a91", + "metadata": { + "editable": true + }, + "source": [ + "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training." + ] + }, + { + "cell_type": "markdown", + "id": "681d8bd9", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm\n", + "\n", + "The four equations above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "First, we set up the input data $\\boldsymbol{x}$ and the activations\n", + "$\\boldsymbol{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\boldsymbol{a}^1$.\n", + "\n", + "Secondly, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\boldsymbol{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\boldsymbol{a}^l$ for\n", + "$l=2,3,\\dots,L$.\n", + "\n", + "Thereafter we compute the ouput error $\\boldsymbol{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "62904d70", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bb5b2dde", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,2$ as" + ] + }, + { + "cell_type": "markdown", + "id": "51828c66", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c4124232", + "metadata": { + "editable": true + }, + "source": [ + "Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,2$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "80791bf2", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "107737c9", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "720ad834", + "metadata": { + "editable": true + }, + "source": [ + "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training." + ] + }, + { + "cell_type": "markdown", + "id": "6854da89", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm\n", + "\n", + "The four equations derived discussed above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "First, we set up the input data $\\boldsymbol{x}$ and the activations\n", + "$\\boldsymbol{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\boldsymbol{a}^1$.\n", + "\n", + "Secondly, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\boldsymbol{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\boldsymbol{a}^l$ for\n", + "$l=2,3,\\dots,L$.\n", + "\n", + "Thereafter we compute the ouput error $\\boldsymbol{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "b5c0c6c7", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = f'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "43403932", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,2$ as" + ] + }, + { + "cell_type": "markdown", + "id": "08f3064e", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f5d698a4", + "metadata": { + "editable": true + }, + "source": [ + "Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,2$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "3ae56fb5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b822ca59", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e0593696", + "metadata": { + "editable": true + }, + "source": [ + "The parameter $\\eta$ is the learning parameter discussed in connection with the gradient descent methods.\n", + "Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training." + ] + }, + { + "cell_type": "markdown", + "id": "c77a2a17", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up a Multi-layer perceptron model for classification\n", + "\n", + "We are now gong to develop an example based on the MNIST data\n", + "base. This is a classification problem and we need to use our\n", + "cross-entropy function we discussed in connection with logistic\n", + "regression. The cross-entropy defines our cost function for the\n", + "classificaton problems with neural networks.\n", + "\n", + "In binary classification with two classes $(0, 1)$ we define the\n", + "logistic/sigmoid function as the probability that a particular input\n", + "is in class $0$ or $1$. This is possible because the logistic\n", + "function takes any input from the real numbers and inputs a number\n", + "between 0 and 1, and can therefore be interpreted as a probability. It\n", + "also has other nice properties, such as a derivative that is simple to\n", + "calculate.\n", + "\n", + "For an input $\\boldsymbol{a}$ from the hidden layer, the probability that the input $\\boldsymbol{x}$\n", + "is in class 0 or 1 is just. We let $\\theta$ represent the unknown weights and biases to be adjusted by our equations). The variable $x$\n", + "represents our activation values $z$. We have" + ] + }, + { + "cell_type": "markdown", + "id": "093f5d87", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(y = 0 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) = \\frac{1}{1 + \\exp{(- \\boldsymbol{x}})} ,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7bd03f69", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "fe5226a0", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(y = 1 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) = 1 - P(y = 0 \\mid \\boldsymbol{x}, \\boldsymbol{\\theta}) ,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "45f1532a", + "metadata": { + "editable": true + }, + "source": [ + "where $y \\in \\{0, 1\\}$ and $\\boldsymbol{\\theta}$ represents the weights and biases\n", + "of our network." + ] + }, + { + "cell_type": "markdown", + "id": "1b07418e", + "metadata": { + "editable": true + }, + "source": [ + "## Defining the cost function\n", + "\n", + "Our cost function is given as (see the Logistic regression lectures)" + ] + }, + { + "cell_type": "markdown", + "id": "c7f5232f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{\\theta}) = - \\ln P(\\mathcal{D} \\mid \\boldsymbol{\\theta}) = - \\sum_{i=1}^n\n", + "y_i \\ln[P(y_i = 0)] + (1 - y_i) \\ln [1 - P(y_i = 0)] = \\sum_{i=1}^n \\mathcal{L}_i(\\boldsymbol{\\theta}) .\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e1af7b47", + "metadata": { + "editable": true + }, + "source": [ + "This last equality means that we can interpret our *cost* function as a sum over the *loss* function\n", + "for each point in the dataset $\\mathcal{L}_i(\\boldsymbol{\\theta})$. \n", + "The negative sign is just so that we can think about our algorithm as minimizing a positive number, rather\n", + "than maximizing a negative number. \n", + "\n", + "In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: \n", + "\n", + "$y = 5 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$ and\n", + "\n", + "$y = 1 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$ \n", + "\n", + "i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset (numbers from $0$ to $9$).. \n", + "\n", + "If $\\boldsymbol{x}_i$ is the $i$-th input (image), $y_{ic}$ refers to the $c$-th component of the $i$-th\n", + "output vector $\\boldsymbol{y}_i$. \n", + "The probability of $\\boldsymbol{x}_i$ being in class $c$ will be given by the softmax function:" + ] + }, + { + "cell_type": "markdown", + "id": "db469d35", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(y_{ic} = 1 \\mid \\boldsymbol{x}_i, \\boldsymbol{\\theta}) = \\frac{\\exp{((\\boldsymbol{a}_i^{hidden})^T \\boldsymbol{w}_c)}}\n", + "{\\sum_{c'=0}^{C-1} \\exp{((\\boldsymbol{a}_i^{hidden})^T \\boldsymbol{w}_{c'})}} ,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "deb48962", + "metadata": { + "editable": true + }, + "source": [ + "which reduces to the logistic function in the binary case. \n", + "The likelihood of this $C$-class classifier\n", + "is now given as:" + ] + }, + { + "cell_type": "markdown", + "id": "36443e39", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "P(\\mathcal{D} \\mid \\boldsymbol{\\theta}) = \\prod_{i=1}^n \\prod_{c=0}^{C-1} [P(y_{ic} = 1)]^{y_{ic}} .\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8076d9fa", + "metadata": { + "editable": true + }, + "source": [ + "Again we take the negative log-likelihood to define our cost function:" + ] + }, + { + "cell_type": "markdown", + "id": "292dad0a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{\\theta}) = - \\log{P(\\mathcal{D} \\mid \\boldsymbol{\\theta})}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7803b746", + "metadata": { + "editable": true + }, + "source": [ + "See the logistic regression lectures for a full definition of the cost function.\n", + "\n", + "The back propagation equations need now only a small change, namely the definition of a new cost function. We are thus ready to use the same equations as before!" + ] + }, + { + "cell_type": "markdown", + "id": "a71f1366", + "metadata": { + "editable": true + }, + "source": [ + "## Example: binary classification problem\n", + "\n", + "As an example of the above, relevant for project 2 as well, let us consider a binary class. As discussed in our logistic regression lectures, we defined a cost function in terms of the parameters $\\beta$ as" + ] + }, + { + "cell_type": "markdown", + "id": "25efb288", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{\\beta}) = - \\sum_{i=1}^n \\left(y_i\\log{p(y_i \\vert x_i,\\boldsymbol{\\beta})}+(1-y_i)\\log{1-p(y_i \\vert x_i,\\boldsymbol{\\beta})}\\right),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6192694f", + "metadata": { + "editable": true + }, + "source": [ + "where we had defined the logistic (sigmoid) function" + ] + }, + { + "cell_type": "markdown", + "id": "f6786106", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "p(y_i =1\\vert x_i,\\boldsymbol{\\beta})=\\frac{\\exp{(\\beta_0+\\beta_1 x_i)}}{1+\\exp{(\\beta_0+\\beta_1 x_i)}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "be663cac", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "a6953973", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "p(y_i =0\\vert x_i,\\boldsymbol{\\beta})=1-p(y_i =1\\vert x_i,\\boldsymbol{\\beta}).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "de08816b", + "metadata": { + "editable": true + }, + "source": [ + "The parameters $\\boldsymbol{\\beta}$ were defined using a minimization method like gradient descent or Newton-Raphson's method. \n", + "\n", + "Now we replace $x_i$ with the activation $z_i^l$ for a given layer $l$ and the outputs as $y_i=a_i^l=f(z_i^l)$, with $z_i^l$ now being a function of the weights $w_{ij}^l$ and biases $b_i^l$. \n", + "We have then" + ] + }, + { + "cell_type": "markdown", + "id": "d9b14b33", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a_i^l = y_i = \\frac{\\exp{(z_i^l)}}{1+\\exp{(z_i^l)}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8072c452", + "metadata": { + "editable": true + }, + "source": [ + "with" + ] + }, + { + "cell_type": "markdown", + "id": "34a5cb25", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_i^l = \\sum_{j}w_{ij}^l a_j^{l-1}+b_i^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "833dc972", + "metadata": { + "editable": true + }, + "source": [ + "where the superscript $l-1$ indicates that these are the outputs from layer $l-1$.\n", + "Our cost function at the final layer $l=L$ is now" + ] + }, + { + "cell_type": "markdown", + "id": "3c52b850", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathcal{C}(\\boldsymbol{W}) = - \\sum_{i=1}^n \\left(t_i\\log{a_i^L}+(1-t_i)\\log{(1-a_i^L)}\\right),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "01c24d99", + "metadata": { + "editable": true + }, + "source": [ + "where we have defined the targets $t_i$. The derivatives of the cost function with respect to the output $a_i^L$ are then easily calculated and we get" + ] + }, + { + "cell_type": "markdown", + "id": "692fbd5a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial \\mathcal{C}(\\boldsymbol{W})}{\\partial a_i^L} = \\frac{a_i^L-t_i}{a_i^L(1-a_i^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "cdd8c203", + "metadata": { + "editable": true + }, + "source": [ + "In case we use another activation function than the logistic one, we need to evaluate other derivatives." + ] + }, + { + "cell_type": "markdown", + "id": "1e7eba9c", + "metadata": { + "editable": true + }, + "source": [ + "## The Softmax function\n", + "In case we employ the more general case given by the Softmax equation, we need to evaluate the derivative of the activation function with respect to the activation $z_i^l$, that is we need" + ] + }, + { + "cell_type": "markdown", + "id": "8ca62ded", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f(z_i^l)}{\\partial w_{jk}^l} =\n", + "\\frac{\\partial f(z_i^l)}{\\partial z_j^l} \\frac{\\partial z_j^l}{\\partial w_{jk}^l}= \\frac{\\partial f(z_i^l)}{\\partial z_j^l}a_k^{l-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "479d6d33", + "metadata": { + "editable": true + }, + "source": [ + "For the Softmax function we have" + ] + }, + { + "cell_type": "markdown", + "id": "3a63ba14", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(z_i^l) = \\frac{\\exp{(z_i^l)}}{\\sum_{m=1}^K\\exp{(z_m^l)}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bed10528", + "metadata": { + "editable": true + }, + "source": [ + "Its derivative with respect to $z_j^l$ gives" + ] + }, + { + "cell_type": "markdown", + "id": "6a77ac39", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f(z_i^l)}{\\partial z_j^l}= f(z_i^l)\\left(\\delta_{ij}-f(z_j^l)\\right),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7fd16de8", + "metadata": { + "editable": true + }, + "source": [ + "which in case of the simply binary model reduces to having $i=j$." + ] + }, + { + "cell_type": "markdown", + "id": "a598757e", + "metadata": { + "editable": true + }, + "source": [ + "## Developing a code for doing neural networks with back propagation\n", + "\n", + "One can identify a set of key steps when using neural networks to solve supervised learning problems: \n", + "\n", + "1. Collect and pre-process data \n", + "\n", + "2. Define model and architecture \n", + "\n", + "3. Choose cost function and optimizer \n", + "\n", + "4. Train the model \n", + "\n", + "5. Evaluate model performance on test data \n", + "\n", + "6. Adjust hyperparameters (if necessary, network architecture)" + ] + }, + { + "cell_type": "markdown", + "id": "0dc69031", + "metadata": { + "editable": true + }, + "source": [ + "## Collect and pre-process data\n", + "\n", + "Here we will be using the MNIST dataset, which is readily available through the **scikit-learn**\n", + "package. You may also find it for example [here](http://yann.lecun.com/exdb/mnist/). \n", + "The *MNIST* (Modified National Institute of Standards and Technology) database is a large database\n", + "of handwritten digits that is commonly used for training various image processing systems. \n", + "The MNIST dataset consists of 70 000 images of size $28\\times 28$ pixels, each labeled from 0 to 9. \n", + "The scikit-learn dataset we will use consists of a selection of 1797 images of size $8\\times 8$ collected and processed from this database. \n", + "\n", + "To feed data into a feed-forward neural network we need to represent\n", + "the inputs as a design/feature matrix $X = (n_{inputs}, n_{features})$. Each\n", + "row represents an *input*, in this case a handwritten digit, and\n", + "each column represents a *feature*, in this case a pixel. The\n", + "correct answers, also known as *labels* or *targets* are\n", + "represented as a 1D array of integers \n", + "$Y = (n_{inputs}) = (5, 3, 1, 8,...)$.\n", + "\n", + "As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from\n", + "measurements of height (in m) \n", + "and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example: \n", + "\n", + "$$ X = \\begin{bmatrix}\n", + "1.85 & 81\\\\\n", + "1.71 & 65\\\\\n", + "1.95 & 103\\\\\n", + "1.55 & 42\\\\\n", + "1.63 & 56\n", + "\\end{bmatrix} ,$$ \n", + "\n", + "and the targets would be: \n", + "\n", + "$$ Y = (23.7, 22.2, 27.1, 17.5, 21.1) $$ \n", + "\n", + "Since each input image is a 2D matrix, we need to flatten the image\n", + "(i.e. \"unravel\" the 2D matrix into a 1D array) to turn the data into a\n", + "design/feature matrix. This means we lose all spatial information in the\n", + "image, such as locality and translational invariance. More complicated\n", + "architectures such as Convolutional Neural Networks can take advantage\n", + "of such information, and are most commonly applied when analyzing\n", + "images." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d7c49d9c", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "inputs = (n_inputs, pixel_width, pixel_height) = (1797, 8, 8)\n", + "labels = (n_inputs) = (1797,)\n", + "X = (n_inputs, n_features) = (1797, 64)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAADICAYAAADcOn20AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAQx0lEQVR4nO3dbWydZRkH8OuMjklYaEHMxla3ji46/KBdiItodB2oEUVXDNMYois6QgLCkKkhEGwHGDCaWIxODY510SUuJmSdZr4AdjUmxPBWEhaNjlBEzSYOOl+SbQwfPxhqN9Y68G7rdc7vl/QDZz3/c5+T6z7P899zOKtVVVUFAAAAJDVrphcAAAAA/wvFFgAAgNQUWwAAAFJTbAEAAEhNsQUAACA1xRYAAIDUFFsAAABSU2wBAABITbEFAAAgtYYptv39/VGr1eLhhx8ukler1eLTn/50kazxmb29va/6/nv37o2Pf/zjsWjRojjttNOivb09brjhhjhw4EC5RZJSvc9/b29v1Gq1CX++//3vF10r+dgD9kAjq/f5f+aZZ+LSSy+Nc889N04//fRobm6O5cuXx9e//vU4evRo0XWSj/lvHE0zvQDKePbZZ+Ntb3tbnHHGGXHbbbfFokWL4rHHHouenp4YHByMRx55JGbNapi/x6DBrFu3Lt73vve97PYrr7wynnzyyRP+GdQTe4BG9o9//CPOOOOMuOWWW2LRokVx5MiR2LVrV1x77bUxPDwc3/nOd2Z6iTBlzP9/KLZ1YmBgIA4cOBDbt2+Piy66KCIiVq1aFYcPH46bbropHn/88Vi+fPkMrxKmRmtra7S2th5z28jISOzZsycuv/zyaGlpmZmFwTSxB2hky5Yti61btx5z28UXXxx//vOfY+vWrfGNb3wj5syZM0Org6ll/v/DJbxxDh06FBs2bIiOjo5obm6Os846Ky644IIYGBiY8D7f/va34w1veEPMmTMn3vSmN53w41779u2Lq666KlpbW+PUU0+NJUuWxMaNG4t+PGD27NkREdHc3HzM7S+dzLzmNa8p9ljUp8zzfyL33HNPVFUV69atm9LHoX7YAzSyepv/iIjXve51MWvWrDjllFOm/LHIzfzXB1dsxzl8+HA899xz8dnPfjYWLlwYR44cifvvvz8+/OEPx5YtW+ITn/jEMb+/c+fOGBwcjFtvvTVOP/302LRpU3zsYx+LpqamuOyyyyLi3wO9YsWKmDVrVnzhC1+I9vb2ePDBB+P222+PkZGR2LJly6Rramtri4h//837ZLq6umLRokWxYcOG2LRpUyxevDgeffTRuPPOO+ODH/xgnHfeea/6daExZJ7/4/3zn/+M/v7+WLp0aaxcufIV3ZfGZQ/QyOph/quqihdffDH+9re/xc9+9rPo7++PDRs2RFOT010mZ/7rRNUgtmzZUkVE9dBDD530fY4ePVq98MIL1ac+9alq+fLlx/xZRFSnnXZatW/fvmN+f9myZdXSpUvHbrvqqququXPnVk8//fQx9//KV75SRUS1Z8+eYzJ7enqO+b329vaqvb39pNb7pz/9qbrggguqiBj7WbNmTXXo0KGTfcrUqUaY//F+/OMfVxFR3XHHHa/4vtQne4BG1ijzf8cdd4yd/9Rqtermm28+6ftSv8x/4/BR5OP84Ac/iHe84x0xd+7caGpqitmzZ8fmzZvj17/+9ct+96KLLop58+aN/fcpp5wSH/3oR2Pv3r3xhz/8ISIifvSjH8WqVatiwYIFcfTo0bGfiy++OCIihoaGJl3P3r17Y+/evf913c8//3ysXr06/vrXv8a2bdviF7/4RWzatCl++ctfxoc+9KGG+1Y0Xp2s83+8zZs3R1NTU3R3d7/i+9LY7AEaWfb57+7ujoceeih++tOfxuc///n48pe/HNdee+1J35/GZv7za6Br0//dvffeGx/5yEdizZo18bnPfS7mz58fTU1N8c1vfjPuueeel/3+/PnzJ7ztwIED0draGvv3748f/vCHY/8P7PH+8pe/FFn7l770pRgeHo6nn346zjnnnIiIeOc73xnLli2LCy+8MLZt2xZr164t8ljUp8zzf3zmzp074wMf+MAJ1wgTsQdoZPUw//Pnzx9bw3vf+94488wz48Ybb4xPfvKTvkCTSZn/+qDYjvO9730vlixZEtu3b49arTZ2++HDh0/4+/v27Zvwtte+9rUREXH22WfHm9/85vjiF794wowFCxb8r8uOiIjh4eFYuHDhWKl9yVvf+taIiHjiiSeKPA71K/P8j/fd7343jhw54gtzeMXsARpZvcz/eCtWrIiIiN/+9rcNc2LPq2P+64NiO06tVotTTz31mIHet2/fhN+I9sADD8T+/fvHPorw4osvxvbt26O9vX3sn1245JJLYteuXdHe3h5nnnnmlK19wYIF8cADD8Qf//jHWLhw4djtDz74YETEy/4ZCDhe5vkfb/PmzbFgwYKxj/rAybIHaGT1Mv/jDQ4ORkTE0qVLp/2xycX814eGK7Y///nPT/jtYu9///vjkksuiXvvvTeuvvrquOyyy+KZZ56J2267Lc4555z43e9+97L7nH322XHhhRfGLbfcMvaNaL/5zW+O+brvW2+9Ne677754+9vfHtddd1288Y1vjEOHDsXIyEjs2rUrvvWtb01aOl8axv/2Gftrrrkmtm3bFu95z3vixhtvjNe//vXxxBNPxO233x7z5s2Lyy+//CRfIepZvc7/S371q1/Fnj174qabbmqor7fn5NkDNLJ6nf+enp7Yv39/vOtd74qFCxfG6Oho/OQnP4m777471qxZE+eff/5JvkLUM/PfAGb626umy0vfiDbRz1NPPVVVVVXdeeedVVtbWzVnzpzqvPPOq+6+++6qp6enOv6liojqmmuuqTZt2lS1t7dXs2fPrpYtW1Zt27btZY/97LPPVtddd121ZMmSavbs2dVZZ51VnX/++dXNN99c/f3vfz8m8/hvRFu8eHG1ePHik3qOjz76aHXppZdWra2t1Zw5c6pzzz23WrduXfX73//+Fb1W1J9GmP+qqqorr7yyqtVq1ZNPPnnS96Ex2AM0snqf/507d1bvfve7q3nz5lVNTU3V3LlzqxUrVlRf+9rXqhdeeOEVv17UF/PfOGpVVVWlyzIAAABMF//cDwAAAKkptgAAAKSm2AIAAJCaYgsAAEBqii0AAACpKbYAAACkptgCAACQWtNML6CU/v7+onm9vb1F81paWormRUT09fUVzevs7Cyax/TZvXt30bzS+2nHjh1F8yIiDh48WDRvcHCwaJ79NL0GBgaK5q1fv75o3lQove/b2tqK5jGxkZGRonmlzwdKHwNKv19HRDQ3NxfNGx4eLppnP01udHS0aN7/+x4o/XwjzOyJuGILAABAaootAAAAqSm2AAAApKbYAgAAkJpiCwAAQGqKLQAAAKkptgAAAKSm2AIAAJCaYgsAAEBqii0AAACpKbYAAACkptgCAACQmmILAABAaootAAAAqSm2AAAApKbYAgAAkJpiCwAAQGqKLQAAAKk1zdQD7969u2jeFVdcUTRv9erVRfNaWlqK5kVEdHV1Fc0bHR0tmsf0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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "filenames": { + "image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/week41_176_1.png" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# display images in notebook\n", + "%matplotlib inline\n", + "plt.rcParams['figure.figsize'] = (12,12)\n", + "\n", + "\n", + "# download MNIST dataset\n", + "digits = datasets.load_digits()\n", + "\n", + "# define inputs and labels\n", + "inputs = digits.images\n", + "labels = digits.target\n", + "\n", + "print(\"inputs = (n_inputs, pixel_width, pixel_height) = \" + str(inputs.shape))\n", + "print(\"labels = (n_inputs) = \" + str(labels.shape))\n", + "\n", + "\n", + "# flatten the image\n", + "# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64\n", + "n_inputs = len(inputs)\n", + "inputs = inputs.reshape(n_inputs, -1)\n", + "print(\"X = (n_inputs, n_features) = \" + str(inputs.shape))\n", + "\n", + "\n", + "# choose some random images to display\n", + "indices = np.arange(n_inputs)\n", + "random_indices = np.random.choice(indices, size=5)\n", + "\n", + "for i, image in enumerate(digits.images[random_indices]):\n", + " plt.subplot(1, 5, i+1)\n", + " plt.axis('off')\n", + " plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')\n", + " plt.title(\"Label: %d\" % digits.target[random_indices[i]])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "672723bb", + "metadata": { + "editable": true + }, + "source": [ + "## Train and test datasets\n", + "\n", + "Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions. \n", + "\n", + "We will reserve $80 \\%$ of our dataset for training and $20 \\%$ for testing. \n", + "\n", + "It is important that the train and test datasets are drawn randomly from our dataset, to ensure\n", + "no bias in the sampling. \n", + "Say you are taking measurements of weather data to predict the weather in the coming 5 days.\n", + "You don't want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data\n", + "collected from 12.00 to 24.00." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3b0db869", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of training images: 1437\n", + "Number of test images: 360\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", + "# one-liner from scikit-learn library\n", + "train_size = 0.8\n", + "test_size = 1 - train_size\n", + "X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size,\n", + " test_size=test_size)\n", + "\n", + "# equivalently in numpy\n", + "def train_test_split_numpy(inputs, labels, train_size, test_size):\n", + " n_inputs = len(inputs)\n", + " inputs_shuffled = inputs.copy()\n", + " labels_shuffled = labels.copy()\n", + " \n", + " np.random.shuffle(inputs_shuffled)\n", + " np.random.shuffle(labels_shuffled)\n", + " \n", + " train_end = int(n_inputs*train_size)\n", + " X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:]\n", + " Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:]\n", + " \n", + " return X_train, X_test, Y_train, Y_test\n", + "\n", + "#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size)\n", + "\n", + "print(\"Number of training images: \" + str(len(X_train)))\n", + "print(\"Number of test images: \" + str(len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "id": "a52c7acf", + "metadata": { + "editable": true + }, + "source": [ + "## Define model and architecture\n", + "\n", + "Our simple feed-forward neural network will consist of an *input* layer, a single *hidden* layer and an *output* layer. The activation $y$ of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have \n", + "\n", + "$$ z = \\sum_{i=1}^n w_i a_i ,$$\n", + "\n", + "$$ y = f(z) ,$$\n", + "\n", + "where $f$ is the activation function, $a_i$ represents input from neuron $i$ in the preceding layer\n", + "and $w_i$ is the weight to input $i$. \n", + "The activation of the neurons in the input layer is just the features (e.g. a pixel value). \n", + "\n", + "The simplest activation function for a neuron is the *Heaviside* function:\n", + "\n", + "$$ f(z) = \n", + "\\begin{cases}\n", + "1, & z > 0\\\\\n", + "0, & \\text{otherwise}\n", + "\\end{cases}\n", + "$$\n", + "\n", + "A feed-forward neural network with this activation is known as a *perceptron*. \n", + "For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer. \n", + "This activation can be generalized to $k$ classes (using e.g. the *one-against-all* strategy), \n", + "and we call these architectures *multiclass perceptrons*. \n", + "\n", + "However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and \n", + "Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function. \n", + "\n", + "Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU). \n", + "We will be using the sigmoid function $\\sigma(x)$: \n", + "\n", + "$$ f(x) = \\sigma(x) = \\frac{1}{1 + e^{-x}} ,$$\n", + "\n", + "which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "f1ef08f4", + "metadata": { + "editable": true + }, + "source": [ + "## Layers\n", + "\n", + "* Input \n", + "\n", + "Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons. \n", + "\n", + "* Hidden layer\n", + "\n", + "We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer. \n", + "Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer. \n", + "\n", + "* Output\n", + "\n", + "If we were building a binary classifier, it would be sufficient with a single neuron in the output layer,\n", + "which could output 0 or 1 according to the Heaviside function. This would be an example of a *hard* classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a *soft* classifier, which outputs the probability of being in class 0 or 1. \n", + "\n", + "For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class. \n", + "\n", + "Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons $j = 0,1,...,9$. The activation of each output neuron $j$ will be according to the *softmax* function: \n", + "\n", + "$$ P(\\text{class $j$} \\mid \\text{input $\\boldsymbol{a}$}) = \\frac{\\exp{(\\boldsymbol{a}^T \\boldsymbol{w}_j)}}\n", + "{\\sum_{c=0}^{9} \\exp{(\\boldsymbol{a}^T \\boldsymbol{w}_c)}} ,$$ \n", + "\n", + "i.e. each neuron $j$ outputs the probability of being in class $j$ given an input from the hidden layer $\\boldsymbol{a}$, with $\\boldsymbol{w}_j$ the weights of neuron $j$ to the inputs. \n", + "The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. \n", + "The exponent is just the weighted sum of inputs as before: \n", + "\n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i+b_j.$$ \n", + "\n", + "Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500\n", + "weights to the output layer." + ] + }, + { + "cell_type": "markdown", + "id": "867b3b89", + "metadata": { + "editable": true + }, + "source": [ + "## Weights and biases\n", + "\n", + "Typically weights are initialized with small values distributed around zero, drawn from a uniform\n", + "or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless. \n", + "\n", + "Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range\n", + "of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: \n", + "\n", + "$$ z_j = \\sum_{i=1}^n w_ {ij} a_i + b_j.$$ \n", + "\n", + "The bias weights $\\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8ec462da", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# building our neural network\n", + "\n", + "n_inputs, n_features = X_train.shape\n", + "n_hidden_neurons = 50\n", + "n_categories = 10\n", + "\n", + "# we make the weights normally distributed using numpy.random.randn\n", + "\n", + "# weights and bias in the hidden layer\n", + "hidden_weights = np.random.randn(n_features, n_hidden_neurons)\n", + "hidden_bias = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "output_weights = np.random.randn(n_hidden_neurons, n_categories)\n", + "output_bias = np.zeros(n_categories) + 0.01" + ] + }, + { + "cell_type": "markdown", + "id": "cf228009", + "metadata": { + "editable": true + }, + "source": [ + "## Feed-forward pass\n", + "\n", + "Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. \n", + "For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: \n", + "\n", + "$$ z_{j}^{l} = \\sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$\n", + "\n", + "this is then passed through our activation function \n", + "\n", + "$$ a_{j}^{l} = f(z_{j}^{l}) .$$ \n", + "\n", + "We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: \n", + "\n", + "$$ z_{j}^{L} = \\sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ \n", + "\n", + "Finally we calculate the output of neuron $j$ in the output layer using the softmax function: \n", + "\n", + "$$ a_{j}^{L} = \\frac{\\exp{(z_j^{L})}}\n", + "{\\sum_{c=0}^{C-1} \\exp{(z_c^{L})}} .$$" + ] + }, + { + "cell_type": "markdown", + "id": "c57ea8b9", + "metadata": { + "editable": true + }, + "source": [ + "## Matrix multiplications\n", + "\n", + "Since our data has the dimensions $X = (n_{inputs}, n_{features})$ and our weights to the hidden\n", + "layer have the dimensions \n", + "$W_{hidden} = (n_{features}, n_{hidden})$,\n", + "we can easily feed the network all our training data in one go by taking the matrix product \n", + "\n", + "$$ X W^{h} = (n_{inputs}, n_{hidden}),$$ \n", + "\n", + "and obtain a matrix that holds the weighted sum of inputs to the hidden layer\n", + "for each input image and each hidden neuron. \n", + "We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: \n", + "\n", + "$$ \\boldsymbol{z}^{l} = \\boldsymbol{X} \\boldsymbol{W}^{l} + \\boldsymbol{b}^{l} ,$$\n", + "\n", + "meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. \n", + "This is then passed through the activation: \n", + "\n", + "$$ \\boldsymbol{a}^{l} = f(\\boldsymbol{z}^l) .$$ \n", + "\n", + "This is fed to the output layer: \n", + "\n", + "$$ \\boldsymbol{z}^{L} = \\boldsymbol{a}^{L} \\boldsymbol{W}^{L} + \\boldsymbol{b}^{L} .$$\n", + "\n", + "Finally we receive our output values for each image and each category by passing it through the softmax function: \n", + "\n", + "$$ output = softmax (\\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .$$" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9c286c15", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "probabilities = (n_inputs, n_categories) = (1437, 10)\n", + "probability that image 0 is in category 0,1,2,...,9 = \n", + "[5.41511965e-04 2.17174962e-03 8.84355903e-03 1.44970586e-03\n", + " 1.10378326e-04 5.08318298e-09 2.03256632e-04 1.92507116e-03\n", + " 9.84443254e-01 3.11507992e-04]\n", + "probabilities sum up to: 1.0\n", + "\n", + "predictions = (n_inputs) = (1437,)\n", + "prediction for image 0: 8\n", + "correct label for image 0: 6\n" + ] + } + ], + "source": [ + "# setup the feed-forward pass, subscript h = hidden layer\n", + "\n", + "def sigmoid(x):\n", + " return 1/(1 + np.exp(-x))\n", + "\n", + "def feed_forward(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " \n", + " return probabilities\n", + "\n", + "probabilities = feed_forward(X_train)\n", + "print(\"probabilities = (n_inputs, n_categories) = \" + str(probabilities.shape))\n", + "print(\"probability that image 0 is in category 0,1,2,...,9 = \\n\" + str(probabilities[0]))\n", + "print(\"probabilities sum up to: \" + str(probabilities[0].sum()))\n", + "print()\n", + "\n", + "# we obtain a prediction by taking the class with the highest likelihood\n", + "def predict(X):\n", + " probabilities = feed_forward(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + "predictions = predict(X_train)\n", + "print(\"predictions = (n_inputs) = \" + str(predictions.shape))\n", + "print(\"prediction for image 0: \" + str(predictions[0]))\n", + "print(\"correct label for image 0: \" + str(Y_train[0]))" + ] + }, + { + "cell_type": "markdown", + "id": "a6cf75c3", + "metadata": { + "editable": true + }, + "source": [ + "## Choose cost function and optimizer\n", + "\n", + "To measure how well our neural network is doing we need to introduce a cost function. \n", + "We will call the function that gives the error of a single sample output the *loss* function, and the function\n", + "that gives the total error of our network across all samples the *cost* function.\n", + "A typical choice for multiclass classification is the *cross-entropy* loss, also known as the negative log likelihood. \n", + "\n", + "In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: \n", + "\n", + "$$ y = 5 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$$ \n", + "\n", + "$$ y = 1 \\quad \\rightarrow \\quad \\boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$$ \n", + "\n", + "i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset. \n", + "\n", + "Let $y_{ic}$ denote the $c$-th component of the $i$-th one-hot vector. \n", + "We define the cost function $\\mathcal{C}$ as a sum over the cross-entropy loss for each point $\\boldsymbol{x}_i$ in the dataset.\n", + "\n", + "In the one-hot representation only one of the terms in the loss function is non-zero, namely the\n", + "probability of the correct category $c'$ \n", + "(i.e. the category $c'$ such that $y_{ic'} = 1$). This means that the cross entropy loss only punishes you for how wrong\n", + "you got the correct label. The probability of category $c$ is given by the softmax function. The vector $\\boldsymbol{\\theta}$ represents the parameters of our network, i.e. all the weights and biases." + ] + }, + { + "cell_type": "markdown", + "id": "e69ffdc8", + "metadata": { + "editable": true + }, + "source": [ + "## Optimizing the cost function\n", + "\n", + "The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is *gradient descent* and its generalizations. The idea behind gradient descent\n", + "is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a *local* minimum of the cost function. \n", + "Each parameter $\\theta$ is iteratively adjusted according to the rule \n", + "\n", + "$$ \\theta_{i+1} = \\theta_i - \\eta \\nabla \\mathcal{C}(\\theta_i) ,$$\n", + "\n", + "where $\\eta$ is known as the *learning rate*, which controls how big a step we take towards the minimum. \n", + "This update can be repeated for any number of iterations, or until we are satisfied with the result. \n", + "\n", + "A simple and effective improvement is a variant called *Batch Gradient Descent*. \n", + "Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient\n", + "on a subset of the data called a *minibatch*. \n", + "If there are $N$ data points and we have a minibatch size of $M$, the total number of batches\n", + "is $N/M$. \n", + "We denote each minibatch $B_k$, with $k = 1, 2,...,N/M$. The gradient then becomes: \n", + "\n", + "$$ \\nabla \\mathcal{C}(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\nabla \\mathcal{L}_i(\\theta) \\quad \\rightarrow \\quad\n", + "\\frac{1}{M} \\sum_{i \\in B_k} \\nabla \\mathcal{L}_i(\\theta) ,$$\n", + "\n", + "i.e. instead of averaging the loss over the entire dataset, we average over a minibatch. \n", + "\n", + "This has two important benefits: \n", + "1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima. \n", + "\n", + "2. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient. \n", + "\n", + "The various optmization methods, with codes and algorithms, are discussed in our lectures on [Gradient descent approaches](https://compphysics.github.io/MachineLearning/doc/pub/Splines/html/Splines-bs.html)." + ] + }, + { + "cell_type": "markdown", + "id": "ef19d1e0", + "metadata": { + "editable": true + }, + "source": [ + "## Regularization\n", + "\n", + "It is common to add an extra term to the cost function, proportional\n", + "to the size of the weights. This is equivalent to constraining the\n", + "size of the weights, so that they do not grow out of control.\n", + "Constraining the size of the weights means that the weights cannot\n", + "grow arbitrarily large to fit the training data, and in this way\n", + "reduces *overfitting*.\n", + "\n", + "We will measure the size of the weights using the so called *L2-norm*, meaning our cost function becomes: \n", + "\n", + "$$ \\mathcal{C}(\\theta) = \\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}_i(\\theta) \\quad \\rightarrow \\quad\n", + "\\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}_i(\\theta) + \\lambda \\lvert \\lvert \\boldsymbol{w} \\rvert \\rvert_2^2 \n", + "= \\frac{1}{N} \\sum_{i=1}^N \\mathcal{L}(\\theta) + \\lambda \\sum_{ij} w_{ij}^2,$$ \n", + "\n", + "i.e. we sum up all the weights squared. The factor $\\lambda$ is known as a regularization parameter.\n", + "\n", + "In order to train the model, we need to calculate the derivative of\n", + "the cost function with respect to every bias and weight in the\n", + "network. In total our network has $(64 + 1)\\times 50=3250$ weights in\n", + "the hidden layer and $(50 + 1)\\times 10=510$ weights to the output\n", + "layer ($+1$ for the bias), and the gradient must be calculated for\n", + "every parameter. We use the *backpropagation* algorithm discussed\n", + "above. This is a clever use of the chain rule that allows us to\n", + "calculate the gradient efficently." + ] + }, + { + "cell_type": "markdown", + "id": "d93c5dfb", + "metadata": { + "editable": true + }, + "source": [ + "## Matrix multiplication\n", + "\n", + "To more efficently train our network these equations are implemented using matrix operations. \n", + "The error in the output layer is calculated simply as, with $\\boldsymbol{t}$ being our targets, \n", + "\n", + "$$ \\delta_L = \\boldsymbol{t} - \\boldsymbol{y} = (n_{inputs}, n_{categories}) .$$ \n", + "\n", + "The gradient for the output weights is calculated as \n", + "\n", + "$$ \\nabla W_{L} = \\boldsymbol{a}^T \\delta_L = (n_{hidden}, n_{categories}) ,$$\n", + "\n", + "where $\\boldsymbol{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. \n", + "Since we are going backwards we have to transpose the activation matrix. \n", + "\n", + "The gradient with respect to the output bias is then \n", + "\n", + "$$ \\nabla \\boldsymbol{b}_{L} = \\sum_{i=1}^{n_{inputs}} \\delta_L = (n_{categories}) .$$ \n", + "\n", + "The error in the hidden layer is \n", + "\n", + "$$ \\Delta_h = \\delta_L W_{L}^T \\circ f'(z_{h}) = \\delta_L W_{L}^T \\circ a_{h} \\circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ \n", + "\n", + "where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean\n", + "that we are summing up the products for each neuron in the output layer. The symbol $\\circ$ denotes\n", + "the *Hadamard product*, meaning element-wise multiplication. \n", + "\n", + "This again gives us the gradients in the hidden layer: \n", + "\n", + "$$ \\nabla W_{h} = X^T \\delta_h = (n_{features}, n_{hidden}) ,$$ \n", + "\n", + "$$ \\nabla b_{h} = \\sum_{i=1}^{n_{inputs}} \\delta_h = (n_{hidden}) .$$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0a62b82a", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Old accuracy on training data: 0.1440501043841336\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "New accuracy on training data: 0.09951287404314545\n" + ] + } + ], + "source": [ + "# to categorical turns our integer vector into a onehot representation\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "# one-hot in numpy\n", + "def to_categorical_numpy(integer_vector):\n", + " n_inputs = len(integer_vector)\n", + " n_categories = np.max(integer_vector) + 1\n", + " onehot_vector = np.zeros((n_inputs, n_categories))\n", + " onehot_vector[range(n_inputs), integer_vector] = 1\n", + " \n", + " return onehot_vector\n", + "\n", + "#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test)\n", + "Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test)\n", + "\n", + "def feed_forward_train(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " \n", + " # for backpropagation need activations in hidden and output layers\n", + " return a_h, probabilities\n", + "\n", + "def backpropagation(X, Y):\n", + " a_h, probabilities = feed_forward_train(X)\n", + " \n", + " # error in the output layer\n", + " error_output = probabilities - Y\n", + " # error in the hidden layer\n", + " error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h)\n", + " \n", + " # gradients for the output layer\n", + " output_weights_gradient = np.matmul(a_h.T, error_output)\n", + " output_bias_gradient = np.sum(error_output, axis=0)\n", + " \n", + " # gradient for the hidden layer\n", + " hidden_weights_gradient = np.matmul(X.T, error_hidden)\n", + " hidden_bias_gradient = np.sum(error_hidden, axis=0)\n", + "\n", + " return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient\n", + "\n", + "print(\"Old accuracy on training data: \" + str(accuracy_score(predict(X_train), Y_train)))\n", + "\n", + "eta = 0.01\n", + "lmbd = 0.01\n", + "for i in range(1000):\n", + " # calculate gradients\n", + " dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot)\n", + " \n", + " # regularization term gradients\n", + " dWo += lmbd * output_weights\n", + " dWh += lmbd * hidden_weights\n", + " \n", + " # update weights and biases\n", + " output_weights -= eta * dWo\n", + " output_bias -= eta * dBo\n", + " hidden_weights -= eta * dWh\n", + " hidden_bias -= eta * dBh\n", + "\n", + "print(\"New accuracy on training data: \" + str(accuracy_score(predict(X_train), Y_train)))" + ] + }, + { + "cell_type": "markdown", + "id": "b666f091", + "metadata": { + "editable": true + }, + "source": [ + "## Improving performance\n", + "\n", + "As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image. \n", + "In order to obtain a network that does something useful, we will have to do a bit more work. \n", + "\n", + "The choice of *hyperparameters* such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a *grid-search* is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates $\\eta = 10^{-6}, 10^{-5},...,10^{-1}$ with different regularization parameters $\\lambda = 10^{-6},...,10^{-0}$. \n", + "\n", + "Next, we haven't implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an *iteration*, and a full training period\n", + "going through the entire dataset ($n/M$ batches) an *epoch*.\n", + "\n", + "If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers. \n", + "Andrew Ng goes through some of these considerations in this [video](https://youtu.be/F1ka6a13S9I). You can find a summary of the video [here](https://kevinzakka.github.io/2016/09/26/applying-deep-learning/)." + ] + }, + { + "cell_type": "markdown", + "id": "79055893", + "metadata": { + "editable": true + }, + "source": [ + "## Full object-oriented implementation\n", + "\n", + "It is very natural to think of the network as an object, with specific instances of the network\n", + "being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "85af4a1c", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "class NeuralNetwork:\n", + " def __init__(\n", + " self,\n", + " X_data,\n", + " Y_data,\n", + " n_hidden_neurons=50,\n", + " n_categories=10,\n", + " epochs=10,\n", + " batch_size=100,\n", + " eta=0.1,\n", + " lmbd=0.0):\n", + "\n", + " self.X_data_full = X_data\n", + " self.Y_data_full = Y_data\n", + "\n", + " self.n_inputs = X_data.shape[0]\n", + " self.n_features = X_data.shape[1]\n", + " self.n_hidden_neurons = n_hidden_neurons\n", + " self.n_categories = n_categories\n", + "\n", + " self.epochs = epochs\n", + " self.batch_size = batch_size\n", + " self.iterations = self.n_inputs // self.batch_size\n", + " self.eta = eta\n", + " self.lmbd = lmbd\n", + "\n", + " self.create_biases_and_weights()\n", + "\n", + " def create_biases_and_weights(self):\n", + " self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons)\n", + " self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01\n", + "\n", + " self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories)\n", + " self.output_bias = np.zeros(self.n_categories) + 0.01\n", + "\n", + " def feed_forward(self):\n", + " # feed-forward for training\n", + " self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias\n", + " self.a_h = sigmoid(self.z_h)\n", + "\n", + " self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias\n", + "\n", + " exp_term = np.exp(self.z_o)\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + "\n", + " def feed_forward_out(self, X):\n", + " # feed-forward for output\n", + " z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias\n", + " a_h = sigmoid(z_h)\n", + "\n", + " z_o = np.matmul(a_h, self.output_weights) + self.output_bias\n", + " \n", + " exp_term = np.exp(z_o)\n", + " probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n", + " return probabilities\n", + "\n", + " def backpropagation(self):\n", + " error_output = self.probabilities - self.Y_data\n", + " error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h)\n", + "\n", + " self.output_weights_gradient = np.matmul(self.a_h.T, error_output)\n", + " self.output_bias_gradient = np.sum(error_output, axis=0)\n", + "\n", + " self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden)\n", + " self.hidden_bias_gradient = np.sum(error_hidden, axis=0)\n", + "\n", + " if self.lmbd > 0.0:\n", + " self.output_weights_gradient += self.lmbd * self.output_weights\n", + " self.hidden_weights_gradient += self.lmbd * self.hidden_weights\n", + "\n", + " self.output_weights -= self.eta * self.output_weights_gradient\n", + " self.output_bias -= self.eta * self.output_bias_gradient\n", + " self.hidden_weights -= self.eta * self.hidden_weights_gradient\n", + " self.hidden_bias -= self.eta * self.hidden_bias_gradient\n", + "\n", + " def predict(self, X):\n", + " probabilities = self.feed_forward_out(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + " def predict_probabilities(self, X):\n", + " probabilities = self.feed_forward_out(X)\n", + " return probabilities\n", + "\n", + " def train(self):\n", + " data_indices = np.arange(self.n_inputs)\n", + "\n", + " for i in range(self.epochs):\n", + " for j in range(self.iterations):\n", + " # pick datapoints with replacement\n", + " chosen_datapoints = np.random.choice(\n", + " data_indices, size=self.batch_size, replace=False\n", + " )\n", + "\n", + " # minibatch training data\n", + " self.X_data = self.X_data_full[chosen_datapoints]\n", + " self.Y_data = self.Y_data_full[chosen_datapoints]\n", + "\n", + " self.feed_forward()\n", + " self.backpropagation()" + ] + }, + { + "cell_type": "markdown", + "id": "d0ef37e8", + "metadata": { + "editable": true + }, + "source": [ + "## Evaluate model performance on test data\n", + "\n", + "To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data. \n", + "We measure the performance of the network using the *accuracy* score. \n", + "The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of $1$. \n", + "\n", + "$$ \\text{Accuracy} = \\frac{\\sum_{i=1}^n I(\\tilde{y}_i = y_i)}{n} ,$$ \n", + "\n", + "where $I$ is the indicator function, $1$ if $\\tilde{y}_i = y_i$ and $0$ otherwise." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d2891643", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy score on test set: 0.9444444444444444\n" + ] + } + ], + "source": [ + "epochs = 100\n", + "batch_size = 100\n", + "\n", + "dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + "dnn.train()\n", + "test_predict = dnn.predict(X_test)\n", + "\n", + "# accuracy score from scikit library\n", + "print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + "\n", + "# equivalent in numpy\n", + "def accuracy_score_numpy(Y_test, Y_pred):\n", + " return np.sum(Y_test == Y_pred) / len(Y_test)\n", + "\n", + "#print(\"Accuracy score on test set: \", accuracy_score_numpy(Y_test, test_predict))" + ] + }, + { + "cell_type": "markdown", + "id": "5c91c8fc", + "metadata": { + "editable": true + }, + "source": [ + "## Adjust hyperparameters\n", + "\n", + "We now perform a grid search to find the optimal hyperparameters for the network. \n", + "Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\\%$ ($2\\%$ error rate)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c245d23d", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.11666666666666667\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.20833333333333334\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.12222222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.14722222222222223\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.17777777777777778\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.16111111111111112\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1e-05\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.20277777777777778\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.5305555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.5944444444444444\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.5888888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.6111111111111112\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.5222222222222223\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.5555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.0001\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.8055555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.85\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.85\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.875\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.8666666666666667\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.8638888888888889\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.9555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.001\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.925\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.9472222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.9277777777777778\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.9472222222222222\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.9305555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.9555555555555556\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.7694444444444445\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.01\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.19166666666666668\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.08611111111111111\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.08888888888888889\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.08611111111111111\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.08888888888888889\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 0.1\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.09166666666666666\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 0.1\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 1.0\n", + "Accuracy score on test set: 0.10555555555555556\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 1.0\n", + "Lambda = 10.0\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 1e-05\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.0001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.001\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate = 10.0\n", + "Lambda = 0.01\n", + "Accuracy score on test set: 0.07777777777777778\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/953065564.py:4: RuntimeWarning: overflow encountered in exp\n", + " return 1/(1 + np.exp(-x))\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:43: RuntimeWarning: overflow encountered in exp\n", + " exp_term = np.exp(self.z_o)\n", + "/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_12588/1630775253.py:44: RuntimeWarning: invalid value encountered in true_divide\n", + " self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True)\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m j, lmbd \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(lmbd_vals):\n\u001b[1;32m 9\u001b[0m dnn \u001b[38;5;241m=\u001b[39m NeuralNetwork(X_train, Y_train_onehot, eta\u001b[38;5;241m=\u001b[39meta, lmbd\u001b[38;5;241m=\u001b[39mlmbd, epochs\u001b[38;5;241m=\u001b[39mepochs, batch_size\u001b[38;5;241m=\u001b[39mbatch_size,\n\u001b[1;32m 10\u001b[0m n_hidden_neurons\u001b[38;5;241m=\u001b[39mn_hidden_neurons, n_categories\u001b[38;5;241m=\u001b[39mn_categories)\n\u001b[0;32m---> 11\u001b[0m \u001b[43mdnn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m DNN_numpy[i][j] \u001b[38;5;241m=\u001b[39m dnn\n\u001b[1;32m 15\u001b[0m test_predict \u001b[38;5;241m=\u001b[39m dnn\u001b[38;5;241m.\u001b[39mpredict(X_test)\n", + "Cell \u001b[0;32mIn[10], line 99\u001b[0m, in \u001b[0;36mNeuralNetwork.train\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mY_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mY_data_full[chosen_datapoints]\n\u001b[1;32m 98\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfeed_forward()\n\u001b[0;32m---> 99\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackpropagation\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[0;32mIn[10], line 64\u001b[0m, in \u001b[0;36mNeuralNetwork.backpropagation\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moutput_weights_gradient \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mmatmul(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39ma_h\u001b[38;5;241m.\u001b[39mT, error_output)\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moutput_bias_gradient \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39msum(error_output, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n\u001b[0;32m---> 64\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhidden_weights_gradient \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmatmul\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mX_data\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mT\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merror_hidden\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 65\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhidden_bias_gradient \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39msum(error_hidden, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 67\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlmbd \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0.0\u001b[39m:\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store the models for later use\n", + "DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "# grid search\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size,\n", + " n_hidden_neurons=n_hidden_neurons, n_categories=n_categories)\n", + " dnn.train()\n", + " \n", + " DNN_numpy[i][j] = dnn\n", + " \n", + " test_predict = dnn.predict(X_test)\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", accuracy_score(Y_test, test_predict))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "ea3be61a", + "metadata": { + "editable": true + }, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d26e1748", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# visual representation of grid search\n", + "# uses seaborn heatmap, you can also do this with matplotlib imshow\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_numpy[i][j]\n", + " \n", + " train_pred = dnn.predict(X_train) \n", + " test_pred = dnn.predict(X_test)\n", + "\n", + " train_accuracy[i][j] = accuracy_score(Y_train, train_pred)\n", + " test_accuracy[i][j] = accuracy_score(Y_test, test_pred)\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "572f3f4b", + "metadata": { + "editable": true + }, + "source": [ + "## scikit-learn implementation\n", + "\n", + "**scikit-learn** focuses more\n", + "on traditional machine learning methods, such as regression,\n", + "clustering, decision trees, etc. As such, it has only two types of\n", + "neural networks: Multi Layer Perceptron outputting continuous values,\n", + "*MPLRegressor*, and Multi Layer Perceptron outputting labels,\n", + "*MLPClassifier*. We will see how simple it is to use these classes.\n", + "\n", + "**scikit-learn** implements a few improvements from our neural network,\n", + "such as early stopping, a varying learning rate, different\n", + "optimization methods, etc. We would therefore expect a better\n", + "performance overall." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "fdb38053", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "from sklearn.neural_network import MLPClassifier\n", + "# store models for later use\n", + "DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X_train, Y_train)\n", + " \n", + " DNN_scikit[i][j] = dnn\n", + " \n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on test set: \", dnn.score(X_test, Y_test))\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "id": "5fc3dd13", + "metadata": { + "editable": true + }, + "source": [ + "## Visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cd9e4505", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# optional\n", + "# visual representation of grid search\n", + "# uses seaborn heatmap, could probably do this in matplotlib\n", + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "\n", + "train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_scikit[i][j]\n", + " \n", + " train_pred = dnn.predict(X_train) \n", + " test_pred = dnn.predict(X_test)\n", + "\n", + " train_accuracy[i][j] = accuracy_score(Y_train, train_pred)\n", + " test_accuracy[i][j] = accuracy_score(Y_test, test_pred)\n", + "\n", + " \n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(train_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Training Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "30d61094", + "metadata": { + "editable": true + }, + "source": [ + "## Testing our code for the XOR, OR and AND gates\n", + "\n", + "Last week we discussed three different types of gates, the so-called\n", + "XOR, the OR and the AND gates. Their inputs and outputs can be\n", + "summarized using the following tables, first for the OR gate with\n", + "inputs $x_1$ and $x_2$ and outputs $y$:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 1
" + ] + }, + { + "cell_type": "markdown", + "id": "9b4cd63f", + "metadata": { + "editable": true + }, + "source": [ + "## The AND and XOR Gates\n", + "\n", + "The AND gate is defined as\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
$x_1$ $x_2$ $y$
0 0 0
0 1 0
1 0 0
1 1 1
\n", + "\n", + "And finally we have the XOR gate\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 0
" + ] + }, + { + "cell_type": "markdown", + "id": "1a2bd6f1", + "metadata": { + "editable": true + }, + "source": [ + "## Representing the Data Sets\n", + "\n", + "Our design matrix is defined by the input values $x_1$ and $x_2$. Since we have four possible outputs, our design matrix reads" + ] + }, + { + "cell_type": "markdown", + "id": "a569e669", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{X}=\\begin{bmatrix} 0 & 0 \\\\\n", + " 0 & 1 \\\\\n", + "\t\t 1 & 0 \\\\\n", + "\t\t 1 & 1 \\end{bmatrix},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "51363b82", + "metadata": { + "editable": true + }, + "source": [ + "while the vector of outputs is $\\boldsymbol{y}^T=[0,1,1,0]$ for the XOR gate, $\\boldsymbol{y}^T=[0,0,0,1]$ for the AND gate and $\\boldsymbol{y}^T=[0,1,1,1]$ for the OR gate." + ] + }, + { + "cell_type": "markdown", + "id": "e4172d21", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Neural Network\n", + "\n", + "We define first our design matrix and the various output vectors for the different gates." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b8640651", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Simple code that tests XOR, OR and AND gates with linear regression\n", + "\"\"\"\n", + "\n", + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets\n", + "\n", + "def sigmoid(x):\n", + " return 1/(1 + np.exp(-x))\n", + "\n", + "def feed_forward(X):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_h = np.matmul(X, hidden_weights) + hidden_bias\n", + " # activation in the hidden layer\n", + " a_h = sigmoid(z_h)\n", + " \n", + " # weighted sum of inputs to the output layer\n", + " z_o = np.matmul(a_h, output_weights) + output_bias\n", + " # softmax output\n", + " # axis 0 holds each input and axis 1 the probabilities of each category\n", + " probabilities = sigmoid(z_o)\n", + " return probabilities\n", + "\n", + "# we obtain a prediction by taking the class with the highest likelihood\n", + "def predict(X):\n", + " probabilities = feed_forward(X)\n", + " return np.argmax(probabilities, axis=1)\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# Design matrix\n", + "X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)\n", + "\n", + "# The XOR gate\n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "# The OR gate\n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "# The AND gate\n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "\n", + "# Defining the neural network\n", + "n_inputs, n_features = X.shape\n", + "n_hidden_neurons = 2\n", + "n_categories = 2\n", + "n_features = 2\n", + "\n", + "# we make the weights normally distributed using numpy.random.randn\n", + "\n", + "# weights and bias in the hidden layer\n", + "hidden_weights = np.random.randn(n_features, n_hidden_neurons)\n", + "hidden_bias = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "output_weights = np.random.randn(n_hidden_neurons, n_categories)\n", + "output_bias = np.zeros(n_categories) + 0.01\n", + "\n", + "probabilities = feed_forward(X)\n", + "print(probabilities)\n", + "\n", + "\n", + "predictions = predict(X)\n", + "print(predictions)" + ] + }, + { + "cell_type": "markdown", + "id": "f6b2c036", + "metadata": { + "editable": true + }, + "source": [ + "Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above." + ] + }, + { + "cell_type": "markdown", + "id": "49fdf701", + "metadata": { + "editable": true + }, + "source": [ + "## The Code using Scikit-Learn" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "45dae979", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "# import necessary packages\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.neural_network import MLPClassifier\n", + "from sklearn.metrics import accuracy_score\n", + "import seaborn as sns\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "\n", + "# Design matrix\n", + "X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64)\n", + "\n", + "# The XOR gate\n", + "yXOR = np.array( [ 0, 1 ,1, 0])\n", + "# The OR gate\n", + "yOR = np.array( [ 0, 1 ,1, 1])\n", + "# The AND gate\n", + "yAND = np.array( [ 0, 0 ,0, 1])\n", + "\n", + "# Defining the neural network\n", + "n_inputs, n_features = X.shape\n", + "n_hidden_neurons = 2\n", + "n_categories = 2\n", + "n_features = 2\n", + "\n", + "eta_vals = np.logspace(-5, 1, 7)\n", + "lmbd_vals = np.logspace(-5, 1, 7)\n", + "# store models for later use\n", + "DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", + "epochs = 100\n", + "\n", + "for i, eta in enumerate(eta_vals):\n", + " for j, lmbd in enumerate(lmbd_vals):\n", + " dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic',\n", + " alpha=lmbd, learning_rate_init=eta, max_iter=epochs)\n", + " dnn.fit(X, yXOR)\n", + " DNN_scikit[i][j] = dnn\n", + " print(\"Learning rate = \", eta)\n", + " print(\"Lambda = \", lmbd)\n", + " print(\"Accuracy score on data set: \", dnn.score(X, yXOR))\n", + " print()\n", + "\n", + "sns.set()\n", + "test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals)))\n", + "for i in range(len(eta_vals)):\n", + " for j in range(len(lmbd_vals)):\n", + " dnn = DNN_scikit[i][j]\n", + " test_pred = dnn.predict(X)\n", + " test_accuracy[i][j] = accuracy_score(yXOR, test_pred)\n", + "\n", + "fig, ax = plt.subplots(figsize = (10, 10))\n", + "sns.heatmap(test_accuracy, annot=True, ax=ax, cmap=\"viridis\")\n", + "ax.set_title(\"Test Accuracy\")\n", + "ax.set_ylabel(\"$\\eta$\")\n", + "ax.set_xlabel(\"$\\lambda$\")\n", + "plt.show()" + ] + } + ], + "metadata": { + "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.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/doc/LectureNotes/_build/jupyter_execute/week41.py b/doc/LectureNotes/_build/jupyter_execute/week41.py new file mode 100644 index 000000000..d2edf7cf2 --- /dev/null +++ b/doc/LectureNotes/_build/jupyter_execute/week41.py @@ -0,0 +1,2271 @@ +#!/usr/bin/env python +# coding: utf-8 + +# +# + +# # Week 41 Neural networks and constructing a neural network code +# **Morten Hjorth-Jensen**, Department of Physics, University of Oslo +# +# Date: **Week 41** + +# ## Plan for week 41, October 7-11 + +# ## Material for the lecture on Monday October 7, 2024 +# 1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model. +# +# 2. Building our own Feed-forward Neural Network +# +# +# +# **Readings and Videos:** +# +# 1. These lecture notes +# +# 2. Rashcka et al chapter 11 +# +# 3. For neural networks we recommend Goodfellow et al chapter 6. +# +# a. Neural Networks demystified at +# +# 2. Building Neural Networks from scratch at +# +# 3. Video on Neural Networks at +# +# 4. Video on the back propagation algorithm at +# +# We also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at . + +# ## Material for the active learning sessions on Tuesday and Wednesday +# * Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation +# +# * One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code +# +# * Discussion of project 2 +# +# * Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent + +# ## Lecture Monday October 7 + +# ## Introduction to Neural networks +# +# Artificial neural networks are computational systems that can learn to +# perform tasks by considering examples, generally without being +# programmed with any task-specific rules. It is supposed to mimic a +# biological system, wherein neurons interact by sending signals in the +# form of mathematical functions between layers. All layers can contain +# an arbitrary number of neurons, and each connection is represented by +# a weight variable. + +# ## Artificial neurons +# +# The field of artificial neural networks has a long history of +# development, and is closely connected with the advancement of computer +# science and computers in general. A model of artificial neurons was +# first developed by McCulloch and Pitts in 1943 to study signal +# processing in the brain and has later been refined by others. The +# general idea is to mimic neural networks in the human brain, which is +# composed of billions of neurons that communicate with each other by +# sending electrical signals. Each neuron accumulates its incoming +# signals, which must exceed an activation threshold to yield an +# output. If the threshold is not overcome, the neuron remains inactive, +# i.e. has zero output. +# +# This behaviour has inspired a simple mathematical model for an artificial neuron. + +# +#
+# +# $$ +# \begin{equation} +# y = f\left(\sum_{i=1}^n w_ix_i\right) = f(u) +# \label{artificialNeuron} \tag{1} +# \end{equation} +# $$ + +# Here, the output $y$ of the neuron is the value of its activation function, which have as input +# a weighted sum of signals $x_i, \dots ,x_n$ received by $n$ other neurons. +# +# Conceptually, it is helpful to divide neural networks into four +# categories: +# 1. general purpose neural networks for supervised learning, +# +# 2. neural networks designed specifically for image processing, the most prominent example of this class being Convolutional Neural Networks (CNNs), +# +# 3. neural networks for sequential data such as Recurrent Neural Networks (RNNs), and +# +# 4. neural networks for unsupervised learning such as Deep Boltzmann Machines. +# +# In natural science, DNNs and CNNs have already found numerous +# applications. In statistical physics, they have been applied to detect +# phase transitions in 2D Ising and Potts models, lattice gauge +# theories, and different phases of polymers, or solving the +# Navier-Stokes equation in weather forecasting. Deep learning has also +# found interesting applications in quantum physics. Various quantum +# phase transitions can be detected and studied using DNNs and CNNs, +# topological phases, and even non-equilibrium many-body +# localization. Representing quantum states as DNNs quantum state +# tomography are among some of the impressive achievements to reveal the +# potential of DNNs to facilitate the study of quantum systems. +# +# In quantum information theory, it has been shown that one can perform +# gate decompositions with the help of neural. +# +# The applications are not limited to the natural sciences. There is a +# plethora of applications in essentially all disciplines, from the +# humanities to life science and medicine. + +# ## Neural network types +# +# An artificial neural network (ANN), is a computational model that +# consists of layers of connected neurons, or nodes or units. We will +# refer to these interchangeably as units or nodes, and sometimes as +# neurons. +# +# It is supposed to mimic a biological nervous system by letting each +# neuron interact with other neurons by sending signals in the form of +# mathematical functions between layers. A wide variety of different +# ANNs have been developed, but most of them consist of an input layer, +# an output layer and eventual layers in-between, called *hidden +# layers*. All layers can contain an arbitrary number of nodes, and each +# connection between two nodes is associated with a weight variable. +# +# Neural networks (also called neural nets) are neural-inspired +# nonlinear models for supervised learning. As we will see, neural nets +# can be viewed as natural, more powerful extensions of supervised +# learning methods such as linear and logistic regression and soft-max +# methods we discussed earlier. + +# ## Feed-forward neural networks +# +# The feed-forward neural network (FFNN) was the first and simplest type +# of ANNs that were devised. In this network, the information moves in +# only one direction: forward through the layers. +# +# Nodes are represented by circles, while the arrows display the +# connections between the nodes, including the direction of information +# flow. Additionally, each arrow corresponds to a weight variable +# (figure to come). We observe that each node in a layer is connected +# to *all* nodes in the subsequent layer, making this a so-called +# *fully-connected* FFNN. + +# ## Convolutional Neural Network +# +# A different variant of FFNNs are *convolutional neural networks* +# (CNNs), which have a connectivity pattern inspired by the animal +# visual cortex. Individual neurons in the visual cortex only respond to +# stimuli from small sub-regions of the visual field, called a receptive +# field. This makes the neurons well-suited to exploit the strong +# spatially local correlation present in natural images. The response of +# each neuron can be approximated mathematically as a convolution +# operation. (figure to come) +# +# Convolutional neural networks emulate the behaviour of neurons in the +# visual cortex by enforcing a *local* connectivity pattern between +# nodes of adjacent layers: Each node in a convolutional layer is +# connected only to a subset of the nodes in the previous layer, in +# contrast to the fully-connected FFNN. Often, CNNs consist of several +# convolutional layers that learn local features of the input, with a +# fully-connected layer at the end, which gathers all the local data and +# produces the outputs. They have wide applications in image and video +# recognition. + +# ## Recurrent neural networks +# +# So far we have only mentioned ANNs where information flows in one +# direction: forward. *Recurrent neural networks* on the other hand, +# have connections between nodes that form directed *cycles*. This +# creates a form of internal memory which are able to capture +# information on what has been calculated before; the output is +# dependent on the previous computations. Recurrent NNs make use of +# sequential information by performing the same task for every element +# in a sequence, where each element depends on previous elements. An +# example of such information is sentences, making recurrent NNs +# especially well-suited for handwriting and speech recognition. + +# ## Other types of networks +# +# There are many other kinds of ANNs that have been developed. One type +# that is specifically designed for interpolation in multidimensional +# space is the radial basis function (RBF) network. RBFs are typically +# made up of three layers: an input layer, a hidden layer with +# non-linear radial symmetric activation functions and a linear output +# layer (''linear'' here means that each node in the output layer has a +# linear activation function). The layers are normally fully-connected +# and there are no cycles, thus RBFs can be viewed as a type of +# fully-connected FFNN. They are however usually treated as a separate +# type of NN due the unusual activation functions. + +# ## Multilayer perceptrons +# +# One uses often so-called fully-connected feed-forward neural networks +# with three or more layers (an input layer, one or more hidden layers +# and an output layer) consisting of neurons that have non-linear +# activation functions. +# +# Such networks are often called *multilayer perceptrons* (MLPs). + +# ## Why multilayer perceptrons? +# +# According to the *Universal approximation theorem*, a feed-forward +# neural network with just a single hidden layer containing a finite +# number of neurons can approximate a continuous multidimensional +# function to arbitrary accuracy, assuming the activation function for +# the hidden layer is a **non-constant, bounded and +# monotonically-increasing continuous function**. +# +# Note that the requirements on the activation function only applies to +# the hidden layer, the output nodes are always assumed to be linear, so +# as to not restrict the range of output values. + +# ## Illustration of a single perceptron model and a multi-perceptron model +# +# +# +# +#

Figure 1: In a) we show a single perceptron model while in b) we dispay a network with two hidden layers, an input layer and an output layer.

+# + +# ## Examples of XOR, OR and AND gates +# +# Let us first try to fit various gates using standard linear +# regression. The gates we are thinking of are the classical XOR, OR and +# AND gates, well-known elements in computer science. The tables here +# show how we can set up the inputs $x_1$ and $x_2$ in order to yield a +# specific target $y_i$. + +# In[1]: + + +""" +Simple code that tests XOR, OR and AND gates with linear regression +""" + +import numpy as np +# Design matrix +X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64) +print(f"The X.TX matrix:{X.T @ X}") +Xinv = np.linalg.pinv(X.T @ X) +print(f"The invers of X.TX matrix:{Xinv}") + +# The XOR gate +yXOR = np.array( [ 0, 1 ,1, 0]) +ThetaXOR = Xinv @ X.T @ yXOR +print(f"The values of theta for the XOR gate:{ThetaXOR}") +print(f"The linear regression prediction for the XOR gate:{X @ ThetaXOR}") + + +# The OR gate +yOR = np.array( [ 0, 1 ,1, 1]) +ThetaOR = Xinv @ X.T @ yOR +print(f"The values of theta for the OR gate:{ThetaOR}") +print(f"The linear regression prediction for the OR gate:{X @ ThetaOR}") + + +# The OR gate +yAND = np.array( [ 0, 0 ,0, 1]) +ThetaAND = Xinv @ X.T @ yAND +print(f"The values of theta for the AND gate:{ThetaAND}") +print(f"The linear regression prediction for the AND gate:{X @ ThetaAND}") + + +# What is happening here? + +# ## Does Logistic Regression do a better Job? + +# In[2]: + + +get_ipython().run_line_magic('matplotlib', 'inline') + +""" +Simple code that tests XOR and OR gates with linear regression +and logistic regression +""" + +import matplotlib.pyplot as plt +from sklearn.linear_model import LogisticRegression +import numpy as np + +# Design matrix +X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64) +print(f"The X.TX matrix:{X.T @ X}") +Xinv = np.linalg.pinv(X.T @ X) +print(f"The invers of X.TX matrix:{Xinv}") + +# The XOR gate +yXOR = np.array( [ 0, 1 ,1, 0]) +ThetaXOR = Xinv @ X.T @ yXOR +print(f"The values of theta for the XOR gate:{ThetaXOR}") +print(f"The linear regression prediction for the XOR gate:{X @ ThetaXOR}") + + +# The OR gate +yOR = np.array( [ 0, 1 ,1, 1]) +ThetaOR = Xinv @ X.T @ yOR +print(f"The values of theta for the OR gate:{ThetaOR}") +print(f"The linear regression prediction for the OR gate:{X @ ThetaOR}") + + +# The OR gate +yAND = np.array( [ 0, 0 ,0, 1]) +ThetaAND = Xinv @ X.T @ yAND +print(f"The values of theta for the AND gate:{ThetaAND}") +print(f"The linear regression prediction for the AND gate:{X @ ThetaAND}") + +# Now we change to logistic regression + + +# Logistic Regression +logreg = LogisticRegression() +logreg.fit(X, yOR) +print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR))) + +logreg.fit(X, yXOR) +print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR))) + + +logreg.fit(X, yAND) +print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND))) + + +# Not exactly impressive, but somewhat better. + +# ## Adding Neural Networks + +# In[3]: + + +# and now neural networks with Scikit-Learn and the XOR + +from sklearn.neural_network import MLPClassifier +from sklearn.datasets import make_classification +X, yXOR = make_classification(n_samples=100, random_state=1) +FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR) +FFNN.predict_proba(X) +print(f"Test set accuracy with Feed Forward Neural Network for XOR gate:{FFNN.score(X, yXOR)}") + + +# ## Mathematical model +# +# The output $y$ is produced via the activation function $f$ + +# $$ +# y = f\left(\sum_{i=1}^n w_ix_i + b_i\right) = f(z), +# $$ + +# This function receives $x_i$ as inputs. +# Here the activation $z=(\sum_{i=1}^n w_ix_i+b_i)$. +# In an FFNN of such neurons, the *inputs* $x_i$ are the *outputs* of +# the neurons in the preceding layer. Furthermore, an MLP is +# fully-connected, which means that each neuron receives a weighted sum +# of the outputs of *all* neurons in the previous layer. + +# ## Mathematical model +# +# First, for each node $i$ in the first hidden layer, we calculate a weighted sum $z_i^1$ of the input coordinates $x_j$, + +# +#
+# +# $$ +# \begin{equation} z_i^1 = \sum_{j=1}^{M} w_{ij}^1 x_j + b_i^1 +# \label{_auto1} \tag{2} +# \end{equation} +# $$ + +# Here $b_i$ is the so-called bias which is normally needed in +# case of zero activation weights or inputs. How to fix the biases and +# the weights will be discussed below. The value of $z_i^1$ is the +# argument to the activation function $f_i$ of each node $i$, The +# variable $M$ stands for all possible inputs to a given node $i$ in the +# first layer. We define the output $y_i^1$ of all neurons in layer 1 as + +# +#
+# +# $$ +# \begin{equation} +# y_i^1 = f(z_i^1) = f\left(\sum_{j=1}^M w_{ij}^1 x_j + b_i^1\right) +# \label{outputLayer1} \tag{3} +# \end{equation} +# $$ + +# where we assume that all nodes in the same layer have identical +# activation functions, hence the notation $f$. In general, we could assume in the more general case that different layers have different activation functions. +# In this case we would identify these functions with a superscript $l$ for the $l$-th layer, + +# +#
+# +# $$ +# \begin{equation} +# y_i^l = f^l(u_i^l) = f^l\left(\sum_{j=1}^{N_{l-1}} w_{ij}^l y_j^{l-1} + b_i^l\right) +# \label{generalLayer} \tag{4} +# \end{equation} +# $$ + +# where $N_l$ is the number of nodes in layer $l$. When the output of +# all the nodes in the first hidden layer are computed, the values of +# the subsequent layer can be calculated and so forth until the output +# is obtained. + +# ## Mathematical model +# +# The output of neuron $i$ in layer 2 is thus, + +# +#
+# +# $$ +# \begin{equation} +# y_i^2 = f^2\left(\sum_{j=1}^N w_{ij}^2 y_j^1 + b_i^2\right) +# \label{_auto2} \tag{5} +# \end{equation} +# $$ + +# +#
+# +# $$ +# \begin{equation} +# = f^2\left[\sum_{j=1}^N w_{ij}^2f^1\left(\sum_{k=1}^M w_{jk}^1 x_k + b_j^1\right) + b_i^2\right] +# \label{outputLayer2} \tag{6} +# \end{equation} +# $$ + +# where we have substituted $y_k^1$ with the inputs $x_k$. Finally, the ANN output reads + +# +#
+# +# $$ +# \begin{equation} +# y_i^3 = f^3\left(\sum_{j=1}^N w_{ij}^3 y_j^2 + b_i^3\right) +# \label{_auto3} \tag{7} +# \end{equation} +# $$ + +# +#
+# +# $$ +# \begin{equation} +# = f_3\left[\sum_{j} w_{ij}^3 f^2\left(\sum_{k} w_{jk}^2 f^1\left(\sum_{m} w_{km}^1 x_m + b_k^1\right) + b_j^2\right) +# + b_1^3\right] +# \label{_auto4} \tag{8} +# \end{equation} +# $$ + +# ## Mathematical model +# +# We can generalize this expression to an MLP with $l$ hidden +# layers. The complete functional form is, + +# +#
+# +# $$ +# \begin{equation} +# y^{l+1}_i = f^{l+1}\left[\!\sum_{j=1}^{N_l} w_{ij}^3 f^l\left(\sum_{k=1}^{N_{l-1}}w_{jk}^{l-1}\left(\dots f^1\left(\sum_{n=1}^{N_0} w_{mn}^1 x_n+ b_m^1\right)\dots\right)+b_k^2\right)+b_1^3\right] +# \label{completeNN} \tag{9} +# \end{equation} +# $$ + +# which illustrates a basic property of MLPs: The only independent +# variables are the input values $x_n$. + +# ## Mathematical model +# +# This confirms that an MLP, despite its quite convoluted mathematical +# form, is nothing more than an analytic function, specifically a +# mapping of real-valued vectors $\hat{x} \in \mathbb{R}^n \rightarrow +# \hat{y} \in \mathbb{R}^m$. +# +# Furthermore, the flexibility and universality of an MLP can be +# illustrated by realizing that the expression is essentially a nested +# sum of scaled activation functions of the form + +# +#
+# +# $$ +# \begin{equation} +# f(x) = c_1 f(c_2 x + c_3) + c_4 +# \label{_auto5} \tag{10} +# \end{equation} +# $$ + +# where the parameters $c_i$ are weights and biases. By adjusting these +# parameters, the activation functions can be shifted up and down or +# left and right, change slope or be rescaled which is the key to the +# flexibility of a neural network. + +# ### Matrix-vector notation +# +# We can introduce a more convenient notation for the activations in an A NN. +# +# Additionally, we can represent the biases and activations +# as layer-wise column vectors $\hat{b}_l$ and $\hat{y}_l$, so that the $i$-th element of each vector +# is the bias $b_i^l$ and activation $y_i^l$ of node $i$ in layer $l$ respectively. +# +# We have that $\mathrm{W}_l$ is an $N_{l-1} \times N_l$ matrix, while $\hat{b}_l$ and $\hat{y}_l$ are $N_l \times 1$ column vectors. +# With this notation, the sum becomes a matrix-vector multiplication, and we can write +# the equation for the activations of hidden layer 2 (assuming three nodes for simplicity) as + +# +#
+# +# $$ +# \begin{equation} +# \hat{y}_2 = f_2(\mathrm{W}_2 \hat{y}_{1} + \hat{b}_{2}) = +# f_2\left(\left[\begin{array}{ccc} +# w^2_{11} &w^2_{12} &w^2_{13} \\ +# w^2_{21} &w^2_{22} &w^2_{23} \\ +# w^2_{31} &w^2_{32} &w^2_{33} \\ +# \end{array} \right] \cdot +# \left[\begin{array}{c} +# y^1_1 \\ +# y^1_2 \\ +# y^1_3 \\ +# \end{array}\right] + +# \left[\begin{array}{c} +# b^2_1 \\ +# b^2_2 \\ +# b^2_3 \\ +# \end{array}\right]\right). +# \label{_auto6} \tag{11} +# \end{equation} +# $$ + +# ### Matrix-vector notation and activation +# +# The activation of node $i$ in layer 2 is + +# +#
+# +# $$ +# \begin{equation} +# y^2_i = f_2\Bigr(w^2_{i1}y^1_1 + w^2_{i2}y^1_2 + w^2_{i3}y^1_3 + b^2_i\Bigr) = +# f_2\left(\sum_{j=1}^3 w^2_{ij} y_j^1 + b^2_i\right). +# \label{_auto7} \tag{12} +# \end{equation} +# $$ + +# This is not just a convenient and compact notation, but also a useful +# and intuitive way to think about MLPs: The output is calculated by a +# series of matrix-vector multiplications and vector additions that are +# used as input to the activation functions. For each operation +# $\mathrm{W}_l \hat{y}_{l-1}$ we move forward one layer. + +# ### Activation functions +# +# A property that characterizes a neural network, other than its +# connectivity, is the choice of activation function(s). As described +# in, the following restrictions are imposed on an activation function +# for a FFNN to fulfill the universal approximation theorem +# +# * Non-constant +# +# * Bounded +# +# * Monotonically-increasing +# +# * Continuous + +# ### Activation functions, Logistic and Hyperbolic ones +# +# The second requirement excludes all linear functions. Furthermore, in +# a MLP with only linear activation functions, each layer simply +# performs a linear transformation of its inputs. +# +# Regardless of the number of layers, the output of the NN will be +# nothing but a linear function of the inputs. Thus we need to introduce +# some kind of non-linearity to the NN to be able to fit non-linear +# functions Typical examples are the logistic *Sigmoid* + +# $$ +# f(x) = \frac{1}{1 + e^{-x}}, +# $$ + +# and the *hyperbolic tangent* function + +# $$ +# f(x) = \tanh(x) +# $$ + +# ### Relevance +# +# The *sigmoid* function are more biologically plausible because the +# output of inactive neurons are zero. Such activation function are +# called *one-sided*. However, it has been shown that the hyperbolic +# tangent performs better than the sigmoid for training MLPs. has +# become the most popular for *deep neural networks* + +# In[4]: + + +"""The sigmoid function (or the logistic curve) is a +function that takes any real number, z, and outputs a number (0,1). +It is useful in neural networks for assigning weights on a relative scale. +The value z is the weighted sum of parameters involved in the learning algorithm.""" + +import numpy +import matplotlib.pyplot as plt +import math as mt + +z = numpy.arange(-5, 5, .1) +sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z))) +sigma = sigma_fn(z) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot(z, sigma) +ax.set_ylim([-0.1, 1.1]) +ax.set_xlim([-5,5]) +ax.grid(True) +ax.set_xlabel('z') +ax.set_title('sigmoid function') + +plt.show() + +"""Step Function""" +z = numpy.arange(-5, 5, .02) +step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0) +step = step_fn(z) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot(z, step) +ax.set_ylim([-0.5, 1.5]) +ax.set_xlim([-5,5]) +ax.grid(True) +ax.set_xlabel('z') +ax.set_title('step function') + +plt.show() + +"""Sine Function""" +z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1) +t = numpy.sin(z) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot(z, t) +ax.set_ylim([-1.0, 1.0]) +ax.set_xlim([-2*mt.pi,2*mt.pi]) +ax.grid(True) +ax.set_xlabel('z') +ax.set_title('sine function') + +plt.show() + +"""Plots a graph of the squashing function used by a rectified linear +unit""" +z = numpy.arange(-2, 2, .1) +zero = numpy.zeros(len(z)) +y = numpy.max([zero, z], axis=0) + +fig = plt.figure() +ax = fig.add_subplot(111) +ax.plot(z, y) +ax.set_ylim([-2.0, 2.0]) +ax.set_xlim([-2.0, 2.0]) +ax.grid(True) +ax.set_xlabel('z') +ax.set_title('Rectified linear unit') + +plt.show() + + +# ## The multilayer perceptron (MLP) +# +# The multilayer perceptron is a very popular, and easy to implement approach, to deep learning. It consists of +# 1. A neural network with one or more layers of nodes between the input and the output nodes. +# +# 2. The multilayer network structure, or architecture, or topology, consists of an input layer, one or more hidden layers, and one output layer. +# +# 3. The input nodes pass values to the first hidden layer, its nodes pass the information on to the second and so on till we reach the output layer. +# +# As a convention it is normal to call a network with one layer of input units, one layer of hidden +# units and one layer of output units as a two-layer network. A network with two layers of hidden units is called a three-layer network etc etc. +# +# For an MLP network there is no direct connection between the output nodes/neurons/units and the input nodes/neurons/units. +# Hereafter we will call the various entities of a layer for nodes. +# There are also no connections within a single layer. +# +# The number of input nodes does not need to equal the number of output +# nodes. This applies also to the hidden layers. Each layer may have its +# own number of nodes and activation functions. +# +# The hidden layers have their name from the fact that they are not +# linked to observables and as we will see below when we define the +# so-called activation $\hat{z}$, we can think of this as a basis +# expansion of the original inputs $\hat{x}$. The difference however +# between neural networks and say linear regression is that now these +# basis functions (which will correspond to the weights in the network) +# are learned from data. This results in an important difference between +# neural networks and deep learning approaches on one side and methods +# like logistic regression or linear regression and their modifications on the other side. + +# ## From one to many layers, the universal approximation theorem +# +# A neural network with only one layer, what we called the simple +# perceptron, is best suited if we have a standard binary model with +# clear (linear) boundaries between the outcomes. As such it could +# equally well be replaced by standard linear regression or logistic +# regression. Networks with one or more hidden layers approximate +# systems with more complex boundaries. +# +# As stated earlier, +# an important theorem in studies of neural networks, restated without +# proof here, is the [universal approximation +# theorem](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.441.7873&rep=rep1&type=pdf). +# +# It states that a feed-forward network with a single hidden layer +# containing a finite number of neurons can approximate continuous +# functions on compact subsets of real functions. The theorem thus +# states that simple neural networks can represent a wide variety of +# interesting functions when given appropriate parameters. It is the +# multilayer feedforward architecture itself which gives neural networks +# the potential of being universal approximators. + +# ## Deriving the back propagation code for a multilayer perceptron model +# +# As we have seen now in a feed forward network, we can express the final output of our network in terms of basic matrix-vector multiplications. +# The unknowwn quantities are our weights $w_{ij}$ and we need to find an algorithm for changing them so that our errors are as small as possible. +# This leads us to the famous [back propagation algorithm](https://www.nature.com/articles/323533a0). +# +# The questions we want to ask are how do changes in the biases and the +# weights in our network change the cost function and how can we use the +# final output to modify the weights? +# +# To derive these equations let us start with a plain regression problem +# and define our cost function as + +# $$ +# {\cal C}(\hat{W}) = \frac{1}{2}\sum_{i=1}^n\left(y_i - t_i\right)^2, +# $$ + +# where the $t_i$s are our $n$ targets (the values we want to +# reproduce), while the outputs of the network after having propagated +# all inputs $\hat{x}$ are given by $y_i$. Below we will demonstrate +# how the basic equations arising from the back propagation algorithm +# can be modified in order to study classification problems with $K$ +# classes. + +# ## Definitions +# +# With our definition of the targets $\hat{t}$, the outputs of the +# network $\hat{y}$ and the inputs $\hat{x}$ we +# define now the activation $z_j^l$ of node/neuron/unit $j$ of the +# $l$-th layer as a function of the bias, the weights which add up from +# the previous layer $l-1$ and the forward passes/outputs +# $\hat{a}^{l-1}$ from the previous layer as + +# $$ +# z_j^l = \sum_{i=1}^{M_{l-1}}w_{ij}^la_i^{l-1}+b_j^l, +# $$ + +# where $b_k^l$ are the biases from layer $l$. Here $M_{l-1}$ +# represents the total number of nodes/neurons/units of layer $l-1$. The +# figure here illustrates this equation. We can rewrite this in a more +# compact form as the matrix-vector products we discussed earlier, + +# $$ +# \hat{z}^l = \left(\hat{W}^l\right)^T\hat{a}^{l-1}+\hat{b}^l. +# $$ + +# With the activation values $\hat{z}^l$ we can in turn define the +# output of layer $l$ as $\hat{a}^l = f(\hat{z}^l)$ where $f$ is our +# activation function. In the examples here we will use the sigmoid +# function discussed in our logistic regression lectures. We will also use the same activation function $f$ for all layers +# and their nodes. It means we have + +# $$ +# a_j^l = f(z_j^l) = \frac{1}{1+\exp{-(z_j^l)}}. +# $$ + +# ## Derivatives and the chain rule +# +# From the definition of the activation $z_j^l$ we have + +# $$ +# \frac{\partial z_j^l}{\partial w_{ij}^l} = a_i^{l-1}, +# $$ + +# and + +# $$ +# \frac{\partial z_j^l}{\partial a_i^{l-1}} = w_{ji}^l. +# $$ + +# With our definition of the activation function we have that (note that this function depends only on $z_j^l$) + +# $$ +# \frac{\partial a_j^l}{\partial z_j^{l}} = a_j^l(1-a_j^l)=f(z_j^l)(1-f(z_j^l)). +# $$ + +# ## Derivative of the cost function +# +# With these definitions we can now compute the derivative of the cost function in terms of the weights. +# +# Let us specialize to the output layer $l=L$. Our cost function is + +# $$ +# {\cal C}(\hat{W^L}) = \frac{1}{2}\sum_{i=1}^n\left(y_i - t_i\right)^2=\frac{1}{2}\sum_{i=1}^n\left(a_i^L - t_i\right)^2, +# $$ + +# The derivative of this function with respect to the weights is + +# $$ +# \frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \left(a_j^L - t_j\right)\frac{\partial a_j^L}{\partial w_{jk}^{L}}, +# $$ + +# The last partial derivative can easily be computed and reads (by applying the chain rule) + +# $$ +# \frac{\partial a_j^L}{\partial w_{jk}^{L}} = \frac{\partial a_j^L}{\partial z_{j}^{L}}\frac{\partial z_j^L}{\partial w_{jk}^{L}}=a_j^L(1-a_j^L)a_k^{L-1}, +# $$ + +# ## Bringing it together, first back propagation equation +# +# We have thus + +# $$ +# \frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \left(a_j^L - t_j\right)a_j^L(1-a_j^L)a_k^{L-1}, +# $$ + +# Defining + +# $$ +# \delta_j^L = a_j^L(1-a_j^L)\left(a_j^L - t_j\right) = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}, +# $$ + +# and using the Hadamard product of two vectors we can write this as + +# $$ +# \hat{\delta}^L = f'(\hat{z}^L)\circ\frac{\partial {\cal C}}{\partial (\hat{a}^L)}. +# $$ + +# This is an important expression. The second term on the right handside +# measures how fast the cost function is changing as a function of the $j$th +# output activation. If, for example, the cost function doesn't depend +# much on a particular output node $j$, then $\delta_j^L$ will be small, +# which is what we would expect. The first term on the right, measures +# how fast the activation function $f$ is changing at a given activation +# value $z_j^L$. +# +# Notice that everything in the above equations is easily computed. In +# particular, we compute $z_j^L$ while computing the behaviour of the +# network, and it is only a small additional overhead to compute +# $f'(z^L_j)$. The exact form of the derivative with respect to the +# output depends on the form of the cost function. +# However, provided the cost function is known there should be little +# trouble in calculating + +# $$ +# \frac{\partial {\cal C}}{\partial (a_j^L)} +# $$ + +# With the definition of $\delta_j^L$ we have a more compact definition of the derivative of the cost function in terms of the weights, namely + +# $$ +# \frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \delta_j^La_k^{L-1}. +# $$ + +# ## Derivatives in terms of $z_j^L$ +# +# It is also easy to see that our previous equation can be written as + +# $$ +# \delta_j^L =\frac{\partial {\cal C}}{\partial z_j^L}= \frac{\partial {\cal C}}{\partial a_j^L}\frac{\partial a_j^L}{\partial z_j^L}, +# $$ + +# which can also be interpreted as the partial derivative of the cost function with respect to the biases $b_j^L$, namely + +# $$ +# \delta_j^L = \frac{\partial {\cal C}}{\partial b_j^L}\frac{\partial b_j^L}{\partial z_j^L}=\frac{\partial {\cal C}}{\partial b_j^L}, +# $$ + +# That is, the error $\delta_j^L$ is exactly equal to the rate of change of the cost function as a function of the bias. + +# ## Bringing it together +# +# We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are +# +# **The starting equations.** + +# +#
+# +# $$ +# \begin{equation} +# \frac{\partial{\cal C}(\hat{W^L})}{\partial w_{jk}^L} = \delta_j^La_k^{L-1}, +# \label{_auto8} \tag{13} +# \end{equation} +# $$ + +# and + +# +#
+# +# $$ +# \begin{equation} +# \delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}, +# \label{_auto9} \tag{14} +# \end{equation} +# $$ + +# and + +# +#
+# +# $$ +# \begin{equation} +# \delta_j^L = \frac{\partial {\cal C}}{\partial b_j^L}, +# \label{_auto10} \tag{15} +# \end{equation} +# $$ + +# An interesting consequence of the above equations is that when the +# activation $a_k^{L-1}$ is small, the gradient term, that is the +# derivative of the cost function with respect to the weights, will also +# tend to be small. We say then that the weight learns slowly, meaning +# that it changes slowly when we minimize the weights via say gradient +# descent. In this case we say the system learns slowly. +# +# Another interesting feature is that is when the activation function, +# represented by the sigmoid function here, is rather flat when we move towards +# its end values $0$ and $1$ (see the above Python codes). In these +# cases, the derivatives of the activation function will also be close +# to zero, meaning again that the gradients will be small and the +# network learns slowly again. +# +# We need a fourth equation and we are set. We are going to propagate +# backwards in order to the determine the weights and biases. In order +# to do so we need to represent the error in the layer before the final +# one $L-1$ in terms of the errors in the final output layer. + +# ## Final back propagating equation +# +# We have that (replacing $L$ with a general layer $l$) + +# $$ +# \delta_j^l =\frac{\partial {\cal C}}{\partial z_j^l}. +# $$ + +# We want to express this in terms of the equations for layer $l+1$. Using the chain rule and summing over all $k$ entries we have + +# $$ +# \delta_j^l =\sum_k \frac{\partial {\cal C}}{\partial z_k^{l+1}}\frac{\partial z_k^{l+1}}{\partial z_j^{l}}=\sum_k \delta_k^{l+1}\frac{\partial z_k^{l+1}}{\partial z_j^{l}}, +# $$ + +# and recalling that + +# $$ +# z_j^{l+1} = \sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1}, +# $$ + +# with $M_l$ being the number of nodes in layer $l$, we obtain + +# $$ +# \delta_j^l =\sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l), +# $$ + +# This is our final equation. +# +# We are now ready to set up the algorithm for back propagation and learning the weights and biases. + +# ## Setting up the Back propagation algorithm +# +# The four equations provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm. +# +# First, we set up the input data $\hat{x}$ and the activations +# $\hat{z}_1$ of the input layer and compute the activation function and +# the pertinent outputs $\hat{a}^1$. +# +# Secondly, we perform then the feed forward till we reach the output +# layer and compute all $\hat{z}_l$ of the input layer and compute the +# activation function and the pertinent outputs $\hat{a}^l$ for +# $l=2,3,\dots,L$. +# +# Thereafter we compute the ouput error $\hat{\delta}^L$ by computing all + +# $$ +# \delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}. +# $$ + +# Then we compute the back propagate error for each $l=L-1,L-2,\dots,2$ as + +# $$ +# \delta_j^l = \sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l). +# $$ + +# Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\dots,2$ and update the weights and biases according to the rules + +# $$ +# w_{jk}^l\leftarrow = w_{jk}^l- \eta \delta_j^la_k^{l-1}, +# $$ + +# $$ +# b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta \delta_j^l, +# $$ + +# The parameter $\eta$ is the learning parameter discussed in connection with the gradient descent methods. +# Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training. + +# ## Setting up the Back propagation algorithm +# +# The four equations above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm. +# +# First, we set up the input data $\boldsymbol{x}$ and the activations +# $\boldsymbol{z}_1$ of the input layer and compute the activation function and +# the pertinent outputs $\boldsymbol{a}^1$. +# +# Secondly, we perform then the feed forward till we reach the output +# layer and compute all $\boldsymbol{z}_l$ of the input layer and compute the +# activation function and the pertinent outputs $\boldsymbol{a}^l$ for +# $l=2,3,\dots,L$. +# +# Thereafter we compute the ouput error $\boldsymbol{\delta}^L$ by computing all + +# $$ +# \delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}. +# $$ + +# Then we compute the back propagate error for each $l=L-1,L-2,\dots,2$ as + +# $$ +# \delta_j^l = \sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l). +# $$ + +# Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\dots,2$ and update the weights and biases according to the rules + +# $$ +# w_{jk}^l\leftarrow = w_{jk}^l- \eta \delta_j^la_k^{l-1}, +# $$ + +# $$ +# b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta \delta_j^l, +# $$ + +# The parameter $\eta$ is the learning parameter discussed in connection with the gradient descent methods. +# Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training. + +# ## Setting up the Back propagation algorithm +# +# The four equations derived discussed above provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm. +# +# First, we set up the input data $\boldsymbol{x}$ and the activations +# $\boldsymbol{z}_1$ of the input layer and compute the activation function and +# the pertinent outputs $\boldsymbol{a}^1$. +# +# Secondly, we perform then the feed forward till we reach the output +# layer and compute all $\boldsymbol{z}_l$ of the input layer and compute the +# activation function and the pertinent outputs $\boldsymbol{a}^l$ for +# $l=2,3,\dots,L$. +# +# Thereafter we compute the ouput error $\boldsymbol{\delta}^L$ by computing all + +# $$ +# \delta_j^L = f'(z_j^L)\frac{\partial {\cal C}}{\partial (a_j^L)}. +# $$ + +# Then we compute the back propagate error for each $l=L-1,L-2,\dots,2$ as + +# $$ +# \delta_j^l = \sum_k \delta_k^{l+1}w_{kj}^{l+1}f'(z_j^l). +# $$ + +# Finally, we update the weights and the biases using gradient descent for each $l=L-1,L-2,\dots,2$ and update the weights and biases according to the rules + +# $$ +# w_{jk}^l\leftarrow = w_{jk}^l- \eta \delta_j^la_k^{l-1}, +# $$ + +# $$ +# b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta \delta_j^l, +# $$ + +# The parameter $\eta$ is the learning parameter discussed in connection with the gradient descent methods. +# Here it is convenient to use stochastic gradient descent (see the examples below) with mini-batches with an outer loop that steps through multiple epochs of training. + +# ## Setting up a Multi-layer perceptron model for classification +# +# We are now gong to develop an example based on the MNIST data +# base. This is a classification problem and we need to use our +# cross-entropy function we discussed in connection with logistic +# regression. The cross-entropy defines our cost function for the +# classificaton problems with neural networks. +# +# In binary classification with two classes $(0, 1)$ we define the +# logistic/sigmoid function as the probability that a particular input +# is in class $0$ or $1$. This is possible because the logistic +# function takes any input from the real numbers and inputs a number +# between 0 and 1, and can therefore be interpreted as a probability. It +# also has other nice properties, such as a derivative that is simple to +# calculate. +# +# For an input $\boldsymbol{a}$ from the hidden layer, the probability that the input $\boldsymbol{x}$ +# is in class 0 or 1 is just. We let $\theta$ represent the unknown weights and biases to be adjusted by our equations). The variable $x$ +# represents our activation values $z$. We have + +# $$ +# P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) = \frac{1}{1 + \exp{(- \boldsymbol{x}})} , +# $$ + +# and + +# $$ +# P(y = 1 \mid \boldsymbol{x}, \boldsymbol{\theta}) = 1 - P(y = 0 \mid \boldsymbol{x}, \boldsymbol{\theta}) , +# $$ + +# where $y \in \{0, 1\}$ and $\boldsymbol{\theta}$ represents the weights and biases +# of our network. + +# ## Defining the cost function +# +# Our cost function is given as (see the Logistic regression lectures) + +# $$ +# \mathcal{C}(\boldsymbol{\theta}) = - \ln P(\mathcal{D} \mid \boldsymbol{\theta}) = - \sum_{i=1}^n +# y_i \ln[P(y_i = 0)] + (1 - y_i) \ln [1 - P(y_i = 0)] = \sum_{i=1}^n \mathcal{L}_i(\boldsymbol{\theta}) . +# $$ + +# This last equality means that we can interpret our *cost* function as a sum over the *loss* function +# for each point in the dataset $\mathcal{L}_i(\boldsymbol{\theta})$. +# The negative sign is just so that we can think about our algorithm as minimizing a positive number, rather +# than maximizing a negative number. +# +# In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: +# +# $y = 5 \quad \rightarrow \quad \boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$ and +# +# $y = 1 \quad \rightarrow \quad \boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$ +# +# i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset (numbers from $0$ to $9$).. +# +# If $\boldsymbol{x}_i$ is the $i$-th input (image), $y_{ic}$ refers to the $c$-th component of the $i$-th +# output vector $\boldsymbol{y}_i$. +# The probability of $\boldsymbol{x}_i$ being in class $c$ will be given by the softmax function: + +# $$ +# P(y_{ic} = 1 \mid \boldsymbol{x}_i, \boldsymbol{\theta}) = \frac{\exp{((\boldsymbol{a}_i^{hidden})^T \boldsymbol{w}_c)}} +# {\sum_{c'=0}^{C-1} \exp{((\boldsymbol{a}_i^{hidden})^T \boldsymbol{w}_{c'})}} , +# $$ + +# which reduces to the logistic function in the binary case. +# The likelihood of this $C$-class classifier +# is now given as: + +# $$ +# P(\mathcal{D} \mid \boldsymbol{\theta}) = \prod_{i=1}^n \prod_{c=0}^{C-1} [P(y_{ic} = 1)]^{y_{ic}} . +# $$ + +# Again we take the negative log-likelihood to define our cost function: + +# $$ +# \mathcal{C}(\boldsymbol{\theta}) = - \log{P(\mathcal{D} \mid \boldsymbol{\theta})}. +# $$ + +# See the logistic regression lectures for a full definition of the cost function. +# +# The back propagation equations need now only a small change, namely the definition of a new cost function. We are thus ready to use the same equations as before! + +# ## Example: binary classification problem +# +# As an example of the above, relevant for project 2 as well, let us consider a binary class. As discussed in our logistic regression lectures, we defined a cost function in terms of the parameters $\beta$ as + +# $$ +# \mathcal{C}(\boldsymbol{\beta}) = - \sum_{i=1}^n \left(y_i\log{p(y_i \vert x_i,\boldsymbol{\beta})}+(1-y_i)\log{1-p(y_i \vert x_i,\boldsymbol{\beta})}\right), +# $$ + +# where we had defined the logistic (sigmoid) function + +# $$ +# p(y_i =1\vert x_i,\boldsymbol{\beta})=\frac{\exp{(\beta_0+\beta_1 x_i)}}{1+\exp{(\beta_0+\beta_1 x_i)}}, +# $$ + +# and + +# $$ +# p(y_i =0\vert x_i,\boldsymbol{\beta})=1-p(y_i =1\vert x_i,\boldsymbol{\beta}). +# $$ + +# The parameters $\boldsymbol{\beta}$ were defined using a minimization method like gradient descent or Newton-Raphson's method. +# +# Now we replace $x_i$ with the activation $z_i^l$ for a given layer $l$ and the outputs as $y_i=a_i^l=f(z_i^l)$, with $z_i^l$ now being a function of the weights $w_{ij}^l$ and biases $b_i^l$. +# We have then + +# $$ +# a_i^l = y_i = \frac{\exp{(z_i^l)}}{1+\exp{(z_i^l)}}, +# $$ + +# with + +# $$ +# z_i^l = \sum_{j}w_{ij}^l a_j^{l-1}+b_i^l, +# $$ + +# where the superscript $l-1$ indicates that these are the outputs from layer $l-1$. +# Our cost function at the final layer $l=L$ is now + +# $$ +# \mathcal{C}(\boldsymbol{W}) = - \sum_{i=1}^n \left(t_i\log{a_i^L}+(1-t_i)\log{(1-a_i^L)}\right), +# $$ + +# where we have defined the targets $t_i$. The derivatives of the cost function with respect to the output $a_i^L$ are then easily calculated and we get + +# $$ +# \frac{\partial \mathcal{C}(\boldsymbol{W})}{\partial a_i^L} = \frac{a_i^L-t_i}{a_i^L(1-a_i^L)}. +# $$ + +# In case we use another activation function than the logistic one, we need to evaluate other derivatives. + +# ## The Softmax function +# In case we employ the more general case given by the Softmax equation, we need to evaluate the derivative of the activation function with respect to the activation $z_i^l$, that is we need + +# $$ +# \frac{\partial f(z_i^l)}{\partial w_{jk}^l} = +# \frac{\partial f(z_i^l)}{\partial z_j^l} \frac{\partial z_j^l}{\partial w_{jk}^l}= \frac{\partial f(z_i^l)}{\partial z_j^l}a_k^{l-1}. +# $$ + +# For the Softmax function we have + +# $$ +# f(z_i^l) = \frac{\exp{(z_i^l)}}{\sum_{m=1}^K\exp{(z_m^l)}}. +# $$ + +# Its derivative with respect to $z_j^l$ gives + +# $$ +# \frac{\partial f(z_i^l)}{\partial z_j^l}= f(z_i^l)\left(\delta_{ij}-f(z_j^l)\right), +# $$ + +# which in case of the simply binary model reduces to having $i=j$. + +# ## Developing a code for doing neural networks with back propagation +# +# One can identify a set of key steps when using neural networks to solve supervised learning problems: +# +# 1. Collect and pre-process data +# +# 2. Define model and architecture +# +# 3. Choose cost function and optimizer +# +# 4. Train the model +# +# 5. Evaluate model performance on test data +# +# 6. Adjust hyperparameters (if necessary, network architecture) + +# ## Collect and pre-process data +# +# Here we will be using the MNIST dataset, which is readily available through the **scikit-learn** +# package. You may also find it for example [here](http://yann.lecun.com/exdb/mnist/). +# The *MNIST* (Modified National Institute of Standards and Technology) database is a large database +# of handwritten digits that is commonly used for training various image processing systems. +# The MNIST dataset consists of 70 000 images of size $28\times 28$ pixels, each labeled from 0 to 9. +# The scikit-learn dataset we will use consists of a selection of 1797 images of size $8\times 8$ collected and processed from this database. +# +# To feed data into a feed-forward neural network we need to represent +# the inputs as a design/feature matrix $X = (n_{inputs}, n_{features})$. Each +# row represents an *input*, in this case a handwritten digit, and +# each column represents a *feature*, in this case a pixel. The +# correct answers, also known as *labels* or *targets* are +# represented as a 1D array of integers +# $Y = (n_{inputs}) = (5, 3, 1, 8,...)$. +# +# As an example, say we want to build a neural network using supervised learning to predict Body-Mass Index (BMI) from +# measurements of height (in m) +# and weight (in kg). If we have measurements of 5 people the design/feature matrix could be for example: +# +# $$ X = \begin{bmatrix} +# 1.85 & 81\\ +# 1.71 & 65\\ +# 1.95 & 103\\ +# 1.55 & 42\\ +# 1.63 & 56 +# \end{bmatrix} ,$$ +# +# and the targets would be: +# +# $$ Y = (23.7, 22.2, 27.1, 17.5, 21.1) $$ +# +# Since each input image is a 2D matrix, we need to flatten the image +# (i.e. "unravel" the 2D matrix into a 1D array) to turn the data into a +# design/feature matrix. This means we lose all spatial information in the +# image, such as locality and translational invariance. More complicated +# architectures such as Convolutional Neural Networks can take advantage +# of such information, and are most commonly applied when analyzing +# images. + +# In[5]: + + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + + +# ensure the same random numbers appear every time +np.random.seed(0) + +# display images in notebook +get_ipython().run_line_magic('matplotlib', 'inline') +plt.rcParams['figure.figsize'] = (12,12) + + +# download MNIST dataset +digits = datasets.load_digits() + +# define inputs and labels +inputs = digits.images +labels = digits.target + +print("inputs = (n_inputs, pixel_width, pixel_height) = " + str(inputs.shape)) +print("labels = (n_inputs) = " + str(labels.shape)) + + +# flatten the image +# the value -1 means dimension is inferred from the remaining dimensions: 8x8 = 64 +n_inputs = len(inputs) +inputs = inputs.reshape(n_inputs, -1) +print("X = (n_inputs, n_features) = " + str(inputs.shape)) + + +# choose some random images to display +indices = np.arange(n_inputs) +random_indices = np.random.choice(indices, size=5) + +for i, image in enumerate(digits.images[random_indices]): + plt.subplot(1, 5, i+1) + plt.axis('off') + plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest') + plt.title("Label: %d" % digits.target[random_indices[i]]) +plt.show() + + +# ## Train and test datasets +# +# Performing analysis before partitioning the dataset is a major error, that can lead to incorrect conclusions. +# +# We will reserve $80 \%$ of our dataset for training and $20 \%$ for testing. +# +# It is important that the train and test datasets are drawn randomly from our dataset, to ensure +# no bias in the sampling. +# Say you are taking measurements of weather data to predict the weather in the coming 5 days. +# You don't want to train your model on measurements taken from the hours 00.00 to 12.00, and then test it on data +# collected from 12.00 to 24.00. + +# In[6]: + + +from sklearn.model_selection import train_test_split + +# one-liner from scikit-learn library +train_size = 0.8 +test_size = 1 - train_size +X_train, X_test, Y_train, Y_test = train_test_split(inputs, labels, train_size=train_size, + test_size=test_size) + +# equivalently in numpy +def train_test_split_numpy(inputs, labels, train_size, test_size): + n_inputs = len(inputs) + inputs_shuffled = inputs.copy() + labels_shuffled = labels.copy() + + np.random.shuffle(inputs_shuffled) + np.random.shuffle(labels_shuffled) + + train_end = int(n_inputs*train_size) + X_train, X_test = inputs_shuffled[:train_end], inputs_shuffled[train_end:] + Y_train, Y_test = labels_shuffled[:train_end], labels_shuffled[train_end:] + + return X_train, X_test, Y_train, Y_test + +#X_train, X_test, Y_train, Y_test = train_test_split_numpy(inputs, labels, train_size, test_size) + +print("Number of training images: " + str(len(X_train))) +print("Number of test images: " + str(len(X_test))) + + +# ## Define model and architecture +# +# Our simple feed-forward neural network will consist of an *input* layer, a single *hidden* layer and an *output* layer. The activation $y$ of each neuron is a weighted sum of inputs, passed through an activation function. In case of the simple perceptron model we have +# +# $$ z = \sum_{i=1}^n w_i a_i ,$$ +# +# $$ y = f(z) ,$$ +# +# where $f$ is the activation function, $a_i$ represents input from neuron $i$ in the preceding layer +# and $w_i$ is the weight to input $i$. +# The activation of the neurons in the input layer is just the features (e.g. a pixel value). +# +# The simplest activation function for a neuron is the *Heaviside* function: +# +# $$ f(z) = +# \begin{cases} +# 1, & z > 0\\ +# 0, & \text{otherwise} +# \end{cases} +# $$ +# +# A feed-forward neural network with this activation is known as a *perceptron*. +# For a binary classifier (i.e. two classes, 0 or 1, dog or not-dog) we can also use this in our output layer. +# This activation can be generalized to $k$ classes (using e.g. the *one-against-all* strategy), +# and we call these architectures *multiclass perceptrons*. +# +# However, it is now common to use the terms Single Layer Perceptron (SLP) (1 hidden layer) and +# Multilayer Perceptron (MLP) (2 or more hidden layers) to refer to feed-forward neural networks with any activation function. +# +# Typical choices for activation functions include the sigmoid function, hyperbolic tangent, and Rectified Linear Unit (ReLU). +# We will be using the sigmoid function $\sigma(x)$: +# +# $$ f(x) = \sigma(x) = \frac{1}{1 + e^{-x}} ,$$ +# +# which is inspired by probability theory (see logistic regression) and was most commonly used until about 2011. See the discussion below concerning other activation functions. + +# ## Layers +# +# * Input +# +# Since each input image has 8x8 = 64 pixels or features, we have an input layer of 64 neurons. +# +# * Hidden layer +# +# We will use 50 neurons in the hidden layer receiving input from the neurons in the input layer. +# Since each neuron in the hidden layer is connected to the 64 inputs we have 64x50 = 3200 weights to the hidden layer. +# +# * Output +# +# If we were building a binary classifier, it would be sufficient with a single neuron in the output layer, +# which could output 0 or 1 according to the Heaviside function. This would be an example of a *hard* classifier, meaning it outputs the class of the input directly. However, if we are dealing with noisy data it is often beneficial to use a *soft* classifier, which outputs the probability of being in class 0 or 1. +# +# For a soft binary classifier, we could use a single neuron and interpret the output as either being the probability of being in class 0 or the probability of being in class 1. Alternatively we could use 2 neurons, and interpret each neuron as the probability of being in each class. +# +# Since we are doing multiclass classification, with 10 categories, it is natural to use 10 neurons in the output layer. We number the neurons $j = 0,1,...,9$. The activation of each output neuron $j$ will be according to the *softmax* function: +# +# $$ P(\text{class $j$} \mid \text{input $\boldsymbol{a}$}) = \frac{\exp{(\boldsymbol{a}^T \boldsymbol{w}_j)}} +# {\sum_{c=0}^{9} \exp{(\boldsymbol{a}^T \boldsymbol{w}_c)}} ,$$ +# +# i.e. each neuron $j$ outputs the probability of being in class $j$ given an input from the hidden layer $\boldsymbol{a}$, with $\boldsymbol{w}_j$ the weights of neuron $j$ to the inputs. +# The denominator is a normalization factor to ensure the outputs (probabilities) sum up to 1. +# The exponent is just the weighted sum of inputs as before: +# +# $$ z_j = \sum_{i=1}^n w_ {ij} a_i+b_j.$$ +# +# Since each neuron in the output layer is connected to the 50 inputs from the hidden layer we have 50x10 = 500 +# weights to the output layer. + +# ## Weights and biases +# +# Typically weights are initialized with small values distributed around zero, drawn from a uniform +# or normal distribution. Setting all weights to zero means all neurons give the same output, making the network useless. +# +# Adding a bias value to the weighted sum of inputs allows the neural network to represent a greater range +# of values. Without it, any input with the value 0 will be mapped to zero (before being passed through the activation). The bias unit has an output of 1, and a weight to each neuron $j$, $b_j$: +# +# $$ z_j = \sum_{i=1}^n w_ {ij} a_i + b_j.$$ +# +# The bias weights $\boldsymbol{b}$ are often initialized to zero, but a small value like $0.01$ ensures all neurons have some output which can be backpropagated in the first training cycle. + +# In[7]: + + +# building our neural network + +n_inputs, n_features = X_train.shape +n_hidden_neurons = 50 +n_categories = 10 + +# we make the weights normally distributed using numpy.random.randn + +# weights and bias in the hidden layer +hidden_weights = np.random.randn(n_features, n_hidden_neurons) +hidden_bias = np.zeros(n_hidden_neurons) + 0.01 + +# weights and bias in the output layer +output_weights = np.random.randn(n_hidden_neurons, n_categories) +output_bias = np.zeros(n_categories) + 0.01 + + +# ## Feed-forward pass +# +# Denote $F$ the number of features, $H$ the number of hidden neurons and $C$ the number of categories. +# For each input image we calculate a weighted sum of input features (pixel values) to each neuron $j$ in the hidden layer $l$: +# +# $$ z_{j}^{l} = \sum_{i=1}^{F} w_{ij}^{l} x_i + b_{j}^{l},$$ +# +# this is then passed through our activation function +# +# $$ a_{j}^{l} = f(z_{j}^{l}) .$$ +# +# We calculate a weighted sum of inputs (activations in the hidden layer) to each neuron $j$ in the output layer: +# +# $$ z_{j}^{L} = \sum_{i=1}^{H} w_{ij}^{L} a_{i}^{l} + b_{j}^{L}.$$ +# +# Finally we calculate the output of neuron $j$ in the output layer using the softmax function: +# +# $$ a_{j}^{L} = \frac{\exp{(z_j^{L})}} +# {\sum_{c=0}^{C-1} \exp{(z_c^{L})}} .$$ + +# ## Matrix multiplications +# +# Since our data has the dimensions $X = (n_{inputs}, n_{features})$ and our weights to the hidden +# layer have the dimensions +# $W_{hidden} = (n_{features}, n_{hidden})$, +# we can easily feed the network all our training data in one go by taking the matrix product +# +# $$ X W^{h} = (n_{inputs}, n_{hidden}),$$ +# +# and obtain a matrix that holds the weighted sum of inputs to the hidden layer +# for each input image and each hidden neuron. +# We also add the bias to obtain a matrix of weighted sums to the hidden layer $Z^{h}$: +# +# $$ \boldsymbol{z}^{l} = \boldsymbol{X} \boldsymbol{W}^{l} + \boldsymbol{b}^{l} ,$$ +# +# meaning the same bias (1D array with size equal number of hidden neurons) is added to each input image. +# This is then passed through the activation: +# +# $$ \boldsymbol{a}^{l} = f(\boldsymbol{z}^l) .$$ +# +# This is fed to the output layer: +# +# $$ \boldsymbol{z}^{L} = \boldsymbol{a}^{L} \boldsymbol{W}^{L} + \boldsymbol{b}^{L} .$$ +# +# Finally we receive our output values for each image and each category by passing it through the softmax function: +# +# $$ output = softmax (\boldsymbol{z}^{L}) = (n_{inputs}, n_{categories}) .$$ + +# In[8]: + + +# setup the feed-forward pass, subscript h = hidden layer + +def sigmoid(x): + return 1/(1 + np.exp(-x)) + +def feed_forward(X): + # weighted sum of inputs to the hidden layer + z_h = np.matmul(X, hidden_weights) + hidden_bias + # activation in the hidden layer + a_h = sigmoid(z_h) + + # weighted sum of inputs to the output layer + z_o = np.matmul(a_h, output_weights) + output_bias + # softmax output + # axis 0 holds each input and axis 1 the probabilities of each category + exp_term = np.exp(z_o) + probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + + return probabilities + +probabilities = feed_forward(X_train) +print("probabilities = (n_inputs, n_categories) = " + str(probabilities.shape)) +print("probability that image 0 is in category 0,1,2,...,9 = \n" + str(probabilities[0])) +print("probabilities sum up to: " + str(probabilities[0].sum())) +print() + +# we obtain a prediction by taking the class with the highest likelihood +def predict(X): + probabilities = feed_forward(X) + return np.argmax(probabilities, axis=1) + +predictions = predict(X_train) +print("predictions = (n_inputs) = " + str(predictions.shape)) +print("prediction for image 0: " + str(predictions[0])) +print("correct label for image 0: " + str(Y_train[0])) + + +# ## Choose cost function and optimizer +# +# To measure how well our neural network is doing we need to introduce a cost function. +# We will call the function that gives the error of a single sample output the *loss* function, and the function +# that gives the total error of our network across all samples the *cost* function. +# A typical choice for multiclass classification is the *cross-entropy* loss, also known as the negative log likelihood. +# +# In *multiclass* classification it is common to treat each integer label as a so called *one-hot* vector: +# +# $$ y = 5 \quad \rightarrow \quad \boldsymbol{y} = (0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ,$$ +# +# $$ y = 1 \quad \rightarrow \quad \boldsymbol{y} = (0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ,$$ +# +# i.e. a binary bit string of length $C$, where $C = 10$ is the number of classes in the MNIST dataset. +# +# Let $y_{ic}$ denote the $c$-th component of the $i$-th one-hot vector. +# We define the cost function $\mathcal{C}$ as a sum over the cross-entropy loss for each point $\boldsymbol{x}_i$ in the dataset. +# +# In the one-hot representation only one of the terms in the loss function is non-zero, namely the +# probability of the correct category $c'$ +# (i.e. the category $c'$ such that $y_{ic'} = 1$). This means that the cross entropy loss only punishes you for how wrong +# you got the correct label. The probability of category $c$ is given by the softmax function. The vector $\boldsymbol{\theta}$ represents the parameters of our network, i.e. all the weights and biases. + +# ## Optimizing the cost function +# +# The network is trained by finding the weights and biases that minimize the cost function. One of the most widely used classes of methods is *gradient descent* and its generalizations. The idea behind gradient descent +# is simply to adjust the weights in the direction where the gradient of the cost function is large and negative. This ensures we flow toward a *local* minimum of the cost function. +# Each parameter $\theta$ is iteratively adjusted according to the rule +# +# $$ \theta_{i+1} = \theta_i - \eta \nabla \mathcal{C}(\theta_i) ,$$ +# +# where $\eta$ is known as the *learning rate*, which controls how big a step we take towards the minimum. +# This update can be repeated for any number of iterations, or until we are satisfied with the result. +# +# A simple and effective improvement is a variant called *Batch Gradient Descent*. +# Instead of calculating the gradient on the whole dataset, we calculate an approximation of the gradient +# on a subset of the data called a *minibatch*. +# If there are $N$ data points and we have a minibatch size of $M$, the total number of batches +# is $N/M$. +# We denote each minibatch $B_k$, with $k = 1, 2,...,N/M$. The gradient then becomes: +# +# $$ \nabla \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \nabla \mathcal{L}_i(\theta) \quad \rightarrow \quad +# \frac{1}{M} \sum_{i \in B_k} \nabla \mathcal{L}_i(\theta) ,$$ +# +# i.e. instead of averaging the loss over the entire dataset, we average over a minibatch. +# +# This has two important benefits: +# 1. Introducing stochasticity decreases the chance that the algorithm becomes stuck in a local minima. +# +# 2. It significantly speeds up the calculation, since we do not have to use the entire dataset to calculate the gradient. +# +# The various optmization methods, with codes and algorithms, are discussed in our lectures on [Gradient descent approaches](https://compphysics.github.io/MachineLearning/doc/pub/Splines/html/Splines-bs.html). + +# ## Regularization +# +# It is common to add an extra term to the cost function, proportional +# to the size of the weights. This is equivalent to constraining the +# size of the weights, so that they do not grow out of control. +# Constraining the size of the weights means that the weights cannot +# grow arbitrarily large to fit the training data, and in this way +# reduces *overfitting*. +# +# We will measure the size of the weights using the so called *L2-norm*, meaning our cost function becomes: +# +# $$ \mathcal{C}(\theta) = \frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) \quad \rightarrow \quad +# \frac{1}{N} \sum_{i=1}^N \mathcal{L}_i(\theta) + \lambda \lvert \lvert \boldsymbol{w} \rvert \rvert_2^2 +# = \frac{1}{N} \sum_{i=1}^N \mathcal{L}(\theta) + \lambda \sum_{ij} w_{ij}^2,$$ +# +# i.e. we sum up all the weights squared. The factor $\lambda$ is known as a regularization parameter. +# +# In order to train the model, we need to calculate the derivative of +# the cost function with respect to every bias and weight in the +# network. In total our network has $(64 + 1)\times 50=3250$ weights in +# the hidden layer and $(50 + 1)\times 10=510$ weights to the output +# layer ($+1$ for the bias), and the gradient must be calculated for +# every parameter. We use the *backpropagation* algorithm discussed +# above. This is a clever use of the chain rule that allows us to +# calculate the gradient efficently. + +# ## Matrix multiplication +# +# To more efficently train our network these equations are implemented using matrix operations. +# The error in the output layer is calculated simply as, with $\boldsymbol{t}$ being our targets, +# +# $$ \delta_L = \boldsymbol{t} - \boldsymbol{y} = (n_{inputs}, n_{categories}) .$$ +# +# The gradient for the output weights is calculated as +# +# $$ \nabla W_{L} = \boldsymbol{a}^T \delta_L = (n_{hidden}, n_{categories}) ,$$ +# +# where $\boldsymbol{a} = (n_{inputs}, n_{hidden})$. This simply means that we are summing up the gradients for each input. +# Since we are going backwards we have to transpose the activation matrix. +# +# The gradient with respect to the output bias is then +# +# $$ \nabla \boldsymbol{b}_{L} = \sum_{i=1}^{n_{inputs}} \delta_L = (n_{categories}) .$$ +# +# The error in the hidden layer is +# +# $$ \Delta_h = \delta_L W_{L}^T \circ f'(z_{h}) = \delta_L W_{L}^T \circ a_{h} \circ (1 - a_{h}) = (n_{inputs}, n_{hidden}) ,$$ +# +# where $f'(a_{h})$ is the derivative of the activation in the hidden layer. The matrix products mean +# that we are summing up the products for each neuron in the output layer. The symbol $\circ$ denotes +# the *Hadamard product*, meaning element-wise multiplication. +# +# This again gives us the gradients in the hidden layer: +# +# $$ \nabla W_{h} = X^T \delta_h = (n_{features}, n_{hidden}) ,$$ +# +# $$ \nabla b_{h} = \sum_{i=1}^{n_{inputs}} \delta_h = (n_{hidden}) .$$ + +# In[9]: + + +# to categorical turns our integer vector into a onehot representation +from sklearn.metrics import accuracy_score + +# one-hot in numpy +def to_categorical_numpy(integer_vector): + n_inputs = len(integer_vector) + n_categories = np.max(integer_vector) + 1 + onehot_vector = np.zeros((n_inputs, n_categories)) + onehot_vector[range(n_inputs), integer_vector] = 1 + + return onehot_vector + +#Y_train_onehot, Y_test_onehot = to_categorical(Y_train), to_categorical(Y_test) +Y_train_onehot, Y_test_onehot = to_categorical_numpy(Y_train), to_categorical_numpy(Y_test) + +def feed_forward_train(X): + # weighted sum of inputs to the hidden layer + z_h = np.matmul(X, hidden_weights) + hidden_bias + # activation in the hidden layer + a_h = sigmoid(z_h) + + # weighted sum of inputs to the output layer + z_o = np.matmul(a_h, output_weights) + output_bias + # softmax output + # axis 0 holds each input and axis 1 the probabilities of each category + exp_term = np.exp(z_o) + probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + + # for backpropagation need activations in hidden and output layers + return a_h, probabilities + +def backpropagation(X, Y): + a_h, probabilities = feed_forward_train(X) + + # error in the output layer + error_output = probabilities - Y + # error in the hidden layer + error_hidden = np.matmul(error_output, output_weights.T) * a_h * (1 - a_h) + + # gradients for the output layer + output_weights_gradient = np.matmul(a_h.T, error_output) + output_bias_gradient = np.sum(error_output, axis=0) + + # gradient for the hidden layer + hidden_weights_gradient = np.matmul(X.T, error_hidden) + hidden_bias_gradient = np.sum(error_hidden, axis=0) + + return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient + +print("Old accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train))) + +eta = 0.01 +lmbd = 0.01 +for i in range(1000): + # calculate gradients + dWo, dBo, dWh, dBh = backpropagation(X_train, Y_train_onehot) + + # regularization term gradients + dWo += lmbd * output_weights + dWh += lmbd * hidden_weights + + # update weights and biases + output_weights -= eta * dWo + output_bias -= eta * dBo + hidden_weights -= eta * dWh + hidden_bias -= eta * dBh + +print("New accuracy on training data: " + str(accuracy_score(predict(X_train), Y_train))) + + +# ## Improving performance +# +# As we can see the network does not seem to be learning at all. It seems to be just guessing the label for each image. +# In order to obtain a network that does something useful, we will have to do a bit more work. +# +# The choice of *hyperparameters* such as learning rate and regularization parameter is hugely influential for the performance of the network. Typically a *grid-search* is performed, wherein we test different hyperparameters separated by orders of magnitude. For example we could test the learning rates $\eta = 10^{-6}, 10^{-5},...,10^{-1}$ with different regularization parameters $\lambda = 10^{-6},...,10^{-0}$. +# +# Next, we haven't implemented minibatching yet, which introduces stochasticity and is though to act as an important regularizer on the weights. We call a feed-forward + backward pass with a minibatch an *iteration*, and a full training period +# going through the entire dataset ($n/M$ batches) an *epoch*. +# +# If this does not improve network performance, you may want to consider altering the network architecture, adding more neurons or hidden layers. +# Andrew Ng goes through some of these considerations in this [video](https://youtu.be/F1ka6a13S9I). You can find a summary of the video [here](https://kevinzakka.github.io/2016/09/26/applying-deep-learning/). + +# ## Full object-oriented implementation +# +# It is very natural to think of the network as an object, with specific instances of the network +# being realizations of this object with different hyperparameters. An implementation using Python classes provides a clean structure and interface, and the full implementation of our neural network is given below. + +# In[10]: + + +class NeuralNetwork: + def __init__( + self, + X_data, + Y_data, + n_hidden_neurons=50, + n_categories=10, + epochs=10, + batch_size=100, + eta=0.1, + lmbd=0.0): + + self.X_data_full = X_data + self.Y_data_full = Y_data + + self.n_inputs = X_data.shape[0] + self.n_features = X_data.shape[1] + self.n_hidden_neurons = n_hidden_neurons + self.n_categories = n_categories + + self.epochs = epochs + self.batch_size = batch_size + self.iterations = self.n_inputs // self.batch_size + self.eta = eta + self.lmbd = lmbd + + self.create_biases_and_weights() + + def create_biases_and_weights(self): + self.hidden_weights = np.random.randn(self.n_features, self.n_hidden_neurons) + self.hidden_bias = np.zeros(self.n_hidden_neurons) + 0.01 + + self.output_weights = np.random.randn(self.n_hidden_neurons, self.n_categories) + self.output_bias = np.zeros(self.n_categories) + 0.01 + + def feed_forward(self): + # feed-forward for training + self.z_h = np.matmul(self.X_data, self.hidden_weights) + self.hidden_bias + self.a_h = sigmoid(self.z_h) + + self.z_o = np.matmul(self.a_h, self.output_weights) + self.output_bias + + exp_term = np.exp(self.z_o) + self.probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + + def feed_forward_out(self, X): + # feed-forward for output + z_h = np.matmul(X, self.hidden_weights) + self.hidden_bias + a_h = sigmoid(z_h) + + z_o = np.matmul(a_h, self.output_weights) + self.output_bias + + exp_term = np.exp(z_o) + probabilities = exp_term / np.sum(exp_term, axis=1, keepdims=True) + return probabilities + + def backpropagation(self): + error_output = self.probabilities - self.Y_data + error_hidden = np.matmul(error_output, self.output_weights.T) * self.a_h * (1 - self.a_h) + + self.output_weights_gradient = np.matmul(self.a_h.T, error_output) + self.output_bias_gradient = np.sum(error_output, axis=0) + + self.hidden_weights_gradient = np.matmul(self.X_data.T, error_hidden) + self.hidden_bias_gradient = np.sum(error_hidden, axis=0) + + if self.lmbd > 0.0: + self.output_weights_gradient += self.lmbd * self.output_weights + self.hidden_weights_gradient += self.lmbd * self.hidden_weights + + self.output_weights -= self.eta * self.output_weights_gradient + self.output_bias -= self.eta * self.output_bias_gradient + self.hidden_weights -= self.eta * self.hidden_weights_gradient + self.hidden_bias -= self.eta * self.hidden_bias_gradient + + def predict(self, X): + probabilities = self.feed_forward_out(X) + return np.argmax(probabilities, axis=1) + + def predict_probabilities(self, X): + probabilities = self.feed_forward_out(X) + return probabilities + + def train(self): + data_indices = np.arange(self.n_inputs) + + for i in range(self.epochs): + for j in range(self.iterations): + # pick datapoints with replacement + chosen_datapoints = np.random.choice( + data_indices, size=self.batch_size, replace=False + ) + + # minibatch training data + self.X_data = self.X_data_full[chosen_datapoints] + self.Y_data = self.Y_data_full[chosen_datapoints] + + self.feed_forward() + self.backpropagation() + + +# ## Evaluate model performance on test data +# +# To measure the performance of our network we evaluate how well it does it data it has never seen before, i.e. the test data. +# We measure the performance of the network using the *accuracy* score. +# The accuracy is as you would expect just the number of images correctly labeled divided by the total number of images. A perfect classifier will have an accuracy score of $1$. +# +# $$ \text{Accuracy} = \frac{\sum_{i=1}^n I(\tilde{y}_i = y_i)}{n} ,$$ +# +# where $I$ is the indicator function, $1$ if $\tilde{y}_i = y_i$ and $0$ otherwise. + +# In[11]: + + +epochs = 100 +batch_size = 100 + +dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size, + n_hidden_neurons=n_hidden_neurons, n_categories=n_categories) +dnn.train() +test_predict = dnn.predict(X_test) + +# accuracy score from scikit library +print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict)) + +# equivalent in numpy +def accuracy_score_numpy(Y_test, Y_pred): + return np.sum(Y_test == Y_pred) / len(Y_test) + +#print("Accuracy score on test set: ", accuracy_score_numpy(Y_test, test_predict)) + + +# ## Adjust hyperparameters +# +# We now perform a grid search to find the optimal hyperparameters for the network. +# Note that we are only using 1 layer with 50 neurons, and human performance is estimated to be around $98\%$ ($2\%$ error rate). + +# In[12]: + + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +# store the models for later use +DNN_numpy = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +# grid search +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + dnn = NeuralNetwork(X_train, Y_train_onehot, eta=eta, lmbd=lmbd, epochs=epochs, batch_size=batch_size, + n_hidden_neurons=n_hidden_neurons, n_categories=n_categories) + dnn.train() + + DNN_numpy[i][j] = dnn + + test_predict = dnn.predict(X_test) + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Accuracy score on test set: ", accuracy_score(Y_test, test_predict)) + print() + + +# ## Visualization + +# In[13]: + + +# visual representation of grid search +# uses seaborn heatmap, you can also do this with matplotlib imshow +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + dnn = DNN_numpy[i][j] + + train_pred = dnn.predict(X_train) + test_pred = dnn.predict(X_test) + + train_accuracy[i][j] = accuracy_score(Y_train, train_pred) + test_accuracy[i][j] = accuracy_score(Y_test, test_pred) + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + + +# ## scikit-learn implementation +# +# **scikit-learn** focuses more +# on traditional machine learning methods, such as regression, +# clustering, decision trees, etc. As such, it has only two types of +# neural networks: Multi Layer Perceptron outputting continuous values, +# *MPLRegressor*, and Multi Layer Perceptron outputting labels, +# *MLPClassifier*. We will see how simple it is to use these classes. +# +# **scikit-learn** implements a few improvements from our neural network, +# such as early stopping, a varying learning rate, different +# optimization methods, etc. We would therefore expect a better +# performance overall. + +# In[14]: + + +from sklearn.neural_network import MLPClassifier +# store models for later use +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic', + alpha=lmbd, learning_rate_init=eta, max_iter=epochs) + dnn.fit(X_train, Y_train) + + DNN_scikit[i][j] = dnn + + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Accuracy score on test set: ", dnn.score(X_test, Y_test)) + print() + + +# ## Visualization + +# In[15]: + + +# optional +# visual representation of grid search +# uses seaborn heatmap, could probably do this in matplotlib +import seaborn as sns + +sns.set() + +train_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) + +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + dnn = DNN_scikit[i][j] + + train_pred = dnn.predict(X_train) + test_pred = dnn.predict(X_test) + + train_accuracy[i][j] = accuracy_score(Y_train, train_pred) + test_accuracy[i][j] = accuracy_score(Y_test, test_pred) + + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(train_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Training Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + + +# ## Testing our code for the XOR, OR and AND gates +# +# Last week we discussed three different types of gates, the so-called +# XOR, the OR and the AND gates. Their inputs and outputs can be +# summarized using the following tables, first for the OR gate with +# inputs $x_1$ and $x_2$ and outputs $y$: +# +# +# +# +# +# +# +# +# +# +# +#
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 1
+ +# ## The AND and XOR Gates +# +# The AND gate is defined as +# +# +# +# +# +# +# +# +# +# +# +#
$x_1$ $x_2$ $y$
0 0 0
0 1 0
1 0 0
1 1 1
+# +# And finally we have the XOR gate +# +# +# +# +# +# +# +# +# +# +# +#
$x_1$ $x_2$ $y$
0 0 0
0 1 1
1 0 1
1 1 0
+ +# ## Representing the Data Sets +# +# Our design matrix is defined by the input values $x_1$ and $x_2$. Since we have four possible outputs, our design matrix reads + +# $$ +# \boldsymbol{X}=\begin{bmatrix} 0 & 0 \\ +# 0 & 1 \\ +# 1 & 0 \\ +# 1 & 1 \end{bmatrix}, +# $$ + +# while the vector of outputs is $\boldsymbol{y}^T=[0,1,1,0]$ for the XOR gate, $\boldsymbol{y}^T=[0,0,0,1]$ for the AND gate and $\boldsymbol{y}^T=[0,1,1,1]$ for the OR gate. + +# ## Setting up the Neural Network +# +# We define first our design matrix and the various output vectors for the different gates. + +# In[16]: + + +""" +Simple code that tests XOR, OR and AND gates with linear regression +""" + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn import datasets + +def sigmoid(x): + return 1/(1 + np.exp(-x)) + +def feed_forward(X): + # weighted sum of inputs to the hidden layer + z_h = np.matmul(X, hidden_weights) + hidden_bias + # activation in the hidden layer + a_h = sigmoid(z_h) + + # weighted sum of inputs to the output layer + z_o = np.matmul(a_h, output_weights) + output_bias + # softmax output + # axis 0 holds each input and axis 1 the probabilities of each category + probabilities = sigmoid(z_o) + return probabilities + +# we obtain a prediction by taking the class with the highest likelihood +def predict(X): + probabilities = feed_forward(X) + return np.argmax(probabilities, axis=1) + +# ensure the same random numbers appear every time +np.random.seed(0) + +# Design matrix +X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64) + +# The XOR gate +yXOR = np.array( [ 0, 1 ,1, 0]) +# The OR gate +yOR = np.array( [ 0, 1 ,1, 1]) +# The AND gate +yAND = np.array( [ 0, 0 ,0, 1]) + +# Defining the neural network +n_inputs, n_features = X.shape +n_hidden_neurons = 2 +n_categories = 2 +n_features = 2 + +# we make the weights normally distributed using numpy.random.randn + +# weights and bias in the hidden layer +hidden_weights = np.random.randn(n_features, n_hidden_neurons) +hidden_bias = np.zeros(n_hidden_neurons) + 0.01 + +# weights and bias in the output layer +output_weights = np.random.randn(n_hidden_neurons, n_categories) +output_bias = np.zeros(n_categories) + 0.01 + +probabilities = feed_forward(X) +print(probabilities) + + +predictions = predict(X) +print(predictions) + + +# Not an impressive result, but this was our first forward pass with randomly assigned weights. Let us now add the full network with the back-propagation algorithm discussed above. + +# ## The Code using Scikit-Learn + +# In[17]: + + +# import necessary packages +import numpy as np +import matplotlib.pyplot as plt +from sklearn.neural_network import MLPClassifier +from sklearn.metrics import accuracy_score +import seaborn as sns + +# ensure the same random numbers appear every time +np.random.seed(0) + +# Design matrix +X = np.array([ [0, 0], [0, 1], [1, 0],[1, 1]],dtype=np.float64) + +# The XOR gate +yXOR = np.array( [ 0, 1 ,1, 0]) +# The OR gate +yOR = np.array( [ 0, 1 ,1, 1]) +# The AND gate +yAND = np.array( [ 0, 0 ,0, 1]) + +# Defining the neural network +n_inputs, n_features = X.shape +n_hidden_neurons = 2 +n_categories = 2 +n_features = 2 + +eta_vals = np.logspace(-5, 1, 7) +lmbd_vals = np.logspace(-5, 1, 7) +# store models for later use +DNN_scikit = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object) +epochs = 100 + +for i, eta in enumerate(eta_vals): + for j, lmbd in enumerate(lmbd_vals): + dnn = MLPClassifier(hidden_layer_sizes=(n_hidden_neurons), activation='logistic', + alpha=lmbd, learning_rate_init=eta, max_iter=epochs) + dnn.fit(X, yXOR) + DNN_scikit[i][j] = dnn + print("Learning rate = ", eta) + print("Lambda = ", lmbd) + print("Accuracy score on data set: ", dnn.score(X, yXOR)) + print() + +sns.set() +test_accuracy = np.zeros((len(eta_vals), len(lmbd_vals))) +for i in range(len(eta_vals)): + for j in range(len(lmbd_vals)): + dnn = DNN_scikit[i][j] + test_pred = dnn.predict(X) + test_accuracy[i][j] = accuracy_score(yXOR, test_pred) + +fig, ax = plt.subplots(figsize = (10, 10)) +sns.heatmap(test_accuracy, annot=True, ax=ax, cmap="viridis") +ax.set_title("Test Accuracy") +ax.set_ylabel("$\eta$") +ax.set_xlabel("$\lambda$") +plt.show() + diff --git a/doc/LectureNotes/_build/jupyter_execute/week41_176_1.png b/doc/LectureNotes/_build/jupyter_execute/week41_176_1.png new file mode 100644 index 0000000000000000000000000000000000000000..72515c54f747a11094ae1345d84c712af699e2b6 GIT binary patch literal 4442 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∓1w4JB3+UANTj2!EmqO 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

h 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/week41_59_1.png b/doc/LectureNotes/_build/jupyter_execute/week41_59_1.png new file mode 100644 index 0000000000000000000000000000000000000000..90948aee69ae83d1e057e5881a2fcc25bb6cab2e GIT binary patch literal 14628 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 literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/week41_59_2.png b/doc/LectureNotes/_build/jupyter_execute/week41_59_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a76574b3ebd5077d9730bd5957b9bf7f4b1b518b GIT binary patch literal 31496 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 V2_H_Fz*K6KhKiPQfuhBe{{=V`u<8H+ literal 0 HcmV?d00001 diff --git a/doc/LectureNotes/_build/jupyter_execute/week41_59_3.png b/doc/LectureNotes/_build/jupyter_execute/week41_59_3.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2c8902f26b17d512d53a6c2e8b355b39c41bdb GIT binary patch literal 17868 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 qty7?dl

+
+ + + + + + + + +
+ + +
+
+ + + +
+ + +
+

Exercises week 41

+

October 4-11, 2024

+

Date: Deadline is Friday October 11 at midnight

+
+
+

Overarching aims of the exercises this week

+

The aim of the exercises this week is to get started with implementing +gradient methods of relevance for project 2. This exercise will also +be continued next week with the addition of automatic differentation. +Everything you develop here will be used in project 2.

+

In order to get started, we will now replace in our standard ordinary +least squares (OLS) and Ridge regression codes (from project 1) the +matrix inversion algorithm with our own gradient descent (GD) and SGD +codes. You can use the Franke function or the terrain data from +project 1. However, we recommend using a simpler function like +\(f(x)=a_0+a_1x+a_2x^2\) or higher-order one-dimensional polynomials. +You can obviously test your final codes against for example the Franke +function. Automatic differentiation will be discussed next week.

+

You should include in your analysis of the GD and SGD codes the following elements

+
    +
  1. A plain gradient descent with a fixed learning rate (you will need to tune it) using the analytical expression of the gradients

  2. +
  3. Add momentum to the plain GD code and compare convergence with a fixed learning rate (you may need to tune the learning rate), again using the analytical expression of the gradients.

  4. +
  5. Repeat these steps for stochastic gradient descent with mini batches and a given number of epochs. Use a tunable learning rate as discussed in the lectures from week 39. Discuss the results as functions of the various parameters (size of batches, number of epochs etc)

  6. +
  7. Implement the Adagrad method in order to tune the learning rate. Do this with and without momentum for plain gradient descent and SGD.

  8. +
  9. Add RMSprop and Adam to your library of methods for tuning the learning rate.

  10. +
+

The lecture notes from weeks 39 and 40 contain more information and code examples. Feel free to use these examples.

+

In summary, you should +perform an analysis of the results for OLS and Ridge regression as +function of the chosen learning rates, the number of mini-batches and +epochs as well as algorithm for scaling the learning rate. You can +also compare your own results with those that can be obtained using +for example Scikit-Learn’s various SGD options. Discuss your +results. For Ridge regression you need now to study the results as functions of the hyper-parameter \(\lambda\) and +the learning rate \(\eta\). Discuss your results.

+

You will need your SGD code for the setup of the Neural Network and +Logistic Regression codes. You will find the Python Seaborn +package +useful when plotting the results as function of the learning rate +\(\eta\) and the hyper-parameter \(\lambda\) when you use Ridge +regression.

+

We recommend reading chapter 8 on optimization from the textbook of Goodfellow, Bengio and Courville. This chapter contains many useful insights and discussions on the optimization part of machine learning.

+
+
+

Code examples from week 39 and 40

+
+

Code with a Number of Minibatches which varies, analytical gradient

+

In the code here we vary the number of mini-batches.

+
+
+
%matplotlib inline
+
+# Importing various packages
+from math import exp, sqrt
+from random import random, seed
+import numpy as np
+import matplotlib.pyplot as plt
+
+n = 100
+x = 2*np.random.rand(n,1)
+y = 4+3*x+np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+# Hessian matrix
+H = (2.0/n)* XT_X
+EigValues, EigVectors = np.linalg.eig(H)
+print(f"Eigenvalues of Hessian Matrix:{EigValues}")
+
+theta = np.random.randn(2,1)
+eta = 1.0/np.max(EigValues)
+Niterations = 1000
+
+
+for iter in range(Niterations):
+    gradients = 2.0/n*X.T @ ((X @ theta)-y)
+    theta -= eta*gradients
+print("theta from own gd")
+print(theta)
+
+xnew = np.array([[0],[2]])
+Xnew = np.c_[np.ones((2,1)), xnew]
+ypredict = Xnew.dot(theta)
+ypredict2 = Xnew.dot(theta_linreg)
+
+n_epochs = 50
+M = 5   #size of each minibatch
+m = int(n/M) #number of minibatches
+t0, t1 = 5, 50
+
+def learning_schedule(t):
+    return t0/(t+t1)
+
+theta = np.random.randn(2,1)
+
+for epoch in range(n_epochs):
+# Can you figure out a better way of setting up the contributions to each batch?
+    for i in range(m):
+        random_index = M*np.random.randint(m)
+        xi = X[random_index:random_index+M]
+        yi = y[random_index:random_index+M]
+        gradients = (2.0/M)* xi.T @ ((xi @ theta)-yi)
+        eta = learning_schedule(epoch*m+i)
+        theta = theta - eta*gradients
+print("theta from own sdg")
+print(theta)
+
+plt.plot(xnew, ypredict, "r-")
+plt.plot(xnew, ypredict2, "b-")
+plt.plot(x, y ,'ro')
+plt.axis([0,2.0,0, 15.0])
+plt.xlabel(r'$x$')
+plt.ylabel(r'$y$')
+plt.title(r'Random numbers ')
+plt.show()
+
+
+
+
+
Own inversion
+[[4.16413938]
+ [2.88594444]]
+Eigenvalues of Hessian Matrix:[0.2965315 4.059181 ]
+theta from own gd
+[[4.16413938]
+ [2.88594444]]
+theta from own sdg
+[[4.11131389]
+ [2.89069029]]
+
+
+_images/exercisesweek41_5_1.png +
+
+

In the above code, we have use replacement in setting up the +mini-batches. The discussion +here may be +useful.

+
+
+

Momentum based GD

+

The stochastic gradient descent (SGD) is almost always used with a +momentum or inertia term that serves as a memory of the direction we +are moving in parameter space. This is typically implemented as +follows

+
+\[ +\mathbf{v}_{t}=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber +\]
+ +
+
+\[ +\begin{equation} +\boldsymbol{\theta}_{t+1}= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +\label{_auto1} \tag{1} +\end{equation} +\]
+

where we have introduced a momentum parameter \(\gamma\), with +\(0\le\gamma\le 1\), and for brevity we dropped the explicit notation to +indicate the gradient is to be taken over a different mini-batch at +each step. We call this algorithm gradient descent with momentum +(GDM). From these equations, it is clear that \(\mathbf{v}_t\) is a +running average of recently encountered gradients and +\((1-\gamma)^{-1}\) sets the characteristic time scale for the memory +used in the averaging procedure. Consistent with this, when +\(\gamma=0\), this just reduces down to ordinary SGD as discussed +earlier. An equivalent way of writing the updates is

+
+\[ +\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +\]
+

where we have defined \(\Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1}\).

+
+
+

Algorithms and codes for Adagrad, RMSprop and Adam

+

The algorithms we have implemented are well described in the text by Goodfellow, Bengio and Courville, chapter 8.

+

The codes which implement these algorithms are discussed after our presentation of automatic differentiation.

+
+
+

Practical tips

+
    +
  • Randomize the data when making mini-batches. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.

  • +
  • Transform your inputs. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.

  • +
  • Monitor the out-of-sample performance. Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This early stopping significantly improves performance in many settings.

  • +
  • Adaptive optimization methods don’t always have good generalization. Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.

  • +
+

Geron’s text, see chapter 11, has several interesting discussions.

+
+
+

Using Automatic differentation with OLS

+

We conclude the part on optmization by showing how we can make codes +for linear regression and logistic regression using autograd. The +first example shows results with ordinary leats squares.

+
+
+
# Using Autograd to calculate gradients for OLS
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+def CostOLS(beta):
+    return (1.0/n)*np.sum((y-X @ beta)**2)
+
+n = 100
+x = 2*np.random.rand(n,1)
+y = 4+3*x+np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+# Hessian matrix
+H = (2.0/n)* XT_X
+EigValues, EigVectors = np.linalg.eig(H)
+print(f"Eigenvalues of Hessian Matrix:{EigValues}")
+
+theta = np.random.randn(2,1)
+eta = 1.0/np.max(EigValues)
+Niterations = 1000
+# define the gradient
+training_gradient = grad(CostOLS)
+
+for iter in range(Niterations):
+    gradients = training_gradient(theta)
+    theta -= eta*gradients
+print("theta from own gd")
+print(theta)
+
+xnew = np.array([[0],[2]])
+Xnew = np.c_[np.ones((2,1)), xnew]
+ypredict = Xnew.dot(theta)
+ypredict2 = Xnew.dot(theta_linreg)
+
+plt.plot(xnew, ypredict, "r-")
+plt.plot(xnew, ypredict2, "b-")
+plt.plot(x, y ,'ro')
+plt.axis([0,2.0,0, 15.0])
+plt.xlabel(r'$x$')
+plt.ylabel(r'$y$')
+plt.title(r'Random numbers ')
+plt.show()
+
+
+
+
+
Own inversion
+[[3.89044267]
+ [3.11620886]]
+Eigenvalues of Hessian Matrix:[0.31812561 4.63042739]
+
+
+
theta from own gd
+[[3.89044267]
+ [3.11620886]]
+
+
+_images/exercisesweek41_16_2.png +
+
+
+
+

Same code but now with momentum gradient descent

+
+
+
# Using Autograd to calculate gradients for OLS
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+def CostOLS(beta):
+    return (1.0/n)*np.sum((y-X @ beta)**2)
+
+n = 100
+x = 2*np.random.rand(n,1)
+y = 4+3*x#+np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+# Hessian matrix
+H = (2.0/n)* XT_X
+EigValues, EigVectors = np.linalg.eig(H)
+print(f"Eigenvalues of Hessian Matrix:{EigValues}")
+
+theta = np.random.randn(2,1)
+eta = 1.0/np.max(EigValues)
+Niterations = 30
+
+# define the gradient
+training_gradient = grad(CostOLS)
+
+for iter in range(Niterations):
+    gradients = training_gradient(theta)
+    theta -= eta*gradients
+    print(iter,gradients[0],gradients[1])
+print("theta from own gd")
+print(theta)
+
+# Now improve with momentum gradient descent
+change = 0.0
+delta_momentum = 0.3
+for iter in range(Niterations):
+    # calculate gradient
+    gradients = training_gradient(theta)
+    # calculate update
+    new_change = eta*gradients+delta_momentum*change
+    # take a step
+    theta -= new_change
+    # save the change
+    change = new_change
+    print(iter,gradients[0],gradients[1])
+print("theta from own gd wth momentum")
+print(theta)
+
+
+
+
+
Own inversion
+[[4.]
+ [3.]]
+Eigenvalues of Hessian Matrix:[0.331075   4.25018094]
+0 [-10.99619572] [-12.63347711]
+1 [-0.06146873] [0.05293756]
+2 [-0.05668052] [0.0488139]
+3 [-0.0522653] [0.04501146]
+4 [-0.048194] [0.04150522]
+5 [-0.04443985] [0.0382721]
+6 [-0.04097813] [0.03529083]
+7 [-0.03778607] [0.03254179]
+8 [-0.03484266] [0.03000689]
+9 [-0.03212854] [0.02766946]
+10 [-0.02962583] [0.0255141]
+11 [-0.02731808] [0.02352663]
+12 [-0.02519009] [0.02169399]
+13 [-0.02322786] [0.0200041]
+14 [-0.02141849] [0.01844584]
+15 [-0.01975006] [0.01700897]
+16 [-0.0182116] [0.01568403]
+17 [-0.01679297] [0.0144623]
+18 [-0.01548486] [0.01333573]
+19 [-0.01427864] [0.01229692]
+20 [-0.01316638] [0.01133903]
+21 [-0.01214076] [0.01045576]
+22 [-0.01119504] [0.00964129]
+23 [-0.01032298] [0.00889027]
+24 [-0.00951885] [0.00819774]
+25 [-0.00877737] [0.00755917]
+26 [-0.00809364] [0.00697033]
+27 [-0.00746317] [0.00642737]
+28 [-0.00688182] [0.0059267]
+29 [-0.00634575] [0.00546503]
+theta from own gd
+[[3.98232596]
+ [3.01522108]]
+0 [-0.00585143] [0.00503932]
+1 [-0.00539563] [0.00464677]
+2 [-0.00483858] [0.00416704]
+3 [-0.00429456] [0.00369852]
+4 [-0.00379682] [0.00326986]
+5 [-0.00335174] [0.00288656]
+6 [-0.00295713] [0.00254671]
+7 [-0.00260839] [0.00224638]
+8 [-0.00230059] [0.00198129]
+9 [-0.00202904] [0.00174743]
+10 [-0.00178952] [0.00154115]
+11 [-0.00157826] [0.00135922]
+12 [-0.00139195] [0.00119876]
+13 [-0.00122762] [0.00105724]
+14 [-0.0010827] [0.00093243]
+15 [-0.00095488] [0.00082235]
+16 [-0.00084215] [0.00072527]
+17 [-0.00074274] [0.00063965]
+18 [-0.00065505] [0.00056414]
+19 [-0.00057772] [0.00049754]
+20 [-0.00050952] [0.0004388]
+21 [-0.00044937] [0.000387]
+22 [-0.00039632] [0.00034132]
+23 [-0.00034953] [0.00030102]
+24 [-0.00030827] [0.00026549]
+25 [-0.00027188] [0.00023414]
+26 [-0.00023978] [0.0002065]
+27 [-0.00021147] [0.00018212]
+28 [-0.00018651] [0.00016062]
+29 [-0.00016449] [0.00014166]
+theta from own gd wth momentum
+[[3.99956181]
+ [3.00037737]]
+
+
+
+
+
+
+

But noen of these can compete with Newton’s method

+
+
+
# Using Newton's method
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+def CostOLS(beta):
+    return (1.0/n)*np.sum((y-X @ beta)**2)
+
+n = 100
+x = 2*np.random.rand(n,1)
+y = 4+3*x+np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x]
+XT_X = X.T @ X
+beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(beta_linreg)
+# Hessian matrix
+H = (2.0/n)* XT_X
+# Note that here the Hessian does not depend on the parameters beta
+invH = np.linalg.pinv(H)
+EigValues, EigVectors = np.linalg.eig(H)
+print(f"Eigenvalues of Hessian Matrix:{EigValues}")
+
+beta = np.random.randn(2,1)
+Niterations = 5
+
+# define the gradient
+training_gradient = grad(CostOLS)
+
+for iter in range(Niterations):
+    gradients = training_gradient(beta)
+    beta -= invH @ gradients
+    print(iter,gradients[0],gradients[1])
+print("beta from own Newton code")
+print(beta)
+
+
+
+
+
Own inversion
+[[3.95845431]
+ [3.1424112 ]]
+Eigenvalues of Hessian Matrix:[0.31758645 4.42644801]
+0 [-17.28364423] [-20.62918713]
+1 [-1.11891833e-14] [-3.34599467e-15]
+2 [4.62954328e-16] [6.26536626e-16]
+3 [-6.85866294e-16] [-8.50258788e-16]
+4 [4.62954328e-16] [6.26536626e-16]
+beta from own Newton code
+[[3.95845431]
+ [3.1424112 ]]
+
+
+
+
+
+
+

Including Stochastic Gradient Descent with Autograd

+

In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using autograd.

+
+
+
# Using Autograd to calculate gradients using SGD
+# OLS example
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+# Note change from previous example
+def CostOLS(y,X,theta):
+    return np.sum((y-X @ theta)**2)
+
+n = 100
+x = 2*np.random.rand(n,1)
+y = 4+3*x+np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+# Hessian matrix
+H = (2.0/n)* XT_X
+EigValues, EigVectors = np.linalg.eig(H)
+print(f"Eigenvalues of Hessian Matrix:{EigValues}")
+
+theta = np.random.randn(2,1)
+eta = 1.0/np.max(EigValues)
+Niterations = 1000
+
+# Note that we request the derivative wrt third argument (theta, 2 here)
+training_gradient = grad(CostOLS,2)
+
+for iter in range(Niterations):
+    gradients = (1.0/n)*training_gradient(y, X, theta)
+    theta -= eta*gradients
+print("theta from own gd")
+print(theta)
+
+xnew = np.array([[0],[2]])
+Xnew = np.c_[np.ones((2,1)), xnew]
+ypredict = Xnew.dot(theta)
+ypredict2 = Xnew.dot(theta_linreg)
+
+plt.plot(xnew, ypredict, "r-")
+plt.plot(xnew, ypredict2, "b-")
+plt.plot(x, y ,'ro')
+plt.axis([0,2.0,0, 15.0])
+plt.xlabel(r'$x$')
+plt.ylabel(r'$y$')
+plt.title(r'Random numbers ')
+plt.show()
+
+n_epochs = 50
+M = 5   #size of each minibatch
+m = int(n/M) #number of minibatches
+t0, t1 = 5, 50
+def learning_schedule(t):
+    return t0/(t+t1)
+
+theta = np.random.randn(2,1)
+
+for epoch in range(n_epochs):
+# Can you figure out a better way of setting up the contributions to each batch?
+    for i in range(m):
+        random_index = M*np.random.randint(m)
+        xi = X[random_index:random_index+M]
+        yi = y[random_index:random_index+M]
+        gradients = (1.0/M)*training_gradient(yi, xi, theta)
+        eta = learning_schedule(epoch*m+i)
+        theta = theta - eta*gradients
+print("theta from own sdg")
+print(theta)
+
+
+
+
+
Own inversion
+[[4.21392756]
+ [2.76329289]]
+Eigenvalues of Hessian Matrix:[0.24999088 4.37057274]
+
+
+
theta from own gd
+[[4.21392756]
+ [2.76329289]]
+
+
+_images/exercisesweek41_22_2.png +
theta from own sdg
+[[4.15847501]
+ [2.79503363]]
+
+
+
+
+
+
+

Same code but now with momentum gradient descent

+
+
+
# Using Autograd to calculate gradients using SGD
+# OLS example
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+# Note change from previous example
+def CostOLS(y,X,theta):
+    return np.sum((y-X @ theta)**2)
+
+n = 100
+x = 2*np.random.rand(n,1)
+y = 4+3*x+np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+# Hessian matrix
+H = (2.0/n)* XT_X
+EigValues, EigVectors = np.linalg.eig(H)
+print(f"Eigenvalues of Hessian Matrix:{EigValues}")
+
+theta = np.random.randn(2,1)
+eta = 1.0/np.max(EigValues)
+Niterations = 100
+
+# Note that we request the derivative wrt third argument (theta, 2 here)
+training_gradient = grad(CostOLS,2)
+
+for iter in range(Niterations):
+    gradients = (1.0/n)*training_gradient(y, X, theta)
+    theta -= eta*gradients
+print("theta from own gd")
+print(theta)
+
+
+n_epochs = 50
+M = 5   #size of each minibatch
+m = int(n/M) #number of minibatches
+t0, t1 = 5, 50
+def learning_schedule(t):
+    return t0/(t+t1)
+
+theta = np.random.randn(2,1)
+
+change = 0.0
+delta_momentum = 0.3
+
+for epoch in range(n_epochs):
+    for i in range(m):
+        random_index = M*np.random.randint(m)
+        xi = X[random_index:random_index+M]
+        yi = y[random_index:random_index+M]
+        gradients = (1.0/M)*training_gradient(yi, xi, theta)
+        eta = learning_schedule(epoch*m+i)
+        # calculate update
+        new_change = eta*gradients+delta_momentum*change
+        # take a step
+        theta -= new_change
+        # save the change
+        change = new_change
+print("theta from own sdg with momentum")
+print(theta)
+
+
+
+
+
Own inversion
+[[4.02970225]
+ [3.04000457]]
+Eigenvalues of Hessian Matrix:[0.28225179 4.44767398]
+theta from own gd
+[[4.02930753]
+ [3.04033524]]
+
+
+
theta from own sdg with momentum
+
+
+
[[4.0292555 ]
+ [3.02413786]]
+
+
+
+
+
+
+

AdaGrad algorithm, taken from Goodfellow et al

+ + +

Figure 1:

+
+
+

Similar (second order function now) problem but now with AdaGrad

+
+
+
# Using Autograd to calculate gradients using AdaGrad and Stochastic Gradient descent
+# OLS example
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+# Note change from previous example
+def CostOLS(y,X,theta):
+    return np.sum((y-X @ theta)**2)
+
+n = 1000
+x = np.random.rand(n,1)
+y = 2.0+3*x +4*x*x
+
+X = np.c_[np.ones((n,1)), x, x*x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+
+
+# Note that we request the derivative wrt third argument (theta, 2 here)
+training_gradient = grad(CostOLS,2)
+# Define parameters for Stochastic Gradient Descent
+n_epochs = 50
+M = 5   #size of each minibatch
+m = int(n/M) #number of minibatches
+# Guess for unknown parameters theta
+theta = np.random.randn(3,1)
+
+# Value for learning rate
+eta = 0.01
+# Including AdaGrad parameter to avoid possible division by zero
+delta  = 1e-8
+for epoch in range(n_epochs):
+    Giter = 0.0
+    for i in range(m):
+        random_index = M*np.random.randint(m)
+        xi = X[random_index:random_index+M]
+        yi = y[random_index:random_index+M]
+        gradients = (1.0/M)*training_gradient(yi, xi, theta)
+        Giter += gradients*gradients
+        update = gradients*eta/(delta+np.sqrt(Giter))
+        theta -= update
+print("theta from own AdaGrad")
+print(theta)
+
+
+
+
+
Own inversion
+[[2.]
+ [3.]
+ [4.]]
+
+
+
theta from own AdaGrad
+[[1.99997644]
+ [3.00011577]
+ [3.99989296]]
+
+
+
+
+

Running this code we note an almost perfect agreement with the results from matrix inversion.

+
+
+

RMSProp algorithm, taken from Goodfellow et al

+ + +

Figure 1:

+
+
+

RMSprop for adaptive learning rate with Stochastic Gradient Descent

+
+
+
# Using Autograd to calculate gradients using RMSprop  and Stochastic Gradient descent
+# OLS example
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+# Note change from previous example
+def CostOLS(y,X,theta):
+    return np.sum((y-X @ theta)**2)
+
+n = 1000
+x = np.random.rand(n,1)
+y = 2.0+3*x +4*x*x# +np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x, x*x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+
+
+# Note that we request the derivative wrt third argument (theta, 2 here)
+training_gradient = grad(CostOLS,2)
+# Define parameters for Stochastic Gradient Descent
+n_epochs = 50
+M = 5   #size of each minibatch
+m = int(n/M) #number of minibatches
+# Guess for unknown parameters theta
+theta = np.random.randn(3,1)
+
+# Value for learning rate
+eta = 0.01
+# Value for parameter rho
+rho = 0.99
+# Including AdaGrad parameter to avoid possible division by zero
+delta  = 1e-8
+for epoch in range(n_epochs):
+    Giter = 0.0
+    for i in range(m):
+        random_index = M*np.random.randint(m)
+        xi = X[random_index:random_index+M]
+        yi = y[random_index:random_index+M]
+        gradients = (1.0/M)*training_gradient(yi, xi, theta)
+	# Accumulated gradient
+	# Scaling with rho the new and the previous results
+        Giter = (rho*Giter+(1-rho)*gradients*gradients)
+	# Taking the diagonal only and inverting
+        update = gradients*eta/(delta+np.sqrt(Giter))
+	# Hadamard product
+        theta -= update
+print("theta from own RMSprop")
+print(theta)
+
+
+
+
+
Own inversion
+[[2.]
+ [3.]
+ [4.]]
+
+
+
theta from own RMSprop
+[[2.00211924]
+ [3.00515889]
+ [4.01229102]]
+
+
+
+
+
+
+

ADAM algorithm, taken from Goodfellow et al

+ + +

Figure 1:

+
+
+

And finally ADAM

+
+
+
# Using Autograd to calculate gradients using RMSprop  and Stochastic Gradient descent
+# OLS example
+from random import random, seed
+import numpy as np
+import autograd.numpy as np
+import matplotlib.pyplot as plt
+from autograd import grad
+
+# Note change from previous example
+def CostOLS(y,X,theta):
+    return np.sum((y-X @ theta)**2)
+
+n = 1000
+x = np.random.rand(n,1)
+y = 2.0+3*x +4*x*x# +np.random.randn(n,1)
+
+X = np.c_[np.ones((n,1)), x, x*x]
+XT_X = X.T @ X
+theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
+print("Own inversion")
+print(theta_linreg)
+
+
+# Note that we request the derivative wrt third argument (theta, 2 here)
+training_gradient = grad(CostOLS,2)
+# Define parameters for Stochastic Gradient Descent
+n_epochs = 50
+M = 5   #size of each minibatch
+m = int(n/M) #number of minibatches
+# Guess for unknown parameters theta
+theta = np.random.randn(3,1)
+
+# Value for learning rate
+eta = 0.01
+# Value for parameters beta1 and beta2, see https://arxiv.org/abs/1412.6980
+beta1 = 0.9
+beta2 = 0.999
+# Including AdaGrad parameter to avoid possible division by zero
+delta  = 1e-7
+iter = 0
+for epoch in range(n_epochs):
+    first_moment = 0.0
+    second_moment = 0.0
+    iter += 1
+    for i in range(m):
+        random_index = M*np.random.randint(m)
+        xi = X[random_index:random_index+M]
+        yi = y[random_index:random_index+M]
+        gradients = (1.0/M)*training_gradient(yi, xi, theta)
+        # Computing moments first
+        first_moment = beta1*first_moment + (1-beta1)*gradients
+        second_moment = beta2*second_moment+(1-beta2)*gradients*gradients
+        first_term = first_moment/(1.0-beta1**iter)
+        second_term = second_moment/(1.0-beta2**iter)
+	# Scaling with rho the new and the previous results
+        update = eta*first_term/(np.sqrt(second_term)+delta)
+        theta -= update
+print("theta from own ADAM")
+print(theta)
+
+
+
+
+
Own inversion
+[[2.]
+ [3.]
+ [4.]]
+
+
+
theta from own ADAM
+[[2.00013955]
+ [2.99942911]
+ [4.00048158]]
+
+
+
+
+
+
+

Introducing JAX

+

Presently, instead of using autograd, we recommend using JAX

+

JAX is Autograd and XLA (Accelerated Linear Algebra)), +brought together for high-performance numerical computing and machine learning research. +It provides composable transformations of Python+NumPy programs: differentiate, vectorize, parallelize, Just-In-Time compile to GPU/TPU, and more.

+
+

Getting started with Jax, note the way we import numpy

+
+
+
import jax
+import jax.numpy as jnp
+import numpy as np
+import matplotlib.pyplot as plt
+
+from jax import grad as jax_grad
+
+
+
+
+
+
+

A warm-up example

+
+
+
def function(x):
+    return x**2
+
+def analytical_gradient(x):
+    return 2*x
+
+def gradient_descent(starting_point, learning_rate, num_iterations, solver="analytical"):
+    x = starting_point
+    trajectory_x = [x]
+    trajectory_y = [function(x)]
+
+    if solver == "analytical":
+        grad = analytical_gradient    
+    elif solver == "jax":
+        grad = jax_grad(function)
+        x = jnp.float64(x)
+        learning_rate = jnp.float64(learning_rate)
+
+    for _ in range(num_iterations):
+        
+        x = x - learning_rate * grad(x)
+        trajectory_x.append(x)
+        trajectory_y.append(function(x))
+
+    return trajectory_x, trajectory_y
+
+x = np.linspace(-5, 5, 100)
+plt.plot(x, function(x), label="f(x)")
+
+descent_x, descent_y = gradient_descent(5, 0.1, 10, solver="analytical")
+jax_descend_x, jax_descend_y = gradient_descent(5, 0.1, 10, solver="jax")
+
+plt.plot(descent_x, descent_y, label="Gradient descent", marker="o")
+plt.plot(jax_descend_x, jax_descend_y, label="JAX", marker="x")
+
+
+
+
+
/Users/mhjensen/miniforge3/envs/myenv/lib/python3.9/site-packages/jax/_src/numpy/lax_numpy.py:173: UserWarning: Explicitly requested dtype float64 requested in asarray is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.
+  return asarray(x, dtype=self.dtype)
+
+
+
[<matplotlib.lines.Line2D at 0x124b30190>]
+
+
+_images/exercisesweek41_39_2.png +
+
+
+
+

A more advanced example

+
+
+
backend = np
+
+def function(x):
+    return x*backend.sin(x**2 + 1)
+
+def analytical_gradient(x):
+    return backend.sin(x**2 + 1) + 2*x**2*backend.cos(x**2 + 1)
+
+
+x = np.linspace(-5, 5, 100)
+plt.plot(x, function(x), label="f(x)")
+
+descent_x, descent_y = gradient_descent(1, 0.01, 300, solver="analytical")
+
+# Change the backend to JAX
+backend = jnp
+jax_descend_x, jax_descend_y = gradient_descent(1, 0.01, 300, solver="jax")
+
+plt.scatter(descent_x, descent_y, label="Gradient descent", marker="v", s=10, color="red") 
+plt.scatter(jax_descend_x, jax_descend_y, label="JAX", marker="x", s=5, color="black")
+
+
+
+
+
<matplotlib.collections.PathCollection at 0x124b96d60>
+
+
+_images/exercisesweek41_41_1.png +
+
+
+
+
+ + + + +
+ + + + + +
+
+ +
+ + +
+