From 760bbe109242e2c6d6a5f2cb38011065659794ed Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Thu, 29 Sep 2022 15:24:43 +0200 Subject: [PATCH] added video --- doc/pub/week39/html/week39-reveal.html | 5 + doc/pub/week39/html/week39-solarized.html | 3 + doc/pub/week39/html/week39.html | 3 + doc/pub/week39/ipynb/ipynb-week39-src.tar.gz | Bin 193 -> 193 bytes doc/pub/week39/ipynb/week39.ipynb | 1808 +++++++++++------- doc/src/week39/week39.do.txt | 1 + 6 files changed, 1129 insertions(+), 691 deletions(-) diff --git a/doc/pub/week39/html/week39-reveal.html b/doc/pub/week39/html/week39-reveal.html index 22236b38e..620723633 100644 --- a/doc/pub/week39/html/week39-reveal.html +++ b/doc/pub/week39/html/week39-reveal.html @@ -199,6 +199,11 @@ MathJax.Hub.Config({ diff --git a/doc/pub/week39/html/week39-solarized.html b/doc/pub/week39/html/week39-solarized.html index a503ae23e..6914a3f5e 100644 --- a/doc/pub/week39/html/week39-solarized.html +++ b/doc/pub/week39/html/week39-solarized.html @@ -314,6 +314,9 @@ MathJax.Hub.Config({ diff --git a/doc/pub/week39/html/week39.html b/doc/pub/week39/html/week39.html index 6da4ddd96..85922cc9a 100644 --- a/doc/pub/week39/html/week39.html +++ b/doc/pub/week39/html/week39.html @@ -391,6 +391,9 @@ MathJax.Hub.Config({ diff --git a/doc/pub/week39/ipynb/ipynb-week39-src.tar.gz b/doc/pub/week39/ipynb/ipynb-week39-src.tar.gz index 77def04622b9ff080b5e02d9ea599f1170193bb3..75e5c1cb81dff8ee810f47490cb087229eb8e7eb 100644 GIT binary patch literal 193 zcmV;y06za8iwFRboHb(r1MSbv3c@f92k@Qu6nTQttn0+1;0_)H5nrHVovXTbwjH{+ zcORf9#mf+(zssMH5R!eiT5q$+-CZynLP(kL^>&MFS!=C9Cc;=rtRMNs`*SSh7P}+%H>oeShIMZb$n@;6W vXkmvI7;$Z-5x`XkyeOoTTJcNR7=1Lnwo&-&XFSjIystd~UVz^k00;m8?LAza literal 193 zcmV;y06za8iwFRff;D3R1MSbv3W7io2XN0m#XN!Rs;hJi^3WlO=ml0Bb2E2sccpy$ z{D3+YT_l42UH%L+3^Rvpz1d}fy<2ZFgpeeTVazmPQ<8A5CzLXvaYR`}Xc#geG-5RM zfGl^?OJ^+C!zoR5MrlyKn;XW;^246_6?o>KI99^IcHi4dNs!87u2c;-#5!69qU~i4 vg+ep7K;yL&8iC6mcu@!|l;jt`)#{{qV*>xz&p3|bIA41JxA4;o00;m8T%K0K diff --git a/doc/pub/week39/ipynb/week39.ipynb b/doc/pub/week39/ipynb/week39.ipynb index 6cb26a370..be6bd4b83 100644 --- a/doc/pub/week39/ipynb/week39.ipynb +++ b/doc/pub/week39/ipynb/week39.ipynb @@ -2,8 +2,10 @@ "cells": [ { "cell_type": "markdown", - "id": "4c73ece8", - "metadata": {}, + "id": "266a989e", + "metadata": { + "editable": true + }, "source": [ "\n", @@ -12,8 +14,10 @@ }, { "cell_type": "markdown", - "id": "22602ad0", - "metadata": {}, + "id": "0556a7de", + "metadata": { + "editable": true + }, "source": [ "# Week 39: Optimization and Gradient Methods\n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and Facility for Rare Isotope Beams, Michigan State University\n", @@ -25,13 +29,17 @@ }, { "cell_type": "markdown", - "id": "f2fcd724", - "metadata": {}, + "id": "fba6c7a0", + "metadata": { + "editable": true + }, "source": [ "## Plan for week 39\n", "\n", "* Thursday: Repetition of Logistic regression equations and classification problems and discussion of Gradient methods. Examples on how to implement Logistic Regression and discussion of stochastic gradient descent\n", "\n", + " * [Video of lecture](https://youtu.be/rDBj50Lv3Go)\n", + "\n", "* Friday: Stochastic Gradient descent with examples and automatic differentiation\n", "\n", "* Reading recommendations:\n", @@ -47,8 +55,10 @@ }, { "cell_type": "markdown", - "id": "67125149", - "metadata": {}, + "id": "b647f340", + "metadata": { + "editable": true + }, "source": [ "## Optimization, the central part of any Machine Learning algortithm\n", "\n", @@ -66,8 +76,10 @@ }, { "cell_type": "markdown", - "id": "0d07977c", - "metadata": {}, + "id": "579fc60e", + "metadata": { + "editable": true + }, "source": [ "## Revisiting our Logistic Regression case\n", "\n", @@ -81,8 +93,10 @@ }, { "cell_type": "markdown", - "id": "973763d7", - "metadata": {}, + "id": "ab60fa1c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{align*}\n", @@ -94,16 +108,20 @@ }, { "cell_type": "markdown", - "id": "d0a82293", - "metadata": {}, + "id": "86e72472", + "metadata": { + "editable": true + }, "source": [ "where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$." ] }, { "cell_type": "markdown", - "id": "de856843", - "metadata": {}, + "id": "d313a983", + "metadata": { + "editable": true + }, "source": [ "## The equations to solve\n", "\n", @@ -116,8 +134,10 @@ }, { "cell_type": "markdown", - "id": "a60566a0", - "metadata": {}, + "id": "a81835f9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n", @@ -126,8 +146,10 @@ }, { "cell_type": "markdown", - "id": "ef8826c0", - "metadata": {}, + "id": "a6eb84ee", + "metadata": { + "editable": true + }, "source": [ "If we in addition define a diagonal matrix $\\boldsymbol{W}$ with elements \n", "$p(y_i\\vert x_i,\\boldsymbol{\\beta})(1-p(y_i\\vert x_i,\\boldsymbol{\\beta})$, we can obtain a compact expression of the second derivative as" @@ -135,8 +157,10 @@ }, { "cell_type": "markdown", - "id": "566fdac8", - "metadata": {}, + "id": "63610cb8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T} = \\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X}.\n", @@ -145,16 +169,20 @@ }, { "cell_type": "markdown", - "id": "69a2105f", - "metadata": {}, + "id": "b1049f68", + "metadata": { + "editable": true + }, "source": [ "This defines what is called the Hessian matrix." ] }, { "cell_type": "markdown", - "id": "0e766c2c", - "metadata": {}, + "id": "61782910", + "metadata": { + "editable": true + }, "source": [ "## Solving using Newton-Raphson's method\n", "\n", @@ -165,8 +193,10 @@ }, { "cell_type": "markdown", - "id": "900e0a5d", - "metadata": {}, + "id": "889f7cf7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T}\\right)^{-1}_{\\boldsymbol{\\beta}^{\\mathrm{old}}}\\times \\left(\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}\\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}},\n", @@ -175,16 +205,20 @@ }, { "cell_type": "markdown", - "id": "fb485e9e", - "metadata": {}, + "id": "cf341d16", + "metadata": { + "editable": true + }, "source": [ "or in matrix form as" ] }, { "cell_type": "markdown", - "id": "c7110832", - "metadata": {}, + "id": "99617477", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X} \\right)^{-1}\\times \\left(-\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{p}) \\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}}.\n", @@ -193,8 +227,10 @@ }, { "cell_type": "markdown", - "id": "db0fd8b9", - "metadata": {}, + "id": "048efeba", + "metadata": { + "editable": true + }, "source": [ "The right-hand side is computed with the old values of $\\beta$. \n", "\n", @@ -203,8 +239,10 @@ }, { "cell_type": "markdown", - "id": "73cc9db9", - "metadata": {}, + "id": "7eeb2a3f", + "metadata": { + "editable": true + }, "source": [ "## Brief reminder on Newton-Raphson's method\n", "\n", @@ -221,8 +259,10 @@ }, { "cell_type": "markdown", - "id": "0483698c", - "metadata": {}, + "id": "4b243b9f", + "metadata": { + "editable": true + }, "source": [ "## The equations\n", "\n", @@ -235,8 +275,10 @@ }, { "cell_type": "markdown", - "id": "0b41326e", - "metadata": {}, + "id": "232e81e8", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -249,8 +291,10 @@ }, { "cell_type": "markdown", - "id": "bf22ca78", - "metadata": {}, + "id": "5048b0ce", + "metadata": { + "editable": true + }, "source": [ "For small enough values of the function and for well-behaved\n", "functions, the terms beyond linear are unimportant, hence we obtain" @@ -258,8 +302,10 @@ }, { "cell_type": "markdown", - "id": "e70a4b40", - "metadata": {}, + "id": "26fc11aa", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x)+(s-x)f'(x)\\approx 0,\n", @@ -268,16 +314,20 @@ }, { "cell_type": "markdown", - "id": "e6ab42db", - "metadata": {}, + "id": "268b40ad", + "metadata": { + "editable": true + }, "source": [ "yielding" ] }, { "cell_type": "markdown", - "id": "60f49110", - "metadata": {}, + "id": "1e8df82c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "s\\approx x-\\frac{f(x)}{f'(x)}.\n", @@ -286,16 +336,20 @@ }, { "cell_type": "markdown", - "id": "4a5daac5", - "metadata": {}, + "id": "9dad7b22", + "metadata": { + "editable": true + }, "source": [ "Having in mind an iterative procedure, it is natural to start iterating with" ] }, { "cell_type": "markdown", - "id": "dc406fad", - "metadata": {}, + "id": "40fb9be6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n", @@ -304,8 +358,10 @@ }, { "cell_type": "markdown", - "id": "4a01cef1", - "metadata": {}, + "id": "3d5b5285", + "metadata": { + "editable": true + }, "source": [ "## Simple geometric interpretation\n", "\n", @@ -324,8 +380,10 @@ }, { "cell_type": "markdown", - "id": "b9ab351f", - "metadata": {}, + "id": "92ce5653", + "metadata": { + "editable": true + }, "source": [ "## Extending to more than one variable\n", "\n", @@ -335,8 +393,10 @@ }, { "cell_type": "markdown", - "id": "c4a5c175", - "metadata": {}, + "id": "0defe140", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n", @@ -346,16 +406,20 @@ }, { "cell_type": "markdown", - "id": "5a0ec73f", - "metadata": {}, + "id": "9c81d7b3", + "metadata": { + "editable": true + }, "source": [ "which we Taylor expand to obtain" ] }, { "cell_type": "markdown", - "id": "43a0b666", - "metadata": {}, + "id": "5ec8b48f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{array}{cc} 0=f_1(x_1+h_1,x_2+h_2)=&f_1(x_1,x_2)+h_1\n", @@ -370,16 +434,20 @@ }, { "cell_type": "markdown", - "id": "9378b391", - "metadata": {}, + "id": "39d6e38f", + "metadata": { + "editable": true + }, "source": [ "Defining the Jacobian matrix ${\\bf \\boldsymbol{J}}$ we have" ] }, { "cell_type": "markdown", - "id": "742ab267", - "metadata": {}, + "id": "ae2035ba", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\bf \\boldsymbol{J}}=\\left( \\begin{array}{cc}\n", @@ -391,16 +459,20 @@ }, { "cell_type": "markdown", - "id": "974e20a1", - "metadata": {}, + "id": "96aca494", + "metadata": { + "editable": true + }, "source": [ "we can rephrase Newton's method as" ] }, { "cell_type": "markdown", - "id": "65662f4e", - "metadata": {}, + "id": "a8df5a1b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n", @@ -411,16 +483,20 @@ }, { "cell_type": "markdown", - "id": "9363cc25", - "metadata": {}, + "id": "1b245bd4", + "metadata": { + "editable": true + }, "source": [ "where we have defined" ] }, { "cell_type": "markdown", - "id": "6e0064bd", - "metadata": {}, + "id": "2e07b2d6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n", @@ -431,8 +507,10 @@ }, { "cell_type": "markdown", - "id": "94fd2ee4", - "metadata": {}, + "id": "1996803f", + "metadata": { + "editable": true + }, "source": [ "We need thus to compute the inverse of the Jacobian matrix and it\n", "is to understand that difficulties may\n", @@ -444,8 +522,10 @@ }, { "cell_type": "markdown", - "id": "36b663f2", - "metadata": {}, + "id": "a0a6d7cd", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent\n", "\n", @@ -459,8 +539,10 @@ }, { "cell_type": "markdown", - "id": "9d0c9ad9", - "metadata": {}, + "id": "be745e5e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n", @@ -469,8 +551,10 @@ }, { "cell_type": "markdown", - "id": "47f4fafb", - "metadata": {}, + "id": "1fb290b3", + "metadata": { + "editable": true + }, "source": [ "with $\\gamma_k > 0$.\n", "\n", @@ -481,8 +565,10 @@ }, { "cell_type": "markdown", - "id": "e380cfcc", - "metadata": {}, + "id": "5daf5176", + "metadata": { + "editable": true + }, "source": [ "## More on Steepest descent\n", "\n", @@ -494,8 +580,10 @@ }, { "cell_type": "markdown", - "id": "db59d2b8", - "metadata": {}, + "id": "01556473", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n", @@ -504,8 +592,10 @@ }, { "cell_type": "markdown", - "id": "21c9aac9", - "metadata": {}, + "id": "bb911199", + "metadata": { + "editable": true + }, "source": [ "The parameter $\\gamma_k$ is often referred to as the step length or\n", "the learning rate within the context of Machine Learning." @@ -513,8 +603,10 @@ }, { "cell_type": "markdown", - "id": "327ae752", - "metadata": {}, + "id": "8c872bd4", + "metadata": { + "editable": true + }, "source": [ "## The ideal\n", "\n", @@ -539,8 +631,10 @@ }, { "cell_type": "markdown", - "id": "f1c424b9", - "metadata": {}, + "id": "e89e8886", + "metadata": { + "editable": true + }, "source": [ "## The sensitiveness of the gradient descent\n", "\n", @@ -559,8 +653,10 @@ }, { "cell_type": "markdown", - "id": "c30dc8df", - "metadata": {}, + "id": "b975f76b", + "metadata": { + "editable": true + }, "source": [ "## Convex functions\n", "\n", @@ -579,8 +675,10 @@ }, { "cell_type": "markdown", - "id": "6298f287", - "metadata": {}, + "id": "5c99441c", + "metadata": { + "editable": true + }, "source": [ "## Convex function\n", "\n", @@ -589,8 +687,10 @@ }, { "cell_type": "markdown", - "id": "ea9513ed", - "metadata": {}, + "id": "04eb49ef", + "metadata": { + "editable": true + }, "source": [ "## Conditions on convex functions\n", "\n", @@ -624,8 +724,10 @@ }, { "cell_type": "markdown", - "id": "2f218b22", - "metadata": {}, + "id": "5fdf3577", + "metadata": { + "editable": true + }, "source": [ "## More on convex functions\n", "\n", @@ -650,8 +752,10 @@ }, { "cell_type": "markdown", - "id": "67110e2a", - "metadata": {}, + "id": "49b00751", + "metadata": { + "editable": true + }, "source": [ "## Some simple problems\n", "\n", @@ -678,8 +782,10 @@ }, { "cell_type": "markdown", - "id": "c7ec5012", - "metadata": {}, + "id": "eda76339", + "metadata": { + "editable": true + }, "source": [ "## Standard steepest descent\n", "\n", @@ -696,8 +802,10 @@ }, { "cell_type": "markdown", - "id": "54f15818", - "metadata": {}, + "id": "853dc57b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n", @@ -706,16 +814,20 @@ }, { "cell_type": "markdown", - "id": "bb846136", - "metadata": {}, + "id": "5379fa5a", + "metadata": { + "editable": true + }, "source": [ "In the iterative process we end up with a problem like" ] }, { "cell_type": "markdown", - "id": "14a050e6", - "metadata": {}, + "id": "a49c9a24", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n", @@ -724,8 +836,10 @@ }, { "cell_type": "markdown", - "id": "b5be57be", - "metadata": {}, + "id": "42e20b26", + "metadata": { + "editable": true + }, "source": [ "where $\\boldsymbol{r}$ is the so-called residual or error in the iterative process.\n", "\n", @@ -734,8 +848,10 @@ }, { "cell_type": "markdown", - "id": "6a8ce76f", - "metadata": {}, + "id": "c0af34f2", + "metadata": { + "editable": true + }, "source": [ "## Gradient method\n", "\n", @@ -744,8 +860,10 @@ }, { "cell_type": "markdown", - "id": "594769d8", - "metadata": {}, + "id": "93e49cad", + "metadata": { + "editable": true + }, "source": [ "$$\n", "P(\\boldsymbol{x})=\\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T\\boldsymbol{b},\n", @@ -754,8 +872,10 @@ }, { "cell_type": "markdown", - "id": "05f1fe97", - "metadata": {}, + "id": "991756d0", + "metadata": { + "editable": true + }, "source": [ "with the constraint that the matrix $\\boldsymbol{A}$ is positive definite and\n", "symmetric. This defines also the Hessian and we want it to be positive definite." @@ -763,8 +883,10 @@ }, { "cell_type": "markdown", - "id": "6efaa986", - "metadata": {}, + "id": "9e0bab1f", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent method\n", "\n", @@ -774,8 +896,10 @@ }, { "cell_type": "markdown", - "id": "99e242c6", - "metadata": {}, + "id": "b7e002d6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_0=0,\n", @@ -784,16 +908,20 @@ }, { "cell_type": "markdown", - "id": "07d95ef1", - "metadata": {}, + "id": "41a88a3a", + "metadata": { + "editable": true + }, "source": [ "or consider the system" ] }, { "cell_type": "markdown", - "id": "b81f2f36", - "metadata": {}, + "id": "bf7d650e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n", @@ -802,16 +930,20 @@ }, { "cell_type": "markdown", - "id": "83c5e15f", - "metadata": {}, + "id": "21b306ec", + "metadata": { + "editable": true + }, "source": [ "instead." ] }, { "cell_type": "markdown", - "id": "0d5239fd", - "metadata": {}, + "id": "c2595c2c", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent method\n", "One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form" @@ -819,8 +951,10 @@ }, { "cell_type": "markdown", - "id": "95cf152f", - "metadata": {}, + "id": "d9631d23", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n", @@ -829,8 +963,10 @@ }, { "cell_type": "markdown", - "id": "18692235", - "metadata": {}, + "id": "e9520154", + "metadata": { + "editable": true + }, "source": [ "This suggests taking the first basis vector $\\boldsymbol{r}_1$ (see below for definition) \n", "to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n", @@ -839,8 +975,10 @@ }, { "cell_type": "markdown", - "id": "a5076cdd", - "metadata": {}, + "id": "fe8ab6ff", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n", @@ -849,8 +987,10 @@ }, { "cell_type": "markdown", - "id": "daa366ec", - "metadata": {}, + "id": "48b2df0a", + "metadata": { + "editable": true + }, "source": [ "and \n", "$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$." @@ -858,8 +998,10 @@ }, { "cell_type": "markdown", - "id": "75a681f3", - "metadata": {}, + "id": "3120af28", + "metadata": { + "editable": true + }, "source": [ "## Final expressions\n", "We can compute the residual iteratively as" @@ -867,8 +1009,10 @@ }, { "cell_type": "markdown", - "id": "98536b08", - "metadata": {}, + "id": "349f81a7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n", @@ -877,16 +1021,20 @@ }, { "cell_type": "markdown", - "id": "aff9b796", - "metadata": {}, + "id": "2fa0028e", + "metadata": { + "editable": true + }, "source": [ "which equals" ] }, { "cell_type": "markdown", - "id": "4c01226c", - "metadata": {}, + "id": "f9ec53a2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n", @@ -895,16 +1043,20 @@ }, { "cell_type": "markdown", - "id": "62d91969", - "metadata": {}, + "id": "e881ad44", + "metadata": { + "editable": true + }, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "a5d9f79a", - "metadata": {}, + "id": "9e652153", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n", @@ -913,16 +1065,20 @@ }, { "cell_type": "markdown", - "id": "04fb0972", - "metadata": {}, + "id": "235b588a", + "metadata": { + "editable": true + }, "source": [ "which gives" ] }, { "cell_type": "markdown", - "id": "69f177ee", - "metadata": {}, + "id": "1b1cf967", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\alpha_k = \\frac{\\boldsymbol{r}_k^T\\boldsymbol{r}_k}{\\boldsymbol{r}_k^T\\boldsymbol{A}\\boldsymbol{r}_k}\n", @@ -931,16 +1087,20 @@ }, { "cell_type": "markdown", - "id": "826c4c1a", - "metadata": {}, + "id": "998bb78c", + "metadata": { + "editable": true + }, "source": [ "leading to the iterative scheme" ] }, { "cell_type": "markdown", - "id": "5b65620e", - "metadata": {}, + "id": "59cccb52", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_{k},\n", @@ -949,8 +1109,10 @@ }, { "cell_type": "markdown", - "id": "5ff7d0ef", - "metadata": {}, + "id": "8e031fcc", + "metadata": { + "editable": true + }, "source": [ "## Steepest descent example" ] @@ -958,8 +1120,11 @@ { "cell_type": "code", "execution_count": 1, - "id": "aeb6d5c9", - "metadata": {}, + "id": "42d5c457", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "%matplotlib inline\n", @@ -988,8 +1153,10 @@ }, { "cell_type": "markdown", - "id": "3ae5899d", - "metadata": {}, + "id": "3d0317f0", + "metadata": { + "editable": true + }, "source": [ "And then as countor plot" ] @@ -997,8 +1164,11 @@ { "cell_type": "code", "execution_count": 2, - "id": "c6c3a008", - "metadata": {}, + "id": "23fce077", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -1008,8 +1178,10 @@ }, { "cell_type": "markdown", - "id": "0c47c360", - "metadata": {}, + "id": "19c01aa8", + "metadata": { + "editable": true + }, "source": [ "Find guesses" ] @@ -1017,8 +1189,11 @@ { "cell_type": "code", "execution_count": 3, - "id": "db86ff05", - "metadata": {}, + "id": "3c018860", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "x = guesses[-1]\n", @@ -1027,8 +1202,10 @@ }, { "cell_type": "markdown", - "id": "9e873223", - "metadata": {}, + "id": "07d57e1b", + "metadata": { + "editable": true + }, "source": [ "Run it!" ] @@ -1036,8 +1213,11 @@ { "cell_type": "code", "execution_count": 4, - "id": "71c9d8c1", - "metadata": {}, + "id": "5f77c7ff", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "def f1d(alpha):\n", @@ -1051,8 +1231,10 @@ }, { "cell_type": "markdown", - "id": "8ffc7e06", - "metadata": {}, + "id": "31dfadfb", + "metadata": { + "editable": true + }, "source": [ "What happened?" ] @@ -1060,8 +1242,11 @@ { "cell_type": "code", "execution_count": 5, - "id": "857c0d1d", - "metadata": {}, + "id": "0cedd6a4", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "pt.axis(\"equal\")\n", @@ -1072,16 +1257,20 @@ }, { "cell_type": "markdown", - "id": "78a9e67c", - "metadata": {}, + "id": "c9a57db7", + "metadata": { + "editable": true + }, "source": [ "Note that we did only one iteration here. We can easily add more using our previous guesses." ] }, { "cell_type": "markdown", - "id": "a759a930", - "metadata": {}, + "id": "720e9388", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "In the CG method we define so-called conjugate directions and two vectors \n", @@ -1092,8 +1281,10 @@ }, { "cell_type": "markdown", - "id": "f185c679", - "metadata": {}, + "id": "ccdd73b8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n", @@ -1102,8 +1293,10 @@ }, { "cell_type": "markdown", - "id": "bbef395d", - "metadata": {}, + "id": "76cd5686", + "metadata": { + "editable": true + }, "source": [ "The philosophy of the CG method is to perform searches in various conjugate directions\n", "of our vectors $\\boldsymbol{x}_i$ obeying the above criterion, namely" @@ -1111,8 +1304,10 @@ }, { "cell_type": "markdown", - "id": "1f1417d3", - "metadata": {}, + "id": "001483f6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n", @@ -1121,8 +1316,10 @@ }, { "cell_type": "markdown", - "id": "8482b2fb", - "metadata": {}, + "id": "29da6d30", + "metadata": { + "editable": true + }, "source": [ "Two vectors are conjugate if they are orthogonal with respect to \n", "this inner product. Being conjugate is a symmetric relation: if $\\boldsymbol{s}$ is conjugate to $\\boldsymbol{t}$, then $\\boldsymbol{t}$ is conjugate to $\\boldsymbol{s}$." @@ -1130,8 +1327,10 @@ }, { "cell_type": "markdown", - "id": "12aa0a01", - "metadata": {}, + "id": "1cccf0ea", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "An example is given by the eigenvectors of the matrix" @@ -1139,8 +1338,10 @@ }, { "cell_type": "markdown", - "id": "da7bd359", - "metadata": {}, + "id": "ef9f4a74", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n", @@ -1149,16 +1350,20 @@ }, { "cell_type": "markdown", - "id": "85c05b4f", - "metadata": {}, + "id": "cf59c588", + "metadata": { + "editable": true + }, "source": [ "which is zero unless $i=j$." ] }, { "cell_type": "markdown", - "id": "57b05592", - "metadata": {}, + "id": "a2106bb7", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "Assume now that we have a symmetric positive-definite matrix $\\boldsymbol{A}$ of size\n", @@ -1167,8 +1372,10 @@ }, { "cell_type": "markdown", - "id": "25edaca6", - "metadata": {}, + "id": "f3cd45cd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n", @@ -1177,8 +1384,10 @@ }, { "cell_type": "markdown", - "id": "36dbf570", - "metadata": {}, + "id": "ae979921", + "metadata": { + "editable": true + }, "source": [ "We assume that $\\boldsymbol{p}_{i}$ is a sequence of $n$ mutually conjugate directions. \n", "Then the $\\boldsymbol{p}_{i}$ form a basis of $R^n$ and we can expand the solution \n", @@ -1187,8 +1396,10 @@ }, { "cell_type": "markdown", - "id": "a8adfc31", - "metadata": {}, + "id": "ad4149ba", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n", @@ -1197,8 +1408,10 @@ }, { "cell_type": "markdown", - "id": "8210151d", - "metadata": {}, + "id": "9d4a2bb5", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "The coefficients are given by" @@ -1206,8 +1419,10 @@ }, { "cell_type": "markdown", - "id": "06d06096", - "metadata": {}, + "id": "876225f8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n", @@ -1216,16 +1431,20 @@ }, { "cell_type": "markdown", - "id": "d98b2f5d", - "metadata": {}, + "id": "fd69b613", + "metadata": { + "editable": true + }, "source": [ "Multiplying with $\\boldsymbol{p}_k^T$ from the left gives" ] }, { "cell_type": "markdown", - "id": "1b3d21d4", - "metadata": {}, + "id": "f2de9fd2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{p}_i= \\boldsymbol{p}_k^T \\boldsymbol{b},\n", @@ -1234,16 +1453,20 @@ }, { "cell_type": "markdown", - "id": "0fa5c281", - "metadata": {}, + "id": "31e2d00e", + "metadata": { + "editable": true + }, "source": [ "and we can define the coefficients $\\alpha_k$ as" ] }, { "cell_type": "markdown", - "id": "36a79c2b", - "metadata": {}, + "id": "88c8b3ca", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\alpha_k = \\frac{\\boldsymbol{p}_k^T \\boldsymbol{b}}{\\boldsymbol{p}_k^T \\boldsymbol{A} \\boldsymbol{p}_k}\n", @@ -1252,8 +1475,10 @@ }, { "cell_type": "markdown", - "id": "7400bf9b", - "metadata": {}, + "id": "af1050c2", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method and iterations\n", "\n", @@ -1270,8 +1495,10 @@ }, { "cell_type": "markdown", - "id": "05dcda06", - "metadata": {}, + "id": "8f3d0c5e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{x}_0=0,\n", @@ -1280,16 +1507,20 @@ }, { "cell_type": "markdown", - "id": "f59f43f1", - "metadata": {}, + "id": "e8d03d21", + "metadata": { + "editable": true + }, "source": [ "or consider the system" ] }, { "cell_type": "markdown", - "id": "79375e76", - "metadata": {}, + "id": "0c4d6c4b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n", @@ -1298,16 +1529,20 @@ }, { "cell_type": "markdown", - "id": "d8104364", - "metadata": {}, + "id": "22c9d676", + "metadata": { + "editable": true + }, "source": [ "instead." ] }, { "cell_type": "markdown", - "id": "c014b000", - "metadata": {}, + "id": "33f135cc", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form" @@ -1315,8 +1550,10 @@ }, { "cell_type": "markdown", - "id": "ada74dc2", - "metadata": {}, + "id": "4638cec5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n", @@ -1325,8 +1562,10 @@ }, { "cell_type": "markdown", - "id": "183da2ae", - "metadata": {}, + "id": "78176236", + "metadata": { + "editable": true + }, "source": [ "This suggests taking the first basis vector $\\boldsymbol{p}_1$ \n", "to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n", @@ -1335,8 +1574,10 @@ }, { "cell_type": "markdown", - "id": "edab709c", - "metadata": {}, + "id": "c71e2985", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n", @@ -1345,8 +1586,10 @@ }, { "cell_type": "markdown", - "id": "ed04ea87", - "metadata": {}, + "id": "a82f2c13", + "metadata": { + "editable": true + }, "source": [ "and \n", "$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n", @@ -1356,8 +1599,10 @@ }, { "cell_type": "markdown", - "id": "8ca6c92a", - "metadata": {}, + "id": "f1726a68", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:" @@ -1365,8 +1610,10 @@ }, { "cell_type": "markdown", - "id": "e8186d4e", - "metadata": {}, + "id": "d10d83de", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n", @@ -1375,8 +1622,10 @@ }, { "cell_type": "markdown", - "id": "c0709a75", - "metadata": {}, + "id": "0785af64", + "metadata": { + "editable": true + }, "source": [ "Note that $\\boldsymbol{r}_k$ is the negative gradient of $f$ at \n", "$\\boldsymbol{x}=\\boldsymbol{x}_k$, \n", @@ -1389,8 +1638,10 @@ }, { "cell_type": "markdown", - "id": "e1d261da", - "metadata": {}, + "id": "bcbabbe5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{p}_{k+1}=\\boldsymbol{r}_k-\\frac{\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{r}_k}{\\boldsymbol{p}_k^T\\boldsymbol{A}\\boldsymbol{p}_k} \\boldsymbol{p}_k.\n", @@ -1399,8 +1650,10 @@ }, { "cell_type": "markdown", - "id": "dd0a7fcb", - "metadata": {}, + "id": "e177513d", + "metadata": { + "editable": true + }, "source": [ "## Conjugate gradient method\n", "We can also compute the residual iteratively as" @@ -1408,8 +1661,10 @@ }, { "cell_type": "markdown", - "id": "a9a717b8", - "metadata": {}, + "id": "f62ef65f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n", @@ -1418,16 +1673,20 @@ }, { "cell_type": "markdown", - "id": "b549f75f", - "metadata": {}, + "id": "51c56e08", + "metadata": { + "editable": true + }, "source": [ "which equals" ] }, { "cell_type": "markdown", - "id": "c4aecd92", - "metadata": {}, + "id": "4b4b7571", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n", @@ -1436,16 +1695,20 @@ }, { "cell_type": "markdown", - "id": "8df935ba", - "metadata": {}, + "id": "f1d91da4", + "metadata": { + "editable": true + }, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "3e641382", - "metadata": {}, + "id": "ca59c2b0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n", @@ -1454,16 +1717,20 @@ }, { "cell_type": "markdown", - "id": "4478daea", - "metadata": {}, + "id": "35b934d5", + "metadata": { + "editable": true + }, "source": [ "which gives" ] }, { "cell_type": "markdown", - "id": "a08581d0", - "metadata": {}, + "id": "7b81ff02", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n", @@ -1472,8 +1739,10 @@ }, { "cell_type": "markdown", - "id": "29a102a4", - "metadata": {}, + "id": "cc532b40", + "metadata": { + "editable": true + }, "source": [ "## Revisiting our first homework\n", "\n", @@ -1494,8 +1763,11 @@ { "cell_type": "code", "execution_count": 6, - "id": "16f91d0d", - "metadata": {}, + "id": "fd40460a", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "x = 2*np.random.rand(m,1)\n", @@ -1504,8 +1776,10 @@ }, { "cell_type": "markdown", - "id": "f165490e", - "metadata": {}, + "id": "e82a0302", + "metadata": { + "editable": true + }, "source": [ "with $x_i \\in [0,1] $ is chosen randomly using a uniform distribution. Additionally we have a stochastic noise chosen according to a normal distribution $\\cal {N}(0,1)$. \n", "The linear regression model is given by" @@ -1513,8 +1787,10 @@ }, { "cell_type": "markdown", - "id": "84498422", - "metadata": {}, + "id": "68a4daa0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n", @@ -1523,16 +1799,20 @@ }, { "cell_type": "markdown", - "id": "f98e851e", - "metadata": {}, + "id": "1e3644b8", + "metadata": { + "editable": true + }, "source": [ "such that" ] }, { "cell_type": "markdown", - "id": "ab911929", - "metadata": {}, + "id": "b52d0e59", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n", @@ -1541,8 +1821,10 @@ }, { "cell_type": "markdown", - "id": "170e4189", - "metadata": {}, + "id": "78ad760b", + "metadata": { + "editable": true + }, "source": [ "## Gradient descent example\n", "\n", @@ -1553,8 +1835,10 @@ }, { "cell_type": "markdown", - "id": "1a2651d2", - "metadata": {}, + "id": "d71f7c0d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "X \\equiv \\begin{bmatrix}\n", @@ -1567,16 +1851,20 @@ }, { "cell_type": "markdown", - "id": "310ad769", - "metadata": {}, + "id": "ce9d921f", + "metadata": { + "editable": true + }, "source": [ "The cost/loss/risk function is given by (" ] }, { "cell_type": "markdown", - "id": "a5b0496c", - "metadata": {}, + "id": "27aa96d7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\beta) = \\frac{1}{n}||X\\beta-\\mathbf{y}||_{2}^{2} = \\frac{1}{n}\\sum_{i=1}^{100}\\left[ (\\beta_0 + \\beta_1 x_i)^2 - 2 y_i (\\beta_0 + \\beta_1 x_i) + y_i^2\\right]\n", @@ -1585,16 +1873,20 @@ }, { "cell_type": "markdown", - "id": "c0759118", - "metadata": {}, + "id": "9a8d11f0", + "metadata": { + "editable": true + }, "source": [ "and we want to find $\\beta$ such that $C(\\beta)$ is minimized." ] }, { "cell_type": "markdown", - "id": "c65d80ad", - "metadata": {}, + "id": "f3e390cf", + "metadata": { + "editable": true + }, "source": [ "## The derivative of the cost/loss function\n", "\n", @@ -1603,8 +1895,10 @@ }, { "cell_type": "markdown", - "id": "30544a22", - "metadata": {}, + "id": "b7228342", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\nabla_{\\beta} C(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n", @@ -1615,16 +1909,20 @@ }, { "cell_type": "markdown", - "id": "f7e27f43", - "metadata": {}, + "id": "62c62291", + "metadata": { + "editable": true + }, "source": [ "where $X$ is the design matrix defined above." ] }, { "cell_type": "markdown", - "id": "0c7d8c1d", - "metadata": {}, + "id": "1564d6a0", + "metadata": { + "editable": true + }, "source": [ "## The Hessian matrix\n", "The Hessian matrix of $C(\\beta)$ is given by" @@ -1632,8 +1930,10 @@ }, { "cell_type": "markdown", - "id": "afa82cb3", - "metadata": {}, + "id": "8cc61784", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -1645,16 +1945,20 @@ }, { "cell_type": "markdown", - "id": "837c1e3f", - "metadata": {}, + "id": "54ba3f55", + "metadata": { + "editable": true + }, "source": [ "This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite." ] }, { "cell_type": "markdown", - "id": "89fc16ec", - "metadata": {}, + "id": "c150ee31", + "metadata": { + "editable": true + }, "source": [ "## Simple program\n", "\n", @@ -1663,8 +1967,10 @@ }, { "cell_type": "markdown", - "id": "983001de", - "metadata": {}, + "id": "5bec697f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n", @@ -1673,8 +1979,10 @@ }, { "cell_type": "markdown", - "id": "915c0c75", - "metadata": {}, + "id": "639805a1", + "metadata": { + "editable": true + }, "source": [ "We can use the expression we computed for the gradient and let use a\n", "$\\beta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n", @@ -1686,8 +1994,10 @@ }, { "cell_type": "markdown", - "id": "30d20294", - "metadata": {}, + "id": "734657b8", + "metadata": { + "editable": true + }, "source": [ "## Gradient Descent Example\n", "\n", @@ -1697,8 +2007,11 @@ { "cell_type": "code", "execution_count": 7, - "id": "c6017dfa", - "metadata": {}, + "id": "0aec41a8", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "\n", @@ -1751,8 +2064,10 @@ }, { "cell_type": "markdown", - "id": "dcc6889f", - "metadata": {}, + "id": "a6d8295f", + "metadata": { + "editable": true + }, "source": [ "## And a corresponding example using **scikit-learn**" ] @@ -1760,8 +2075,11 @@ { "cell_type": "code", "execution_count": 8, - "id": "8acb6aad", - "metadata": {}, + "id": "a903b53b", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "# Importing various packages\n", @@ -1784,8 +2102,10 @@ }, { "cell_type": "markdown", - "id": "fcc08db2", - "metadata": {}, + "id": "c6eb1b40", + "metadata": { + "editable": true + }, "source": [ "## Gradient descent and Ridge\n", "\n", @@ -1794,8 +2114,10 @@ }, { "cell_type": "markdown", - "id": "ad450622", - "metadata": {}, + "id": "8a8cd057", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n", @@ -1804,16 +2126,20 @@ }, { "cell_type": "markdown", - "id": "d86008e8", - "metadata": {}, + "id": "f2983a73", + "metadata": { + "editable": true + }, "source": [ "In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we adjust the gradient as follows" ] }, { "cell_type": "markdown", - "id": "8074070e", - "metadata": {}, + "id": "e352badb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\nabla_\\beta C_{\\text{ridge}}(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n", @@ -1824,16 +2150,20 @@ }, { "cell_type": "markdown", - "id": "05356160", - "metadata": {}, + "id": "aa884fde", + "metadata": { + "editable": true + }, "source": [ "We can easily extend our program to minimize $C_{\\text{ridge}}(\\beta)$ using gradient descent and compare with the analytical solution given by" ] }, { "cell_type": "markdown", - "id": "58c8ba7c", - "metadata": {}, + "id": "f91ba4e0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_{\\text{ridge}} = \\left(X^T X + n\\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y}.\n", @@ -1842,8 +2172,10 @@ }, { "cell_type": "markdown", - "id": "abbd7c72", - "metadata": {}, + "id": "9a18134e", + "metadata": { + "editable": true + }, "source": [ "## The Hessian matrix for Ridge Regression\n", "The Hessian matrix of Ridge Regression for our simple example is given by" @@ -1851,8 +2183,10 @@ }, { "cell_type": "markdown", - "id": "134a8134", - "metadata": {}, + "id": "d3ec0891", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{H} \\equiv \\begin{bmatrix}\n", @@ -1864,8 +2198,10 @@ }, { "cell_type": "markdown", - "id": "b5b89343", - "metadata": {}, + "id": "8a042993", + "metadata": { + "editable": true + }, "source": [ "This implies that the Hessian matrix is positive definite, hence the stationary point is a\n", "minimum.\n", @@ -1876,8 +2212,10 @@ }, { "cell_type": "markdown", - "id": "f79ceb7a", - "metadata": {}, + "id": "148f61dd", + "metadata": { + "editable": true + }, "source": [ "## Program example for gradient descent with Ridge Regression" ] @@ -1885,8 +2223,11 @@ { "cell_type": "code", "execution_count": 9, - "id": "a9c7f630", - "metadata": {}, + "id": "707deca6", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "from random import random, seed\n", @@ -1943,8 +2284,10 @@ }, { "cell_type": "markdown", - "id": "8c6aece2", - "metadata": {}, + "id": "f39bd794", + "metadata": { + "editable": true + }, "source": [ "## Using gradient descent methods, limitations\n", "\n", @@ -1963,8 +2306,10 @@ }, { "cell_type": "markdown", - "id": "ea1e6f53", - "metadata": {}, + "id": "41eae562", + "metadata": { + "editable": true + }, "source": [ "## Improving gradient descent with momentum\n", "\n", @@ -1973,59 +2318,13 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "d1f044c9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">0 f([0.74724774]) = 0.55838\n", - ">1 f([0.59779819]) = 0.35736\n", - ">2 f([0.47823856]) = 0.22871\n", - ">3 f([0.38259084]) = 0.14638\n", - ">4 f([0.30607268]) = 0.09368\n", - ">5 f([0.24485814]) = 0.05996\n", - ">6 f([0.19588651]) = 0.03837\n", - ">7 f([0.15670921]) = 0.02456\n", - ">8 f([0.12536737]) = 0.01572\n", - ">9 f([0.10029389]) = 0.01006\n", - ">10 f([0.08023512]) = 0.00644\n", - ">11 f([0.06418809]) = 0.00412\n", - ">12 f([0.05135047]) = 0.00264\n", - ">13 f([0.04108038]) = 0.00169\n", - ">14 f([0.0328643]) = 0.00108\n", - ">15 f([0.02629144]) = 0.00069\n", - ">16 f([0.02103315]) = 0.00044\n", - ">17 f([0.01682652]) = 0.00028\n", - ">18 f([0.01346122]) = 0.00018\n", - ">19 f([0.01076897]) = 0.00012\n", - ">20 f([0.00861518]) = 0.00007\n", - ">21 f([0.00689214]) = 0.00005\n", - ">22 f([0.00551372]) = 0.00003\n", - ">23 f([0.00441097]) = 0.00002\n", - ">24 f([0.00352878]) = 0.00001\n", - ">25 f([0.00282302]) = 0.00001\n", - ">26 f([0.00225842]) = 0.00001\n", - ">27 f([0.00180673]) = 0.00000\n", - ">28 f([0.00144539]) = 0.00000\n", - ">29 f([0.00115631]) = 0.00000\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": 10, + "id": "2f65ff78", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], "source": [ "from numpy import asarray\n", "from numpy import arange\n", @@ -2086,67 +2385,23 @@ }, { "cell_type": "markdown", - "id": "137dfd69", - "metadata": {}, + "id": "185959cb", + "metadata": { + "editable": true + }, "source": [ "## Same code but now with momentum gradient descent" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "70ea5fd5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">0 f([0.74724774]) = 0.55838\n", - ">1 f([0.54175461]) = 0.29350\n", - ">2 f([0.37175575]) = 0.13820\n", - ">3 f([0.24640494]) = 0.06072\n", - ">4 f([0.15951871]) = 0.02545\n", - ">5 f([0.1015491]) = 0.01031\n", - ">6 f([0.0638484]) = 0.00408\n", - ">7 f([0.03976851]) = 0.00158\n", - ">8 f([0.02459084]) = 0.00060\n", - ">9 f([0.01511937]) = 0.00023\n", - ">10 f([0.00925406]) = 0.00009\n", - ">11 f([0.00564365]) = 0.00003\n", - ">12 f([0.0034318]) = 0.00001\n", - ">13 f([0.00208188]) = 0.00000\n", - ">14 f([0.00126053]) = 0.00000\n", - ">15 f([0.00076202]) = 0.00000\n", - ">16 f([0.00046006]) = 0.00000\n", - ">17 f([0.00027746]) = 0.00000\n", - ">18 f([0.00016719]) = 0.00000\n", - ">19 f([0.00010067]) = 0.00000\n", - ">20 f([6.05804744e-05]) = 0.00000\n", - ">21 f([3.64373635e-05]) = 0.00000\n", - ">22 f([2.19069576e-05]) = 0.00000\n", - ">23 f([1.31664443e-05]) = 0.00000\n", - ">24 f([7.91100141e-06]) = 0.00000\n", - ">25 f([4.75216828e-06]) = 0.00000\n", - ">26 f([2.85408468e-06]) = 0.00000\n", - ">27 f([1.71384267e-06]) = 0.00000\n", - ">28 f([1.02900153e-06]) = 0.00000\n", - ">29 f([6.17748881e-07]) = 0.00000\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAtxklEQVR4nO3dd3RUdf7/8ed7Jo0kBEihpRKq9BKaCqKggrhgoYPKVwTFsutaYXWVlbXvKrq6q4h9KdZdUXGRIgJKC106BEgCQgKEBALpn98fM/gbMSEBZnJnJu/HORwz996Z++ImvnK55XPFGINSSinfZ7M6gFJKKffQQldKKT+hha6UUn5CC10ppfyEFrpSSvmJAKtWHB0dbZKSkqxavVJK+aS1a9ceMcbElDfPskJPSkoiNTXVqtUrpZRPEpH9Fc3TQy5KKeUntNCVUspPaKErpZSf0EJXSik/oYWulFJ+otJCF5F3RCRLRH6qYL6IyKsisltENolIZ/fHVEopVZmq7KG/B/Q/x/wBQHPnnwnAvy4+llJKqfNVaaEbY5YCx86xyGDgA+OwEqgrIo3cFfBsGzOO89w329Fhf5VSvqaszPD011vZejDPI5/vjmPosUCGy+tM57TfEJEJIpIqIqnZ2dkXtLJNmcd54/s9bMrMvaD3K6WUVVakHeWtZXvZcdh7C73KjDHTjTEpxpiUmJhy71yt1OBOsdQKtDNrVbqb0ymllGfNWpVO3dBABrT1zEEMdxT6ASDe5XWcc5pHRIQEMrhjY+ZuPEju6WJPrUYppdwq60QB87ccYkjnOEIC7R5ZhzsKfS5wq/Nqlx5ArjHmZzd8boVGd0/kdHEp/13vsd8bSinlVp+kZlJSZhjZPcFj66jKZYuzgRVASxHJFJFxInKXiNzlXGQekAbsBt4C7vZYWqd2cXVoH1eHmav268lRpZTXKy0zzFqVzqVNo2gaE+6x9VQ62qIxZmQl8w1wj9sSVdGobglM+nwza/fnkJIUWd2rV0qpKlu6K5sDx08z+bpWHl2Pz94p+rsOjakdHMBMPTmqlPJyM1emEx0exDWtG3p0PT5b6GHBAdzYOZavN/9MTn6R1XGUUqpcB4+fZvH2wwxLiScowLOV67OFDjCqewJFJWV8ti7T6ihKKVWuj9ZkYICR3Tx3MvQMny70Vg0j6JJYj5mr0vXkqFLK65SUljFnTTq9m8cQHxnq8fX5dKEDjO6ewN4j+azYc9TqKEop9SuLtmdxOK+Q0R68VNGVzxf6de0aUTc0UE+OKqW8zsxV6TSMCOGqVvWrZX0+X+ghgXZu7hzH/C2HyD5RaHUcpZQCIP3oKZbtymZ413gC7NVTtT5f6OA4OVpSZvg4NaPyhZVSqhrMXpOOACO6xVe6rLv4RaE3jQmnZ3IUs1enU1amJ0eVUtYqKinjk9QM+l7SgEZ1alXbev2i0MGxl56Zc5qluy5sWF6llHKXb7ce4sjJIkZV08nQM/ym0K9t05CosCA9OaqUstzMlenE1atF7+YXNkz4hfKbQg8KsDGsazyLth3m59zTVsdRStVQu7NOsiLtKCO7JWC3SbWu228KHWBk1wQMMGe1nhxVSllj9up0AmzCsJTqOxl6hl8VekJUKL2ax/DRmgxKSsusjqOUqmEKikv5bF0m17ZpSEzt4Gpfv18VOjjuHD2UV8Di7VlWR1FK1TDzNv/M8VPF1XZn6Nn8rtD7tqpPg4hgPTmqlKp2M1elkxwdRs+mUZas3+8KPcBuY0TXBJbuyibj2Cmr4yilaojth/JYuz+HUd0TEKnek6Fn+F2hg+POLMFxckIpparDrFXpBAXYuLlznGUZ/LLQG9WpxVWtGvBxagZFJXpyVCnlWfmFJXy+7gAD2zWiXliQZTn8stABRvdI4MjJIr7desjqKEopP/flxoOcLCyx7GToGX5b6L2bxxBbtxaz9OSoUsrDZq1Op0WDcLok1rM0h98Wut0mjOqewI97jrIn+6TVcZRSfmpT5nE2ZeYyunuiZSdDz/DbQgcYmhJHgE2YrXvpSikPmbUqnVqBdm7sHGt1FP8u9Pq1Q7i2TUM+XZdJQXGp1XGUUn4mr6CYuRsPMqhDYyJCAq2O49+FDo5hdY+fKuabn362OopSys98sf4Ap4pKq32Y3Ir4faH3TI6iSXQYM1fqYRellPsYY5i5Kp22sRG0j6tjdRygBhS6zSaM6pZA6v4cdhw6YXUcpZSfWJeew/ZDJ7ziZOgZfl/oADd3iSPIbmPWqv1WR1FK+YmZq9IJDw5gUIfGVkf5RY0o9MiwIK5r15DP1x3gVFGJ1XGUUj7u+Kkivtr0Mzd0akxYcIDVcX5RIwodYHSPRE4UlvDlxoNWR1FK+bhP12ZSVFLGqG6JVkf5lRpT6CmJ9WjRIFyH1VVKXRRjDLNWp9M5oS6tG0dYHedXqlToItJfRHaIyG4RmVTO/AQR+U5E1ovIJhG5zv1RL46I4+TopsxcNmUetzqOUspHrdhzlLTsfEZ19669c6hCoYuIHXgdGAC0BkaKSOuzFnsc+NgY0wkYAfzT3UHd4aYucYQHBzBj2V6royilfNSM5XuJCgvi+vaNrI7yG1XZQ+8G7DbGpBljioA5wOCzljHAmX971AG88kB1REggI7vF8/Xmn8nM0YdfKKXOz67DJ1i8PYtbeyYREmi3Os5vVKXQY4EMl9eZzmmupgBjRCQTmAfcV94HicgEEUkVkdTs7OwLiHvx/u+yJgjw7g/7LFm/Usp3zVi2l+AAG7f09L7DLeC+k6IjgfeMMXHAdcCHIvKbzzbGTDfGpBhjUmJiYty06vPTuG4trm/fiDmr08k9XWxJBqWU78k6UcB/1h9gaEockRY+xOJcqlLoB4B4l9dxzmmuxgEfAxhjVgAhQLQ7AnrCHb2SyS8q1UfUKaWq7IMf91NcVsa4y5OtjlKhqhT6GqC5iDQRkSAcJz3nnrVMOtAXQEQuwVHo1hxTqYK2sXW4rFkU7/6wVx9Rp5Sq1KmiEj5cuZ9rWjegSXSY1XEqVGmhG2NKgHuB+cA2HFezbBGRp0RkkHOxB4HxIrIRmA2MNcYYT4V2h/G9kjmcV6g3GimlKvVJaia5p4uZ0Nt7984BqnTPqjFmHo6Tna7TnnD5eitwmXujedYVLWJo2aA2by1L46bOsV4zuI5SyruUlhlmLE+jc0JduiRGWh3nnGrMnaJnExHu6NWE7YdOsGzXEavjKKW81Pwth8g4dtrr986hBhc6wKCOjalfO5i3lqVZHUUp5YWMMby5NI3EqFCubt3Q6jiVqtGFHhxgZ+xlSSzbdYStB/OsjqOU8jKp+3PYmHGcOy5vgt3m/Ydla3ShA4zulkhokJ0Zy3UvXSn1a28tTaNeaCBDusRXvrAXqPGFXic0kOFd45m74SA/5562Oo5SykukZZ9kwbbD3NIjkVpB3nebf3lqfKED3H5ZE8qM4b0f91kdRSnlJd5evpdAu41beiZZHaXKtNCB+MhQrmvXiFkr0zlRoMMBKFXTHT1ZyKdrM7m5cywxtYOtjlNlWuhOE3onc6KwhI/WZFS+sFLKr324cj+FJd59m395tNCd2sfVpVuTSN79YR/FpTocgFI1VUFxKR+s2E/fVvVpVj/c6jjnRQvdxYReyRw4fpp5m3+2OopSyiKfrcvkWH4R433gRqKzaaG7uKpVfZJjwnhrWRpePhSNUsoDysoMM5btpX1cHbo38e7b/Mujhe7CZhPG90rmpwN5rEg7anUcpVQ1W7jtMHuP5DO+V7JPju+khX6WGzvFEh0exFtL9UYjpWqat5alEVu3FgPaev9t/uXRQj9LSKCdW3sm8d2ObHYePmF1HKVUNVmXnsOafTmMu7wJAXbfrEbfTO1hY3okEhJoY4YO2qVUjTFjWRoRIQEM6+obt/mXRwu9HJFhQQztEs9/1x8kK6/A6jhKKQ/bfzSf//10iNE9EgkPrtJjIrySFnoFxl3ehOKyMt5fsc/qKEopD3tn+V7sNmHspUlWR7koWugVSIoO49rWDfn3ynTyC0usjqOU8pCc/CI+Ts1kcMdYGkSEWB3nomihn8P43snkni7mk1QdDkApfzVz1X5OF5cyvpfv3Uh0Ni30c+iSWI8uifV4+4e9lOhwAEr5nYLiUt77cb/jGcMNa1sd56JpoVdifK9kMo6dZv6Ww1ZHUUq52RcbDnDkZKFPPC+0KrTQK3F16wYkRYUyfekeHQ5AKT9SVmZ4a9leWjeK4NKmUVbHcQst9ErYbcK4XslszMxlzb4cq+Mopdxkyc4sdmedZEJv37zNvzxa6FUwpHMc9UIDma7DASjlN6YvTaNRnRAGtm9kdRS30UKvglpBdm7pmcSi7YfZk33S6jhKqYu0OTOXlWnHuP2yJgT66G3+5fGfv4mH3dozkSC7jX9+t8fqKEqpi/T6d7upHRzA8G6+e5t/ebTQqyg6PJgxPRL5z/pM3UtXyof9dCCX/205xO2XNyEiJNDqOG6lhX4eJvZpSnCAnVcW7rI6ilLqAr20YCd1agUyrlcTq6O4nRb6eYgOD2bsZUl8uekgOw7p0LpK+Zp16Tks3p7FhN7Jfrd3Dlro521Cr2TCggJ4ecFOq6Mopc7TS9/uJCosyOcH4apIlQpdRPqLyA4R2S0ikypYZpiIbBWRLSIyy70xvUe9sCDGXd6E/205xE8Hcq2Oo5SqolVpR1m++wgT+zQlzIeHyD2XSgtdROzA68AAoDUwUkRan7VMc2AycJkxpg1wv/ujeo9xvZpQp1ag7qUr5SOMMfz9253Ur+24uMFfVWUPvRuw2xiTZowpAuYAg89aZjzwujEmB8AYk+XemN4lIiSQCb2TWbQ9i3XpeveoUt5u+e4jrN53jHuubEZIoN3qOB5TlUKPBVzHj810TnPVAmghIj+IyEoR6V/eB4nIBBFJFZHU7OzsC0vsJcZemkRkWJDupSvl5c7snTeuE8IIP7vu/GzuOikaADQH+gAjgbdEpO7ZCxljphtjUowxKTExMW5atTXCggOYeEVTlu06wqq0o1bHUUpVYPH2LDZkHOe+vs0JDvDfvXOoWqEfAFx/rcU5p7nKBOYaY4qNMXuBnTgK3q+N6ZFI/drB/H3BTh2JUSkvZIzhpQU7SYgMZUiXOKvjeFxVCn0N0FxEmohIEDACmHvWMv/FsXeOiETjOATj9yNZ1Qqyc8+VzVi99xg/7Na9dKW8zfwth9hyMI8/9G3uV2O2VKTSv6ExpgS4F5gPbAM+NsZsEZGnRGSQc7H5wFER2Qp8BzxsjKkRDTeiWzyN64Twt2936F66Ul6ktMyxd54cE8YNnc4+7eefqvQryxgzzxjTwhjT1BjztHPaE8aYuc6vjTHmAWNMa2NMO2PMHE+G9ibBAXbu69ucDRnH+W6HX1/co5RP+WrTQXYePskf+7XAbvOP8c4r4///BqkGQ7rEkRAZyt+/1WPpSnmDktIypi3cRauGtRnYzn/GO6+MFrobBNpt/L5vc7YczGP+lkNWx1Gqxls57V1umfMSU6LzsNWQvXPQQnebGzo2JjkmjJcW7KS0TPfSlbJK8bIf6PnwBP5v7Zd0nzAMVqywOlK10UJ3kwC7jfv7tWDn4ZN8temg1XGUqrH2v/gqdlOGAFJUBEuWWB2p2mihu9H17RrRskFtXlm4i5LSMqvjKFXjFOSfJnTZ9xjA2O0QFAR9+lgdq9poobuRzSb88eoWpB3J578bdC9dqeq2+ZGpND5+mH2PPIlMnQqLFkHPnlbHqjb+OYakha5t04C2sRG8smgngzs2rhE3MyjlDU7vy6D1jGmsbXcpnZ97EqTmnAw9Q9vGzUSEB69uScax03ySmml1HKVqjMzx9xJQWkLAq68iNbDMQQvdI/q0jKFTQl3+sXgXBcWlVsdRyu+dWrCY5gvnMm/ALXTo08XqOJbRQveAM3vpP+cWMGd1utVxlPJvxcWcvnMimRH1Sf77VKvTWEoL3UMuaxZF9yaRvL5kD6eLdC9dKU85Pe1Vovbu5L+3PUSHFo2tjmMpLXQPEREevKYl2ScK+XDlPqvjKOWfDh3CNmUKS5p04cpHx1udxnJa6B7UrUkkvZpH88b3aZwsLLE6jlJ+p/CBh5DCQhbf/RhtYutaHcdyWuge9sDVLTiWX8T7P+6zOopS/mX5coJnz+Stbjcy5pZ+VqfxClroHtYpoR59W9Xnze/3kHu62Oo4SvmHkhJKJt7NwYgY9k34Ay0a1LY6kVfQQq8Gf7y6BXkFJcxY5vcPcVKqevzrXwT8tJmn+97BxIHtrU7jNbTQq0Hb2Dpc374R05emkZlzyuo4Svm2w4cpffzPLE/qSO1Rw0mOCbc6kdfQQq8mk6+7BBF4+uttVkdRyqeZSZMw+fm8MPAeHurfyuo4XkULvZrE1q3FvVc245ufDrFsV7bVcZTyTStWIO+9x4yUwdw0si/R4cFWJ/IqWujV6I5eySRGhTJl7haKSnR4XaXOS2kpZffcS1ZENP+78Q7G9Ei0OpHX0UKvRiGBdp64vjV7svP1Mkalztf06djWr+OpPrczaWhXAnQk09/QLVLN+l7SgKta1Wfawp1k5RVYHUcp33DkCKV/eowVSR2wDR9Oj+QoqxN5JS10CzxxfWuKSw3PfbPd6ihK+YbJkzEn8nim/0T+NLC11Wm8lha6BZKiwxjfuwmfrz/Amn3HrI6jlHdbvRrz9tu803kQ1w3vR8M6IVYn8lpa6Ba558pmNKoTwpNfbKG0zFgdRynvVFpK2d33cLR2JHMHjeP2y5OsTuTVtNAtEhoUwGMDL2Hrz3nM0jHTlSrf229jW5vK1N5jeWhoV4ID7FYn8mpa6BYa2K4RPZOj+Nv8HRzLL7I6jlLe5ehRyiZNZk1CW04NGU6flvWtTuT1tNAtJCL8ZXAbThaW8Ldvd1gdRynv8vjjmNxc/nLtRJ74XRur0/gELXSLtWhQm9t6JjF7dTqbM3OtjqOUd1i7FvPmm7zfaSBXDe1HfGSo1Yl8gha6F7j/6uZEhQXxxNyfKNMTpKqmKyvD3H0POeH1mHP9OCZe0dTqRD5DC90LRIQE8mj/VqxPP87n6w9YHUcpa733HrJ6FX/tfRsPDOlKrSA9EVpVVSp0EekvIjtEZLeITDrHcjeLiBGRFPdFrBlu7hxHp4S6PPfNNvIK9EEYqobKyaHskUdZF9+a7BuGcW2bhlYn8imVFrqI2IHXgQFAa2CkiPzmVi0RqQ38AVjl7pA1gc0mPDWoLUfzi3hl4S6r4yhljT//GY4d44mrJ/LkoLaIiNWJfEpV9tC7AbuNMWnGmCJgDjC4nOWmAs8DOkDJBWoXV4cRXRN478d97Dx8wuo4SlWvDRsw//oXH3S6jktv7kuz+vrgivNVlUKPBTJcXmc6p/1CRDoD8caYr8/1QSIyQURSRSQ1O1vHBC/Pw9e2JDw4gCe/2IIxeoJU1RBlZZh77iE3NIIPBozjvquaWZ3IJ130SVERsQEvAQ9WtqwxZroxJsUYkxITE3Oxq/ZLkWFBPHRtS1akHWXe5kNWx1Gqevz738iPP/J0r9v4/c1dqR0SaHUin1SVQj8AxLu8jnNOO6M20BZYIiL7gB7AXD0xeuFGdUugdaMI/vr1Vk4VlVgdRynPys2l7OFH2BR3CfuvH8Lgjo2tTuSzqlLoa4DmItJERIKAEcDcMzONMbnGmGhjTJIxJglYCQwyxqR6JHENYLcJTw1uw8+5Bfzzuz1Wx1HKs558EsnO4vF+d/LkDe30ROhFqLTQjTElwL3AfGAb8LExZouIPCUigzwdsKZKSYrkxk6xTF+axr4j+VbHUcozNm/GvPYaszr2p8PgvrRpXMfqRD6tSsfQjTHzjDEtjDFNjTFPO6c9YYyZW86yfXTv3D0mD2hFoF146qutVkdRyv2MwdxzDydCwpl+ze08eE0LqxP5PL1T1IvVjwjh/n4tWLw9i0XbDlsdRyn3mjULWbaMZy6/hbtu6kbd0CCrE/k8LXQvd9ulSTSNCWPKl1vIL9QTpMpP5OVR9uBDbIltydYBQxmWEl/5e1SltNC9XFCAjWdvak9mzmn++rUeelH+wUyZAlmHebzfXTwzpAN2m54IdQctdB/QrUkkd/ZuyuzVGSzYqodelI/bsgXz6qvMaX8N/W67nraxeiLUXbTQfcQDV7egdaMIJn22iewThVbHUerCGEPBxLvJCwplwejfc5cOjetWWug+IijAxrQRHTlRWMKjn23SYQGUTyqb8xEhy5byypW38dS4Pnqoxc200H1Iiwa1mTygFYu3Z+mDpZXvOXmSU7+/n80NmtL6iQf1KUQeoIXuY27rmUSv5tH89attpGWftDqOUlV25NHHCT9ymHl3Ps6QbolWx/FLWug+xmYTXhzSgaAAG3/8eCPFpWVWR1KqUoWbt1D3jdf4onN/xj8ySm/v9xAtdB/UsE4Iz9zYjo0Zx3lt8W6r4yh1bsZw4Nbx5AeGEP2PvxEZpjcQeYoWuo8a2L4RN3WK5bXvdrMuPcfqOEpVaNtr75K8YQXLbv09l13axuo4fk2suloiJSXFpKbqkC8XI6+gmAHTlhFgF+b9vhdhwQFWR1LqV45n51DQvCUnwyKI3bWFWqHBVkfyeSKy1hhT7vDkuofuwyJCAnlpWAfSj53Su0iV1zHGsOqOB2mYm4289rqWeTXQQvdx3ZOj9C5S5ZXWPP8Gfb98n33detP0xmutjlMjaKH7Ab2LVHmb7G8W0uVP92A3ZSRuWg0rVlgdqUbQQvcDrneRTtK7SJXFysoMx+79I3ZjEECKi2HJEqtj1Qha6H6iRYPaTOrfikXbs5i9OsPqOKoG++GhqbRM+4kyux3sdggKgj59rI5VI2ih+5GxlyZxebNopn61Ve8iVZbYP+e/9Jz2FzZ1vBz57juYOhUWLYKePa2OViPoZYt+5lBuAddOW0pSdBif3tWTQLv+zlbVo3DTTxR378HBug2IXr+ayIZRVkfyS3rZYg3SsE4IT9/YVu8iVdXryBHyr72O0/ZAjsz6RMvcIlrofuj69o1/uYt0vd5FqjytsJDcAb8jLPsQ/3nydS69srPViWosLXQ/NWVwGxpGhPDHjzbos0iV5xhD0bjx1EldyQsjJ3HLH4ZbnahG00L3U2fuIt1/7BR//Xqb1XGUnzLPP0/QzA+Z1ms0Nzz7ILWC7FZHqtG00P1Y9+QoJvROZvbqdD5J1UsZlZt9/jkyeTJfXHIFAU8+Qbs4fTao1bTQ/dxD17Tk8mbR/Ok/m1mx56jVcZS/WLuW0tFjWNe4Jf974GkmXtnc6kQKLXS/F2i38froziRFhXHXv9eyR69PVxfrwAGKr/8dh4Nr8/LdL/D3W7vrs0G9hBZ6DVCnViDvjO1KgE24/b01HMsvsjqS8lX5+RQP/B1Fx47zyG1/5W/3XUNokA7b7C200GuI+MhQ3rothUO5BUz4IJWC4lKrIylfU1ZGyZhbsG3ayEM3TeKxScNpEBFidSrlQgu9BumcUI+XhnUkdX8Oj+ogXuo8lT32GAH//Q/PXDWOYU/exSWNIqyOpM6ihV7DDGzfiIevbckXGw7y8sJdVsdRvuL997E99xwzO/Yn8anJXNmqvtWJVDmqVOgi0l9EdojIbhGZVM78B0Rkq4hsEpFFIpLo/qjKXe7u05RhKXG8umgXn6/LtDqO8nbLllF6x3iWJ3Yg7YlnufXSJlYnUhWotNBFxA68DgwAWgMjRaT1WYutB1KMMe2BT4EX3B1UuY+I8Ncb2tEzOYpHP9vEqjS9nFFVYM8eigbdwP6I+nz8yN/50+AOVidS51CVPfRuwG5jTJoxpgiYAwx2XcAY850x5pTz5Uogzr0xlbsFBdh4Y0wXEiJDufPfa9l7JN/qSMrbHD9O4YCBnCos5tmJL/DsuCv08kQvV5VCjwVcbzPMdE6ryDjgm/JmiMgEEUkVkdTs7Oyqp1QeUSc0kHfHdsMmwv+9u5ocvZxRnVFSQuHNQ7Gl7WHy6ClMffgmwoL18kRv59aToiIyBkgBXixvvjFmujEmxRiTEhMT485VqwuUEBXKW7d24WBuAXd+uJbCEr2cUUHxfb8nePFCplx3H/f+ZRwN6+jlib6gKoV+AIh3eR3nnPYrItIPeAwYZIzRJxX7kC6Jkbw4pD2r9x1j0meb9XLGGq7sH/8g8I1/8Wb3m7jq+Udp01jHaPEVVfk31BqguYg0wVHkI4BRrguISCfgTaC/MSbL7SmVxw3uGMv+o6d4acFOkqLC+EM/HZujRvrf/+D++/m2eQ+Cnn+evpc0sDqROg+V7qEbY0qAe4H5wDbgY2PMFhF5SkQGORd7EQgHPhGRDSIy12OJlcfcd1Uzbuocy8sLd/LFht/8I0z5u59+ovjmoWyLTmL1U68wtndTqxOp81SlsxzGmHnAvLOmPeHydT8351IWEBGevakdmTmnefiTTTSuW4uuSZFWx1LVISuL0/0HkmcLYsYj03hxaAoiekWLr9E7RdWvBAfYeXNMF2Lr1WLCB6ns08sZ/V9BAaevH4QcPsTT459h6r0DCNCHi/sk/a6p36gXFsQ7Y7tiQEdn9HfGUDD2dmqtWcVfhjzCpCduJVwvT/RZWuiqXE2iw5h+SwqZx08z7M0VHDx+2upIygNyHptCyEezeaXPrYx68SEa161ldSR1EbTQVYW6NYnkg9u7cTi3gJv/9SO7Dp+wOpJyo/Q336fes0/xVfu+XPH+NH2EnB/QQlfn1CM5io/u7ElJmWHIGytYuz/H6kjKDTZ9voCYe+9kU2IbLvn6Izom1LM6knIDLXRVqdaNI/h84qXUCw1k9IyVLN5+2OpI6iKkvvIOySMGcapWGA0XzqNpXJTVkZSbaKGrKomPDOXTiZfSvH5txn+wls/W6rC7vmj5lGl0vn8cYcUFRBblUz9b7zfwJ1roqsqiw4OZPaEHPZIjefCTjUxfusfqSKqKjDF89edX6Tb1YQQcf0pKYMkSi5Mpd9JCV+clPDiAd8Z2ZWD7RjwzbzvPzNtGWZmO/eLNSotL+H7oBK7/6x842jgRQkLAboegIOjTx+p4yo30glN13oID7PxjRCeiw4KYvjSNIycLef7m9gTqzShepyD7KLuuHkyfjT+wsf8Q2v/nQ2T9eseeeZ8+0LOn1RGVG2mhqwtiswlTBrUhOjyYvy/YSU5+Ea+P7kxokP5IeYuT6zdyov/vaHXkID88OJXLXnwMRBwlrkXul3SXSl0wEeG+vs159qZ2fL8zm9EzVulDMrzE8dkfY+vZk8CTJ1j51sdc9rfHHWWu/JoWurpoI7sl8M/RXdhyMI+heleptcrKOP7wZOqOGs7uqHh2fbOEXrffZHUqVU200JVb9G/bUO8qtVpuLnn9B1L3b8/xRcerMUu+p2dvfahzTaKFrtzG9a7SoW/qXaXVascOTnVOIXTht7z0u/toO/8zOjRvaHUqVc200JVbnbmrtG4tx12lX248aHUkv2fmzqW4S1dOH8pm0sSXGfXhCzStX9vqWMoCWujK7c7cVdqqYQT3zV7PXR+uJSuvwOpY/qesjLzHnkAGD2Zb7Qb8+fF3+fOLE/WBzjWYFrryiOjwYD69qyeTBrTiux1Z9Hvpez5OzdAHULtJWW4e6VcOIOKZqXzRri8bZ87ltUdvoE5ooNXRlIW00JXHBNht3HVFU775Qy9aNYzgkU83ccvbq8k4dsrqaD4tfdUGDlzSkcbLFvLhiD/S+bsvuOWqS7DZ9LLEmk4LXXlcckw4cyb0YOoNbVmfnsM1Ly/l3R/2UqpDBpyXktIyvn7ubepecTnhx4+y/PWZjJn1d+KjwqyOpryEFrqqFjabcEuPRL594Aq6J0fyly+3MvSNH9mdpZc3VkXa3G/Z2LYHAybfwfEGsZSuXk2fiSP0Qc7qV7TQVbWKrVuLd8d25eXhHdh7JJ/rXlnOa4t3UVxaZnU0r1RQXMpXj75A4g396bJ9DdhsJLz3BtFtW1odTXkhLXRV7USEGzvFseCBK7imTQP+9u1OfveP5WzOzLU6mlfZvHw9S3sO4LoXHsXmPJlsE4GVKy1OpryVFrqyTHR4MK+N6sz0W7pwLL+IG/75A899s52C4lKro1nq1L4MVg8cRcsrunHFxu/Jvv5mRIe8VVWgha4sd02bhix44AqGdonjje/3MOCVZaxKO2p1rOqXk0P6Xfdja9Gczt98xKarb6R0x04afPkpLF4MU6fCokU6UqKqkFh1XXBKSopJTU21ZN3Ke/2w+wiTPt9ExrHT3NgpljE9EuicUM+vT/6ZkyfJeOoFol+fRuipEyzqdBX1X3qedn1SrI6mvJCIrDXGlPvDoYWuvM6pohKmLdzFzJX7yS8qpVn9cIanxHNT51iiwoOtjuc2WUfy2D71Jdq8+w+iThzj++bd2P/HPzHsjusJCbRbHU95KS105ZPyC0v4etPPzFmTzrr04wTahatbN2BYSjy9msdg98EbaUpKy1g/+yt49VXit62j4ckctjXrQPbkJ+g6ZjC1grTI1blpoSuft+vwCT5ak8Hn6w9wLL+IxnVCGJoSz9CUOOLqhVodr1L7j+bz7RfLiP7XPxic+g02DEaEo1OeJvrPk/ThE6rKtNCV3ygsKWXh1iw+Ss1g2a5sAC5vFs2Irgn0a12f4ADv2cMtKC5l2fxVHHnn37T/YT5tstIAMICA46qVqVNh8mQrYyofo4Wu/FJmzik+Sc3kk9QMDuYWEBkWxE2dYhneNZ7mDSwaPnbFCrL//RFp+7II27CWtgd3AnDokg6EjhlFRJuWMHIkFBU5LkHUq1bUebroQheR/sArgB2YYYx57qz5wcAHQBfgKDDcGLPvXJ+pha7cpbTMsHz3ET5ak86CrYcpLjW0alibpvXDia8XSkJkKPGRtYivF0rjurUICrj4q3WLl/3AifkL2d8mhQwJwbZmNbFLF9Bh7ZJfbgI61CiRgjG3kXDXWGzJTf7/m1esgCVLHNeTa5mr83RRhS4idmAncDWQCawBRhpjtrosczfQ3hhzl4iMAG40xgw/1+dqoStPOHqykM/XHWDprmwyjp0iM+c0JS6DgNkEGtWpRVy9WsRH/rrs4yNDiYmrj+3ECcqAsrAw8i69gpza9djY9Uryf84mbvUyivNPcdVPS7Ebx3AFZ45+F9kDCSwtRgBjtyN6OEV5wMUWek9gijHmWufryQDGmGddlpnvXGaFiAQAh4AYc44P10JX1aG0zHAor4CMY6dIP3aKzGOnyMg5/cvrrBOFvyy74aVh1Ckuf2jfs09ZnjkObkQouH4Qwc88jS33OFx9tR5OUR51rkIPqML7Y4EMl9eZQPeKljHGlIhILhAFHDkryARgAkBCQkKVwit1Mew2IbZuLWLr1qJHctRv5hcUl5KZc5qMnFNEPO8o8/KuNzE4xqDBGLDZEJsNjEGCgqg1+VFo28ax4KJFejhFWaYqhe42xpjpwHRw7KFX57qVKk9IoJ1m9cNpVj8cateGE+UP5yuBgY5LC0tLHXvf06bB0aO/Le6ePbXIlWWqUugHgHiX13HOaeUtk+k85FIHx8lRpXxHXh5ERPz/Ug8Ph379oGFDuPVWxzTd+1ZerCqFvgZoLiJNcBT3CGDUWcvMBW4DVgBDgMXnOn6ulNfKyzv3fC1y5cUqLXTnMfF7gfk4Llt8xxizRUSeAlKNMXOBt4EPRWQ3cAxH6SullKpGVTqGboyZB8w7a9oTLl8XAEPdG00ppdT50PHQlVLKT2ihK6WUn9BCV0opP6GFrpRSfsKy0RZFJBvYf4Fvj+asu1C9hOY6P5rr/HlrNs11fi4mV6IxJqa8GZYV+sUQkdSKxjKwkuY6P5rr/HlrNs11fjyVSw+5KKWUn9BCV0opP+GrhT7d6gAV0FznR3OdP2/NprnOj0dy+eQxdKWUUr/lq3voSimlzqKFrpRSfsJrC11EhorIFhEpE5EKL+8Rkf4iskNEdovIJJfpTURklXP6RyIS5KZckSKyQER2Of9br5xlrhSRDS5/CkTkBue890Rkr8u8jtWVy7lcqcu657pMt3J7dRSRFc7v9yYRGe4yz63bq6KfF5f5wc6//27n9khymTfZOX2HiFx7MTkuINcDIrLVuX0WiUiiy7xyv6fVlGusiGS7rP8Ol3m3Ob/vu0TktmrO9bJLpp0ictxlnie31zsikiUiP1UwX0TkVWfuTSLS2WXexW8vY4xX/gEuAVoCS4CUCpaxA3uAZCAI2Ai0ds77GBjh/PoNYKKbcr0ATHJ+PQl4vpLlI3EMKRzqfP0eMMQD26tKuYCTFUy3bHsBLYDmzq8bAz8Ddd29vc718+KyzN3AG86vRwAfOb9u7Vw+GGji/Bx7Nea60uVnaOKZXOf6nlZTrrHAa+W8NxJIc/63nvPretWV66zl78Mx7LdHt5fzs3sDnYGfKph/HfANjicd9gBWuXN7ee0eujFmmzFmRyWLdQN2G2PSjDFFwBxgsIgIcBXwqXO594Eb3BRtsPPzqvq5Q4BvjDHlP33Yfc431y+s3l7GmJ3GmF3Orw8CWUC5d8JdpHJ/Xs6R91Ogr3P7DAbmGGMKjTF7gd3Oz6uWXMaY71x+hlbieHKYp1Vle1XkWmCBMeaYMSYHWAD0tyjXSGC2m9Z9TsaYpTh24CoyGPjAOKwE6opII9y0vby20KuovAdYx+J4QPVxY0zJWdPdoYEx5mfn14eABpUsP4Lf/jA97fzn1ssiElzNuUJEJFVEVp45DIQXbS8R6YZjr2uPy2R3ba+Kfl7KXca5Pc488Lwq7/VkLlfjcOzlnVHe97Q6c93s/P58KiJnHlfpFdvLeWiqCbDYZbKntldVVJTdLdurWh8SfTYRWQg0LGfWY8aYL6o7zxnnyuX6whhjRKTC6z6dv3nb4Xja0xmTcRRbEI5rUR8FnqrGXInGmAMikgwsFpHNOErrgrl5e30I3GaMKXNOvuDt5Y9EZAyQAlzhMvk331NjzJ7yP8HtvgRmG2MKReROHP+6uaqa1l0VI4BPjTGlLtOs3F4eZWmhG2P6XeRHVPQA66M4/ikT4NzLKu/B1heUS0QOi0gjY8zPzgLKOsdHDQP+Y4wpdvnsM3urhSLyLvBQdeYyxhxw/jdNRJYAnYDPsHh7iUgE8DWOX+YrXT77grdXOS7mgedVea8ncyEi/XD8krzCGFN4ZnoF31N3FFSluYwxrg+Dn4HjnMmZ9/Y5671L3JCpSrlcjADucZ3gwe1VFRVld8v28vVDLr88wFocV2WMAOYax1mG73AcvwbHA6zdtcd/5oHYVfnc3xy7c5bamePWNwDlng33RC4RqXfmkIWIRAOXAVut3l7O791/cBxb/PSsee7cXuX+vJwjr+sDz+cCI8RxFUwToDmw+iKynFcuEekEvAkMMsZkuUwv93tajbkaubwcBGxzfj0fuMaZrx5wDb/+l6pHczmztcJxgnGFyzRPbq+qmAvc6rzapQeQ69xpcc/28tTZ3ov9A9yI4zhSIXAYmO+c3hiY57LcdcBOHL9hH3OZnozjf7jdwCdAsJtyRQGLgF3AQiDSOT0FmOGyXBKO37q2s96/GNiMo5j+DYRXVy7gUue6Nzr/O84bthcwBigGNrj86eiJ7VXezwuOQziDnF+HOP/+u53bI9nlvY8537cDGODmn/fKci10/n9wZvvMrex7Wk25ngW2ONf/HdDK5b23O7fjbuD/qjOX8/UU4Lmz3ufp7TUbx1VaxTj6axxwF3CXc74Arztzb8blCj53bC+99V8ppfyErx9yUUop5aSFrpRSfkILXSml/IQWulJK+QktdKWU8hNa6Eop5Se00JVSyk/8P2O4xqLPu9cnAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": 11, + "id": "84299e90", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], "source": [ "from numpy import asarray\n", "from numpy import arange\n", @@ -2215,8 +2470,10 @@ }, { "cell_type": "markdown", - "id": "3eac652d", - "metadata": {}, + "id": "cce1ff04", + "metadata": { + "editable": true + }, "source": [ "## Overview video on Stochastic Gradient Descent\n", "\n", @@ -2225,8 +2482,10 @@ }, { "cell_type": "markdown", - "id": "9ee2bcdd", - "metadata": {}, + "id": "ec171de6", + "metadata": { + "editable": true + }, "source": [ "## Batches and mini-batches\n", "\n", @@ -2244,8 +2503,10 @@ }, { "cell_type": "markdown", - "id": "a2a69883", - "metadata": {}, + "id": "61f771e2", + "metadata": { + "editable": true + }, "source": [ "## Stochastic Gradient Descent (SGD)\n", "\n", @@ -2274,8 +2535,10 @@ }, { "cell_type": "markdown", - "id": "3cb45498", - "metadata": {}, + "id": "167c0617", + "metadata": { + "editable": true + }, "source": [ "## Stochastic Gradient Descent\n", "\n", @@ -2289,8 +2552,10 @@ }, { "cell_type": "markdown", - "id": "10c0c325", - "metadata": {}, + "id": "90e37c2b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\mathbf{\\beta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n", @@ -2300,8 +2565,10 @@ }, { "cell_type": "markdown", - "id": "aa0d4c01", - "metadata": {}, + "id": "514288e1", + "metadata": { + "editable": true + }, "source": [ "## Computation of gradients\n", "\n", @@ -2311,8 +2578,10 @@ }, { "cell_type": "markdown", - "id": "9ada4734", - "metadata": {}, + "id": "bdb9af89", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\nabla_\\beta C(\\mathbf{\\beta}) = \\sum_i^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n", @@ -2322,8 +2591,10 @@ }, { "cell_type": "markdown", - "id": "b187e9a4", - "metadata": {}, + "id": "3d7c4c2f", + "metadata": { + "editable": true + }, "source": [ "Stochasticity/randomness is introduced by only taking the\n", "gradient on a subset of the data called minibatches. If there are $n$\n", @@ -2334,8 +2605,10 @@ }, { "cell_type": "markdown", - "id": "65cd1b71", - "metadata": {}, + "id": "8a5b43e2", + "metadata": { + "editable": true + }, "source": [ "## SGD example\n", "As an example, suppose we have $10$ data points $(\\mathbf{x}_1,\\cdots, \\mathbf{x}_{10})$ \n", @@ -2354,8 +2627,10 @@ }, { "cell_type": "markdown", - "id": "37a27914", - "metadata": {}, + "id": "0d4cc828", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\nabla_{\\beta}\n", @@ -2367,8 +2642,10 @@ }, { "cell_type": "markdown", - "id": "06933ac2", - "metadata": {}, + "id": "00ecaf91", + "metadata": { + "editable": true + }, "source": [ "## The gradient step\n", "\n", @@ -2377,8 +2654,10 @@ }, { "cell_type": "markdown", - "id": "2c0cfb82", - "metadata": {}, + "id": "f0e3f62a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\beta_{j+1} = \\beta_j - \\gamma_j \\sum_{i \\in B_k}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n", @@ -2388,8 +2667,10 @@ }, { "cell_type": "markdown", - "id": "f90b72f3", - "metadata": {}, + "id": "45411341", + "metadata": { + "editable": true + }, "source": [ "where $k$ is picked at random with equal\n", "probability from $[1,n/M]$. An iteration over the number of\n", @@ -2400,8 +2681,10 @@ }, { "cell_type": "markdown", - "id": "8c964be7", - "metadata": {}, + "id": "58c3927e", + "metadata": { + "editable": true + }, "source": [ "## Simple example code" ] @@ -2409,8 +2692,11 @@ { "cell_type": "code", "execution_count": 12, - "id": "4eac284e", - "metadata": {}, + "id": "eb9b91fb", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import numpy as np \n", @@ -2431,8 +2717,10 @@ }, { "cell_type": "markdown", - "id": "1074f7d4", - "metadata": {}, + "id": "9eba2696", + "metadata": { + "editable": true + }, "source": [ "Taking the gradient only on a subset of the data has two important\n", "benefits. First, it introduces randomness which decreases the chance\n", @@ -2445,8 +2733,10 @@ }, { "cell_type": "markdown", - "id": "982554ed", - "metadata": {}, + "id": "9b74dee2", + "metadata": { + "editable": true + }, "source": [ "## When do we stop?\n", "\n", @@ -2464,8 +2754,10 @@ }, { "cell_type": "markdown", - "id": "6e09fd45", - "metadata": {}, + "id": "1b0f3bea", + "metadata": { + "editable": true + }, "source": [ "## Slightly different approach\n", "\n", @@ -2482,8 +2774,10 @@ }, { "cell_type": "markdown", - "id": "28895eb5", - "metadata": {}, + "id": "d21909a4", + "metadata": { + "editable": true + }, "source": [ "## Time decay rate\n", "\n", @@ -2499,8 +2793,11 @@ { "cell_type": "code", "execution_count": 13, - "id": "07202d5c", - "metadata": {}, + "id": "c48e042b", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import numpy as np \n", @@ -2531,8 +2828,10 @@ }, { "cell_type": "markdown", - "id": "cb6a7d32", - "metadata": {}, + "id": "c3e56e42", + "metadata": { + "editable": true + }, "source": [ "## Code with a Number of Minibatches which varies\n", "\n", @@ -2541,39 +2840,13 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "1ebde042", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Own inversion\n", - "[[4.]\n", - " [3.]]\n", - "Eigenvalues of Hessian Matrix:[0.26504701 4.42519896]\n", - "theta from own gd\n", - "[[4.]\n", - " [3.]]\n", - "theta from own sdg\n", - "[[3.97239309]\n", - " [3.02330208]]\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": 14, + "id": "27c60383", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], "source": [ "# Importing various packages\n", "from math import exp, sqrt\n", @@ -2583,7 +2856,7 @@ "\n", "n = 100\n", "x = 2*np.random.rand(n,1)\n", - "y = 4+3*x#+np.random.randn(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", @@ -2645,8 +2918,10 @@ }, { "cell_type": "markdown", - "id": "99a3e2be", - "metadata": {}, + "id": "8eb3e862", + "metadata": { + "editable": true + }, "source": [ "## Replace or not\n", "\n", @@ -2658,8 +2933,10 @@ }, { "cell_type": "markdown", - "id": "12ad19f6", - "metadata": {}, + "id": "34c63f75", + "metadata": { + "editable": true + }, "source": [ "## Momentum based GD\n", "\n", @@ -2671,8 +2948,10 @@ }, { "cell_type": "markdown", - "id": "529fe4b5", - "metadata": {}, + "id": "b526eb97", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n", @@ -2681,8 +2960,10 @@ }, { "cell_type": "markdown", - "id": "6f31d112", - "metadata": {}, + "id": "a65b9f7c", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -2697,8 +2978,10 @@ }, { "cell_type": "markdown", - "id": "214661ae", - "metadata": {}, + "id": "501f2ee6", + "metadata": { + "editable": true + }, "source": [ "where we have introduced a momentum parameter $\\gamma$, with\n", "$0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to\n", @@ -2714,8 +2997,10 @@ }, { "cell_type": "markdown", - "id": "157ac0bc", - "metadata": {}, + "id": "d7f9d1c1", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n", @@ -2724,16 +3009,20 @@ }, { "cell_type": "markdown", - "id": "0e4d8eb6", - "metadata": {}, + "id": "2f6d7af0", + "metadata": { + "editable": true + }, "source": [ "where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$." ] }, { "cell_type": "markdown", - "id": "5030a332", - "metadata": {}, + "id": "894ce2fd", + "metadata": { + "editable": true + }, "source": [ "## More on momentum based approaches\n", "\n", @@ -2746,8 +3035,10 @@ }, { "cell_type": "markdown", - "id": "1e3162a0", - "metadata": {}, + "id": "11ddd872", + "metadata": { + "editable": true + }, "source": [ "$$\n", "m {d^2 \\mathbf{w} \\over dt^2} + \\mu {d \\mathbf{w} \\over dt }= -\\nabla_w E(\\mathbf{w}).\n", @@ -2756,16 +3047,20 @@ }, { "cell_type": "markdown", - "id": "39341fc6", - "metadata": {}, + "id": "c0cadfff", + "metadata": { + "editable": true + }, "source": [ "We can discretize this equation in the usual way to get" ] }, { "cell_type": "markdown", - "id": "4a925447", - "metadata": {}, + "id": "428438f5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "m { \\mathbf{w}_{t+\\Delta t}-2 \\mathbf{w}_{t} +\\mathbf{w}_{t-\\Delta t} \\over (\\Delta t)^2}+\\mu {\\mathbf{w}_{t+\\Delta t}- \\mathbf{w}_{t} \\over \\Delta t} = -\\nabla_w E(\\mathbf{w}).\n", @@ -2774,16 +3069,20 @@ }, { "cell_type": "markdown", - "id": "5bc8857b", - "metadata": {}, + "id": "92e9357c", + "metadata": { + "editable": true + }, "source": [ "Rearranging this equation, we can rewrite this as" ] }, { "cell_type": "markdown", - "id": "3f3a3dca", - "metadata": {}, + "id": "5c0e73c6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\Delta \\mathbf{w}_{t +\\Delta t}= - { (\\Delta t)^2 \\over m +\\mu \\Delta t} \\nabla_w E(\\mathbf{w})+ {m \\over m +\\mu \\Delta t} \\Delta \\mathbf{w}_t.\n", @@ -2792,8 +3091,10 @@ }, { "cell_type": "markdown", - "id": "a1e7d5d2", - "metadata": {}, + "id": "0ea1cb78", + "metadata": { + "editable": true + }, "source": [ "## Momentum parameter\n", "\n", @@ -2806,8 +3107,10 @@ }, { "cell_type": "markdown", - "id": "258f174a", - "metadata": {}, + "id": "89f597f5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\gamma= {m \\over m +\\mu \\Delta t }, \\qquad \\eta = {(\\Delta t)^2 \\over m +\\mu \\Delta t}.\n", @@ -2816,8 +3119,10 @@ }, { "cell_type": "markdown", - "id": "9405179c", - "metadata": {}, + "id": "954d762d", + "metadata": { + "editable": true + }, "source": [ "Thus, as the name suggests, the momentum parameter is proportional to\n", "the mass of the particle and effectively provides inertia.\n", @@ -2847,8 +3152,10 @@ }, { "cell_type": "markdown", - "id": "42647548", - "metadata": {}, + "id": "38641257", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma \\mathbf{v}_{t-1}) \\nonumber\n", @@ -2857,8 +3164,10 @@ }, { "cell_type": "markdown", - "id": "fa8f3d45", - "metadata": {}, + "id": "22c5b321", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -2873,16 +3182,20 @@ }, { "cell_type": "markdown", - "id": "757a5a92", - "metadata": {}, + "id": "c7309191", + "metadata": { + "editable": true + }, "source": [ "One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of $\\gamma$." ] }, { "cell_type": "markdown", - "id": "ec07c646", - "metadata": {}, + "id": "56a16b68", + "metadata": { + "editable": true + }, "source": [ "## Second moment of the gradient\n", "\n", @@ -2910,8 +3223,10 @@ }, { "cell_type": "markdown", - "id": "c1d51956", - "metadata": {}, + "id": "b7c6d361", + "metadata": { + "editable": true + }, "source": [ "## RMS prop\n", "\n", @@ -2923,8 +3238,10 @@ }, { "cell_type": "markdown", - "id": "f8511d10", - "metadata": {}, + "id": "78d79a03", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -2939,8 +3256,10 @@ }, { "cell_type": "markdown", - "id": "fd599d2a", - "metadata": {}, + "id": "ad384bea", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{s}_t =\\beta \\mathbf{s}_{t-1} +(1-\\beta)\\mathbf{g}_t^2 \\nonumber\n", @@ -2949,8 +3268,10 @@ }, { "cell_type": "markdown", - "id": "073455c5", - "metadata": {}, + "id": "a2b9882c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\mathbf{g}_t \\over \\sqrt{\\mathbf{s}_t +\\epsilon}}, \\nonumber\n", @@ -2959,8 +3280,10 @@ }, { "cell_type": "markdown", - "id": "0550cfc9", - "metadata": {}, + "id": "70d9b90b", + "metadata": { + "editable": true + }, "source": [ "where $\\beta$ controls the averaging time of the second moment and is\n", "typically taken to be about $\\beta=0.9$, $\\eta_t$ is a learning rate\n", @@ -2975,8 +3298,10 @@ }, { "cell_type": "markdown", - "id": "a3e891ab", - "metadata": {}, + "id": "6b4c7e03", + "metadata": { + "editable": true + }, "source": [ "## [ADAM optimizer](https://arxiv.org/abs/1412.6980)\n", "\n", @@ -2996,8 +3321,10 @@ }, { "cell_type": "markdown", - "id": "b56d6328", - "metadata": {}, + "id": "4fc5c09c", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3012,8 +3339,10 @@ }, { "cell_type": "markdown", - "id": "a496b94c", - "metadata": {}, + "id": "6dac702f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{m}_t = \\beta_1 \\mathbf{m}_{t-1} + (1-\\beta_1) \\mathbf{g}_t \\nonumber\n", @@ -3022,8 +3351,10 @@ }, { "cell_type": "markdown", - "id": "0abe86a1", - "metadata": {}, + "id": "38fb872a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbf{s}_t =\\beta_2 \\mathbf{s}_{t-1} +(1-\\beta_2)\\mathbf{g}_t^2 \\nonumber\n", @@ -3032,8 +3363,10 @@ }, { "cell_type": "markdown", - "id": "6d799dcf", - "metadata": {}, + "id": "48436706", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\mathbf{m}}_t={\\mathbf{m}_t \\over 1-\\beta_1^t} \\nonumber\n", @@ -3042,8 +3375,10 @@ }, { "cell_type": "markdown", - "id": "437c3cef", - "metadata": {}, + "id": "711b05c2", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\mathbf{s}}_t ={\\mathbf{s}_t \\over1-\\beta_2^t} \\nonumber\n", @@ -3052,8 +3387,10 @@ }, { "cell_type": "markdown", - "id": "c3752fd1", - "metadata": {}, + "id": "7c5be7c4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\boldsymbol{\\mathbf{m}}_t \\over \\sqrt{\\boldsymbol{\\mathbf{s}}_t} +\\epsilon}, \\nonumber\n", @@ -3062,8 +3399,10 @@ }, { "cell_type": "markdown", - "id": "28e99f74", - "metadata": {}, + "id": "91fbb6a2", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3077,8 +3416,10 @@ }, { "cell_type": "markdown", - "id": "c69e5b35", - "metadata": {}, + "id": "e25b8b4b", + "metadata": { + "editable": true + }, "source": [ "where $\\beta_1$ and $\\beta_2$ set the memory lifetime of the first and\n", "second moment and are typically taken to be $0.9$ and $0.99$\n", @@ -3094,8 +3435,10 @@ }, { "cell_type": "markdown", - "id": "2207777f", - "metadata": {}, + "id": "bc510d5a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\Delta \\theta_{t+1}= -\\eta_t { \\boldsymbol{m}_t \\over \\sqrt{\\sigma_t^2 + m_t^2 }+\\epsilon}.\n", @@ -3104,8 +3447,10 @@ }, { "cell_type": "markdown", - "id": "a9dd6e15", - "metadata": {}, + "id": "0957ade8", + "metadata": { + "editable": true + }, "source": [ "## Practical tips\n", "\n", @@ -3122,8 +3467,10 @@ }, { "cell_type": "markdown", - "id": "00b94d96", - "metadata": {}, + "id": "c0c4e70c", + "metadata": { + "editable": true + }, "source": [ "## Automatic differentiation\n", "\n", @@ -3158,8 +3505,10 @@ }, { "cell_type": "markdown", - "id": "40e322b8", - "metadata": {}, + "id": "2479e6ec", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x) = \\sin\\left(2\\pi x + x^2\\right)\n", @@ -3168,16 +3517,20 @@ }, { "cell_type": "markdown", - "id": "6ef03583", - "metadata": {}, + "id": "25573059", + "metadata": { + "editable": true + }, "source": [ "which has the following derivative" ] }, { "cell_type": "markdown", - "id": "a90642b5", - "metadata": {}, + "id": "99867c27", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f'(x) = \\cos\\left(2\\pi x + x^2\\right)\\left(2\\pi + 2x\\right)\n", @@ -3186,8 +3539,10 @@ }, { "cell_type": "markdown", - "id": "f13e4196", - "metadata": {}, + "id": "ab095717", + "metadata": { + "editable": true + }, "source": [ "Using **autograd** we have" ] @@ -3195,8 +3550,11 @@ { "cell_type": "code", "execution_count": 15, - "id": "e91017bf", - "metadata": {}, + "id": "957de0bd", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3237,8 +3595,10 @@ }, { "cell_type": "markdown", - "id": "edb98a44", - "metadata": {}, + "id": "6b45687d", + "metadata": { + "editable": true + }, "source": [ "## Using autograd\n", "\n", @@ -3252,8 +3612,11 @@ { "cell_type": "code", "execution_count": 16, - "id": "8101c103", - "metadata": {}, + "id": "3250aae4", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3277,8 +3640,10 @@ }, { "cell_type": "markdown", - "id": "7925f3b4", - "metadata": {}, + "id": "4bb0ad31", + "metadata": { + "editable": true + }, "source": [ "## Autograd with more complicated functions\n", "\n", @@ -3290,8 +3655,11 @@ { "cell_type": "code", "execution_count": 17, - "id": "f2c69e0f", - "metadata": {}, + "id": "515ff31b", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3331,16 +3699,20 @@ }, { "cell_type": "markdown", - "id": "0fbbc5a9", - "metadata": {}, + "id": "774f5eda", + "metadata": { + "editable": true + }, "source": [ "Note that the grad function will not produce the true gradient of the function. The true gradient of a function with two or more variables will produce a vector, where each element is the function differentiated w.r.t a variable." ] }, { "cell_type": "markdown", - "id": "96d43a0a", - "metadata": {}, + "id": "68b8b8f7", + "metadata": { + "editable": true + }, "source": [ "## More complicated functions using the elements of their arguments directly" ] @@ -3348,8 +3720,11 @@ { "cell_type": "code", "execution_count": 18, - "id": "f53794e7", - "metadata": {}, + "id": "bcf539e8", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3373,8 +3748,10 @@ }, { "cell_type": "markdown", - "id": "cee7be4d", - "metadata": {}, + "id": "cb8ac207", + "metadata": { + "editable": true + }, "source": [ "Note that in this case, when sending an array as input argument, the\n", "output from Autograd is another array. This is the true gradient of\n", @@ -3386,8 +3763,10 @@ }, { "cell_type": "markdown", - "id": "df2680c1", - "metadata": {}, + "id": "c5f87a92", + "metadata": { + "editable": true + }, "source": [ "## Functions using mathematical functions from Numpy" ] @@ -3395,8 +3774,11 @@ { "cell_type": "code", "execution_count": 19, - "id": "e752fa81", - "metadata": {}, + "id": "7d46685e", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3420,8 +3802,10 @@ }, { "cell_type": "markdown", - "id": "317db3e8", - "metadata": {}, + "id": "1f7f96c0", + "metadata": { + "editable": true + }, "source": [ "## More autograd" ] @@ -3429,8 +3813,11 @@ { "cell_type": "code", "execution_count": 20, - "id": "96609851", - "metadata": {}, + "id": "e49128c7", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3451,8 +3838,10 @@ }, { "cell_type": "markdown", - "id": "587bbcc3", - "metadata": {}, + "id": "03135da4", + "metadata": { + "editable": true + }, "source": [ "## And with loops" ] @@ -3460,8 +3849,11 @@ { "cell_type": "code", "execution_count": 21, - "id": "c62adaa8", - "metadata": {}, + "id": "968ba627", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3493,8 +3885,11 @@ { "cell_type": "code", "execution_count": 22, - "id": "75db0457", - "metadata": {}, + "id": "ebaba4fb", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3510,8 +3905,10 @@ }, { "cell_type": "markdown", - "id": "c99c7e99", - "metadata": {}, + "id": "680f026e", + "metadata": { + "editable": true + }, "source": [ "## Using recursion" ] @@ -3519,8 +3916,11 @@ { "cell_type": "code", "execution_count": 23, - "id": "779140f3", - "metadata": {}, + "id": "092801c3", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3554,16 +3954,20 @@ }, { "cell_type": "markdown", - "id": "79051822", - "metadata": {}, + "id": "aaaf1ad3", + "metadata": { + "editable": true + }, "source": [ "Note that if n is equal to zero or one, Autograd will give an error message. This message appears when the output is independent on input." ] }, { "cell_type": "markdown", - "id": "3644a47e", - "metadata": {}, + "id": "f5c6d17b", + "metadata": { + "editable": true + }, "source": [ "## Unsupported functions\n", "Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd.\n", @@ -3574,8 +3978,11 @@ { "cell_type": "code", "execution_count": 24, - "id": "39e8bbff", - "metadata": {}, + "id": "1d32abfa", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3593,16 +4000,20 @@ }, { "cell_type": "markdown", - "id": "d42d292f", - "metadata": {}, + "id": "5f858e86", + "metadata": { + "editable": true + }, "source": [ "Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The item assignment is done when the program tries to assign x[2] to the value 3. However, Autograd has implemented the computation of the derivative such that this assignment is not possible." ] }, { "cell_type": "markdown", - "id": "65638c5a", - "metadata": {}, + "id": "1179e3dd", + "metadata": { + "editable": true + }, "source": [ "## The syntax a.dot(b) when finding the dot product" ] @@ -3610,8 +4021,11 @@ { "cell_type": "code", "execution_count": 25, - "id": "bec4592d", - "metadata": {}, + "id": "dba3ad31", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3629,8 +4043,10 @@ }, { "cell_type": "markdown", - "id": "0c4b4d89", - "metadata": {}, + "id": "2d71a680", + "metadata": { + "editable": true + }, "source": [ "Here we are told that the 'dot' function does not belong to Autograd's\n", "version of a Numpy array. To overcome this, an alternative syntax\n", @@ -3640,8 +4056,11 @@ { "cell_type": "code", "execution_count": 26, - "id": "520e4b18", - "metadata": {}, + "id": "6ac01a09", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3662,8 +4081,10 @@ }, { "cell_type": "markdown", - "id": "5d122ff1", - "metadata": {}, + "id": "5becf640", + "metadata": { + "editable": true + }, "source": [ "## Recommended to avoid\n", "The documentation recommends to avoid inplace operations such as" @@ -3672,8 +4093,11 @@ { "cell_type": "code", "execution_count": 27, - "id": "7f4d866e", - "metadata": {}, + "id": "6511ed46", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "a += b\n", @@ -3684,8 +4108,10 @@ }, { "cell_type": "markdown", - "id": "d66130d2", - "metadata": {}, + "id": "3f49669a", + "metadata": { + "editable": true + }, "source": [ "## Using Autograd with OLS\n", "\n", @@ -3697,8 +4123,11 @@ { "cell_type": "code", "execution_count": 28, - "id": "59144e98", - "metadata": {}, + "id": "7207a933", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "# Using Autograd to calculate gradients for OLS\n", @@ -3754,8 +4183,10 @@ }, { "cell_type": "markdown", - "id": "2b5ef0aa", - "metadata": {}, + "id": "eb71cd5b", + "metadata": { + "editable": true + }, "source": [ "## Including Stochastic Gradient Descent with Autograd\n", "In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using **autograd**." @@ -3764,8 +4195,11 @@ { "cell_type": "code", "execution_count": 29, - "id": "db6e0b30", - "metadata": {}, + "id": "f5fade01", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "# Using Autograd to calculate gradients using SGD\n", @@ -3845,8 +4279,10 @@ }, { "cell_type": "markdown", - "id": "e1b541fa", - "metadata": {}, + "id": "8a03d0c5", + "metadata": { + "editable": true + }, "source": [ "## And Logistic Regression" ] @@ -3854,8 +4290,11 @@ { "cell_type": "code", "execution_count": 30, - "id": "08d9299d", - "metadata": {}, + "id": "885dd6a7", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import autograd.numpy as np\n", @@ -3895,8 +4334,10 @@ }, { "cell_type": "markdown", - "id": "4860575d", - "metadata": {}, + "id": "3168e44a", + "metadata": { + "editable": true + }, "source": [ "## Introducing [JAX](https://jax.readthedocs.io/en/latest/)\n", "\n", @@ -3912,8 +4353,11 @@ { "cell_type": "code", "execution_count": 31, - "id": "fccac790", - "metadata": {}, + "id": "592c4321", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "import jax.numpy as jnp\n", @@ -3928,25 +4372,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.14" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/doc/src/week39/week39.do.txt b/doc/src/week39/week39.do.txt index cf9948925..e626e3cfc 100644 --- a/doc/src/week39/week39.do.txt +++ b/doc/src/week39/week39.do.txt @@ -6,6 +6,7 @@ DATE: today ===== Plan for week 39 ===== * Thursday: Repetition of Logistic regression equations and classification problems and discussion of Gradient methods. Examples on how to implement Logistic Regression and discussion of stochastic gradient descent + * "Video of lecture":"https://youtu.be/rDBj50Lv3Go" * Friday: Stochastic Gradient descent with examples and automatic differentiation * Reading recommendations: