Files
FYS-STK4155/doc/pub/week39/ipynb/week39.ipynb
T
Morten Hjorth-Jensen 33eaaa3595 update
2021-11-25 23:18:45 +01:00

2895 lines
405 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"id": "27989178",
"metadata": {},
"source": [
"<!-- HTML file automatically generated from DocOnce source (https://github.com/doconce/doconce/)\n",
"doconce format html week39.do.txt --no_mako -->\n",
"<!-- dom:TITLE: Week 39: Optimization and Gradient Methods -->"
]
},
{
"cell_type": "markdown",
"id": "1deb5178",
"metadata": {},
"source": [
"# Week 39: Optimization and Gradient Methods\n",
"**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n",
"\n",
"Date: **Nov 3, 2021**\n",
"\n",
"Copyright 1999-2021, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license"
]
},
{
"cell_type": "markdown",
"id": "59210b98",
"metadata": {},
"source": [
"## Plan for week 39\n",
"\n",
"* Thursday: Repetition of Logistic regression equations and classification problems and discussion of Gradient methods. Discussion of project 1 and examples on how to implement Logistic Regression\n",
"\n",
"* [Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK3155/h21/forelesningsvideoer/LectureSeptember30.mp4?vrtx=view-as-webpage)\n",
"\n",
"* Friday: Stochastic Gradient descent with examples and automatic differentiation\n",
"\n",
"* [Video of Lecture](https://www.uio.no/studier/emner/matnat/fys/FYS-STK3155/h21/forelesningsvideoer/LectureOctober1.mp4?vrtx=view-as-webpage)\n",
"\n",
"* Reading recommendations:\n",
"\n",
"See [lecture notes for week 39](https://compphysics.github.io/MachineLearning/doc/web/course.html).\n",
"For a good discussion on gradient methods, see Goodfellow et al section 4.3-4.5 and chapter 8. We will come back to the latter chapter in our discussion of Neural networks as well.\n",
"\n",
"**For project 1, chapter 5 of Goodfellow et al is a good read, in particular sections 5.1-5.55 and 5.7-5.11**.\n",
"These sections summarize neatly what we have done till now and point to what is coming with respect to deep learning."
]
},
{
"cell_type": "markdown",
"id": "b70375c6",
"metadata": {},
"source": [
"## Thursday September 30\n",
"\n",
"[Overview Video, why do we care about gradient methods?](https://www.uio.no/studier/emner/matnat/fys/FYS-STK3155/h20/forelesningsvideoer/OverarchingAimsWeek39.mp4?vrtx=view-as-webpage)"
]
},
{
"cell_type": "markdown",
"id": "83e12c9e",
"metadata": {},
"source": [
"## Searching for Optimal Regularization Parameters $\\lambda$\n",
"\n",
"In project 1, when using Ridge and Lasso regression, we end up\n",
"searching for the optimal parameter $\\lambda$ which minimizes our\n",
"selected scores (MSE or $R2$ values for example). The brute force\n",
"approach, as discussed in the code here for Ridge regression, consists\n",
"in evaluating the MSE as function of different $\\lambda$ values.\n",
"Based on these calculations, one tries then to determine the value of the hyperparameter $\\lambda$\n",
"which results in optimal scores (for example the smallest MSE or an $R2=1$)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "8cc00952",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn import linear_model\n",
"\n",
"def MSE(y_data,y_model):\n",
" n = np.size(y_model)\n",
" return np.sum((y_data-y_model)**2)/n\n",
"# A seed just to ensure that the random numbers are the same for every run.\n",
"# Useful for eventual debugging.\n",
"np.random.seed(2021)\n",
"\n",
"n = 100\n",
"x = np.random.rand(n)\n",
"y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.randn(n)\n",
"\n",
"Maxpolydegree = 5\n",
"X = np.zeros((n,Maxpolydegree-1))\n",
"\n",
"for degree in range(1,Maxpolydegree): #No intercept column\n",
" X[:,degree-1] = x**(degree)\n",
"\n",
"# We split the data in test and training data\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",
"\n",
"# Decide which values of lambda to use\n",
"nlambdas = 500\n",
"MSERidgePredict = np.zeros(nlambdas)\n",
"lambdas = np.logspace(-4, 2, nlambdas)\n",
"for i in range(nlambdas):\n",
" lmb = lambdas[i]\n",
" RegRidge = linear_model.Ridge(lmb)\n",
" RegRidge.fit(X_train,y_train)\n",
" ypredictRidge = RegRidge.predict(X_test)\n",
" MSERidgePredict[i] = MSE(y_test,ypredictRidge)\n",
"\n",
"# Now plot the results\n",
"plt.figure()\n",
"plt.plot(np.log10(lambdas), MSERidgePredict, 'g--', label = 'MSE SL Ridge Test')\n",
"plt.xlabel('log10(lambda)')\n",
"plt.ylabel('MSE')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "c2e91e0f",
"metadata": {},
"source": [
"Here we have performed a rather data greedy calculation as function of the regularization parameter $\\lambda$. There is no resampling here. The latter can easily be added by employing the function **RidgeCV** instead of just calling the **Ridge** function. For **RidgeCV** we need to pass the array of $\\lambda$ values.\n",
"By inspecting the figure we can in turn determine which is the optimal regularization parameter.\n",
"This becomes however less functional in the long run."
]
},
{
"cell_type": "markdown",
"id": "3469cb13",
"metadata": {},
"source": [
"## Grid Search\n",
"\n",
"An alternative is to use the so-called grid search functionality\n",
"included with the library **Scikit-Learn**, as demonstrated for the same\n",
"example here."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "183fbef5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GridSearchCV(estimator=Ridge(),\n",
" param_grid={'alpha': array([1.00000000e-04, 4.64158883e-04, 2.15443469e-03, 1.00000000e-02,\n",
" 4.64158883e-02, 2.15443469e-01, 1.00000000e+00, 4.64158883e+00,\n",
" 2.15443469e+01, 1.00000000e+02])})\n",
"Best estimated lambda-value: 100.0\n",
"MSE score: 1.0892144853354966\n",
"R2 score: -0.0038332550504751595\n"
]
}
],
"source": [
"import numpy as np\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import Ridge\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"def R2(y_data, y_model):\n",
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)\n",
"\n",
"def MSE(y_data,y_model):\n",
" n = np.size(y_model)\n",
" return np.sum((y_data-y_model)**2)/n\n",
"\n",
"# A seed just to ensure that the random numbers are the same for every run.\n",
"# Useful for eventual debugging.\n",
"np.random.seed(2021)\n",
"\n",
"n = 100\n",
"x = np.random.rand(n)\n",
"y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.randn(n)\n",
"\n",
"Maxpolydegree = 5\n",
"X = np.zeros((n,Maxpolydegree-1))\n",
"\n",
"for degree in range(1,Maxpolydegree): #No intercept column\n",
" X[:,degree-1] = x**(degree)\n",
"\n",
"# We split the data in test and training data\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",
"\n",
"# Decide which values of lambda to use\n",
"nlambdas = 10\n",
"lambdas = np.logspace(-4, 2, nlambdas)\n",
"# create and fit a ridge regression model, testing each alpha\n",
"model = Ridge()\n",
"gridsearch = GridSearchCV(estimator=model, param_grid=dict(alpha=lambdas))\n",
"gridsearch.fit(X_train, y_train)\n",
"print(gridsearch)\n",
"ypredictRidge = gridsearch.predict(X_test)\n",
"# summarize the results of the grid search\n",
"print(f\"Best estimated lambda-value: {gridsearch.best_estimator_.alpha}\")\n",
"print(f\"MSE score: {MSE(y_test,ypredictRidge)}\")\n",
"print(f\"R2 score: {R2(y_test,ypredictRidge)}\")"
]
},
{
"cell_type": "markdown",
"id": "fbd82e6a",
"metadata": {},
"source": [
"By default the grid search function includes cross validation with\n",
"five folds. The [Scikit-Learn\n",
"documentation](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV)\n",
"contains more information on how to set the different parameters.\n",
"\n",
"If we take out the random noise, running the above codes results in $\\lambda=0$ yielding the best fit."
]
},
{
"cell_type": "markdown",
"id": "d90912a2",
"metadata": {},
"source": [
"## Randomized Grid Search\n",
"\n",
"An alternative to the above manual grid set up, is to use a random\n",
"search where the parameters are tuned from a random distribution\n",
"(uniform below) for a fixed number of iterations. A model is\n",
"constructed and evaluated for each combination of chosen parameters.\n",
"We repeat the previous example but now with a random search. Note\n",
"that values of $\\lambda$ are now limited to be within $x\\in\n",
"[0,1]$. This domain may not be the most relevant one for the specific\n",
"case under study."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "031a0009",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"RandomizedSearchCV(estimator=Ridge(), n_iter=100,\n",
" param_distributions={'alpha': <scipy.stats._distn_infrastructure.rv_frozen object at 0x11bb32d00>})\n",
"Best estimated lambda-value: 0.9849967686928113\n",
"MSE score: 1.0853136633465323\n",
"R2 score: -0.00023821028447734705\n"
]
}
],
"source": [
"import numpy as np\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.linear_model import Ridge\n",
"from sklearn.model_selection import GridSearchCV\n",
"from scipy.stats import uniform as randuniform\n",
"from sklearn.model_selection import RandomizedSearchCV\n",
"\n",
"\n",
"def R2(y_data, y_model):\n",
" return 1 - np.sum((y_data - y_model) ** 2) / np.sum((y_data - np.mean(y_data)) ** 2)\n",
"\n",
"def MSE(y_data,y_model):\n",
" n = np.size(y_model)\n",
" return np.sum((y_data-y_model)**2)/n\n",
"\n",
"# A seed just to ensure that the random numbers are the same for every run.\n",
"# Useful for eventual debugging.\n",
"np.random.seed(2021)\n",
"\n",
"n = 100\n",
"x = np.random.rand(n)\n",
"y = np.exp(-x**2) + 1.5 * np.exp(-(x-2)**2)+ np.random.randn(n)\n",
"\n",
"Maxpolydegree = 5\n",
"X = np.zeros((n,Maxpolydegree-1))\n",
"\n",
"for degree in range(1,Maxpolydegree): #No intercept column\n",
" X[:,degree-1] = x**(degree)\n",
"\n",
"# We split the data in test and training data\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n",
"\n",
"param_grid = {'alpha': randuniform()}\n",
"# create and fit a ridge regression model, testing each alpha\n",
"model = Ridge()\n",
"gridsearch = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100)\n",
"gridsearch.fit(X_train, y_train)\n",
"print(gridsearch)\n",
"ypredictRidge = gridsearch.predict(X_test)\n",
"# summarize the results of the grid search\n",
"print(f\"Best estimated lambda-value: {gridsearch.best_estimator_.alpha}\")\n",
"print(f\"MSE score: {MSE(y_test,ypredictRidge)}\")\n",
"print(f\"R2 score: {R2(y_test,ypredictRidge)}\")"
]
},
{
"cell_type": "markdown",
"id": "2dae05d8",
"metadata": {},
"source": [
"## Optimization, the central part of any Machine Learning algortithm\n",
"\n",
"Almost every problem in machine learning and data science starts with\n",
"a dataset $X$, a model $g(\\beta)$, which is a function of the\n",
"parameters $\\beta$ and a cost function $C(X, g(\\beta))$ that allows\n",
"us to judge how well the model $g(\\beta)$ explains the observations\n",
"$X$. The model is fit by finding the values of $\\beta$ that minimize\n",
"the cost function. Ideally we would be able to solve for $\\beta$\n",
"analytically, however this is not possible in general and we must use\n",
"some approximative/numerical method to compute the minimum."
]
},
{
"cell_type": "markdown",
"id": "dde56423",
"metadata": {},
"source": [
"## Revisiting our Logistic Regression case\n",
"\n",
"In our discussion on Logistic Regression we studied the \n",
"case of\n",
"two classes, with $y_i$ either\n",
"$0$ or $1$. Furthermore we assumed also that we have only two\n",
"parameters $\\beta$ in our fitting, that is we\n",
"defined probabilities"
]
},
{
"cell_type": "markdown",
"id": "287dd911",
"metadata": {},
"source": [
"$$\n",
"\\begin{align*}\n",
"p(y_i=1|x_i,\\boldsymbol{\\beta}) &= \\frac{\\exp{(\\beta_0+\\beta_1x_i)}}{1+\\exp{(\\beta_0+\\beta_1x_i)}},\\nonumber\\\\\n",
"p(y_i=0|x_i,\\boldsymbol{\\beta}) &= 1 - p(y_i=1|x_i,\\boldsymbol{\\beta}),\n",
"\\end{align*}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "3e95f118",
"metadata": {},
"source": [
"where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$."
]
},
{
"cell_type": "markdown",
"id": "50bacdb9",
"metadata": {},
"source": [
"## The equations to solve\n",
"\n",
"Our compact equations used a definition of a vector $\\boldsymbol{y}$ with $n$\n",
"elements $y_i$, an $n\\times p$ matrix $\\boldsymbol{X}$ which contains the\n",
"$x_i$ values and a vector $\\boldsymbol{p}$ of fitted probabilities\n",
"$p(y_i\\vert x_i,\\boldsymbol{\\beta})$. We rewrote in a more compact form\n",
"the first derivative of the cost function as"
]
},
{
"cell_type": "markdown",
"id": "331fc9ec",
"metadata": {},
"source": [
"$$\n",
"\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "dab31d07",
"metadata": {},
"source": [
"If we in addition define a diagonal matrix $\\boldsymbol{W}$ with elements \n",
"$p(y_i\\vert x_i,\\boldsymbol{\\beta})(1-p(y_i\\vert x_i,\\boldsymbol{\\beta})$, we can obtain a compact expression of the second derivative as"
]
},
{
"cell_type": "markdown",
"id": "d235b146",
"metadata": {},
"source": [
"$$\n",
"\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T} = \\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "077d1780",
"metadata": {},
"source": [
"This defines what is called the Hessian matrix."
]
},
{
"cell_type": "markdown",
"id": "2ef1828a",
"metadata": {},
"source": [
"## Solving using Newton-Raphson's method\n",
"\n",
"If we can set up these equations, Newton-Raphson's iterative method is normally the method of choice. It requires however that we can compute in an efficient way the matrices that define the first and second derivatives. \n",
"\n",
"Our iterative scheme is then given by"
]
},
{
"cell_type": "markdown",
"id": "ab007df8",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T}\\right)^{-1}_{\\boldsymbol{\\beta}^{\\mathrm{old}}}\\times \\left(\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}\\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "a2232f70",
"metadata": {},
"source": [
"or in matrix form as"
]
},
{
"cell_type": "markdown",
"id": "2550c2f0",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X} \\right)^{-1}\\times \\left(-\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{p}) \\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "0743917a",
"metadata": {},
"source": [
"The right-hand side is computed with the old values of $\\beta$. \n",
"\n",
"If we can compute these matrices, in particular the Hessian, the above is often the easiest method to implement."
]
},
{
"cell_type": "markdown",
"id": "8e14cb5e",
"metadata": {},
"source": [
"## Brief reminder on Newton-Raphson's method\n",
"\n",
"Let us quickly remind ourselves how we derive the above method.\n",
"\n",
"Perhaps the most celebrated of all one-dimensional root-finding\n",
"routines is Newton's method, also called the Newton-Raphson\n",
"method. This method requires the evaluation of both the\n",
"function $f$ and its derivative $f'$ at arbitrary points. \n",
"If you can only calculate the derivative\n",
"numerically and/or your function is not of the smooth type, we\n",
"normally discourage the use of this method."
]
},
{
"cell_type": "markdown",
"id": "74a0765f",
"metadata": {},
"source": [
"## The equations\n",
"\n",
"The Newton-Raphson formula consists geometrically of extending the\n",
"tangent line at a current point until it crosses zero, then setting\n",
"the next guess to the abscissa of that zero-crossing. The mathematics\n",
"behind this method is rather simple. Employing a Taylor expansion for\n",
"$x$ sufficiently close to the solution $s$, we have"
]
},
{
"cell_type": "markdown",
"id": "a322bd0e",
"metadata": {},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"eq:taylornr\"></div>\n",
"\n",
"$$\n",
"f(s)=0=f(x)+(s-x)f'(x)+\\frac{(s-x)^2}{2}f''(x) +\\dots.\n",
" \\label{eq:taylornr} \\tag{1}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "c2a5bad6",
"metadata": {},
"source": [
"For small enough values of the function and for well-behaved\n",
"functions, the terms beyond linear are unimportant, hence we obtain"
]
},
{
"cell_type": "markdown",
"id": "ad427199",
"metadata": {},
"source": [
"$$\n",
"f(x)+(s-x)f'(x)\\approx 0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "ee10e015",
"metadata": {},
"source": [
"yielding"
]
},
{
"cell_type": "markdown",
"id": "724d2e8a",
"metadata": {},
"source": [
"$$\n",
"s\\approx x-\\frac{f(x)}{f'(x)}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "d5873493",
"metadata": {},
"source": [
"Having in mind an iterative procedure, it is natural to start iterating with"
]
},
{
"cell_type": "markdown",
"id": "d880bf0b",
"metadata": {},
"source": [
"$$\n",
"x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "15aece47",
"metadata": {},
"source": [
"## Simple geometric interpretation\n",
"\n",
"The above is Newton-Raphson's method. It has a simple geometric\n",
"interpretation, namely $x_{n+1}$ is the point where the tangent from\n",
"$(x_n,f(x_n))$ crosses the $x$-axis. Close to the solution,\n",
"Newton-Raphson converges fast to the desired result. However, if we\n",
"are far from a root, where the higher-order terms in the series are\n",
"important, the Newton-Raphson formula can give grossly inaccurate\n",
"results. For instance, the initial guess for the root might be so far\n",
"from the true root as to let the search interval include a local\n",
"maximum or minimum of the function. If an iteration places a trial\n",
"guess near such a local extremum, so that the first derivative nearly\n",
"vanishes, then Newton-Raphson may fail totally"
]
},
{
"cell_type": "markdown",
"id": "fc3d79af",
"metadata": {},
"source": [
"## Extending to more than one variable\n",
"\n",
"Newton's method can be generalized to systems of several non-linear equations\n",
"and variables. Consider the case with two equations"
]
},
{
"cell_type": "markdown",
"id": "e357107f",
"metadata": {},
"source": [
"$$\n",
"\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n",
" f_2(x_1,x_2) &=0,\\end{array}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "34b27705",
"metadata": {},
"source": [
"which we Taylor expand to obtain"
]
},
{
"cell_type": "markdown",
"id": "7d0e5513",
"metadata": {},
"source": [
"$$\n",
"\\begin{array}{cc} 0=f_1(x_1+h_1,x_2+h_2)=&f_1(x_1,x_2)+h_1\n",
" \\partial f_1/\\partial x_1+h_2\n",
" \\partial f_1/\\partial x_2+\\dots\\\\\n",
" 0=f_2(x_1+h_1,x_2+h_2)=&f_2(x_1,x_2)+h_1\n",
" \\partial f_2/\\partial x_1+h_2\n",
" \\partial f_2/\\partial x_2+\\dots\n",
" \\end{array}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "b622ab6c",
"metadata": {},
"source": [
"Defining the Jacobian matrix ${\\bf \\boldsymbol{J}}$ we have"
]
},
{
"cell_type": "markdown",
"id": "eff30163",
"metadata": {},
"source": [
"$$\n",
"{\\bf \\boldsymbol{J}}=\\left( \\begin{array}{cc}\n",
" \\partial f_1/\\partial x_1 & \\partial f_1/\\partial x_2 \\\\\n",
" \\partial f_2/\\partial x_1 &\\partial f_2/\\partial x_2\n",
" \\end{array} \\right),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "25b8eae6",
"metadata": {},
"source": [
"we can rephrase Newton's method as"
]
},
{
"cell_type": "markdown",
"id": "fb33d901",
"metadata": {},
"source": [
"$$\n",
"\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n",
"\\left(\\begin{array}{c} x_1^{n} \\\\ x_2^{n} \\end{array} \\right)+\n",
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "56d2b104",
"metadata": {},
"source": [
"where we have defined"
]
},
{
"cell_type": "markdown",
"id": "3d27ac93",
"metadata": {},
"source": [
"$$\n",
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n",
" -{\\bf \\boldsymbol{J}}^{-1}\n",
" \\left(\\begin{array}{c} f_1(x_1^{n},x_2^{n}) \\\\ f_2(x_1^{n},x_2^{n}) \\end{array} \\right).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "21070210",
"metadata": {},
"source": [
"We need thus to compute the inverse of the Jacobian matrix and it\n",
"is to understand that difficulties may\n",
"arise in case ${\\bf \\boldsymbol{J}}$ is nearly singular.\n",
"\n",
"It is rather straightforward to extend the above scheme to systems of\n",
"more than two non-linear equations. In our case, the Jacobian matrix is given by the Hessian that represents the second derivative of cost function."
]
},
{
"cell_type": "markdown",
"id": "e9a8d5ab",
"metadata": {},
"source": [
"## Steepest descent\n",
"\n",
"The basic idea of gradient descent is\n",
"that a function $F(\\mathbf{x})$, \n",
"$\\mathbf{x} \\equiv (x_1,\\cdots,x_n)$, decreases fastest if one goes from $\\bf {x}$ in the\n",
"direction of the negative gradient $-\\nabla F(\\mathbf{x})$.\n",
"\n",
"It can be shown that if"
]
},
{
"cell_type": "markdown",
"id": "301ef6ac",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "9ac00842",
"metadata": {},
"source": [
"with $\\gamma_k > 0$.\n",
"\n",
"For $\\gamma_k$ small enough, then $F(\\mathbf{x}_{k+1}) \\leq\n",
"F(\\mathbf{x}_k)$. This means that for a sufficiently small $\\gamma_k$\n",
"we are always moving towards smaller function values, i.e a minimum."
]
},
{
"cell_type": "markdown",
"id": "f07f5084",
"metadata": {},
"source": [
"## More on Steepest descent\n",
"\n",
"The previous observation is the basis of the method of steepest\n",
"descent, which is also referred to as just gradient descent (GD). One\n",
"starts with an initial guess $\\mathbf{x}_0$ for a minimum of $F$ and\n",
"computes new approximations according to"
]
},
{
"cell_type": "markdown",
"id": "194ec701",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "33b8042a",
"metadata": {},
"source": [
"The parameter $\\gamma_k$ is often referred to as the step length or\n",
"the learning rate within the context of Machine Learning."
]
},
{
"cell_type": "markdown",
"id": "cfe687c2",
"metadata": {},
"source": [
"## The ideal\n",
"\n",
"Ideally the sequence $\\{\\mathbf{x}_k \\}_{k=0}$ converges to a global\n",
"minimum of the function $F$. In general we do not know if we are in a\n",
"global or local minimum. In the special case when $F$ is a convex\n",
"function, all local minima are also global minima, so in this case\n",
"gradient descent can converge to the global solution. The advantage of\n",
"this scheme is that it is conceptually simple and straightforward to\n",
"implement. However the method in this form has some severe\n",
"limitations:\n",
"\n",
"In machine learing we are often faced with non-convex high dimensional\n",
"cost functions with many local minima. Since GD is deterministic we\n",
"will get stuck in a local minimum, if the method converges, unless we\n",
"have a very good intial guess. This also implies that the scheme is\n",
"sensitive to the chosen initial condition.\n",
"\n",
"Note that the gradient is a function of $\\mathbf{x} =\n",
"(x_1,\\cdots,x_n)$ which makes it expensive to compute numerically."
]
},
{
"cell_type": "markdown",
"id": "8b49c45b",
"metadata": {},
"source": [
"## The sensitiveness of the gradient descent\n",
"\n",
"The gradient descent method \n",
"is sensitive to the choice of learning rate $\\gamma_k$. This is due\n",
"to the fact that we are only guaranteed that $F(\\mathbf{x}_{k+1}) \\leq\n",
"F(\\mathbf{x}_k)$ for sufficiently small $\\gamma_k$. The problem is to\n",
"determine an optimal learning rate. If the learning rate is chosen too\n",
"small the method will take a long time to converge and if it is too\n",
"large we can experience erratic behavior.\n",
"\n",
"Many of these shortcomings can be alleviated by introducing\n",
"randomness. One such method is that of Stochastic Gradient Descent\n",
"(SGD), see below."
]
},
{
"cell_type": "markdown",
"id": "d0472c94",
"metadata": {},
"source": [
"## Convex functions\n",
"\n",
"Ideally we want our cost/loss function to be convex(concave).\n",
"\n",
"First we give the definition of a convex set: A set $C$ in\n",
"$\\mathbb{R}^n$ is said to be convex if, for all $x$ and $y$ in $C$ and\n",
"all $t \\in (0,1)$ , the point $(1 t)x + ty$ also belongs to\n",
"C. Geometrically this means that every point on the line segment\n",
"connecting $x$ and $y$ is in $C$ as discussed below.\n",
"\n",
"The convex subsets of $\\mathbb{R}$ are the intervals of\n",
"$\\mathbb{R}$. Examples of convex sets of $\\mathbb{R}^2$ are the\n",
"regular polygons (triangles, rectangles, pentagons, etc...)."
]
},
{
"cell_type": "markdown",
"id": "38efa238",
"metadata": {},
"source": [
"## Convex function\n",
"\n",
"**Convex function**: Let $X \\subset \\mathbb{R}^n$ be a convex set. Assume that the function $f: X \\rightarrow \\mathbb{R}$ is continuous, then $f$ is said to be convex if $$f(tx_1 + (1-t)x_2) \\leq tf(x_1) + (1-t)f(x_2) $$ for all $x_1, x_2 \\in X$ and for all $t \\in [0,1]$. If $\\leq$ is replaced with a strict inequaltiy in the definition, we demand $x_1 \\neq x_2$ and $t\\in(0,1)$ then $f$ is said to be strictly convex. For a single variable function, convexity means that if you draw a straight line connecting $f(x_1)$ and $f(x_2)$, the value of the function on the interval $[x_1,x_2]$ is always below the line as illustrated below."
]
},
{
"cell_type": "markdown",
"id": "ba410ba0",
"metadata": {},
"source": [
"## Conditions on convex functions\n",
"\n",
"In the following we state first and second-order conditions which\n",
"ensures convexity of a function $f$. We write $D_f$ to denote the\n",
"domain of $f$, i.e the subset of $R^n$ where $f$ is defined. For more\n",
"details and proofs we refer to: [S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press](http://stanford.edu/boyd/cvxbook/, 2004).\n",
"\n",
"**First order condition.**\n",
"\n",
"Suppose $f$ is differentiable (i.e $\\nabla f(x)$ is well defined for\n",
"all $x$ in the domain of $f$). Then $f$ is convex if and only if $D_f$\n",
"is a convex set and $$f(y) \\geq f(x) + \\nabla f(x)^T (y-x) $$ holds\n",
"for all $x,y \\in D_f$. This condition means that for a convex function\n",
"the first order Taylor expansion (right hand side above) at any point\n",
"a global under estimator of the function. To convince yourself you can\n",
"make a drawing of $f(x) = x^2+1$ and draw the tangent line to $f(x)$ and\n",
"note that it is always below the graph.\n",
"\n",
"**Second order condition.**\n",
"\n",
"Assume that $f$ is twice\n",
"differentiable, i.e the Hessian matrix exists at each point in\n",
"$D_f$. Then $f$ is convex if and only if $D_f$ is a convex set and its\n",
"Hessian is positive semi-definite for all $x\\in D_f$. For a\n",
"single-variable function this reduces to $f''(x) \\geq 0$. Geometrically this means that $f$ has nonnegative curvature\n",
"everywhere.\n",
"\n",
"This condition is particularly useful since it gives us an procedure for determining if the function under consideration is convex, apart from using the definition."
]
},
{
"cell_type": "markdown",
"id": "4f3b7299",
"metadata": {},
"source": [
"## More on convex functions\n",
"\n",
"The next result is of great importance to us and the reason why we are\n",
"going on about convex functions. In machine learning we frequently\n",
"have to minimize a loss/cost function in order to find the best\n",
"parameters for the model we are considering. \n",
"\n",
"Ideally we want the\n",
"global minimum (for high-dimensional models it is hard to know\n",
"if we have local or global minimum). However, if the cost/loss function\n",
"is convex the following result provides invaluable information:\n",
"\n",
"**Any minimum is global for convex functions.**\n",
"\n",
"Consider the problem of finding $x \\in \\mathbb{R}^n$ such that $f(x)$\n",
"is minimal, where $f$ is convex and differentiable. Then, any point\n",
"$x^*$ that satisfies $\\nabla f(x^*) = 0$ is a global minimum.\n",
"\n",
"This result means that if we know that the cost/loss function is convex and we are able to find a minimum, we are guaranteed that it is a global minimum."
]
},
{
"cell_type": "markdown",
"id": "023159dc",
"metadata": {},
"source": [
"## Some simple problems\n",
"\n",
"1. Show that $f(x)=x^2$ is convex for $x \\in \\mathbb{R}$ using the definition of convexity. Hint: If you re-write the definition, $f$ is convex if the following holds for all $x,y \\in D_f$ and any $\\lambda \\in [0,1]$ $\\lambda f(x)+(1-\\lambda)f(y)-f(\\lambda x + (1-\\lambda) y ) \\geq 0$.\n",
"\n",
"2. Using the second order condition show that the following functions are convex on the specified domain.\n",
"\n",
" * $f(x) = e^x$ is convex for $x \\in \\mathbb{R}$.\n",
"\n",
" * $g(x) = -\\ln(x)$ is convex for $x \\in (0,\\infty)$.\n",
"\n",
"3. Let $f(x) = x^2$ and $g(x) = e^x$. Show that $f(g(x))$ and $g(f(x))$ is convex for $x \\in \\mathbb{R}$. Also show that if $f(x)$ is any convex function than $h(x) = e^{f(x)}$ is convex.\n",
"\n",
"4. A norm is any function that satisfy the following properties\n",
"\n",
" * $f(\\alpha x) = |\\alpha| f(x)$ for all $\\alpha \\in \\mathbb{R}$.\n",
"\n",
" * $f(x+y) \\leq f(x) + f(y)$\n",
"\n",
" * $f(x) \\leq 0$ for all $x \\in \\mathbb{R}^n$ with equality if and only if $x = 0$\n",
"\n",
"Using the definition of convexity, try to show that a function satisfying the properties above is convex (the third condition is not needed to show this)."
]
},
{
"cell_type": "markdown",
"id": "e09d96ad",
"metadata": {},
"source": [
"## Standard steepest descent\n",
"\n",
"Before we proceed, we would like to discuss the approach called the\n",
"**standard Steepest descent** (different from the above steepest descent discussion), which again leads to us having to be able\n",
"to compute a matrix. It belongs to the class of Conjugate Gradient methods (CG).\n",
"\n",
"[The success of the CG method](https://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\n",
"for finding solutions of non-linear problems is based on the theory\n",
"of conjugate gradients for linear systems of equations. It belongs to\n",
"the class of iterative methods for solving problems from linear\n",
"algebra of the type"
]
},
{
"cell_type": "markdown",
"id": "0c736f59",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "bbc1eae2",
"metadata": {},
"source": [
"In the iterative process we end up with a problem like"
]
},
{
"cell_type": "markdown",
"id": "b8e12b0e",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "7776d4c5",
"metadata": {},
"source": [
"where $\\boldsymbol{r}$ is the so-called residual or error in the iterative process.\n",
"\n",
"When we have found the exact solution, $\\boldsymbol{r}=0$."
]
},
{
"cell_type": "markdown",
"id": "cc2b2591",
"metadata": {},
"source": [
"## Gradient method\n",
"\n",
"The residual is zero when we reach the minimum of the quadratic equation"
]
},
{
"cell_type": "markdown",
"id": "30813f54",
"metadata": {},
"source": [
"$$\n",
"P(\\boldsymbol{x})=\\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "b9f2a68a",
"metadata": {},
"source": [
"with the constraint that the matrix $\\boldsymbol{A}$ is positive definite and\n",
"symmetric. This defines also the Hessian and we want it to be positive definite."
]
},
{
"cell_type": "markdown",
"id": "dc4f825d",
"metadata": {},
"source": [
"## Steepest descent method\n",
"\n",
"We denote the initial guess for $\\boldsymbol{x}$ as $\\boldsymbol{x}_0$. \n",
"We can assume without loss of generality that"
]
},
{
"cell_type": "markdown",
"id": "9b6412ee",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_0=0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "8034df75",
"metadata": {},
"source": [
"or consider the system"
]
},
{
"cell_type": "markdown",
"id": "ec6b3f52",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "97eab53d",
"metadata": {},
"source": [
"instead."
]
},
{
"cell_type": "markdown",
"id": "294bafec",
"metadata": {},
"source": [
"## Steepest descent method\n",
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
]
},
{
"cell_type": "markdown",
"id": "b614fd3a",
"metadata": {},
"source": [
"$$\n",
"f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "66e7d9f9",
"metadata": {},
"source": [
"This suggests taking the first basis vector $\\boldsymbol{r}_1$ (see below for definition) \n",
"to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n",
"which equals"
]
},
{
"cell_type": "markdown",
"id": "a4970262",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "d1492859",
"metadata": {},
"source": [
"and \n",
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$."
]
},
{
"cell_type": "markdown",
"id": "298fed8e",
"metadata": {},
"source": [
"## Final expressions\n",
"We can compute the residual iteratively as"
]
},
{
"cell_type": "markdown",
"id": "e5ae1578",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "0311229d",
"metadata": {},
"source": [
"which equals"
]
},
{
"cell_type": "markdown",
"id": "99eb2181",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "08b7b7f5",
"metadata": {},
"source": [
"or"
]
},
{
"cell_type": "markdown",
"id": "8a89c9f8",
"metadata": {},
"source": [
"$$\n",
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "e491710b",
"metadata": {},
"source": [
"which gives"
]
},
{
"cell_type": "markdown",
"id": "ce03e660",
"metadata": {},
"source": [
"$$\n",
"\\alpha_k = \\frac{\\boldsymbol{r}_k^T\\boldsymbol{r}_k}{\\boldsymbol{r}_k^T\\boldsymbol{A}\\boldsymbol{r}_k}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "66cd9e49",
"metadata": {},
"source": [
"leading to the iterative scheme"
]
},
{
"cell_type": "markdown",
"id": "34ad9715",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k-\\alpha_k\\boldsymbol{r}_{k},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "0d46875f",
"metadata": {},
"source": [
"## Steepest descent example"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "72331d76",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/td/3yk470mj5p931p9dtkk0y6jw0000gn/T/ipykernel_42389/2941247930.py:16: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().\n",
" ax = fig.gca(projection=\"3d\")\n"
]
},
{
"data": {
"text/plain": [
"<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x10363e6a0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import numpy.linalg as la\n",
"\n",
"import scipy.optimize as sopt\n",
"\n",
"import matplotlib.pyplot as pt\n",
"from mpl_toolkits.mplot3d import axes3d\n",
"\n",
"def f(x):\n",
" return x[0]**2 + 3.0*x[1]**2\n",
"\n",
"def df(x):\n",
" return np.array([2*x[0], 6*x[1]])\n",
"\n",
"fig = pt.figure()\n",
"ax = fig.gca(projection=\"3d\")\n",
"\n",
"xmesh, ymesh = np.mgrid[-3:3:50j,-3:3:50j]\n",
"fmesh = f(np.array([xmesh, ymesh]))\n",
"ax.plot_surface(xmesh, ymesh, fmesh)"
]
},
{
"cell_type": "markdown",
"id": "f9baba11",
"metadata": {},
"source": [
"And then as countor plot"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b0aec5c4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pt.axis(\"equal\")\n",
"pt.contour(xmesh, ymesh, fmesh)\n",
"guesses = [np.array([2, 2./5])]"
]
},
{
"cell_type": "markdown",
"id": "aab04a85",
"metadata": {},
"source": [
"Find guesses"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "35ab2a27",
"metadata": {},
"outputs": [],
"source": [
"x = guesses[-1]\n",
"s = -df(x)"
]
},
{
"cell_type": "markdown",
"id": "38845ab4",
"metadata": {},
"source": [
"Run it!"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "e40e952d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.69230769 -0.38461539]\n"
]
}
],
"source": [
"def f1d(alpha):\n",
" return f(x + alpha*s)\n",
"\n",
"alpha_opt = sopt.golden(f1d)\n",
"next_guess = x + alpha_opt * s\n",
"guesses.append(next_guess)\n",
"print(next_guess)"
]
},
{
"cell_type": "markdown",
"id": "b17e7f44",
"metadata": {},
"source": [
"What happened?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "d65ee839",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x11c10ec10>]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"pt.axis(\"equal\")\n",
"pt.contour(xmesh, ymesh, fmesh, 50)\n",
"it_array = np.array(guesses)\n",
"pt.plot(it_array.T[0], it_array.T[1], \"x-\")"
]
},
{
"cell_type": "markdown",
"id": "18c7c22e",
"metadata": {},
"source": [
"Note that we did only one iteration here. We can easily add more using our previous guesses."
]
},
{
"cell_type": "markdown",
"id": "7f1456dc",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"In the CG method we define so-called conjugate directions and two vectors \n",
"$\\boldsymbol{s}$ and $\\boldsymbol{t}$\n",
"are said to be\n",
"conjugate if"
]
},
{
"cell_type": "markdown",
"id": "dd173dfb",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "d701c9fb",
"metadata": {},
"source": [
"The philosophy of the CG method is to perform searches in various conjugate directions\n",
"of our vectors $\\boldsymbol{x}_i$ obeying the above criterion, namely"
]
},
{
"cell_type": "markdown",
"id": "f9a8b68b",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "a2dce53d",
"metadata": {},
"source": [
"Two vectors are conjugate if they are orthogonal with respect to \n",
"this inner product. Being conjugate is a symmetric relation: if $\\boldsymbol{s}$ is conjugate to $\\boldsymbol{t}$, then $\\boldsymbol{t}$ is conjugate to $\\boldsymbol{s}$."
]
},
{
"cell_type": "markdown",
"id": "19ff9038",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"An example is given by the eigenvectors of the matrix"
]
},
{
"cell_type": "markdown",
"id": "8cbcc7e2",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "e9ea4968",
"metadata": {},
"source": [
"which is zero unless $i=j$."
]
},
{
"cell_type": "markdown",
"id": "412198c3",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"Assume now that we have a symmetric positive-definite matrix $\\boldsymbol{A}$ of size\n",
"$n\\times n$. At each iteration $i+1$ we obtain the conjugate direction of a vector"
]
},
{
"cell_type": "markdown",
"id": "4e53e367",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "c5c23589",
"metadata": {},
"source": [
"We assume that $\\boldsymbol{p}_{i}$ is a sequence of $n$ mutually conjugate directions. \n",
"Then the $\\boldsymbol{p}_{i}$ form a basis of $R^n$ and we can expand the solution \n",
"$ \\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}$ in this basis, namely"
]
},
{
"cell_type": "markdown",
"id": "cb47cf57",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "5bdec91c",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"The coefficients are given by"
]
},
{
"cell_type": "markdown",
"id": "ce3082b7",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "8b1139e9",
"metadata": {},
"source": [
"Multiplying with $\\boldsymbol{p}_k^T$ from the left gives"
]
},
{
"cell_type": "markdown",
"id": "58d65744",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{p}_i= \\boldsymbol{p}_k^T \\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "85fe84cb",
"metadata": {},
"source": [
"and we can define the coefficients $\\alpha_k$ as"
]
},
{
"cell_type": "markdown",
"id": "8e4ea650",
"metadata": {},
"source": [
"$$\n",
"\\alpha_k = \\frac{\\boldsymbol{p}_k^T \\boldsymbol{b}}{\\boldsymbol{p}_k^T \\boldsymbol{A} \\boldsymbol{p}_k}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "7fc2b5db",
"metadata": {},
"source": [
"## Conjugate gradient method and iterations\n",
"\n",
"If we choose the conjugate vectors $\\boldsymbol{p}_k$ carefully, \n",
"then we may not need all of them to obtain a good approximation to the solution \n",
"$\\boldsymbol{x}$. \n",
"We want to regard the conjugate gradient method as an iterative method. \n",
"This will us to solve systems where $n$ is so large that the direct \n",
"method would take too much time.\n",
"\n",
"We denote the initial guess for $\\boldsymbol{x}$ as $\\boldsymbol{x}_0$. \n",
"We can assume without loss of generality that"
]
},
{
"cell_type": "markdown",
"id": "a653e167",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_0=0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "140a6cf3",
"metadata": {},
"source": [
"or consider the system"
]
},
{
"cell_type": "markdown",
"id": "0e842bf0",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "2d539424",
"metadata": {},
"source": [
"instead."
]
},
{
"cell_type": "markdown",
"id": "4027b150",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
]
},
{
"cell_type": "markdown",
"id": "51bb612d",
"metadata": {},
"source": [
"$$\n",
"f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "3eabe463",
"metadata": {},
"source": [
"This suggests taking the first basis vector $\\boldsymbol{p}_1$ \n",
"to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n",
"which equals"
]
},
{
"cell_type": "markdown",
"id": "5680938b",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "9342de43",
"metadata": {},
"source": [
"and \n",
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n",
"The other vectors in the basis will be conjugate to the gradient, \n",
"hence the name conjugate gradient method."
]
},
{
"cell_type": "markdown",
"id": "dc6b0289",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:"
]
},
{
"cell_type": "markdown",
"id": "d662d6cb",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "a1dfc17e",
"metadata": {},
"source": [
"Note that $\\boldsymbol{r}_k$ is the negative gradient of $f$ at \n",
"$\\boldsymbol{x}=\\boldsymbol{x}_k$, \n",
"so the gradient descent method would be to move in the direction $\\boldsymbol{r}_k$. \n",
"Here, we insist that the directions $\\boldsymbol{p}_k$ are conjugate to each other, \n",
"so we take the direction closest to the gradient $\\boldsymbol{r}_k$ \n",
"under the conjugacy constraint. \n",
"This gives the following expression"
]
},
{
"cell_type": "markdown",
"id": "e7217dd4",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{p}_{k+1}=\\boldsymbol{r}_k-\\frac{\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{r}_k}{\\boldsymbol{p}_k^T\\boldsymbol{A}\\boldsymbol{p}_k} \\boldsymbol{p}_k.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "fc97e4f1",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"We can also compute the residual iteratively as"
]
},
{
"cell_type": "markdown",
"id": "d68b2934",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "7be1c818",
"metadata": {},
"source": [
"which equals"
]
},
{
"cell_type": "markdown",
"id": "71ce7281",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "cbf9ce5a",
"metadata": {},
"source": [
"or"
]
},
{
"cell_type": "markdown",
"id": "d7960c30",
"metadata": {},
"source": [
"$$\n",
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "cffbbb79",
"metadata": {},
"source": [
"which gives"
]
},
{
"cell_type": "markdown",
"id": "718a0a6f",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "4db7f5dc",
"metadata": {},
"source": [
"## Revisiting our first homework\n",
"\n",
"We will use linear regression as a case study for the gradient descent\n",
"methods. Linear regression is a great test case for the gradient\n",
"descent methods discussed in the lectures since it has several\n",
"desirable properties such as:\n",
"\n",
"1. An analytical solution (recall homework set 1).\n",
"\n",
"2. The gradient can be computed analytically.\n",
"\n",
"3. The cost function is convex which guarantees that gradient descent converges for small enough learning rates\n",
"\n",
"We revisit an example similar to what we had in the first homework set. We had a function of the type"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "27af777d",
"metadata": {},
"outputs": [],
"source": [
"x = 2*np.random.rand(m,1)\n",
"y = 4+3*x+np.random.randn(m,1)"
]
},
{
"cell_type": "markdown",
"id": "b5400386",
"metadata": {},
"source": [
"with $x_i \\in [0,1] $ is chosen randomly using a uniform distribution. Additionally we have a stochastic noise chosen according to a normal distribution $\\cal {N}(0,1)$. \n",
"The linear regression model is given by"
]
},
{
"cell_type": "markdown",
"id": "24ed3756",
"metadata": {},
"source": [
"$$\n",
"h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "00d1f306",
"metadata": {},
"source": [
"such that"
]
},
{
"cell_type": "markdown",
"id": "f30c3b64",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "165a54d8",
"metadata": {},
"source": [
"## Gradient descent example\n",
"\n",
"Let $\\mathbf{y} = (y_1,\\cdots,y_n)^T$, $\\mathbf{\\boldsymbol{y}} = (\\boldsymbol{y}_1,\\cdots,\\boldsymbol{y}_n)^T$ and $\\beta = (\\beta_0, \\beta_1)^T$\n",
"\n",
"It is convenient to write $\\mathbf{\\boldsymbol{y}} = X\\beta$ where $X \\in \\mathbb{R}^{100 \\times 2} $ is the design matrix given by (we keep the intercept here)"
]
},
{
"cell_type": "markdown",
"id": "a9891168",
"metadata": {},
"source": [
"$$\n",
"X \\equiv \\begin{bmatrix}\n",
"1 & x_1 \\\\\n",
"\\vdots & \\vdots \\\\\n",
"1 & x_{100} & \\\\\n",
"\\end{bmatrix}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "7d7d1698",
"metadata": {},
"source": [
"The cost/loss/risk function is given by ("
]
},
{
"cell_type": "markdown",
"id": "8f31115e",
"metadata": {},
"source": [
"$$\n",
"C(\\beta) = \\frac{1}{n}||X\\beta-\\mathbf{y}||_{2}^{2} = \\frac{1}{n}\\sum_{i=1}^{100}\\left[ (\\beta_0 + \\beta_1 x_i)^2 - 2 y_i (\\beta_0 + \\beta_1 x_i) + y_i^2\\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "c0eb6ac5",
"metadata": {},
"source": [
"and we want to find $\\beta$ such that $C(\\beta)$ is minimized."
]
},
{
"cell_type": "markdown",
"id": "adff23ee",
"metadata": {},
"source": [
"## The derivative of the cost/loss function\n",
"\n",
"Computing $\\partial C(\\beta) / \\partial \\beta_0$ and $\\partial C(\\beta) / \\partial \\beta_1$ we can show that the gradient can be written as"
]
},
{
"cell_type": "markdown",
"id": "071987fc",
"metadata": {},
"source": [
"$$\n",
"\\nabla_{\\beta} C(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n",
"\\sum_{i=1}^{100}\\left( x_i (\\beta_0+\\beta_1x_i)-y_ix_i\\right) \\\\\n",
"\\end{bmatrix} = \\frac{2}{n}X^T(X\\beta - \\mathbf{y}),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "384bc1a2",
"metadata": {},
"source": [
"where $X$ is the design matrix defined above."
]
},
{
"cell_type": "markdown",
"id": "f2d21cdc",
"metadata": {},
"source": [
"## The Hessian matrix\n",
"The Hessian matrix of $C(\\beta)$ is given by"
]
},
{
"cell_type": "markdown",
"id": "1e8bca50",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{H} \\equiv \\begin{bmatrix}\n",
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0^2} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} \\\\\n",
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_1^2} & \\\\\n",
"\\end{bmatrix} = \\frac{2}{n}X^T X.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "f9fca584",
"metadata": {},
"source": [
"This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite."
]
},
{
"cell_type": "markdown",
"id": "0860c223",
"metadata": {},
"source": [
"## Simple program\n",
"\n",
"We can now write a program that minimizes $C(\\beta)$ using the gradient descent method with a constant learning rate $\\gamma$ according to"
]
},
{
"cell_type": "markdown",
"id": "130d7405",
"metadata": {},
"source": [
"$$\n",
"\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "122ab1a1",
"metadata": {},
"source": [
"We can use the expression we computed for the gradient and let use a\n",
"$\\beta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n",
"when $||\\nabla_\\beta C(\\beta_k) || \\leq \\epsilon = 10^{-8}$. **Note that the code below does not include the latter stop criterion**.\n",
"\n",
"And finally we can compare our solution for $\\beta$ with the analytic result given by \n",
"$\\beta= (X^TX)^{-1} X^T \\mathbf{y}$."
]
},
{
"cell_type": "markdown",
"id": "cd9cc831",
"metadata": {},
"source": [
"## Gradient Descent Example\n",
"\n",
"Here our simple example"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "d927a289",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Eigenvalues of Hessian Matrix:[0.28065531 4.4834507 ]\n",
"[[4.31499792]\n",
" [2.76774725]]\n",
"[[4.31499792]\n",
" [2.76774725]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
"# Importing various packages\n",
"from random import random, seed\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"from matplotlib import cm\n",
"from matplotlib.ticker import LinearLocator, FormatStrFormatter\n",
"import sys\n",
"\n",
"# the number of datapoints\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",
"# Hessian matrix\n",
"H = (2.0/n)* X.T @ X\n",
"# Get the eigenvalues\n",
"EigValues, EigVectors = np.linalg.eig(H)\n",
"print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n",
"\n",
"beta_linreg = np.linalg.inv(X.T @ X) @ X.T @ y\n",
"print(beta_linreg)\n",
"beta = np.random.randn(2,1)\n",
"\n",
"eta = 1.0/np.max(EigValues)\n",
"Niterations = 1000\n",
"\n",
"for iter in range(Niterations):\n",
" gradient = (2.0/n)*X.T @ (X @ beta-y)\n",
" beta -= eta*gradient\n",
"\n",
"print(beta)\n",
"xnew = np.array([[0],[2]])\n",
"xbnew = np.c_[np.ones((2,1)), xnew]\n",
"ypredict = xbnew.dot(beta)\n",
"ypredict2 = xbnew.dot(beta_linreg)\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'Gradient descent example')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "6c19826d",
"metadata": {},
"source": [
"## And a corresponding example using **scikit-learn**"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "f6b889bd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[3.55513228]\n",
" [3.3552839 ]]\n",
"[3.5182936] [3.30404461]\n"
]
}
],
"source": [
"# Importing various packages\n",
"from random import random, seed\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.linear_model import SGDRegressor\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",
"beta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n",
"print(beta_linreg)\n",
"sgdreg = SGDRegressor(max_iter = 50, penalty=None, eta0=0.1)\n",
"sgdreg.fit(x,y.ravel())\n",
"print(sgdreg.intercept_, sgdreg.coef_)"
]
},
{
"cell_type": "markdown",
"id": "21739cb2",
"metadata": {},
"source": [
"## Gradient descent and Ridge\n",
"\n",
"We have also discussed Ridge regression where the loss function contains a regularized term given by the $L_2$ norm of $\\beta$,"
]
},
{
"cell_type": "markdown",
"id": "c05f8428",
"metadata": {},
"source": [
"$$\n",
"C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6c8ced5e",
"metadata": {},
"source": [
"In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we adjust the gradient as follows"
]
},
{
"cell_type": "markdown",
"id": "14452016",
"metadata": {},
"source": [
"$$\n",
"\\nabla_\\beta C_{\\text{ridge}}(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n",
"\\sum_{i=1}^{100}\\left( x_i (\\beta_0+\\beta_1x_i)-y_ix_i\\right) \\\\\n",
"\\end{bmatrix} + 2\\lambda\\begin{bmatrix} \\beta_0 \\\\ \\beta_1\\end{bmatrix} = 2 (\\frac{1}{n}X^T(X\\beta - \\mathbf{y})+\\lambda \\beta).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "542f52f5",
"metadata": {},
"source": [
"We can easily extend our program to minimize $C_{\\text{ridge}}(\\beta)$ using gradient descent and compare with the analytical solution given by"
]
},
{
"cell_type": "markdown",
"id": "f5c485ed",
"metadata": {},
"source": [
"$$\n",
"\\beta_{\\text{ridge}} = \\left(X^T X + n\\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "1e4bbe6a",
"metadata": {},
"source": [
"## The Hessian matrix for Ridge Regression\n",
"The Hessian matrix of Ridge Regression for our simple example is given by"
]
},
{
"cell_type": "markdown",
"id": "8395f779",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{H} \\equiv \\begin{bmatrix}\n",
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0^2} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} \\\\\n",
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_1^2} & \\\\\n",
"\\end{bmatrix} = \\frac{2}{n}X^T X+2\\lambda\\boldsymbol{I}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "57327b35",
"metadata": {},
"source": [
"This implies that the Hessian matrix is positive definite, hence the stationary point is a\n",
"minimum.\n",
"Note that the Ridge cost function is convex being a sum of two convex\n",
"functions. Therefore, the stationary point is a global\n",
"minimum of this function."
]
},
{
"cell_type": "markdown",
"id": "86d6e4b0",
"metadata": {},
"source": [
"## Program example for gradient descent with Ridge Regression"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "caf0e6e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Eigenvalues of Hessian Matrix:[0.29052231 4.94613286]\n",
"[[4.05416408]\n",
" [2.8806349 ]]\n",
"[[4.05191339]\n",
" [2.88235092]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from random import random, seed\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"from matplotlib import cm\n",
"from matplotlib.ticker import LinearLocator, FormatStrFormatter\n",
"import sys\n",
"\n",
"# the number of datapoints\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",
"\n",
"#Ridge parameter lambda\n",
"lmbda = 0.001\n",
"Id = n*lmbda* np.eye(XT_X.shape[0])\n",
"\n",
"# Hessian matrix\n",
"H = (2.0/n)* XT_X+2*lmbda* np.eye(XT_X.shape[0])\n",
"# Get the eigenvalues\n",
"EigValues, EigVectors = np.linalg.eig(H)\n",
"print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n",
"\n",
"\n",
"beta_linreg = np.linalg.inv(XT_X+Id) @ X.T @ y\n",
"print(beta_linreg)\n",
"# Start plain gradient descent\n",
"beta = np.random.randn(2,1)\n",
"\n",
"eta = 1.0/np.max(EigValues)\n",
"Niterations = 100\n",
"\n",
"for iter in range(Niterations):\n",
" gradients = 2.0/n*X.T @ (X @ (beta)-y)+2*lmbda*beta\n",
" beta -= eta*gradients\n",
"\n",
"print(beta)\n",
"ypredict = X @ beta\n",
"ypredict2 = X @ beta_linreg\n",
"plt.plot(x, ypredict, \"r-\")\n",
"plt.plot(x, 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'Gradient descent example for Ridge')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "993c191f",
"metadata": {},
"source": [
"## Using gradient descent methods, limitations\n",
"\n",
"* **Gradient descent (GD) finds local minima of our function**. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our cost/loss/risk function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.\n",
"\n",
"* **GD is sensitive to initial conditions**. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.\n",
"\n",
"* **Gradients are computationally expensive to calculate for large datasets**. In many cases in statistics and ML, the cost/loss/risk function is a sum of terms, with one term for each data point. For example, in linear regression, $E \\propto \\sum_{i=1}^n (y_i - \\mathbf{w}^T\\cdot\\mathbf{x}_i)^2$; for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over *all* $n$ data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called \"mini batches\". This has the added benefit of introducing stochasticity into our algorithm.\n",
"\n",
"* **GD is very sensitive to choices of learning rates**. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would *adaptively* choose the learning rates to match the landscape.\n",
"\n",
"* **GD treats all directions in parameter space uniformly.** Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive. \n",
"\n",
"* GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points."
]
},
{
"cell_type": "markdown",
"id": "cc175c37",
"metadata": {},
"source": [
"## Challenge yourself\n",
"\n",
"Write a code which implements gradient descent for a logistic regression example."
]
},
{
"cell_type": "markdown",
"id": "6e8e9108",
"metadata": {},
"source": [
"## Friday October 1"
]
},
{
"cell_type": "markdown",
"id": "f394fbb7",
"metadata": {},
"source": [
"## Stochastic Gradient Descent\n",
"\n",
"Stochastic gradient descent (SGD) and variants thereof address some of\n",
"the shortcomings of the Gradient descent method discussed above.\n",
"\n",
"The underlying idea of SGD comes from the observation that the cost\n",
"function, which we want to minimize, can almost always be written as a\n",
"sum over $n$ data points $\\{\\mathbf{x}_i\\}_{i=1}^n$,"
]
},
{
"cell_type": "markdown",
"id": "55224423",
"metadata": {},
"source": [
"$$\n",
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "b2e74eb7",
"metadata": {},
"source": [
"## Computation of gradients\n",
"\n",
"This in turn means that the gradient can be\n",
"computed as a sum over $i$-gradients"
]
},
{
"cell_type": "markdown",
"id": "07f89fcc",
"metadata": {},
"source": [
"$$\n",
"\\nabla_\\beta C(\\mathbf{\\beta}) = \\sum_i^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6e739ebb",
"metadata": {},
"source": [
"Stochasticity/randomness is introduced by only taking the\n",
"gradient on a subset of the data called minibatches. If there are $n$\n",
"data points and the size of each minibatch is $M$, there will be $n/M$\n",
"minibatches. We denote these minibatches by $B_k$ where\n",
"$k=1,\\cdots,n/M$."
]
},
{
"cell_type": "markdown",
"id": "abc794f3",
"metadata": {},
"source": [
"## SGD example\n",
"As an example, suppose we have $10$ data points $(\\mathbf{x}_1,\\cdots, \\mathbf{x}_{10})$ \n",
"and we choose to have $M=5$ minibathces,\n",
"then each minibatch contains two data points. In particular we have\n",
"$B_1 = (\\mathbf{x}_1,\\mathbf{x}_2), \\cdots, B_5 =\n",
"(\\mathbf{x}_9,\\mathbf{x}_{10})$. Note that if you choose $M=1$ you\n",
"have only a single batch with all data points and on the other extreme,\n",
"you may choose $M=n$ resulting in a minibatch for each datapoint, i.e\n",
"$B_k = \\mathbf{x}_k$.\n",
"\n",
"The idea is now to approximate the gradient by replacing the sum over\n",
"all data points with a sum over the data points in one the minibatches\n",
"picked at random in each gradient descent step"
]
},
{
"cell_type": "markdown",
"id": "ec3cd60b",
"metadata": {},
"source": [
"$$\n",
"\\nabla_{\\beta}\n",
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}) \\rightarrow \\sum_{i \\in B_k}^n \\nabla_\\beta\n",
"c_i(\\mathbf{x}_i, \\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "f1ba24d4",
"metadata": {},
"source": [
"## The gradient step\n",
"\n",
"Thus a gradient descent step now looks like"
]
},
{
"cell_type": "markdown",
"id": "7d8ddcd7",
"metadata": {},
"source": [
"$$\n",
"\\beta_{j+1} = \\beta_j - \\gamma_j \\sum_{i \\in B_k}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta})\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "d7ec3248",
"metadata": {},
"source": [
"where $k$ is picked at random with equal\n",
"probability from $[1,n/M]$. An iteration over the number of\n",
"minibathces (n/M) is commonly referred to as an epoch. Thus it is\n",
"typical to choose a number of epochs and for each epoch iterate over\n",
"the number of minibatches, as exemplified in the code below."
]
},
{
"cell_type": "markdown",
"id": "b1f5fefb",
"metadata": {},
"source": [
"## Simple example code"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "5f016a5c",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np \n",
"\n",
"n = 100 #100 datapoints \n",
"M = 5 #size of each minibatch\n",
"m = int(n/M) #number of minibatches\n",
"n_epochs = 10 #number of epochs\n",
"\n",
"j = 0\n",
"for epoch in range(1,n_epochs+1):\n",
" for i in range(m):\n",
" k = np.random.randint(m) #Pick the k-th minibatch at random\n",
" #Compute the gradient using the data in minibatch Bk\n",
" #Compute new suggestion for \n",
" j += 1"
]
},
{
"cell_type": "markdown",
"id": "d027c5cf",
"metadata": {},
"source": [
"Taking the gradient only on a subset of the data has two important\n",
"benefits. First, it introduces randomness which decreases the chance\n",
"that our opmization scheme gets stuck in a local minima. Second, if\n",
"the size of the minibatches are small relative to the number of\n",
"datapoints ($M < n$), the computation of the gradient is much\n",
"cheaper since we sum over the datapoints in the $k-th$ minibatch and not\n",
"all $n$ datapoints."
]
},
{
"cell_type": "markdown",
"id": "de22c064",
"metadata": {},
"source": [
"## When do we stop?\n",
"\n",
"A natural question is when do we stop the search for a new minimum?\n",
"One possibility is to compute the full gradient after a given number\n",
"of epochs and check if the norm of the gradient is smaller than some\n",
"threshold and stop if true. However, the condition that the gradient\n",
"is zero is valid also for local minima, so this would only tell us\n",
"that we are close to a local/global minimum. However, we could also\n",
"evaluate the cost function at this point, store the result and\n",
"continue the search. If the test kicks in at a later stage we can\n",
"compare the values of the cost function and keep the $\\beta$ that\n",
"gave the lowest value."
]
},
{
"cell_type": "markdown",
"id": "dc00cb26",
"metadata": {},
"source": [
"## Slightly different approach\n",
"\n",
"Another approach is to let the step length $\\gamma_j$ depend on the\n",
"number of epochs in such a way that it becomes very small after a\n",
"reasonable time such that we do not move at all.\n",
"\n",
"As an example, let $e = 0,1,2,3,\\cdots$ denote the current epoch and let $t_0, t_1 > 0$ be two fixed numbers. Furthermore, let $t = e \\cdot m + i$ where $m$ is the number of minibatches and $i=0,\\cdots,m-1$. Then the function $$\\gamma_j(t; t_0, t_1) = \\frac{t_0}{t+t_1} $$ goes to zero as the number of epochs gets large. I.e. we start with a step length $\\gamma_j (0; t_0, t_1) = t_0/t_1$ which decays in *time* $t$.\n",
"\n",
"In this way we can fix the number of epochs, compute $\\beta$ and\n",
"evaluate the cost function at the end. Repeating the computation will\n",
"give a different result since the scheme is random by design. Then we\n",
"pick the final $\\beta$ that gives the lowest value of the cost\n",
"function."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b001ca3d",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np \n",
"\n",
"def step_length(t,t0,t1):\n",
" return t0/(t+t1)\n",
"\n",
"n = 100 #100 datapoints \n",
"M = 5 #size of each minibatch\n",
"m = int(n/M) #number of minibatches\n",
"n_epochs = 500 #number of epochs\n",
"t0 = 1.0\n",
"t1 = 10\n",
"\n",
"gamma_j = t0/t1\n",
"j = 0\n",
"for epoch in range(1,n_epochs+1):\n",
" for i in range(m):\n",
" k = np.random.randint(m) #Pick the k-th minibatch at random\n",
" #Compute the gradient using the data in minibatch Bk\n",
" #Compute new suggestion for beta\n",
" t = epoch*m+i\n",
" gamma_j = step_length(t,t0,t1)\n",
" j += 1\n",
"\n",
"print(\"gamma_j after %d epochs: %g\" % (n_epochs,gamma_j))"
]
},
{
"cell_type": "markdown",
"id": "f6733633",
"metadata": {},
"source": [
"## Program for stochastic gradient"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "cc6e4463",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Own inversion\n",
"[[3.90956014]\n",
" [2.98604929]]\n",
"sgdreg from scikit\n",
"[3.8704925] [2.96845746]\n",
"theta from own gd\n",
"[[3.90956014]\n",
" [2.98604929]]\n",
"theta from own sdg\n",
"[[3.87327055]\n",
" [2.97597101]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 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",
"from sklearn.linear_model import SGDRegressor\n",
"\n",
"m = 100\n",
"x = 2*np.random.rand(m,1)\n",
"y = 4+3*x+np.random.randn(m,1)\n",
"\n",
"X = np.c_[np.ones((m,1)), x]\n",
"theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n",
"print(\"Own inversion\")\n",
"print(theta_linreg)\n",
"sgdreg = SGDRegressor(max_iter = 50, penalty=None, eta0=0.1)\n",
"sgdreg.fit(x,y.ravel())\n",
"print(\"sgdreg from scikit\")\n",
"print(sgdreg.intercept_, sgdreg.coef_)\n",
"\n",
"\n",
"theta = np.random.randn(2,1)\n",
"eta = 0.1\n",
"Niterations = 1000\n",
"\n",
"\n",
"for iter in range(Niterations):\n",
" gradients = 2.0/m*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",
"n_epochs = 50\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",
"# note: here the number of minibatches is equal to the number of points!!\n",
"for epoch in range(n_epochs):\n",
" for i in range(m):\n",
" random_index = np.random.randint(m)\n",
" xi = X[random_index:random_index+1]\n",
" yi = y[random_index:random_index+1]\n",
" gradients = 2 * 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": "aab422e4",
"metadata": {},
"source": [
"**Challenge**: try to write a similar code for a Logistic Regression case."
]
},
{
"cell_type": "markdown",
"id": "017e3c2e",
"metadata": {},
"source": [
"## Code with a Number of Minibatches which varies\n",
"\n",
"In the code here we vary the number of mini-batches."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "6dd6f473",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Own inversion\n",
"[[3.67953556]\n",
" [3.40822206]]\n",
"Eigenvalues of Hessian Matrix:[0.31809257 4.43255082]\n",
"theta from own gd\n",
"[[3.67953556]\n",
" [3.40822206]]\n",
"theta from own sdg\n",
"[[3.67542608]\n",
" [3.39087114]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 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",
"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": "code",
"execution_count": null,
"id": "cf4d086e",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}