1409 lines
203 KiB
Plaintext
1409 lines
203 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "b18bcd06",
|
|
"metadata": {},
|
|
"source": [
|
|
"<!-- HTML file automatically generated from DocOnce source (https://github.com/doconce/doconce/)\n",
|
|
"doconce format html exercisesweek41.do.txt -->\n",
|
|
"<!-- dom:TITLE: Exercises week 41 -->"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "7542d6aa",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Exercises week 41\n",
|
|
"**October 4-11, 2024**\n",
|
|
"\n",
|
|
"Date: **Deadline is Friday October 11 at midnight**"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "80943a15",
|
|
"metadata": {},
|
|
"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": "2095d197",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Code examples from week 39 and 40"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f428decb",
|
|
"metadata": {},
|
|
"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": "ba38d454",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Own inversion\n",
|
|
"[[3.72796854]\n",
|
|
" [3.26269704]]\n",
|
|
"Eigenvalues of Hessian Matrix:[0.26876494 4.16606994]\n",
|
|
"theta from own gd\n",
|
|
"[[3.72796854]\n",
|
|
" [3.26269704]]\n",
|
|
"theta from own sdg\n",
|
|
"[[3.70521262]\n",
|
|
" [3.29966563]]\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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6tmzJ4QQTh9/+PBh7xWGiIiIVEfWHaiJiIiIvI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlVjMERERESqxmCIiIiIVI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlVjMERERESqxmCIiIiIVI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlVjMERERESqxmCIiIiIVI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlVjMERERESqxmCIiIiIVI3BEBEREakagyEiIiJSNQZDREREpGoMhoiIiEjVGAwRERGRqjEYIiIiIlXzezC0bt06DBo0CImJiZAkCcuWLbPsu3r1KiZMmIAOHTqgbt26SExMxMMPP4zjx4/7r8BEREQUUPweDBUXFyMtLQ2zZs2qsq+kpARbtmzBSy+9hC1btiA7Oxv79u3D3Xff7YeSEhERUSCShBDC34UwkyQJS5cuxZAhQ+wes3nzZnTu3BlHjhxBo0aNnDpvUVERIiMjodfrERER4aHSEhERkTf56vkd4rUze4ler4ckSahfv77dY8rKylBWVmb5uqioyAclIyIiIiXye5rMFaWlpZgwYQJGjBhRbYSYlZWFyMhIy0uj0fiwlERERKQkigmGrl69iuHDh0MIgQ8++KDaYydNmgS9Xm95FRQU+KiUREREpDSKSJOZA6EjR45gzZo1DvOGYWFhCAsL81HpiIiISMlkHwyZA6EDBw4gJycHDRs29HeRiIiIKID4PRi6fPky8vLyLF/n5+dj69atiIqKQkJCAoYNG4YtW7bg22+/hcFgwMmTJwEAUVFRCA0N9VexiYiIKED4fWh9bm4uevXqVWX7yJEj8corryAlJcXm+3JyctCzZ0+nPoND64mIiJRHNUPre/bsieriMRlNg0REREQBSDGjyYiIiIi8gcEQERERqRqDISIiIlI1BkNERESkagyGiIiISNUYDBEREZGqMRgiIiIiVWMwRERERKrGYIiIiIhUjcEQERERqRqDISIiIlI1v69NRkRENWAwAOvXAydOAAkJQPfuQHCwv0tFpCgMhoiIlCo7G3juOeDYsevbkpOBd98FMjL8Vy4ihWGajIhIibKzgWHD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0aPa44UwTTGQkJAgQkNDRVJSkrj33ntFXl6ebyvmgKv1njZtmmjWrJkIDw8XUVFRomfPnmLNmjVVzhto91sI03Dx2rVriw8//NDmOZVwv23VGYDVz6y/nuHStQISERERqZKi+gwREREReRqDISIiIlI1BkNERESkagyGiIiISNUYDBEREZGqMRgiIiIiVWMwRERERKrGYIiIiIhUjcEQERERqRqDISIiIlI1BkNEpEgLFy5E7dq1ceLECcu20aNHIzU1FXq93o8lIyKl4dpkRKRIQgikp6fjtttuw3vvvYfJkyfj008/xcaNG5GUlOTv4hGRgoT4uwBERO6QJAmvv/46hg0bhvj4eLz33ntYv349AyEichlbhohI0W688Ubs2rULP/74I3r06OHv4hCRArHPEBEp1ooVK7B3714YDAbExcX5uzhEpFBsGSIiRdqyZQt69uyJuXPnYv78+YiIiMDixYv9XSwiUiD2GSIixTl8+DAGDhyIf/3rXxgxYgSaNm2Krl27YsuWLbjxxhv9XTwiUhi2DBGRopw/fx633HILevbsiTlz5li2Dxw4EAaDAStWrPBj6YhIiRgMERERkaqxAzURERGpGoMhIiIiUjUGQ0RERKRqDIaIiIhI1RgMERERkaoxGCIiIiJVYzBEREREqsZgiIiIiFSNwRARERGpGoMhIiIiUjUGQ0RERKRqDIaIiIhI1f4fkCJAqyCjUaAAAAAASUVORK5CYII=",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"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",
|
|
"#while (iter <= Ni... or test)\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": "de04b41a",
|
|
"metadata": {},
|
|
"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": "77fc1cca",
|
|
"metadata": {},
|
|
"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": "441d1f36",
|
|
"metadata": {},
|
|
"source": [
|
|
"$$\n",
|
|
"\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n",
|
|
"$$"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "47434945",
|
|
"metadata": {},
|
|
"source": [
|
|
"<!-- Equation labels as ordinary links -->\n",
|
|
"<div id=\"_auto1\"></div>\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": "f3ea5060",
|
|
"metadata": {},
|
|
"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": "923628c8",
|
|
"metadata": {},
|
|
"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": "5c94031c",
|
|
"metadata": {},
|
|
"source": [
|
|
"where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f3f0e9c9",
|
|
"metadata": {},
|
|
"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": "92253eff",
|
|
"metadata": {},
|
|
"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": "08209015",
|
|
"metadata": {},
|
|
"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": "f1f7d4aa",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Own inversion\n",
|
|
"[[3.89549614]\n",
|
|
" [2.9788957 ]]\n",
|
|
"Eigenvalues of Hessian Matrix:[0.34210288 4.43495138]\n",
|
|
"theta from own gd\n",
|
|
"[[3.89549614]\n",
|
|
" [2.9788957 ]]\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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Pny4tUfhsccew5gxY3D69Gl8/PHHWL16NZKTkzF//nwsWrQIOTk5Hr3GoEGDsGjRIrz88st48cUXkZSUhDlz5mDFihU25wwKCsJ3332HKVOm4JtvvsGcOXPQvHlzvP3225g8ebI8FyyTKVOm4Ny5c1i8eDG+/fZbDB48GN9//z2io6O98np///vf8euvvyIzMxNFRUXo168fPvzwQ9SuXdt6TFpaGrZs2YLXX38dH3zwAa5cuYKYmBh0794dTzzxhNPXSEhIwKhRo7B+/Xr8+9//RkhICNq2bYtvv/0Wd999t1euiygQScIXWZNERERECsWcISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJqmiTpDJpMJJ0+eRN26dR2uUURERETKIoRAUVER4uLiEBTkvf4bTQRDJ0+erLIqNhEREalDfn4+4uPjvXZ+TQRDlgUk8/PzERER4efWEBERkSsKCwuRkJBgsxC0N2giGLIMjUVERDAYIiIiUhlvp7gwgZqIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0ze/B0KZNmzBkyBDExcVBkiQsX77c4bFPPvkkJEnCjBkzfNY+IiIiCmx+D4aKi4vRsWNHzJo1q9rjli1bhq1btyIuLs5HLSMiIiItCPF3AwYPHozBgwdXe8yJEycwYcIErF69GhkZGT5qGREREWmB33uGnDGZTHjooYfw/PPPIyUlxd/NISIiogDj954hZ958802EhITg2Wefdfk5ZWVlKCsrs35dWFjojaYRERFRAFB0z9DPP/+M9957D3PnzoUkSS4/LzMzE5GRkdZHQkKCF1tJREREaqboYGjz5s04e/YsmjZtipCQEISEhODYsWOYPHkymjdv7vB5L774IgoKCqyP/Px83zWaiIiIVEXRw2QPPfQQ0tPTbbYNHDgQDz30EMaOHevweTqdDjqdztvNIyIiogDg92DoypUrOHz4sPXrvLw87Nq1C1FRUWjatCkaNGhgc3ytWrUQExODNm3a+LqpREREFID8Hgz997//Rd++fa1fP/fccwCA0aNHY+7cuX5qFREREWmF34OhtLQ0CCFcPv7o0aPeawwRERFpjqITqImIiIi8jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTWMwRERERJrGYIiIiIg0jcEQERERaRqDISIiItI0BkNERESkaQyGiIiISNMYDBEREZGmMRgiIiIiTfN7MLRp0yYMGTIEcXFxkCQJy5cvt+4rLy/HCy+8gPbt26NOnTqIi4vDww8/jJMnT/qvwURERBRQ/B4MFRcXo2PHjpg1a1aVfSUlJdi5cydeeeUV7Ny5E0uXLsXBgwfxpz/9yQ8tJSIiokAkCSGEvxthIUkSli1bhmHDhjk8ZseOHejWrRuOHTuGpk2bunTewsJCREZGoqCgABERETK1loiIiLzJV/fvEK+d2UsKCgogSRLq1avn8JiysjKUlZVZvy4sLPRBy4iIiEiN/D5M5o7S0lK88MILGDVqVLURYmZmJiIjI62PhIQEH7aSiIiI1EQ1wVB5eTlGjhwJIQQ++uijao998cUXUVBQYH3k5+f7qJVERESkNqoYJrMEQseOHcOGDRucjhvqdDrodDoftY6IiIjUTPHBkCUQys3NRXZ2Nho0aODvJhEREVEA8XswdOXKFRw+fNj6dV5eHnbt2oWoqCjExsZixIgR2LlzJwwGA4xGI06fPg0AiIqKQmhoqL+aTURERAHC71Prc3Jy0Ldv3yrbR48ejVdffRWJiYl2n5ednY20tDSXXoNT64mIiNRHM1Pr09LSUF08pqAySERERBSAVDObjIiIiMgbGAwRERGRpvl9mIyIiIhUzGgENm8GTp0CYmOB3r2B4GB/t8otDIaIiIjIM0uXAhMnAsePX98WHw+89x4wfLj/2uUmDpMRERGR+5YuBUaMsA2EAODECfP2pUv90y4PMBgiIiIi9xiN5h4hezO+LdsmTTIfpwIMhoiIiMg9mzdX7RGq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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"filenames": {
|
|
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/exercisesweek41_16_1.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": "1bc83f33",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Same code but now with momentum gradient descent"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "dc2a3f65",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Own inversion\n",
|
|
"[[4.]\n",
|
|
" [3.]]\n",
|
|
"Eigenvalues of Hessian Matrix:[0.35622964 3.83344349]\n",
|
|
"0 [-10.84597523] [-10.53597191]\n",
|
|
"1 [-0.41603353] [0.39392645]\n",
|
|
"2 [-0.37737287] [0.35732012]\n",
|
|
"3 [-0.34230481] [0.32411551]\n",
|
|
"4 [-0.31049552] [0.29399649]\n",
|
|
"5 [-0.28164216] [0.26667634]\n",
|
|
"6 [-0.25547006] [0.24189496]\n",
|
|
"7 [-0.23173004] [0.21941643]\n",
|
|
"8 [-0.21019611] [0.19902677]\n",
|
|
"9 [-0.19066326] [0.18053184]\n",
|
|
"10 [-0.17294553] [0.1637556]\n",
|
|
"11 [-0.15687426] [0.14853831]\n",
|
|
"12 [-0.14229643] [0.13473512]\n",
|
|
"13 [-0.12907328] [0.12221462]\n",
|
|
"14 [-0.11707891] [0.11085761]\n",
|
|
"15 [-0.10619914] [0.10055596]\n",
|
|
"16 [-0.0963304] [0.09121162]\n",
|
|
"17 [-0.08737872] [0.08273561]\n",
|
|
"18 [-0.0792589] [0.07504726]\n",
|
|
"19 [-0.07189362] [0.06807336]\n",
|
|
"20 [-0.06521278] [0.06174752]\n",
|
|
"21 [-0.05915276] [0.05600952]\n",
|
|
"22 [-0.05365588] [0.05080473]\n",
|
|
"23 [-0.04866982] [0.04608361]\n",
|
|
"24 [-0.04414708] [0.04180121]\n",
|
|
"25 [-0.04004464] [0.03791676]\n",
|
|
"26 [-0.03632342] [0.03439327]\n",
|
|
"27 [-0.032948] [0.03119722]\n",
|
|
"28 [-0.02988625] [0.02829816]\n",
|
|
"29 [-0.02710901] [0.0256685]\n",
|
|
"theta from own gd\n",
|
|
"[[3.93097189]\n",
|
|
" [3.06536011]]\n",
|
|
"0 [-0.02458986] [0.02328321]\n",
|
|
"1 [-0.0223048] [0.02111958]\n",
|
|
"2 [-0.01954657] [0.01850791]\n",
|
|
"3 [-0.0169027] [0.01600453]\n",
|
|
"4 [-0.01453883] [0.01376627]\n",
|
|
"5 [-0.01247862] [0.01181553]\n",
|
|
"6 [-0.01070096] [0.01013233]\n",
|
|
"7 [-0.00917325] [0.00868581]\n",
|
|
"8 [-0.0078625] [0.00744471]\n",
|
|
"9 [-0.00673864] [0.00638056]\n",
|
|
"10 [-0.00577528] [0.00546839]\n",
|
|
"11 [-0.00494959] [0.00468658]\n",
|
|
"12 [-0.00424194] [0.00401653]\n",
|
|
"13 [-0.00363545] [0.00344227]\n",
|
|
"14 [-0.00311567] [0.00295011]\n",
|
|
"15 [-0.00267021] [0.00252832]\n",
|
|
"16 [-0.00228844] [0.00216684]\n",
|
|
"17 [-0.00196125] [0.00185703]\n",
|
|
"18 [-0.00168084] [0.00159152]\n",
|
|
"19 [-0.00144052] [0.00136398]\n",
|
|
"20 [-0.00123456] [0.00116896]\n",
|
|
"21 [-0.00105805] [0.00100183]\n",
|
|
"22 [-0.00090678] [0.00085859]\n",
|
|
"23 [-0.00077713] [0.00073584]\n",
|
|
"24 [-0.00066602] [0.00063063]\n",
|
|
"25 [-0.0005708] [0.00054047]\n",
|
|
"26 [-0.00048919] [0.00046319]\n",
|
|
"27 [-0.00041925] [0.00039697]\n",
|
|
"28 [-0.0003593] [0.00034021]\n",
|
|
"29 [-0.00030793] [0.00029157]\n",
|
|
"theta from own gd wth momentum\n",
|
|
"[[3.99925917]\n",
|
|
" [3.00070146]]\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": "0ef007d0",
|
|
"metadata": {},
|
|
"source": [
|
|
"## But noen of these can compete with Newton's method"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"id": "0e498aa4",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Own inversion\n",
|
|
"[[3.86751196]\n",
|
|
" [3.13877544]]\n",
|
|
"Eigenvalues of Hessian Matrix:[0.29322629 4.30627615]\n",
|
|
"0 [-14.05912765] [-16.736807]\n",
|
|
"1 [-2.16077156e-14] [-1.19631285e-14]\n",
|
|
"2 [-1.70002901e-16] [-1.23687362e-16]\n",
|
|
"3 [-1.70002901e-16] [-1.23687362e-16]\n",
|
|
"4 [-1.70002901e-16] [-1.23687362e-16]\n",
|
|
"beta from own Newton code\n",
|
|
"[[3.86751196]\n",
|
|
" [3.13877544]]\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": "40292cf3",
|
|
"metadata": {},
|
|
"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": "fa819b9d",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Own inversion\n",
|
|
"[[3.90340018]\n",
|
|
" [3.20732292]]\n",
|
|
"Eigenvalues of Hessian Matrix:[0.30252911 4.09446058]\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"theta from own gd\n",
|
|
"[[3.90340018]\n",
|
|
" [3.20732292]]\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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gyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKJvlgaMqUKbjmmmvQpEkTREVFYcSIEdi7d6+vi0VERER+QvLB0Lp16/D4449j8+bNWLVqFSorK3HTTTehrKzM10UjIiIiP6ASQghfF8IZp0+fRlRUFNatW4f+/fs79Jni4mJERESgqKgI4eHhHi4hERERuYO3nt+ym6i1qKgIABAZGWlzm4qKClRUVFjeFxcXe7xcREREJE+Sbya7nNFoxIQJE3DdddchOTnZ5nZTpkxBRESE5aXRaLxYSiIiIpITWTWTPfbYY/j555+xceNGxMfH29yurpohjUbDZjIiIiIZYTNZDePHj8eyZcuwfv36egMhAFCr1VCr1V4qGREREcmZ5IMhIQSeeOIJ6PV6ZGdnIyEhwddFIiIiIj8i+WDo8ccfx7x587BkyRI0adIEJ06cAABEREQgNDTUx6UjIiIiuZN8zpBKpapz+dy5c3Hfffc5tA92rSciIpIf5gz9Q+KxGhEREcmcrLrWExEREbkbgyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKxmCIiIiIFI3BEBERESkagyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKxmCIiIiIFI3BEBERESkagyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKxmCIiIiIFI3BEBERESkagyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkVjMERERESKxmCIiIiIFI3BEBERESkagyEiIiJSNAZDREREpGgMhoiIiEjRGAwRERGRojEYIiIiIkWTTTA0a9YstG3bFiEhIejVqxd+++03XxeJiIiI/IAsgqHvvvsOzzzzDCZPnoycnBx07doVgwYNwqlTp3xdNCIiIpI5WQRD7777Lh566CGMGzcOSUlJmD17Nho3bowvvvjC10UjIiIimZN8MHTp0iX88ccfSE9PtywLCAhAeno6Nm3a5MOSERERkT8I8nUB7Dlz5gwMBgOio6OtlkdHR2PPnj11fqaiogIVFRWW90VFRQCA4uJizxWUiIiI3Mr83BZCePQ4kg+GXDFlyhS89tprtZZrNBoflIaIiIgaorCwEBER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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"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"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"\n",
|
|
"[[3.86364839]\n",
|
|
" [3.23799188]]\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": "2ca466b4",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Same code but now with momentum gradient descent"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "0d44a49c",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Own inversion\n",
|
|
"[[4.38463079]\n",
|
|
" [2.57169626]]\n",
|
|
"Eigenvalues of Hessian Matrix:[0.27355018 4.06502525]\n",
|
|
"theta from own gd\n",
|
|
"[[4.38343773]\n",
|
|
" [2.57278714]]\n",
|
|
"theta from own sdg with momentum\n",
|
|
"[[4.35254442]\n",
|
|
" [2.58244397]]\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": "b82627f6",
|
|
"metadata": {},
|
|
"source": [
|
|
"## AdaGrad algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n",
|
|
"\n",
|
|
"<!-- dom:FIGURE: [figures/adagrad.png, width=600 frac=0.8] -->\n",
|
|
"<!-- begin figure -->\n",
|
|
"\n",
|
|
"<img src=\"figures/adagrad.png\" width=\"600\"><p style=\"font-size: 0.9em\"><i>Figure 1: </i></p>\n",
|
|
"<!-- end figure -->"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "00d3aff0",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Similar (second order function now) problem but now with AdaGrad"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "6b85aacc",
|
|
"metadata": {},
|
|
"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",
|
|
"[[2.0000375 ]\n",
|
|
" [2.99981967]\n",
|
|
" [4.00017395]]\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": "d8ddde38",
|
|
"metadata": {},
|
|
"source": [
|
|
"Running this code we note an almost perfect agreement with the results from matrix inversion."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "ff15b503",
|
|
"metadata": {},
|
|
"source": [
|
|
"## RMSProp algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n",
|
|
"\n",
|
|
"<!-- dom:FIGURE: [figures/rmsprop.png, width=600 frac=0.8] -->\n",
|
|
"<!-- begin figure -->\n",
|
|
"\n",
|
|
"<img src=\"figures/rmsprop.png\" width=\"600\"><p style=\"font-size: 0.9em\"><i>Figure 1: </i></p>\n",
|
|
"<!-- end figure -->"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "66f96d12",
|
|
"metadata": {},
|
|
"source": [
|
|
"## RMSprop for adaptive learning rate with Stochastic Gradient Descent"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "888f1b4e",
|
|
"metadata": {},
|
|
"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",
|
|
"[[1.99998686]\n",
|
|
" [2.9995237 ]\n",
|
|
" [4.00046845]]\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": "2e0860f7",
|
|
"metadata": {},
|
|
"source": [
|
|
"## ADAM algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n",
|
|
"\n",
|
|
"<!-- dom:FIGURE: [figures/adam.png, width=600 frac=0.8] -->\n",
|
|
"<!-- begin figure -->\n",
|
|
"\n",
|
|
"<img src=\"figures/adam.png\" width=\"600\"><p style=\"font-size: 0.9em\"><i>Figure 1: </i></p>\n",
|
|
"<!-- end figure -->"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "ab4a9859",
|
|
"metadata": {},
|
|
"source": [
|
|
"## And finally [ADAM](https://arxiv.org/pdf/1412.6980.pdf)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"id": "ccdd4d77",
|
|
"metadata": {},
|
|
"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",
|
|
"[[1.99990776]\n",
|
|
" [3.0005044 ]\n",
|
|
" [3.99956442]]\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": "25ac988c",
|
|
"metadata": {},
|
|
"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": "37d556d0",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Getting started with Jax, note the way we import numpy"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "5b81d6e4",
|
|
"metadata": {},
|
|
"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": "c42db672",
|
|
"metadata": {},
|
|
"source": [
|
|
"### A warm-up example"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"id": "98eb2f26",
|
|
"metadata": {},
|
|
"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": [
|
|
"[<matplotlib.lines.Line2D at 0x11edfa8b0>]"
|
|
]
|
|
},
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"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": "8a5f19b5",
|
|
"metadata": {},
|
|
"source": [
|
|
"### A more advanced example"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "d8f5eb38",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"<matplotlib.collections.PathCollection at 0x11ef1aac0>"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
},
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"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": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.9.15"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
} |