3113 lines
402 KiB
Plaintext
3113 lines
402 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Optimization, the central part of any Machine Learning algortithm\n",
|
||
"\n",
|
||
"Almost every problem in machine learning and data science starts with\n",
|
||
"a dataset $X$, a model $g(\\beta)$, which is a function of the\n",
|
||
"parameters $\\beta$ and a cost function $C(X, g(\\beta))$ that allows\n",
|
||
"us to judge how well the model $g(\\beta)$ explains the observations\n",
|
||
"$X$. The model is fit by finding the values of $\\beta$ that minimize\n",
|
||
"the cost function. Ideally we would be able to solve for $\\beta$\n",
|
||
"analytically, however this is not possible in general and we must use\n",
|
||
"some approximative/numerical method to compute the minimum.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"In our discussion on Logistic Regression we studied the \n",
|
||
"case of\n",
|
||
"two classes, with $y_i$ either\n",
|
||
"$0$ or $1$. Furthermore we assumed also that we have only two\n",
|
||
"parameters $\\beta$ in our fitting, that is we\n",
|
||
"defined probabilities"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{align*}\n",
|
||
"p(y_i=1|x_i,\\boldsymbol{\\beta}) &= \\frac{\\exp{(\\beta_0+\\beta_1x_i)}}{1+\\exp{(\\beta_0+\\beta_1x_i)}},\\nonumber\\\\\n",
|
||
"p(y_i=0|x_i,\\boldsymbol{\\beta}) &= 1 - p(y_i=1|x_i,\\boldsymbol{\\beta}),\n",
|
||
"\\end{align*}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\boldsymbol{\\beta}$ are the weights we wish to extract from data, in our case $\\beta_0$ and $\\beta_1$. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Our compact equations used a definition of a vector $\\boldsymbol{y}$ with $n$\n",
|
||
"elements $y_i$, an $n\\times p$ matrix $\\boldsymbol{X}$ which contains the\n",
|
||
"$x_i$ values and a vector $\\boldsymbol{p}$ of fitted probabilities\n",
|
||
"$p(y_i\\vert x_i,\\boldsymbol{\\beta})$. We rewrote in a more compact form\n",
|
||
"the first derivative of the cost function as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}} = -\\boldsymbol{X}^T\\left(\\boldsymbol{y}-\\boldsymbol{p}\\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we in addition define a diagonal matrix $\\boldsymbol{W}$ with elements \n",
|
||
"$p(y_i\\vert x_i,\\boldsymbol{\\beta})(1-p(y_i\\vert x_i,\\boldsymbol{\\beta})$, we can obtain a compact expression of the second derivative as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T} = \\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This defines what is called the Hessian matrix.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"If we can set up these equations, Newton-Raphson's iterative method is normally the method of choice. It requires however that we can compute in an efficient way the matrices that define the first and second derivatives. \n",
|
||
"\n",
|
||
"Our iterative scheme is then given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\frac{\\partial^2 \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}\\partial \\boldsymbol{\\beta}^T}\\right)^{-1}_{\\boldsymbol{\\beta}^{\\mathrm{old}}}\\times \\left(\\frac{\\partial \\mathcal{C}(\\boldsymbol{\\beta})}{\\partial \\boldsymbol{\\beta}}\\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or in matrix form as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\beta}^{\\mathrm{new}} = \\boldsymbol{\\beta}^{\\mathrm{old}}-\\left(\\boldsymbol{X}^T\\boldsymbol{W}\\boldsymbol{X} \\right)^{-1}\\times \\left(-\\boldsymbol{X}^T(\\boldsymbol{y}-\\boldsymbol{p}) \\right)_{\\boldsymbol{\\beta}^{\\mathrm{old}}}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The right-hand side is computed with the old values of $\\beta$. \n",
|
||
"\n",
|
||
"If we can compute these matrices, in particular the Hessian, the above is often the easiest method to implement. \n",
|
||
"\n",
|
||
"\n",
|
||
"Let us quickly remind ourselves how we derive the above method.\n",
|
||
"\n",
|
||
"Perhaps the most celebrated of all one-dimensional root-finding\n",
|
||
"routines is Newton's method, also called the Newton-Raphson\n",
|
||
"method. This method requires the evaluation of both the\n",
|
||
"function $f$ and its derivative $f'$ at arbitrary points. \n",
|
||
"If you can only calculate the derivative\n",
|
||
"numerically and/or your function is not of the smooth type, we\n",
|
||
"normally discourage the use of this method.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The Newton-Raphson formula consists geometrically of extending the\n",
|
||
"tangent line at a current point until it crosses zero, then setting\n",
|
||
"the next guess to the abscissa of that zero-crossing. The mathematics\n",
|
||
"behind this method is rather simple. Employing a Taylor expansion for\n",
|
||
"$x$ sufficiently close to the solution $s$, we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<!-- Equation labels as ordinary links -->\n",
|
||
"<div id=\"eq:taylornr\"></div>\n",
|
||
"\n",
|
||
"$$\n",
|
||
"f(s)=0=f(x)+(s-x)f'(x)+\\frac{(s-x)^2}{2}f''(x) +\\dots.\n",
|
||
" \\label{eq:taylornr} \\tag{1}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"For small enough values of the function and for well-behaved\n",
|
||
"functions, the terms beyond linear are unimportant, hence we obtain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"f(x)+(s-x)f'(x)\\approx 0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"yielding"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"s\\approx x-\\frac{f(x)}{f'(x)}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Having in mind an iterative procedure, it is natural to start iterating with"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The above is Newton-Raphson's method. It has a simple geometric\n",
|
||
"interpretation, namely $x_{n+1}$ is the point where the tangent from\n",
|
||
"$(x_n,f(x_n))$ crosses the $x$-axis. Close to the solution,\n",
|
||
"Newton-Raphson converges fast to the desired result. However, if we\n",
|
||
"are far from a root, where the higher-order terms in the series are\n",
|
||
"important, the Newton-Raphson formula can give grossly inaccurate\n",
|
||
"results. For instance, the initial guess for the root might be so far\n",
|
||
"from the true root as to let the search interval include a local\n",
|
||
"maximum or minimum of the function. If an iteration places a trial\n",
|
||
"guess near such a local extremum, so that the first derivative nearly\n",
|
||
"vanishes, then Newton-Raphson may fail totally\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Newton's method can be generalized to systems of several non-linear equations\n",
|
||
"and variables. Consider the case with two equations"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{array}{cc} f_1(x_1,x_2) &=0\\\\\n",
|
||
" f_2(x_1,x_2) &=0,\\end{array}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which we Taylor expand to obtain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\begin{array}{cc} 0=f_1(x_1+h_1,x_2+h_2)=&f_1(x_1,x_2)+h_1\n",
|
||
" \\partial f_1/\\partial x_1+h_2\n",
|
||
" \\partial f_1/\\partial x_2+\\dots\\\\\n",
|
||
" 0=f_2(x_1+h_1,x_2+h_2)=&f_2(x_1,x_2)+h_1\n",
|
||
" \\partial f_2/\\partial x_1+h_2\n",
|
||
" \\partial f_2/\\partial x_2+\\dots\n",
|
||
" \\end{array}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Defining the Jacobian matrix $\\boldsymbol{J}$ we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{J}=\\left( \\begin{array}{cc}\n",
|
||
" \\partial f_1/\\partial x_1 & \\partial f_1/\\partial x_2 \\\\\n",
|
||
" \\partial f_2/\\partial x_1 &\\partial f_2/\\partial x_2\n",
|
||
" \\end{array} \\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"we can rephrase Newton's method as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\left(\\begin{array}{c} x_1^{n+1} \\\\ x_2^{n+1} \\end{array} \\right)=\n",
|
||
"\\left(\\begin{array}{c} x_1^{n} \\\\ x_2^{n} \\end{array} \\right)+\n",
|
||
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\left(\\begin{array}{c} h_1^{n} \\\\ h_2^{n} \\end{array} \\right)=\n",
|
||
" -\\boldsymbol{J}^{-1}\n",
|
||
" \\left(\\begin{array}{c} f_1(x_1^{n},x_2^{n}) \\\\ f_2(x_1^{n},x_2^{n}) \\end{array} \\right).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We need thus to compute the inverse of the Jacobian matrix and it\n",
|
||
"is to understand that difficulties may\n",
|
||
"arise in case $\\boldsymbol{J}$ is nearly singular.\n",
|
||
"\n",
|
||
"It is rather straightforward to extend the above scheme to systems of\n",
|
||
"more than two non-linear equations. In our case, the Jacobian matrix is given by the Hessian that represents the second derivative of cost function. \n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Steepest descent\n",
|
||
"\n",
|
||
"The basic idea of gradient descent is\n",
|
||
"that a function $F(\\mathbf{x})$, \n",
|
||
"$\\mathbf{x} \\equiv (x_1,\\cdots,x_n)$, decreases fastest if one goes from $\\bf {x}$ in the\n",
|
||
"direction of the negative gradient $-\\nabla F(\\mathbf{x})$.\n",
|
||
"\n",
|
||
"It can be shown that if"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"with $\\gamma_k > 0$.\n",
|
||
"\n",
|
||
"For $\\gamma_k$ small enough, then $F(\\mathbf{x}_{k+1}) \\leq\n",
|
||
"F(\\mathbf{x}_k)$. This means that for a sufficiently small $\\gamma_k$\n",
|
||
"we are always moving towards smaller function values, i.e a minimum.\n",
|
||
"\n",
|
||
"\n",
|
||
"The previous observation is the basis of the method of steepest\n",
|
||
"descent, which is also referred to as just gradient descent (GD). One\n",
|
||
"starts with an initial guess $\\mathbf{x}_0$ for a minimum of $F$ and\n",
|
||
"computes new approximations according to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{x}_{k+1} = \\mathbf{x}_k - \\gamma_k \\nabla F(\\mathbf{x}_k), \\ \\ k \\geq 0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The parameter $\\gamma_k$ is often referred to as the step length or\n",
|
||
"the learning rate within the context of Machine Learning.\n",
|
||
"\n",
|
||
"\n",
|
||
"Ideally the sequence $\\{\\mathbf{x}_k \\}_{k=0}$ converges to a global\n",
|
||
"minimum of the function $F$. In general we do not know if we are in a\n",
|
||
"global or local minimum. In the special case when $F$ is a convex\n",
|
||
"function, all local minima are also global minima, so in this case\n",
|
||
"gradient descent can converge to the global solution. The advantage of\n",
|
||
"this scheme is that it is conceptually simple and straightforward to\n",
|
||
"implement. However the method in this form has some severe\n",
|
||
"limitations:\n",
|
||
"\n",
|
||
"In machine learing we are often faced with non-convex high dimensional\n",
|
||
"cost functions with many local minima. Since GD is deterministic we\n",
|
||
"will get stuck in a local minimum, if the method converges, unless we\n",
|
||
"have a very good intial guess. This also implies that the scheme is\n",
|
||
"sensitive to the chosen initial condition.\n",
|
||
"\n",
|
||
"Note that the gradient is a function of $\\mathbf{x} =\n",
|
||
"(x_1,\\cdots,x_n)$ which makes it expensive to compute numerically.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The gradient descent method \n",
|
||
"is sensitive to the choice of learning rate $\\gamma_k$. This is due\n",
|
||
"to the fact that we are only guaranteed that $F(\\mathbf{x}_{k+1}) \\leq\n",
|
||
"F(\\mathbf{x}_k)$ for sufficiently small $\\gamma_k$. The problem is to\n",
|
||
"determine an optimal learning rate. If the learning rate is chosen too\n",
|
||
"small the method will take a long time to converge and if it is too\n",
|
||
"large we can experience erratic behavior.\n",
|
||
"\n",
|
||
"Many of these shortcomings can be alleviated by introducing\n",
|
||
"randomness. One such method is that of Stochastic Gradient Descent\n",
|
||
"(SGD), see below.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"## Convex functions\n",
|
||
"\n",
|
||
"Ideally we want our cost/loss function to be convex(concave).\n",
|
||
"\n",
|
||
"First we give the definition of a convex set: A set $C$ in\n",
|
||
"$\\mathbb{R}^n$ is said to be convex if, for all $x$ and $y$ in $C$ and\n",
|
||
"all $t \\in (0,1)$ , the point $(1 − t)x + ty$ also belongs to\n",
|
||
"C. Geometrically this means that every point on the line segment\n",
|
||
"connecting $x$ and $y$ is in $C$ as discussed below.\n",
|
||
"\n",
|
||
"The convex subsets of $\\mathbb{R}$ are the intervals of\n",
|
||
"$\\mathbb{R}$. Examples of convex sets of $\\mathbb{R}^2$ are the\n",
|
||
"regular polygons (triangles, rectangles, pentagons, etc...).\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"**Convex function**: Let $X \\subset \\mathbb{R}^n$ be a convex set. Assume that the function $f: X \\rightarrow \\mathbb{R}$ is continuous, then $f$ is said to be convex if $$f(tx_1 + (1-t)x_2) \\leq tf(x_1) + (1-t)f(x_2) $$ for all $x_1, x_2 \\in X$ and for all $t \\in [0,1]$. If $\\leq$ is replaced with a strict inequaltiy in the definition, we demand $x_1 \\neq x_2$ and $t\\in(0,1)$ then $f$ is said to be strictly convex. For a single variable function, convexity means that if you draw a straight line connecting $f(x_1)$ and $f(x_2)$, the value of the function on the interval $[x_1,x_2]$ is always below the line as illustrated below.\n",
|
||
"\n",
|
||
"\n",
|
||
"In the following we state first and second-order conditions which\n",
|
||
"ensures convexity of a function $f$. We write $D_f$ to denote the\n",
|
||
"domain of $f$, i.e the subset of $R^n$ where $f$ is defined. For more\n",
|
||
"details and proofs we refer to: [S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press](http://stanford.edu/boyd/cvxbook/, 2004).\n",
|
||
"\n",
|
||
"**First order condition.**\n",
|
||
"\n",
|
||
"Suppose $f$ is differentiable (i.e $\\nabla f(x)$ is well defined for\n",
|
||
"all $x$ in the domain of $f$). Then $f$ is convex if and only if $D_f$\n",
|
||
"is a convex set and $$f(y) \\geq f(x) + \\nabla f(x)^T (y-x) $$ holds\n",
|
||
"for all $x,y \\in D_f$. This condition means that for a convex function\n",
|
||
"the first order Taylor expansion (right hand side above) at any point\n",
|
||
"a global under estimator of the function. To convince yourself you can\n",
|
||
"make a drawing of $f(x) = x^2+1$ and draw the tangent line to $f(x)$ and\n",
|
||
"note that it is always below the graph.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"**Second order condition.**\n",
|
||
"\n",
|
||
"Assume that $f$ is twice\n",
|
||
"differentiable, i.e the Hessian matrix exists at each point in\n",
|
||
"$D_f$. Then $f$ is convex if and only if $D_f$ is a convex set and its\n",
|
||
"Hessian is positive semi-definite for all $x\\in D_f$. For a\n",
|
||
"single-variable function this reduces to $f''(x) \\geq 0$. Geometrically this means that $f$ has nonnegative curvature\n",
|
||
"everywhere.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"This condition is particularly useful since it gives us an procedure for determining if the function under consideration is convex, apart from using the definition.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The next result is of great importance to us and the reason why we are\n",
|
||
"going on about convex functions. In machine learning we frequently\n",
|
||
"have to minimize a loss/cost function in order to find the best\n",
|
||
"parameters for the model we are considering. \n",
|
||
"\n",
|
||
"Ideally we want the\n",
|
||
"global minimum (for high-dimensional models it is hard to know\n",
|
||
"if we have local or global minimum). However, if the cost/loss function\n",
|
||
"is convex the following result provides invaluable information:\n",
|
||
"\n",
|
||
"**Any minimum is global for convex functions.**\n",
|
||
"\n",
|
||
"Consider the problem of finding $x \\in \\mathbb{R}^n$ such that $f(x)$\n",
|
||
"is minimal, where $f$ is convex and differentiable. Then, any point\n",
|
||
"$x^*$ that satisfies $\\nabla f(x^*) = 0$ is a global minimum.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"This result means that if we know that the cost/loss function is convex and we are able to find a minimum, we are guaranteed that it is a global minimum.\n",
|
||
"\n",
|
||
"\n",
|
||
"### Some simple problems\n",
|
||
"\n",
|
||
"1. Show that $f(x)=x^2$ is convex for $x \\in \\mathbb{R}$ using the definition of convexity. Hint: If you re-write the definition, $f$ is convex if the following holds for all $x,y \\in D_f$ and any $\\lambda \\in [0,1]$ $\\lambda f(x)+(1-\\lambda)f(y)-f(\\lambda x + (1-\\lambda) y ) \\geq 0$.\n",
|
||
"\n",
|
||
"2. Using the second order condition show that the following functions are convex on the specified domain.\n",
|
||
"\n",
|
||
" * $f(x) = e^x$ is convex for $x \\in \\mathbb{R}$.\n",
|
||
"\n",
|
||
" * $g(x) = -\\ln(x)$ is convex for $x \\in (0,\\infty)$.\n",
|
||
"\n",
|
||
"\n",
|
||
"3. Let $f(x) = x^2$ and $g(x) = e^x$. Show that $f(g(x))$ and $g(f(x))$ is convex for $x \\in \\mathbb{R}$. Also show that if $f(x)$ is any convex function than $h(x) = e^{f(x)}$ is convex.\n",
|
||
"\n",
|
||
"4. A norm is any function that satisfy the following properties\n",
|
||
"\n",
|
||
" * $f(\\alpha x) = |\\alpha| f(x)$ for all $\\alpha \\in \\mathbb{R}$.\n",
|
||
"\n",
|
||
" * $f(x+y) \\leq f(x) + f(y)$\n",
|
||
"\n",
|
||
" * $f(x) \\leq 0$ for all $x \\in \\mathbb{R}^n$ with equality if and only if $x = 0$\n",
|
||
"\n",
|
||
"\n",
|
||
"Using the definition of convexity, try to show that a function satisfying the properties above is convex (the third condition is not needed to show this).\n",
|
||
"\n",
|
||
"\n",
|
||
"## Standard steepest descent\n",
|
||
"\n",
|
||
"\n",
|
||
"Before we proceed, we would like to discuss the approach called the\n",
|
||
"**standard Steepest descent** (different from the above steepest descent discussion), which again leads to us having to be able\n",
|
||
"to compute a matrix. It belongs to the class of Conjugate Gradient methods (CG).\n",
|
||
"\n",
|
||
"[The success of the CG method](https://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf)\n",
|
||
"for finding solutions of non-linear problems is based on the theory\n",
|
||
"of conjugate gradients for linear systems of equations. It belongs to\n",
|
||
"the class of iterative methods for solving problems from linear\n",
|
||
"algebra of the type"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In the iterative process we end up with a problem like"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{r}= \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\boldsymbol{r}$ is the so-called residual or error in the iterative process.\n",
|
||
"\n",
|
||
"When we have found the exact solution, $\\boldsymbol{r}=0$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"The residual is zero when we reach the minimum of the quadratic equation"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"P(\\boldsymbol{x})=\\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T\\boldsymbol{b},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"with the constraint that the matrix $\\boldsymbol{A}$ is positive definite and\n",
|
||
"symmetric. This defines also the Hessian and we want it to be positive definite. \n",
|
||
"\n",
|
||
"\n",
|
||
"We denote the initial guess for $\\boldsymbol{x}$ as $\\boldsymbol{x}_0$. \n",
|
||
"We can assume without loss of generality that"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{x}_0=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or consider the system"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"instead.\n",
|
||
"\n",
|
||
"\n",
|
||
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This suggests taking the first basis vector $\\boldsymbol{r}_1$ (see below for definition) \n",
|
||
"to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n",
|
||
"which equals"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and \n",
|
||
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"We can compute the residual iteratively as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which equals"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{r}_k),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{r}_k,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which gives"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\alpha_k = \\frac{\\boldsymbol{r}_k^T\\boldsymbol{r}_k}{\\boldsymbol{r}_k^T\\boldsymbol{A}\\boldsymbol{r}_k}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"leading to the iterative scheme"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{x}_{k+1}=\\boldsymbol{x}_k-\\alpha_k\\boldsymbol{r}_{k},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/var/folders/jy/g42mrgv128v34gnnhxwk9nrc0000gp/T/ipykernel_42573/483257001.py:18: MatplotlibDeprecationWarning: Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or plt.subplot().\n",
|
||
" ax = fig.gca(projection=\"3d\")\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fad10f9a280>"
|
||
]
|
||
},
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPcAAADyCAYAAACRQVPgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAC8p0lEQVR4nOz9d5Rle3bXCX6Oud6buDcibnhvMiN95ntVqlLJCyEJAYIWDD0qdTPQGgTqFtDTAvWoZ9bQM4CYhtU0vZolYQcrSiABErKo7HvpM8N77831/rj545iMzJcmMl++V1WvYq9VK19F3HvuvXHP/u29v/u7v1swDINzO7dz++SZ+PV+A+d2buf20di5c5/buX1C7dy5z+3cPqF27tzndm6fUDt37nM7t0+onTv3uZ3bJ9TkV/z+vE92buf20ZvwUVz0PHKf27l9Qu3cuc/t3D6hdu7c53Zun1A7d+5zO7dPqJ0797md2yfUzp373M7tE2rnzn1u5/YJtXPnPrdz+4TauXOf27l9Qu3cuc/t3D6hdu7c53Zun1A7d+5zO7dPqJ0797md2yfUzp373M7tE2rnzn1u5/YJtXPn/jqYYRg0m01UVeVcWvrcPip7lVjDub1l03WdZrNJvV53fiZJEi6XC1mWkSQJQfhIZvfP7VvMhFdEjvOw8pbMMAxUVUVVVer1OqurqwSDQaLRKB6PB8MwHKduNBqEQiHcbve5s39r2EfyBZ8798dgdhqu6zqHh4esrKzQ3d1No9Egl8tRr9cJBoPEYjGi0SjLy8v09PTg9/uB88j+LWDnzv3NaKqqsr29jaIolEolms0m4+PjT0VqwzAolUrk83lyuRyFQoFYLEZLSwvRaBS3242u687jZVl2/nfu7J8IO3fubyY7nYavra2xtbVFX18fnZ2dADSbzRc65dTUFKlUilqtRi6XQ1EUwuGwE9ldLtdTQJwsy05kF0Xx3Nm/+ewj+cLOAbWPwHRdR1EUNE1jd3eX7e1tWltb6erqAnglQi6KIsFgkHQ6TU9PD7quUywWyeVy7O7uoqoqkUiEaDRKNBpFEARUVQVAEISnIvu5s3/r2rlzv0UzDANN01AUBUVRmJubQ5Zl+vv7aTabz328IAiomoYsSS+8riiKjiMDaJrmOPv29jaapjm/j0QiACiKApw7+7eynTv3WzLDMJxoXSgUmJ2dpa+vj7a2Nvb392k0Gs5jBUFAEAQngv/5//n/4Mf/0HfxzsSw8/uXRXdJkojFYsRiMQDnNXO5HJubmxiGce7s53bu3G/D7N61ruusr69zfHzMlStXHLT7Zc5qGAZfeTjLb3zlPn/jZ36CP/a9n37t15ckiXg8TjweB0wQz3b29fV1BEEgGo0Si8UIh8MoisLJyQnlcplMJuPU7JIknTv7J8jOnftD2GnQrNlsMj09TSgU4saNG4jiE/Lfy5z7KFcgVywD8A/+7W9ze2qB//P33vxQzDVZlkkkEiQSCcCM2oVCgZOTE1ZXVxFFEY/HA0BbW5tTRtjv1QbnZFl2soxz++azc+d+Qzvduz45OWFxcZHh4WGSyeQHHvsy515Y23H+e+8oy/TyBkfHx/zsn/7jjIZCb+W9ulwuksmk894URWFzc5NsNsvDhw+fSvNDoRDNZtMpI0RRxOVyOZH93Nm/eezcud/AbNBM0zSWl5cpl8tcv37diYbP2suce35tG4BIMMBJoQTA5v4JP/qX/gb/21/9ST53Y+Ktv3+Xy0UkEkEQBPr6+mg2m+RyOQ4ODlhaWkKWZcfZg8Gg4+yCICCK4gfS+HP7xrRz534NO52G12o1pqenaWlp4dq1ay+NZmdx7kw6TqFcAeCkUKZQrvJ3/8V/4L3H8/ylz/8RXPJH91W53W7S6TTpdBrAYc7t7u5SKpXweDwOQGdHdhv9P3f2b1w7d+4zmt271nWd/f191tbWGB8fd9pTL7NX1dwAQZ8PgFDQT65kOnm5Wud/+5f/ke2DE372T/8xOtIfTPk/CvN4PLS2ttLa2gpAvV4nl8uxs7NDuVzG6/U6AF0gEDh39m9QO3fuV5jdu15eXqajo4P5+Xk0TePmzZu4XK4zXeNFzq1pOvfmlrk2NoBhkQE7UnHmrAi+d5wDYP84x/f+X/5H/uZf/K/4g99+4619rrOa1+ulra2NtrY2DMNwnH1zc5NKpYLP53PYcz6f7yln1zQNSZIIBALnzv4x27lzv8RO9663t7fZ29ujq6uLTCbzWqDS85y7XC6zfZilWK5yf3aZz924iCgKhAJWBA/4OMkXzcdWaxQrVX7xV36T33n/If/Pn/ovncd9GHsTYEwQBHw+Hz6fj/b2dgzDcGiy6+vrVCoVAoGA4+zFYpF6ve6w82yAzubFnzv7R2fnzv0CO9273t7eplar8alPfYpgMPja1zrt3Lqus7i4SD6f5yuPF53HvP94npHeDkTL4dqSMUqVGmCi6PZ1fvm3vsLW/jF/8fN/hHcvjXzYj/mhTRAE/H4/fr+fTCaDYRhUKhXy+Tyrq6sUi0VcLpdTt3s8HhqNBo1GA8Mwnkrh7dbbub0dOz82nzEbNGs0GiiKwuTkJOVymWAwSCAQeKNr2s5dq9W4e/cuHo+HK1euUDPMs7U1GaXeVJhd2SJfKNKZiuHzmCl/NBQgWzD74OWq6ey6ofPH/+L/m7/29/8ltXrj+S/6dTJBEAgGg3R0dHDx4kV6e3uJx+NOaXP//n0WFhY4PDx0MIx6vU6lUqFQKFAqlajX6+cqNW/BziP3KTvdu87n88zNzdHf309rayvvv/8+uq4jvYQD/iITBIFarcaDBw8YGxsjFouZ3HMLKW9Nxtk/zgOwcZCl2VRoTUQBiAX95IsVwGD38MR6o+Z7/dL9aX7jy/f4m3/pv+bdS6Ov/Vk/LvN6vXR0dNDZ2fnUeOvi4qIjTGGn8YIgnKvUvCU7d27LTqfha2trnJyccPXqVXwWii2K4hs5hH29SqXCpz/9adxut/O7udUtALxWlG5Pxdk9NFPwk1KVK6P9eFwya7tHRIN+8haKfpy3EXYvM0sb/NT/6+/xXe9c5q/8mR8jGjp7dvFxOMrpuXX7NcPhMOFwmK6uLnRdp1QqkcvlmJub+8B4q30w2tc4d/az27e8c5/uXTcaDaanp4lGo8+lkOq6/lrXrtVqTE5OOj3i046dL1XoSCXYP85Rb5jUz1Q8ajm3we5hltXtAz5zZYzB7nY8Lpn88gaAE+ULBRNwi0eC/PP/+Pv83u3H/Nyf/RP8oe985xvmpjcM46WgmSiKRCIRIpHImcdbz539bPYt7dyne9fHx8csLS0xMjLicLJPmyiKr+Xch4eHLC0tMTY2hsfjYWFh4anfz65scnt6ifH+TgpWRPa6zQieikc5zOYBsx22tn3Ad96aYGZlk1Q8wsGJ+TvFejsel/U16ho/9df+Hv/43/0W//NP/zijAz1n/2N8RPZs5H6Vve5462ln39/fJ5PJnDu7Zd+Szn167lrXdZaWlqhWq9y4ceOp6HraXjWGaZuNhlcqFed6tVrtA8+dWdkEYH33kLDfR28mTb1h9oaTkSCH2TyCAJt7R2i6Tq5YYqSng2g4wMGJ+but/SMAJMn8GtvTLexni0wurvP9P/nz/MC7E/yZH/1eOtvbiEajyKdYbh9Xzf26zv2snXW8NRaLsb29TVtb21OR/VtZpeZbzrlPp+HVapXp6WlaW1sZGRl56Rd/lshtp+GpVIrh4WHnes87GGzn7mptYW51C4/bRWvSvIHdLhO060wn2dw7BuAkX2Jt54B3L41wfXyQ/eMc25ZzH+WK1vPMr7OrPcXixg6/9uWHPF7Z4Q9/7jqfnRhAlp84ymlNto/SdF1/q73sl4231mo1Hj58+NR4q6ZpDvJuz7J/qzj7t5Rzn07D9/b22NjYYHx83BE0eJm9KnKfTsPtKPOy59rOHQqYM98uSeK9x/PcujhEsWS2vlpiUTb3jpElka1908kbTYUHcyt8+7UL1BsNCqUKOwfm72pW5I+GzF58PBpkY/eQv/3Pf53HyxP8F9//GTo7gxweHnJycuK8r3g8TigU+khu9A8buV9lp8dbc7kcExMTHxhvtZ09FAo5zg6ffOGKbwnnPp2Ga5rG3NwcADdv3nwqVX2ZvQgtf14a/qw969xNRWVpY9d8b1Y20NlmRvDbU4tc6OsgFY/gkq0I3trC2s4+8ISL3lAUGk2VT10Z5Yt3pwGcWty+P9tbkmTz5kHxtUez/Oc7j/nD3/0p/vj3fZbB3l6q1Sper5ft7W2HM25H9kAg8FZu9I/auZ99reeNt+ZyOY6OjlheXv7AeKuqqp9YlZpPvHPbFNIHDx7Q19fHzMwM3d3dZDKZ17rO89DyF6Xhz3vuaedeXN9moKuNudVtZ8wzHHwyODK9uk3A58FtcdfjkRBrO/t43C62D8xed63RpFStUak2GOvvoqEorGzuAVCyyC5BvxeAjtakk8LfmVzg3/7O1/jhb7/Jd9+6yB/5/u+gtbX1uTRSW0s9Fos5LcHXtY/TuZ9nLpeLVCpFKpUCeOV467PCFd/MKjWfaOc+3bvO5/PMzs5y6dKlN2KaPVtzvywNf9aede7Hi+ssru9yc3yQh/Mr5nvVzN93ppPMljep1BrMrG5w8+IQomjeUJ2tLSxvmhF/3xoqkSSR2ZVNRno7eOfSCPdmlti20nRV0wBIxSNs7x/h9bjZsYgwc2tb/NoX7/ClRwv84Lff4rvfvfIBGmm5XCaXyz1FNonH48RisRcCj8/ax+ncZ3mds463vsjZn+XFfyM7+yfSuU+DZoqiMDMzg2EY3Lp1643BHdtBz5KGv+i5tj1eWEPTdY7yRa6M9vNgdoVja0gkbA2ERII+TvIlTvIlPnVphL6OVmJh81AKBXxOCl62+OfhoN/ip2dwuWQmF9fJWVmBA7S1tbC4biq/7B6Zh8Pa1j6f/yu/wB/47A2+590r/Mh3fRqP24UgCIRCIUKh0FNkk2w2y87ODpqmEYlEnKj3ovLm43LuN0X/XzTeerpUeXa8tdFosLu7Szqdxu/3f8NKUn3inPs0hTSXyzE/P8/g4CD1ev1DobaiKFKr1VhaWnplGv6sPevcU0trACSjYe5MLzHamyFn8ccV1Yy2bckYhXIVDJhZ3qRSq9PX0YogCHSkkya7zTCcNN2+vNvl4vHiGpeH+xxGm02SsYG2VCLKoXU42Gy3bKHEz/z1v8+//k9f5t3Lo/ypH/ouB723P79NNunt7f1ASwpwnCASiTg03Y/Lud8W+n/W8dbDw0NSqdRTKjV2ZP9GmWX/RDm3Haltymcul+PatWt4vV6Wl5c/1I1WrVbZ399nYmLilWn4s3bauVVVY3rZdIZy2Yys1VqDhqIw2tfpjHn6vWZGkEpEODwxHXD74Jih7naSsTAALfEIR1nzd3kLYfd5TamnXLHM9sExtyaGObIIMfZHb03EODzJWyi8WYvbGQAY/C//+Ff4D79/m8Hudv7UD30nn7l28QM36rMtKUVRyOfzHB8fs7Ky4tSyp3niH6W9ign3Jvay8dZarcbjx4+fGm89Pcv+Uz/1U/zcz/0cIyOvN7knCMI/AH4QODQM44L1s78J/BDQBFaAnzAMI/+qa30inPvZDZrT09PE43Fu3LjhOLNdM7/u4IedhpdKJQYGBl7bsZ99n7/71ds0mmYkVQ3zZowG/WzsHVGp1hnpaQdMRB2grSXuOPfm3hHVeoNoKMitiWHq9QZH2YJDdjn9vJZ4hI29Q2ZWNhAReOfSCMVyFQC/zzwA2lvizvPsdpqimJlDNBTg1790h/szS7hkiT/2fZ/lj37vZ+jtaH3uZ3O5XLS0tNDS0gI8qWX39/eZm5vD7/cTi8WIx+NvDYk/bW+7n/48Oz3euru7y7Vr16hWq854a7VaJRgMsrKyQjabxev1vsnL/CPg7wL/5NTPfhv4WcMwVEEQ/jrws8D/7VUX+qYf+bRBM1VVOTo64uHDhwwMDDAwMPDUDfS69FHgqRHN9vb2N5oIgyeR+8GDByxu7NDdnkIUBDb2DgEcYcWeTJrJ5S0GMilyRTOqY4FimVSCqjXeeZQrcHtygVgkRHd7io500jkw7FaZvcGkI52kWKnx/uN5ytU6Ny8OOw4cCZo99mQsfGooxcwcbBCvNRlje/+Y/+Nf/Uc+86d+hh/8b36Of/Krv8XO4fFLP7Ndy0YiES5cuMDQ0BCyLLO+vs6dO3eYnp5mZ2eHarX6VthyH4dzP2v22id7vPXmzZt0dXWxtbXFwsICP/RDP8TnP/958vn8ma9pGMaXgOwzP/stwzBU6/++D3Sc5VrftJH72d710tIS9Xr9hSDXh+GGx2Ix1tbWXvtwsK1QKFCpVBgYGGDny9McZYt8+vIYX344A+DolkfDZk28c5zD53Uz2teJqps3fsBrflWSKLJpHQqFUoXt/WO+4+aERUkVHKS8UjPT4UjQBOHakgk29w7Z3DtkYqiXy8M9zva5tpYEx7kiLllyWmalihnlfR7zb9nZ1sLC2jaP5leYWd7gZ/+//4Af/o53GRvo5vs+fZ3Bnuer09il0LPpbaVSIZfLsby8TL1ed8Y+Y7HYC1VkX2YftXOXKlWHcATPB/BsEPLP/bk/xxe+8AW++MUvMjc3R+gtSVRb9l8B/+osD/ymdO7T8keVSoXp6Wna29sZHR19Ybp3Vud+ERp+Vm75s+9za2uLnZ0d/H4/6XSaR/OrVOsN6o0Gty4OcX92mfVd01kNy5EzLXGWt/fJFsp85uoYsiQRi0Zgc59MKs6mxVbb3jtE03UK5QrJaJj+rja+dN8ktNhOrlvXTCej7B2f4HHJTC+vo+sGlwa7uTUxgiSZTtHZ2sLq9j5gOM+303z7kOhsbXEOly/fn+bX/vN7/OZX7nKUK/BHv+czjPZ38anLYyRiEedv8Ox3Ygs6BINBOjs70XWdcrlMNptldnbWmQQ7vdX0LN/b23Tu41yB9x/OML24yq/97lf5vs/c5Of/wk+c+fmKouDz+bh27dpbe0+CIPxVQAX+2Vke/03n3Kd713t7e2xubnLhwgXC4fBLn/dhuOFnff5pU1WV2dlZBEHg5s2b3L59m6aiOrRTQRK5PbXIu5eGmVxYR1FVslbryiafRIIBvvxgloHOtlNOGmNz/5iAz8NR3nx8Nl9g9yhLLORjvL8LRdVY3DBbXnZWYM+Md7WnLHacwerOPqVqnVsXh3nn0giSJLG6vU9LLMpRLg/gTKfZYT4Zi7C5d0g8GiJrvf5hNs/OwTFfezjD3/knv8KNi8OUylU+d+sSIY/E97h9jA30vvTgtWe8e3p6nEmwbDb7geGQaDT63PLowzi3qmosrG0yt7zB1x5O8WBmkbXtfZqKQl9HO2vbe1wY7nvqOR93y0sQhB/HBNq+yzhjlPmmce7ToJmmaczOziKK4pkppK9yzleRUl7HucvlMpOTk3R1ddHR8aQ8ml/bcmrjvOV0qqoRDQVoTcbYsCK4Zr1OV2uSqeUKy5t7pOIRbl0cxl6Z3tWaYm7VPChOCma97PF4eDC3Sl+mhfHeDOt7R06UtdthsbCZIiYiYU6sefD94zwbuwe8c2mUa2MDBP1evngvj8ftYsdqtdljqXbPPJNKks2X8HrcjkKMfZCIosj82hY+n4cHs0v84q/+Lpqqc2Gwh8ujA/R1tjHc20lvR6vzfk7bs5NgqqqSz+fJZrOsrq4+9ftwOOx8N69ybk3T2Ds6YXljh6X1bfaOTnj/4QzBgJ8v35vk+sVh7k3N09vRRlNRcMkSG7sm7ffiKed+lW+97fafIAjfjwmgfbthGNWzPu+bwrlP966LxSKzs7P09PTQ3t5+5mu8yDnPSko5q1jD3t4ea2trz80mHs2vAmbdvL5z6Fx35yjLQFcbl0d6uTez7FBS/T4zgtvtsMNsgc9cHaM9FXfoqi2xiAOiFStmnd2SiPP+5DwDnW343C5mVrfY2jsAQNNU55onhSJuWWZr33wvxXKF2ZVN3rk0Qm8mTXd7mvszS5QqNbYsVN0G9QLWezOJMdsmYm8dTmWrXvdY6XR7S4LppXUmF9f46oMZ53mbe4d8+41L5IolblwcQRCguz1N0O8jEQ0TCQUIBwIE/B58Hg+t7Rk6urpQFZVcLsfa+ga5fAEEAR2BSrXOYalBrlCiXK2xtXuAbhg8mlvGJUt85f4kXrfbOaiSsQjHuYITlW0QMhmPsLa9R3emleX1HXxeD/2dT+41W675ZfamDi4Iwr8APgckBUHYBn4eEx33AL9tXfN9wzD+m1dd6xveuTVNY21tjVgsxtHREQcHB1y+fNnZoHlWe55zn5UbDq+uuXVdZ2FhwQH1nlcnzq5uMTHYQ7XRcGiktiPHw0HuTC1y8+IQk4vmIdC0aI/tp9ph92aW0A2Dsd5ORFGgvSXOUa6AKAhOlLafFw0FuTezxEBnqymVXCg7fXTR+iydrS2sbJmcdLvn3VQU1nYOaIlHaTQVPnV1jHK5xvTyOntWlFasyaqIRYzpbE05zv3sQeC3WkId6SRz5U08bpfzWlv7h6xu7eH1uLkzOc+Ni8PcnZqnr6ON1a09kxgiyzQVheHeDhbWtrh1aZTbj+e4cXGEu1akXdvaQ7IQfk3XrcPjyIrGC7xzaZRGU2Ggu4NCaY14JMRxroABHwARRcHMAOKRMLDD+EDPU878KudWVfWNOyuGYfyJ5/z4l97kWt+wrTAbNLOJ/tPT0zQaDW7evPnajg3P54Y/ePCAoaEhentfXA++6PmnrV6vc/fuXbxeL5cvX34hAPS1R/NMr6zT12Hyms20z7yx7Jq6WK4SD4foSMWdpQReK5voam2h1mjSaCosb+3R19HmIOxd7SkH/DrNOweTT/1wfpW+zjaSlsKJfUx5rdnxZCTkSCnb7DUQaCoqtXqDycVVMqk4vR2tjPV3O4eE/VdrsQC0VDxK0XKSvWPzILA57mELlOtuT2MYBpIosmUdSPlTKT1AImpmPV1tKeewsg8PO/I6j7Veuz2VQNN1ZEl0OPQ71vWrFpkm6Dcznkyr2Y9PxaIWTddwspuitRTC/mwXh/s5bZqmvbQEsLXbv972Dencp3vX2WyWo6MjWlpaGBkZeWPQRJIkdF1H13Xm5+fZ2trixo0bZyalvGjk8/j4mPv37zM4OPjSQ6Jab7K4sYNhQL5Y5frYIINdbc6Nf2yl1pFggN2jHOVqna62Fuu5ZgRsiZs3scftYnP/iOWtPYrlCrcuDjtU0aDfy66lc247q73AoNFUuDe7RF9HK16rxRWwdNjbUqa0lMclO0h51qKm2ul1OBTkztQCy5s7lCpVblwYxut24fd6nF1mrS0mYy0c9DuHhM2Qsw9HW8Sxuz2NomoIAmzsPu1Y9sFkf+aO1hZq1ubRTeuxBYuVJ1n3RMw56FrRNB2XLHFoMfhOrL9v3vpMbmuctj1tfu7WZMIh+djXzxXLSJLIpdGBp77LV5Gh7Im6r7d9Qzn3ac1wVVVZXl5mbW2Ntra2V6LhrzKbG26TUq5evXrmySb4YM1tGIbz/q5fv+7QMF9kyzuHzuFwkM1zb3aZeCRMazKG12M6KzxJd1PxCHemFrkw0E3RclLZuuG721JOpN8+OOH21AKSJHJ1bIBO60DAwEnTNesAseWSD7N5Hsyv0p6M4fO4cckSAQuh7znFQLMFIk6yZibgtzTeuttSnORL3J1e4N7MIk1Fwe1y8c7lUZLRMKIo0NFqzlO7ZOnJYWGVIIKVPicsGm1nW8oCGg3HsUpl6zNbh0baeu8d6aRz2Nmfzxa3sIk3TtTPtKLpOh6Xy8mCqhawaOu9q4opcNESN5+TSSdpbYlz6/IYfp8Hj1tmfLDnqe/yVWn5eeR+xuw0XFEU6vU69+/fR5IkZzWufYO+qVWrVVZXV8+chj9rpyN3s9nk/v376LrOtWvXzkS6WNoyb9qAz+NQPmv1BpV6g1vjQ46z2tNefosjfpjNk82XuDra72wBjVrTYfFw0AHTTnJFHswuk45H6e9soz0Vp1w1U1Gbf25H1642c7Z59zjHncl5QgE/Qb+XWDjoRNXO1hYH2c+VzIhWqZkO55bN28ZmzamqztTSGu8/miNXKluSUXHeuTzGaG8HkaAfURQ+kILbETcZtdPqpEm+MXBAPpvzbpc6aStDyaSTVK3H2k5esj6v7eRxC4nvyqTRdR2vx+3U1wUrSgeCIcYHewgFvPR1pIkG/axs7LJ/cMyj2SU0TWe4r+up7/JVzm0vsfh62zeEc+u6TqPRQNM0Dg4OePjwIUNDQ/T39yMIgpNSv+m15+fnKRQK9PT0vDE33I7c+Xyeu3fv0tXVxdDQ0JnLhJOi6Zi9mVbnkNg/yVEqV6k3Fd6ZGCYSCji1ou1Y7S0JipUqD+ZWCAV8xMJB5yDInNr6abfRipUaK1t7jPR20BKLmODVgTUcUn06TW9viVNrNMkWSkwtblCu1ggF/Az3dpKy0uFYOOhQUit1M8rZwg0hv3kARUN+Z7z04DhHrd6kUK7w/iOTkJIvVRjr72G0v4t3Lo0SDQcZ7O5wZKHc7qcdN90Sc1Jk2xmrtWecPGFmSu3pBJVqndNLG+ya3M4QYuEgyViESyMD3Lg4wrtXxolFQsQiQTZ29phZWqNcbbK6fUDQirghqzbvbkuxu7NDsVh0vrdX1dzlcvkbInJ/XdHyZ1VIFxYWaDabH9igKYriG0Xu02i4vYjuTU0QBIrFIoVCgStXrrwWqGcYBl+bWuX6+KDTJw543exYCwjK1Sozq9t8amKYpc1djnJF9q061WPd+D3tKe5OLxENBZyfBawBEBsZhif1bbXepFiu8O7lMe7PLprtrGdEHBKRELuHWSLBAAcnZtq6vrPP8uYun7s+wa1LI2iaxr3pEh6X7CDcdoSMWmhyJt1CvrSBz+NyHOzASoMd4M7j4t7UIh3pFrYPzIMoHPATCvgQBYFLI/20xCK8e3kMv89LZ9rk31dqdVKJKAbQnUkjCgJd7SlCQT/9Xe20pxLEI2FkQQABvB43oihy4+IwsiTS0doCBhxnC/R3tnNnco7R/m5mV9aJBAPsF8zvwMkUrAMwYFFNb1waw+12s729TalUwu/3O1rpL2p32QMkX2/7ukVuu3etKAqVSoW7d+8SDoefizZLkvTazv0sGv5hor9d/zebTW7cuPHaaP3G7iGFSo17M8vomkos6KenPeX8/sAe2ywWqdYbTAx0krMivZ2W2mOe9WaT9x7PcXGoB00zP09LLAqYqfzmqRHOhqKaIJQBn7k2jmKh6ceWWqrd17XrdEkUHWDruFDk9uQ8siRxaaSfW5dGnbTerott/nrIQsF7O9oAs862MxA7AtsD56mk+V5bk3GKlSqlSo251U0ez69wcJzjvYezVKp17k0v0FAUZpbXzcxiYZWNnQPmVzfZ3D0kly+ysrGLqmhML66iqAqP5lfYtphy96YXeTCzyPb+oTOEo1vvIWwNzHRa30GLjZgbsLFzYH0X5nOujg/T1tbG2NgYN2/epL+/H8MwyOVy3Llzh5mZGXZ3d58abf0wNbcgCP9AEIRDQRCmT/0sLgjCbwuCsGT9e6b08+vi3KfT8O3tbaanp7lw4QKdnZ3PPQlfx7lfhIa/yVQYmCnWnTt3iMfjL6Q+vsruzixZ/2UwvbyJIAlOCpqIhji2aJyyy02l1qDeaDLS3YpLlhxhRHv7Z097Gl03mFpcZ/fohFsTI8jyE6DNehnHyXVdp1StUarUkWWZdy+PkrWYabZz2nTX7kzKEYt40vNWeTy/Qr2pIAgCn746zmh/Fz6Pm21HkdVMr+3Bih6rxhUEOLQOkqyV2itNE8hKW07eEos4Kf2OVT7Y+u32bHrGQrSTsYgJyhlP3p/9GeyDJ5000/WuthT1RtM8sKy/4bF1iKrWfRC0DumMBf61pxOUq6bm+br1nImRJ20we+QzHA7T2dnpTIGpqsrCwgJ37tzhV3/1V3n//ff5EPaPgO9/5mf/A/C7hmEMAr9r/f9X2sfq3DZoZm/QnJqaolgscvPmzZdOzpzVMV+Ghr+Jc+/u7jI5OcnFixdJp9NvHPlvT5rbRloTUcq1BrlihZNCiVsXh+i062bDcFLrYMDP/MYBwz0dTu1r3/geqy+diIbZOTzh9tQ8AjDe30XIYq21p+JOxLQBN6/HRbFc4SRfREDgynCv8xi7P26jzOlkzKlb7XQdw6DeaFKvN3kwu0w46KOjNcmtiRFU60CwabNRG8hqM1tdGHBgkXCsZAPN6grEIxY4GAk5GcWuVT48cXLz8LExhpb4qd60lU5X6raTm3+flIWud2fSNBUVt0tm0+pjHx6bqXjTwjW8FiDa2mIeIt3tabweD9cvjnwATIMngJo9BdbV1cWlS5e4fv06XV1d7O3t8c/+2T/j5s2b/M7v/M4Hnv8ye97IJ/CHgH9s/fc/Bn7kLNf62Jz7dO+6UChw9+5dWltbuXDhwiuj4Vki96tIKa/j3LquMzs7y+HhoXPwvOkiwHw+z8NZcw93p0WcMAxY2drn9tQSiUiIgM9LW0vcmakuW9HI63GzdXDCO5eGObEQZs0C02JB84YUBYFH86vMrGwS9HtpTcZIJ8yswON2OUhyxaqTY+EQxUqNvaM82ULJmu9WnWsBtFvRL+j3OiIOdhvL5XoSIacW1phZWmdqcY10MobP4+H6hSEHV7CJLe3phBVhn4BekmyWXiGrNo2HzCgaCvifrFI6Mh/7bCS3e9Mpx8lh39KEK1kH1hMyjPkeujNm79vn9ThR375+rV4nGYsQj4S5dXmM7kyaQqmMrutORnDaXgSoiaLIlStXuHz5Mj//8z/P7//+73Pjxo0PPO4NLG0Yxh6A9W/qFY8338/beOWX2enetU0lXVxc5MqVK44o3avsZY55VlLK60T/O3fu4Pf7uXTpktNnfd1FgIZhsLm5yf1Hj9k4yDGQaXFkjnozaadNtXucJRLyM9Tdbr0ObO2bN50oCGi6TrZQJtOSpKc9TdZy8qTVV29viVG3ItDM0jonuQLJWJiAz2ulx+ZhYKfpdnRNxEI0VY3ZlQ2mltaZGOrFZYn8eTw2I868h07X4jZF06aUdrWbbLtcocRXH85wd3qRw2yeeDREJBxkvK+D4Z4OkrEILfGoIwdlZyKqjRtY6HeH5bgBn8cB5XatxzasHrXt5G0pM5KnkzFHzvlZMoxNJY1FrGyiPUUyFuHySD/dmTSXRwcoliocZwvsHR5z+9GMc5hcGnmavGLbWUksfr//TAsvPir7SJ3bdmybRvrgwQM0TXttUOpFkft1SClnce6joyMePHjA8PAwPT09Hxj5PGvk1jSN6elpCoUChidMqVJjeefISf/slFESRVa3D9g9zNJQVG5eHKKnPe20iGzeeSwcYGV7n2K5SmdrCy5ZclDdthbzBg8FfBxkC6iazvL6NoJo7hxzyTKtp9JsG02309duyzmnl9a5O71AOhEl4PPQEos4wFN3Ju3U4s6UmUUCsVtGPRZhRBQF1ncOyOZL7B2cMLOyTa3e5DiXp7stxUhfJ5++eoGBrgxXxwcRBYFkLOK0/iJWSt/b0e58LjuSb1oTWlXrYPTZclGWk7e1xClXa0iiQLXeYKSvC5/XwzuXxwkF/Az1dpKIhjnK5lF1g/cfzbJ7cMyaNcNu1+Y2JnF5dPCF3+/HzFA7EAShDcD69/AsT/rIWmF2Gn7nzh36+vpYXFxkeHjY2QTxOvY8534d3XB4uXMbhsHS0hLFYvGlW0POErmr1SqTk5O0t7fT2dnJv/+lfwOYra8v3Z/h2tiAc0j0dqSdAZLjXJHlrT2+4/oFTvJF6o0m6xZyq6rm63a0Jrk9uUBXa9K5uezjp7u9hemlDQzgMF+iUqtTqtYI+X1kkmEOs3lc8pN2lp2m2z3v7kyate099o9zNBWVXLHExcEero0P4pIlVrf2ntofbqfXduSNWNTP7rY0azt7JvJsRVH7IJJdMvMzW0wMu5hcWCUSCjgUUrcsEY+EkCWJkb4uWltieNwykVCQcrWGSxZpNlW62lQMXWesrwNdUZgY6iUaCtDd1kJ7awuVWp1IyM/G9j6iKLC6tUejqdDX2cbq1i6hwDDwhGPenk5yeJKnsy3F1t4hsiSxvm06+aWx50fuVzn3R9AK+zXgx4H/j/Xvr57lSW89cp9Ow3Vdp1KpsLGxwfXr19/IsYGn2lgfhhv+POdsNBrcu3cPQRC4du3aC6P/WSL38fExDx8+ZGRkhK6uLgRB4M6UCaa1W+j4/dkVdF0nk0oQj5g3gNfjYm3HdoQ6kiQyMdjlpNC2I9msNd2Axwur3LgwdGq7iHmzdrUmHQQ5V6yQLZZxuX2kYlEuD/WYb/SUJHKjadbbdqstFTcRacOApY0d7s8sYQDXxgYZ7e3C43YRCwedaHp4CnA7fZ0Oy9HAcKJ9rWZNiTnjombaHw4E2D08IVsosbq1y/zqJtl8ifszi1Rrde5MzlEsV7k7tcDG7iGPFlaZXd1ieWuPycU1tnb3TYHJSpViuULKKlm6O1ppNBXcLtmZy7YBQhvh9znZ1JPnKKpKwO9loOv5W2k+ShKLNfL5HjAsCMK2IAj/NaZTf48gCEvA91j//5X2Vp37NIXUTpltp3kTXSzbbBLLh+GGP6/PncvluHfvHj09PQwODr5y5PNlkX9lZcXhmdu7peuNpjP15XGbSVI8EuT+7DLFSgWf9f77OlodR947zpErVmhaaXprIubwossWS8scEhGYXFxn7yjLzYtDTp1og2lBv9fhhpcqNfZPciBKtMQjfObaRef17FS3aT3fTnEDPq8T5bP5Evdnl6hYqfjEcB83LgyTSSWcx5w8I6xolx6JcMipf7ftVpfFdHNmwq1+cyjgdw6yfWuizJ4IC1isuA4LlGyJRR2Q79jSfG9Yj61bf6eQhQv0WmBa0O9zKLA2Im/zCOx2ok2FnRgeeGF0PkvN/aa6aYZh/AnDMNoMw3AZhtFhGMYvGYZxYhjGdxmGMWj9+yya/lx7a85tGIYDmu3v7/P48WNGRkbweDwfWpVCkiTq9fprjWg+a6cjt2EYrK+vs7i4yNWrVx053lc9/3mRW1EUHj58iKIoHzjEHi2soeo6/R2tDqurx6pxS5U6MyubvHNxmIjVH44E/U+0y1SNO1NLdLa2MNyTwawJD633Yn72vkwr+VKFO1OLaJrOWH+XE1GcnjewZjmwqmocHOep1et43C5ujPdjWIm9PaapNM33mUmZh4QsiU7Pt1St0WgqNJpN7k4vEPT76Ots453LowT9Pnwet4P4uy0gMhE1s5NkNOIcALuHTzaWwqmsw3LycDDgOPnu0dN0XDvqP5nmiltcdcNRjdGszyRaDmjN29ButbrikZAZwU+VDqVSlf6uDOFQwKSpTrxYb/wsaflbFkV8I3trzi0IApqmMTMzw9HRETdv3nQi2MvS2S/O7TmI7vPMVkppNBqvlYY/a3b0V1WVR48eUa1WuXHjxpkX3D1PrKFUKnH37l3a29ufO476tUdzHGYLnBRKBKwlA3abqD0V5zhf4v2pRQf0sh0fnqz7kSSBhY0dPnPtAoqFO5zk7eWB5qGQTkSZWtpgdsUUQuhsTTqEkq62FqpWOrxn9XclSaJUqVGqNqzRzSE8VhYhSmaLykbD0/HIEzDNcgQ78sYiIVa39jjJFXm8sIKqqQgCvHNpFK/XTSaddFpJNlHkdEq/94zjPnnPppNHggH2j+wa3+59m5/F7n3bo6otsYhDQNk4dRgBTopsk3VioQDxSIjLo32M9ndxcbiP3cNjVjZ3WF7f5vH8MheHntZMO22vknT6RE6FTU9PE4vFmJiYcFpIr0KpD4p1/uw//CrluvKB39lpuNfrxefzvVYa/qyJougAfK2trYyNjX0otcy9vT2mpqaYmJh4YUvvq4/mARMIm13f4+aFQWduu8O6KQEezK9QqdZIRM3TvjUZc8Y87emleqNJLBzk8nCvA7TZTmGTO9yyi689mmPn4ISAz0syFnZGJU9HQ3sqK+D1oKga+WKZ+bUtBrraCQb8+H0eJ+q1W+2wVDzizIfb0c4mv8Qs7CCTTjK/usX7j+a4N7XIzsExqqoy2t9NOhHj1sQIF4f6aE3GiEdC7FuHje3kTSeSm05o00Oj4aDTFnMGSSzSitfi2cdtQK89Ra3ewCVLbO0d0pqM45Jlbl0aJRaNMD7YS2uqhWy+hKpq3H48y0k2R75UxutxO1nK5bGh536n8GoJJU3Tzrwa+qO0t+rcV65coaOj46kP/ioCyvdcaOfLCwf8D//qLuvHZefnr6uU8irb29ujWq0yMTFBW1vbG19H13Xm5ubY39/n5s2bL0RFG02F+7PLgIVICzCzuonf5yUSCjxBzNtTlKt1StU62wfH3LgwSEfKBHfMVtn+k89wlKPeVLky2kc0FHBqWLut1duRRtU0dN3g0fwqpXKVaChILByk23IUURAcSmvdApXi1qFSrdd579Esum7g97i5MPhE27zTiqaJaNgRQrTrdTuatsSjAHS0tVgIucH2UZa5lQ32j7PcnpynqSjsH+fIpJO0JeNcHhmgvSXBrUujBAM+bk6MEPB7uTTSTzoeY6Svi/GBHga7M1wY7CEWCTHc24nbJXN5dACv18OtS6OEgz5uXRqjv6uDkf5uLg73m4Spcpn3Hs1w+/EcM0trzCytOb16ewKso83MmDKpBIZhEAsHUWplCoXCcwPTy+7Ft7Fg4W3ZW3Xu531oWZZRVfU5jzYtFvDwzkCKx5s5/ujf+V2+OLf3Rmj4i8zuOWezWfx+/4dqUei6zr179/B4PFy+fPmlp/PjhTUnEtt1aF8mzeTiOh6XTKFo1p9el/kVuCSJ1Z0D7s4s45Jletpa6O1IO9HZnvOOhgLcm1kmHPI7iwHzRXvO2/xs6WSUk3yRhqKyur1HrdGkrcWMlr0drU7EtafSbHCtreWJGstXHswwvbROvdHk1sSIUwJ0pO2+ut/hxNu1dKVsOn3CIoy0pRJUrJLABrLsHn7A52XvKIum6TyYXWJ+dZMv3X3Mnck5ZpbWeTy/QrZQZH5lE03TWdrYRpIklta3yZfK3Jta4NHcEvem5rn9eJbDbIHbj2bNQZSVDWRZQtN1ejvaLIe1MgUDJ223MxjbbMT8+sURZ2XQvXv3mJycZHt7+8zbUb5Rtn1+5M59FuroD1zqYK9QIxH08Ff/1W2+MJXlypUrHyoNBxPYuHPnDuFwmImJiQ/1B8/n81SrVfr6+ujr63vltb54f4ZCucbl4V5HgNDWQqvXm6ztnXDr4iA+G0xqSzgc7bUds7XT02YSVkIB/xOBBztKRsLcmV5koLvdQXqb1iGasRBvj9vF+s4B9UaT/aMc5UqN3o5W2lriJKNPVgjZckj2lJhNbPG4XUwvr3N7cp69oyyJaJhUIsrEcB99nW3OY2xZp6a1Y9ywDouwNe+dikedaG+n1Ta6byvA2JlFLBx00nWb+lqzUnCfhVtk0iYA2tGaolSpIggCexZGYQ+o2BHXXqZgM+na0wkKpQqiKLC2vWt9fqs9ZqHt1y6MkE6nGR0d5caNGwwMmP3ulZUV7t69S61WY39/n6aV+Txr3yjR+yOnn57Fub/3YobhdBCX3mC/rPLbS3n+239+h9Izdfjr/NEODw95+PAhY2NjTs/5Tcymkc7Pz+P3+8/cq//S/RlKlRqKonHV0uCyb9rB7gyqpnF7agmP203Q73XGNiNBP/snpirnxu4+8UiAkW67jDAcSWRZfkJimVne5OrYgENMsUGs0y229d0DmqpKoVhm/zjLQEea/s5WAr4nXGvb2e1+el9HK7puOKyzk3yRvaMskwur+LweLg718u6VcXoyrbhl2anFG4otiGjxxi3lmFg4YEZ5w2DbGviw5Y6c3rflhIlo2Dp0DEdN1f58boffbmZ1PRkzG3HJEmvb5kF68IzDPll+aH5/vZk2Gk0Fn9fDxu4B0XAQr8fDrUtjXLsw7HyP9iSYvQ/M5kLU63VmZma4e/cuS0tLnJycoGkazWbzTBtSzmKCIPx3giDMCIIwLQjCvxAE4bU2C37kzi3L8kudW9d19jdXCbo0ktagQSbq59cfbfOnf/HLzO/mgbOv87FFH+y0/sNwezVNcybXbty4cWYArlKr82DOlCcOB/28P7nAcGeao5w12inbS/oSvPfYbCkJ1rV7nTlvg+NChYOTIqqmcaGvg/Zk1JFastVRbFHAzd0j1rb3eGdixGGEnU6l7Qmw/eMchgG1psLK1j4TQ71cGx/E53FbNMwngoy2bHFPptWMtIbB5o6NmDeYWlyjVm+wurXHQE+Gsf5uEyn3uAn4vA5/3hR1MOWPwZSJsifAbATednIbBbdr/FQy7tBBn/DGzc9iYw32wdjb2Y6qaQR8Xue6dvS3DwZJlpAliUxrkpuXxnj38jgdrS1IosjX7k9y5/HsBwQRT5thGLjdbnp6erhy5QpXr14lHo+Ty+X48pe/zHd/93dTq9V47733XlqOvsoEQcgAfwG4bq3ylYAfe51rfF3T8tOklD/52Qt8deWYbx9Jc1y2vghR4Ef/19/jV+9vnCkDqNfr3Lt3D1mWX5vk8qzZKX0sFjvT5Nppe+/xvKN2cmit5TEwUfC2lrjTkmq3lEIPTwpML61za2IIj7X2J30qla01VKZXt+nuaGOsrxOPS3ZAsZIVbTvbEiiqxoPZJfaOs7xzacQRW7SVUcMB/yk1lZrzvu5NL9LdkebKaD9dbSnHMew0Pxl9wjqz++FbjqCj1cby+3i8sMrBSZ7H8ytU63XqjSbDPRkCfh9XxgaIRcN43C56MmYm8gScM1izSpeSdXjZJUzG6iq0pxIOGWbdis45i7xio34xh5fe6rxvj0vm0sgA4aCf6xeGrXvIoNZocufxLNV6g629QydjGO7remrh37P2bI9bkiQSiQQDAwN87nOf42//7b+N3+/nl37pl/iZn/mZF17njCYDPkEQZMAP7L7ukz9SkyTpuSfYs9zwdEbF53pAranhliU64gFylSZ1ReNfvr+KR6/zt4brJCLPT3my2Sxzc3OMjIyQSCSe+5iz2tHREYuLi4yPjzu9+texL96f5Z2JIaaWNhy02+vxsLi1RWc6QTwcYnPvyEmZ+7taWdrY5fbkIp++NEJbMkY85OMgm8clS6xsmddQFJXZ1S0+e+0Cc6ubHGUL7Fv1csNiZXW2JlnZPuD9x3P0dbRya+JJitmTSTG5sGbqhVvsNbuGjwQC3J6cpzUZpSUWYbi30wHKbDPX+R6RikedXrVDHNFtVZgIa1t7FlfdfN9bBydUa3XGB7tpNJsEAz6GezvJpE2qrEuWqDcaVGt1dF0lk4pTrVZJJ6L4vR5a4lG62lKomk5LPEK5UkOWJTweF1fGBvF5PIz3dxIM+rg2PkQkFCCdzdGeauHh7BK6bvB4bglZkhBFEVXTOLAOWLtjYLfUTqfkz7NXEVgCgQC9vb384i/+4kuv8yozDGNHEIRfADaBGvBbhmH81utc42OvuV/EDfe7Zb57vJ3VoxILewV6EgEMA1pCXop1ha9slPmrX3jI1NbTzDvDMFhdXWVpaYlr1659KMe2aaTr6+vcuHHjuY59ltLg9+5O8f7UEqPdrY7Cp40spxMxHi2s8s7FYUfJJGFFnIDPw3tT8+RKZYJWjdjf2eZE4D0buFIUytU6n7l2wYnATatjE7aiTiISYnV7n9uTC1TrDd6ZGHGYYH0drRYxxXCE/m3n7Ei3sLS5y9LGDqtbe1wY7MHr8RANBZyb+jQhxcYRHM006+9jp8qtyZipUgrOQEauUGJhbYtqrcHtx3NUaw3uTS+SK5aZW91m5+CE1e19Dk5y7B4ccZTNU63VOTzJ4fN4HJ745NwKs0vrfOneY6ZXtphb3uD+zALZQomDk7yjzW53AXo722kqiglQWtmJ/a+NN5zFuT8OAoslpfSHgF6gHQgIgvCnXucaH0srzHbuV3HD/+j1buJBD8NtETazFTZPyoy2R1ncKxD2SGyeVPjjf/f3+KdfMU9jm/ppa5t5va/GG17knPa1VFV94QDJWer+te09ljfNtFFyexjsztCXSbN7nAfAZI4K7B5liYYDpBNRp8btt7Z51hsKyztHjPd3OYIHiWjI0SUrV+vUGk2q9QapeJQro30OsQVrfrknY6amXreLmaUN3p+cp1gqcePCkANEtSZiTupvM8Hsw6irLYVuGKxt7/Pl+1MUyhVkUeSdS6OErHFduy4OBXxOmm4j7/atkLAXBbSlnIEWO6IXK08vF7R57R1tKQc3sFuA9t+oWjWfYx9+fV3t6LpBwO91ZsQ3956uzZ/omZuHqK3N3taSIJsvmtNjm+ZW1KuvcO6PcSHBdwNrhmEcGYahAL8CfOp1LvCxRG5VVc9ESnlnIEWpppAO+9g8qdAeC7BfqHKtN0ln1M3SQZmg18W/vL3Gj/2vv8Nv/P57L6R+Ps9exJY7TSMdHh5+4bVexbYrFov84y/8uvX/TNmkubVtUokoPW1JMAw2LOS3rSXO4sYuzabiqJn6rVZPazLKSaHMzMoWlWqdmxeHHa64IOCk+qIgsHN4Qr2pMNSToa+jlXUrEklWe6y/qx3dMBAEWNk+4O7MIkcnWUZ62ui0+NmRYMDhtNupuB31ejtMKWaXLHN7cp73H89xlMuTTsZIJ6NcGx9ixJIi8ns9zgSYPTduf88pa6Cluz39gUhug4Q20NhqKcH0drRRrTeQJenJHLnVo7fPWMHu0VsEGtthBUFgbcvax2ZtGbFbjc5KoXQSWZK4OjbE1fEh3r1y4YWTYLadRbP8LVFPN4F3BEHwC+Yf8buAude5wEfu3IIgcHh4eCZSiiyJfN9Ehgcbx9zqbyEd8bK4X2I7W0HRDFojXvpTYRb38iwfFPh7D8p8eePMG02fOxl2Fhrp6c/yosi9t7fHzMwMRUUgGQ3RkU4601yapplySRcHnUhkTzulkhHuzixxY3zQiaI20CYKAnNrW9yZXiAc9NGbSdPf2eZEMXsnWCQQYHZli3pToa+jlfZUwllEYM9r92ZaHQJJvlxjfn2Par1OVzrBQEcKlyybQN0zDmc7Qm9HK6qmWf3hfQ6Oc+wennB/ZhFREMikEtycGOHGxWGGezudEiJvK6JYd5rt5D2ZVqr1hjVzbTrhkxXA5oFgrxKyiTcmPdQ8vOyJMLeVrdlAZNimrra2UK038LhdTnts9+iETDqJz+vhXUvAQRIFZEnkvYcz+LyeVwKnH5dQg2EYt4F/AzwApjB99e+/zjU+Uueu1WosLS0hiuKZ0esfudpNsa5SVzWqDZWwz0VXIsDScR3DMNCbNQwEhtrjLB+W+Tu/OcOf/QdfYb/waic/HXnPSiN90fNtszGE/f19Ji5d5t/9/l0EQWSwy+pNGwYrW/toukFD1bg+PkjA62HZQodjoRAgML+2TbXWYKj7SeQY6GpzHHJ955CN3SN62tP4vR5i4YCTCtspbHsqwf3ZZcrVGsmoySu321F2m7ElFnEOmHK9yebBCbLbjcctc2mwm9ZExMwOrPdnt6iiVlust6PNIaDYGUSt3mTn4IR6vcmdyTkkUaCpKPR3thEO+Hn38hhet5u+zjYn7bepqj0Zc+baFEkwXzP7DJAXt9D63o42dF0nHAiwvX+EwRPmm93PjkYjuF0yLdEwA51tjA90cWGgh4nhPgrFMjsHR9ybmuO9R9Ns7x/SaCrOYMz1iy+eBLPt41RhMQzj5w3DGDEM44JhGP+lYRiN13n+W0XLT6faNhre09PDycnJmUkkFzpivDvQQqWhMrWT50ZPAgwBAwjLOo92K7w7kHJ2PnUlgvzuzC57+Sp/8lP9/Ng7/S+8tj0Z1mg0ePz4MclkkpGRkTO/t2cjd7PZZHJyklgsxvDwMF+6P0ulVqdSq5MvVbg+NkC+WHYcWWkqPFxd48poH9l8kVKl5kTI/s42Hi2sAgafvjSCLIlODzsaCrBuAV/HuSJ+r5dLwz387vuPnkrT7Q0A9gIDtyzRZzHSdN28gTtbWzjKFvC6XQ45pFipUa7WEWUXO0c5roz0matt9w5ZtmrRmpVKJ6NhVjZ36cmkzXac8SS9tpH3cDCArhvIksTs6hY+r5tGo4muG+iaQSjgx+91c3Gol9aWOC3xCD6Pl1qjjqZq6IbBxHA/kiQxPtCD3+flwlAvqWQMj9tFNBSgWmvgcrnQNJWuthTVmjmyWanWaTZVRFlmeWuXW5dGeTA7x0hvB5VanbZkgr3jEzxul5Mx2Ky5l4152nYWQC2VOpN+4Udubz1yPw8Nf92FAt813o7XJRHxuUAQeLx5wmBMpomEboCi6RyX6wymw+Sr5g0V9Lj4uV++z3//L+6wflR67nVFUSSfz3Pv3j36+/vPRCN99vl25C6VSty7d4+uri5n7dFv334MmMoqMytb3Jtdpq/DRMxFUWDFYpd5XS72j3LcujjogG9uS8whk0rw1UfzJKMhGxujN/NkFHRla4/jfIFytc5IXwe3JkacNH3nyFZssYkgLbz3eJ6D4xwel4ueTNohfnS2JtGtNbrPRmm3282j+VXcHg+tyRhXR/ucPWHFkrVP3OKPd7bbvW/DEfS3B0nsfnFfhwkU+i02WKlSZX1nn6nFVXLFErcfz1Fr1Ln9aI5ytc6DmUVWt3Z57+EMM8vrLKxuML24SjZX5NHsEvWmwu1J8znvPZrhOJdnfm2brb0D5lc2ANh3xkntyTVLidXWKG+Jo2m6Odt9nEWSRK68ZBLMtrMAat8I457wlp1bUZQPoOGvYqg9z/7QlS4ebuS43BVnYTeLbpj7qUIemXTYS6WhsJOrEQ14iPrdJENeDovmzbeVLfMHf+G3+EdfWqShPnldwzCoVqusra1x9erVN2qZ2ZH7dJ1un9KGJV0kSyIjPRlrOENg6+CYkd4Oxnuf7MbKl8o0FJVsrshQVxuhgM+R5s1YbZujXJHJhXVuXRzGbdEZTdEHa4d2Ns/82g6GYXB9fJDB7vYnI51WW8eWPErGwnz10RzrOwe4ZJmLQz3OfHlfp0nDxDAcYowNPGVSCVa29tg5zLKytU8mnSAWiTDS20G9YUbyiA1OpZKOsqnNJKs/s6ygr9Mc4ggFfM5jbJTefk17yaG9vSQeCZmf69TAhy1fLDsMtYh1fZPWGwkGnHR9fccivDyzfDBt0VBt1txgVzuLC/Osr68/tRfsWfs6iCO+sb1V53a5XIyPjz+Fhr/JKqBYwMN3jqRZ3DkhGfRwoTPGXrHJ9F6FobYIxZpCMuihXFe4s3rCeCaKqhtkYn42Tso0VI1ff7TFH/yb/4mvLew7NFJVVRkdHT2zQMOzJggCq6ur7O3tfaBOn1/b4T997SGDXe2OfFIk6Gd+fYeZ1S08HhcDHWkCPg+L62Y6GAoGmF3bJuL3IAnmzWSntp3pBNV6k9tTi9QaDS4O9TjOGg74Hc21eqPJvZklQn4ftyaGnbQZnsxb23rpfq+Xrz2aZWpxHQS4Otbv1OJdbSmndWQvDrSZX/YkWK3R5KuPZplb26baUBjt66IlHmWou51I0MwWUvGI40g2JmBnBEFnI4kJXEbDQScldgZKrCk4Z6Ak82TgI1comSi4zVDLP70myC5jeq2hlo7WFPliGVmSWN0yywtHN10UuTExSqolRmd7C5+6fomxsTG8Xi/b29vcuXOH6enpD6wK+jqII76xvfU+97Mf7E2W+B0fHzMRqXNU1UGU0Q2DgEeiN+Fj87hCvtpgNBNlfq9AIuhhv1DnqFhjqDXCcbFOfyrEwn6BnVyVv/arD/mT/8t/pCGdfejjeaYoCtls1hGef3bc89e/+gCAubVtssUyA51tDHW3OxFg7yjP6s4RF/s6HMLIkcWvbksnWds75spQj8OF9rltmaIQk4vrTC2uE/B7ScUj9HWaziEIOBNnkiRye3KBtmSMa+OD+L0eB1m2b0a7j26i8Ds8mF1BVTVuXBiiv9OUEk7FI06v2ul929Ni1txzJBRgbXufudVNVrcPWNzYJRQM0p1JMdTTwcWBLoa62kzxBcNwBBDsFtiTSTDzesloxCLBPJEXtrngdpvQ7oH3dLZSqdXxuJ7UzPaQyJPlBRZ5JZUwxSZH+rg43M+nr14kFg4SDviZWljh7uQca1t7bO0e8s7lcTwejyPkcfPmTXp6elBVlfn5ee7evcvi4iLlcvmlXIdPbFoOHySyvE5NazPEVldX+fE/8Ck+PZSiNeJjajtHpaGR8MtsnFRIhX3s52pc7U0wkA6zsJcn7HOzeVJmIB2mPean0lDpbwmweFBkOafyF78wyz+5u0+p9vwxvZeZ3QcPhUJkMpnnfqbf+Mp9AEZ6Mixs7LJ1eOKwxdqSMXaOcuiGQa1pyvEOdrc5WzfNhX4C5XoTn8/HYHe7sy63xVI5EUR4//E8xUqNllgElyzT39nmoOF22y3g9/H+43kyqQTDvR0E/V6HPWYLEg50tztz4subO9ydXqRUrdLR2sKl4T7aWuJEQk/QeGe/t3Xg9FjRNBTwO+n1wUmejZ1DmqrG1PIm4XCIWr1BT3uKRDjIaG8GWYRLw33IkkRrMn5qEsxMjdtTSWeDiB2d7RLDBrFSViu1t6sNVdMIhwLUG026Wltwu13cujSGz+vhytigSSk1wO1ycX9qnkqtxtTCKvFomGK5is/rcQ6Im5fGnvo+7UDV1dXF5cuXuXr1Kslkknq9zvLyMg8ePHhuCv+20nJBEKKCIPwbQRDmBUGYEwTh3de9xtdfC8ayZrPJ1NQUwWCQ69evI4oiN/ta+OdfWyUTC5D0y0zvFbnZl0QU4P2VIzIxPxGfzEA6TDzg4c7qEe1RP9VGkYvtQRRFwQAGWyPcWzvma2s6v/O/f42/+Acv8aM3e5GlV59t+/v7rK6uMjExwebm5nNP7Y29IzweDx6X7KSGmqbx/vQStyaG0TXNmjc22D7KcZIv8alLI7hlmZmVTZYt7ngiEmJpc5eQ30tXKobX7SJozSP3ZdKsbJmONLW4SjwcoDOdZHljl0Q05DiinVrHIkHefzxPW4s5rFKu1RyNcHvAoj2VeCJEeHjC7uEJ7akEe0dZvu3aOKqqsX904kTerJUG+zxPVFsfz68SCvidx9iz0fZqonDQz+TiOp1tKebWthEwo3G9qRD0efB7PQR8Xno72+huT5GIhYkEA1TrdSRBRDcMro4NmVjBcJ9Z3nS3k4rH2D04pq+jjUezpsDF7UczDn+8qSh0tafRdN3RfLOHUdKJOOvb+/R3tTO9uEpPR5uzQPBFJkkS8XicYDBIT08PLpeLbDbrrPYNBAKsr6+/TXHEvwP8J8MwflQQBDfm4Mhr2ddthe9ps3eHdXZ2PsUQ+9EbPRyW6rRH/ciSSE01UHWDw2KdTMxPJhZgdrdIXdHwuiUkUSAT87Gdq5GtKNR1mZG2iAOsJQIuclWFX769yvf/jd/gt6a2X5hiGYbB4uIiOzs73Lhxg2Aw+EKG2q998S7351bpbEs5kWasv5NKrc7tqSWa9TrxiCmcb4sbVmqm+unnrl9walKb8NHX0crM2q5zUMATrnYiGmL/pMBBtsDW7gHdrQl6rRW8bll2lhzYU2mtiTjvT87TaJic6u72lKPZnbZ6zS2xiOPkdkquqhrvP54jGPDT09HKO5dHka3ldzZwZs9921NYoYDPKQWcBYKWtVnEnJ7ONupNBVkS2dw7olprsL61w9rWLoVSmamFVRRV5cHMIsVKlfvTCyysbvLVB9NMLqyyuLbF8sYOhXKZYrni6I7bWnED3RmaikIkFDB544bhZAH26Kj9t7GBvpsTo8+9B55nds3tdrs/kMKvra0xNzfHD/zAD/DTP/3T1KwOw+uaIAhh4LPALwEYhtE0DCP/utf5yNNy257nRLYQwtzcHFeuXPlAfzAR9PCjN7o5qTS5t5HjSrufelNl9ahMOuzFbUXeTNzPlxYOuJiJOvJFmWSI9ZMKkijgdkkkgx5OKmYqKokC60cl/tGXFvjhv/WbfHHu6Uk6RVF48OABgiBw9epVZ/j+RQy1X/viPcBskxzlSgx3ZxxQzed2MbO+h6oZZKy1tR6XzPzaNiBQbzTpbE0w0tPB0ob5Pux2ldslc29miWtjAw7SbrfFZElk5yjHxv4Jqm4w2pthoCNlgWiGwzSzW2xd7SnuWKL+giAw2ptxPkuXdTiEg08isE1DDfp9rG3tUSxXmVvdIBkNEvCZWmf2fnBbCMFGuEMBv9MWs3EFwzAfm7IOlL7OdpqKaim5mAeBXT7Y32HYYtf1dZrYRSoedcQUbWqpncbbmULsmXVEXZlWCqWy2dfefNLXdskyLlnmnSvjfPbmlQ98py+y5wFqdgr/5//8nyeRSPDVr36VH/mRHznTrMMLrA84Av6hIAgPBUH4RUEQXruQ/1gi9/MinqqqTE5OOkIIL9od9kdv9BAPuOlOBKgqOrIk0h71oRvwlaUDPjfaylHRjHz1WoX1vMqnB1Ps5sxT0+92cX/tmP50mETQTSrkZnm/iCwKnJQazO3m+bu/NcMP/63f5Hdndpz6uqOj4wOLCp73OVa3D1i3yCDpeISTQom13UNHGH+8vwtV0ylWamwf5Xj30gijfZ1OzXuUL7K2c4jP4+LGhUEEAUdSyYx2ArMrW2zsHXLr4pOhhsGujOPw+yd55td2iUTCXB3rZ7S344mskdUSsnd69XW28XBuhbm1HSq1Gu9cGnWin+2cPq/b6X0XLH02Gz9IxqLcn1nk4ewSj+ZXiIb8eFwy714eoyUeIRwwtd3APCxsGqoNFNotr7gl4DDQ1Y6m64SC/lOtPLO0KJZsjTPzb56xUP+eTCvFchW3S2bFItnYGYf9N7G58a0tcURR5MJwH5fHBvnsjctEwwFkWeT24xnefzjD1fFX97dtexWJRdd1AoEA3/Ed3/FhZL1k4CrwvxuGcQWocMad3KftY3HuZ3vd9kL7ZDL5SiGEy11xGqpOa9jLTqHJxkmZ3pYQpbpCxO+mVFOo1Or0xjyUdZmmZqBoBl6XxFh7lOWDIpIoUFc1JndKdMV9dLcEGWqLsnJYpCXkZWm/wOJ+gZ//N3f5g7/wm2wZcRLJDy4qeN5igi/83m0iQT8dqThb1mxzeyLM45Udbo4Pohv2nHOIzf0T3nu8QDwcojUZIxENObPasizx/uQiV0b6nZrWBsuGetrJlyrcnpqnqaqM9nUSsVbetrfEHY55tlDmwdwKoVCQGxeGGO7OsGNHxSPTuWzudUsswtLmHu8/nmNz75DxgW5S8Qh+n4f+TtPh3C6ZFStC2iINNg11oMtMfyu1Ou89muO9R7PsHp5QrFQJBwNcGulnYqiXS8O9XB7tdyiedv/Z6YEHnxBdwETrbSHDAwvIa1q70pp2b92K6P1dGRRVIxL0s3t0gt/rQdM0ro4P4fN6uH5hGI/swiVLuGSZe1NzVOs1FlY36W43aa+tLXF6Os6uhvsyzfK3qJ22DWxb/HIwOeZXX/cibx1Qe5Eai6qquN1u9vb2WFtb4+LFi2cGHj7/bQP87L++RzogkWmJMb9XoKFoXO6Kcm/1CEMQ6UpFEDAXym3nKuzmqtzsb2HQG6bcUJjbyeNziRyVGmxk63xmKE1vS4hEyMu91SP6k36Wj6tkoj7+xy885B9+ZZU/cqOXH3u3n7DP7Xy205HbMAy+8Hvvs32YZaS3HdHZlxVlfT/L48V1+jvTtLXEaY+HOcoWAYPJpXVqjSa3Lgzwe3cmMQwcUM0ly+wcZbnQ1+70su12UE8mzeTCGgDffv0C7akEmVSC3aMsAZ/HqbcVReHh3ApXRvq5NjZgMcJsrXEzY4iH/BzlCkRDAWfiqtFUUFWNtmQct0tGVTUmF1aRRNFxcnulUTRkZokD3RnmVjatKGoJDmbzLKxucmW0n8cLa1wbH+QomyeTSqDrMNzbiUuWLRljH+9cHiMcMJVSwiE/2XwJj8dFvd6ku93A5XJx/eIwIb+XYDCA1+ViYrAHt0uiryNNyO9laVMllYwxtbiC1+NGUVQ0TSedjNNoKo7Ci+2YUYth9+6VC68VYV+lbPo2lE8Nw9gXBGFLEIRhwzAWMCfCZl/3Oh8LWi5JEoqiMDs7S7PZ5ObNm68l2v4HJjJ84d46x9k868dlWqM+RENnaTfHcFsEl0tmYa9Aralxqy/JymGRwXSYtcMSJ+U6N/qSDLaGEXSd6d0i6YiP2d08+UqdtoiXpF/G6zK/kEw8yE6uSsjr4q//+0f8zvQ2w21RPv+ZIcRnau57c6usW7vAfLLMo6UNboz3s7xpOup4fycP5lcJ+X3IaRNQGu7pYGF9GzAFHK6O9qOoKpOLJm2yVKmiajq1pkoiEqIjnXBUU9KJKOs7B4T8Pr78YAZREBjt6yQaCtDVluLx4iqCgOPkLpfMnakFxvq7TJVUUXJGQu2/f3syRr5YxucxU3HdMNjaP2R+dYt3Lo9yaaSfWDjIzPI6TUVxHNjRR3Miebu58cQls7Jhpsq2DJLzWqkkd6cWzO9rdRNBEPB5PVRrdYb7OllY3eTWxBiPZpe4eWmUR3PLDPd28mh+maDfR6VWx9B1UokYhyc5Lg71sbq9z/hAF9V6A7/TqmtlfmWT1mSC/eMTZEli2XpP9q7visX0e+fKhTPfh68ywzDeZvT+88A/s5DyVeAnXvcCHxtaPj09/YGF9mc1WRL57HArogCHxTqq0kRQGxxWNWoq1BSNeMDDeCbK9E6eSl2hI+7nqFRnqC3C3G6Bxf0iPrdIzC/TlQhyUm7Qlwrx/vIRqgFBv59U2EvB6oPbX5IoCPzzry3zc//mLv/dF2b43bkDR93zl3/nfW6ODyAAa7uHGIbJsOrtSOPzuBGs0UWXS+LuzAqXBruczZ4+j5v5tW0ezK0SCQSYGOoh6POysG7ehB5ZZnP/iHKlRkc6QSwUdBxqsNsUKNB0nTtTCzQVlXQyQsDnZaCz3dkMYrO+wgE/s8ub1OoNQn4fNy8Ok7NQfbvVNtBtzn27ZYklyxGy+SKP51eoN5ocZvNcGRtkYqiPieFeR6bIfk+2mOKApex6erbbbo/ZEa3NajsNdLVTtQgp9oFwcPK0lnrMirD9XSao1pZKcHiSM7n6Vr1dLJuf1+szU3yPJf4QCz+hvTaaTRKxCNv7R4iiQKFU5tqFYd59Ted+mfM2m80PtfDymdd5ZBjGdcMwJgzD+BHDMHKvftbT9pGj5UdHRxwfH5PJZD6w0P517L+41ctGXmGi1YtgGEweNvjUQIpYwM3MdgFBgKjfTb7apKclzMPNLBc7YiSDXoo1hZH2KI+3CxiGgc8t4ZIERK2JDvS3Rrm9ckQi6CHsddERD7C4l8cliWwcm2jsYaHG1E6Rf/TeBu/833+F/+nf3OELX53lzuwq74z3U6yYoJ7X7ebB3CpdrUln4f1QVxu6YfB4eRNF1ehqbWG0r8Ohh24fnjC1tMHNi0OmYINhsGcBRB2tSe5OLyPJEkG/F1EUHH70YJfpyNV6g7nVLSRJpDeTxu/z0N4Sd/TE7RVGiWiYncMTdo+yHGYLXB7pczaK2ISSoZ5ONE1HliQHcT88MbEEEXj/8Ry1uunsA13tBP1erl8YxrC+e7u9ZItEBP3eJ/PU9k5va0ItYVFfB3qecMLXt/cx+KAqqj0M02Fxwfu7OqjWG4QC9vJEgw2LR960Dt+A9V68Hpnuthb6O1q5ONTH5ZEBNnf22do9YKC74/VvxhfYNxI7DT7CyG0vtF9fXyeTybwxn9s2QWvy3d0ujmsGZVVkIBWioWpsnpTpT4VIhnx8aWGfd/pb8Lkl8pUmoiAwaQk/uCSRpmbQFvbwpfl9MmEX0XAYQXhyM4S9bu6tHdMW9TOSiXGxM85hsU5vS4j14zItQTcbJ1UkUeSffmUZIzWEr/8mu3qY/v5+UvEwsytb5rWCfvaP81wb63eIJZ2pBPdmlznMF4g7RJK4M86ZL1Vwu91825UxchZiXLYomx2pBLcnF+lMtzxR+7SiWjoRZWv/mGK5ag2vyIwP9BAO+gkFfA5F1b5WJhVH1TS29o64PTlPWzKOz+Ohs7WFYMB0osEeE6ySRNFpVeWtPrHP9WQP3HuPZnk4u8Tj2SU8LhlJELk5MUJbS5zh3g6GezsQRYF4NGxlEgZbu0948fCk39xrUWDbWxIcnuQRBIHlTbOEeVasMWHNeNttsvZUElXTGezpIBQM8O6VC8iSREc6iW4IbOwdoekGUwurNCz+/qWRvheuDHqevWoB4FtUYXkr9pHU3PaccyQS4fr166yvr782v/y02bPh3z0Q5hCBYk3B55YwDINSXaUrEUS0FDV0w2Bhr8CV7gSarlNsaDRUnVK9SXfCT9ViK6XiEW6vHPHpoTS5SoOg18XWiVkj1hWNqa0s13uTXOyMkwh6WDsq0R71cVRu0hnzkqs0kPUmmjvAYa2J6Osg3J4gUKtQ3V6joapU6g2290/oaU8hSyKJSICtwxN0zeC9yXkuDvUQDnjZPcwiSyIL6ztUanXzJu1M01B0FtbM1NNeNCCKInenl7g42INmIdBdbS3sn+Twez0sru+gahrH+QKKovLpK2NML62TzZdYtGp9G1TramvhJF+kUm/w+3fMcdVMOsE7l0Zxu1zMsclAdzvza1uIosDOoenkquUM1iYkuttTrG7t4ZIl7k4v0FQUs4Ze2+LqmKkBPtLbSTZeJBENo6o6fZ3tiJLAtQtDeNwuxgd6iIeDDHR30J5K4PV6iEfM3d4uWUR2ubg6NoTP4+bdy+P4/V5uTIwSDvhoS8boSCe5MzlPR7qFO49nrbo8iyxJHFsySwe2jp1k/i0/deUi+/v7LCws4Pf7icfjxOPxFwaib6aJMPgInLtYLPLw4UOGhoacvddvMhkGZvRfXl6mUChw48YN7t27x+WuMF9dPGQ7W0HVDK71JFnYy3NUavCZoRTrx2XKDRWXLCJokAx60DSdlYMSg3EZyS2SDHk5KppRrKnqzO7k+Y7RNtaOy/SlQszv5gl5XawelshXm3QnA/S0hPC7JdySQNYCijRNB9eTOqyuQtObJDEQZkUFV6ubWNLPnblZulIJhy8+3t/Jw/lVppY2mBjs5spIH01FYXp5EzB73yvbh1wb7aetJcbd6SVnHDOdiLK2s8/W/hGlcpXrFwYdNcKhng4eza0gCgJLGzvUGk0K5SoHJzm+/foE+yc5Fta2HMDNFncY6GrnwewSAZ+XO5Pz6LrBSG8nXW0tdLWlnRbg3Mqms30EQQLZ7CLYyHkmFWd99wiP+0kNnc2X0HUDVdWYX9nkxsQIdyfn6e1sY21rF5csIWDSRWuNJiubu0QjQVa3dkglxlhc3+LiUB+PZ5dIJaJORPf7vFSqNfq72tk7ytJqjcraixi6M2kOT7IM9nQwt7JBKh5le/8QWZJYXDOzqz/wnd9Gd6bVGQfOZrMsLCzQbDaJRqMkEgmi0ajj0N9Ms9zwETi31+vl6tWrT51+siw7qdBZTVEUJicnCYVCXLt2zanVf+IzA/zb+5u0Rf2EvS7m9vKkQl5aI362s1WqTYUr3Ql2slV281U+NZAiX64Scosgu5k/rPDpwRR1RUfTDZb3zT74UanO+lGJz421oWoGyZCH+2vHDLdFWNgr0Bb1cXutSMQrUm0q6M06gsuHYBi4/GF0w6CBCwydmiAjyuBKZNjRdAIj30ZRqVCvFBi5mEZTTQAoFY8wuWSi5N9x/QKx8AkuSXLSaIDbU4tcHeunVm9wnCuSK5oYwEBXG/eml3g4u0LQ7+XWxeEntXh3hoX1LXNDyO6BBfQ1mV/d4saFIQQBJhdW2bAAL5tjP9jdzqM5s5W0vLlrbu8I+Jhd2eDG5QsMjF9C8oY5VCREyc/antmdaVjYQbolyfruEd1tLSxu7OD3up3XsPdrG9Yu9lQ8ytrWLgPdHcwtbxAK+i3ijOFsD7XrbXvgpbu9lcOTPAPdGZbWt83nWAeVPcDiLCqwDq6Ivdo308bhSZ7Bng4MDLraW51FBIIgEAgECAQCdHZ2omkahUKBk5MTVldXkWWZRCKB3+9/KWb0jRa533rN7fF4PpDWvG7kLhaLDktsaGjI+YMKgkDU7+bz3zZA0CNzd+2InmQItyxRVzVkSSTi81BvqmTiAUbaIqzs55jZK3G1J8lxWSHuk9jNV7m/fkx3MkAq4mOkPcr8bp6I383CboGtkzI+t0xvS4iI1eOOuAx0QyAZ9JBtisgCuEUdtZxF0zT8ko4gyej1CiCi1soIgoiomhmCLItI0XY2q25W5W6CAzeQMhdwJbuRIykeLO+i6XBxqBswUXq7ZeaWZeZWt7g1Mewg4bpF/Rzp7aBQrnJ7aoGN/SNuTgzTkjDr0a62lKOXZhNdJEnkztQCLdEQPe0pRvu7HOVTj0Wz7e3pwQgm8GWGWVejBMe/kzUtyaG3kz0iNJERRJFwKsM7l0bxuF1OCg0Qjz6ZETcMw1w3bCH39hSWXW/bKHt/p42GJzk4zln19hPU/rTZM+j2c1qTUbL5onkobWxjKs8eIIoigiBw/eIIkXCA4b5OYpEQ8ysbJGORFzqqPSQyODjIjRs3GB0dRZZltra2yOVyzM3NcXBwgKI8vcvubdbcgiBIFvX0P7zpNT42EstZnXt3d5eNjQ0uXbr0gT+UfZ0/+ak+/unXVrjQYbZU3JLI9FGJ3kSQ9pifLy/sm5Fd0hAEgeG2CKvHZVTdYCDm4dF+me5kkIX9AsfFBp8eStES9pGJ+bm3dsxAOszt5UO8LomgW6Qz4kIVzD/VUd50XkPXUQQ3giiBKFEtF5Ddbvw+F1UA6/NqFjJca6rgMds1TQB3gJIg424bQDQMNEFCqxV5UHHRMngZn9vF7vYWkqSwmauC5ELVNI5yJW5dHHY44EGLrdXTnmZ994Cdg2OGutu5fmHQaUclo+EnqqHFEoLsJhBJ8HgnTyyRQA9GybRfZFPXCF7uYV808Pebjq6WTxA9fuqNihMJ9EYV0eWlpHso1avMLK3jcbs4yZcYH+zB63Vzc2IUEZ3WZIzOthR3J+edKTQBWFwzS5Cc5bgei4vf2drC3uExA90dLK1vEfB5HSe3W2t2+82e8kpGIwQDATLpFhpNBZcssXt4TK1W5/7kHE1FdXrjw33m4fmZG5fOdD+CmY22t7fj9/s5ODigtbWVk5MTtrfNwzcWi+H3+ykWi28zcv80ppRx+E0v8LGQWM4itWRrr9kLBp7XC7elif0eD3/he0b5J19bIeSWmd7Nc6u/BU3T+crCAZe74jRrFWaPGqQjPtqipsMPpEJs5isMt0VJhbx8aWGf0bYo99eOkQTwpUPEAm7iAQ/LB0V64j6mdgoMpENgCFxoDzO9k8MwNHB7MQwDTyCEiogu+1BlD6DiMRrUMEBTMKzUHXcAQ9doCi4MtYkgu9HrZURvAC91akhI6KiSj7pRpy5HCXcHaQpuCoZOIDLIgigjdcdYEIKoUT+pjjBLjSre3iso4SAeMYnX62O9UkKsBIgabloufQ5RduEvV5A8AbZqRYIXL7Gn1vEPDNEAtGoBRQyiVrPIQRkVENUmuuR2BMJFT8B534LzMz8+yUTsh3s7mVxYpVavM7eyjq4bZFoS7B/l6GpLkYxGGOrtpCURIxYOUqvVUVQFVVEZ6c2gKE0uDvYS9Pu4MjZIImry1MNBP9VaHbfLhaKq9GZaUVWN0f5uKrU6Xo+bpqKwvLFDSzzK+4+muXlpjJWNHS4O9zO1sExne5qt3QPzoNgw6+1vu3H5te9jTdOQZZlIJOIsmFQUhVwux6//+q/zC7/wC8TjcVKpFD/8wz/sYE6va4IgdAB/EPhrwBsvHPtYSCwv2hdmW71e5+7du/h8vpeSXE6ruvzha91kon5qisaVrjj5SpPp7RzDrSEq5QrbRY2LnXE64wG+unTAeCZGKuzlpKYhCgLT2zlu9bcQ8buoNjUGWiN8ZeGAoNeFLAkE3CJVK3WMB7wsHxY5ypdA1/AadSRRwGhUUZHwCiqi2wtKHRWZmqIjBuPoioKuNPHpVfRGFbfRBEFAb5htLl01a0o7vXO5zEgkeQJgGCiCGxkNQRAxGlUHOFNFD5orQFX00/QmcEdaKIpBRG8IPZhCCsRwRVspyxFqgpeq4Ta3eshuJNmMyLrsRVfM1zc0a1rOG3ScuVmzZreDTwKHRzC/Q8n9ZNpp31KUtvvQA10ZdN1weupgsLF7wHG+QLFc4fHcMvVGk9uP51AUnceL6xxki9yfXWJqcZX7U/M8nFlic2eX+9Pz1Op1bj+epaE0ef/RNIVKmXvT8xwcZ5laWKHRVJyywibLqBYGYNfqtorLYK/Zw78w1Oek9q9jz2uFuVwuUqkUn//85/kzf+bP8KM/+qMUCgXW1tZe+/qn7G8D/z32xMwb2sfm3C+K3Nlslvv37zMwMPDCTSTPu44oCnz+M4MUqk2OSnXqikZ72I3arBONBFER8Fijky5JwuuSuL18yFiLB59LIltpUm9qLO3nudHXgqob5ibOsI+vLR3SEfWRjIVJBr2sHZcQBDjIV0ByoxoiGiK62sBtNKiUTRAn6Db/nIZipY2ygeQNUq43Eb1BXJIZJSMBF6JSA9E8xJqYDqdIPtBUBNmN1rC40IpZY4es/rPgMv8VvUEkQzMPi/rTCwREy0kFUXJ+17AOKtwBBAttMpoV6w9rjbTKblxYB411wCqCG0E3f+aWRGRDxe+RoXIC9TLHlrzYYdZ0LHvE1J4wa7dqaIBla6TVFji05Zb6usz+dk9HKwVr2ssuI9atGt2WVo5aaW+f1RMf7DbJLNFw0GGsmXX3k/fUaDZpTyVpiUe5eWmMH/iO1xY1AV7dCqvVagwNDfEzP/Mz3Lx5841eQxCEHwQODcO4/0YXOGUfyzz389JywzBYX19/rQV+z45c3uxL8v0THcT8HoKSSqmhEgmH2czWuNKdoFRXeLB+wtXuBLphoCGgGwZHxTqj7RF0A04qCrphUK4pjLVH2DjMA6bwwJ2VIwbawvS2hIl5RXD7MNQmuuzF0HW8wQhN3CDKaNWCI6Pr9phOVlNNJ/L4zRuypklI/ghlw4sue5B9QVxqBb1ZQ6znTYe2HM5QTWesWfrsDcO8qSRvANQmgiA4YJ3P2rZR082/vSi7cVtO6nOZzxPd5nsSJNnMIICAFW1lXwgsbEDSrejs9ZkZRr1Ao3CMWs5RbqoogkwVD5oOeAL4E218+uo4Qb+PZCzCrhVF7bug3VrBO9CdoViu4HG5WFo3U2N7U6g9i22roQz1dtJUVBKxiLPF1Ga57eybdbfusNzMzKLfWgM02N1BPBLmxsQIqXiUS6OD7B4csXt4xOzyOrcfzXBj4mlJpbPaWVYJvYWa+9PADwuCsA78S+A7BUH4/73JhT6SyP2sgz+bltuz3JVK5cwL/OzrPHtI/J9udnCSK7BT1OhLx1EN6EuFWNgtcFSsc6u/he1chQcbJ3xmOE22prGdqxDyuvDIIq0RH6V6k7XjMnqzTiIc4EJHjPndPG5ZJFdpcmflkJNcAa1eJiDrGIjojRqqIOFCQfIF8foDKK4AWrWI3yWhNyqIngBoTVTBjRsNQ3KjNyogSGj1EggikigiB2P4vF4kb9AE4JQ6PrcLv1HD0DT0Sh6l2UCrlcAwMJpm5LPTeTvyCy6veX1Aa5qOL1hpuOjxozfNLEBpWNtbBAm9XkbW6riVEn69iq400WplVEM2PdQbRpTdSMEYuivwJJW30ndF9FBp6kwurCCJAvlimaHuDLIkmXx5v7lQIJNOEg4GGOwxabeRUMAaQnkioGjLITkrkKzoP9CdoVytEfB5OcoWScbC1Gp1Brva0VWF0d5OQn4fHekWkvEI6zt7GBi8/2iGpqJweJKjrSXB9t4hfp/3A3ppZ7VXzXK/DeVTwzB+1jCMDsMweoAfA37PMIzX2u5p28cCqJ2OuJVKhcnJSbq6ushkXr507Vl71rmPj49ZXVjg//o9o/zr+7sIgKLqzB6V6W0J4HPJbGUrJEMegl4Xu/kamg7XepNsHJc5KpnOX65USQVliprE7nGB671JBlsjSKLAvbVjfDLU3H5EQaCpq7iFJk1BB8OgXqsh+d240FCQkSWBkuHCJ6vogkq1kkdy+5E8EggSPlmgARjW5yjXGsgBH4ohgAAufxgNkSYuVEPHFUniNho0BA9GyRJUVBW8ehMV8Bp16o06arNBKBSiUC0SEA0qtRpiU0F0u/DKCqLkolAtIAkGTUVFchs0RQ+IOqrsQ61VkT0RDJeMJMggCHgEDQUQrBpbEAQkvYGOx/kZQFW0iCPtae5MzpOIabz3aMYim3ioVOuMD3RTLJUJDHQTDQcZH+xh7zhLKhahXK3TnkoiCHB5bBBBELk43EfQ72Oox2SslUoVOttT3JuapyURZW51E5/Xw9r2PqqmsnecJV8s47YyFafPbRFsOttb2T084duuTzg68K9rmqa9NBB9o5FYPpaa247kh4eHPHr0iPHx8dd2bHiClts7uVdXV7l+/To/eH2A8UyMUkMh6HUxlokS9LqZ3c2RCvvMCSpNRxZFfC6BUk2hMxHkYkeM2e0TZvfL9LfGiPo9jFgrg2d3cjRUjd6En0qpBKJEQNRRRTd11QBvGElvAjoSGmVrQbbLY3751aaGgotAKIzoDVCpNdEqeUQMJF1BdJsOIXlN8KwhuJDQ0AUZvVFBEEQUC9SSLVzF5/ODICD5I6iCC/xRFN0AX4RQIEhN8CG5fSiuIK5wEjkYQfeEqNSbVHHj9QUwZB9yMIZgXdMG9wSLbSZILmTNjPq2qonkCeDCPIzsXrjkDTpRfL9i/s4WZLBXBHe3tVCp1vF5PQ4r7OA4S65YptFUWNnYQTcwddMUhYczi2zs7PG1B1NMLawwubDM4voWhyd5Dk5yTtS0U/3h3i5UTaM1GSdfLBPweR15p4VVa/OIRZ5pKgr93Rm+/9vfrN6GszHU3pI4IgCGYfy+YRg/+KbP/1jScsMwqNfrbG5ucuPGDcLhN2vdiaKIoig8fvyYRqPB9evXnRG7v/C9oySDXhNQNgxmd3KMtseQRJAlga1cBVXXiXolNk7KnJTq5EslOmJ+LnYlmN7JsXZYIhH0EA14GMvEmNnKsZ2tILrNdFez6lFDbQACqqIgBWJmy0tToV4yU2S1ieQNYKgKDcGNjI7gCyF6/NSkAIqm4XZJuJoltFoZH3VAQLPAr4Dr6a/FPjgUyYdg6CbgVre2XArW7yzml+QPgaEjiBJezPfrsm5IVfKYaLggEpDM59nLGUVvCMH6fG7JvJbLH3HS72bVEhdExK3VCQkN/NQRdBXNl0AUBRatWtqelbbT66GeDhRVIxmLsGax0Owa2mahha3RU7t27u/MkM0X8fu81sFgsGlrmtee1jRPWAM0Q31daLpOf1eGYMDP5dFBouEgfZ3tLK1tsLKxzcRQ75kHRZ61j6nmfmv2kUfuZrPJ/fsm8PeipfZnNU3TWFlZoaWlhdHR0afqH59b5q/88AQRnwtJFOltCVFTNJqazsphmYnOOK0RH9NHTfqSAUKSwkZepaoKCIK55WSsI8adlSNKdQW/R0ISoVGvmaQPn4+64Uarl4lZqZ5uwUYeWUTyhQj43BiqgqzV8AoqetOMwFqjYgoTWK0kvVlDFVzUFRU5GDNrTU3D75VRy1lK5QoemsgePxgGoieA3qyDIKBa0TxgpZ+VhhktVZcPQ9fAqqMBdMWMvIIF8JmHgvk7RbHRc/M1hFPXrmvmgSwJBmrxGLdSRmnU0OsVmrioqzol3U25rmKIMqLHz40rV7g41MfNiREEBFLxqKMEa5NNbDmj3o52jnMF3JZoA+DMh9vWYqmZDvV0omoane1p9o+zeNwu8zkGHB7n6M604nG7eOfyOIlomOHeTtJJU/ZYliUezi7j83opV+sMdGeQ0bh7966zTeR1aNFn2TbyNiP3h7WPtOYuFotMT08zMDDA8vLyh7rW8fEx29vbpNPpF6b0nfEAP/HZIX7x9xeQJBelmoIkiQy1hlE1gzsrx1xocaE0G8ydNPi2oTSKpnN75YihdAivS8QjSwymI3x18RAXOiIgGDqKpiKIbiRBoKhKeGnQlER0XaViiAiCQU0XEGQXhuChjouA34dg1CkpTSS3gSGaN4ZspcBIZtZhuH0IokzVEJD8bgRBpKY0EV0e/DQo1xX8oka5VMFQFbxumVK1RiDsQfH40TUFQXKh1/NI/ii6qiACNUNCAjTB5QB8htoA3W+i8KpZo1ZLRcLhEGWtic+o0xRlBF1BlVwgCjRcQeSgC1EyFzMaSh3cPkTPE1HLnOZm8dF9Lo30M7W4Siwc5CRfIBWP0FRVLo8NEgkFeOfyGJFggFQiis/roViqIIoCiqpyaWQA2VrI5/N6uDkxSjQc5N0r5i7tdCJGwO9jc2cflySxuL6Fz+thZ/8AVdVoiUc5yuYZ6usC7GUPT1qE3/fZdxkZGcEwDCqVCtlsltnZWTRNIxaLEY/HiUQiLwTNXgWo1Wq1Dz3a/DbtI3PunZ0dNjc3HRrp2traK2uW55ndMjs6OqKvr++lZBiAaz0Jau8O8I+/ukRD1WjWNRJBL3u5ChPtfo6KZiQeaI3QUHVWDgpc60lgYPDVpUOudCUoVOpgQENpInr8eASVSkNFkEW8Hg8NoFJXkLxBPFqVakMh5LfIIjRpSl50pU5N9iChIQfjCFqTar0G1HAHQui6iuQNIGoNdMmNpNbRJC9is4ThCVoUT/Pml0JxJKGJ7HKB1qQpupBDfjTDjJwBVKqGjqEqoDVAFHEZphAF9SK66EJU6ghuL7LbC6KEFIhhKHWakhekMlXRB16o4QURxEYRXXIRDAapA6LLg1tv0MSNz2v+DUS3D71eQfQGOG6at5KdKg90Zbg7NY/H7eLBzCKiKOD3eihXa4z19zC7vM6ty6M8mFngxsVRHs8tM9jTweO5JYJ+H7VGA03TSCfjHBxnuTDUx/TiKrcujbG2tcs7l8cBM7I/nl+mryvD6uYO0XCQxbUtJFFkYW0TMNjaP8DrcfPdn74BPJEitjeKqKpKLpdzRot9Ph+JRIJ4PP4UgPaq+9cwjJc6/8dtH8k7WV5e5vj4mBs3bjjo4ZuMfWqaxuTkJLVajevXr+P1es90jW8bTvGT3zlCZzxAeyyASxKQDIWDkopLkgj7PAQ9MpJoitmJokBD0elOBsmWaywclJAxNbUFDBqqhuQN4Jeg2mjgETQkjx9D16nrIpI/TLneMFNetWmSRBSzF61UyyCIBN0iUiBqfi5DRK3kCQoNmpUChtrELVqUTgvmFcSn+9NlTTJ70VY7TRAEmhUzjTZ0HQQRbzgKkgc5EEPTDUSPH7ckmNeQXBiIGG4/kg3QiVZv2ybGuH3Impmm2lJFddwmngBIhvmvInkdJpvWqCDWi9SaCiA46i22TFKbxQ4b7u2iXK0RCvieOJ3FFbeXBCSsgZMhi0nW09HOwXEWn9djpeJP1FZKVRMIdFnv0+6RD3R3YhgGV8aGGBvo5ttvXcHndhP0+V7Y35ZlmZaWFoaHh7lx44YTROwdYcvLy+RyOVRVfaFzG1Zp841kH4lzd3V1MTEx8RSN9FUU1GetVqtx584dEokEY2NjiKL4wo0fz7OrPQl+8rtGkASdo5McyUiA7lSEsEei3FCQRIG9Qo2h1jC1hsZuroquaqwfFXCJmBLJyPglA003U3NDkpA8AWq1On5JR9LqCC4vLlRETxDJ7UWVfOiaiiyDx2iAJQxQsPaIBwIm4o3soWy48fhDCLKbSk1BreTwemS0WgnJ60c0dESPD5fRRBAls88NeC3Ay17gXdNN4QpVcDmMNLcFphmCdTN6gxiaaqLwFVO8wLC+fsEbdEgz9ar5Gg3D+p0golvgXalaR6vk0asFlMI+kqEQCAbQvSHkSIoLly6bqasgOLW0rUJjz3zbMk6dbSmzLpYkZ4jkxCK12A7UajnscF83iqrS09HG/lGWgM/LwsomAlCu1BjsasfrcXPj0iherxuvx4UsS9ydnKPRaLK8sc13fOqas/L3ZWaPf57eERaNRjk8PKRYLDI7O8vOzs5Tmz9t+7AOLghCpyAI/9naDTYjCMJPv/HF+IjSco/H84EI+zqR++TkhPn5ecbHx4lGo290DYCkS+F7WjX+fTOMjki1obJTUhhqj9FUDVJhL+snFeoNFUPX2Mo3kCQXjWaTaMBLsdakrBmILg8umtSa4JUlml4fFdW88b0olCtlJH+EoGxQ0WV0pYrgDVNv1nB5ffioUTRAV5vUJbPlheVQmuxFRkUNhBGbNSr4gAIIEo3SCYFAEBcqtVqZkFui0qhS1w0kF0j+MCI6uuxGrxWRfGF0pW623uoKUsCMsoKhYQgSei1vklEM063rggt0zaKplpGCcYLBAIpao1mvo6t5vF4vjWYdl09B8kcRBQNDkBC1YzRBRhUEREPHEEQqUpBsvsjE6ADH2TydrQkCfg/vXBrFJUumdHEgwNhAN6lEDEmUaElE2N0/pjWZoNZo0tHaQqPRZKSvC49L5tqFYeKRMO9eNuvueDRMOOhnbmmdcCjI3Mo6kaCfpc0dJFE095A1mmxYM+F5a/79+z/7Zi0wSZJIJpMkk0kKhQIDAwNks1nm5+dRFMURdXjRUo3XNBX4i4ZhPBAEIQTcFwThtw3DeG1ZY/iInPusFNRnzTAMNjY2ODg4eKrNZdtZnft0nf5D3/UpvlcT+Ml/+FUOijVcksBxqcFJqYkhGDQVjYai0tQMJARE0cBwuSnUVbyyhKrrSKKOqrsQJZAEFckACQ1V9lLXmrgCEQylSUVtYLgg5PNQtZxZcPvQdAHJG8JnVCnXaqiagjcUR1MbGLIbrV4Fb9gky4A5LioICJJMQ/JSq1eQAzHqhoZgCIiCYEZxQcQnayi6QNgnky2eoKtNxHoeVVPwG1WK5RoyOi6Pl6DfhaZXKWoqPq1CqVpHMDST2aZqSLpOzfAgSTpS0EuIOhW8uEUPuiAjCOBSKzTlAB5/EBWzfFAreaRAlLxmfl+CobNzcEzrhWHuTZnSR9v7h4iiQNDvp1iuYBg66zu7tCZj7BwccfPSKHcezzLc18XkwjLRcJCFVXPxYiwSJFcoMdzXxcLqJtcvjHBwnHU017raUkwtrTE22Mvk/DK9ne2sbe0Si4RYWN0knYzxuXdeW9P/A/Y8UYd8Ps/e3h4//uM/TqVS4e/9vb/HD/zAD9DT0/Pa1zcMYw/Ys/67JAjCHJDhDTTL4WOUNn5VWq5pGlNTUw4l9XkSsWdJy+3rVKtVrl+/jtvtJuRz8U9/8tv57FAr5YbGTr5OVVEpVJsIVgoecIsEfTKqLqBrGhGfTEMHUZRAN6/rk6Gmyyi6gKoZBGQdTWliYJJj8IUxNBVF05HVGpLVyqpaH9sQXEj+CC5vAMUwNdBDooKiNDE0lSbWoEsgDIaB5AuZqbk3AEodQ5DwCYqJWFu99HJDRXUHqRoyciiBO9pqZgPhJIqqI4cS+AIBFFeQsu6iKvhwRVIguZBDCQKBAKIvhByMmgqmoohLN0sIzf5Tu72IlnqMrdqiip4nVFRdBV0120qy21mHZNPEOttMxdLR/h6K5QqRUMCsu40nO7/qVkvKXjM0aNXOI/3d5Aol4tEwC6umzJNNULH3hjWt+8rrceP3eenJtPHO5XGuXxihtSXO5bFhAv63j2JLkkQikWB8fJzf+I3foLu7G13X+eVf/uUPfW1BEHqAK8DtVzz0hfaxOveLom6tVuPu3bvEYjHGx8dfiDi+KnLX63Xu3btHNBr9wHUEQeCv/fFr/NiVBH6XgFs2J8V03ZRErqk6hZqKYeiE/B6KdZ2QW0JTFZpIeN2y2T4ydIIuEVxeSjUFr9eHW687/eawz4UiemkoKoIo4tUqoGu4jAZ1XMiGOeNtKA3wRSgrBnIoiVuEZkNBLR7iQUWt5BEEEclyKr/FmKxaQFLAIkuInhCGrqMKbrPeFgSwOOS6re2G21zEJ3uc+rlcNv/VrHacILvQrZq+apFE6oLZtwdo1sxavqwKZu2uVPGqVQJGDZ/XB5iAYbp7kGyhhEuWmFteB3CkoWx9s6HeLnTdoL87w8FJDp/Xw/yKWXdv7ZkMM8Vy2GjY1kM3JYjH+nsoVir0dLThcctcHh3E5/FwZWyIk1yBarXG5s4e7z+c5uA4y97hCT/0XZ954T3ztqxcLpNMJvmpn/op/vJf/ssf6lqCIASBLwD/rWEYxVc9/kX2saXlL3LMbDbL3NwcY2NjxKzF6i+ylzl3oVBgenqakZGRl06Y/eBYim8b6+b/8R8WOCzUUHQDQQABAZcEPpebWlPF5zaBN0N0EXQLVOqqKQioKSDKuAwDBQMFCa+kIwoyRr1M1e1BEAwk2YMhSFRUk2JqNMtoSs2sWb0RAi4zBVfrVaSAG1lXkLwBJFGjJnhAqIIA9UadoCyhNptoSh2/z0ddVahLbiRNQZdduLUKTfwYah0IoBsCEqBKXrMeFmWMagHBF3ac1R4dVZDRakUknykA2cCs5bFaa1olj88foKkp+IwaZU3HJepobj/1SpMmPpBBVKvosg9CLYQDPno7UiiKTjgUQBQE3rk8jizLXB0fIuz3MT7YSzqZQJYk0pbwYdDvod5USETDuGWZ6xdHcEkSty6N4fV6GB/sJRYN4fW4SbfEef/hNJdGBng8t8zoQA8rG9u0p5OsbO4QDgaYWVrFJct872dvvfS+Oou9apPI2+KVC4LgwnTsf2YYxq98mGt9LIMjYNbcp9Nye33v/v4+165dO9Nk2IvSclua6cqVK68ENgRBYCQd4d/99HfzU//kPR5tngBmJFc0jZpqDuQ3VR2PW0bXDSpNDVGUUFSFkM9NRTHQmg3cLglJ0Kg2DUSXTCTop9AU0CoFwuEQiqpgeALIaKiyD5cL02k0hXKjhtejI7o96EBFBdENgjsAGI5wguSP0cBA93jxups0cKHXC8i+II1SFtHlAcnAJ4Ac9JErnYAAQr2AphkEfS6KNRWvoCMaDdweF6jV/397bx5mZ1nf/7+e/ayzL1kmy2TfV5CAgggKyJYAIiCuqPVrq+gXsdblstqqtGqt9tdW7e8CS/vT2iZhEYIU3BUQSEgmeybLJJlJZubMPmd9tvv+/fHMOU5CMplJZknCeV9XrouQM89zz3me931/1veHjGsTMyT96Ry69PA9h5TwiURUcr4gbGnYRoiS0hIyhDBKI+SEhxYysESaDKBGAjdE0XScbBo9HiajxejP2piGRcPevSyZO4Od+48wfXI1R48nCIcshBDYjksmk6WppZV4JMzeg0e4YtUSNu/Yx6rF83ll+25m1k3mcPNx4tEwWdvB9Xwqy0vI2U5BV00MlN3mG0RmTJ3E8fZO5s+eQVd3H1esXloobT0XCCHGXBxRCW7wMLBHSvmdc7oYE2SW+77Pzp07SSaT59TyKaVk3759tLe3DzkGeDDyG0TY0nn4o1fygSvnYBk6YVMnYhqYWiCqZ+kqAgXXl4QNDR8oi4ZI2x74LpZp4qFjux5RSyei+vQ5oCkQisbI+Bq5nE2J7uNlUqBqGNJFKDq69NCi5eQ8ga+HiZJFFTYy04PrC/xsCkUzsKSDoqqFRg4G0lXxSGAVqFYYLVqKrUfIyBBJIljRGHqsIhgoEC0j63ho4RKkFSWHiWOW4EoFPVYBiooer8SIl6PFKjFKaoKcvhVFDqiZZDGRItCiMwP1N1xlwEdQVEQ2IJmiW0GdeboPo6SKfQONIgyk4morg7TW9ElV2I7LlOpKmlpaMQ29YL7nS1DVgTFMkwcaRBbMqccdkFbq6umjpqqcxqajWGa+N1ySzdlcsnQBlmGyaM5MHNvh0NGWUZsFNpymkVHq5X4fQQ/3toE/N57txcbdLM/lcmzbto0pU6Ywbdq0EU9YzCMvfVxSUsKKFSuGfZ18Z1ke91+3hMtn1/D5/9lMW18GlIDcuqqSybnELB1XCGKWRn/WRVVVNEVBSoWYASlpYAsFU1VRpAeei2+EMfGwQ1FSnkAJRdGki+85iEJ2GZQB0vSlHfRoGSWqS7+nI1wXXe0nlcsRLVEKNexyoGw1I3QkPlq4BEO6uLqJaqcQZgw7nQwIqxtIQBjRwCdXjUK6zM2l0Y0wyZxACwdqK7pvB0EyJ4caimELbaDJRENku9Gi5WRyDlo0iquYiFw/KhAywCSHEwqBAjJWTk39Io5v/TXlJTF2HzgMUhZGCeUJMKmmguMdncyYXMP+I8eZXF3BwaPHMA09+Bng+MAARNtxiUbC1FZVYBg6tVUVpNIZwpbJngOHiUWradjTyJSaao63d1AWj5HMZAhZ5jl1gQ3GcAYSnKtZLqX8A3/SuThnjKtZnk6n2bJly7D866GQTqdpaGhg1qxZTJo0aUQ/e7JpL6Vk5YwKNnziah74r1fZ2dKLIwS25xML6bheQK2ULdA1FUMFV4CuK6RsD8vQUKVPxg+EFzQ9jOP6ZJxsULqZzYEZxVQ8MmYJqpNBNQycdA9mKAyIwAQXPv1CQUFilpQjfB89HsWREqEZWF4GIQRupodYNEIqk8GIlODYGZRoOWFLJy1BtwaaWswomvQRmk5U5shgoQxUmilGEDnWwjEUL4vUQ+TSSfS4RShWEggkWmFUN43rg3ByGGov3kAKLe0phFSJY5Tg+i6OUFFUFS3XB6FS0moUFIXF8+ppaU0wdVI1mUyOaZMDwcA1KxYTsgwuX7mYWCRCaUkcS9coL4kMlJ66xGJROrt7mTV9KgePNpPOZNnVeDCoHa+fTmPTURbOnk5rRxeXTV0MNDN9Si3H2zuYN2s6rzTs5p1Xv6kwA+1ccaF1hME4meVSSjo6Oujq6mL16tXnRGzP89i2bRtLliwZMbHhRHJLKfF9HyklsbDJ//vht3DfVbOJmjphQ0dRFGwvIHXYULAMjZwfjC3K2h7xcDAHOusrhDSFsDaQVrNU9HAsEFjUdGKaT3IgAh02dTyMoPJLC+GkeohoPnHVBSHws0kkQXGMomp4mWQQNVfBM6JEImFsPRY0cegWQjORrk0q62H6aWKWitubQLX7cfo68JKdKL6Nl+wiEjIIiQwRHbRsD16yk6ji4vV3Bjn9VBe5bAbsPoTnENIVVCtCqLwGESpFL6kmY9uoVjhQRgXQDEQ2qHizB/ZMoWho8Wq6e5IcbmlD+IKtuxvxfZ8/bttFa0cHv/nja7y2cx8vbNnO5h17Od7Zze6DR3E8yfZ9h0j2J2lsOko0bJJKZ1k8tz6Y8T2pmsamo4QHBieoqsL+w0FaLZXOsGLRPKKRMEvmzeKOG96G53m4rovv+2fd6glnbho53wYSwDic3EKIwlzuysrKYfvXJyNf4GLbNlddddVZj0rNK6hKKQsBvsEP7aNvW8hVC6bwuf9+lWM9GcKGiuv7gELOFUQsDeELDMMgZXuoqk5IAwVJ2tfQVB8EqFISMlRyUidj59BCUQw3Qw6QCpiRGL6UqGYk8GudDIoRIhYRJNNBHbMV1zGiURwg7SoohsQ3gpp2LVKKKjwIRTH8HG4oRi7dgxONYIWsgIxKEqwYKd9Di0BO0/EzvWiRUqSdQ49XYksHPR4PClIGpJbd/k70klLSrkBqA5rqmR60aDmqqiMJIvG67+CpA/LHUgbfhZ8ilc4Sq5nG7sZXAQqzsd2BeMnUmmqOtLSxZN5stuzcy8y6YLRQJBwaMMklXf1Ba2p+SKMYsDpqK8tJJlMsmD0DFI2SeIRERxfTJtXQsGc/U2qq2LZ7H5Vlpbz9ysswdB0hROGP53mBooymjajJ40w+dyaToaKiYtjXGw+Mqc+dy+VoaGhg0qRJVFVV0djYeFbXE0Kwa9eAbE8kck4zkBVFwff9wkM+la8+f3Ipj91/Df/333/Li4d7URQDBTC0YASRKwAkhqbiS/ClCET+fJeQpZPxQHg5hKIQDUnSngoo6KaJK3REphcjEsbNptAjcTRh45oRcLJkjTDhqIqLgWtnUDQDUyRRdRXhJXGkjnBttGg5TqoHPV6BoUhcwLICWURfs1CkRFoxLHwcTR/o8iopNIFIPdBTdxUTmUujWFHipkKawCQHwAhBph/CQS4dQJgxDOli57Lo0sVzA2EIhItqRdDJocerUBCsXraISMigs7uXitIYPX2B/ll3Xz9l8Ri6plJRGmfa5Bps12HWtKl0dPVSWR7Dtj1m1E1CkXD5yiXYjsP0KbW0tnfQn8rQ2d3LoeZWVi6ex/a9B1izaikAM+qmcDzRye3vvIbQwHsyeNaXEALf9wt/gMJkkqHIPh4+92hjzMzy3t5etmzZwty5c5kxYwaGYYyocSQP27Z59dVXKSkpKRSmnK15JaXENE2OHTvGsWPHTtuon4/m/8VbpvL/vPdyqkssFAWEDGquQqYajLFVFIQvCJk6ticpiYTIeUHZaSgUAt0kmbFB0ygzBWnHR/ouVqSUnDQCk3ZA0SWMXShUyQ0UqkSMoD8867jk1Ai6YYIZwbRM8HJIICwy9CdTKNk+dF1HcVJoWqDGqihKQUElP9HDiJUjxUBDykAlWv6+aU9BiiDtFyNHWOQoDav4yU50FbxUT1B842TRQnGUUAy9pAotVo430HDSnwuesY9KQ0svds5hz/7DlJXGOdLSRlV5OXsPHkYi2LJzH129fTQ2HeF4Wwd9yRT7Dh1G+LBlxx4Qkhe3bMd2XF7buS+YW97RTW11BYeaW4mELHY1BoMPd+07SDwaRlHgilVLec/a61/3XFVVRdd1LMvCNE0MwygEWH3fx3VdPM875fs1HJ/7fBJqgDE6ufM57MEDAc+m5fNUhSn5hzHSvlkpJUIIKioqWLZsGZ2dnezatQvf96mqqqK6uppYLFYYPzx58mTq6oKqqCfur+ZLG1/jd3tbsT0fiYIvJVJCJGRge0E0Pef6CCmJh0NkXB9cm1AohJCS7kxefMEllUsHSiehGKqXwzdjuNLDw0CXDuFImGS6h7Smo4cEerQMKXzSmCAcfC2CJl2IV2A7GfSSaiyRIYuJbyfRzBiRkIktfHwUFDtDFoHndhOORHBS/VjxUlTh4ng+tqrg+zk0wwo60sIl9PV3osWryAoVNRoCVSXmZ8mpIRRvQNpJMQcKYEoKAxPUUAzNy+J4HlZpDTsb9wDQ3RNsMqXxIF25cHY9L23dyZJ5s9nZeJCaynJ27juIoevs3n8IgLaB8tI82SrLSjl6vJ3Z0+sImSZzZtSRyeWIhELs2Lef0miUFzc3MG9mHaURa0jxhPz7o2kahmEUCJ6Pw+T/W9O0grV3JrP8DeFzK4rC8uXLT6jqGemJ29raSlNT0+sKU/I+8+mmkpwKgwNnedN++vTpTJ8+Hdd16ezspKmpiWQyieu6zJw5kylTphR+3jA0/v7uS/njgXb+9olttPVl0FUFfUCAP+v4GKqKIyTxkE7adoN0mWnhCAUTj7Ch4wuXDDpmSMPzXFTPRngOpmEgHAeMCNLzyOoRLMPBN2M4yS4UzaAiopPzFWw7A5HygZRXRdAVBri+BBWsaBxXSnKKFfRtR8oI45DFRHW7cFULX9WxMZEoKIaKUFQiIkdOUQutn0oo0GJDNRCpLrRYBalsFj0axtHCwWxy1SRiqAhhE46E0Mji+GDqEl+LgRkl3bKHmXWT2X+4Gcs02NkYELezJwjCRcKB6Tx7Rh2Jzm5WLJlP8/EEc+vr8DyfNSsWk06nuWTxPDwhmFpbxZGW4xxr7yBkGuw7dITli+aR6Oxh+pRAxum+u9YFI4f37MF1XSoqKqiqqhpSZSXfUgwURDgHB+Ecxym8w6e6xhvKLD/Zlx1uHlpKSWNjI62trbzpTW96XWHKSC2AfOAsr5Jx8joMw2Dy5MlMmTIFVVWZM2cO2WyWl19+mR07dtDW1lZwJ9bMqeXpz1zHuy6tJ2LpCCnwfEFpxETXNCxdJesINFUDRcHUVeKmgiN1PKmiqgaqcPDsLGgmlqHBAIl8VSeCjYJECh9fNQGJFYmjheP02JBTLMxoCQoCTTdQsn3kcllCIosvJKZ0gp7ubB+KquGkAgI59sAElIHRQFq0FOnaKLqB6QUugD9QlqpHy1CkQDUsQjIw28OhUKAMo2qIZCd+shPDy+Bnk7iahSM1skqY3v4UjhYi6akDAhIKWkUdk2sqKYlFuWTpAkqiEVYtnk/WDjTNjrd1UFEap629M8hOOC5tnZ0YmkHD7v2k0yl2NB5C1TS27W6koryUY+0dzJo2lX2HjjCpupLte/YzuaYaKSVXr1nNu2+9nunTp7Nq1SpWr15NaWkpra2tvPzyy2zfvp3jx4/jOM5p3xlVVdE0DdM0CYVCOI5DW1sbZWVlBfP95Aj8aCufjgbGLc89HOSHFcRiMVauXHlOE0PzZni+bHCozaW5uZn29vYTBByllCSTSRKJBEeOHMEwDKqrq6murubzt67grstm8uWNWznQ3ofjCbKORyxk4Kk+jucjBGiGRjLnEjVVNAX6bB9d1VBME+FmSfk+4UgUfBkorEgbT48SllmkppDq70KzwkQtyFgRdCeNY0Tws31okVJCMosMl+Lk+sAqRRNppGIQMjRU6SBUhZCfJWU7KHYHnmHg5DKUl5ejqC6e75LOpBFKFiNk4fYliITDZJL9QSrPc1DCGo4WxlB9fDOC5SaxjRgZO4sashCKgp/uQo9XFurVFd1Cs5N4WgijpIqd+xroT6Xp6unjeKKT6VMm0dKaYM2KJfxx646CaT65upLte/cTtix27DsASDoGzPnUQBwiZJnUT5vC7JlTqa2uIBqyEMJnZt0kXtyynT97z+3Eo386EHRdp6amhpqaYJxwKpWis7OThoYGACorK6mqqiIej5/yHUmn0+zatYtly5YRi8VOeap7nkd3d/cbwyw/G2QyGbZt20Z9fT2TJ08+7eeGY94Pl9hCCBobG/E8j1WrVr2ui6ykpISSkpLCad7R0XGCn/79913Cs7sS/Ntv99GXVvCFJOP6hA0NXUpStkfM0lGAftsnYijoqk5/1g0CjEY4yCurGiWmQ9qTSDw8zcSTCuF4Ka5ikMwmURSHsKXi+BlcNYjQp2wPLTQwTURKspggfFw9FowoilYANnpJFWGRIauG0YVPWoYQnkQ1LbTSKCHp4igGIV/gGjGUkIcSDppHFD8YXmj396CXVAc+uJSoVpiwzJHFIhaP4kiBaRmYIk3W8QIRRzTU0lrSx8PMrIuz5+BhwpbJzsaDICWJrqDc1BoYhzRrxlQUBebMrKO1rYOa6jkIIVk4eyYd3T0snD2TbTv3YVkm7R1deJ5HJByiP5UiX9j14bvXnfa9UBSFeDxOPB6nvr4ex3Ho6uriyJEjpFIpSktLqaqqoqKiolB0tX37dpYuXVog7mBfPf8Ovfjiixw8ePC80k+DMST36Qh1KimavPLKkiVLCqNRT4czndzDJbbneezYsYPS0lLmz59/RrchHA6f0k+vk2m+c/MMfrytmxcO9qBrCkJCJueiqwooCsmcR3lYJ+d69NuCWMjA9SQil8OyQngo9NtZVDNMieqTtR08O4caKQlECcNxLGmTxES4KdRQKZbM4WoafrKTHApl0RBZoWCpkgzBnC/VDJNKpdFjViCbJCVqpBzpBoUoMtODEilDE24QuTcCbTQ9UhYIPSomEcUjg4URLUF4Lgogkp2BClvIwLczeNEYnp1BhKJk+oPy19TA2CPFihKdOpdpsTS5nM38WdM5cKSFRXPqOdx8jFnTJrPv4BFMXWPP/kNBQ4gUHE90EY1G2LZrH5etXMLOfQe5YvUyXM/jkmWLeOm17Vy6fBHH2xIsXzQf23G44eormD3QGjocmKbJ5MmTmTx5MkII+vr6Cs9VVVUymQyLFi0a8kR+7bXX+Mu//Ev++Mc/nvXI3rHCuJ7c+Uh3ftcb3Bl2KuWVU2HwGN+TcXLg7HSEzWazbN++nRkzZpxVlVveT8+/FD09PXxglcoV1T4/3pnkUI9LJKSBVLA9H1MDV0qyrqAsHMyZdnxBJBwi50uEkyUWDuELn6SvIBWDcNTClRI3ZxOyBFIG4nyhkEEOyGZyaNFSIrpKDotkLokSiuFKBykFZqwEQ9r4qkbET9OfyaIKH1U38J0c5eXlCEvHdVOkMhkkKSLhEKn+bkpLS+jr7cUMRUkJH81UwLAIC5ucHkTqhVVCRkoUEWiwC6cXNRRFi5WjSR9f0QgpPtlsElU12LznENlUP5Zpcqytg0lVlSS6epgzo45DR49z6fJFvNqwi5lTazl8rJ2ptdU07G6kJBZj+5791FZVBAG2lUvRNJUFs2fS3dtPS1tiYHDBUb70yQ+P+Fnmoaoq5eXllJeXk8lk2Lp1K1OnTqWlpYWDBw9SXl5OVVUV5eXlhRN627ZtfPKTn+Sxxx5jxowZZ33vsYJyhj7VoZtYh4Dnea8j4ebNm1m6dCmWZRUq16SUQwo0nIwDBw4Qj8epra09caGnqTg7GX19fezevZtFixad0UoYKfJ++i9eO8gPX2gikQwEGyD4IqWUIAUZRxDSg5yy6w0UgSDxhYepamjSxfYVPNdGDcUwRQ5bsdD8HL6iEVM9BAr9qTSqGcHSVVzFxJLB5/xU0OjhJQNfOCIyZNQwlshhKyHwHKSqoqgaurBxVYuozJAmHBS7WHGk76EpCkLRMJx+XDOOnw6q1KSUGDIYcBj202S1KKpw0aWLikAnUIUVmhGouag6Wl8zs4wkR461UhKL4bgOqqJQUVaCPdDD3dnVzeTaGnKOQywSprW9g8qKMl54tYHVSxfyx607uGTZIjZv382KRfPYtruRxfNmc+hIM1dffgn/+b2vnfMzzGQybN++ncWLFxcCZL7v09PTQ2dnJz09PWzdupVEIsFTTz3Fk08+ybx58871tmMimzquTkLepLZtm82bNxOLxViyZMmIfJVTmeWDK86GulZbWxt79+5lxYoVo05s+JOffvvVK/nfL97O525ZRmXU/FM11IBFYWqBxJIrAE1HVRUUBBHTQEpBVprouoYaCmOIHJmsjYGPrmmgGmRdSQaLWDSKaoTIpVOBpprnoGR7KYuGMLygw02THmkZiEzYaigoXNFNlAFFllw6KPPMK6gKMw5OBkXTCRFEyxXDQvouoXAUr78DNddHrrcDt78D2/Pxs/0INNKpJFk1Qp+vBzlwdPxUMCPbi00i6/p0dvdQW1VGS2t7UCq6ax8qkj+8uo1kJstv/riFPfsP8ftXttLYdITte/bj+X5BoSXnOCycU09VeRmXrVhCJGxhuy4ffc9t5/z88hbdokWLToh850USFyxYwJo1a6ivr+cXv/gFpaWlfOADH+DQoUPnfO+xwLj63Jqm0dfXx6FDh5g/fz5VVVUjvu7gls3h+tdSSpqamujr62P16tUjypGfC+5+8wLuumI+//67vfzXiwdp70sH2oeAREHVtEBG2RVomgEDyi4xE2zbQ1F1NM1Ai4ZQ/Cw5oRHRsmiWTn+qDzsUQ7oZtFgFYcUlK3V8t48kYXy7Fz1WjiUz+GoIy8+QzTlI6eCJLNJ1ibgprEgYXWZI5mx8O4MRjmJnU8Q1lf6MgxFSsFUDxU7hhkuIRSNBtZwVR0PgKxp6pgepBCKQSIFqhAh5SdJZSdgySfe1Y0ViHOhXKI1H2ba7EUVRODqgUJodaKqZOqmG1kQnSxfMJdHZTd3kWtLZLPFImOPtHUyfUsNLr+1gyfw5/OKFl1k0bxa7Gw9xxSXLufJN5yaAmM1maWhoYOHChUPOstu/fz9f/epX+fGPf8zSpUvp6+sbLeXTUceYmeX503QwNm/eTDabZdWqVWed8G9pacH3faZPnz7siPju3bvRdZ158+ZNWERTCME3H3uBZ3e2028LJIFZ7rgCQ1dRlWAyaNTSEL5PxoOIDlnXw1AEQirBcCMp8KSCLlx8zQxaSFWws8FpWx4LkfR0fCeLYgYzxlTTDEiHgq+oiFwKNRTD6+9Ej1ei5frwQ6VYONgy2PhU30FoFpaXxNZjWCIbmPQyiBGoVgTd7sXVo8HGkskRDVu4dhasCL4EoehIRSXkpchpURThMdc9iO84VJSX0NXTB1KQzjmErRBHj7fhDzxT23YoL4vT0dXDtMm1HD3expyZ0zhwuJnLVi7FdV1K4zE6unv59pf+L5ecZuDAcJDXGFi4cOGQFl1TUxP33HMPjz76KCtXrjzr+50CF65ZLqVk//79pNNp5s6de06VPHmzPJ9nHIrYjuPw2muvUVJSwoIFCyaU2Hv37mXt4ip+9eXb+dQ7lzK1PIyua4QsA01TybiCqBmk+TIexC0VJKiKglQNXDQ0vECZ1Qg2BC/TjzCj6LqOFq8ibFn0+RZuNoVqRQiLNGEd1GwPXqqHiMjgJ7tQnQyWyFISCxPCwREK5JLkbBe3L4EhHez+Lkw/g+/5hEUGXZGE3T6iShaZ7cPwszhCA+mTVUJ4nkNaCZFTQ7gY+KpFSAYnskMw4FBm+9jTLWnYs5/texrZtruRVDpH46GjWJZJT18/S+bNIpXOcMmyBURDId62ZjVTJ9Xw9ivXoGsal61YwstbdwAKv35pM3Prp48KsRcsWDAksY8ePcp73vMeHn744dEm9phhzE5uIUShEH/Hjh1EIhFUVaWkpOR1wbCRoL29ndbWVubOnXvGQeg7duxgzpw5Z2X+jxbyI5HKysqYOXPmCRvRM1ubePR3+znSmcT1faQA2/UwtWBDzDg+pq4GQSnhoms6CoKsryA9F03XMRRBNpPC1INNTzfDqArkpIZ0bDTTRPhBpF1IJRgEaITw00Hrp0h1ocYqicosaUIY0sFFQ0pQhYPUQ0T8NBk1guamg5ZTKdA8B6GHiJIlRQhN+iAFGgLTz+GhoijgShVPCwXFL3oMpGABLSS7E1RVlJPO5lCkIJ3NYeg6/eksjuuSzdlkczlK4jF6evupriwn0dnN7Jl1mIZBZXk5juPy/a//FVMnn937NJjYg4dfnIxjx45x55138q//+q9cccUVZ3WvM+DCO7kzmQyvvvoqtbW1zJ8/H8MwRtw8Mhi+71NaWkosFmPHjh1s3ryZo0ePks1mT/hcV1cXO3bsYMmSJRNKbNu2ee2115g0aRL19fWvszBuXFnPf3/qOn70sbexZk4tEUsjZAWmrKoOnOqqgue5gRaZAllfQZU+JSEDUxFk0hnUUAmWaSGtElTpkZM6MtNLLKQRERlUN4OS6cFL9xHGRfECE1pBoIZiKNInRQiRS+EqJl6yK9Avl0EQ0FZNNN9G1XTc3jYi0ibb34lu99HX14/f34Hvutj9XTiKQZIQrmqSVSOF+WK2FsZPdSPSPezpgd0HjtDS1sGWHXtwhWTPwaAK8HDLcSpKApHIVUsWMGPqZN52+SXUVFbwlktX0njoKCWxGL/94xZufvuVZ01s27bZtm0b8+fPH5LYbW1t3HXXXXzve98bK2KPGcbs5O7v72fz5s0nFKY0NzcjpWT69OkjutbpAme5XI6Ojg46OjrwPI+qqiqEEHR3d7N8+fJz6vs+V+Qth7lz5w4ptTwYmZzDD57fxfM7jtKddnA8Pzgl1aAApT/noeIT0RSyvsR1HFQzREwVpGyHsA6O52MaBq5UcRwbRTfRpYenGFiKh40RpLQiZXjJTvRYBZrTjzBihBSXnFCRwkd4PopuYggbz4gEKS81iuLlEKoOqkZYZskSIopNGguQ6MJGogS15wI0Q8dzXDwzjuZm8PQwKAr1Wjdhu5tYJEw6myVsWbR3dmOZJrv3N1FZXkpHVzel8Sj9yTSV5WVUVpRSXlpKznGYXFPNvz30hRFPjYWA2Fu3bmX+/PlDqgIlEgnuuOMOvvnNb3LttdeO+D4jwJic3GMaUEun0ycQLD/svL6+ftjXyRM7L3MzlH+9c+dOUqkUhmFQWVlJTU0NpaWl4z59sbe3lz179rBkyZKzbiZ45UAbD/9qN7uPdQea6Uow7sjxvGDugOvhSpWI6pFxPMKGgS8kHiq6IrA9ULwcpqmh+C6eJ5DCw/YlJdEQrgi+S4mCIxVM4eJqIfyBDjA124sIlQb5bDQkEnJpdMMi09dFvKyMZF8P4VAY23FBeGiREjw7ix4pA0UhJHPklBC6n8OVKqrv4KR70a0wUlHxj2ylxFLp6O4ZqDdvZ/WyRWQyOaorK8jaOUDhcPNxwmGLltYEk2oqiIUj/PNXP8Oi+XNHTG7Hcdi6dStz584dUjmls7OTO+64g7/927/lhhtuOKtnOAJcWOSWUr6u8yY/KXHOnDnDvsZwKs7yI4RisRizZ89GCEFXVxcdHR309/dTVlZGdXU1FRUVYx5USyQSNDU1sXz58rOWlBoMz/f5/363l2e2HeZoRwqJxBeSdM7F1EBVwPMDhRhfKuh45ByPqKGCAq4TqJrqwsHVI8Q1l6RvQKYHwmUDhSllqH4OqeioCuC7+IqOn+5DjZRieikcswRT2thCCzTd/By+HiYiM2QIoxM8JxQIeRmEOjByGHAVHbwcrh6kykKqhytUSlSHePII1eUlbNu9j0VzZvHia9u5fNUyXnptB1ddtor+dIaq8lJ6+lOYpsHWXY088nefZ0ZtBd3d3ViWRXV1NVVVVWf8vvPEnjNnzpDWVE9PD7fffjtf+tKXuOWWW875GQ4DFz6584RbsGDBsH5+OMTO5XJs376durq6E3qw8xBC0NvbSyKRoKenh1gsRk1NDZWVlaOe725ubiaRSLBs2TIMwxjVawP0prL8x+/38MLeVlo6k2RcD0UGm5uiBvPLXMclamk4no/vebiqGQTJFIO45pG2PZxsmpJ4HNexMS0LTfpkXYGlBiOVDEUEAoieSygcRgiBoUo8AXg5FNUgm00TCYfpT2eJhQ3SroKGh7RKAInuZvGNCLqfwfYgaqr093RTUlpGKpvDDEXwFZ2ozDDZb6ckGsb1fMIhi6aWNipKS3htz37etGwhtuNRWV5GfzrDpz94J+948yWF7ySTydDR0UFnZye+71NZWUl1dfXruryGS+y+vj7uuOMOHnzwQW6//fZRf4anwYVFbuB1Mka9vb0cO3aMxYsXD/lzw0lzQeDX79q1iwULFgxLUXVwG2dXVxemaVJTU0N1dXWh1fNsIKXkwIED5HK5EZXSnguyjsdPf7+H3+w+xuFEbzAsAYHrCXzPxzQ0sp7Ad90gOKf6ZF0P3xeETRMJ+DKojLOlShiPHEaQz1ZDRGSONBaGl8FVQ+A7CCFRzRB+sjuQVkp1Y0RLwbPRpI+mqUjPRjctXNdF11Qy0iSquKSFgaJIyPaj6TqubaNrOp4RRvcyTFF6iFkGoVAI0zBo7eymNB4j0d3LjLrJKIrKX9xzK29ZffohA67r0tXVRWdnJ8lkktLS0oLCzo4dO5g1a9aQAdZkMsm73vUuPvGJT3DXXXeN/kM7PS58cieTSZqamli2bNmpbzaCHuxEIsGhQ4dYtmzZWVcIpdPpQkBOURSqq6upqak5rTTPqZAXbwyFQsyZM2fc/fs8Xj3QymMv7WXr/hb6HQXHF0gZkF1Vgu9WBbJOUNMNCkIGp7GpSRxfENMVXAGadJGKTibVj2ZYCM/GRyMSMvF8gaLp6NIli0VUcUhLEwMfIQUClbDM4UsV6buYhoYnVTTpkxKBNRPGRioKvusG9fWqhYnP1IhPZVgna9uUl8TpTmYoL4szd/oUPnr7dUypGV5gEih0ebW3t3Ps2DFisRhTp049rfmeTqd597vfzX333cf73ve+UXoqw8aFR27HcU6QWspms+zdu/eURQAjKSU9cuQI3d3dLF26dNTMX9u2SSQSJ0Tea2pqiEajp11LfupJdXX1iDMAo43e3l727t3L0qVLiUQivLr/OL9oOMzeY90c606SzDh4IhiwkE9HOp5AkUGQLWpoCAm6KkEqZHJZdF3HdRx0w8DSwBMSXVUQQiKkRAMcIbFUhZQnUFUN6Xv4iobhZVANE1UIFAWkoiB9iSAoTVaFi6oO6MIrSjA8UVHQVaivLmHhjBpWLpjJmiXzmFJ9djr3ruuydetW6uvriUajpzXfc7kcd911F/fccw8f/vDZd5adAy58cjuOQ0NDA5deeumJNxmmfy2EYM+ePcEwvzGsOMv3aycSCbLZLBUVFa+LvOdlm+vr66mpqRmTdQwXnZ2dHDx4cMggXs52+eX2JrY2tXPwWA+J/gzJrB2otAiB40k0RWB7AkMFRVFxPRfTCAY4aqoW6LVJGZz8UuD5oGvBJqGpCp7v40nQhYei62hSoChqIP2MRPgSVQVFSgwjGMtUGQ8xqTxO/ZRK3rRgFm9bPR9zFDZs13XZtm0bM2fOfF2f9WDz/f777yeVSnHVVVfxrW99a9R10Jqbm3n/+99PW1sbqqryZ3/2Z3zqU586+WMXPrl93+fVV19lzZo1f7rBMImdPyWrqqqYPn36uJm/vu/T3d1diPSXlpYSj8dpaWlh4cKFQxZAjAdaW1tpaWlh+fLlZxU3SGZtth1qZU9zB80d/SR603R099GfyZJzXFxfomoanh9os7u+j4ISzPseeLZCSFQkvueh6yqWqWNoKpahYuk60ZBBaTTMpLIYM2srWDRrMivmTMMyRz/oCEG78datW5kxY8aQG6/jOLz3ve9lzpw5GIZBY2MjTz755KiupbW1ldbWVlatWkUymWT16tU88cQTLFp0QsnsmLzMY9oepSjKkAqo+fx1/t9Oh3yP7axZs8b9lNQ0raCdJoSgubmZgwcPYhgGzc3N2LY9JpH34aC5uZmOjg5Wrlx51vePhy2uXDyTKxfPfN2/5QOQeXM2ryNXXl4Bmh5szEJg6jpNB/djmuaExh3gT8SePn36kO+K67rcd999XH311XzmM58ZszXnRT0A4vE4Cxcu5NixYyeTe0wwrm9k/gscSeCsp6eHvXv3snjx4iFb8cYD7e3ttLe3c/nll2OaZiHyfvjw4VGLvA8HUkoOHTpEKpVixYoVY+aeDNaRmz17dkFHbt++vQW/taqqigOHDhCNRpk1a9aEE3vbtm1Mnz59yP4Fz/P46Ec/yurVq8eU2Cfj8OHDbN26lcsuu2xc7jchAonDJfbx48dpaWlh5cqVo1IQcrbIB/F6enpYtWpV4ZQcLKCYyWRIJBI0NDScdeR9uGvZt28fQgiWLVs2rmQ6WUeuo6ODhoaGwiSX7u7uE2SIxhN5YtfV1Q1JbN/3+fM//3MWLlzIF77whXH7/lKpFHfccQff/e53x+2QGlOf+2SpJSklL774IjNmzKC6uvq0pqSUkoMHD5JOp1myZMlZ1Q+PFgaTabhBPNu26ejoIJFI4LpuIfIei8XO6WU6X9Ju8KeqwIqKCurq6ujp6aGjo6NQKFRdXU1lZeWYFPOcai35me9DKef6vs/9999PbW0tDz300Lh9f67rcvPNN3P99dfzwAMPnOojF15AbTC584GzVCpFW1sbXV1dhMNhampqqKqqKrwEvu+za9cuwuHwefEC79y5k1gsdtYmZz7y3tHRQTqdPuua93zraHl5OTNnzhzxOkYTvu/T0NBATU1NYeRSHoP99K6urhNiFqNtxeTXMhxiCyF44IEHiMVifPvb3x4360JKyQc+8AEqKir47ne/e7qPXbjkPpV4oZSSdDpNe3s7nZ2dmKZJRUUFbW1t1NXVMXXq1HO59Tkjn7abMmXKqK3lVJH3mpqaM9a8u65bWMupSmzHE57n0dDQUJjScibk/fSOjo4hy0PPBvlNZtKkSUOuRQjBX/3VXwHwT//0T+PqNvzhD3/gyiuvZOnSpYX7fuMb3+DGG28c/LELk9yO4wzLv+7o6GD37t0YhoFlWYUpERPRtpmPzo+l0IOUslDz3t3dTTQaLVgxg90V27ZpaGhg5syZE55Pz+eOp02bdlaS0Pn8ciKRIJ1OU15ePhB9H7mfnid2bW3tkJuvEIK//uu/JplM8oMf/OC8GxwwgAuP3I8++iizZs1ixYoVQ/rNHR0dHDx4kKVLlxKNRgu7fSKRABiz4NSpkJc+Hs/o/MkpJ9M0CzXRe/fuZd68eRM+2N1xnEJRyGhsMnm997yfnt/chuOnD5fYUkq+9rWv0draysMPPzyhsZsz4MIj9+OPP85PfvIT9u3bxzXXXMPatWu59NJLTzDN87napUuXnjKFlC8LTSQS+L5PdXU1tbW1Y6I42dHRUahXH4+N5HTIZDI0NzfT0tJCNBpl8uTJ47a5nQr5jqrZs2ePiSWTn+GVb+gZyk8XQtDQ0EB1dfXr/P2Tr/nNb36TAwcO8Oijj05IHcIIcOGRO49sNsuzzz7Lhg0baGho4K1vfSs33XQTTz/9NHfffffr5nSdDo7jFE50x3GoqqqitrZ2yPrv4aKlpYW2tjaWL18+LhHeoTC4TlzX9TGJvA8X+TLbM4kbjCay2WwhCJn/naurq4lGo4UqxWnTpp3256WUfO9732Pr1q385Cc/mfDnOQxcuOQeDNu2eeKJJ3jwwQepqalh5cqV3H777bz5zW8e0UM4uf67srKS2traEQdqBheETHTaDYauEz/ZZ83XvJeVlY0J0fNa3meSIxpLDP6dOzs7icfjzJo167R+upSS73//+/zhD3/gf/7nf8a8oGiUcHGQG+DLX/4yy5cv55ZbbuHXv/41Gzdu5IUXXuBNb3oT69at461vfeuIHorv+wWip1IpKioqqK2tPWO6Kd+Iktc0n8i0G4ysTvxUkfd8bnk0gkb5oOKZtLzHA0IIduzYQVlZGbFY7AQ/Pa/CYhgGUkoefvhhnnvuOTZu3DihGnojxMVD7lPB8zx+//vfs379en7729+ycuVK1q1bxzXXXDOi6rSTX/ry8vLC6Tb4pc/PAq+srDwvhrjlYw/Lli0bsX843Mj7cJEfXXs+lPwOJvbg53Syn/4f//Ef2LZNc3Mzzz333JhVNN533308/fTT1NTUsHPnztG67MVN7sHwfZ8XX3yRDRs28Ktf/YpFixaxbt063vGOd4wokJaPyLa3t9PX11fIK0ejUXbs2MH06dPPKqUzmsi7BflqvHM9dQe/9Plmj3zN+3BOsmQyyc6dO0+YST1REEKwc+dOSkpKzli48y//8i/893//N2VlZaRSKX75y1+OevsmwO9+9ztisRjvf//7i+Q+VwghePXVV1m/fj3PP/88c+bM4dZbb+WGG24YkbJo/nRraWkhkUhQXl5OXV0dlZWVE+ZnDy5tXbhw4Zi4Bfma946ODuBPacVTbZJ52aply5aNCTFGgjyx4/H4GdVy169fzyOPPMKmTZuIxWKkUqkx3ZgOHz7MzTffXCT3aEIIwbZt29iwYQM///nPmTZtGrfeeis33njjsPqqe3p62LdvH4sXL0YIUTDpIpHIOZmxZ4N8nXg4HGb27Nnj4u8PVfPe19fH3r17Wb58+YSmASHY9PJlv2ci9hNPPMH3v/99nn766XGLDRTJPcbIvwAbNmxg06ZNVFVVsW7dOm666aZTqlu2t7dz5MgRli1bdoI/ljdj82WwoVCoYMaOVQolXydeUVExYf6+53mFIGR/fz+e57Fw4UJqamomNLAopWTXrl1EIhFmzZo15Gc3bdrEP/7jP7Jp06ZxjeYXyT2OyJu3GzZs4KmnnqKkpIRbb72VW265herqal5++WVM0xxWsGpwvbuu64Uy2NFKqZxPdeIQyE3v37+fGTNm0NPTU4hNjGbkfbiQUrJ7925CoRCzZ88e8rPPPfccDz30EM8888ywJ7qMForkniDk20U3btzIE088QV9fH1OmTOH73/8+U6ZMGdGpNNhfVVW14K+ebSQ2P5/qfNBdg6Air6mpiRUrVhQ2r9GOvA8XeWJblnVGN+XXv/41X/nKV9i0adOEfI9Fck8wpJTce++9VFRUUF9fz5NPPokQgltuuYV169ZRV1c3IqLncrlCGayUslAGO1z/NJ83Ph/qxCFwU44ePcqKFStO636ca+R9uJBSsmfPHgzDOGOb7+9//3u+8IUvsGnTpgnJdNxzzz385je/obOzk9raWr761a+OhmJqkdwjxc6dO1myJBCxl1LS2trKxo0befzxx8lms9x0002sXbt2xL3ajuMUiO55XuFEP12EOZ9eOh/yxhAUyxw7dowVK1aM6DTOT/fo6OgobHCni7wPF1JK9u7di67rZyT2Sy+9xIMPPsjTTz894S3Bo4wiuUcTiUSCxx9/nMcee4zu7m5uvPFG1q1bN+JKtbzcUHt7O7ZtF174fO13fijg+ZBegmDWdL6G/lzM7PwG19HRUajzH2nNe57YmqYxd+7cIX9u8+bN3H///fzsZz+bcI34MUCR3GOFrq4unnzySTZu3EhbWxvXX389t912GwsXLhxRQGlwBDqTyRAOh0mn06xcuXLC00sQVMF1dnaybNmyUc3tD/69h1vzng+CKopyxg1127ZtfPzjH+fxxx8/YwT9AkWR3OOB3t5ennrqKR577DGampp4xzvewbp161i+fPmIiH7s2DEOHz5MLBYjk8mMeZPHmXD48GF6e3tZtmzZmEbA8/PRE4kEfX19lJSUFNRm8huKlJLGxkaklMyfP3/I72Pnzp185CMfYcOGDcybN2/M1j3BKJJ7vJFMJtm0aRMbN25k3759XHvttaxdu5ZLLrlkSIIcPXq0cELqul544dvb2wsjhWtqasZNKXRw19t4p7b6+voKxUL5Ro++vj6AMxJ7z549fOhDH+KnP/3puOh8TyCK5J5IDO5J3759O29961tZu3Yta9asOeFEOlOdeH6kcHt7O729vYWTbSxyyvm0YH766EQXp6RSKfbu3UsmkyEejw8ZeW9sbOT9738/P/7xj1m6dOkErHhccWGS+7Of/SxPPfUUpmkye/ZsfvSjH034CJ5zRS6X4/nnn2fDhg1s2bKFK664gltvvZVNmzZx1113cemllw6LSPmTrb29ne7u7sLs8KqqqnP2ifOmr+/7Y1a3PtL1HDhwANd1WbhwYSG1eKrIe1NTE+95z3v493//91MOjRwNPPvss3zqU5/C930+8pGPFAQUJwgXJrmfe+45rrnmGnRd53Of+xwAf//3f3+ulz1v4DgOzz//PJ/+9KeJRCKsWrWK2267jauuumpEVW1SSvr7+wsmbF72eSh996GutXfvXhRFOaPpOx7IWxC2bbNo0aLXrSevsNPQ0MAXv/hFXNflb/7mb7j33nvHZO2+7zNv3jyef/556urquPTSS/mv//qviTT9x+QBjbkDdt111xVezjVr1tDS0jLWtxxXmKbJgQMH+Iu/+Au2bNnC+973Pn7+85/zlre8hY997GP8/Oc/J5fLnfE6iqJQWlrK3Llzueyyy5g9ezaZTIYtW7awdetWjh8/juu6Z7xOvtJL1/XzgtgQ+PynIzYE3+HUqVNZvnw58XicD37wg2zatInPfvazY7KeV155hTlz5jBr1ixM0+Tuu+8e9QGA5wPGVTXukUce4a677hrPW44L7r///sJLe80113DNNdfg+z4vvPACGzdu5Ctf+QqLFy9m3bp1vP3tbz9j0YeiKMRiMWKxGLNnzyadTpNIJNi6dWuh3v1Uvmq+0yzfdHG+EDubzZ7R529ra+Ouu+7iu9/9LlddddWYrunYsWMnaLDV1dXx8ssvj+k9JwKjQu63v/3ttLW1ve7/f/3rX2ft2rWF/9Z1nXvvvXc0bnle4VQvraZpXHXVVVx11VUIIXjllVfYsGEDDz30EHPmzGHdunVcf/31w+o7jkaj1NfXU19fTzabJZFIsH37dhRFOaGxZceOHZSWlk74RJI8mpqaCsHFoYidSCS48847+da3vjXmxAY4lSt6PmyEo41RIfcvfvGLIf/90Ucf5emnn+aXv/zlRfklngmqqrJmzRrWrFlT6Elfv3493/nOd5g+fXqhJ304/cjhcJgZM2YwY8aMguzzzp07SSaThRTb+YCmpiaSyeQZid3Z2cmdd97J17/+da699tpxWVtdXR3Nzc2Fv7e0tJwXHXqjjTEPqD377LM88MAD/Pa3v6W6uvpcL3dRId+Tvn79ep555hmqq6tZu3YtN99887CbS/IC/RUVFRiGQXt7O67rnlAGO944fPgw/f39Z8yr9/T0cPvtt/OlL32JW265ZdzW53ke8+bN45e//CVTp07l0ksv5Sc/+QmLFy8etzWchAszWj5nzpzCgHoIgmo/+MEPzvWyFx3yEe4NGzYUVEVuvfVWbr75Zqqrq095+uXH1p7cG56XfW5vbyeXyxXqvkdjPteZcOTIEXp7e0+YjXUq9PX1cccdd/Dggw9y++23j+maToVnnnmGT3/60/i+z3333ccXv/jFcV/DIFyY5C5i5Bjck/7kk09iWRa33HILa9euZdKkSSiKMuy5XZ7n0dXVRXt7+zlNGR0Ojh49Sk9PzxmJnUwmede73sUnPvGJizLAehYoknsorF+/nq985Svs2bOHV155hUsuuWSilzQqkFJy9OjRQqsqwLXXXstzzz3HI488MqIOqbzsc3t7O8lksiD7XF5efs5EP3r0KN3d3WesXU+n07z73e/mvvvu433ve9853fMiQpHcQ2HPnj2oqsrHPvYxvv3tb1805B4MKSXbt2/n1ltvZcaMGYWh7mvXrqW+vn5EBD2V7HNtbe1Z1bvnu83O1FyTzWZ597vfzb333st99903ontc5BgTcp/X09FGgoULF070EsYciqLw0ksv8aMf/Yi3ve1thZ70Bx54gN7eXm688UbWrl07rJ50VVWprKyksrISKSU9PT0kEgkaGxuJx+PU1tae0Ml1OrS0tAyL2LlcjnvvvZc777yTD33oQ2f1+xcxMlw0J3ceV1999UV7cg+Frq4unnjiCR577DHa29tP6Ekf6ey0kzu5amtrT1nvnteAX758+ZCbgOM4vPe97+W6667jk5/85BsyHXoGFM3y4RTLvFHJPRi9vb387Gc/47HHHuPIkSOFnvSR9nLn54bnNdRCoVCB6IlEgvb29jMS23VdPvjBD/LmN7+Zz3zmM0VinxpFcg8HRXKfiME96Y2NjYWe9NWrV4/Yt86LJR4/fhzP85g9eza1tbWnbZDxPI8Pf/jDrFy5ks9//vNFYp8eF2bjSBETi3g8zt1338369et56aWXePOb38wPf/hDrrjiCj73uc/x4osv4vv+sK4Vi8UIh8OEw2FWr16N7/ts27aNLVu20NzcjG3bhc/6vs/HP/5xFi1aNG7EXr9+PYsXL0ZVVTZv3jzm9zvfcdGc3I8//jif/OQn6ejooKysjBUrVvC///u/E72s8xaDe9Jfe+01rrjiCm677TauuOKK07aYtra2cvz4cVasWHGCKT5Y9rmnp4cXX3yR5uZmZsyYwTe+8Y1xO7Ev4IxJ0SwvYmzgOA6/+tWv2LhxIy+99BKXXXYZ69at48orryyY3G1tbbS0tJxRDjmRSPCpT32KHTt2MGnSJD7ykY+Me9rrAnTNiqmwicR5ptwxqjBNkxtuuIEbbrgBz/P43e9+x/r16/n85z/PqlWrqK2tJZlM8s1vfnNIYgsh+Pa3v820adN4/PHH6e3t5fDhw+P3ixRxAoon9zBwHip3jAt83+ehhx7ihz/8IVVVVSxYsIC1a9eesiddCMGXv/xlUqkUP/jBD8ZMiPEizZgUT+6JwmDlDqCg3HGxkzsv+Jifk/3KK6+wfv16HnroIebOncu6deu47rrriEajfO1rX6O7u5uHH354TBVWz9ReXMSfUCT3MPBGUe44Gbqu88gjjxT+PrgnfevWraxfv55/+Id/wHEc5s2bx4YNG0Z12EER54ZiKmwYeKModwwXqqqyevVq/u7v/o4tW7bw0EMP8Z//+Z8TTuzHH3+curo6XnrpJW666Sauv/76CV3PRKN4cg8DbxTljrOBqqrceuutE70MAG677TZuu+22iV7GeYPiyT0MXHrppezfv5+mpiYcx+GnP/3pefNCF1HE6VA8uYcBXdf553/+Z66//vqCcscESvIUUcSwUEyFFVHExKNYW/5GwX333UdNTQ1LliyZ6KUUcQGjSO7zEB/84Ad59tlnJ3oZRVzgKJL7PMRVV101bGnjIoo4HYrkLqKIixRFchdxXuGzn/0sCxYsYNmyZdx222309vZO9JIuWBTJXcR5hXe84x3s3LmT7du3M2/ePB566KGJXtIFiyK5izivcLGPfB5PFMl9HuKee+7h8ssvZ9++fdTV1fHwww9P9JImBI888gjvfOc7J3oZFyyKRSxFjDuGO/J58+bNPPbYY2+EJp0JkVkq4iKHoijTgP8AJgEC+Dcp5fcmeE0fAP4PcK2UMjORa7mQUST3GxyKokwGJkspX1MUJQ5sAdZJKXdP0HpuAL4DvFVK2TERa7hYUCR3ESdAUZQngX+WUj4/Qfc/AFhA18D/+qOU8v9MxFoudBTJXUQBiqLMBH4HLJFS9k/wcoo4RxSj5UUAoChKDNgIfLpI7IsDRXIXgaIoBgGxfyylfGyi11PE6KBolr/BoQR5pkeBbinlpyd4OUWMIorkfoNDUZS3AL8HdhCkwgC+IKV8ZuJWVcRooEjuIoq4SFH0uYso4iJFkdxFFHGRokjuIoq4SFEkdxFFXKQokruIIi5SFMldRBEXKYrkLqKIixRFchdRxEWK/x85iTX/0M/NzgAAAABJRU5ErkJggg==\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_56_2.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"\n",
|
||
"import numpy as np\n",
|
||
"import numpy.linalg as la\n",
|
||
"\n",
|
||
"import scipy.optimize as sopt\n",
|
||
"\n",
|
||
"import matplotlib.pyplot as pt\n",
|
||
"from mpl_toolkits.mplot3d import axes3d\n",
|
||
"\n",
|
||
"def f(x):\n",
|
||
" return 0.5*x[0]**2 + 2.5*x[1]**2\n",
|
||
"\n",
|
||
"def df(x):\n",
|
||
" return np.array([x[0], 5*x[1]])\n",
|
||
"\n",
|
||
"fig = pt.figure()\n",
|
||
"ax = fig.gca(projection=\"3d\")\n",
|
||
"\n",
|
||
"xmesh, ymesh = np.mgrid[-2:2:50j,-2:2:50j]\n",
|
||
"fmesh = f(np.array([xmesh, ymesh]))\n",
|
||
"ax.plot_surface(xmesh, ymesh, fmesh)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"And then as countor plot"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_58_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"pt.axis(\"equal\")\n",
|
||
"pt.contour(xmesh, ymesh, fmesh)\n",
|
||
"guesses = [np.array([2, 2./5])]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Find guesses"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"x = guesses[-1]\n",
|
||
"s = -df(x)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Run it!"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[ 1.33333333 -0.26666667]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def f1d(alpha):\n",
|
||
" return f(x + alpha*s)\n",
|
||
"\n",
|
||
"alpha_opt = sopt.golden(f1d)\n",
|
||
"next_guess = x + alpha_opt * s\n",
|
||
"guesses.append(next_guess)\n",
|
||
"print(next_guess)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"What happened?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[<matplotlib.lines.Line2D at 0x7fad20f69be0>]"
|
||
]
|
||
},
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_64_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"pt.axis(\"equal\")\n",
|
||
"pt.contour(xmesh, ymesh, fmesh, 50)\n",
|
||
"it_array = np.array(guesses)\n",
|
||
"pt.plot(it_array.T[0], it_array.T[1], \"x-\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Conjugate gradient method\n",
|
||
"In the CG method we define so-called conjugate directions and two vectors \n",
|
||
"$\\boldsymbol{s}$ and $\\boldsymbol{t}$\n",
|
||
"are said to be\n",
|
||
"conjugate if"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{s}^T\\boldsymbol{A}\\boldsymbol{t}= 0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The philosophy of the CG method is to perform searches in various conjugate directions\n",
|
||
"of our vectors $\\boldsymbol{x}_i$ obeying the above criterion, namely"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{x}_i^T\\boldsymbol{A}\\boldsymbol{x}_j= 0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Two vectors are conjugate if they are orthogonal with respect to \n",
|
||
"this inner product. Being conjugate is a symmetric relation: if $\\boldsymbol{s}$ is conjugate to $\\boldsymbol{t}$, then $\\boldsymbol{t}$ is conjugate to $\\boldsymbol{s}$.\n",
|
||
"\n",
|
||
"An example is given by the eigenvectors of the matrix"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{v}_i^T\\boldsymbol{A}\\boldsymbol{v}_j= \\lambda\\boldsymbol{v}_i^T\\boldsymbol{v}_j,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which is zero unless $i=j$. \n",
|
||
"\n",
|
||
"Assume now that we have a symmetric positive-definite matrix $\\boldsymbol{A}$ of size\n",
|
||
"$n\\times n$. At each iteration $i+1$ we obtain the conjugate direction of a vector"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{x}_{i+1}=\\boldsymbol{x}_{i}+\\alpha_i\\boldsymbol{p}_{i}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We assume that $\\boldsymbol{p}_{i}$ is a sequence of $n$ mutually conjugate directions. \n",
|
||
"Then the $\\boldsymbol{p}_{i}$ form a basis of $R^n$ and we can expand the solution \n",
|
||
"$ \\boldsymbol{A}\\boldsymbol{x} = \\boldsymbol{b}$ in this basis, namely"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i \\boldsymbol{p}_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The coefficients are given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{A}\\mathbf{x} = \\sum^{n}_{i=1} \\alpha_i \\mathbf{A} \\mathbf{p}_i = \\mathbf{b}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Multiplying with $\\boldsymbol{p}_k^T$ from the left gives"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{x} = \\sum^{n}_{i=1} \\alpha_i\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{p}_i= \\boldsymbol{p}_k^T \\boldsymbol{b},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and we can define the coefficients $\\alpha_k$ as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\alpha_k = \\frac{\\boldsymbol{p}_k^T \\boldsymbol{b}}{\\boldsymbol{p}_k^T \\boldsymbol{A} \\boldsymbol{p}_k}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"If we choose the conjugate vectors $\\boldsymbol{p}_k$ carefully, \n",
|
||
"then we may not need all of them to obtain a good approximation to the solution \n",
|
||
"$\\boldsymbol{x}$. \n",
|
||
"We want to regard the conjugate gradient method as an iterative method. \n",
|
||
"This will us to solve systems where $n$ is so large that the direct \n",
|
||
"method would take too much time.\n",
|
||
"\n",
|
||
"We denote the initial guess for $\\boldsymbol{x}$ as $\\boldsymbol{x}_0$. \n",
|
||
"We can assume without loss of generality that"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{x}_0=0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or consider the system"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}\\boldsymbol{z} = \\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_0,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"instead.\n",
|
||
"\n",
|
||
"One can show that the solution $\\boldsymbol{x}$ is also the unique minimizer of the quadratic form"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"f(\\boldsymbol{x}) = \\frac{1}{2}\\boldsymbol{x}^T\\boldsymbol{A}\\boldsymbol{x} - \\boldsymbol{x}^T \\boldsymbol{x} , \\quad \\boldsymbol{x}\\in\\mathbf{R}^n.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This suggests taking the first basis vector $\\boldsymbol{p}_1$ \n",
|
||
"to be the gradient of $f$ at $\\boldsymbol{x}=\\boldsymbol{x}_0$, \n",
|
||
"which equals"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{A}\\boldsymbol{x}_0-\\boldsymbol{b},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and \n",
|
||
"$\\boldsymbol{x}_0=0$ it is equal $-\\boldsymbol{b}$.\n",
|
||
"The other vectors in the basis will be conjugate to the gradient, \n",
|
||
"hence the name conjugate gradient method.\n",
|
||
"\n",
|
||
"Let $\\boldsymbol{r}_k$ be the residual at the $k$-th step:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{r}_k=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that $\\boldsymbol{r}_k$ is the negative gradient of $f$ at \n",
|
||
"$\\boldsymbol{x}=\\boldsymbol{x}_k$, \n",
|
||
"so the gradient descent method would be to move in the direction $\\boldsymbol{r}_k$. \n",
|
||
"Here, we insist that the directions $\\boldsymbol{p}_k$ are conjugate to each other, \n",
|
||
"so we take the direction closest to the gradient $\\boldsymbol{r}_k$ \n",
|
||
"under the conjugacy constraint. \n",
|
||
"This gives the following expression"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{p}_{k+1}=\\boldsymbol{r}_k-\\frac{\\boldsymbol{p}_k^T \\boldsymbol{A}\\boldsymbol{r}_k}{\\boldsymbol{p}_k^T\\boldsymbol{A}\\boldsymbol{p}_k} \\boldsymbol{p}_k.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can also compute the residual iteratively as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{r}_{k+1}=\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_{k+1},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which equals"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{b}-\\boldsymbol{A}(\\boldsymbol{x}_k+\\alpha_k\\boldsymbol{p}_k),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"or"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"(\\boldsymbol{b}-\\boldsymbol{A}\\boldsymbol{x}_k)-\\alpha_k\\boldsymbol{A}\\boldsymbol{p}_k,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which gives"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{r}_{k+1}=\\boldsymbol{r}_k-\\boldsymbol{A}\\boldsymbol{p}_{k},\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Revisiting our Linear Regression Solvers\n",
|
||
"\n",
|
||
"We will use linear regression as a case study for the gradient descent\n",
|
||
"methods. Linear regression is a great test case for the gradient\n",
|
||
"descent methods discussed in the lectures since it has several\n",
|
||
"desirable properties such as:\n",
|
||
"\n",
|
||
"1. An analytical solution.\n",
|
||
"\n",
|
||
"2. The gradient can be computed analytically.\n",
|
||
"\n",
|
||
"3. The cost function is convex which guarantees that gradient descent converges for small enough learning rates\n",
|
||
"\n",
|
||
"We revisit an example similar to what we had in the first homework set. We had a function of the type"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"m = 100\n",
|
||
"x = 2*np.random.rand(m,1)\n",
|
||
"y = 4+3*x+np.random.randn(m,1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"with $x_i \\in [0,1] $ is chosen randomly using a uniform distribution. Additionally we have a stochastic noise chosen according to a normal distribution $\\cal {N}(0,1)$. \n",
|
||
"The linear regression model is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"h_\\beta(x) = \\boldsymbol{y} = \\beta_0 + \\beta_1 x,\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"such that"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{y}_i = \\beta_0 + \\beta_1 x_i.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Let $\\mathbf{y} = (y_1,\\cdots,y_n)^T$, $\\mathbf{\\boldsymbol{y}} = (\\boldsymbol{y}_1,\\cdots,\\boldsymbol{y}_n)^T$ and $\\beta = (\\beta_0, \\beta_1)^T$\n",
|
||
"\n",
|
||
"It is convenient to write $\\mathbf{\\boldsymbol{y}} = X\\beta$ where $X \\in \\mathbb{R}^{100 \\times 2} $ is the design matrix given by (we keep the intercept here)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"X \\equiv \\begin{bmatrix}\n",
|
||
"1 & x_1 \\\\\n",
|
||
"\\vdots & \\vdots \\\\\n",
|
||
"1 & x_{100} & \\\\\n",
|
||
"\\end{bmatrix}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The cost/loss/risk function is given by ("
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\beta) = \\frac{1}{n}||X\\beta-\\mathbf{y}||_{2}^{2} = \\frac{1}{n}\\sum_{i=1}^{100}\\left[ (\\beta_0 + \\beta_1 x_i)^2 - 2 y_i (\\beta_0 + \\beta_1 x_i) + y_i^2\\right]\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"and we want to find $\\beta$ such that $C(\\beta)$ is minimized.\n",
|
||
"\n",
|
||
"\n",
|
||
"Computing $\\partial C(\\beta) / \\partial \\beta_0$ and $\\partial C(\\beta) / \\partial \\beta_1$ we can show that the gradient can be written as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\nabla_{\\beta} C(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n",
|
||
"\\sum_{i=1}^{100}\\left( x_i (\\beta_0+\\beta_1x_i)-y_ix_i\\right) \\\\\n",
|
||
"\\end{bmatrix} = \\frac{2}{n}X^T(X\\beta - \\mathbf{y}),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $X$ is the design matrix defined above.\n",
|
||
"\n",
|
||
"\n",
|
||
"The Hessian matrix of $C(\\beta)$ is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{H} \\equiv \\begin{bmatrix}\n",
|
||
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0^2} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} \\\\\n",
|
||
"\\frac{\\partial^2 C(\\beta)}{\\partial \\beta_0 \\partial \\beta_1} & \\frac{\\partial^2 C(\\beta)}{\\partial \\beta_1^2} & \\\\\n",
|
||
"\\end{bmatrix} = \\frac{2}{n}X^T X.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"We can now write a program that minimizes $C(\\beta)$ using the gradient descent method with a constant learning rate $\\gamma$ according to"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can use the expression we computed for the gradient and let use a\n",
|
||
"$\\beta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n",
|
||
"when $||\\nabla_\\beta C(\\beta_k) || \\leq \\epsilon = 10^{-8}$. **Note that the code below does not include the latter stop criterion**.\n",
|
||
"\n",
|
||
"And finally we can compare our solution for $\\beta$ with the analytic result given by \n",
|
||
"$\\beta= (X^TX)^{-1} X^T \\mathbf{y}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Here is our simple example"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[0.32903042 4.1484256 ]\n",
|
||
"[[4.04621521]\n",
|
||
" [3.00415763]]\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[[4.04621521]\n",
|
||
" [3.00415763]]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_118_2.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"# Importing various packages\n",
|
||
"from random import random, seed\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from mpl_toolkits.mplot3d import Axes3D\n",
|
||
"from matplotlib import cm\n",
|
||
"from matplotlib.ticker import LinearLocator, FormatStrFormatter\n",
|
||
"import sys\n",
|
||
"\n",
|
||
"# the number of datapoints\n",
|
||
"n = 100\n",
|
||
"x = 2*np.random.rand(n,1)\n",
|
||
"y = 4+3*x+np.random.randn(n,1)\n",
|
||
"\n",
|
||
"X = np.c_[np.ones((n,1)), x]\n",
|
||
"# Hessian matrix\n",
|
||
"H = (2.0/n)* X.T @ X\n",
|
||
"# Get the eigenvalues\n",
|
||
"EigValues, EigVectors = np.linalg.eig(H)\n",
|
||
"print(EigValues)\n",
|
||
"\n",
|
||
"beta_linreg = np.linalg.inv(X.T @ X) @ X.T @ y\n",
|
||
"print(beta_linreg)\n",
|
||
"beta = np.random.randn(2,1)\n",
|
||
"\n",
|
||
"eta = 1.0/np.max(EigValues)\n",
|
||
"Niterations = 1000\n",
|
||
"\n",
|
||
"for iter in range(Niterations):\n",
|
||
" gradient = (2.0/n)*X.T @ (X @ beta-y)\n",
|
||
" beta -= eta*gradient\n",
|
||
"\n",
|
||
"print(beta)\n",
|
||
"xnew = np.array([[0],[2]])\n",
|
||
"xbnew = np.c_[np.ones((2,1)), xnew]\n",
|
||
"ypredict = xbnew.dot(beta)\n",
|
||
"ypredict2 = xbnew.dot(beta_linreg)\n",
|
||
"plt.plot(xnew, ypredict, \"r-\")\n",
|
||
"plt.plot(xnew, ypredict2, \"b-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0,2.0,0, 15.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Gradient descent example')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Alternatively, we can use **Scikit-Learn** as done here"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[[3.97230501]\n",
|
||
" [3.14741468]]\n",
|
||
"[3.94735055] [3.17084902]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Importing various packages\n",
|
||
"from random import random, seed\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.linear_model import SGDRegressor\n",
|
||
"\n",
|
||
"n = 100\n",
|
||
"x = 2*np.random.rand(n,1)\n",
|
||
"y = 4+3*x+np.random.randn(n,1)\n",
|
||
"\n",
|
||
"X = np.c_[np.ones((n,1)), x]\n",
|
||
"beta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n",
|
||
"print(beta_linreg)\n",
|
||
"sgdreg = SGDRegressor(max_iter = 50, penalty=None, eta0=0.1)\n",
|
||
"sgdreg.fit(x,y.ravel())\n",
|
||
"print(sgdreg.intercept_, sgdreg.coef_)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We have also discussed Ridge regression where the loss function contains a regularized term given by the $L_2$ norm of $\\beta$,"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C_{\\text{ridge}}(\\beta) = \\frac{1}{n}||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we only have adjust the gradient as follows"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\nabla_\\beta C_{\\text{ridge}}(\\beta) = \\frac{2}{n}\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\beta_0+\\beta_1x_i-y_i\\right) \\\\\n",
|
||
"\\sum_{i=1}^{100}\\left( x_i (\\beta_0+\\beta_1x_i)-y_ix_i\\right) \\\\\n",
|
||
"\\end{bmatrix} + 2\\lambda\\begin{bmatrix} \\beta_0 \\\\ \\beta_1\\end{bmatrix} = 2 (X^T(X\\beta - \\mathbf{y})+\\lambda \\beta).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can easily extend our program to minimize $C_{\\text{ridge}}(\\beta)$ using gradient descent and compare with the analytical solution given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_{\\text{ridge}} = \\left(X^T X + \\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[[3.92343595]\n",
|
||
" [3.15258907]]\n",
|
||
"[[3.815563 ]\n",
|
||
" [3.23522201]]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_127_1.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from random import random, seed\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from mpl_toolkits.mplot3d import Axes3D\n",
|
||
"from matplotlib import cm\n",
|
||
"from matplotlib.ticker import LinearLocator, FormatStrFormatter\n",
|
||
"import sys\n",
|
||
"\n",
|
||
"# the number of datapoints\n",
|
||
"n = 100\n",
|
||
"x = 2*np.random.rand(n,1)\n",
|
||
"y = 4+3*x+np.random.randn(n,1)\n",
|
||
"\n",
|
||
"X = np.c_[np.ones((n,1)), x]\n",
|
||
"XT_X = X.T @ X\n",
|
||
"\n",
|
||
"#Ridge parameter lambda\n",
|
||
"lmbda = 0.001\n",
|
||
"Id = lmbda* np.eye(XT_X.shape[0])\n",
|
||
"\n",
|
||
"beta_linreg = np.linalg.inv(XT_X+Id) @ X.T @ y\n",
|
||
"print(beta_linreg)\n",
|
||
"# Start plain gradient descent\n",
|
||
"beta = np.random.randn(2,1)\n",
|
||
"\n",
|
||
"eta = 0.1\n",
|
||
"Niterations = 100\n",
|
||
"\n",
|
||
"for iter in range(Niterations):\n",
|
||
" gradients = 2.0/n*X.T @ (X @ (beta)-y)+2*lmbda*beta\n",
|
||
" beta -= eta*gradients\n",
|
||
"\n",
|
||
"print(beta)\n",
|
||
"ypredict = X @ beta\n",
|
||
"ypredict2 = X @ beta_linreg\n",
|
||
"plt.plot(x, ypredict, \"r-\")\n",
|
||
"plt.plot(x, ypredict2, \"b-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0,2.0,0, 15.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Gradient descent example for Ridge')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Using gradient descent methods, limitations\n",
|
||
"\n",
|
||
"* **Gradient descent (GD) finds local minima of our function**. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our cost/loss/risk function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.\n",
|
||
"\n",
|
||
"* **GD is sensitive to initial conditions**. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.\n",
|
||
"\n",
|
||
"* **Gradients are computationally expensive to calculate for large datasets**. In many cases in statistics and ML, the cost/loss/risk function is a sum of terms, with one term for each data point. For example, in linear regression, $E \\propto \\sum_{i=1}^n (y_i - \\mathbf{w}^T\\cdot\\mathbf{x}_i)^2$; for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over *all* $n$ data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called \"mini batches\". This has the added benefit of introducing stochasticity into our algorithm.\n",
|
||
"\n",
|
||
"* **GD is very sensitive to choices of learning rates**. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would *adaptively* choose the learning rates to match the landscape.\n",
|
||
"\n",
|
||
"* **GD treats all directions in parameter space uniformly.** Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive. \n",
|
||
"\n",
|
||
"* GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points.\n",
|
||
"\n",
|
||
"## Stochastic Gradient Descent\n",
|
||
"\n",
|
||
"Stochastic gradient descent (SGD) and variants thereof address some of\n",
|
||
"the shortcomings of the Gradient descent method discussed above.\n",
|
||
"\n",
|
||
"The underlying idea of SGD comes from the observation that the cost\n",
|
||
"function, which we want to minimize, can almost always be written as a\n",
|
||
"sum over $n$ data points $\\{\\mathbf{x}_i\\}_{i=1}^n$,"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n",
|
||
"\\mathbf{\\beta}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This in turn means that the gradient can be\n",
|
||
"computed as a sum over $i$-gradients"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\nabla_\\beta C(\\mathbf{\\beta}) = \\sum_i^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
|
||
"\\mathbf{\\beta}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Stochasticity/randomness is introduced by only taking the\n",
|
||
"gradient on a subset of the data called minibatches. If there are $n$\n",
|
||
"data points and the size of each minibatch is $M$, there will be $n/M$\n",
|
||
"minibatches. We denote these minibatches by $B_k$ where\n",
|
||
"$k=1,\\cdots,n/M$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"As an example, suppose we have $10$ data points $(\\mathbf{x}_1,\\cdots, \\mathbf{x}_{10})$ \n",
|
||
"and we choose to have $M=5$ minibathces,\n",
|
||
"then each minibatch contains two data points. In particular we have\n",
|
||
"$B_1 = (\\mathbf{x}_1,\\mathbf{x}_2), \\cdots, B_5 =\n",
|
||
"(\\mathbf{x}_9,\\mathbf{x}_{10})$. Note that if you choose $M=1$ you\n",
|
||
"have only a single batch with all data points and on the other extreme,\n",
|
||
"you may choose $M=n$ resulting in a minibatch for each datapoint, i.e\n",
|
||
"$B_k = \\mathbf{x}_k$.\n",
|
||
"\n",
|
||
"The idea is now to approximate the gradient by replacing the sum over\n",
|
||
"all data points with a sum over the data points in one the minibatches\n",
|
||
"picked at random in each gradient descent step"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\nabla_{\\beta}\n",
|
||
"C(\\mathbf{\\beta}) = \\sum_{i=1}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
|
||
"\\mathbf{\\beta}) \\rightarrow \\sum_{i \\in B_k}^n \\nabla_\\beta\n",
|
||
"c_i(\\mathbf{x}_i, \\mathbf{\\beta}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Thus a gradient descent step now looks like"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\beta_{j+1} = \\beta_j - \\gamma_j \\sum_{i \\in B_k}^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n",
|
||
"\\mathbf{\\beta})\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $k$ is picked at random with equal\n",
|
||
"probability from $[1,n/M]$. An iteration over the number of\n",
|
||
"minibathces (n/M) is commonly referred to as an epoch. Thus it is\n",
|
||
"typical to choose a number of epochs and for each epoch iterate over\n",
|
||
"the number of minibatches, as exemplified in the code below."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"\n",
|
||
"n = 100 #100 datapoints \n",
|
||
"M = 5 #size of each minibatch\n",
|
||
"m = int(n/M) #number of minibatches\n",
|
||
"n_epochs = 10 #number of epochs\n",
|
||
"\n",
|
||
"j = 0\n",
|
||
"for epoch in range(1,n_epochs+1):\n",
|
||
" for i in range(m):\n",
|
||
" k = np.random.randint(m) #Pick the k-th minibatch at random\n",
|
||
" #Compute the gradient using the data in minibatch Bk\n",
|
||
" #Compute new suggestion for \n",
|
||
" j += 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Taking the gradient only on a subset of the data has two important\n",
|
||
"benefits. First, it introduces randomness which decreases the chance\n",
|
||
"that our opmization scheme gets stuck in a local minima. Second, if\n",
|
||
"the size of the minibatches are small relative to the number of\n",
|
||
"datapoints ($M < n$), the computation of the gradient is much\n",
|
||
"cheaper since we sum over the datapoints in the $k-th$ minibatch and not\n",
|
||
"all $n$ datapoints.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"A natural question is when do we stop the search for a new minimum?\n",
|
||
"One possibility is to compute the full gradient after a given number\n",
|
||
"of epochs and check if the norm of the gradient is smaller than some\n",
|
||
"threshold and stop if true. However, the condition that the gradient\n",
|
||
"is zero is valid also for local minima, so this would only tell us\n",
|
||
"that we are close to a local/global minimum. However, we could also\n",
|
||
"evaluate the cost function at this point, store the result and\n",
|
||
"continue the search. If the test kicks in at a later stage we can\n",
|
||
"compare the values of the cost function and keep the $\\beta$ that\n",
|
||
"gave the lowest value.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Another approach is to let the step length $\\gamma_j$ depend on the\n",
|
||
"number of epochs in such a way that it becomes very small after a\n",
|
||
"reasonable time such that we do not move at all.\n",
|
||
"\n",
|
||
"As an example, let $e = 0,1,2,3,\\cdots$ denote the current epoch and let $t_0, t_1 > 0$ be two fixed numbers. Furthermore, let $t = e \\cdot m + i$ where $m$ is the number of minibatches and $i=0,\\cdots,m-1$. Then the function $$\\gamma_j(t; t_0, t_1) = \\frac{t_0}{t+t_1} $$ goes to zero as the number of epochs gets large. I.e. we start with a step length $\\gamma_j (0; t_0, t_1) = t_0/t_1$ which decays in *time* $t$.\n",
|
||
"\n",
|
||
"In this way we can fix the number of epochs, compute $\\beta$ and\n",
|
||
"evaluate the cost function at the end. Repeating the computation will\n",
|
||
"give a different result since the scheme is random by design. Then we\n",
|
||
"pick the final $\\beta$ that gives the lowest value of the cost\n",
|
||
"function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"gamma_j after 500 epochs: 9.97108e-05\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np \n",
|
||
"\n",
|
||
"def step_length(t,t0,t1):\n",
|
||
" return t0/(t+t1)\n",
|
||
"\n",
|
||
"n = 100 #100 datapoints \n",
|
||
"M = 5 #size of each minibatch\n",
|
||
"m = int(n/M) #number of minibatches\n",
|
||
"n_epochs = 500 #number of epochs\n",
|
||
"t0 = 1.0\n",
|
||
"t1 = 10\n",
|
||
"\n",
|
||
"gamma_j = t0/t1\n",
|
||
"j = 0\n",
|
||
"for epoch in range(1,n_epochs+1):\n",
|
||
" for i in range(m):\n",
|
||
" k = np.random.randint(m) #Pick the k-th minibatch at random\n",
|
||
" #Compute the gradient using the data in minibatch Bk\n",
|
||
" #Compute new suggestion for beta\n",
|
||
" t = epoch*m+i\n",
|
||
" gamma_j = step_length(t,t0,t1)\n",
|
||
" j += 1\n",
|
||
"\n",
|
||
"print(\"gamma_j after %d epochs: %g\" % (n_epochs,gamma_j))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Program for stochastic gradient"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Own inversion\n",
|
||
"[[4.15629539]\n",
|
||
" [2.7293182 ]]\n",
|
||
"sgdreg from scikit\n",
|
||
"[4.0728785] [2.66410989]\n",
|
||
"theta from own gd\n",
|
||
"[[4.15629539]\n",
|
||
" [2.7293182 ]]\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"theta from own sdg\n",
|
||
"[[4.15454301]\n",
|
||
" [2.72522848]]\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_141_2.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Importing various packages\n",
|
||
"from math import exp, sqrt\n",
|
||
"from random import random, seed\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.linear_model import SGDRegressor\n",
|
||
"\n",
|
||
"m = 100\n",
|
||
"x = 2*np.random.rand(m,1)\n",
|
||
"y = 4+3*x+np.random.randn(m,1)\n",
|
||
"\n",
|
||
"X = np.c_[np.ones((m,1)), x]\n",
|
||
"theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)\n",
|
||
"print(\"Own inversion\")\n",
|
||
"print(theta_linreg)\n",
|
||
"sgdreg = SGDRegressor(max_iter = 50, penalty=None, eta0=0.1)\n",
|
||
"sgdreg.fit(x,y.ravel())\n",
|
||
"print(\"sgdreg from scikit\")\n",
|
||
"print(sgdreg.intercept_, sgdreg.coef_)\n",
|
||
"\n",
|
||
"\n",
|
||
"theta = np.random.randn(2,1)\n",
|
||
"eta = 0.1\n",
|
||
"Niterations = 1000\n",
|
||
"\n",
|
||
"\n",
|
||
"for iter in range(Niterations):\n",
|
||
" gradients = 2.0/m*X.T @ ((X @ theta)-y)\n",
|
||
" theta -= eta*gradients\n",
|
||
"print(\"theta from own gd\")\n",
|
||
"print(theta)\n",
|
||
"\n",
|
||
"xnew = np.array([[0],[2]])\n",
|
||
"Xnew = np.c_[np.ones((2,1)), xnew]\n",
|
||
"ypredict = Xnew.dot(theta)\n",
|
||
"ypredict2 = Xnew.dot(theta_linreg)\n",
|
||
"\n",
|
||
"\n",
|
||
"n_epochs = 50\n",
|
||
"t0, t1 = 5, 50\n",
|
||
"def learning_schedule(t):\n",
|
||
" return t0/(t+t1)\n",
|
||
"\n",
|
||
"theta = np.random.randn(2,1)\n",
|
||
"\n",
|
||
"for epoch in range(n_epochs):\n",
|
||
" for i in range(m):\n",
|
||
" random_index = np.random.randint(m)\n",
|
||
" xi = X[random_index:random_index+1]\n",
|
||
" yi = y[random_index:random_index+1]\n",
|
||
" gradients = 2 * xi.T @ ((xi @ theta)-yi)\n",
|
||
" eta = learning_schedule(epoch*m+i)\n",
|
||
" theta = theta - eta*gradients\n",
|
||
"print(\"theta from own sdg\")\n",
|
||
"print(theta)\n",
|
||
"\n",
|
||
"plt.plot(xnew, ypredict, \"r-\")\n",
|
||
"plt.plot(xnew, ypredict2, \"b-\")\n",
|
||
"plt.plot(x, y ,'ro')\n",
|
||
"plt.axis([0,2.0,0, 15.0])\n",
|
||
"plt.xlabel(r'$x$')\n",
|
||
"plt.ylabel(r'$y$')\n",
|
||
"plt.title(r'Random numbers ')\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Momentum based GD\n",
|
||
"\n",
|
||
"The stochastic gradient descent (SGD) is almost always used with a\n",
|
||
"*momentum* or inertia term that serves as a memory of the direction we\n",
|
||
"are moving in parameter space. This is typically implemented as\n",
|
||
"follows"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<!-- Equation labels as ordinary links -->\n",
|
||
"<div id=\"_auto1\"></div>\n",
|
||
"\n",
|
||
"$$\n",
|
||
"\\begin{equation} \n",
|
||
"\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t},\n",
|
||
"\\label{_auto1} \\tag{2}\n",
|
||
"\\end{equation}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have introduced a momentum parameter $\\gamma$, with\n",
|
||
"$0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to\n",
|
||
"indicate the gradient is to be taken over a different mini-batch at\n",
|
||
"each step. We call this algorithm gradient descent with momentum\n",
|
||
"(GDM). From these equations, it is clear that $\\mathbf{v}_t$ is a\n",
|
||
"running average of recently encountered gradients and\n",
|
||
"$(1-\\gamma)^{-1}$ sets the characteristic time scale for the memory\n",
|
||
"used in the averaging procedure. Consistent with this, when\n",
|
||
"$\\gamma=0$, this just reduces down to ordinary SGD as discussed\n",
|
||
"earlier. An equivalent way of writing the updates is"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Let us try to get more intuition from these equations. It is helpful\n",
|
||
"to consider a simple physical analogy with a particle of mass $m$\n",
|
||
"moving in a viscous medium with drag coefficient $\\mu$ and potential\n",
|
||
"$E(\\mathbf{w})$. If we denote the particle's position by $\\mathbf{w}$,\n",
|
||
"then its motion is described by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m {d^2 \\mathbf{w} \\over dt^2} + \\mu {d \\mathbf{w} \\over dt }= -\\nabla_w E(\\mathbf{w}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"We can discretize this equation in the usual way to get"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"m { \\mathbf{w}_{t+\\Delta t}-2 \\mathbf{w}_{t} +\\mathbf{w}_{t-\\Delta t} \\over (\\Delta t)^2}+\\mu {\\mathbf{w}_{t+\\Delta t}- \\mathbf{w}_{t} \\over \\Delta t} = -\\nabla_w E(\\mathbf{w}).\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Rearranging this equation, we can rewrite this as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta \\mathbf{w}_{t +\\Delta t}= - { (\\Delta t)^2 \\over m +\\mu \\Delta t} \\nabla_w E(\\mathbf{w})+ {m \\over m +\\mu \\Delta t} \\Delta \\mathbf{w}_t.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Notice that this equation is identical to previous one if we identify\n",
|
||
"the position of the particle, $\\mathbf{w}$, with the parameters\n",
|
||
"$\\boldsymbol{\\theta}$. This allows us to identify the momentum\n",
|
||
"parameter and learning rate with the mass of the particle and the\n",
|
||
"viscous drag as:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\gamma= {m \\over m +\\mu \\Delta t }, \\qquad \\eta = {(\\Delta t)^2 \\over m +\\mu \\Delta t}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Thus, as the name suggests, the momentum parameter is proportional to\n",
|
||
"the mass of the particle and effectively provides inertia.\n",
|
||
"Furthermore, in the large viscosity/small learning rate limit, our\n",
|
||
"memory time scales as $(1-\\gamma)^{-1} \\approx m/(\\mu \\Delta t)$.\n",
|
||
"\n",
|
||
"Why is momentum useful? SGD momentum helps the gradient descent\n",
|
||
"algorithm gain speed in directions with persistent but small gradients\n",
|
||
"even in the presence of stochasticity, while suppressing oscillations\n",
|
||
"in high-curvature directions. This becomes especially important in\n",
|
||
"situations where the landscape is shallow and flat in some directions\n",
|
||
"and narrow and steep in others. It has been argued that first-order\n",
|
||
"methods (with appropriate initial conditions) can perform comparable\n",
|
||
"to more expensive second order methods, especially in the context of\n",
|
||
"complex deep learning models.\n",
|
||
"\n",
|
||
"These beneficial properties of momentum can sometimes become even more\n",
|
||
"pronounced by using a slight modification of the classical momentum\n",
|
||
"algorithm called Nesterov Accelerated Gradient (NAG).\n",
|
||
"\n",
|
||
"In the NAG algorithm, rather than calculating the gradient at the\n",
|
||
"current parameters, $\\nabla_\\theta E(\\boldsymbol{\\theta}_t)$, one\n",
|
||
"calculates the gradient at the expected value of the parameters given\n",
|
||
"our current momentum, $\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma\n",
|
||
"\\mathbf{v}_{t-1})$. This yields the NAG update rule"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma \\mathbf{v}_{t-1}) \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<!-- Equation labels as ordinary links -->\n",
|
||
"<div id=\"_auto2\"></div>\n",
|
||
"\n",
|
||
"$$\n",
|
||
"\\begin{equation} \n",
|
||
"\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t}.\n",
|
||
"\\label{_auto2} \\tag{3}\n",
|
||
"\\end{equation}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of $\\gamma$.\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"In stochastic gradient descent, with and without momentum, we still\n",
|
||
"have to specify a schedule for tuning the learning rates $\\eta_t$\n",
|
||
"as a function of time. As discussed in the context of Newton's\n",
|
||
"method, this presents a number of dilemmas. The learning rate is\n",
|
||
"limited by the steepest direction which can change depending on the\n",
|
||
"current position in the landscape. To circumvent this problem, ideally\n",
|
||
"our algorithm would keep track of curvature and take large steps in\n",
|
||
"shallow, flat directions and small steps in steep, narrow directions.\n",
|
||
"Second-order methods accomplish this by calculating or approximating\n",
|
||
"the Hessian and normalizing the learning rate by the\n",
|
||
"curvature. However, this is very computationally expensive for\n",
|
||
"extremely large models. Ideally, we would like to be able to\n",
|
||
"adaptively change the step size to match the landscape without paying\n",
|
||
"the steep computational price of calculating or approximating\n",
|
||
"Hessians.\n",
|
||
"\n",
|
||
"Recently, a number of methods have been introduced that accomplish\n",
|
||
"this by tracking not only the gradient, but also the second moment of\n",
|
||
"the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and\n",
|
||
"ADAM.\n",
|
||
"\n",
|
||
"\n",
|
||
"### RMS prop\n",
|
||
"\n",
|
||
"In RMS prop, in addition to keeping a running average of the first\n",
|
||
"moment of the gradient, we also keep track of the second moment\n",
|
||
"denoted by $\\mathbf{s}_t=\\mathbb{E}[\\mathbf{g}_t^2]$. The update rule\n",
|
||
"for RMS prop is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<!-- Equation labels as ordinary links -->\n",
|
||
"<div id=\"_auto3\"></div>\n",
|
||
"\n",
|
||
"$$\n",
|
||
"\\begin{equation}\n",
|
||
"\\mathbf{g}_t = \\nabla_\\theta E(\\boldsymbol{\\theta}) \n",
|
||
"\\label{_auto3} \\tag{4}\n",
|
||
"\\end{equation}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{s}_t =\\beta \\mathbf{s}_{t-1} +(1-\\beta)\\mathbf{g}_t^2 \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\mathbf{g}_t \\over \\sqrt{\\mathbf{s}_t +\\epsilon}}, \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\beta$ controls the averaging time of the second moment and is\n",
|
||
"typically taken to be about $\\beta=0.9$, $\\eta_t$ is a learning rate\n",
|
||
"typically chosen to be $10^{-3}$, and $\\epsilon\\sim 10^{-8} $ is a\n",
|
||
"small regularization constant to prevent divergences. Multiplication\n",
|
||
"and division by vectors is understood as an element-wise operation. It\n",
|
||
"is clear from this formula that the learning rate is reduced in\n",
|
||
"directions where the norm of the gradient is consistently large. This\n",
|
||
"greatly speeds up the convergence by allowing us to use a larger\n",
|
||
"learning rate for flat directions.\n",
|
||
"\n",
|
||
"### ADAM optimizer\n",
|
||
"\n",
|
||
"A related algorithm is the ADAM optimizer. In ADAM, we keep a running\n",
|
||
"average of both the first and second moment of the gradient and use\n",
|
||
"this information to adaptively change the learning rate for different\n",
|
||
"parameters. In addition to keeping a running average of the first and\n",
|
||
"second moments of the gradient\n",
|
||
"(i.e. $\\mathbf{m}_t=\\mathbb{E}[\\mathbf{g}_t]$ and\n",
|
||
"$\\mathbf{s}_t=\\mathbb{E}[\\mathbf{g}^2_t]$, respectively), ADAM\n",
|
||
"performs an additional bias correction to account for the fact that we\n",
|
||
"are estimating the first two moments of the gradient using a running\n",
|
||
"average (denoted by the hats in the update rule below). The update\n",
|
||
"rule for ADAM is given by (where multiplication and division are once\n",
|
||
"again understood to be element-wise operations below)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<!-- Equation labels as ordinary links -->\n",
|
||
"<div id=\"_auto4\"></div>\n",
|
||
"\n",
|
||
"$$\n",
|
||
"\\begin{equation}\n",
|
||
"\\mathbf{g}_t = \\nabla_\\theta E(\\boldsymbol{\\theta}) \n",
|
||
"\\label{_auto4} \\tag{5}\n",
|
||
"\\end{equation}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{m}_t = \\beta_1 \\mathbf{m}_{t-1} + (1-\\beta_1) \\mathbf{g}_t \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\mathbf{s}_t =\\beta_2 \\mathbf{s}_{t-1} +(1-\\beta_2)\\mathbf{g}_t^2 \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\mathbf{m}}_t={\\mathbf{m}_t \\over 1-\\beta_1^t} \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\mathbf{s}}_t ={\\mathbf{s}_t \\over1-\\beta_2^t} \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\boldsymbol{\\mathbf{m}}_t \\over \\sqrt{\\boldsymbol{\\mathbf{s}}_t} +\\epsilon}, \\nonumber\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"<!-- Equation labels as ordinary links -->\n",
|
||
"<div id=\"_auto5\"></div>\n",
|
||
"\n",
|
||
"$$\n",
|
||
"\\begin{equation} \n",
|
||
"\\label{_auto5} \\tag{6}\n",
|
||
"\\end{equation}\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"where $\\beta_1$ and $\\beta_2$ set the memory lifetime of the first and\n",
|
||
"second moment and are typically taken to be $0.9$ and $0.99$\n",
|
||
"respectively, and $\\eta$ and $\\epsilon$ are identical to RMSprop.\n",
|
||
"\n",
|
||
"Like in RMSprop, the effective step size of a parameter depends on the\n",
|
||
"magnitude of its gradient squared. To understand this better, let us\n",
|
||
"rewrite this expression in terms of the variance\n",
|
||
"$\\boldsymbol{\\sigma}_t^2 = \\boldsymbol{\\mathbf{s}}_t -\n",
|
||
"(\\boldsymbol{\\mathbf{m}}_t)^2$. Consider a single parameter $\\theta_t$. The\n",
|
||
"update rule for this parameter is given by"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"\\Delta \\theta_{t+1}= -\\eta_t { \\boldsymbol{m}_t \\over \\sqrt{\\sigma_t^2 + m_t^2 }+\\epsilon}.\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Practical tips\n",
|
||
"\n",
|
||
"* **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.\n",
|
||
"\n",
|
||
"* **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the cost function is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.\n",
|
||
"\n",
|
||
"* **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings.\n",
|
||
"\n",
|
||
"* **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.\n",
|
||
"\n",
|
||
"## Automatic differentiation\n",
|
||
"\n",
|
||
"[Automatic differentiation (AD)](https://en.wikipedia.org/wiki/Automatic_differentiation), \n",
|
||
"also called algorithmic\n",
|
||
"differentiation or computational differentiation,is a set of\n",
|
||
"techniques to numerically evaluate the derivative of a function\n",
|
||
"specified by a computer program. AD exploits the fact that every\n",
|
||
"computer program, no matter how complicated, executes a sequence of\n",
|
||
"elementary arithmetic operations (addition, subtraction,\n",
|
||
"multiplication, division, etc.) and elementary functions (exp, log,\n",
|
||
"sin, cos, etc.). By applying the chain rule repeatedly to these\n",
|
||
"operations, derivatives of arbitrary order can be computed\n",
|
||
"automatically, accurately to working precision, and using at most a\n",
|
||
"small constant factor more arithmetic operations than the original\n",
|
||
"program.\n",
|
||
"\n",
|
||
"Automatic differentiation is neither:\n",
|
||
"\n",
|
||
"* Symbolic differentiation, nor\n",
|
||
"\n",
|
||
"* Numerical differentiation (the method of finite differences).\n",
|
||
"\n",
|
||
"Symbolic differentiation can lead to inefficient code and faces the\n",
|
||
"difficulty of converting a computer program into a single expression,\n",
|
||
"while numerical differentiation can introduce round-off errors in the\n",
|
||
"discretization process and cancellation\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"Python has tools for so-called **automatic differentiation**.\n",
|
||
"Consider the following example"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"f(x) = \\sin\\left(2\\pi x + x^2\\right)\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"which has the following derivative"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"$$\n",
|
||
"f'(x) = \\cos\\left(2\\pi x + x^2\\right)\\left(2\\pi + 2x\\right)\n",
|
||
"$$"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Using **autograd** we have"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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\n",
|
||
"text/plain": [
|
||
"<Figure size 432x288 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {
|
||
"filenames": {
|
||
"image/png": "/Users/MortenImac/Teaching/MachineLearning/doc/LectureNotes/_build/jupyter_execute/chapteroptimization_177_0.png"
|
||
},
|
||
"needs_background": "light"
|
||
},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The max absolute difference is: 1.77636e-15\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"\n",
|
||
"# To do elementwise differentiation:\n",
|
||
"from autograd import elementwise_grad as egrad \n",
|
||
"\n",
|
||
"# To plot:\n",
|
||
"import matplotlib.pyplot as plt \n",
|
||
"\n",
|
||
"\n",
|
||
"def f(x):\n",
|
||
" return np.sin(2*np.pi*x + x**2)\n",
|
||
"\n",
|
||
"def f_grad_analytic(x):\n",
|
||
" return np.cos(2*np.pi*x + x**2)*(2*np.pi + 2*x)\n",
|
||
"\n",
|
||
"# Do the comparison:\n",
|
||
"x = np.linspace(0,1,1000)\n",
|
||
"\n",
|
||
"f_grad = egrad(f)\n",
|
||
"\n",
|
||
"computed = f_grad(x)\n",
|
||
"analytic = f_grad_analytic(x)\n",
|
||
"\n",
|
||
"plt.title('Derivative computed from Autograd compared with the analytical derivative')\n",
|
||
"plt.plot(x,computed,label='autograd')\n",
|
||
"plt.plot(x,analytic,label='analytic')\n",
|
||
"\n",
|
||
"plt.xlabel('x')\n",
|
||
"plt.ylabel('y')\n",
|
||
"plt.legend()\n",
|
||
"\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"print(\"The max absolute difference is: %g\"%(np.max(np.abs(computed - analytic))))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here we\n",
|
||
"experiment with what kind of functions Autograd is capable\n",
|
||
"of finding the gradient of. The following Python functions are just\n",
|
||
"meant to illustrate what Autograd can do, but please feel free to\n",
|
||
"experiment with other, possibly more complicated, functions as well."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The gradient of f1 evaluated at a = 1 using autograd is: 3\n",
|
||
"The gradient of f1 evaluated at a = 1 by finding the analytic expression is: 3\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"\n",
|
||
"def f1(x):\n",
|
||
" return x**3 + 1\n",
|
||
"\n",
|
||
"f1_grad = grad(f1)\n",
|
||
"\n",
|
||
"# Remember to send in float as argument to the computed gradient from Autograd!\n",
|
||
"a = 1.0\n",
|
||
"\n",
|
||
"# See the evaluated gradient at a using autograd:\n",
|
||
"print(\"The gradient of f1 evaluated at a = %g using autograd is: %g\"%(a,f1_grad(a)))\n",
|
||
"\n",
|
||
"# Compare with the analytical derivative, that is f1'(x) = 3*x**2 \n",
|
||
"grad_analytical = 3*a**2\n",
|
||
"print(\"The gradient of f1 evaluated at a = %g by finding the analytic expression is: %g\"%(a,grad_analytical))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"To differentiate with respect to two (or more) arguments of a Python\n",
|
||
"function, Autograd need to know at which variable the function if\n",
|
||
"being differentiated with respect to."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Evaluating at x1 = 1, x2 = 3\n",
|
||
"------------------------------\n",
|
||
"The derivative of f2 w.r.t x1: 12\n",
|
||
"The analytical derivative of f2 w.r.t x1: 12\n",
|
||
"\n",
|
||
"The derivative of f2 w.r.t x2: -4\n",
|
||
"The analytical derivative of f2 w.r.t x2: -4\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"def f2(x1,x2):\n",
|
||
" return 3*x1**3 + x2*(x1 - 5) + 1\n",
|
||
"\n",
|
||
"# By sending the argument 0, Autograd will compute the derivative w.r.t the first variable, in this case x1\n",
|
||
"f2_grad_x1 = grad(f2,0)\n",
|
||
"\n",
|
||
"# ... and differentiate w.r.t x2 by sending 1 as an additional arugment to grad\n",
|
||
"f2_grad_x2 = grad(f2,1)\n",
|
||
"\n",
|
||
"x1 = 1.0\n",
|
||
"x2 = 3.0 \n",
|
||
"\n",
|
||
"print(\"Evaluating at x1 = %g, x2 = %g\"%(x1,x2))\n",
|
||
"print(\"-\"*30)\n",
|
||
"\n",
|
||
"# Compare with the analytical derivatives:\n",
|
||
"\n",
|
||
"# Derivative of f2 w.r.t x1 is: 9*x1**2 + x2:\n",
|
||
"f2_grad_x1_analytical = 9*x1**2 + x2\n",
|
||
"\n",
|
||
"# Derivative of f2 w.r.t x2 is: x1 - 5:\n",
|
||
"f2_grad_x2_analytical = x1 - 5\n",
|
||
"\n",
|
||
"# See the evaluated derivations:\n",
|
||
"print(\"The derivative of f2 w.r.t x1: %g\"%( f2_grad_x1(x1,x2) ))\n",
|
||
"print(\"The analytical derivative of f2 w.r.t x1: %g\"%( f2_grad_x1(x1,x2) ))\n",
|
||
"\n",
|
||
"print()\n",
|
||
"\n",
|
||
"print(\"The derivative of f2 w.r.t x2: %g\"%( f2_grad_x2(x1,x2) ))\n",
|
||
"print(\"The analytical derivative of f2 w.r.t x2: %g\"%( f2_grad_x2(x1,x2) ))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that the grad function will not produce the true gradient of the function. The true gradient of a function with two or more variables will produce a vector, where each element is the function differentiated w.r.t a variable."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The computed gradient of f3 is: [ 2. 3. 5. 7. 88.]\n",
|
||
"The analytical gradient of f3 is: [ 2. 3. 5. 7. 88.]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"def f3(x): # Assumes x is an array of length 5 or higher\n",
|
||
" return 2*x[0] + 3*x[1] + 5*x[2] + 7*x[3] + 11*x[4]**2\n",
|
||
"\n",
|
||
"f3_grad = grad(f3)\n",
|
||
"\n",
|
||
"x = np.linspace(0,4,5)\n",
|
||
"\n",
|
||
"# Print the computed gradient:\n",
|
||
"print(\"The computed gradient of f3 is: \", f3_grad(x))\n",
|
||
"\n",
|
||
"# The analytical gradient is: (2, 3, 5, 7, 22*x[4])\n",
|
||
"f3_grad_analytical = np.array([2, 3, 5, 7, 22*x[4]])\n",
|
||
"\n",
|
||
"# Print the analytical gradient:\n",
|
||
"print(\"The analytical gradient of f3 is: \", f3_grad_analytical)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that in this case, when sending an array as input argument, the\n",
|
||
"output from Autograd is another array. This is the true gradient of\n",
|
||
"the function, as opposed to the function in the previous example. By\n",
|
||
"using arrays to represent the variables, the output from Autograd\n",
|
||
"might be easier to work with, as the output is closer to what one\n",
|
||
"could expect form a gradient-evaluting function."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The computed derivative of f4 at x = 2.7 is: 13.8759\n",
|
||
"The analytical gradient of f4 at x = 2.7 is: 13.8759\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"def f4(x):\n",
|
||
" return np.sqrt(1+x**2) + np.exp(x) + np.sin(2*np.pi*x)\n",
|
||
"\n",
|
||
"f4_grad = grad(f4)\n",
|
||
"\n",
|
||
"x = 2.7\n",
|
||
"\n",
|
||
"# Print the computed derivative:\n",
|
||
"print(\"The computed derivative of f4 at x = %g is: %g\"%(x,f4_grad(x)))\n",
|
||
"\n",
|
||
"# The analytical derivative is: x/sqrt(1 + x**2) + exp(x) + cos(2*pi*x)*2*pi\n",
|
||
"f4_grad_analytical = x/np.sqrt(1 + x**2) + np.exp(x) + np.cos(2*np.pi*x)*2*np.pi\n",
|
||
"\n",
|
||
"# Print the analytical gradient:\n",
|
||
"print(\"The analytical gradient of f4 at x = %g is: %g\"%(x,f4_grad_analytical))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The computed derivative of f5 at x = 2.7 is: 5.4\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"def f5(x):\n",
|
||
" if x >= 0:\n",
|
||
" return x**2\n",
|
||
" else:\n",
|
||
" return -3*x + 1\n",
|
||
"\n",
|
||
"f5_grad = grad(f5)\n",
|
||
"\n",
|
||
"x = 2.7\n",
|
||
"\n",
|
||
"# Print the computed derivative:\n",
|
||
"print(\"The computed derivative of f5 at x = %g is: %g\"%(x,f5_grad(x)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"1\n",
|
||
"8\n",
|
||
" \n",
|
||
"<\n",
|
||
"<\n",
|
||
"<\n",
|
||
"!\n",
|
||
"!\n",
|
||
"C\n",
|
||
"O\n",
|
||
"D\n",
|
||
"E\n",
|
||
"_\n",
|
||
"B\n",
|
||
"L\n",
|
||
"O\n",
|
||
"C\n",
|
||
"K\n",
|
||
" \n",
|
||
" \n",
|
||
"p\n",
|
||
"y\n",
|
||
"c\n",
|
||
"o\n",
|
||
"d"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The analytical derivative of f6 at x = 2.7 is: 37732.5\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"# Both of the functions are implementation of the sum: sum(x**i) for i = 0, ..., 9\n",
|
||
"# The analytical derivative is: sum(i*x**(i-1)) \n",
|
||
"f6_grad_analytical = 0\n",
|
||
"for i in range(10):\n",
|
||
" f6_grad_analytical += i*x**(i-1)\n",
|
||
"\n",
|
||
"print(\"The analytical derivative of f6 at x = %g is: %g\"%(x,f6_grad_analytical))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"The computed derivative of f7 at n = 2 is: 1\n",
|
||
"The analytical derivative of f7 at n = 2 is: 1\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"\n",
|
||
"def f7(n): # Assume that n is an integer\n",
|
||
" if n == 1 or n == 0:\n",
|
||
" return 1\n",
|
||
" else:\n",
|
||
" return n*f7(n-1)\n",
|
||
"\n",
|
||
"f7_grad = grad(f7)\n",
|
||
"\n",
|
||
"n = 2.0\n",
|
||
"\n",
|
||
"print(\"The computed derivative of f7 at n = %d is: %g\"%(n,f7_grad(n)))\n",
|
||
"\n",
|
||
"# The function f7 is an implementation of the factorial of n.\n",
|
||
"# By using the product rule, one can find that the derivative is:\n",
|
||
"\n",
|
||
"f7_grad_analytical = 0\n",
|
||
"for i in range(int(n)-1):\n",
|
||
" tmp = 1\n",
|
||
" for k in range(int(n)-1):\n",
|
||
" if k != i:\n",
|
||
" tmp *= (n - k)\n",
|
||
" f7_grad_analytical += tmp\n",
|
||
"\n",
|
||
"print(\"The analytical derivative of f7 at n = %d is: %g\"%(n,f7_grad_analytical))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Note that if n is equal to zero or one, Autograd will give an error message. This message appears when the output is independent on input.\n",
|
||
"\n",
|
||
"\n",
|
||
"Autograd supports many features. However, there are some functions that are not supported (yet) by Autograd.\n",
|
||
"\n",
|
||
"Assigning a value to the variable being differentiated with respect to is an example thereof."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"#import autograd.numpy as np\n",
|
||
"#from autograd import grad\n",
|
||
"#def f8(x): # Assume x is an array\n",
|
||
"# x[2] = 3\n",
|
||
"# return x*2\n",
|
||
"\n",
|
||
"#f8_grad = grad(f8)\n",
|
||
"\n",
|
||
"#x = 8.4\n",
|
||
"\n",
|
||
"#print(\"The derivative of f8 is:\",f8_grad(x))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The item assignment is done when the program tries to assign x[2] to the value 3. However, Autograd has implemented the computation of the derivative such that this assignment is not possible."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"ename": "AttributeError",
|
||
"evalue": "'ArrayBox' object has no attribute 'dot'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
|
||
"\u001b[0;32m/var/folders/jy/g42mrgv128v34gnnhxwk9nrc0000gp/T/ipykernel_42573/546166676.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"The derivative of f9 is:\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mf9_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
|
||
"\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36mnary_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0munary_operator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0munary_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mnary_op_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mnary_op_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_f\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnary_operator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/autograd/differential_operators.py\u001b[0m in \u001b[0;36mgrad\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0marguments\u001b[0m \u001b[0;32mas\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbut\u001b[0m \u001b[0mreturns\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgradient\u001b[0m \u001b[0minstead\u001b[0m\u001b[0;34m.\u001b[0m \u001b[0mThe\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m should be scalar-valued. The gradient has the same type as the argument.\"\"\"\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mvjp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mans\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_make_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 26\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mans\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m raise TypeError(\"Grad only applies to real scalar-output functions. \"\n",
|
||
"\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/autograd/core.py\u001b[0m in \u001b[0;36mmake_vjp\u001b[0;34m(fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmake_vjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mVJPNode\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_root\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_node\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mend_node\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mvjp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mvspace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/autograd/tracer.py\u001b[0m in \u001b[0;36mtrace\u001b[0;34m(start_node, fun, x)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace_stack\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnew_trace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mstart_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnew_box\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart_node\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mend_box\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstart_box\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misbox\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mend_box\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mstart_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_trace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend_box\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_node\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;32m~/anaconda3/lib/python3.8/site-packages/autograd/wrap_util.py\u001b[0m in \u001b[0;36munary_f\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0msubargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msubvals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 15\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0msubargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 16\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0margnum\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;32m/var/folders/jy/g42mrgv128v34gnnhxwk9nrc0000gp/T/ipykernel_42573/546166676.py\u001b[0m in \u001b[0;36mf9\u001b[0;34m(a)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf9\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# Assume a is an array with 2 elements\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mf9_grad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgrad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf9\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
|
||
"\u001b[0;31mAttributeError\u001b[0m: 'ArrayBox' object has no attribute 'dot'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"def f9(a): # Assume a is an array with 2 elements\n",
|
||
" b = np.array([1.0,2.0])\n",
|
||
" return a.dot(b)\n",
|
||
"\n",
|
||
"f9_grad = grad(f9)\n",
|
||
"\n",
|
||
"x = np.array([1.0,0.0])\n",
|
||
"\n",
|
||
"print(\"The derivative of f9 is:\",f9_grad(x))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"Here we are told that the 'dot' function does not belong to Autograd's\n",
|
||
"version of a Numpy array. To overcome this, an alternative syntax\n",
|
||
"which also computed the dot product can be used:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"import autograd.numpy as np\n",
|
||
"from autograd import grad\n",
|
||
"def f9_alternative(x): # Assume a is an array with 2 elements\n",
|
||
" b = np.array([1.0,2.0])\n",
|
||
" return np.dot(x,b) # The same as x_1*b_1 + x_2*b_2\n",
|
||
"\n",
|
||
"f9_alternative_grad = grad(f9_alternative)\n",
|
||
"\n",
|
||
"x = np.array([3.0,0.0])\n",
|
||
"\n",
|
||
"print(\"The gradient of f9 is:\",f9_alternative_grad(x))\n",
|
||
"\n",
|
||
"# The analytical gradient of the dot product of vectors x and b with two elements (x_1,x_2) and (b_1, b_2) respectively\n",
|
||
"# w.r.t x is (b_1, b_2)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"The documentation recommends to avoid inplace operations such as"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"collapsed": false,
|
||
"editable": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"a += b\n",
|
||
"a -= b\n",
|
||
"a*= b\n",
|
||
"a /=b"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"More examples will be added, in particular how to compare autograd with own codes for the gradients."
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.8.12"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |