Files
FYS-STK4155/doc/LectureNotes/_build/jupyter_execute/chapteroptimization.ipynb
T
Morten Hjorth-Jensen 398fba5b97 update book
2022-08-23 11:19:05 +02:00

3938 lines
419 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": "4d72e1df",
"metadata": {
"editable": true
},
"source": [
"<!-- HTML file automatically generated from DocOnce source (https://github.com/doconce/doconce/)\n",
"doconce format html chapteroptimization.do.txt -->"
]
},
{
"cell_type": "markdown",
"id": "fb6e8fcd",
"metadata": {
"editable": true
},
"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.\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": "a507b82a",
"metadata": {
"editable": true
},
"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": "4071429e",
"metadata": {
"editable": true
},
"source": [
"where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$. \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": "a3cca0b2",
"metadata": {
"editable": true
},
"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": "12a4ad28",
"metadata": {
"editable": true
},
"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": "5d6e7796",
"metadata": {
"editable": true
},
"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": "b324ae78",
"metadata": {
"editable": true
},
"source": [
"This defines what is called the Hessian matrix.\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": "7c39cc3f",
"metadata": {
"editable": true
},
"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": "10749f5d",
"metadata": {
"editable": true
},
"source": [
"or in matrix form as"
]
},
{
"cell_type": "markdown",
"id": "3ec50136",
"metadata": {
"editable": true
},
"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": "0145d9eb",
"metadata": {
"editable": true
},
"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. \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.\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": "43c17534",
"metadata": {
"editable": true
},
"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": "32ef04f0",
"metadata": {
"editable": true
},
"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": "6700017c",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"f(x)+(s-x)f'(x)\\approx 0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "8791dec4",
"metadata": {
"editable": true
},
"source": [
"yielding"
]
},
{
"cell_type": "markdown",
"id": "69008872",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"s\\approx x-\\frac{f(x)}{f'(x)}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "fce4ef1f",
"metadata": {
"editable": true
},
"source": [
"Having in mind an iterative procedure, it is natural to start iterating with"
]
},
{
"cell_type": "markdown",
"id": "e64aef7e",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "9acecc44",
"metadata": {
"editable": true
},
"source": [
"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\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": "18bc9fd6",
"metadata": {
"editable": true
},
"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": "7dcad370",
"metadata": {
"editable": true
},
"source": [
"which we Taylor expand to obtain"
]
},
{
"cell_type": "markdown",
"id": "f1724121",
"metadata": {
"editable": true
},
"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": "d04bfa9f",
"metadata": {
"editable": true
},
"source": [
"Defining the Jacobian matrix $\\boldsymbol{J}$ we have"
]
},
{
"cell_type": "markdown",
"id": "a4d3a9e3",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\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": "d9d6ff69",
"metadata": {
"editable": true
},
"source": [
"we can rephrase Newton's method as"
]
},
{
"cell_type": "markdown",
"id": "362a86a3",
"metadata": {
"editable": true
},
"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": "4b8c2937",
"metadata": {
"editable": true
},
"source": [
"where we have defined"
]
},
{
"cell_type": "markdown",
"id": "7580aa9a",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n",
" -\\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": "a2e3adc3",
"metadata": {
"editable": true
},
"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 $\\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": "83a585c9",
"metadata": {
"editable": true
},
"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": "e127ea11",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "bce435bc",
"metadata": {
"editable": true
},
"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.\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": "2691da5f",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "e7ae7322",
"metadata": {
"editable": true
},
"source": [
"The parameter $\\gamma_k$ is often referred to as the step length or\n",
"the learning rate within the context of Machine Learning.\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.\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": "a6a44ea7",
"metadata": {
"editable": true
},
"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...).\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.\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.\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": "809f8f01",
"metadata": {
"editable": true
},
"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": "f3b91277",
"metadata": {
"editable": true
},
"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": "ec752109",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "eb64c8e7",
"metadata": {
"editable": true
},
"source": [
"In the iterative process we end up with a problem like"
]
},
{
"cell_type": "markdown",
"id": "7e99eb7f",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "3a3f6414",
"metadata": {
"editable": true
},
"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$.\n",
"\n",
"The residual is zero when we reach the minimum of the quadratic equation"
]
},
{
"cell_type": "markdown",
"id": "a88175a4",
"metadata": {
"editable": true
},
"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": "6992cc4f",
"metadata": {
"editable": true
},
"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. \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": "00e22e2b",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{x}_0=0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "faab896d",
"metadata": {
"editable": true
},
"source": [
"or consider the system"
]
},
{
"cell_type": "markdown",
"id": "02cb8061",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "fe52c448",
"metadata": {
"editable": true
},
"source": [
"instead.\n",
"\n",
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
]
},
{
"cell_type": "markdown",
"id": "f698b7fe",
"metadata": {
"editable": true
},
"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": "022bda7f",
"metadata": {
"editable": true
},
"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": "b64077bc",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "dec06904",
"metadata": {
"editable": true
},
"source": [
"and \n",
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n",
"\n",
"We can compute the residual iteratively as"
]
},
{
"cell_type": "markdown",
"id": "b566de75",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "2c2d16e7",
"metadata": {
"editable": true
},
"source": [
"which equals"
]
},
{
"cell_type": "markdown",
"id": "6c97f03d",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "2b40818b",
"metadata": {
"editable": true
},
"source": [
"or"
]
},
{
"cell_type": "markdown",
"id": "6619d064",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "467c71be",
"metadata": {
"editable": true
},
"source": [
"which gives"
]
},
{
"cell_type": "markdown",
"id": "d58fd1af",
"metadata": {
"editable": true
},
"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": "38e32957",
"metadata": {
"editable": true
},
"source": [
"leading to the iterative scheme"
]
},
{
"cell_type": "markdown",
"id": "98043fd6",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k-\\alpha_k\\boldsymbol{r}_{k},\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "8c7efe84",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-1-7f2b3a6174c2>:18: 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 0x11da42d90>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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s9x0002sXbt2xL3ajuMUiO55XuFEP12EOZ9eOh/yxhAUyxw7dowVK1aM6DTOT/fo6OgobHCni7wPF1JK9u7di67rZyT2Sy+9xIMPPsjTTz894S3Bo4wiuUcTiUSCxx9/nMcee4zu7m5uvPFG1q1bN+JKtbzcUHt7O7ZtF174fO13fijg+ZBegmDWdL6G/lzM7PwG19HRUajzH2nNe57YmqYxd+7cIX9u8+bN3H///fzsZz+bcI34MUCR3GOFrq4unnzySTZu3EhbWxvXX389t912GwsXLhxRQGlwBDqTyRAOh0mn06xcuXLC00sQVMF1dnaybNmyUc3tD/69h1vzng+CKopyxg1127ZtfPzjH+fxxx8/YwT9AkWR3OOB3t5ennrqKR577DGampp4xzvewbp161i+fPmIiH7s2DEOHz5MLBYjk8mMeZPHmXD48GF6e3tZtmzZmEbA8/PRE4kEfX19lJSUFNRm8huKlJLGxkaklMyfP3/I72Pnzp185CMfYcOGDcybN2/M1j3BKJJ7vJFMJtm0aRMbN25k3759XHvttaxdu5ZLLrlkSIIcPXq0cELqul544dvb2wsjhWtqasZNKXRw19t4p7b6+voKxUL5Ro++vj6AMxJ7z549fOhDH+KnP/3puOh8TyCK5J5IDO5J3759O29961tZu3Yta9asOeFEOlOdeH6kcHt7O729vYWTbSxyyvm0YH766EQXp6RSKfbu3UsmkyEejw8ZeW9sbOT9738/P/7xj1m6dOkErHhccWGS+7Of/SxPPfUUpmkye/ZsfvSjH034CJ5zRS6X4/nnn2fDhg1s2bKFK664gltvvZVNmzZx1113cemllw6LSPmTrb29ne7u7sLs8KqqqnP2ifOmr+/7Y1a3PtL1HDhwANd1WbhwYSG1eKrIe1NTE+95z3v493//91MOjRwNPPvss3zqU5/C930+8pGPFAQUJwgXJrmfe+45rrnmGnRd53Of+xwAf//3f3+ulz1v4DgOzz//PJ/+9KeJRCKsWrWK2267jauuumpEVW1SSvr7+wsmbF72eSh996GutXfvXhRFOaPpOx7IWxC2bbNo0aLXrSevsNPQ0MAXv/hFXNflb/7mb7j33nvHZO2+7zNv3jyef/556urquPTSS/mv//qviTT9x+QBjbkDdt111xVezjVr1tDS0jLWtxxXmKbJgQMH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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_61_2.png"
},
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"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 0.5*x[0]**2 + 2.5*x[1]**2\n",
"\n",
"def df(x):\n",
" return np.array([x[0], 5*x[1]])\n",
"\n",
"fig = pt.figure()\n",
"ax = fig.gca(projection=\"3d\")\n",
"\n",
"xmesh, ymesh = np.mgrid[-2:2:50j,-2:2:50j]\n",
"fmesh = f(np.array([xmesh, ymesh]))\n",
"ax.plot_surface(xmesh, ymesh, fmesh)"
]
},
{
"cell_type": "markdown",
"id": "3bdeb3c1",
"metadata": {
"editable": true
},
"source": [
"And then as countor plot"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "e6e460db",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_63_0.png"
},
"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": "d165add7",
"metadata": {
"editable": true
},
"source": [
"Find guesses"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "236615ae",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"x = guesses[-1]\n",
"s = -df(x)"
]
},
{
"cell_type": "markdown",
"id": "4b90442c",
"metadata": {
"editable": true
},
"source": [
"Run it!"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "0346fd1d",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 1.33333333 -0.26666667]\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": "ecff8b5b",
"metadata": {
"editable": true
},
"source": [
"What happened?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "0d9b7732",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x11e031e50>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_69_1.png"
},
"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": "b0f8920b",
"metadata": {
"editable": true
},
"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": "67b215c6",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "efc1c192",
"metadata": {
"editable": true
},
"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": "eb4e1832",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "775cf999",
"metadata": {
"editable": true
},
"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}$.\n",
"\n",
"An example is given by the eigenvectors of the matrix"
]
},
{
"cell_type": "markdown",
"id": "95893950",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "16bfad5c",
"metadata": {
"editable": true
},
"source": [
"which is zero unless $i=j$. \n",
"\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": "e2577f1c",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "e4defaaf",
"metadata": {
"editable": true
},
"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": "b4632612",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "a0a06bf2",
"metadata": {
"editable": true
},
"source": [
"The coefficients are given by"
]
},
{
"cell_type": "markdown",
"id": "1db7cc6a",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "e7aa5384",
"metadata": {
"editable": true
},
"source": [
"Multiplying with $\\boldsymbol{p}_k^T$ from the left gives"
]
},
{
"cell_type": "markdown",
"id": "884580b0",
"metadata": {
"editable": true
},
"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": "934990e4",
"metadata": {
"editable": true
},
"source": [
"and we can define the coefficients $\\alpha_k$ as"
]
},
{
"cell_type": "markdown",
"id": "8be96384",
"metadata": {
"editable": true
},
"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": "44f4d8d5",
"metadata": {
"editable": true
},
"source": [
"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": "a8739d7d",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{x}_0=0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "d871e171",
"metadata": {
"editable": true
},
"source": [
"or consider the system"
]
},
{
"cell_type": "markdown",
"id": "7ed84e84",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "b690f75b",
"metadata": {
"editable": true
},
"source": [
"instead.\n",
"\n",
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
]
},
{
"cell_type": "markdown",
"id": "86ce9e8a",
"metadata": {
"editable": true
},
"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": "7968787f",
"metadata": {
"editable": true
},
"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": "0d510b11",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "c7c47a8e",
"metadata": {
"editable": true
},
"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.\n",
"\n",
"Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:"
]
},
{
"cell_type": "markdown",
"id": "5dc0e4ac",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "0aecb4b3",
"metadata": {
"editable": true
},
"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": "f3dfc701",
"metadata": {
"editable": true
},
"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": "12e92892",
"metadata": {
"editable": true
},
"source": [
"We can also compute the residual iteratively as"
]
},
{
"cell_type": "markdown",
"id": "1514b03f",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "7b09db3d",
"metadata": {
"editable": true
},
"source": [
"which equals"
]
},
{
"cell_type": "markdown",
"id": "4a0638f8",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "298f5e46",
"metadata": {
"editable": true
},
"source": [
"or"
]
},
{
"cell_type": "markdown",
"id": "acd35abb",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "79625f01",
"metadata": {
"editable": true
},
"source": [
"which gives"
]
},
{
"cell_type": "markdown",
"id": "dc5888e2",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "d11b96a9",
"metadata": {
"editable": true
},
"source": [
"## Revisiting our Linear Regression Solvers\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.\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": 6,
"id": "cf7c349e",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"m = 100\n",
"x = 2*np.random.rand(m,1)\n",
"y = 4+3*x+np.random.randn(m,1)"
]
},
{
"cell_type": "markdown",
"id": "adf34219",
"metadata": {
"editable": true
},
"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": "d28eb4e0",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "60060fcb",
"metadata": {
"editable": true
},
"source": [
"such that"
]
},
{
"cell_type": "markdown",
"id": "82983f16",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "60fc4bc0",
"metadata": {
"editable": true
},
"source": [
"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": "0c5dac72",
"metadata": {
"editable": true
},
"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": "002d8c9b",
"metadata": {
"editable": true
},
"source": [
"The cost/loss/risk function is given by ("
]
},
{
"cell_type": "markdown",
"id": "b91d8b5a",
"metadata": {
"editable": true
},
"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": "d0fc6c20",
"metadata": {
"editable": true
},
"source": [
"and we want to find $\\beta$ such that $C(\\beta)$ is minimized.\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": "3f99dab5",
"metadata": {
"editable": true
},
"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": "e1305a22",
"metadata": {
"editable": true
},
"source": [
"where $X$ is the design matrix defined above.\n",
"\n",
"The Hessian matrix of $C(\\beta)$ is given by"
]
},
{
"cell_type": "markdown",
"id": "ef62073f",
"metadata": {
"editable": true
},
"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": "dfb78235",
"metadata": {
"editable": true
},
"source": [
"This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite.\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": "56cee86c",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6cc71454",
"metadata": {
"editable": true
},
"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}$.\n",
"\n",
"Here is our simple example"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "90fab6b7",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.29588901 4.59955801]\n",
"[[4.21985165]\n",
" [2.77627886]]\n",
"[[4.21985165]\n",
" [2.77627886]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_123_1.png"
},
"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(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": "48ba87fe",
"metadata": {
"editable": true
},
"source": [
"Alternatively, we can use **Scikit-Learn** as done here"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "7522775d",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[3.54163136]\n",
" [3.31866499]]\n",
"[3.59833875] [3.3594821]\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": "90552e2f",
"metadata": {
"editable": true
},
"source": [
"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": "5d7c032c",
"metadata": {
"editable": true
},
"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": "ed86f1ba",
"metadata": {
"editable": true
},
"source": [
"In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we only have adjust the gradient as follows"
]
},
{
"cell_type": "markdown",
"id": "0386e23c",
"metadata": {
"editable": true
},
"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 (X^T(X\\beta - \\mathbf{y})+\\lambda \\beta).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "b65523fc",
"metadata": {
"editable": true
},
"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": "c62584ee",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\beta_{\\text{ridge}} = \\left(X^T X + \\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y}.\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e8d43667",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[4.00673393]\n",
" [2.84569271]]\n",
"[[3.98017611]\n",
" [2.86623151]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_132_1.png"
},
"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 = lmbda* np.eye(XT_X.shape[0])\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 = 0.1\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": "1ca83847",
"metadata": {
"editable": true
},
"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": "dcf3e808",
"metadata": {
"editable": true
},
"source": [
"## Stochastic Gradient Descent (SGD)\n",
"\n",
"In stochastic gradient descent, the extreme case is the case where we\n",
"have only one batch, that is we include the whole data set.\n",
"\n",
"This process is called Stochastic Gradient\n",
"Descent (SGD) (or also sometimes on-line gradient descent). This is\n",
"relatively less common to see because in practice due to vectorized\n",
"code optimizations it can be computationally much more efficient to\n",
"evaluate the gradient for 100 examples, than the gradient for one\n",
"example 100 times. Even though SGD technically refers to using a\n",
"single example at a time to evaluate the gradient, you will hear\n",
"people use the term SGD even when referring to mini-batch gradient\n",
"descent (i.e. mentions of MGD for “Minibatch Gradient Descent”, or BGD\n",
"for “Batch gradient descent” are rare to see), where it is usually\n",
"assumed that mini-batches are used. The size of the mini-batch is a\n",
"hyperparameter but it is not very common to cross-validate or bootstrap it. It is\n",
"usually based on memory constraints (if any), or set to some value,\n",
"e.g. 32, 64 or 128. We use powers of 2 in practice because many\n",
"vectorized operation implementations work faster when their inputs are\n",
"sized in powers of 2.\n",
"\n",
"In our notes with SGD we mean stochastic gradient descent with mini-batches.\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": "473b1af6",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "3353fe2a",
"metadata": {
"editable": true
},
"source": [
"This in turn means that the gradient can be\n",
"computed as a sum over $i$-gradients"
]
},
{
"cell_type": "markdown",
"id": "6e8e47c3",
"metadata": {
"editable": true
},
"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": "a2eeb6ad",
"metadata": {
"editable": true
},
"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$.\n",
"\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": "5a7a0f8b",
"metadata": {
"editable": true
},
"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": "b7b5884f",
"metadata": {
"editable": true
},
"source": [
"Thus a gradient descent step now looks like"
]
},
{
"cell_type": "markdown",
"id": "6492d660",
"metadata": {
"editable": true
},
"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": "584164f4",
"metadata": {
"editable": true
},
"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": "code",
"execution_count": 10,
"id": "42d97cf8",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"import numpy as np \n",
"\n",
"n = 100 #100 datapoints \n",
"M = 5 #size of each mini-batche\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": "ca9c6c58",
"metadata": {
"editable": true
},
"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.\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.\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": 11,
"id": "d2921658",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"gamma_j after 500 epochs: 9.97108e-05\n"
]
}
],
"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": "84469eb8",
"metadata": {
"editable": true
},
"source": [
"We note that we have defined several hyperparameters. These are now the number of epochs, the number of mini-batches and the parameters $t_0$ and $t_1$."
]
},
{
"cell_type": "markdown",
"id": "b4b94e7a",
"metadata": {
"editable": true
},
"source": [
"### Program for stochastic gradient"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "71dcdb35",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Own inversion\n",
"[[3.99519225]\n",
" [3.01509543]]\n",
"Eigenvalues of Hessian Matrix:[0.29229741 4.7643536 ]\n",
"theta from own gd\n",
"[[3.99519225]\n",
" [3.01509543]]\n",
"theta from own sdg\n",
"[[3.98756882]\n",
" [3.02625928]]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_148_1.png"
},
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Importing various packages\n",
"# Importing various packages\n",
"from math import exp, sqrt\n",
"from random import random, seed\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"n = 100\n",
"x = 2*np.random.rand(n,1)\n",
"y = 4+3*x+np.random.randn(n,1)\n",
"\n",
"X = np.c_[np.ones((n,1)), x]\n",
"XT_X = X.T @ X\n",
"theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n",
"print(\"Own inversion\")\n",
"print(theta_linreg)\n",
"# Hessian matrix\n",
"H = (2.0/n)* XT_X\n",
"EigValues, EigVectors = np.linalg.eig(H)\n",
"print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n",
"\n",
"theta = np.random.randn(2,1)\n",
"eta = 1.0/np.max(EigValues)\n",
"Niterations = 1000\n",
"\n",
"\n",
"for iter in range(Niterations):\n",
" gradients = 2.0/n*X.T @ ((X @ theta)-y)\n",
" theta -= eta*gradients\n",
"print(\"theta from own gd\")\n",
"print(theta)\n",
"\n",
"xnew = np.array([[0],[2]])\n",
"Xnew = np.c_[np.ones((2,1)), xnew]\n",
"ypredict = Xnew.dot(theta)\n",
"ypredict2 = Xnew.dot(theta_linreg)\n",
"\n",
"n_epochs = 50\n",
"M = 5 #size of each minibatch\n",
"m = int(n/M) #number of minibatches\n",
"t0, t1 = 5, 50\n",
"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",
"\n",
"\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": "6231b86f",
"metadata": {
"editable": true
},
"source": [
"In the above code, we have use replacement in setting up the\n",
"mini-batches. The discussion\n",
"[here](https://sebastianraschka.com/faq/docs/sgd-methods.html) may be\n",
"useful. More material will be added later."
]
},
{
"cell_type": "markdown",
"id": "8d50214c",
"metadata": {
"editable": true
},
"source": [
"## Momentum based GD\n",
"\n",
"The stochastic gradient descent (SGD) is almost always used with a\n",
"*momentum* or inertia term that serves as a memory of the direction we\n",
"are moving in parameter space. This is typically implemented as\n",
"follows"
]
},
{
"cell_type": "markdown",
"id": "45d43ca3",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "dcdd91bf",
"metadata": {
"editable": true
},
"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{2}\n",
"\\end{equation}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "c7519d1e",
"metadata": {
"editable": true
},
"source": [
"where we have introduced a momentum parameter $\\gamma$, with\n",
"$0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to\n",
"indicate the gradient is to be taken over a different mini-batch at\n",
"each step. We call this algorithm gradient descent with momentum\n",
"(GDM). From these equations, it is clear that $\\mathbf{v}_t$ is a\n",
"running average of recently encountered gradients and\n",
"$(1-\\gamma)^{-1}$ sets the characteristic time scale for the memory\n",
"used in the averaging procedure. Consistent with this, when\n",
"$\\gamma=0$, this just reduces down to ordinary SGD as discussed\n",
"earlier. An equivalent way of writing the updates is"
]
},
{
"cell_type": "markdown",
"id": "f4d4340d",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "41ad532a",
"metadata": {
"editable": true
},
"source": [
"where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$.\n",
"\n",
"Let us try to get more intuition from these equations. It is helpful\n",
"to consider a simple physical analogy with a particle of mass $m$\n",
"moving in a viscous medium with drag coefficient $\\mu$ and potential\n",
"$E(\\mathbf{w})$. If we denote the particle's position by $\\mathbf{w}$,\n",
"then its motion is described by"
]
},
{
"cell_type": "markdown",
"id": "eef8ae92",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"m {d^2 \\mathbf{w} \\over dt^2} + \\mu {d \\mathbf{w} \\over dt }= -\\nabla_w E(\\mathbf{w}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "80481a6d",
"metadata": {
"editable": true
},
"source": [
"We can discretize this equation in the usual way to get"
]
},
{
"cell_type": "markdown",
"id": "6aab8db7",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"m { \\mathbf{w}_{t+\\Delta t}-2 \\mathbf{w}_{t} +\\mathbf{w}_{t-\\Delta t} \\over (\\Delta t)^2}+\\mu {\\mathbf{w}_{t+\\Delta t}- \\mathbf{w}_{t} \\over \\Delta t} = -\\nabla_w E(\\mathbf{w}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "dd6414d2",
"metadata": {
"editable": true
},
"source": [
"Rearranging this equation, we can rewrite this as"
]
},
{
"cell_type": "markdown",
"id": "b76a8372",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\Delta \\mathbf{w}_{t +\\Delta t}= - { (\\Delta t)^2 \\over m +\\mu \\Delta t} \\nabla_w E(\\mathbf{w})+ {m \\over m +\\mu \\Delta t} \\Delta \\mathbf{w}_t.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "07bbe6db",
"metadata": {
"editable": true
},
"source": [
"Notice that this equation is identical to previous one if we identify\n",
"the position of the particle, $\\mathbf{w}$, with the parameters\n",
"$\\boldsymbol{\\theta}$. This allows us to identify the momentum\n",
"parameter and learning rate with the mass of the particle and the\n",
"viscous drag as:"
]
},
{
"cell_type": "markdown",
"id": "7a9a2ecf",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\gamma= {m \\over m +\\mu \\Delta t }, \\qquad \\eta = {(\\Delta t)^2 \\over m +\\mu \\Delta t}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "fe5a2bbc",
"metadata": {
"editable": true
},
"source": [
"Thus, as the name suggests, the momentum parameter is proportional to\n",
"the mass of the particle and effectively provides inertia.\n",
"Furthermore, in the large viscosity/small learning rate limit, our\n",
"memory time scales as $(1-\\gamma)^{-1} \\approx m/(\\mu \\Delta t)$.\n",
"\n",
"Why is momentum useful? SGD momentum helps the gradient descent\n",
"algorithm gain speed in directions with persistent but small gradients\n",
"even in the presence of stochasticity, while suppressing oscillations\n",
"in high-curvature directions. This becomes especially important in\n",
"situations where the landscape is shallow and flat in some directions\n",
"and narrow and steep in others. It has been argued that first-order\n",
"methods (with appropriate initial conditions) can perform comparable\n",
"to more expensive second order methods, especially in the context of\n",
"complex deep learning models.\n",
"\n",
"These beneficial properties of momentum can sometimes become even more\n",
"pronounced by using a slight modification of the classical momentum\n",
"algorithm called Nesterov Accelerated Gradient (NAG).\n",
"\n",
"In the NAG algorithm, rather than calculating the gradient at the\n",
"current parameters, $\\nabla_\\theta E(\\boldsymbol{\\theta}_t)$, one\n",
"calculates the gradient at the expected value of the parameters given\n",
"our current momentum, $\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma\n",
"\\mathbf{v}_{t-1})$. This yields the NAG update rule"
]
},
{
"cell_type": "markdown",
"id": "04540023",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma \\mathbf{v}_{t-1}) \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "dfbf53a5",
"metadata": {
"editable": true
},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"_auto2\"></div>\n",
"\n",
"$$\n",
"\\begin{equation} \n",
"\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t}.\n",
"\\label{_auto2} \\tag{3}\n",
"\\end{equation}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "32ac3869",
"metadata": {
"editable": true
},
"source": [
"One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of $\\gamma$.\n",
"\n",
"In stochastic gradient descent, with and without momentum, we still\n",
"have to specify a schedule for tuning the learning rates $\\eta_t$\n",
"as a function of time. As discussed in the context of Newton's\n",
"method, this presents a number of dilemmas. The learning rate is\n",
"limited by the steepest direction which can change depending on the\n",
"current position in the landscape. To circumvent this problem, ideally\n",
"our algorithm would keep track of curvature and take large steps in\n",
"shallow, flat directions and small steps in steep, narrow directions.\n",
"Second-order methods accomplish this by calculating or approximating\n",
"the Hessian and normalizing the learning rate by the\n",
"curvature. However, this is very computationally expensive for\n",
"extremely large models. Ideally, we would like to be able to\n",
"adaptively change the step size to match the landscape without paying\n",
"the steep computational price of calculating or approximating\n",
"Hessians.\n",
"\n",
"Recently, a number of methods have been introduced that accomplish\n",
"this by tracking not only the gradient, but also the second moment of\n",
"the gradient. These methods include AdaGrad, AdaDelta, Root Mean Squared Propagation (RMS-Prop), and\n",
"ADAM."
]
},
{
"cell_type": "markdown",
"id": "6f575b16",
"metadata": {
"editable": true
},
"source": [
"### RMS prop\n",
"\n",
"In RMS prop, in addition to keeping a running average of the first\n",
"moment of the gradient, we also keep track of the second moment\n",
"denoted by $\\mathbf{s}_t=\\mathbb{E}[\\mathbf{g}_t^2]$. The update rule\n",
"for RMS prop is given by"
]
},
{
"cell_type": "markdown",
"id": "274604c4",
"metadata": {
"editable": true
},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"_auto3\"></div>\n",
"\n",
"$$\n",
"\\begin{equation}\n",
"\\mathbf{g}_t = \\nabla_\\theta E(\\boldsymbol{\\theta}) \n",
"\\label{_auto3} \\tag{4}\n",
"\\end{equation}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "cd679323",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{s}_t =\\beta \\mathbf{s}_{t-1} +(1-\\beta)\\mathbf{g}_t^2 \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "0a7f8e9d",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\mathbf{g}_t \\over \\sqrt{\\mathbf{s}_t +\\epsilon}}, \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "48ba8fff",
"metadata": {
"editable": true
},
"source": [
"where $\\beta$ controls the averaging time of the second moment and is\n",
"typically taken to be about $\\beta=0.9$, $\\eta_t$ is a learning rate\n",
"typically chosen to be $10^{-3}$, and $\\epsilon\\sim 10^{-8} $ is a\n",
"small regularization constant to prevent divergences. Multiplication\n",
"and division by vectors is understood as an element-wise operation. It\n",
"is clear from this formula that the learning rate is reduced in\n",
"directions where the norm of the gradient is consistently large. This\n",
"greatly speeds up the convergence by allowing us to use a larger\n",
"learning rate for flat directions."
]
},
{
"cell_type": "markdown",
"id": "83140ab2",
"metadata": {
"editable": true
},
"source": [
"### ADAM optimizer\n",
"\n",
"A related algorithm is the ADAM optimizer. In ADAM, we keep a running\n",
"average of both the first and second moment of the gradient and use\n",
"this information to adaptively change the learning rate for different\n",
"parameters. In addition to keeping a running average of the first and\n",
"second moments of the gradient\n",
"(i.e. $\\mathbf{m}_t=\\mathbb{E}[\\mathbf{g}_t]$ and\n",
"$\\mathbf{s}_t=\\mathbb{E}[\\mathbf{g}^2_t]$, respectively), ADAM\n",
"performs an additional bias correction to account for the fact that we\n",
"are estimating the first two moments of the gradient using a running\n",
"average (denoted by the hats in the update rule below). The update\n",
"rule for ADAM is given by (where multiplication and division are once\n",
"again understood to be element-wise operations below)"
]
},
{
"cell_type": "markdown",
"id": "61874dc3",
"metadata": {
"editable": true
},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"_auto4\"></div>\n",
"\n",
"$$\n",
"\\begin{equation}\n",
"\\mathbf{g}_t = \\nabla_\\theta E(\\boldsymbol{\\theta}) \n",
"\\label{_auto4} \\tag{5}\n",
"\\end{equation}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "24e19d86",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{m}_t = \\beta_1 \\mathbf{m}_{t-1} + (1-\\beta_1) \\mathbf{g}_t \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "506f78ea",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\mathbf{s}_t =\\beta_2 \\mathbf{s}_{t-1} +(1-\\beta_2)\\mathbf{g}_t^2 \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "cb4b8585",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{\\mathbf{m}}_t={\\mathbf{m}_t \\over 1-\\beta_1^t} \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "9b5b11b1",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{\\mathbf{s}}_t ={\\mathbf{s}_t \\over1-\\beta_2^t} \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "92292a73",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\boldsymbol{\\mathbf{m}}_t \\over \\sqrt{\\boldsymbol{\\mathbf{s}}_t} +\\epsilon}, \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "1a264832",
"metadata": {
"editable": true
},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"_auto5\"></div>\n",
"\n",
"$$\n",
"\\begin{equation} \n",
"\\label{_auto5} \\tag{6}\n",
"\\end{equation}\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "6a307202",
"metadata": {
"editable": true
},
"source": [
"where $\\beta_1$ and $\\beta_2$ set the memory lifetime of the first and\n",
"second moment and are typically taken to be $0.9$ and $0.99$\n",
"respectively, and $\\eta$ and $\\epsilon$ are identical to RMSprop.\n",
"\n",
"Like in RMSprop, the effective step size of a parameter depends on the\n",
"magnitude of its gradient squared. To understand this better, let us\n",
"rewrite this expression in terms of the variance\n",
"$\\boldsymbol{\\sigma}_t^2 = \\boldsymbol{\\mathbf{s}}_t -\n",
"(\\boldsymbol{\\mathbf{m}}_t)^2$. Consider a single parameter $\\theta_t$. The\n",
"update rule for this parameter is given by"
]
},
{
"cell_type": "markdown",
"id": "3285f010",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"\\Delta \\theta_{t+1}= -\\eta_t { \\boldsymbol{m}_t \\over \\sqrt{\\sigma_t^2 + m_t^2 }+\\epsilon}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "657349da",
"metadata": {
"editable": true
},
"source": [
"## Practical tips\n",
"\n",
"* **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.\n",
"\n",
"* **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.\n",
"\n",
"* **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings.\n",
"\n",
"* **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications."
]
},
{
"cell_type": "markdown",
"id": "65044ac7",
"metadata": {
"editable": true
},
"source": [
"## Automatic differentiation\n",
"\n",
"[Automatic differentiation (AD)](https://en.wikipedia.org/wiki/Automatic_differentiation), \n",
"also called algorithmic\n",
"differentiation or computational differentiation,is a set of\n",
"techniques to numerically evaluate the derivative of a function\n",
"specified by a computer program. AD exploits the fact that every\n",
"computer program, no matter how complicated, executes a sequence of\n",
"elementary arithmetic operations (addition, subtraction,\n",
"multiplication, division, etc.) and elementary functions (exp, log,\n",
"sin, cos, etc.). By applying the chain rule repeatedly to these\n",
"operations, derivatives of arbitrary order can be computed\n",
"automatically, accurately to working precision, and using at most a\n",
"small constant factor more arithmetic operations than the original\n",
"program.\n",
"\n",
"Automatic differentiation is neither:\n",
"\n",
"* Symbolic differentiation, nor\n",
"\n",
"* Numerical differentiation (the method of finite differences).\n",
"\n",
"Symbolic differentiation can lead to inefficient code and faces the\n",
"difficulty of converting a computer program into a single expression,\n",
"while numerical differentiation can introduce round-off errors in the\n",
"discretization process and cancellation\n",
"\n",
"Python has tools for so-called **automatic differentiation**.\n",
"Consider the following example"
]
},
{
"cell_type": "markdown",
"id": "dacf05cf",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"f(x) = \\sin\\left(2\\pi x + x^2\\right)\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "da4ad36e",
"metadata": {
"editable": true
},
"source": [
"which has the following derivative"
]
},
{
"cell_type": "markdown",
"id": "f4c3e6c4",
"metadata": {
"editable": true
},
"source": [
"$$\n",
"f'(x) = \\cos\\left(2\\pi x + x^2\\right)\\left(2\\pi + 2x\\right)\n",
"$$"
]
},
{
"cell_type": "markdown",
"id": "1c8bfd4a",
"metadata": {
"editable": true
},
"source": [
"Using **autograd** we have"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "e1d91b8b",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_188_0.png"
},
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"The max absolute difference is: 1.77636e-15\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"\n",
"# To do elementwise differentiation:\n",
"from autograd import elementwise_grad as egrad \n",
"\n",
"# To plot:\n",
"import matplotlib.pyplot as plt \n",
"\n",
"\n",
"def f(x):\n",
" return np.sin(2*np.pi*x + x**2)\n",
"\n",
"def f_grad_analytic(x):\n",
" return np.cos(2*np.pi*x + x**2)*(2*np.pi + 2*x)\n",
"\n",
"# Do the comparison:\n",
"x = np.linspace(0,1,1000)\n",
"\n",
"f_grad = egrad(f)\n",
"\n",
"computed = f_grad(x)\n",
"analytic = f_grad_analytic(x)\n",
"\n",
"plt.title('Derivative computed from Autograd compared with the analytical derivative')\n",
"plt.plot(x,computed,label='autograd')\n",
"plt.plot(x,analytic,label='analytic')\n",
"\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.legend()\n",
"\n",
"plt.show()\n",
"\n",
"print(\"The max absolute difference is: %g\"%(np.max(np.abs(computed - analytic))))"
]
},
{
"cell_type": "markdown",
"id": "cd1158a5",
"metadata": {
"editable": true
},
"source": [
"Here we\n",
"experiment with what kind of functions Autograd is capable\n",
"of finding the gradient of. The following Python functions are just\n",
"meant to illustrate what Autograd can do, but please feel free to\n",
"experiment with other, possibly more complicated, functions as well."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "e2e9faff",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The gradient of f1 evaluated at a = 1 using autograd is: 3\n",
"The gradient of f1 evaluated at a = 1 by finding the analytic expression is: 3\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"\n",
"def f1(x):\n",
" return x**3 + 1\n",
"\n",
"f1_grad = grad(f1)\n",
"\n",
"# Remember to send in float as argument to the computed gradient from Autograd!\n",
"a = 1.0\n",
"\n",
"# See the evaluated gradient at a using autograd:\n",
"print(\"The gradient of f1 evaluated at a = %g using autograd is: %g\"%(a,f1_grad(a)))\n",
"\n",
"# Compare with the analytical derivative, that is f1'(x) = 3*x**2 \n",
"grad_analytical = 3*a**2\n",
"print(\"The gradient of f1 evaluated at a = %g by finding the analytic expression is: %g\"%(a,grad_analytical))"
]
},
{
"cell_type": "markdown",
"id": "e4a83059",
"metadata": {
"editable": true
},
"source": [
"To differentiate with respect to two (or more) arguments of a Python\n",
"function, Autograd need to know at which variable the function if\n",
"being differentiated with respect to."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "f65983d8",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating at x1 = 1, x2 = 3\n",
"------------------------------\n",
"The derivative of f2 w.r.t x1: 12\n",
"The analytical derivative of f2 w.r.t x1: 12\n",
"\n",
"The derivative of f2 w.r.t x2: -4\n",
"The analytical derivative of f2 w.r.t x2: -4\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f2(x1,x2):\n",
" return 3*x1**3 + x2*(x1 - 5) + 1\n",
"\n",
"# By sending the argument 0, Autograd will compute the derivative w.r.t the first variable, in this case x1\n",
"f2_grad_x1 = grad(f2,0)\n",
"\n",
"# ... and differentiate w.r.t x2 by sending 1 as an additional arugment to grad\n",
"f2_grad_x2 = grad(f2,1)\n",
"\n",
"x1 = 1.0\n",
"x2 = 3.0 \n",
"\n",
"print(\"Evaluating at x1 = %g, x2 = %g\"%(x1,x2))\n",
"print(\"-\"*30)\n",
"\n",
"# Compare with the analytical derivatives:\n",
"\n",
"# Derivative of f2 w.r.t x1 is: 9*x1**2 + x2:\n",
"f2_grad_x1_analytical = 9*x1**2 + x2\n",
"\n",
"# Derivative of f2 w.r.t x2 is: x1 - 5:\n",
"f2_grad_x2_analytical = x1 - 5\n",
"\n",
"# See the evaluated derivations:\n",
"print(\"The derivative of f2 w.r.t x1: %g\"%( f2_grad_x1(x1,x2) ))\n",
"print(\"The analytical derivative of f2 w.r.t x1: %g\"%( f2_grad_x1(x1,x2) ))\n",
"\n",
"print()\n",
"\n",
"print(\"The derivative of f2 w.r.t x2: %g\"%( f2_grad_x2(x1,x2) ))\n",
"print(\"The analytical derivative of f2 w.r.t x2: %g\"%( f2_grad_x2(x1,x2) ))"
]
},
{
"cell_type": "markdown",
"id": "1d369f97",
"metadata": {
"editable": true
},
"source": [
"Note that the grad function will not produce the true gradient of the function. The true gradient of a function with two or more variables will produce a vector, where each element is the function differentiated w.r.t a variable."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "46ea0652",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The computed gradient of f3 is: [ 2. 3. 5. 7. 88.]\n",
"The analytical gradient of f3 is: [ 2. 3. 5. 7. 88.]\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f3(x): # Assumes x is an array of length 5 or higher\n",
" return 2*x[0] + 3*x[1] + 5*x[2] + 7*x[3] + 11*x[4]**2\n",
"\n",
"f3_grad = grad(f3)\n",
"\n",
"x = np.linspace(0,4,5)\n",
"\n",
"# Print the computed gradient:\n",
"print(\"The computed gradient of f3 is: \", f3_grad(x))\n",
"\n",
"# The analytical gradient is: (2, 3, 5, 7, 22*x[4])\n",
"f3_grad_analytical = np.array([2, 3, 5, 7, 22*x[4]])\n",
"\n",
"# Print the analytical gradient:\n",
"print(\"The analytical gradient of f3 is: \", f3_grad_analytical)"
]
},
{
"cell_type": "markdown",
"id": "9cc6674a",
"metadata": {
"editable": true
},
"source": [
"Note that in this case, when sending an array as input argument, the\n",
"output from Autograd is another array. This is the true gradient of\n",
"the function, as opposed to the function in the previous example. By\n",
"using arrays to represent the variables, the output from Autograd\n",
"might be easier to work with, as the output is closer to what one\n",
"could expect form a gradient-evaluting function."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "17813055",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The computed derivative of f4 at x = 2.7 is: 13.8759\n",
"The analytical gradient of f4 at x = 2.7 is: 13.8759\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f4(x):\n",
" return np.sqrt(1+x**2) + np.exp(x) + np.sin(2*np.pi*x)\n",
"\n",
"f4_grad = grad(f4)\n",
"\n",
"x = 2.7\n",
"\n",
"# Print the computed derivative:\n",
"print(\"The computed derivative of f4 at x = %g is: %g\"%(x,f4_grad(x)))\n",
"\n",
"# The analytical derivative is: x/sqrt(1 + x**2) + exp(x) + cos(2*pi*x)*2*pi\n",
"f4_grad_analytical = x/np.sqrt(1 + x**2) + np.exp(x) + np.cos(2*np.pi*x)*2*np.pi\n",
"\n",
"# Print the analytical gradient:\n",
"print(\"The analytical gradient of f4 at x = %g is: %g\"%(x,f4_grad_analytical))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "6da49540",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The computed derivative of f5 at x = 2.7 is: 5.4\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f5(x):\n",
" if x >= 0:\n",
" return x**2\n",
" else:\n",
" return -3*x + 1\n",
"\n",
"f5_grad = grad(f5)\n",
"\n",
"x = 2.7\n",
"\n",
"# Print the computed derivative:\n",
"print(\"The computed derivative of f5 at x = %g is: %g\"%(x,f5_grad(x)))"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "a8ff2c17",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The computed derivative of f6_for at x = 0.5 is: 3.95703\n",
"The computed derivative of f6_while at x = 0.5 is: 3.95703\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f6_for(x):\n",
" val = 0\n",
" for i in range(10):\n",
" val = val + x**i\n",
" return val\n",
"\n",
"def f6_while(x):\n",
" val = 0\n",
" i = 0\n",
" while i < 10:\n",
" val = val + x**i\n",
" i = i + 1\n",
" return val\n",
"\n",
"f6_for_grad = grad(f6_for)\n",
"f6_while_grad = grad(f6_while)\n",
"\n",
"x = 0.5\n",
"\n",
"# Print the computed derivaties of f6_for and f6_while\n",
"print(\"The computed derivative of f6_for at x = %g is: %g\"%(x,f6_for_grad(x)))\n",
"print(\"The computed derivative of f6_while at x = %g is: %g\"%(x,f6_while_grad(x)))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "ec67d4a3",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The analytical derivative of f6 at x = 0.5 is: 3.95703\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"# Both of the functions are implementation of the sum: sum(x**i) for i = 0, ..., 9\n",
"# The analytical derivative is: sum(i*x**(i-1)) \n",
"f6_grad_analytical = 0\n",
"for i in range(10):\n",
" f6_grad_analytical += i*x**(i-1)\n",
"\n",
"print(\"The analytical derivative of f6 at x = %g is: %g\"%(x,f6_grad_analytical))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "742a2d68",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The computed derivative of f7 at n = 2 is: 1\n",
"The analytical derivative of f7 at n = 2 is: 1\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"\n",
"def f7(n): # Assume that n is an integer\n",
" if n == 1 or n == 0:\n",
" return 1\n",
" else:\n",
" return n*f7(n-1)\n",
"\n",
"f7_grad = grad(f7)\n",
"\n",
"n = 2.0\n",
"\n",
"print(\"The computed derivative of f7 at n = %d is: %g\"%(n,f7_grad(n)))\n",
"\n",
"# The function f7 is an implementation of the factorial of n.\n",
"# By using the product rule, one can find that the derivative is:\n",
"\n",
"f7_grad_analytical = 0\n",
"for i in range(int(n)-1):\n",
" tmp = 1\n",
" for k in range(int(n)-1):\n",
" if k != i:\n",
" tmp *= (n - k)\n",
" f7_grad_analytical += tmp\n",
"\n",
"print(\"The analytical derivative of f7 at n = %d is: %g\"%(n,f7_grad_analytical))"
]
},
{
"cell_type": "markdown",
"id": "e7be6348",
"metadata": {
"editable": true
},
"source": [
"Note that if n is equal to zero or one, Autograd will give an error message. This message appears when the output is independent on input.\n",
"\n",
"Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd.\n",
"\n",
"Assigning a value to the variable being differentiated with respect to"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "c551058c",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"ename": "TypeError",
"evalue": "'ArrayBox' object does not support item assignment",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-22-cabc613b8702>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m8.4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"The derivative of f8 is:\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf8_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36mnary_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0munary_operator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munary_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mnary_op_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mnary_op_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_f\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_operator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/autograd/differential_operators.py\u001b[0m in \u001b[0;36mgrad\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0marguments\u001b[0m \u001b[0;32mas\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbut\u001b[0m \u001b[0mreturns\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgradient\u001b[0m \u001b[0minstead\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mThe\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m should be scalar-valued. The gradient has the same type as the argument.\"\"\"\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mvjp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_make_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 26\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mans\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m raise TypeError(\"Grad only applies to real scalar-output functions. \"\n",
"\u001b[0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/autograd/core.py\u001b[0m in \u001b[0;36mmake_vjp\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmake_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVJPNode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_root\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_node\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/autograd/tracer.py\u001b[0m in \u001b[0;36mtrace\u001b[0;34m(start_node, fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace_stack\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_trace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_box\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart_node\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_box\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misbox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mend_box\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mstart_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_node\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniforge3/envs/myenv/lib/python3.9/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36munary_f\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0msubargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msubvals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0msubargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-22-cabc613b8702>\u001b[0m in \u001b[0;36mf8\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mautograd\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf8\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Assume x is an array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: 'ArrayBox' object does not support item assignment"
]
}
],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f8(x): # Assume x is an array\n",
" x[2] = 3\n",
" return x*2\n",
"\n",
"f8_grad = grad(f8)\n",
"\n",
"x = 8.4\n",
"\n",
"print(\"The derivative of f8 is:\",f8_grad(x))"
]
},
{
"cell_type": "markdown",
"id": "7a13b21d",
"metadata": {
"editable": true
},
"source": [
"Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The item assignment is done when the program tries to assign x[2] to the value 3. However, Autograd has implemented the computation of the derivative such that this assignment is not possible."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "19c7502b",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f9(a): # Assume a is an array with 2 elements\n",
" b = np.array([1.0,2.0])\n",
" return a.dot(b)\n",
"\n",
"f9_grad = grad(f9)\n",
"\n",
"x = np.array([1.0,0.0])\n",
"\n",
"print(\"The derivative of f9 is:\",f9_grad(x))"
]
},
{
"cell_type": "markdown",
"id": "4450885d",
"metadata": {
"editable": true
},
"source": [
"Here we are told that the 'dot' function does not belong to Autograd's\n",
"version of a Numpy array. To overcome this, an alternative syntax\n",
"which also computed the dot product can be used:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "013fc7f8",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"def f9_alternative(x): # Assume a is an array with 2 elements\n",
" b = np.array([1.0,2.0])\n",
" return np.dot(x,b) # The same as x_1*b_1 + x_2*b_2\n",
"\n",
"f9_alternative_grad = grad(f9_alternative)\n",
"\n",
"x = np.array([3.0,0.0])\n",
"\n",
"print(\"The gradient of f9 is:\",f9_alternative_grad(x))\n",
"\n",
"# The analytical gradient of the dot product of vectors x and b with two elements (x_1,x_2) and (b_1, b_2) respectively\n",
"# w.r.t x is (b_1, b_2)."
]
},
{
"cell_type": "markdown",
"id": "8d360f7d",
"metadata": {
"editable": true
},
"source": [
"The documentation recommends to avoid inplace operations such as"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "e29a24eb",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"a += b\n",
"a -= b\n",
"a*= b\n",
"a /=b"
]
},
{
"cell_type": "markdown",
"id": "ad8fbbb7",
"metadata": {
"editable": true
},
"source": [
"## Using Autograd 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": 26,
"id": "904f65dc",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"# Using Autograd to calculate gradients for OLS\n",
"from random import random, seed\n",
"import numpy as np\n",
"import autograd.numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from autograd import grad\n",
"\n",
"def CostOLS(beta):\n",
" return (1.0/n)*np.sum((y-X @ beta)**2)\n",
"\n",
"n = 100\n",
"x = 2*np.random.rand(n,1)\n",
"y = 4+3*x+np.random.randn(n,1)\n",
"\n",
"X = np.c_[np.ones((n,1)), x]\n",
"XT_X = X.T @ X\n",
"theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n",
"print(\"Own inversion\")\n",
"print(theta_linreg)\n",
"# Hessian matrix\n",
"H = (2.0/n)* XT_X\n",
"EigValues, EigVectors = np.linalg.eig(H)\n",
"print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n",
"\n",
"theta = np.random.randn(2,1)\n",
"eta = 1.0/np.max(EigValues)\n",
"Niterations = 1000\n",
"# define the gradient\n",
"training_gradient = grad(CostOLS)\n",
"\n",
"for iter in range(Niterations):\n",
" gradients = training_gradient(theta)\n",
" theta -= eta*gradients\n",
"print(\"theta from own gd\")\n",
"print(theta)\n",
"\n",
"xnew = np.array([[0],[2]])\n",
"Xnew = np.c_[np.ones((2,1)), xnew]\n",
"ypredict = Xnew.dot(theta)\n",
"ypredict2 = Xnew.dot(theta_linreg)\n",
"\n",
"plt.plot(xnew, ypredict, \"r-\")\n",
"plt.plot(xnew, ypredict2, \"b-\")\n",
"plt.plot(x, y ,'ro')\n",
"plt.axis([0,2.0,0, 15.0])\n",
"plt.xlabel(r'$x$')\n",
"plt.ylabel(r'$y$')\n",
"plt.title(r'Random numbers ')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "ce338980",
"metadata": {
"editable": true
},
"source": [
"### Including Stochastic Gradient Descent with Autograd\n",
"\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": 27,
"id": "de261f10",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"# Using Autograd to calculate gradients using SGD\n",
"# OLS example\n",
"from random import random, seed\n",
"import numpy as np\n",
"import autograd.numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from autograd import grad\n",
"\n",
"# Note change from previous example\n",
"def CostOLS(y,X,theta):\n",
" return np.sum((y-X @ theta)**2)\n",
"\n",
"n = 100\n",
"x = 2*np.random.rand(n,1)\n",
"y = 4+3*x+np.random.randn(n,1)\n",
"\n",
"X = np.c_[np.ones((n,1)), x]\n",
"XT_X = X.T @ X\n",
"theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n",
"print(\"Own inversion\")\n",
"print(theta_linreg)\n",
"# Hessian matrix\n",
"H = (2.0/n)* XT_X\n",
"EigValues, EigVectors = np.linalg.eig(H)\n",
"print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n",
"\n",
"theta = np.random.randn(2,1)\n",
"eta = 1.0/np.max(EigValues)\n",
"Niterations = 1000\n",
"\n",
"# Note that we request the derivative wrt third argument (theta, 2 here)\n",
"training_gradient = grad(CostOLS,2)\n",
"\n",
"for iter in range(Niterations):\n",
" gradients = (1.0/n)*training_gradient(y, X, theta)\n",
" theta -= eta*gradients\n",
"print(\"theta from own gd\")\n",
"print(theta)\n",
"\n",
"xnew = np.array([[0],[2]])\n",
"Xnew = np.c_[np.ones((2,1)), xnew]\n",
"ypredict = Xnew.dot(theta)\n",
"ypredict2 = Xnew.dot(theta_linreg)\n",
"\n",
"plt.plot(xnew, ypredict, \"r-\")\n",
"plt.plot(xnew, ypredict2, \"b-\")\n",
"plt.plot(x, y ,'ro')\n",
"plt.axis([0,2.0,0, 15.0])\n",
"plt.xlabel(r'$x$')\n",
"plt.ylabel(r'$y$')\n",
"plt.title(r'Random numbers ')\n",
"plt.show()\n",
"\n",
"n_epochs = 50\n",
"M = 5 #size of each minibatch\n",
"m = int(n/M) #number of minibatches\n",
"t0, t1 = 5, 50\n",
"def learning_schedule(t):\n",
" return t0/(t+t1)\n",
"\n",
"theta = np.random.randn(2,1)\n",
"\n",
"for epoch in range(n_epochs):\n",
"# Can you figure out a better way of setting up the contributions to each batch?\n",
" for i in range(m):\n",
" random_index = M*np.random.randint(m)\n",
" xi = X[random_index:random_index+M]\n",
" yi = y[random_index:random_index+M]\n",
" gradients = (1.0/M)*training_gradient(yi, xi, theta)\n",
" eta = learning_schedule(epoch*m+i)\n",
" theta = theta - eta*gradients\n",
"print(\"theta from own sdg\")\n",
"print(theta)"
]
},
{
"cell_type": "markdown",
"id": "ccd8829e",
"metadata": {
"editable": true
},
"source": [
"### And Logistic Regression"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "cc5811d1",
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"import autograd.numpy as np\n",
"from autograd import grad\n",
"\n",
"def sigmoid(x):\n",
" return 0.5 * (np.tanh(x / 2.) + 1)\n",
"\n",
"def logistic_predictions(weights, inputs):\n",
" # Outputs probability of a label being true according to logistic model.\n",
" return sigmoid(np.dot(inputs, weights))\n",
"\n",
"def training_loss(weights):\n",
" # Training loss is the negative log-likelihood of the training labels.\n",
" preds = logistic_predictions(weights, inputs)\n",
" label_probabilities = preds * targets + (1 - preds) * (1 - targets)\n",
" return -np.sum(np.log(label_probabilities))\n",
"\n",
"# Build a toy dataset.\n",
"inputs = np.array([[0.52, 1.12, 0.77],\n",
" [0.88, -1.08, 0.15],\n",
" [0.52, 0.06, -1.30],\n",
" [0.74, -2.49, 1.39]])\n",
"targets = np.array([True, True, False, True])\n",
"\n",
"# Define a function that returns gradients of training loss using Autograd.\n",
"training_gradient_fun = grad(training_loss)\n",
"\n",
"# Optimize weights using gradient descent.\n",
"weights = np.array([0.0, 0.0, 0.0])\n",
"print(\"Initial loss:\", training_loss(weights))\n",
"for i in range(100):\n",
" weights -= training_gradient_fun(weights) * 0.01\n",
"\n",
"print(\"Trained loss:\", training_loss(weights))"
]
}
],
"metadata": {
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}