Files
FYS-STK4155/doc/LectureNotes/_build/jupyter_execute/chapteroptimization.ipynb
T
2021-10-26 22:24:12 +02:00

3093 lines
402 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",
"metadata": {},
"source": [
"# Optimization, the central part of any Machine Learning algortithm\n",
"\n",
"Almost every problem in machine learning and data science starts with\n",
"a dataset $X$, a model $g(\\beta)$, which is a function of the\n",
"parameters $\\beta$ and a cost function $C(X, g(\\beta))$ that allows\n",
"us to judge how well the model $g(\\beta)$ explains the observations\n",
"$X$. The model is fit by finding the values of $\\beta$ that minimize\n",
"the cost function. Ideally we would be able to solve for $\\beta$\n",
"analytically, however this is not possible in general and we must use\n",
"some approximative/numerical method to compute the minimum.\n",
"\n",
"\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\begin{align*}\n",
"p(y_i=1|x_i,\\boldsymbol{\\beta}) &= \\frac{\\exp{(\\beta_0+\\beta_1x_i)}}{1+\\exp{(\\beta_0+\\beta_1x_i)}},\\nonumber\\\\\n",
"p(y_i=0|x_i,\\boldsymbol{\\beta}) &= 1 - p(y_i=1|x_i,\\boldsymbol{\\beta}),\n",
"\\end{align*}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$. \n",
"\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we in addition define a diagonal matrix $\\boldsymbol{W}$ with elements \n",
"$p(y_i\\vert x_i,\\boldsymbol{\\beta})(1-p(y_i\\vert x_i,\\boldsymbol{\\beta})$, we can obtain a compact expression of the second derivative as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T} = \\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This defines what is called the Hessian matrix.\n",
"\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T}\\right)^{-1}_{\\boldsymbol{\\beta}^{\\mathrm{old}}}\\times \\left(\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}\\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or in matrix form as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X} \\right)^{-1}\\times \\left(-\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{p}) \\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The right-hand side is computed with the old values of $\\beta$. \n",
"\n",
"If we can compute these matrices, in particular the Hessian, the above is often the easiest method to implement. \n",
"\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",
"\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",
"metadata": {},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"eq:taylornr\"></div>\n",
"\n",
"$$\n",
"f(s)=0=f(x)+(s-x)f'(x)+\\frac{(s-x)^2}{2}f''(x) +\\dots.\n",
" \\label{eq:taylornr} \\tag{1}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For small enough values of the function and for well-behaved\n",
"functions, the terms beyond linear are unimportant, hence we obtain"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"f(x)+(s-x)f'(x)\\approx 0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"yielding"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"s\\approx x-\\frac{f(x)}{f'(x)}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Having in mind an iterative procedure, it is natural to start iterating with"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n",
" f_2(x_1,x_2) &=0,\\end{array}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which we Taylor expand to obtain"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\begin{array}{cc} 0=f_1(x_1+h_1,x_2+h_2)=&f_1(x_1,x_2)+h_1\n",
" \\partial f_1/\\partial x_1+h_2\n",
" \\partial f_1/\\partial x_2+\\dots\\\\\n",
" 0=f_2(x_1+h_1,x_2+h_2)=&f_2(x_1,x_2)+h_1\n",
" \\partial f_2/\\partial x_1+h_2\n",
" \\partial f_2/\\partial x_2+\\dots\n",
" \\end{array}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Defining the Jacobian matrix $\\boldsymbol{J}$ we have"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"source": [
"we can rephrase Newton's method as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n",
"\\left(\\begin{array}{c} x_1^{n} \\\\ x_2^{n} \\end{array} \\right)+\n",
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right),\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where we have defined"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"source": [
"We need thus to compute the inverse of the Jacobian matrix and it\n",
"is to understand that difficulties may\n",
"arise in case $\\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. \n",
"\n",
"\n",
"\n",
"\n",
"## 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",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"with $\\gamma_k > 0$.\n",
"\n",
"For $\\gamma_k$ small enough, then $F(\\mathbf{x}_{k+1}) \\leq\n",
"F(\\mathbf{x}_k)$. This means that for a sufficiently small $\\gamma_k$\n",
"we are always moving towards smaller function values, i.e a minimum.\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The parameter $\\gamma_k$ is often referred to as the step length or\n",
"the learning rate within the context of Machine Learning.\n",
"\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",
"\n",
"\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.\n",
"\n",
"\n",
"\n",
"## 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",
"\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",
"\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",
"\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",
"\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",
"\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",
"\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.\n",
"\n",
"\n",
"### 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",
"\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",
"\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).\n",
"\n",
"\n",
"## Standard steepest descent\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In the iterative process we end up with a problem like"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $\\boldsymbol{r}$ is the so-called residual or error in the iterative process.\n",
"\n",
"When we have found the exact solution, $\\boldsymbol{r}=0$.\n",
"\n",
"\n",
"\n",
"The residual is zero when we reach the minimum of the quadratic equation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"P(\\boldsymbol{x})=\\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"with the constraint that the matrix $\\boldsymbol{A}$ is positive definite and\n",
"symmetric. This defines also the Hessian and we want it to be positive definite. \n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_0=0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or consider the system"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"instead.\n",
"\n",
"\n",
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This suggests taking the first basis vector $\\boldsymbol{r}_1$ (see below for definition) \n",
"to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n",
"which equals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and \n",
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n",
"\n",
"\n",
"We can compute the residual iteratively as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which equals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which gives"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\alpha_k = \\frac{\\boldsymbol{r}_k^T\\boldsymbol{r}_k}{\\boldsymbol{r}_k^T\\boldsymbol{A}\\boldsymbol{r}_k}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"leading to the iterative scheme"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k-\\alpha_k\\boldsymbol{r}_{k},\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7f9f087db790>"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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tKoCXHfddTzzzDM8/PDDI+qQyss+t7e3k0wmC7LP5eXl503048eP093dfdba9XQ6zTvf+U7uu+8+3vOe95zXPS8hFMk9FPbt24eqqnzkIx/hm9/85iVD7sGQUrJz507WrVvHjBkzCkPd169fT319/YgIejrZ59ra2nOqd893m52tuSabzfLOd76Te++9l/vuu29E97jEMSbkvqCno40ECxcunOgljDkUReGFF17gBz/4AW95y1sKPekPPPAAvb293HTTTaxfv35YPemqqlJZWUllZSVSSnp6ekgkEjQ2NhKPx6mtrT2lk+tMaGlpGRaxc7kc9957L3feeScf+MAHzun3L2JkuGRO7jyuueaaS/bkHgpdXV089thjPPLII7S3t5/Skz7S2Wmv7uSqra09bb17XgN++fLlQ24CjuPw7ne/m+uvv56Pfexjr8t06FlQNMuHUyzzeiX3YPT29vKzn/2MRx55hGPHjhV60kfay52fG57XUAuFQgWiJxIJ2tvbz0ps13V5//vfzxvf+EY++clPFol9ehTJPRwUyX0qBvekNzY2FnrSV69ePWLfOi+WePLkSTzPY/bs2dTW1p6xQcbzPD74wQ+ycuVKPvvZzxaJfWZcnI0jRUws4vE4d999Nxs3buSFF17gjW98I9///ve56qqr+MxnPsPzzz+P7/vDulYsFiMcDhMOh1m9ejW+77Njxw62bdtGc3Mztm0XPuv7Pn/+53/OokWLxo3YGzduZPHixaiqytatW8f8fhc6LpmT+9FHH+VjH/sYHR0dlJWVsWLFCv73f/93opd1wWJwT/orr7zCVVddxW233cZVV111xhbT1tZWTp48yYoVK04xxQfLPvf09PD888/T3NzMjBkz+NrXvjZuJ/ZFnDEpmuVFjA0cx+FXv/oVmzdv5oUXXuCKK65gw4YNXH311QWTu62tjZaWlrPKIScSCT7+8Y+za9cuJk2axIc+9KFxT3tdhK5ZMRU2kbiAVDtGHaZpcuONN3LjjTfieR6/+93v2LhxI5/97GdZtWoVtbW1JJNJvv71rw9JbCEE3/zmN5k2bRqPPvoovb29HD16dPx+kSJOQfHkHgYuMNWOcYPv+zz44IN8//vfp6qqigULFrB+/frT9qQLIfjiF79IKpXie9/73pgJMV6iGZPiyT1RGKzaARRUOy51cucFH/Nzsl966SU2btzIgw8+yNy5c9mwYQPXX3890WiUr3zlK3R3d/PQQw+NqcLq2dqLi/gTiuQeBl4Pqh2ng67rPPzww4X/H9yTvn37djZu3Mg//uM/4jgO8+bNY9OmTaM67KCI80MxFVbEiKGqKqtXr+bv//7v2bZtGw8++CD/+Z//OeHEfvTRR6mrq+OFF17g5ptv5oYbbpjQ9Uw0iif3MPB6UO04V6iqyrp16yZ6GQDcdttt3HbbbRO9jAsGxZN7GLj88ss5ePAgTU1NOI7DT3/60wvmhS6iiDOheHIPA7qu8y//8i/ccMMNBdWOCZLjKaKIYaOYCiuiiIlHsbb89YL77ruPmpoalixZMtFLKeIiRpHcFyDe//738/TTT0/0Moq4yFEk9wWItWvXDlvauIgizoQiuYso4hJFkdxFXFD49Kc/zYIFC1i2bBm33XYbvb29E72kixZFchdxQeFtb3sbu3fvZufOncybN48HH3xwopd00aJI7iIuKFzqI5/HE0VyX4C45557uPLKKzlw4AB1dXU89NBDE72kCcHDDz/M29/+9olexkWLYhFLEeOO4Y583rp1K4888sjrQVhxQmSWirjEoSjKNOA/gFqCzfzfpZTfmeA1vR/4CHCdlDIzkWu5mFEk9+sciqJMBiZLKV9RFCUObAM2SCn3TtB6bgS+BbxZStkxEWu4VFAkdxGnQFGUx4F/kVI+O0H3PwRYQNfAX/1RSvn/TMRaLnYUyV1EAYqizAR+ByyRUvZP8HKKOE8Uo+VFAKAoSgzYDHyiSOxLA0VyF4GiKAYBsX8spXxkotdTxOigaJa/zqEEeaYfAd1Syk9M8HKKGEUUyf06h6IobwJ+D+wCxMBff05K+dTEraqI0UCR3EUUcYmi6HMXUcQliiK5iyjiEkWR3EUUcYmiSO4iirhEUSR3EUVcoiiSu4giLlEUyV1EEZcoiuQuoohLFP8/kXYx+2ToM1EAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"filenames": {
"image/png": "/Users/mhjensen/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_56_1.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",
"metadata": {},
"source": [
"And then as countor plot"
]
},
{
"cell_type": "code",
"execution_count": 2,
"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_58_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",
"metadata": {},
"source": [
"Find guesses"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"x = guesses[-1]\n",
"s = -df(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Run it!"
]
},
{
"cell_type": "code",
"execution_count": 4,
"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",
"metadata": {},
"source": [
"What happened?"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f9f1a921340>]"
]
},
"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_64_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",
"metadata": {},
"source": [
"## Conjugate gradient method\n",
"In the CG method we define so-called conjugate directions and two vectors \n",
"$\\boldsymbol{s}$ and $\\boldsymbol{t}$\n",
"are said to be\n",
"conjugate if"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The philosophy of the CG method is to perform searches in various conjugate directions\n",
"of our vectors $\\boldsymbol{x}_i$ obeying the above criterion, namely"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Two vectors are conjugate if they are orthogonal with respect to \n",
"this inner product. Being conjugate is a symmetric relation: if $\\boldsymbol{s}$ is conjugate to $\\boldsymbol{t}$, then $\\boldsymbol{t}$ is conjugate to $\\boldsymbol{s}$.\n",
"\n",
"An example is given by the eigenvectors of the matrix"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We assume that $\\boldsymbol{p}_{i}$ is a sequence of $n$ mutually conjugate directions. \n",
"Then the $\\boldsymbol{p}_{i}$ form a basis of $R^n$ and we can expand the solution \n",
"$ \\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}$ in this basis, namely"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The coefficients are given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Multiplying with $\\boldsymbol{p}_k^T$ from the left gives"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{p}_i= \\boldsymbol{p}_k^T \\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and we can define the coefficients $\\alpha_k$ as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\alpha_k = \\frac{\\boldsymbol{p}_k^T \\boldsymbol{b}}{\\boldsymbol{p}_k^T \\boldsymbol{A} \\boldsymbol{p}_k}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{x}_0=0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or consider the system"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"instead.\n",
"\n",
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This suggests taking the first basis vector $\\boldsymbol{p}_1$ \n",
"to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n",
"which equals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and \n",
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n",
"The other vectors in the basis will be conjugate to the gradient, \n",
"hence the name conjugate gradient method.\n",
"\n",
"Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that $\\boldsymbol{r}_k$ is the negative gradient of $f$ at \n",
"$\\boldsymbol{x}=\\boldsymbol{x}_k$, \n",
"so the gradient descent method would be to move in the direction $\\boldsymbol{r}_k$. \n",
"Here, we insist that the directions $\\boldsymbol{p}_k$ are conjugate to each other, \n",
"so we take the direction closest to the gradient $\\boldsymbol{r}_k$ \n",
"under the conjugacy constraint. \n",
"This gives the following expression"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{p}_{k+1}=\\boldsymbol{r}_k-\\frac{\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{r}_k}{\\boldsymbol{p}_k^T\\boldsymbol{A}\\boldsymbol{p}_k} \\boldsymbol{p}_k.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also compute the residual iteratively as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which equals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which gives"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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,
"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",
"metadata": {},
"source": [
"with $x_i \\in [0,1] $ is chosen randomly using a uniform distribution. Additionally we have a stochastic noise chosen according to a normal distribution $\\cal {N}(0,1)$. \n",
"The linear regression model is given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"such that"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"X \\equiv \\begin{bmatrix}\n",
"1 & x_1 \\\\\n",
"\\vdots & \\vdots \\\\\n",
"1 & x_{100} & \\\\\n",
"\\end{bmatrix}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The cost/loss/risk function is given by ("
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"C(\\beta) = \\frac{1}{n}||X\\beta-\\mathbf{y}||_{2}^{2} = \\frac{1}{n}\\sum_{i=1}^{100}\\left[ (\\beta_0 + \\beta_1 x_i)^2 - 2 y_i (\\beta_0 + \\beta_1 x_i) + y_i^2\\right]\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"and we want to find $\\beta$ such that $C(\\beta)$ is minimized.\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\nabla_{\\beta} C(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n",
"\\sum_{i=1}^{100}\\left( x_i (\\beta_0+\\beta_1x_i)-y_ix_i\\right) \\\\\n",
"\\end{bmatrix} = \\frac{2}{n}X^T(X\\beta - \\mathbf{y}),\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $X$ is the design matrix defined above.\n",
"\n",
"\n",
"The Hessian matrix of $C(\\beta)$ is given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{H} \\equiv \\begin{bmatrix}\n",
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0^2} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} \\\\\n",
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_1^2} & \\\\\n",
"\\end{bmatrix} = \\frac{2}{n}X^T X.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite.\n",
"\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can use the expression we computed for the gradient and let use a\n",
"$\\beta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n",
"when $||\\nabla_\\beta C(\\beta_k) || \\leq \\epsilon = 10^{-8}$. **Note that the code below does not include the latter stop criterion**.\n",
"\n",
"And finally we can compare our solution for $\\beta$ with the analytic result given by \n",
"$\\beta= (X^TX)^{-1} X^T \\mathbf{y}$.\n",
"\n",
"\n",
"\n",
"Here is our simple example"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.30862336 4.94226154]\n",
"[[4.09553421]\n",
" [2.99517651]]\n",
"[[4.09553421]\n",
" [2.99517651]]\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_118_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",
"metadata": {},
"source": [
"Alternatively, we can use **Scikit-Learn** as done here"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[4.1224808 ]\n",
" [2.97290346]]\n",
"[4.09600813] [2.93854356]\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",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we only have adjust the gradient as follows"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\nabla_\\beta C_{\\text{ridge}}(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n",
"\\sum_{i=1}^{100}\\left( x_i (\\beta_0+\\beta_1x_i)-y_ix_i\\right) \\\\\n",
"\\end{bmatrix} + 2\\lambda\\begin{bmatrix} \\beta_0 \\\\ \\beta_1\\end{bmatrix} = 2 (X^T(X\\beta - \\mathbf{y})+\\lambda \\beta).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can easily extend our program to minimize $C_{\\text{ridge}}(\\beta)$ using gradient descent and compare with the analytical solution given by"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[3.95338481]\n",
" [2.95611545]]\n",
"[[3.99545147]\n",
" [2.91812296]]\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_127_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",
"metadata": {},
"source": [
"## Using gradient descent methods, limitations\n",
"\n",
"* **Gradient descent (GD) finds local minima of our function**. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our cost/loss/risk function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.\n",
"\n",
"* **GD is sensitive to initial conditions**. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.\n",
"\n",
"* **Gradients are computationally expensive to calculate for large datasets**. In many cases in statistics and ML, the cost/loss/risk function is a sum of terms, with one term for each data point. For example, in linear regression, $E \\propto \\sum_{i=1}^n (y_i - \\mathbf{w}^T\\cdot\\mathbf{x}_i)^2$; for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over *all* $n$ data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called \"mini batches\". This has the added benefit of introducing stochasticity into our algorithm.\n",
"\n",
"* **GD is very sensitive to choices of learning rates**. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would *adaptively* choose the learning rates to match the landscape.\n",
"\n",
"* **GD treats all directions in parameter space uniformly.** Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive. \n",
"\n",
"* GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points.\n",
"\n",
"## Stochastic Gradient Descent\n",
"\n",
"Stochastic gradient descent (SGD) and variants thereof address some of\n",
"the shortcomings of the Gradient descent method discussed above.\n",
"\n",
"The underlying idea of SGD comes from the observation that the cost\n",
"function, which we want to minimize, can almost always be written as a\n",
"sum over $n$ data points $\\{\\mathbf{x}_i\\}_{i=1}^n$,"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This in turn means that the gradient can be\n",
"computed as a sum over $i$-gradients"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\nabla_\\beta C(\\mathbf{\\beta}) = \\sum_i^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Stochasticity/randomness is introduced by only taking the\n",
"gradient on a subset of the data called minibatches. If there are $n$\n",
"data points and the size of each minibatch is $M$, there will be $n/M$\n",
"minibatches. We denote these minibatches by $B_k$ where\n",
"$k=1,\\cdots,n/M$.\n",
"\n",
"\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",
"metadata": {},
"source": [
"$$\n",
"\\nabla_{\\beta}\n",
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta}) \\rightarrow \\sum_{i \\in B_k}^n \\nabla_\\beta\n",
"c_i(\\mathbf{x}_i, \\mathbf{\\beta}).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Thus a gradient descent step now looks like"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\beta_{j+1} = \\beta_j - \\gamma_j \\sum_{i \\in B_k}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
"\\mathbf{\\beta})\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where $k$ is picked at random with equal\n",
"probability from $[1,n/M]$. An iteration over the number of\n",
"minibathces (n/M) is commonly referred to as an epoch. Thus it is\n",
"typical to choose a number of epochs and for each epoch iterate over\n",
"the number of minibatches, as exemplified in the code below."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"import numpy as np \n",
"\n",
"n = 100 #100 datapoints \n",
"M = 5 #size of each minibatch\n",
"m = int(n/M) #number of minibatches\n",
"n_epochs = 10 #number of epochs\n",
"\n",
"j = 0\n",
"for epoch in range(1,n_epochs+1):\n",
" for i in range(m):\n",
" k = np.random.randint(m) #Pick the k-th minibatch at random\n",
" #Compute the gradient using the data in minibatch Bk\n",
" #Compute new suggestion for \n",
" j += 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Taking the gradient only on a subset of the data has two important\n",
"benefits. First, it introduces randomness which decreases the chance\n",
"that our opmization scheme gets stuck in a local minima. Second, if\n",
"the size of the minibatches are small relative to the number of\n",
"datapoints ($M < n$), the computation of the gradient is much\n",
"cheaper since we sum over the datapoints in the $k-th$ minibatch and not\n",
"all $n$ datapoints.\n",
"\n",
"\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",
"\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,
"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",
"metadata": {},
"source": [
"### Program for stochastic gradient"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Own inversion\n",
"[[3.87218485]\n",
" [3.01403105]]\n",
"sgdreg from scikit\n",
"[3.9030809] [3.07154525]\n",
"theta from own gd\n",
"[[3.87218485]\n",
" [3.01403105]]\n",
"theta from own sdg\n",
"[[3.86110774]\n",
" [3.00070278]]\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_141_1.png"
},
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Importing various packages\n",
"from math import exp, sqrt\n",
"from random import random, seed\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.linear_model import SGDRegressor\n",
"\n",
"m = 100\n",
"x = 2*np.random.rand(m,1)\n",
"y = 4+3*x+np.random.randn(m,1)\n",
"\n",
"X = np.c_[np.ones((m,1)), x]\n",
"theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n",
"print(\"Own inversion\")\n",
"print(theta_linreg)\n",
"sgdreg = SGDRegressor(max_iter = 50, penalty=None, eta0=0.1)\n",
"sgdreg.fit(x,y.ravel())\n",
"print(\"sgdreg from scikit\")\n",
"print(sgdreg.intercept_, sgdreg.coef_)\n",
"\n",
"\n",
"theta = np.random.randn(2,1)\n",
"eta = 0.1\n",
"Niterations = 1000\n",
"\n",
"\n",
"for iter in range(Niterations):\n",
" gradients = 2.0/m*X.T @ ((X @ theta)-y)\n",
" theta -= eta*gradients\n",
"print(\"theta from own gd\")\n",
"print(theta)\n",
"\n",
"xnew = np.array([[0],[2]])\n",
"Xnew = np.c_[np.ones((2,1)), xnew]\n",
"ypredict = Xnew.dot(theta)\n",
"ypredict2 = Xnew.dot(theta_linreg)\n",
"\n",
"\n",
"n_epochs = 50\n",
"t0, t1 = 5, 50\n",
"def learning_schedule(t):\n",
" return t0/(t+t1)\n",
"\n",
"theta = np.random.randn(2,1)\n",
"\n",
"for epoch in range(n_epochs):\n",
" for i in range(m):\n",
" random_index = np.random.randint(m)\n",
" xi = X[random_index:random_index+1]\n",
" yi = y[random_index:random_index+1]\n",
" gradients = 2 * xi.T @ ((xi @ theta)-yi)\n",
" eta = learning_schedule(epoch*m+i)\n",
" theta = theta - eta*gradients\n",
"print(\"theta from own sdg\")\n",
"print(theta)\n",
"\n",
"plt.plot(xnew, ypredict, \"r-\")\n",
"plt.plot(xnew, ypredict2, \"b-\")\n",
"plt.plot(x, y ,'ro')\n",
"plt.axis([0,2.0,0, 15.0])\n",
"plt.xlabel(r'$x$')\n",
"plt.ylabel(r'$y$')\n",
"plt.title(r'Random numbers ')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Momentum based GD\n",
"\n",
"The stochastic gradient descent (SGD) is almost always used with a\n",
"*momentum* or inertia term that serves as a memory of the direction we\n",
"are moving in parameter space. This is typically implemented as\n",
"follows"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<!-- Equation labels as ordinary links -->\n",
"<div id=\"_auto1\"></div>\n",
"\n",
"$$\n",
"\\begin{equation} \n",
"\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t},\n",
"\\label{_auto1} \\tag{2}\n",
"\\end{equation}\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where we have introduced a momentum parameter $\\gamma$, with\n",
"$0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to\n",
"indicate the gradient is to be taken over a different mini-batch at\n",
"each step. We call this algorithm gradient descent with momentum\n",
"(GDM). From these equations, it is clear that $\\mathbf{v}_t$ is a\n",
"running average of recently encountered gradients and\n",
"$(1-\\gamma)^{-1}$ sets the characteristic time scale for the memory\n",
"used in the averaging procedure. Consistent with this, when\n",
"$\\gamma=0$, this just reduces down to ordinary SGD as discussed\n",
"earlier. An equivalent way of writing the updates is"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$.\n",
"\n",
"\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",
"metadata": {},
"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",
"metadata": {},
"source": [
"We can discretize this equation in the usual way to get"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"source": [
"Rearranging this equation, we can rewrite this as"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"\\gamma= {m \\over m +\\mu \\Delta t }, \\qquad \\eta = {(\\Delta t)^2 \\over m +\\mu \\Delta t}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"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",
"metadata": {},
"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",
"metadata": {},
"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",
"\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, RMS-Prop, and\n",
"ADAM.\n",
"\n",
"\n",
"### 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",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{s}_t =\\beta \\mathbf{s}_{t-1} +(1-\\beta)\\mathbf{g}_t^2 \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"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.\n",
"\n",
"### 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",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{m}_t = \\beta_1 \\mathbf{m}_{t-1} + (1-\\beta_1) \\mathbf{g}_t \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\mathbf{s}_t =\\beta_2 \\mathbf{s}_{t-1} +(1-\\beta_2)\\mathbf{g}_t^2 \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{\\mathbf{m}}_t={\\mathbf{m}_t \\over 1-\\beta_1^t} \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"\\boldsymbol{\\mathbf{s}}_t ={\\mathbf{s}_t \\over1-\\beta_2^t} \\nonumber\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"metadata": {},
"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",
"metadata": {},
"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",
"metadata": {},
"source": [
"$$\n",
"\\Delta \\theta_{t+1}= -\\eta_t { \\boldsymbol{m}_t \\over \\sqrt{\\sigma_t^2 + m_t^2 }+\\epsilon}.\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Practical tips\n",
"\n",
"* **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.\n",
"\n",
"* **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.\n",
"\n",
"* **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings.\n",
"\n",
"* **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.\n",
"\n",
"## 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",
"\n",
"\n",
"Python has tools for so-called **automatic differentiation**.\n",
"Consider the following example"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"f(x) = \\sin\\left(2\\pi x + x^2\\right)\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"which has the following derivative"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"f'(x) = \\cos\\left(2\\pi x + x^2\\right)\\left(2\\pi + 2x\\right)\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using **autograd** we have"
]
},
{
"cell_type": "code",
"execution_count": 13,
"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_177_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",
"metadata": {},
"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,
"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",
"metadata": {},
"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,
"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",
"metadata": {},
"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,
"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",
"metadata": {},
"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,
"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,
"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": "markdown",
"metadata": {},
"source": [
"1\n",
"8\n",
" \n",
"<\n",
"<\n",
"<\n",
"!\n",
"!\n",
"C\n",
"O\n",
"D\n",
"E\n",
"_\n",
"B\n",
"L\n",
"O\n",
"C\n",
"K\n",
" \n",
" \n",
"p\n",
"y\n",
"c\n",
"o\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The analytical derivative of f6 at x = 2.7 is: 37732.5\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": 20,
"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",
"metadata": {},
"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",
"\n",
"Autograd supports many features. However, there are some functions that are not supported (yet) by Autograd.\n",
"\n",
"Assigning a value to the variable being differentiated with respect to is an example thereof."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"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",
"metadata": {},
"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": 22,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'ArrayBox' object has no attribute 'dot'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-22-1ec254875e1a>\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[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.0\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 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 f9 is:\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf9_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~/opt/anaconda3/lib/python3.8/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~/opt/anaconda3/lib/python3.8/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~/opt/anaconda3/lib/python3.8/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~/opt/anaconda3/lib/python3.8/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~/opt/anaconda3/lib/python3.8/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-1ec254875e1a>\u001b[0m in \u001b[0;36mf9\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf9\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Assume a is an array with 2 elements\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2.0\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----> 5\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\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 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mf9_grad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf9\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mAttributeError\u001b[0m: 'ArrayBox' object has no attribute 'dot'"
]
}
],
"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",
"metadata": {},
"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": null,
"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",
"metadata": {},
"source": [
"The documentation recommends to avoid inplace operations such as"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false,
"editable": true
},
"outputs": [],
"source": [
"a += b\n",
"a -= b\n",
"a*= b\n",
"a /=b"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"More examples will be added, in particular how to compare autograd with own codes for the gradients."
]
}
],
"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.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}