{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;font-size:3em\"> An introduction to gradient descent algorithms </h1>        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;\"> Linear Regression </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Principle </h2>\n",
    "\n",
    "**Linear regression** algorithms are used for prediction purposes. An affine linear model makes a prediction by simply computing a weighted sum of the input features, plus a constant called the **bias term** (or **intercept term**)\n",
    "\n",
    "$$\n",
    "\\hat y = \\theta_0 +\\theta_1 x_1 +\\theta_2 x_2 +\\dots+ \\theta_n x_n\n",
    " = \\theta \\cdot {\\bf x}  = h_\\theta({\\bf x}).\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "where \n",
    "$$\n",
    "\\theta := (\\theta_0,\\dots,\\theta_n)^T, \\quad\\quad {\\bf x}:=(x_0,x_1,\\dots,x_n)^T,\\quad x_0=1.\n",
    "$$\n",
    " - $n$ is the number of features.\n",
    " - $x_i$ is the $i^{th}$ feature value.\n",
    " - $h_\\theta$ is the hypothesis function, using the model parameters $\\theta$.\n",
    " - $\\hat y$ is the predicted value.\n",
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Loss function </h2>\n",
    "\n",
    "The MSE loss function of a linear regression hypothesis $h_\\theta$ on a training set $\\{(x^{(1)},y^{(1)}),\\dots,(x^{(m)},y^{(m)})\\} \\subset \\mathbb R^n \\times \\mathbb R$ is calculated by\n",
    "\n",
    "$$\n",
    "J(\\theta) = MSE(X,h_\\theta) = \\frac 1{m} \\sum_{i=1}^m ( h_\\theta({\\bf x}^{(i)}) - y^{(i)} )^2\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Gradient computation </h2>\n",
    "For $j=0,\\dots,n$, the partial derivatives of $J$ with respect to $\\theta_j$ is \n",
    "\n",
    "$$\n",
    "\\frac{\\partial J}{\\partial \\theta_j}(\\theta)=\\frac 1m\\sum_{i=1}^m 2 x_j^{(i)} ( h_\\theta({\\bf x}^{(i)}) - y^{(i)} )\n",
    "$$\n",
    "\n",
    "If we introduce \n",
    "\n",
    "$$\n",
    "X := (x^{(i)}_j)_{\\substack{ 1 \\leq i \\leq m\\\\  0 \\leq j \\leq n}}\n",
    "\\in {\\mathbb R}^{m \\times (n+1)},\\quad\\quad \\quad \n",
    "Y :=(y^{(1)},\\dots,y^{(m)})^T \\in \\mathbb R^m\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "We can write $\\theta \\mapsto J(\\theta)$ and \n",
    "$\\theta \\mapsto \\nabla J(\\theta):=\n",
    "\\big(\\frac{\\partial J}{\\partial \\theta_0}(\\theta),\\dots\n",
    "\\frac{\\partial J}{\\partial \\theta_n}(\\theta) \\big)^T$\n",
    "using matrices and vectors \n",
    "\n",
    "$$\n",
    "J(\\theta)=\n",
    "\\frac 1m \\|X\\theta-Y\\|^2,\\quad \\quad \\quad \\quad \n",
    "\\nabla J(\\theta):=\n",
    "\\frac 1m\n",
    "2 X^T (X\\theta - Y) \n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Batch gradient descent </h2>\n",
    "\n",
    "\n",
    "The **Batch gradient descent** algorithm is given by \n",
    "\n",
    "$$\n",
    "\\theta^{(0)} \\mbox{ initial guess},\\quad \\quad\\quad \n",
    "\\theta^{(k+1)}= \\theta^{(k)} - \\eta \\nabla J(\\theta^{(k)})\n",
    "$$\n",
    "\n",
    "The whole **batch** $X$ of training data is used at every step."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "The loss function is quadratic in $\\theta$ (hence **convex**) and clearly ***L***-**smooth** with \n",
    "\n",
    "$$\n",
    "L=\\frac 2m\\|X^{T}X\\|_{2\\to2}= \\frac 2m s_1(X)^2\n",
    "$$ \n",
    "\n",
    "where $s_1(X)$ is the largest singular value of $X$. Batch gradient descent with Learning rate $\\eta<1/L$ converge to $\\theta^*$ which minimizes $J$.  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Observe also that $J$ is minimized at $\\theta^*$ for which $\\nabla J(\\theta^*)=0$. Hence,\n",
    "$\\theta^*$ is solution of the normal equation\n",
    "\n",
    "$$\n",
    "\\theta^* =  (X^T X)^{-1} X^TY \n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "theta_best= [[1.98331783]\n",
      " [4.97826472]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## Direct computation using normal equation\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "n,m = 1,200\n",
    "x = 2* np.random.rand(m, n)\n",
    "y = 2 + 5 * x + 0.5* np.random.randn(m, n) ## thus theta0= 2 , theta1=5\n",
    "plt.scatter(x, y)\n",
    "X_b = np.c_[np.ones((m, n)), x] # add x0 = 1 to each instance\n",
    "theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)\n",
    "plt.plot([0,2],[theta_best[0],theta_best[0]+2*theta_best[1]],color='r')\n",
    "print ('theta_best=',theta_best)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The local minimum occurs at [[1.99344927]\n",
      " [4.96976563]]\n",
      "The local minimum is equal to 0.035080866913785244\n"
     ]
    }
   ],
   "source": [
    "## gradient descent applied to the function J: theta -> J (theta) ##\n",
    "def val_f (theta):\n",
    "    return (1./m)*np.linalg.norm(X_b.dot(theta) - y) \n",
    "def grad_f (theta):\n",
    "    return (2./m)*X_b.T.dot(X_b.dot(theta) - y)\n",
    "x0 = np.zeros((2, 1))      # The algorithm starts at x0=(0,0)\n",
    "\n",
    "s1 = np.linalg.norm(X_b, ord=2) ## Largest singular value of X_b\n",
    "L = (2/m)*s1*s1            # L for L-smoothness\n",
    "rate = 1./L                # Learning rate\n",
    "precision = 0.001          # This tells us when to stop the algorithm\n",
    "step_size = 1              # step being taken\n",
    "max_iters = 4000           # maximum number of iterations\n",
    "iters = 0                  #iteration counter\n",
    "\n",
    "vec_x,vec_f  = [],[]\n",
    "cur_x = x0\n",
    "while step_size > precision and iters < max_iters:\n",
    "    vec_x = vec_x+[cur_x]\n",
    "    vec_f = vec_f+[val_f(cur_x)]\n",
    "    prev_x = cur_x                        #Store current x value in prev_x\n",
    "    cur_x = cur_x - rate * grad_f(prev_x) #Gradien descent\n",
    "    step_size = np.linalg.norm(cur_x - prev_x)   #Change in x\n",
    "    iters = iters+1 #iteration count\n",
    "print(\"The local minimum occurs at\", vec_x[-1])\n",
    "print(\"The local minimum is equal to\", vec_f[-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "code_folding": [],
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAg8AAAFfCAYAAADJQy/IAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3X+4XVV95/HPN0cuihDszNQnIKSlKLSDVJJCtaUNhKmtts8j+OOpra1grbaYJwESkotxmNZpo9FruDf8MOqUcUBrldZ2YKzFWmvQltqCJaikLXYoGtKAOloSLCRXb9b8sc727rvv/rH2r3P3Oef9ep7zHO45e++z9j3c7O9e67u+y5xzAgAACLVsqRsAAACGC8EDAAAoheABAACUQvAAAABKIXgAAAClEDwAAIBSCB4AAEApBA8AAKAUggcAAFAKwQMAACildPBgZmvM7GNmdsDMnJldkrPt+/rbXFWvmQAAoCuq9Dw8U9IXJK3P26gfVLxQ0oEKnwEAADrqaWV3cM7dKelOSTKz1G3M7DmSbpL0c5I+XqN9AACgY0oHD0XMbJmkD0p6l3Nub1aAEdv+WEnHJl7+D5K+1XTbAAAYAydIOuBaXDa78eBB0jWSvivphsDtt0r67RbaAQDAuDpF0r+2dfBGgwcz+zFJV0paXSLi2S5pOvbzCZL2P/LII1q+fHmTzQMAYKQdOnRIp556qiQ90ebnNN3z8NOSni1pX2y4oifpOjO7yjn3g8kdnHNHJB2Jfo72W758OcEDAAAd1HTw8EFJn0q89uf91/9Xw58FAACWQOngwcyOl/Tc2Eunmdk5kr7lnNsn6ZuJ7b8j6THn3IO1WgoAADqhSs/DuZJ2x36O8hVulfS6ug0CAADdVqXOw12S8udfLtz+B8t+BgAA6C7WtgAAAKUQPAAAgFIIHgAAQCkEDwAAoBSCBwAAUArBAwAAKIXgAQAAlELwAAAASiF4AAAApRA8AACAUggeAABAKQQPAACgFIIHAABQCsEDAAAoheABAACUQvAAAABKIXgAAAClEDwAAIBSCB4AAEApT1vqBgAAMK5mZ6Vdu6SHHpJOP11at06amFjqVhUjeAAAYAlMTkrT09Lc3PxrmzdLmzZJU1NL164QBA8AAAzY5KT0rnctfn1ubv71LgcQ5pxb6jYsYGbLJR08ePCgli9fvtTNAQCgUbOz0nHHLexxSOr1pCefLD+EcejQIZ144omSdKJz7lCdduYhYRIAgAHatSs/cJD8+7t2DaY9VRA8AAAwQA891Ox2S4HgAQCAATr99Ga3WwrkPAAAMEDkPAAAgFImJvx0zDybNnW73gNTNQEAGLBoGmayzkOvNxx1Hhi2AABgiTRdYXJQwxb0PAAAsEQmJqSrrlrqVpRH8AAAwIAM61oWSQQPAAAMwDCvZZFE8AAAQMuGfS2LJBImAQBoUZt1HZI6W+fBzNaY2cfM7ICZOTO7JPbeMWb2TjP7kpn9e3+bD5jZyc02GwCA4TCotSyifIpBqFIk6pmSviBpfcp7x0laLel3+8+vkHSGpP9TtYEAAOSZnZV27pQ2bPDPs7NL3aKFBrGWxeSk793YurX6McoonfPgnLtT0p2SZGbJ9w5KenH8NTPbIOkeM1vpnNtXvakAACw0DEmIba9lkZVP0aZBlKc+UZKT9PgAPgsAMCaii2ZySCBKQpycXJp2xc3OSt/5jpS4117EzG9XttdkdtYHT4PWavBgZk+X9A5Jf5CVuGFmx5rZ8ugh6YQ22wQAGH4hF83p6aUdwoiGEiYnpaK5Cc4t3D5USD5FG1oLHszsGEkf6X/GupxNt0o6GHvsb6tNAIDRMKgkxKqyekWKlO01qZMnUUcrwUM/cPhDSadJenHBdJHt8kMb0eOUNtoEABgdg0hCrKqJoYTQXpO9e+t9TlWNBw+xwOF5kn7GOffNvO2dc0ecc4eih6Qnmm4TAGC0tJWE2MTMjSaGEkJ6TWZnpbvuqvc5VVWp83C8mZ1jZuf0Xzqt//NKM3uapI9KOlfSr0jqmdmK/mMIq3cDALpo3TpfWClPr+e3CxXlHGzcKN10k38um4MgNdfbUXScXbuKcynaUqU89bmSdsd+jjpnbpX0Vkkv6/98f2K/tZLuqvB5AAAsMDHhp2PmTVHctCm/YmN8kaq9e6XduxdvU7Z89OystL+hzL2iXpOlyneQKE8NABhiaXUeer3iOg9p++UJKR9d9ph1P2/nTt87stAh+fTBdstTEzwAAIZa2WWuqxZVmpmRrrqqmWOed550773Z72/ZsjD4STtHKW3NDIIHggcAQKNCFqnK8qY3pScxljlmvFcktNcka7srrpDuvz853DKY4IEluQEAY6POTIhHH613zEsukW67bb5XZGpK2rYtv9ckbynvmZny59AUggcAwNiok2S4YkW9Y55yyuLhlImJ7KGQ2Vlpx47w9g0SwQMAYGxUXXxKks48s94x87ZLy2l4yUuWbipmEXIeAABjo2rOQ97sh5Bj5u2fltOwbJl09Gi5NnqDyXkYxKqaAAB0QlQfoqy8mhEhx8zaP2sNjGqBw+DQ8wAAGDtpd/vRstnxy2JIzYi8Y+btX2fmRzamahI8AABak1U7oUzNiJBjZu2fXuSpLoIHggcAwMjasMGvodEsch4AAFgSWatrNrHqZqTOzA9pfpglEhWOGgR6HgAAiMnKXVi9WrrvvvLraGT59relE04o3s4sPQ8jrcDU4cOHdOKJVJgEAGBg8io6pq1FUXbVzbibbw7b7p3vlI45Jj2PIllg6vDhcm2oiuABADA0yi6CVfbY09PV9p2e9j0BZdoSWply3z7pxhurtast5DwAAIbC5KSf2rhxo0803LjR/zw52czx66x7MTeXvmhWniYqUy4Veh4AAJ2XN5yQNmxQpYeizroXVfb/0IeKt+n15qeQdgk9DwCATgsZTpienp/5ULWHou4d/t694dtu2iR9/vPF211xRXPDMk0ieAAAdFrIcEI0bJBV7jnqocgLINat83f6Ve3eHTaEEk33DLFyZfX2tIngAQDQaaHDAV/+crkeiqSq616EHj+ya1f4apl1h1LaQvAAAOi00OGERx8N76HIMjUlbdmyuAei15NOPbW4DSGJk2UCgi4mS0oEDwCAjgsZTuj1pBUrwo5XdPGemvLLZ8/MSOvX++cnn5QuvriZ44cGBGbdTJaUCB4AYCw1WWa5baFLXp95Ztjx8i7e0e/l6qv9z9dd5wsxTUw0N7UyNLdi48ZuJktKlKcGgLFTdunorihqd8gS172e70VIuyi3ffzkZ6VNPY2cd550zz35x0hz6NBgylPT8wAAY6TObISlljWcEAU8oT0UWYFD0e+lzvHTziUtt8LM9zhUCRwGiZ4HABgTTd45t6WJ8tNXX+0Di7TFpNJ6Vsr+XprsuWm63Pageh4IHgBgTOzc6e9qi8zM+ItY3kWtjTUmmrgopx3DzOctZE3jLPN7iRaianONjToGFTxQnhoAxkToFMFbb5U2b154Ad68ef4innaBjr8vlb+4li0/nebqq9MDBOf8hf9pT0tfxjr09xLfbmJi8YqW44SeBwAYE6F32HnOOy99aerIli3+uUwPQhPDKZs2+QAhj5l/HD268Lhr1vjqkEXiPQ9dxbAFwQMANCrkIl2XWX71xC1bFgcQVYYN4opmLoQoavdS54KEYrYFAKBRTZRfLlJ0P5pWvrnKsEEkZNGsJoTOohgXBA8AMEbyyi+vWtX+56eVb65TfClk0awQzknPeY7vgYjr9dJ7S8YdwQMAjJmsegmXXjqYz0/2IISWn04r1dzkwlH/+q8+iDDzgVSyjgTmETwAwBiKZgvceON8+eW6S1KHSi4zHTKcsmaNn02RLKXdxsJRzkl79kgHDjBUkYWESQAYU9F0ygcflB57TDrpJOmf/ils5kEdZn5qZ/KOPqtGg5Rd8KnNJNBhSZKMY7YFwQMAtCbtQh1Ju2C3IS2XIF4fYu/e/EAm2r+J2RZZhmF6ZhzBA8EDALQi9GJ76qnSI4+01468O/sqJaN37MgPeM491w9HlOmlWL/eD+0Mi85O1TSzNWb2MTM7YGbOzC5JvG9m9tb++0+Z2V1mdlZzTQYAVFVmamObgYOUPvMiEjKLIr7/1JR0+LC0du3iGRORPXukK67wvQnnnx/WxjZyKkZBlYTJZ0r6gqT1Ge9PStrUf/88SY9J+gszO6FSCwEAjWlqaqOUfZEuI2u2ROgsio9+VNqwwSdSStKnP509zDA35wOHAwf8dlVneKBC8OCcu9M5d61z7k+S75mZSbpK0tucc3/inHtA0mWSjpP0mtqtBQDU0uTUxre9rf7sjKw7+9A7/rvvlm66yVeoPO44n0h5ww35+0Q9L00trz2Omp6qeZqkFZI+Gb3gnDsi6TOSfjJtBzM71syWRw9J9FAAQEua7IY/cKBexcq8O/sq00ajnoXQ4Y68glkUhsrXdPCwov/8tcTrX4u9l7RV0sHYY3/DbQIA9DVZy+H00/MvwOedl79/3p1926W0ox6YrIJZBA752ioSlcx3tZTXItslnRh7nNJSmwBg7DV1UY73GmRdgO+5p96dfVZg0oR4oaq0glnI97SGj/dY/3mFpEdjrz9bi3sjJH1vWONI9LM1kYEDAMgUXbSz6jz0etLq1flLbyd7DaILcNpnbds2X7vh9NN90BF6gU7uv2ePz3PA0mo6eHhYPoB4saQ9kmRmE5IukHRNw58FAAgQL7wUXbzjF+V4hckzzpi/uG/a5GcxZFV3DJUVWFTZf+fOZoKHffvqH2OclS4SZWbHS3pu/8c98tMyd0v6lnNun5ldI5/H8GuS/lnSWyRdKOlM59wTAcenSBQANCStkmRIAJBVKnrjRum669prb5GmylEPW+XIUIMqElWl5+Fc+WAhEpUbuVXS6yRNSXqGpF2Svk/S30n62ZDAAQCQLq33oKjrP6uS5Nzc/OtpAUTWfs75gKLXq5dQGHIuWdtEPSJ5FTLN8itNUr+hAc65Tj0kLZfkDh486AAAzm3Z4lyv55y/JPpHr+dfz3LkyOJ9ko9ez28XbT8z49yb3uScWfh+bZxL3W22bMlvf97vbdgdPHjQyU9QWO5avFY3nfMAAGhQ1d6DMuWdDxzITp7M269st3/IuUhh5xuSiFlluAZhWBgLADqq7OJQcRs2+MqLRVat8jMYyiq7YFTIuSzrFw84ejR7mzLLZFcZ6hl2Xc55AAAMQJneg2QvQGglyfvvr9a2spUqQ84lL2iIlOn1qDvLA9naKhIFAKgpdB2KtO1CKkkWJRZmqZJw2OSaGk0eC9UQPABAR4Xe3adtF1JJ8gUvKN8mqdqCUU2uqcEy2UuPnAcA6Kg6OQ+RvDoPJ5/s6zaEqpNwuBQ5D+OInAcAGAF1kvZCahpk9QJEn/vUU9L27f61ffsWtmF2Vtq8Of+Cbib95m9KZ55ZL+Ew5Fyuvto/VzlfDFib80CrPESdBwBDIKqLsH69f06re1ClPkOarONs2pTehjKfO+iaCE3VeUC6QdV5YNgCAEoKKfmcVdMgErKqZFyyB2PfPumGGxa3oWhBq+TnTk5KO3YsTpw0870SbdREqFNhEvkGNWxB8AAAJYQEBdu21c9VqNOGPPHPbTrAwdIjeCB4ANAxoQmM27f7C3ORKoszNbEw1MyMv5NvM8DB0hhU8MBUTQAIFFq06Y47wo5XpV5BSBuKfOAD5QpQAUnMtgCAQE0XJ6pSr6CJNtx/v/SiF5X/PPIQEKHnAQAChV7sL764uLqjJD3ySHttyOOc9Oij5T5vctIPc2zc6NfM2LjR/xwyPIPRQ/AAAIFCSj73etKVV0pXXFF8vOuv93fzIWZnpZ07pVtvDdu+yIoVYeeybt18YmVymCNa6ZIAYvwQPABAoJCSz1ERo5Uri48XmlMQv+uvupBV0plnhp2L5Kel5tmxQ/r2t5tpF4YDwQOAsRXdzW/Y4J9DegGmpvwUxuRde6+3cGpjaG7CRz+a/7lZd/11RD0KIecSkljpnLR8OT0Q44SpmgCGVp0EvpBCT3U+e+fO8HUjsj63iWmZaZL1G/LOZcMGn+NQ9dgYrEFN1VzyctTJhyhPDSBAnRLGgyjJfOTI4vYVPZKfOzNTbv+iR5USz2Xb0Oull+rGYAyqPDXDFgCGTp0EvtnZ4jH86enwRMYsExM+cbKMd73LF5iKPrvJqaFr1/qCT2V7BUKSROOoDTEeCB4ADJW6F//Q4kgXXRSeB5FmctLPpijrLW+Rnv50v38T0zIjn/1stf1CkkSTmq6Hge4heAAwVOpWRgy9sN19d7laBvHky4suqpfk6Jzff9++cnf9eer0CESJlWZh2zcZ9KCbCB4ADJXQi3/WdmUvbNFQyEUXZfdCJAso7d5d7jOy3HBD+aGPPHV6BKampEOHigOIaCYHRhvBA4ChEnrxz9qu7Bh+ZPfu+eGEuDamUkbm5qR/+Rc/bBB615+nbo/A8cf7ZbrzRHUuMNqYqglgqISubJm3GmSdJa2l+emIbU2lTOr1pMsvl9797nrHaGqFzLrTXNEeVtUEgBRlqjzGxXMSTj7Zb1M1nyBKyGxihcsQc3P1Agep2R6BqSkfiMzMSOvX++cqMzkwvFhVE8DQiS5SoXe/WXfKV1zhy0h/9KM+QTJUlHw4DLMK2uoRmJiQrrqq2WNieBA8ABgKySqI27b5R1GFyawhirk5f8e8ZYv06U+XH36IPrOL1q6VzjqLZbPRHnIeAHRe1TH2MvkR115bLg8i+txrrvFTK7uAvAMMKueBngcAnZbXcxC9nnWxLFMTIjrGjh3FwYCZ9OY3S0eP5m8n+bv/kOGNZcvCjpfm7LOl17+eXgYMDgmTADqrbjXJKjUhQqZEOld8oY9WpnzpS8PaUDVwkHzgcNVVPnCoslIoUBbBA4DOqltNskxNiKiHI+8ivmxZWHARzUaYmmo/LyJelClZrKpMhUygDIIHAJ1Vt5pkSEGoXk96wxuKezjMfIJmSH7DMcfMDx+0XW0xmoJZZ7EwoCyCBwCdVbeaZEhNiLPPll772uIeDuekj388rD3xYGZiws9+aFo0LBIVqxrESqFAhOABQGeF9hzk3d1HizplHef++6Xbb6/exjTJYOYTn2imvHQkPiwi1R/eAcpqPHgws6eZ2TYze9jMnjKzfzGz3zIzAhUApVStJpkUr4i4alX19lx8cbVgZmKieE2IUFu2+Ef8nOsO7wBltXFBv0bS5ZLWS/oRSZOStkja0MJnARhxWT0H8W77pLQZBxMT/qL+xS9Wa0ev51e4XL06f7vVq9ubLpl1vnWHd4CyGi8SZWZ/Kulrzrlfj732x5KedM69NmB/ikQBWCRZYTKrpkFeQamTT/YzEKrYssUnTFZZlKuJBbSiICpNE4uFYTQM88JYfy3pv5jZGZJkZi+Q9FOS/qyFzwIwJqK1FG68cb6mQVLRjINbby3/ufEejqq5BXUX0Ip6PbI0NbwDhGqjwuQ7JZ0o6Z/MbE5ST9J/dc59OG1jMztW0rGxl05ooU0ARlzIjIMvfCHsWJdcIp1yyuIejqq5BXVzDULzOiSWysZgtBE8vFrSr0p6jaS9ks6RtNPMDjjn0uL+rZJ+u4V2ABgjIXf3zvlZD3mjtb2edNtt6RfrqrkFofsl21b2wj81FbZYGFBXGzkPj0h6h3Pu3bHXrpX0q865H07ZPq3nYT85DwDK2LDBV1WsKyspUaqeWxC63+OPSzffzIUf1Q3zwljHSUoWeJ1TRn6Fc+6IpCPRz9bkZGgAY6PsTIIqd/lRbkHe6ptpQwyh+x1/vM/nALqujZ6HWyT9jKTflB+2WCXpf0h6v3PumoD9mW0BoLSyMxqWLZPe8Q5p377yd/lVlwivuh8QalA9D20EDydI+l1JL5f0bEkHJH1Y0u845wqLoxI8AKgqa/nuLDMz1e/0Q6eONrUfEGJog4e6CB4A1DE5Ke3YEbaA1fr1fuonMCqGuc4DACyZqSnpne8M25aKi0A19DwAWGAUutWpuIhxRc8DgIGbnPQX3Y0b/bTHjRv9z5OTS92ycqi4CLSrjamaAIZQVrJhVNpZqjcjYNA9GlRcBNrDsAUwRrIu4FW6+csEA01NUawSgIzCMAwQitkWBA9Ao5pYbTJa82HvXukzn5GOxsrBLVsmXX314vLI+/b5KZFZ8io6hrafXgTAI3ggeAAaU1T/YNUqac+eZj6raO2IpJDExaL2hwYgwKgjeCB4ABoRMiRR9oLftKhYU9oQg8TMCSDUMK9tAaBDQlebXEoPPZQ+LLF5s7RmTXH75+b8ebIuBDAYBA/AiHvooaVuQbG9e6Xduxe/PjeX/nqaYThPYFRQ5wEYcXv3LnUL8i1b5pMv66JaJDA4BA/ACJucDL9zXyoXXLBw1kYVvd58fgSA9jFsAYyo2VmfQ9BV0TTLp56qH+CEVIuk3gPQHIIHYESFJEoO2vnn+2mh8Yv3zp3Vjxda5yErGZMaEUA1BA/AiOpiAuGrXrV4RsS6df4iXmbGh5l04YXSJz5R3HvQdtltYByR8wCMgNlZfwe/YYN/np0dXAKhmfT2t/vnPFl5CRMT0gteUO4znfNDHddem79dyNDN9LTfDkA4ggdgyGWthPnII/6C3bbNm6WtW/1znry8hMsuq/bZRRf+kKGbqEYEgHAED8AQi7rkkxfIuTl/YV29ut3Pj+cMTE35MtHJgKXXKy4fvW5dtUCn6MIfOnTTxSEeoMsIHoAhFdIlf999vieiyoV57dr89zdulK67buFrU1O+TPTMjLR+vX9+8sninIKJCR+IVJF34Q8duqFGBFAOCZPAkArtkl+50l/Ao2mKK1dKb35zfm2FXs8nI157bfmVLCcmqpWJjo6X/LwieRf+dev8cErRuhjUiADKoecBGFJluuSjC/qNN0rf+EbxzIYoP6FqT0JV8c+7/PLqSZiRkB6NkBoRABai5wEYUlW65IuWtjbzd+rx4KBqT0JV8c874YT89oZc+LN6NEJrRABYjCW5gSEVstR2fKnqkO2XLfMVH7t0J55W4KnKhZ8KkxgHLMkNIFfUJR96Zx6SI3H0aPeWtp6akrZtq3/hH3QPCjDKCB6AIZbXJb9mje9F2LnTX2yHedoiF36gWxi2AEZAvEt+717prrsWJkWaSSedJB04UHysmRku1MCwGtSwBbMtgBEQ3Zk/4xm+bHPynsC5sMCBaYsAQhA8ACOiiSW4mbYIIAQ5D8CIqLMEN9MWAZRB8AAMmawph1USHc8/3y+TzbRFAGUQPABDJK3mwebNvtegyvoMq1aRHAmgPHIegCGRt4Lmu94l7dvnizyVwYJQAKpgqiYwBEKqQ5oVr1mR3P7wYYYrgFHCVE0A3xOSDFn2PuCccwgcAFRDzgOGTpNrFAzLegdtVH289NLmjwlgPDBsgaHS1CJJTR+rbTt3Shs3Nne8+IJZAEbHUA9bmNlzzOz3zeybZvakmd1vZj/WxmdhfBQlDE5OLs2xZmf9xX3DBv88Oxu+b+hx1q3zF/ymUAwKQB2N9zyY2fdJ2iNpt6T3SPq6pNMlfcU5V9j5Ss8D0pRdfnpQx2qq9yLkOFHAU5eZn97Ztd4VAPUNc8/DNZIecc79mnPuHufcV5xzfxkSOABZQhIG5+b8doM6VlO9F6HHmZqStmxZ3APR6/mAIJRz5XtXACCujeDhZZI+b2Z/ZGZfN7M9ZvbGrI3N7FgzWx49JJ3QQpsw5JpcTrqJY4WsIzE9XTyEUfY4U1O+R2RmRlq/3j8/+aTvSSgrpH0AkKaN4OGHJL1J0j9L+jlJ75V0g5ll5XZvlXQw9tjfQpsw5EKLGYVst3Jl/WM11XtR5TjRCpo33uifJyayeyXqtg8A0rQRPCyTdJ9z7i3OuT3OufdJ+j35gCLNdkknxh6ntNAmDLmQhMGQ5aQnJ6Vrrin+vKJjNdUTEnqcL3+5eJt4r8TZZ4cdt40poABGXxvBw6OS/iHx2j9KSr3fc84dcc4dih6SnmihTRhyExM+eTBP0QyCKLcgJEe46FhN9YSEHue9703PUUjO0JB8b8TrX99M+wAgTRuzLf5A0qnOuZ+OvTYj6YXOuZ8M2J/ZFshUdXZDyAyL0GOFHi9kxkZouyJbtiycfZH1u9i2rbkZJQCGxzDPtpiR9CIze4uZPdfMXiPpNyS9u4XPwpjJShgsutiH5BZI0vbtYVMYm+gJCT1OXJTkWDRD49prm2kfAKRpvDy1c+5eM3u5fC7Db0l6WNJVzrkPNf1ZGE9RwmAZoWP7+/aFHzMKMurWeYi227GjeEhlbk66/vqwGRpPPtlM+wAgqZW1LZxzfyrpT9s4NlBFk7M14qam/BBB3fUxpqakJ57wuQ1F7rgjfIZGU+0DgDgWxsJYWLfO10IoygEomq2RpkpPSJozz6x/jLiot6Wp9gFAhCW5MXSqrCXRVI5Cm0Kno158cdjxmEkBoC0EDxgqk5N+FsHGjdJNN/nn444LK7WcV945PothqYQGOFde2UzNCwCoiuABQ6OJtSSqztYYlJAAZxh6UQCMtsbrPNRFnQekaXIlzOh4XU4iDGlfUyt6Ahgdg6rzQPCAzpudlV79aun224u3nZkpTg4cpYtu14MgAIM1qOCB2RbotLQLfZ6ieg7R0EdSNPQhDVcAwUwKAEuB4AGdlXWhz5M2wyC6O3/wQel978vff3ra10XIunvnTh8AGLZAR5Vd80FKz3ko23MhZQ99ZA13XHGFX+Y7L6Ag6AAwCAxbYKyFrkURl5xhUKXnQkof+sgb7piZWfja5s0L8yfSgo7kNgAwTAge0Emha1FIkpl04YV+uCEyO1u8/kOW5NBH2WPF8yeksBwLeiYADBOCB3RSmeqIzkm7d/thjuhuvkrPhZReXKnqsaanpaNHi7eJFruiZwLAsCB4QCeFrEWRFL+bf+qpap+bVlypTC9Isj0h26T1agzr7A8A44EKk+ikkCqKWaanfQJjWWbpry/lGhHT02FrdwDAINHzgM6K7rjLzpaItu31yu3nnL/b/+53F86eeMMbyveCNCVaWptaDgC6hKmaWDKhSYLf/rZ0zjnlhg/Wr5ee8Yxqsy2Sej1p9Wrp3nvPFIuKAAAWbElEQVTL73f0qA9K6li/XrrxxnrHADAeBjVVk2ELLInQ1TEnJ6UTTyyfd3D66dmLTJU1N+cDh/POK3esTZt8j0VdLK0NoGvoecDAFdVfiFaPrFqnIVksKt7DsWePdPfd1drd60mPPy7dfPN8b8kjjyyeKZFcJyOvuNQNNzS32BcAsDAWwcNICl0d8/HHpWc9q1qeQRR8pNm50/dyVJVWfTJk+CVrm9BACgBCEDwQPHRKU0WMQi/ez3++9MAD5Y5t5ocJtm3zvQF33OFfv/hi6corfXurlL2OayP/YJRW+QSwtMh5QGeE5ieECM1dqBI4HOr/mTz96b5td9/tH5OT86/VmQIqtZN/MDXlhyZmZnxwMjPjfyZwANBVTNVErqaXsG4r+W/zZul3fid7CCCahilVnwKaVn2yKSytDWCYMGyBTKH5CXkJfcnhjje8oXouQ5aNG6V3vMNPzSwqB71sma8+GQ1hxNv2yCP5a1iQfwCg61hVE0suZE2HvCJGWatJVqmZkGflSt+GosBB8ttE7U272+/1yD8AgCIED8gUmp9QdgnrqGbCffc10wPx/vdLZTqp8s5rasonXLLCJQBkI3hAptD8hOQ6EiFLWN93n5+O+drXSrffXq19kS99qdz2RedF/gEA5GO2BTKtWxdWUfHNb1448yJ0uOPmm6XbbqtfAbKMZcvaS3oEgHFB8IBModMajx71QxRRAFFmuKPu1Mmyrr6aIQgAqIvgAbmi9SGylquOi5aPDh3uiLbLWoOi1/OvN7E+heRnZZD0CAD1MVUTQeI9C3lmZvywQJUpnnlVLKP33v/+sByHk0+WDhxY/JnMmgAwypiqidpCLsahMwo+/OGwz4wPReSt2bBp0+LPy0tUjL8XUt46GThI1QtbAQAWoudhiJS54OetlyCVq2VQZnXL+MJRbazZUHdtiqgNrFQJYBSxMBbBwwJ5yzqvXLkwoLj22mpLWUuLqyiWuVibSYcPhw9FVFV1qe64tNUxAWDYETwQPHxPmYvlsmV+HYeqX2vyrrzsEtbnnCNddln7hZWygqmzz5buv794/zZWxwSApcaqmkNudtZfeDds8M+zs9WPU1RwKe7o0eqBgzRfbjoSOu0ycv/99VbdDJW1EuVll4Xt39YCXQAwDlpPmDSzrZLeLul659xYdBRnrelQZaw/pOBS0+IBQ9WL7CCSE9MSLNet87/ropkeFIoCgOpa7Xkws/Mk/YakL7b5OV0SDTEkL17RxbTs3XjZO/8mxAOGdevCajxkiWo/DEpI0am0mR4AgHCtBQ9mdrykD0l6o6R/a+tzuiRkiKHsxXTQ3evJu/KJCZ/HUFVyGGQQiopOMU0TAOpps+fh3ZI+7pz7VIufUVpTuQhpyixhHeoNb6h3519W2l35pZfWO+ZS9J5k5UQQOABAfa3kPJjZL0laLem8gG2PlXRs7KUT2miT1GwuQpo6S1inidrb5ISYtWulc88tV38hJI8gT3LVTamdKZxJrI4JAO1ovOfBzE6VdL2kX3XOHQ7YZaukg7HH/qbbJDWfi5Cm7JoOebLaW9dZZ5W/K2968arJST8bY+NG6aabBjM7AwDQnMbrPJjZJZL+t6T4Za8nyUk6KulY59xcbPu0nof9TdZ5CCl01ETVwaY+J+Q4ZtKVV/paBWUCjDrFkdJ6bkLEayoU1awgJwEAqhvmOg9/KelsSefEHp+XT548Jx44SJJz7ohz7lD0kPRE0w1qIxchTVOZ/iHtdU76gR+Y70F405uK22dWb4pissfikkvC9ot6WtpIKAUADF7jOQ/OuSckPRB/zcz+XdI3nXMPpO/VrqZzEfJEd8111nR48MGwz3rwwflx/dlZ6b3vbTY/Ik08jyC0pyUKWMoEceQqAEB3jUWFySZzEULUzfR/7LHy2+3aVRw4ONfstMmyPS2DDOIAAO0ZyJLczrkLB/E5WQZVdbCpGQQnnVR+u7IX5qbaWqanZdBBHACgHWPR8zCIqoNNziA444zy24VecPfvl1avlp7+9OZmO4T2tKxbt7hwUxKlowGg+8ZqVc2slRjr1nloegZBlVkbZZbOztP2bAdmWwBAe1iSu6UluZsuTtTWNNAqF9kyS3dnaWLKapG2gjgAGHcEDy0FD03budN3+xepUl9hclK67jq/zHYkushu25YeBFWtxRB3ySXSKae0V/lRGkyFSQAYN4MKHgaSMDnKqs4gCL14JmO7o0elu+5a3NsRL7MdDyz275duv73UKS3Yvsny3XGUjgaA4UXwUFNoouLevfP/HbLGRtYQhHPSvfcufj0qsy35Y0QX5g0bwtqXJXlcAAAYtqipTKLili3+uSiXYdu26smPyZyF0GGVsscFAHTPMJenHitlFo3ascM/8kxPS9dfXz1nIVlmO2R6ZJXjAgDGF8FDA6am/FLXRZwrrgI5NyfdcUe99sTzK5pcEZPKjwAAiZyHxjz++FK3YF4yDyOrCmTd4wIAxhM9Dw2YnJT27GnueBdfXG+oIa1CY1QFsmrSI5UfAQARgoeaQpaZLqPXk668svpQw9q12UmNExPSMcdUO27d8t0AgNFB8FDR7KyfyXDRRfVLQsdFF+mpKT/zokwPhJn0iU/kb1M2b6HXo2Q0AGAhgocK4otg3X13uX2jCpHJoCDtIh0fajArPvbGjcW9A6F5C+ef7z93+3bpqad8oDQ7G7YvAGC0kTBZUt31I6JCUNu3h1WYjIYaQspxnHpq8Tahy5O/8IXS1q35hawAAONppIKHttdLqJPfsGyZdPXV8xfeMuWZq5bAThNN3cwLgFavTj9Pqk0CAKQRCh5CSj5XEQ9I9u+vlt+wdq3PRagayIQONYRulzV1s9eTrrhCuuGG/P2np30VTBIoAWA8jUR56irLV4ced8eOsCGDNE0tM93Wst9pPTW7drW3SigAoF2sqhlodtYvW52nyp1yndyG88+XXvWq5oZNQoYaqkylTBs6aXKIBAAwmoY+eHjJS/wy1XmidRlC75RnZ4vXoMjS60mf/nTzXfp5Qw1NJjE2PUQCABg9QzFVM6qpsGHDwimDk5PS7t1hxyhzp3z99dWHKtosphRN3ZyZkdav9891qkamCVlIi2qTADDeOt/zkJUIeeWV/iIfKuROOcoBqDKjoukegCxlZmlUPX4bQyQAgNHR6eAhK+9gbq7cBd5M+s53fHCQddFLC1KKnHaa9Au/0M600KU0qCESAMBw6uxsi29846BWrFjeaOnnrItf1eTIqIT0qGq7bgYAoFmDmm3R2eBh+/aD2ro1bKpmWfGpmyHTINOYSYcPczEFAHTHoIKHziZMfvjD7R17eno+6XLXrmqFnzZvJnAAAIynzgYPX/xie8eOpm5KrDIJAEBZnQ0eQvR60po11faNgoYyq0y2MTUSAIBh09mcB+mgpPychy1b/HLRN91U/nPWrvXFnNoq/QwAwKCNfc5DkXPO8T0AVSsdfvaz81M3N23K35a6BgAAzBva4OGyy/xzSEXENPG8h2jKZfI45DcAALDYUA5bJIcRqtZpuPxy6T3vmf+ZugYAgGHGqpo5ksMIWRURizz22MKf2y79DADAKBiq4MHM11dIG0bYtk36/u+X7rhD2rPH90wUOemk5tuYRG8GAGDUDFXwsGZNeuBQZV0KSTrjjLDtqgYAWYt6sT4EAGCYDVXOQ9qUyar5DqHTL9MCgJAFooraRSImAKBpQztV08y2mtm9ZvaEmX3dzG43szObOHZ8hoTkewSqLJ8thU2/jAKAZI/G3Jx/fXIyfb+QdsVLZAMAMEzamKp5gaR3S3qRpBfLD4180sye2cTB4+Wkq65LsWpV8V1/nQAgpF3JQAgAgGHRePDgnHuJc+4W59xe59wXJP2apJWSfqyJ4+/dO//fZdeliFx6afE2dQKA0HZVbT8AAEtpEAmTJ/afv5X2ppkdK+nY2Esn5B0sXhmySnXJXs8nPBapEwCEtqtqdUwAAJZSqxUmzcwkTUv6a+fcAxmbbZXPjowe+/OOGb/br1JdMrTUdJ0AIKRdoUEMAABd03Z56psk/aikX87ZZrt870T0OKXooNHdfsi6FJGypabrBACslwEAGGWtDVuY2Y2SXiZpjXMuszfBOXdE0pHYfoXHjt/tZ1WXXLZMuuAC6ayzqhVnigKAvOmWeQFAVrtCpnkCANBljdd56A9V3Cjp5ZIudM79c8n9c9e2yKrP0FYlx6p1HtpuFwAASYOq89BG8LBL0mskXSzpwdhbB51zTwXsnxs8LEVxJQIAAMAwGObgIeuAv+acuyVg/8zg4bzzpHvuqd1EAABG0tCuqumcK05aqOi+++aLMtETAADA0hiqtS0kae1aX+uBJEQAABYa2p6Htu3evfi1aK0JiQACAIC2DV3PQ57QlTIBABhFQ7uq5lJisSkAANo3UsGDxGJTAAC0bSiCh17PJ0qGYLEpAADa1dngYft2af16aWZGevxx6aUvlYoqV7PYFAAA7evsbIt166Tly3156Gc9a+HUzCwsNgUAQPs6GzxIPnDIW5gqQp0HAAAGp7PBw+ysX5CqyNSUdOWV9DgAADAonc15uPnmsKGKY44hcAAAYJA6Gzw8/HDYdkzNBABgsDobPJx2Wth2TM0EAGCwOlue+hvfOKgVK5bnDl1QjhoAgHljX556YsLPoMjD1EwAAAavs7MtDh06pGuvlY4ckW66STp6dP69Zct8Aalrr5UOtRZXAQAwXA4N6KLYxWGLH5QUmC4JAABSnOac+0pbB+9iz8O3+s+nSHpiKRvSshMk7dfon6c0PufKeY4WznO0jNt5fqtowzq6GDxEnmgz2WOp2fxCHSN9ntL4nCvnOVo4z9EyhufZqs4mTAIAgG4ieAAAAKV0MXg4Ium/959H2bicpzQ+58p5jhbOc7Rwng3q3GwLAADQbV3seQAAAB1G8AAAAEoheAAAAKUQPAAAgFIGEjyY2Toze9jMDpvZ35vZTxds/0oz+wczO9J/fnnifTOzt5rZATN7yszuMrOz2j2LYmXO08zeaGZ/ZWb/1n98ysx+PLHNLWbmEo+/bf9M8pU8z9elnIMzs6dXPeaglDzPuzLO8+OxbTr3fZrZGjP7WP9vyZnZJQH7XND/fRw2s38xs8tTtunU91n2PM3sFWb2F2b2DTM7ZGafM7OfS2zz1pTv87F2zyRfhfO8MOP/2x9ObJf7b/KgVTjPtL89Z2Z7Y9t08fvcamb3mtkTZvZ1M7vdzM4M2K/1a2jrwYOZvVrSTklvk7RK0l9JutPMVmZs/xOSbpP0QUkv6D//oZm9MLbZpKRNktZLOk/SY5L+wsxOaOs8ipQ9T0kXSvqwpLWSfkLSPkmfNLPnJLb7hKSTYo+fb7zxJVQ4T0k6pIXncJJz7nDNY7aqQpteoYXn+HxJc5L+KLFdp75PSc+U9AX5v6VCZnaapD+T/32skvR2STeY2Stj23Tu+1TJ85S0RtJfyH8/PyZpt6SPmdmqxHZ7tfD7PLuR1lZX9jwjZ2rhefxz9Ebgv8mDVvY8r9TC8ztVvnxz8u+za9/nBZLeLelFkl4sXxX6k2b2zKwdBnYNdc61+pD0d5Lek3jtHyVtz9j+Nkl3Jl77hKQP9//bJD0q6ZrY+8dKelzSb7Z9Pk2dZ8r+PfmL7KWx126RdPtSnVND3+frJD3e5u+uC+eZsv9V/e/zmV3+PhNtdpIuKdjmnZL+MfHaeyV9rsvfZ9nzzNhvr6Tfiv38Vkn3L/X51Pw+L+xv96ycbXL/TV7qR5XvU9Ilko5K+oFh+T77bfz+/vmuqfp9NXUNbbXnwcwm5KP2Tybe+qSkn8zY7SdStv/z2PanSVoR38Y5d0TSZ3KO2aqK55l0nKRjtHgxkwv73VVfNrPfM7Nn12ttdTXO83gz+6qZ7TezP43fvTX0u2tUQ236dUkfcc79e+L1znyfFWX9fZ5rZsd08ftsgpktk19wKPn3+bx+1+/DZvYRM/uhJWheE/aY2aNm9pdmtjbxXtG/ycPo1yV9yjn31cTrXf8+T+w/5y16NZBraNvDFv9J/o76a4nXvybf+DQrCrZfEXst9Jhtq3KeSe+Q9K+SPhV77U5JvyLpIklXy3cvfdrMjq3V2uqqnOc/yfc+vEzSL0s6LOluM3tejWO2rVabzOeuPF/SzYm3uvZ9VpH19/k0+d9bF7/PJlwt31X+h7HX/k7SpZJ+TtIb5c/vb8zsPw6+eZU9Kuk3JL1SfujtQUl/aWZrYtsU/Zs8VMzsJEkv1eK/z05/n2ZmkqYl/bVz7oGcTQdyDR3UqprJMpaW8lrZ7csecxAqtcnMJuUvrBe6WC6Ac+622GYPmNnnJX1V0i9I+pP6za0s+Dydc38r6XtJgWZ2t6T7JG2QdEWVYw5Q1Tb9uqQHnHP3LDhYd7/PstJ+L9HrlrPNUn+flZjZL8t3aV/snPt69Lpz7s7YZl8ys89JekjSZfL/yHeec+5B+YAh8jkzO1XSZkmfjW+a2HVov0/1h1Il3R5/cQi+z5sk/aiknwrYtvVraNs9D/9PPmksGc08W4ujnshjBdtH2a9ljtm2KucpSTKzzZLeIulnnXNfzNvWOfeo/MXmeXnbtajyeUacc0cl3av5c6h9zBbU+T6Pk/RLWnxXs0gHvs8qsv4+vyvpm+rm91lZP/nzf0r6Refcp/K27Q9RfUnD9X2m+VstPIeif5OHRv/u/fWSPuicm83btkvfp5ndKN97u9Y5t79g84FcQ1sNHvpfzt/LZ4nGvVjS32Ts9rmU7X82tv3D8if/vW3646wX5ByzVRXPU2a2RdJ/k/QS59zniz6n3312qnxX48BVPc+4/h/vOeqfQxPHbFrNNv2ifPLR7xd9zlJ/nxVl/X1+3jn3nS5+n1X1exxukfQa59zHCzZXf/jpRzRc32eaVVp4DkX/Jg+TCyQ9Vz4gzNWF77M/pfIm+SGli5xzDwfsNphr6ACyQ18taVY+2vsRSTOSvq1+lqukDyiWhS2fsPFdSddI+uH+83ckvTC2zTXy3U4vlx9b/gNJBySdsIRZsGXPc1J+1bNXykeA0eP4/vvHS9ohn/zyg/JZ0X8jaf+Qnedvy48h/pB80PD+/vf546HHHIbzjO33V/KJksnXu/p9Ht//Xs6R77Lc2P/vlf33t0v6QGz70yT9u3w37o/0fz+zkl7Z8e+z7Hn+cv//03WJv88TY9vskP8H9zRJL5T0MfkZNsN0nlfJzzx4nqSz+u87Sa+IbVP4b3LXzzO23wcl/W3GMbv4fe6Sv9ZdkPj/8BmxbZbkGjqoX8A6SV+Rv1j+vWLTTCTdJemWxPavkk+0m5Wf4vWKxPsmPwb5qHwC3mckPX+pvuAq59nfzqU83tp//xnyGbJf7/8evip/F3TqkJ3nTL/tR/rn8ueSfqLMMYfhPPuvndH/Dl+ccqxOfp+an6qXfNzSf/8WSXcl9rlAPm/liPxdzOVd/z7Lnmf/+83cvr/NR+T/wZ2VT3b+Y0n/ecjOc1LS/5X0lHwG/19J+vmU4+b+m9z18+y/dqKkJyW9MeOYXfw+087RSXpd4v/VWxL7tX4NZUluAABQCmtbAACAUggeAABAKQQPAACgFIIHAABQCsEDAAAoheABAACUQvAAAABKIXgAAAClEDwAAIBSCB4AAEApBA8AAKAUggcAAFDK/we06bK88C3TEAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## Animation based on gradient descent applied for linear regression ##\n",
    "\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "from matplotlib.pyplot import figure\n",
    "from matplotlib import animation, rc\n",
    "\n",
    "#%matplotlib inline\n",
    "#matplotlib notebook\n",
    "#%matplotlib nbagg\n",
    "%matplotlib tk\n",
    "\n",
    "# First set up the figure, the axis, and the plot element we want to animate\n",
    "\n",
    "fig = plt.figure()\n",
    "fig.set_dpi(100)\n",
    "\n",
    "xmin,xmax = 0, 2\n",
    "fmin,fmax = 1,14\n",
    "\n",
    "ax  = plt.axes(xlim=(xmin, xmax), ylim=(fmin, fmax))\n",
    "line, = ax.plot([], [], lw=2,color='r')\n",
    "\n",
    "# initialization function: plot the background of each frame\n",
    "def init():\n",
    "    plt.scatter(x, y,color='b')\n",
    "    line.set_data([], [])\n",
    "    return line,\n",
    "\n",
    "# animation function.  This is called sequentially\n",
    "def animate(i):\n",
    "    a = [0,2]\n",
    "    theta= vec_x[i] \n",
    "    b = [theta[0],theta[0]+2*theta[1]]\n",
    "    line.set_data(a, b)\n",
    "    return line,\n",
    "\n",
    "# call the animator.  blit=True means only re-draw the parts that have changed.\n",
    "anim = animation.FuncAnimation(fig, \n",
    "                               animate, \n",
    "                               init_func=init,\n",
    "                               frames=50, \n",
    "                               interval=50, \n",
    "                               blit=True)\n",
    "\n",
    "# save the animation as an mp4.  This requires ffmpeg or mencoder to be\n",
    "# installed.  The extra_args ensure that the x264 codec is used, so that\n",
    "# the video can be embedded in html5.  You may need to adjust this for\n",
    "# your system: for more information, see\n",
    "# http://matplotlib.sourceforge.net/api/animation_api.html\n",
    "\n",
    "#HTML(anim.to_html5_video())\n",
    "\n",
    "from IPython.display import HTML\n",
    "anim.save('GD_converge.mp4', fps=5, extra_args=['-vcodec', 'h264', '-pix_fmt', 'yuv420p'])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Variants:  interpretability, etc\n",
    "- Lasso regression\n",
    "$$\n",
    "J(\\theta) = \\frac 1m \\|X\\theta-Y\\|^2 + \\lambda \\|\\theta\\|_1\n",
    "$$\n",
    "- Ridge regression\n",
    "$$\n",
    "J(\\theta) = \\frac 1m \\|X\\theta-Y\\|^2 + \\|\\Gamma \\theta\\|^2\n",
    "$$\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "# Pros and cons\n",
    "\n",
    "- **Batch Gradient Descent** scales well with the number of features\n",
    "However,\n",
    "- **Batch Gradient Descent** can be terribly slow on very large training sets \n",
    "($\\Longrightarrow$ **Gradient Descent algorithms**). \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "- it is much faster to use  Gradient Descent than to use the Normal Equation for training a Linear Regression model for hundreds of thousands of features "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;\"> Stochastic Gradient Descent </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "We are interested in minimizing the **additive** loss function  \n",
    "\n",
    "$$\n",
    "J(\\theta) = \\sum_{i=1}^m J_i(\\theta),\\quad\\quad\\quad J_i(\\theta):= ( h_\\theta({\\bf x}^{(i)}) - y^{(i)} )^2\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "One random instance $\\{(x^{(\\omega)},y^{(\\omega)})\\}$ in the training set is picked at every step $k$ and the gradient is computed based only on this instance. This gradient is $\\nabla J_\\omega(\\theta) = \\nabla_\\theta J_\\omega(\\theta)$ and is equal to\n",
    "\n",
    "$$\n",
    "\\nabla J_\\omega(\\theta):=\n",
    "2 (h_\\theta({\\bf x}^{(\\omega)}) - y^{(\\omega)}) {\\bf x}^{(\\omega)}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "The **Stochastic Gradient Descent** (SGD) algorithm for MSE minimization in linear regression is given by \n",
    "\n",
    "$$\n",
    "\\theta^{(0)} \\mbox{ initial guess},\\quad \\quad\\quad  \n",
    "\\left\\{\\begin{array}{}\n",
    "{\\omega} \\mbox{ randomly selected in} \\{1,2,\\dots,n\\} \\\\\n",
    "\\theta^{(k+1)}= \\theta^{(k)} - \\eta \\nabla J_{\\omega}(\\theta^{(k)})\n",
    "\\end{array}\n",
    "\\right.\n",
    "\\quad\\quad\\quad k\\geq0.\n",
    "$$\n",
    "\n",
    "Only one random instance $\\{(x^{(\\omega)},y^{(\\omega)})\\}$ of training data $X$ is used at every step."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "- Every step $k$ of the algorithm is much faster. \n",
    "- This makes it possible to train on large training sets.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.97779774]\n",
      " [4.97149486]]\n"
     ]
    }
   ],
   "source": [
    "n_epochs = 50\n",
    "t0, t1 = 5, 50 # learning schedule hyperparameters\n",
    "def learning_schedule(t): \n",
    "    return t0/(t+t1)\n",
    "    \n",
    "theta = np.random.randn(2,1) # random initialization\n",
    "for epoch in range(n_epochs): \n",
    "    for i in range(m):\n",
    "        random_index = np.random.randint(m)\n",
    "        xi = X_b[random_index:random_index+1]\n",
    "        yi = y[random_index:random_index+1]\n",
    "        gradients = 2 * xi.T.dot(xi.dot(theta) - yi)\n",
    "        eta = learning_schedule(epoch * m + i)\n",
    "        theta = theta - eta * gradients\n",
    "        \n",
    "print(theta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/stochastic_gradient.py:152: DeprecationWarning: n_iter parameter is deprecated in 0.19 and will be removed in 0.21. Use max_iter and tol instead.\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(array([1.97771021]), array([4.960105]))"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDRegressor\n",
    "sgd_reg = SGDRegressor(n_iter=50, penalty=None, eta0=0.1) \n",
    "sgd_reg.fit(x, y.ravel())\n",
    "sgd_reg.intercept_, sgd_reg.coef_ "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Variant\n",
    "\n",
    "- Mini-batch SGD\n",
    "- Momentum \n",
    "- Nesterov accelerated gradient\n",
    "- Adagrad / Adadelta / RMSprop / Adam / AdaMax / Nadam"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <iframe\n",
       "            width=\"700\"\n",
       "            height=\"600\"\n",
       "            src=\"https://arxiv.org/pdf/1609.04747.pdf\"\n",
       "            frameborder=\"0\"\n",
       "            allowfullscreen\n",
       "        ></iframe>\n",
       "        "
      ],
      "text/plain": [
       "<IPython.lib.display.IFrame at 0x11fdd5160>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import IFrame\n",
    "IFrame(src='https://arxiv.org/pdf/1609.04747.pdf', width=700, height=600)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;\"> Logistic Regression </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Principle </h2>\n",
    "\n",
    "**Logistic Regression** (also called **Logit Regression**) algorithms are used for **binary classification**.\n",
    "The model estimates the probability that an instance belongs to one of two classes (**{0,1}** or **{Y,N}** or **{+,-}** etc) and predicts for the instance the class with the highest probability.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "In logistic regression, the model estimate a parameter \n",
    "$\\theta= (\\theta_0,\\theta_1,\\dots,\\theta_n)^T\\in {\\mathbb R}^{n+1}$, and predicts \n",
    "a class in **{0,1}** according to\n",
    "\n",
    "$$\n",
    "\\hat y = \n",
    "\\left\\{\n",
    "\\begin{array}{cc}\n",
    "0 \\quad \\mbox{if}\\quad \\sigma(\\theta.{\\bf x})<0.5 \\\\\n",
    "1 \\quad \\mbox{if}\\quad \\sigma(\\theta.{\\bf x})\\geq 0.5\n",
    "\\end{array}\n",
    "\\right.\n",
    "$$\n",
    "where $\\sigma$ is the sigmoid function. \n",
    "\n",
    "<p style=\"text-align: center;font-weight:bold;\"> \n",
    "The number $\\hat p:=\\sigma(\\theta.{\\bf x})\\in ]0,1[$ is an estimated\n",
    "probability that $x$ belongs to class $1$. \n",
    "</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Logistic function </h2>  \n",
    "<br/>\n",
    "<img src=\"sigmoid_function.svg\" style='margin:auto' width= 60%  />\n",
    "\n",
    "<!--\n",
    "<div>\n",
    "    <div style=\"float: left; width: 25%;\">\n",
    "    <div style=\"text-align:center;margin-top:50%;\">\n",
    "$$\\sigma(t) = \\frac {1}{1+e^{-t}} \\in ]0,1[,\\quad t\\in{\\mathbb R}$$\n",
    "    </div>\n",
    "    </div>\n",
    "    <div style=\"  float: left;width: 75%;\">\n",
    "<img src=\"sigmoid_function.svg\" width= 80%  />\n",
    "    </div>\n",
    "</div>\n",
    "-->\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Observe:  \n",
    "<div style='text-align:center;'>\n",
    "&#9679;   $\\sigma(\\theta\\cdot{\\bf x})\\geq0.5$ if and only if $\\theta \\cdot {\\bf x}\\geq 0$. <br/>\n",
    "&#9679;   $\\sigma(\\theta\\cdot{\\bf x})\\lt0.5$ if and only if $\\theta \\cdot {\\bf x} \\lt 0$. \n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Observe:  \n",
    "$$\n",
    "\\sigma'(t) = \\sigma(t) (1- \\sigma(t))\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Loss function </h2>\n",
    "We introduce \n",
    "\n",
    "$$\n",
    "\\hat p=h_\\theta(x)=\\sigma(\\theta. {\\bf x})=\\sigma(\\theta_0+\\theta_1 x_1+\\dots+\\theta_n x_n)\n",
    "$$\n",
    "\n",
    "then \n",
    "\n",
    "$$\n",
    "c(\\theta)=\\left\\{\\begin{array}{l}- \\log(\\hat p)\\quad &\\quad y=1\\\\- \\log(1- \\hat p)\\quad &\\quad y=0\\\\\n",
    "\\end{array}\n",
    "\\right.\n",
    "\\quad\\quad\n",
    "\\equiv \n",
    "\\quad\\quad\n",
    "c(\\theta)\n",
    "=-\\bigg[\\log(\\hat p) y+ \\log(1- \\hat p) (1-y)\\bigg]\n",
    "$$\n",
    "\n",
    "This cost function is intuitive \n",
    "- $-\\log(p)=\\log(1/p)$ grows very large when $p$ approaches $0$. The cost (penality) is large if the model estimates a probability close to $0$ for instance in class $1$.\n",
    "\n",
    "\n",
    "- $-\\log(1-p)=\\log(1/(1-p))$ is close to $0$ when $p$ approaches $0$. The cost (penality) is small if the model estimates a probability close to $0$ for instance in class $0$.\n",
    "\n",
    "\n",
    "- Same observation if $p$ approaches $1$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Given a training set $\\{(x^{(1)},y^{(1)}),\\dots,(x^{(m)},y^{(m)})\\} \\subset \\mathbb R^n \\times \\mathbb \\{0,1\\}$. \n",
    "The **loss function** is given by \n",
    "\n",
    "$$\n",
    "J(\\theta) = \\frac 1{m} \\sum_{i=1}^m c^{(i)}(\\theta),\\quad\\quad\\quad c^{(i)}(\\theta)=-\\bigg[\\log(\\hat p^{(i)}) y^{(i)} + \\log(1- \\hat p^{(i)}) (1-y^{(i)})\\bigg]\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Gradient computation </h2>\n",
    "\n",
    "Given $c(\\theta) =-\\big[\\log(\\hat p) y+ \\log(1- \\hat p) (1-y)\\big]$, observe\n",
    "\n",
    "$$\n",
    "\\frac {\\partial c }{\\partial \\theta_j}\n",
    "=\\frac {\\partial c }{\\partial \\hat p }\\frac {\\partial \\hat p }{\\partial (\\theta.{\\bf x})}\\frac {\\partial (\\theta.{\\bf x})}{\\partial \\theta_j  }\n",
    "=\\frac {\\partial c }{\\partial \\hat p }\\;\\sigma'(\\theta.{\\bf x})\\;x_j\n",
    "$$\n",
    "\n",
    "We have \n",
    "\n",
    "$$\n",
    "\\frac {\\partial c }{\\partial \\hat p } = -\\bigg[\\frac 1 {\\hat p} y -  \\frac 1{1- \\hat p} (1-y)\\bigg]\\quad\\quad\\sigma'(\\theta.{\\bf x})\\;= \\sigma (\\theta.{\\bf x}) (1-\\sigma(\\theta.{\\bf x})) = \\hat p (1- \\hat p) \n",
    "$$\n",
    "\n",
    "Finally\n",
    "\n",
    "$$\n",
    "\\frac {\\partial c }{\\partial \\theta_j}=-\\bigg[(1- \\hat p) y - \\hat p (1-y)\\bigg]x_j=\\big[ \\hat p -y \\big]x_j\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<h3 style=\"text-align: center;\"> Chain rule: seed to Back-propagtion algorithms </h3> "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "The partial derivatives of $J$ are given by \n",
    "$$\n",
    "\\frac {\\partial J(\\theta) }{\\partial \\theta_j}=\\frac 1{m} \\sum_{i=1}^m \\frac {\\partial c^{(i)}(\\theta) }{\\partial \\theta_j}=\\frac 1{m} \\sum_{i=1}^m \\big[ \\sigma(\\theta.{\\bf x}^{(i)})-y^{(i)} \\big]\\;x_j^{(i)}\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Decision Boundaries for the iris flower dataset\n",
    "\n",
    "<img src=\"https://s3.amazonaws.com/media-p.slid.es/uploads/633656/images/6079473/iris-machinelearning.png\" style=\"\" data-natural-width=\"1275\" data-natural-height=\"477\"/>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()\n",
    "list(iris.keys())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['sepal length (cm)',\n",
       " 'sepal width (cm)',\n",
       " 'petal length (cm)',\n",
       " 'petal width (cm)']"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris['feature_names']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "ename": "NameError",
     "evalue": "name 'save_fig' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-15-f08440673dc5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     33\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Petal width\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfontsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m14\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     34\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2.9\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.8\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2.7\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---> 35\u001b[0;31m \u001b[0msave_fig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"logistic_regression_contour_plot\"\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     36\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\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;31mNameError\u001b[0m: name 'save_fig' is not defined"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "X = iris[\"data\"][:, (2, 3)]  # petal length, petal width\n",
    "y = (iris[\"target\"] == 2).astype(np.int)\n",
    "\n",
    "log_reg = LogisticRegression(C=10**10, random_state=42)\n",
    "log_reg.fit(X, y)\n",
    "\n",
    "x0, x1 = np.meshgrid(\n",
    "                    np.linspace(2.9, 7, 500).reshape(-1, 1),\n",
    "                    np.linspace(0.8, 2.7, 200).reshape(-1, 1),\n",
    ")\n",
    "X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "\n",
    "y_proba = log_reg.predict_proba(X_new)\n",
    "\n",
    "plt.figure(figsize=(10, 4))\n",
    "plt.plot(X[y==0, 0], X[y==0, 1], \"bs\")\n",
    "plt.plot(X[y==1, 0], X[y==1, 1], \"g^\")\n",
    "\n",
    "zz = y_proba[:, 1].reshape(x0.shape)\n",
    "contour = plt.contour(x0, x1, zz, cmap=plt.cm.brg)\n",
    "\n",
    "\n",
    "left_right = np.array([2.9, 7])\n",
    "boundary = -(log_reg.coef_[0][0] * left_right + log_reg.intercept_[0]) / log_reg.coef_[0][1]\n",
    "\n",
    "plt.clabel(contour, inline=1, fontsize=12)\n",
    "plt.plot(left_right, boundary, \"k--\", linewidth=3)\n",
    "plt.text(3.5, 1.5, \"Not Iris-Virginica\", fontsize=14, color=\"b\", ha=\"center\")\n",
    "plt.text(6.5, 2.3, \"Iris-Virginica\", fontsize=14, color=\"g\", ha=\"center\")\n",
    "plt.xlabel(\"Petal length\", fontsize=14)\n",
    "plt.ylabel(\"Petal width\", fontsize=14)\n",
    "plt.axis([2.9, 7, 0.8, 2.7])\n",
    "save_fig(\"logistic_regression_contour_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;\"> Soft-max regression </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Principle </h2>\n",
    "\n",
    "Soft-max regression generalizes logistic regression in order to support $K$ classes. The model estimates a **parameter matrix**\n",
    "\n",
    "$$\n",
    "\\Theta = [\\Theta_1|\\Theta_2\\dots|\\Theta_K]^T\\in {\\mathbb R}^{K \\times (n+1)},\\quad\\quad\n",
    "\\Theta_k =(\\Theta_{0,k},\\Theta_{1,k},\\dots,\\Theta_{n,k} )^{T}.\n",
    "$$\n",
    "\n",
    "Given $x\\in{\\mathbb R}^n$ and ${\\bf x} = (1,x) \\in {\\mathbb R}^{n+1}$, we compute \n",
    "$z=\\Theta {\\bf x}~$ ( i.e. $z_j=\\Theta_j. {\\bf x}$  for every $j=1,\\dots,K$), then compute\n",
    "the $K$ probabilities \n",
    "\n",
    "$$\n",
    "\\hat p_k = \\frac {\\exp({z_k})}{\\displaystyle\\sum_{j=0}^K \\exp({z_j})},\\quad\\quad k=1,\\dots,K.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<div style=\"text-align: center;font-weight:bold;\"> The class predicted for $x$ is \n",
    "the class $k$ with the highest probabilities $ \\hat p_k$. </div> \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Example: Decision Boundaries for the iris flower dataset </h2>\n",
    "\n",
    "<img style='margin:auto;' src='softmax_iris.svg'/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Loss function </h2>\n",
    "\n",
    "Given a training set $\\{(x^{(1)},y^{(1)}),\\dots,(x^{(m)},y^{(m)})\\} \\subset \\mathbb R^n \\times \\mathbb \\{1,2,\\dots,K\\}$, the model minimizes a **suitable loss function** in order to find the best parameter matrix $\\Theta^*$. Given $\\{{ x}^{(i)},{ y}^{(i)}\\} $, the associated individual loss is given by \n",
    "\n",
    "$$\n",
    "c^{(i)}(\\Theta)= - \\log (\\hat p_k^{(i)}),\n",
    "\\quad\\quad \\mbox{if}\\quad\\quad\n",
    "y^{(i)} = k. \n",
    "$$\n",
    "\n",
    "Intuitively, given $y^{(i)}$ belongs to class $k$\n",
    "- we want $\\hat p_k^{(i)}$ to be close to $1$ (so that $\\hat p_k^{(i)}$ is the highest probability).  \n",
    "- the closer $\\hat p_k^{(i)}$ is to $0$ (i.e. the more certain that a miss-classification occurs), the larger is the loss (penalization) $c^{(i)}(\\Theta)$.\n",
    "\n",
    "Then the loss function for the whole training set is given by \n",
    "\n",
    "$$\n",
    "J(\\Theta)= \\frac 1{m} \\sum_{i=1}^m c^{(i)}(\\Theta)=- \\frac 1{m} \\sum_{i=1}^m  \\log (\\hat p_{y(i)}^{(i)}).\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "\n",
    "<h5 style=\"text-align: center;\"> We will view the function $J$ as a function of $(\\Theta_1,\\Theta_2,\\dots,\\Theta_K)$.</h5> "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Gradient computation </h2>\n",
    "\n",
    "We Let $\\theta = \\Theta_{j} \\in \\mathbb R^{n+1}$ for some $j\\in \\{1,\\dots,K\\}$: We have the following **function dependency diagram** \n",
    "\n",
    "$$\n",
    "\\Theta \\longrightarrow (z^{(i)}_l)_{\\substack{i=1,\\dots,m\\\\l=1,\\dots,K}} \\longrightarrow J.\n",
    "$$\n",
    "\n",
    "Using **chain rule** with respect to the intermediates variables and $\\nabla_{\\theta} z_l = \\delta_{j,l}{\\bf x}$ which follows from $z_l=\\Theta_l. {\\bf x}$, one has  \n",
    "\n",
    "$$\\nabla_{\\theta}  J(\\Theta)=\\sum_{i=1}^m \\sum_{l=1}^K\\frac {\\partial  J(\\Theta)}{\\partial z_l^{(i)}}\\nabla_{\\theta}  z_l^{(i)}=\\sum_{i=1}^m \\frac {\\partial  J(\\Theta)}{\\partial z_j^{(i)}}{\\bf x}^{(i)}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "In view of the formula for $J$\n",
    "$$\n",
    " \\frac {\\partial  J(\\Theta)}{\\partial z_j^{(i)}}=\n",
    "-\\frac 1m \\frac {\\partial  \\log(\\hat p_k^{(i)})}{\\partial z_j^{(i)}}\n",
    "$$\n",
    "\n",
    "By derivation of usual functions, one has \n",
    "\n",
    "$$\\frac {\\partial  \\log(\\hat p_k)}{\\partial z_j} =\\frac 1{\\hat p_k} \\frac {\\partial \\hat p_k}{\\partial z_j}\n",
    "=\n",
    "\\frac 1{\\hat p_k}\n",
    "\\left\\{\n",
    "\\begin{array}{ll}\n",
    "\\hat p_k - (\\hat p_k)^2&\\quad \\mbox{if}\\quad j=k \n",
    "\\\\\n",
    "- \\hat p_k \\hat p_j &\\quad \\mbox{if}\\quad j\\neq k\n",
    "\\end{array}\n",
    "\\right.\n",
    "=\n",
    "\\left\\{\n",
    "\\begin{array}{ll}\n",
    "1 - \\hat p_k&\\quad \\mbox{if}\\quad j=k \n",
    "\\\\\n",
    "- \\hat p_j &\\quad \\mbox{if}\\quad j\\neq k\n",
    "\\end{array}\n",
    "\\right.\n",
    "$$  \n",
    "\n",
    "The combination of the previous formulas implies\n",
    "\n",
    "$$\n",
    "\\nabla_{\\theta} J(\\Theta) = -  \\frac 1m \\sum_{i=1}^m ({\\mathbb 1}_{y^{(i)}=j} - \\hat p_j^{(i)}) {\\bf x}^{(i)}\n",
    "\\quad\\quad\\quad\\quad\n",
    "\\nabla_{\\theta} J(\\Theta)\n",
    "\\in {\\mathbb R}^{n+1}\n",
    "$$\n",
    "\n",
    "<!--\n",
    "<h5 style=\"text-align: center;\"> Observe that the gradient $\\nabla_{\\theta}z_l$ is equal to $0$, except if $l=j$, it is equal to $\\bf x$.</h5> \n",
    "-->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "The function $J$ as a function of $(\\Theta_1,\\Theta_2,\\dots,\\Theta_K)$ satisfies\n",
    "\n",
    "$$\n",
    "\\nabla_{\\Theta_j} J(\\Theta) = -  \\frac 1m \\sum_{i=1}^m ({\\mathbb 1}_{y^{(i)}=j} - \\hat p_j^{(i)}) {\\bf x}^{(i)}.\n",
    "$$\n",
    "\n",
    "Finally \n",
    "\n",
    "$$\n",
    "\\nabla_{\\Theta} J(\\Theta) = [\\nabla_{\\Theta_1} J(\\Theta) |\\nabla_{\\Theta_2} J(\\Theta) |\\dots|\\nabla_{\\Theta_k} J(\\Theta) ]^T\\in {\\mathbb R}^{K \\times (n+1)}.\n",
    "$$\n",
    "\n",
    "- Batch gradient descent;\n",
    "- stochastic gradient descent;\n",
    "- mini-Batch stochastic gradient descent;\n",
    "\n",
    "can all be implemented."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'save_fig' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-17-407055f81e5e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     33\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mloc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"center left\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfontsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m14\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     34\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m7\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3.5\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---> 35\u001b[0;31m \u001b[0msave_fig\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"softmax_regression_contour_plot\"\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     36\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshow\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;31mNameError\u001b[0m: name 'save_fig' is not defined"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = iris[\"data\"][:, (2, 3)]  # petal length, petal width, mainly for visualisation\n",
    "y = iris[\"target\"]\n",
    "\n",
    "softmax_reg = LogisticRegression(multi_class=\"multinomial\",solver=\"lbfgs\", C=10, random_state=42)\n",
    "softmax_reg.fit(X, y)\n",
    "\n",
    "#softmax_reg = LogisticRegression(multi_class=\"multinomial\",solver=\"lbfgs\", C=10)\n",
    "#softmax_reg.fit(X, y)\n",
    "    \n",
    "x0, x1 = np.meshgrid( np.linspace(0, 8, 500).reshape(-1, 1),\n",
    "                     np.linspace(0, 3.5, 200).reshape(-1, 1),)\n",
    "X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "\n",
    "y_proba = softmax_reg.predict_proba(X_new)\n",
    "y_predict = softmax_reg.predict(X_new)\n",
    "\n",
    "zz1 = y_proba[:, 1].reshape(x0.shape)\n",
    "zz = y_predict.reshape(x0.shape)\n",
    "\n",
    "plt.figure(figsize=(10, 4))\n",
    "plt.plot(X[y==2, 0], X[y==2, 1], \"g^\", label=\"Iris-Virginica\")\n",
    "plt.plot(X[y==1, 0], X[y==1, 1], \"bs\", label=\"Iris-Versicolor\")\n",
    "plt.plot(X[y==0, 0], X[y==0, 1], \"yo\", label=\"Iris-Setosa\")\n",
    "\n",
    "from matplotlib.colors import ListedColormap\n",
    "custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n",
    "\n",
    "plt.contourf(x0, x1, zz, cmap=custom_cmap)\n",
    "contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg)\n",
    "plt.clabel(contour, inline=1, fontsize=12)\n",
    "plt.xlabel(\"Petal length\", fontsize=14)\n",
    "plt.ylabel(\"Petal width\", fontsize=14)\n",
    "plt.legend(loc=\"center left\", fontsize=14)\n",
    "plt.axis([0, 7, 0, 3.5])\n",
    "save_fig(\"softmax_regression_contour_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;\"> Summary   </h1>\n",
    "\n",
    "\n",
    "How do we **learn** the \"best\" weights vector $(\\theta_0^*,\\dots,\\theta_n^*)$ or matrix $(\\Theta_0^*|\\dots|\\Theta_n^*)$ in linear/logistic/soft-max regression\n",
    "<br>\n",
    "<br>\n",
    "\n",
    "\n",
    "<div style=\"float:left;\" >\n",
    "    <span data-fragment-index=\"1\" style=\"font-size:1.3em\">Gradient Descent Algorithms</span>\n",
    "<img data-natural-width=\"600\" width=\"300\" style=\"right:0;top:10%;float:right;\" data-lazy-loaded=\"\" src=\"https://s3.amazonaws.com/media-p.slid.es/uploads/655061/images/3516655/sgd_contour.gif\"/>\n",
    "<ul>\n",
    "            <li class=\"fragment\" data-fragment-index=\"1\">\n",
    "                Give weights random initial values\n",
    "            </li>\n",
    "            <br>\n",
    "            <li class=\"fragment\" data-fragment-index=\"2\">\n",
    "                Evaluate partial derivative of each weight with respect to <strong>MSE</strong> or <strong>negative log-likelihood</strong> at current weight value\n",
    "            </li>\n",
    "            <br>\n",
    "            <li class=\"fragment\" data-fragment-index=\"3\">\n",
    "               Take a step in direction opposite to the gradient \n",
    "            </li>\n",
    "            <br>\n",
    "            <li class=\"fragment\" data-fragment-index=\"4\">\n",
    "                <span >Rinse and repeat</span>\n",
    "            </li>\n",
    "            <br>\n",
    "        </ul>\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<p style='text-align:center; font-size:1.4em'>\n",
    "Essence of the entire learning process behind deep learning algorithms\n",
    "<p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style=\"text-align: center;\"> Neural network and backpropagation  </h1>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style='text-align:center'>\n",
    "    MULTILAYER PERCEPTRONS (MLPs)\n",
    "</h2>\n",
    "<img width=\"500\" style=\"margin:auto;text-align:center\" data-lazy-loaded=\"\" src=\"https://s3.amazonaws.com/media-p.slid.es/uploads/655061/images/3516930/neural_net2.jpg\"/>\n",
    "\n",
    "<ul>\n",
    "    <li class=\"fragment\" data-fragment-index=\"1\">\n",
    "        Most generic form of a neural net is the \"multilayer perceptron\"\n",
    "    </li>\n",
    "    <li class=\"fragment\" data-fragment-index=\"2\">\n",
    "              Input undergoes a series of nonlinear transformation \n",
    "    </li>\n",
    "    <li class=\"fragment\" data-fragment-index=\"3\">\n",
    "       A final classification layer</span>\n",
    "    </li>\n",
    "</ul>\n",
    "\n",
    "\n",
    "<ul>\n",
    "    <li class=\"fragment\" data-fragment-index=\"4\">\n",
    "        MLPs are easy entry to understand deep learning models\n",
    "        </li>\n",
    "    <li class=\"fragment\" data-fragment-index=\"5\">\n",
    "                Closely related to logistic regression\n",
    "    </li>\n",
    " </ul>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Principle </h2>\n",
    "\n",
    "We consider classification problem for **iris dataset** using neural network with one **hidden layer** (5 nodes) \n",
    "and **activation function** $\\varphi$ (sigmoid, relu, etc)\n",
    "<br>\n",
    "\n",
    "<div>\n",
    "<img width=\"350\" style=\" float:right;\" src= 'dnn_1hidden.svg'/>\n",
    "\n",
    "- Input layer $$x=(x_1,x_2,x_3,x_4)^T.$$\n",
    "\n",
    "- Hidden layer  \n",
    "$$h = (h_1,h_2,h_3, h_4,h_5)^T.$$\n",
    "\n",
    "- Output layer \n",
    "$$z = ( z_1, z_2, z_3)^T.$$\n",
    "\n",
    "With bias in input and hidden layer $x_0 = 1, h_0=1$, we denote\n",
    "\n",
    "$$\n",
    "{\\bf x} = (1,x^T)^T,\\quad\\quad\\quad\n",
    "{\\bf h} = (1,h^T)^T\n",
    "$$\n",
    "\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<img width=\"800\" style=\" margin:auro\" src= 'dnn_1hidden_details.svg'/>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> Loss function </h2>\n",
    "\n",
    "Given a training set $\\{(x^{(1)},y^{(1)}),\\dots,(x^{(m)},y^{(m)})\\} \\subset \\mathbb R^n \\times \\mathbb \\{1,2,\\dots,K\\}$ ($n=4$ and $K=3$ for iris dataset), the model minimizes the **negative log-likelihood** as for Soft-Max\n",
    "regression in order to find the best parameter matrices $\\widetilde\\Theta^*$ and $\\Theta^*$. \n",
    "The loss function for the whole training set is given by \n",
    "\n",
    "$$\n",
    "J(\\widetilde\\Theta,\\Theta) = \n",
    "-  \\frac 1{m} \\sum_{{i=1}}^m \\log (\\hat p_k^{(i)}),\\quad\\quad\\quad (k \\mbox{ is such that } y^{(i)} \\mbox{ belongs to class } k)\n",
    "$$\n",
    "\n",
    "\n",
    "If $n_h$ is the number of nodes in the hidden layer (here $n_h=5$), we write\n",
    "\n",
    "$$\n",
    "\\widetilde\\Theta = [\\widetilde\\Theta_1|\\widetilde\\Theta_2\\dots|\\widetilde\\Theta_{n_h}]^T\\in {\\mathbb R}^{n_h \\times (n+1)},\\quad\\quad\n",
    "\\Theta = [\\Theta_1|\\Theta_2\\dots|\\Theta_K]^T\\in {\\mathbb R}^{K \\times (n_h+1)},\\quad\\quad\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<h5 style=\"text-align: center;\"> We will view the function $J$ as a function of $(\\widetilde\\Theta_1,\\widetilde\\Theta_2,\\dots,\\widetilde\\Theta_{n_h},\\Theta_1,\\Theta_2,\\dots,\\Theta_K)$.</h5> "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style='text-align:center'>\n",
    "   But how do we compute gradients, with respect to the $\\Theta_j$ and $\\widetilde\\Theta_j$\n",
    "</h2>\n",
    "\n",
    "We recall the **mapping diagram** \n",
    "\n",
    "$$\n",
    "{\\bf x} \\quad\\Longrightarrow\\quad h^{-} = \\widetilde \\Theta {\\bf x} \\quad\\Longrightarrow\\quad h = \\varphi(h^{-}) \\quad\\Longrightarrow\\quad z=\\Theta {\\bf h}    \n",
    "$$\n",
    " \n",
    "and the **function dependency diagram** \n",
    "\n",
    "$$\n",
    "(\\widetilde \\Theta, \\Theta) \\longrightarrow ({h^{-}_j}^{(i)})_{\\substack{i=1,\\dots,m\\\\j=1,\\dots,n_h}} \\longrightarrow ({h_j}^{(i)})_{\\substack{i=1,\\dots,m\\\\j=1,\\dots,n_h}}  \\longrightarrow (z^{(i)}_l)_{\\substack{i=1,\\dots,m\\\\l=1,\\dots,K}} \\longrightarrow J.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "- For $j=1,\\dots,K$, we proceed as in soft-max regression (but with $h$ as input)\n",
    "$$\\nabla_{\\Theta_j}  J =\\sum_{i=1}^m \\frac {\\partial  J}{\\partial z_j^{(i)}}{\\bf h}^{(i)} = -  \\frac 1m \\sum_{i=1}^m ({\\mathbb 1}_{y^{(i)}=j} - \\hat p_j^{(i)}) {\\bf h}^{(i)}.\n",
    "$$\n",
    "Observe dependance on $\\widetilde\\Theta$  through the ${\\bf h}^{(i)}$ then on $\\Theta$ through the $\\hat p_k^{(i)}$.\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "- For $j = 1,\\dots,n_h$ and $\\tilde\\theta = \\widetilde\\Theta_{j}$, we proceed as in soft-max regression: **chain rule** with variables $({h_j^{-}}^{(i)})_{\\substack{i=1,\\dots,m\\\\j=1,\\dots,n_h}}$ and $h^{-} = \\widetilde \\Theta {\\bf x}$ implies \n",
    "$$\\nabla_{\\tilde\\theta} J= \\sum_{i=1}^m \\sum_{l=0}^{n_h}\\frac {\\partial J}{\\partial {h_l^{-}}^{(i)}} \\nabla_{\\tilde\\theta} {h_l^{-}}^{(i)}= \\sum_{i=1}^m \\frac {\\partial J}{\\partial {h_j^{-}}^{(i)}} {\\bf x}^{(i)}.\n",
    "$$\n",
    "Then $\\frac {\\partial J}{\\partial {h_j^{-}}^{(i)}} =\\frac {\\partial J}{\\partial h_j^{(i)}} \\sigma'({h_j^{-}}^{(i)})$ and\n",
    "$$\n",
    "\\frac {\\partial J}{\\partial h_j^{(i)}} \n",
    "= \\sum_{l=1}^K \\frac {\\partial J}{\\partial z_l^{(i)}} \\frac {\\partial z_l^{(i)}}{\\partial h_j^{(i)}}\n",
    "= \\sum_{l=1}^K \\frac {\\partial J}{\\partial z_l^{(i)}} \\Theta_{j,l}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<h5 style=\"text-align: center;\"> The gradients $\\nabla_{\\Theta} J$ and $\\nabla_{\\widetilde\\Theta} J$ are completely determined knowing \n",
    "    $$\n",
    "    {\\partial  J}/{\\partial z_j^{(i)}} \\quad\\quad i=1,\\dots,m,\\quad j=1,\\dots k \\\\\n",
    "    {\\partial  J}/{\\partial h_j^{(i)}} \\quad\\quad i=1,\\dots,m,\\quad j=1,\\dots n_h\n",
    "    $$\n",
    "</h5>\n",
    "\n",
    "- Batch gradient descent;\n",
    "- stochastic gradient descent;\n",
    "- mini-Batch stochastic gradient descent;\n",
    "\n",
    "can all be implemented."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Backpropagation##\n",
    "<img width=\"500\" style=\" margin:auro\" src= 'back_prop.svg'/>\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<!--\n",
    "Given training set $\\{(x^{(1)},y^{(1)}),\\dots,(x^{(m)},y^{(m)})\\} \\subset \\mathbb R^n \\times \\mathbb R$, we let \n",
    "$$\n",
    "{\\bf x}^{(i)} = (1,{ x}^{(i)}) \\in {\\mathbb R}^{n+1},\\quad\\quad\n",
    "{\\bf z}^{(i)} = (1,{ z}^{(i)}),\\quad\\quad\n",
    "{\\bf \\tilde z}^{(1)} = {\\tilde z}^{(i)},\\quad\\quad\n",
    "$$\n",
    "and\n",
    "\n",
    "$$\n",
    "X=\n",
    "\\left[\n",
    "\\begin{array}{c}\n",
    "{\\bf x}^{(1)} \\\\\n",
    "\\hline\n",
    "{\\bf x}^{(2)} \\\\\n",
    "\\hline\n",
    "\\vdots\\\\\n",
    "\\hline\n",
    "{\\bf x}^{(m)}\n",
    "\\end{array}\n",
    "\\right],\\quad\\quad \n",
    "Z=\n",
    "\\left[\n",
    "\\begin{array}{c}\n",
    "{\\bf z}^{(1)} \\\\\n",
    "\\hline\n",
    "{\\bf z}^{(2)} \\\\\n",
    "\\hline\n",
    "\\vdots\\\\\n",
    "\\hline\n",
    "{\\bf z}^{(m)}\n",
    "\\end{array}\n",
    "\\right]\n",
    "\\quad\\quad \n",
    "\\tilde Z=\n",
    "\\left[\n",
    "\\begin{array}{c}\n",
    "{\\bf \\tilde z}^{(1)} \\\\\n",
    "\\hline\n",
    "{\\bf \\tilde z}^{(2)} \\\\\n",
    "\\hline\n",
    "\\vdots\\\\\n",
    "\\hline\n",
    "{\\bf \\tilde z}^{(m)}\n",
    "\\end{array}\n",
    "\\right]\n",
    "$$\n",
    "-->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<!--\n",
    "Then \n",
    "$$\n",
    "{\\bf Z} = relu(X.W ),\\quad\\quad \\quad W \\in {\\mathbb R}^{4\\times4},\n",
    "$$\n",
    "and\n",
    "$$\n",
    "{\\bf \\tilde Z} = relu(Z.\\tilde W ),\\quad\\quad \\quad \\tilde W \\in {\\mathbb R}^{5\\times4},\n",
    "$$\n",
    "Here $relu$ is vectorial \n",
    "$$\n",
    "relu(v) = (relu(v_1),\\dots, relu(v_k)),\\quad\\quad\n",
    "v = (v_1,\\dots, v_k) \n",
    "$$\n",
    "-->\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "$$\n",
    "J(\\theta)=-\\frac{1}{m} \\sum_{i=1}^{m}\\left[y^{(i)} \\log \\left(h_{\\theta}\\left(x^{(i)}\\right)\\right)+\\left(1-y^{(i)}\\right) \\log \\left(1-h_{\\theta}\\left(x^{(i)}\\right)\\right)\\right]+\\frac{\\lambda}{2 m} \\sum_{j=1}^{n} \\theta_{j}^{2}\n",
    "$$\n",
    "\n",
    "$$\n",
    "J(\\Theta)=-\\frac{1}{m} \\sum_{i=1}^{m} \\sum_{k=1}^{K}\\left[y_{k}^{(i)} \\log \\left(\\left(h_{\\Theta}\\left(x^{(i)}\\right)\\right)_{k}\\right)+\\left(1-y_{k}^{(i)}\\right) \\log \\left(1-\\left(h_{\\Theta}\\left(x^{(i)}\\right)\\right)_{k}\\right)\\right]+\\frac{\\lambda}{2 m} \\sum_{l=1}^{L-1} \\sum_{i=1}^{s_{l}} \\sum_{j=1}^{s t+1}\\left(\\Theta_{j, i}^{(l)}\\right)^{2}\n",
    "$$\n",
    "\n",
    "Training a Neural Network\n",
    "\n",
    "- Randomly initialize the weights\n",
    "- Implement forward propagation to get $hΘ(x(i))$ for any $x^{(i)}x$ \n",
    "- Implement the cost function\n",
    "- Implement backpropagation to compute partial derivatives\n",
    "- Use gradient checking to confirm that your backpropagation works. Then disable gradient checking.\n",
    "- Use gradient descent or a built-in optimization function to minimize the cost function with the weights in theta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<h2 style=\"text-align: center;\"> some tensorflow code  </h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'tensorflow'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-18-694f65f92201>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mtensorflow\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname_scope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"dnn\"\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      3\u001b[0m     \u001b[0mhidden1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mneuron_layer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_hidden1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"hidden1\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactivation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"relu\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m     \u001b[0mhidden2\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mneuron_layer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhidden1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_hidden2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"hidden2\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mactivation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"relu\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mlogits\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mneuron_layer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhidden2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_outputs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"outputs\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'tensorflow'"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "with tf.name_scope(\"dnn\"):\n",
    "    hidden1 = neuron_layer(X, n_hidden1, \"hidden1\", activation=\"relu\") \n",
    "    hidden2 = neuron_layer(hidden1, n_hidden2, \"hidden2\", activation=\"relu\") \n",
    "logits = neuron_layer(hidden2, n_outputs, \"outputs\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<h1 style='text-align:center'>\n",
    "    References\n",
    "</h1>\n",
    "\n",
    "https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.3"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
