From 20fc52ba78a781ddb3c1ae87df352681c2a10a37 Mon Sep 17 00:00:00 2001 From: mhjensen Date: Thu, 20 Sep 2018 11:32:52 +0200 Subject: [PATCH] Update on splines --- doc/pub/Splines/html/._Splines-bs001.html | 10 +- doc/pub/Splines/html/._Splines-bs003.html | 4 +- doc/pub/Splines/html/._Splines-bs004.html | 15 +- doc/pub/Splines/html/._Splines-bs005.html | 8 +- doc/pub/Splines/html/._Splines-bs006.html | 20 +- doc/pub/Splines/html/._Splines-bs007.html | 4 +- doc/pub/Splines/html/._Splines-bs008.html | 2 + doc/pub/Splines/html/._Splines-bs009.html | 2 +- doc/pub/Splines/html/._Splines-bs010.html | 4 +- doc/pub/Splines/html/._Splines-bs011.html | 11 +- doc/pub/Splines/html/._Splines-bs012.html | 27 ++- doc/pub/Splines/html/._Splines-bs013.html | 9 +- doc/pub/Splines/html/._Splines-bs014.html | 8 +- doc/pub/Splines/html/._Splines-bs015.html | 8 +- doc/pub/Splines/html/._Splines-bs016.html | 8 +- doc/pub/Splines/html/._Splines-bs017.html | 18 +- doc/pub/Splines/html/._Splines-bs018.html | 26 +-- doc/pub/Splines/html/._Splines-bs019.html | 4 +- doc/pub/Splines/html/._Splines-bs020.html | 4 +- doc/pub/Splines/html/._Splines-bs021.html | 8 +- doc/pub/Splines/html/._Splines-bs022.html | 4 +- doc/pub/Splines/html/._Splines-bs023.html | 2 +- doc/pub/Splines/html/._Splines-bs024.html | 2 +- doc/pub/Splines/html/._Splines-bs025.html | 6 +- doc/pub/Splines/html/Splines-reveal.html | 218 ++++++++++-------- doc/pub/Splines/html/Splines-solarized.html | 214 +++++++++-------- doc/pub/Splines/html/Splines.html | 214 +++++++++-------- doc/pub/Splines/ipynb/Splines.ipynb | 211 +++++++++-------- .../Splines/ipynb/ipynb-Splines-src.tar.gz | Bin 209 -> 210 bytes doc/pub/Splines/pdf/Splines-minted.pdf | Bin 384862 -> 364005 bytes doc/src/Splines/Splines.do.txt | 200 ++++++++-------- 31 files changed, 692 insertions(+), 579 deletions(-) diff --git a/doc/pub/Splines/html/._Splines-bs001.html b/doc/pub/Splines/html/._Splines-bs001.html index 49705e442..ad05fabe2 100644 --- a/doc/pub/Splines/html/._Splines-bs001.html +++ b/doc/pub/Splines/html/._Splines-bs001.html @@ -178,11 +178,11 @@ MathJax.Hub.Config({

Almost every problem in machine learning and data science starts with -a dataset \( X \), a model \( g(\theta) \), which is a function of the -parameters \( \theta \) and a cost function \( C(X, g(\theta)) \) that allows -us to judge how well the model \( g(\theta) \) explains the observations -\( X \). The model is fit by finding the values of \( \theta \) that minimize -the cost function. Ideally we would be able to solve for \( \theta \) +a dataset \( X \), a model \( g(\beta) \), which is a function of the +parameters \( \beta \) and a cost function \( C(X, g(\beta)) \) that allows +us to judge how well the model \( g(\beta) \) explains the observations +\( X \). The model is fit by finding the values of \( \beta \) that minimize +the cost function. Ideally we would be able to solve for \( \beta \) analytically, however this is not possible in general and we must use some approximative/numerical method to compute the minimum. diff --git a/doc/pub/Splines/html/._Splines-bs003.html b/doc/pub/Splines/html/._Splines-bs003.html index 3580baca9..90b01b5c8 100644 --- a/doc/pub/Splines/html/._Splines-bs003.html +++ b/doc/pub/Splines/html/._Splines-bs003.html @@ -180,7 +180,7 @@ MathJax.Hub.Config({ The previous observation is the basis of the method of steepest descent, which is also referred to as just gradient descent (GD). One starts with an initial guess \( \mathbf{x}_0 \) for a minimum of \( F \) and -compute new approximations according to +computes new approximations according to $$ \mathbf{x}_{k+1} = \mathbf{x}_k - \gamma_k \nabla F(\mathbf{x}_k), \ \ k \geq 0. @@ -188,7 +188,7 @@ $$

The parameter \( \gamma_k \) is often referred to as the step length or -the learning rate in the context of Machine Learning. +the learning rate within the context of Machine Learning.

diff --git a/doc/pub/Splines/html/._Splines-bs004.html b/doc/pub/Splines/html/._Splines-bs004.html index f85e6f20c..9484ecc0c 100644 --- a/doc/pub/Splines/html/._Splines-bs004.html +++ b/doc/pub/Splines/html/._Splines-bs004.html @@ -177,10 +177,21 @@ MathJax.Hub.Config({

The ideal

-Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global minimum of the function \( F \). In general we do not know if we are in a global or local minimum. In the special case when \( F \) is a convex function, all local minima are also global minima, so in this case gradient descent can converge to the global solution. The advantage of this scheme is that it is conceptually simple and straightforward to implement. However the method in this form has some severe limitations: +Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global +minimum of the function \( F \). In general we do not know if we are in a +global or local minimum. In the special case when \( F \) is a convex +function, all local minima are also global minima, so in this case +gradient descent can converge to the global solution. The advantage of +this scheme is that it is conceptually simple and straightforward to +implement. However the method in this form has some severe +limitations:

-In machine learing we are often faced with non-convex high dimensional cost functions with many local minimum. Since GD is deterministic we will get stuck in a local minimum, if the method converges, unless we have a very good intial guess. This also implies that the scheme is sensitive to the chosen initial condition. +In machine learing we are often faced with non-convex high dimensional +cost functions with many local minima. Since GD is deterministic we +will get stuck in a local minimum, if the method converges, unless we +have a very good intial guess. This also implies that the scheme is +sensitive to the chosen initial condition.

Note that the gradient is a function of \( \mathbf{x} = diff --git a/doc/pub/Splines/html/._Splines-bs005.html b/doc/pub/Splines/html/._Splines-bs005.html index a0db40746..f9a3208bd 100644 --- a/doc/pub/Splines/html/._Splines-bs005.html +++ b/doc/pub/Splines/html/._Splines-bs005.html @@ -180,14 +180,14 @@ MathJax.Hub.Config({ GD is sensitive to the choice of learning rate \( \gamma_k \). This is due to the fact that we are only guaranteed that \( F(\mathbf{x}_{k+1}) \leq F(\mathbf{x}_k) \) for sufficiently small \( \gamma_k \). The problem is to -determine an optimal learning rate. If the learning rate is chosen to -small the method will take a long to converge and if it is to large we -can experience erratic behavior. +determine an optimal learning rate. If the learning rate is chosen too +small the method will take a long time to converge and if it is too +large we can experience erratic behavior.

Many of these shortcomings can be alleviated by introducing randomness. One such method is that of Stochastic Gradient Descent -(SGD), see below +(SGD), see below.

diff --git a/doc/pub/Splines/html/._Splines-bs006.html b/doc/pub/Splines/html/._Splines-bs006.html index 9126bdff5..306b99cdb 100644 --- a/doc/pub/Splines/html/._Splines-bs006.html +++ b/doc/pub/Splines/html/._Splines-bs006.html @@ -175,6 +175,8 @@ MathJax.Hub.Config({

Gradient Descent Example

+ +

We revisit now our simple linear regression example with a linear polynomial.

@@ -192,30 +194,30 @@ x = 2*np y = 4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) -theta = np.random.randn(2,1) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) +beta = np.random.randn(2,1) eta = 0.1 Niterations = 1000 m = 100 for iter in range(Niterations): - gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y) - theta -= eta*gradients + gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) + beta -= eta*gradients -print(theta) +print(beta) xnew = np.array([[0],[2]]) xbnew = np.c_[np.ones((2,1)), xnew] -ypredict = xbnew.dot(theta) -ypredict2 = xbnew.dot(theta_linreg) +ypredict = xbnew.dot(beta) +ypredict2 = xbnew.dot(beta_linreg) plt.plot(xnew, ypredict, "r-") plt.plot(xnew, ypredict2, "b-") plt.plot(x, y ,'ro') plt.axis([0,2.0,0, 15.0]) plt.xlabel(r'$x$') plt.ylabel(r'$y$') -plt.title(r'Random numbers ') +plt.title(r'Gradient descent example') plt.show()

diff --git a/doc/pub/Splines/html/._Splines-bs007.html b/doc/pub/Splines/html/._Splines-bs007.html index 686d4fb1a..6b2852c4c 100644 --- a/doc/pub/Splines/html/._Splines-bs007.html +++ b/doc/pub/Splines/html/._Splines-bs007.html @@ -189,8 +189,8 @@ x = 2*np y = 4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) sgdreg.fit(x,y.ravel()) print(sgdreg.intercept_, sgdreg.coef_) diff --git a/doc/pub/Splines/html/._Splines-bs008.html b/doc/pub/Splines/html/._Splines-bs008.html index b01eef450..86e9ac845 100644 --- a/doc/pub/Splines/html/._Splines-bs008.html +++ b/doc/pub/Splines/html/._Splines-bs008.html @@ -175,6 +175,8 @@ MathJax.Hub.Config({

Convex functions

+ +

Ideally we want our cost/loss function to be convex(concave).

diff --git a/doc/pub/Splines/html/._Splines-bs009.html b/doc/pub/Splines/html/._Splines-bs009.html index bf637803e..7ae79d754 100644 --- a/doc/pub/Splines/html/._Splines-bs009.html +++ b/doc/pub/Splines/html/._Splines-bs009.html @@ -177,7 +177,7 @@ MathJax.Hub.Config({

Convex function

-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. +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.

diff --git a/doc/pub/Splines/html/._Splines-bs010.html b/doc/pub/Splines/html/._Splines-bs010.html index 07406c768..c1bb98aa7 100644 --- a/doc/pub/Splines/html/._Splines-bs010.html +++ b/doc/pub/Splines/html/._Splines-bs010.html @@ -180,9 +180,7 @@ MathJax.Hub.Config({ In the following we state first and second-order conditions which ensures convexity of a function \( f \). We write \( D_f \) to denote the domain of \( f \), i.e the subset of \( R^n \) where \( f \) is defined. For more -details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex -Optimization. Cambridge University Press, http://stanford.edu/ -boyd/cvxbook/, 2004. +details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press.

diff --git a/doc/pub/Splines/html/._Splines-bs011.html b/doc/pub/Splines/html/._Splines-bs011.html index 36831b01e..8a0925577 100644 --- a/doc/pub/Splines/html/._Splines-bs011.html +++ b/doc/pub/Splines/html/._Splines-bs011.html @@ -180,9 +180,12 @@ MathJax.Hub.Config({ The next result is of great importance to us and the reason why we are going on about convex functions. In machine learning we frequently have to minimize a loss/cost function in order to find the best -parameters for the model we are considering. Ideally we want the -global minimum, however for high-dimensional models it is hard to know -if we have local or global minimum. However, if the cost/loss function +parameters for the model we are considering. + +

+Ideally we want the +global minimum (for high-dimensional models it is hard to know +if we have local or global minimum). However, if the cost/loss function is convex the following result provides invaluable information:

@@ -195,6 +198,8 @@ is minimal, where \( f \) is convex and differentiable. Then, any point

+ +

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.

diff --git a/doc/pub/Splines/html/._Splines-bs012.html b/doc/pub/Splines/html/._Splines-bs012.html index 65fbf0e4a..29a039b11 100644 --- a/doc/pub/Splines/html/._Splines-bs012.html +++ b/doc/pub/Splines/html/._Splines-bs012.html @@ -177,27 +177,26 @@ MathJax.Hub.Config({

Some simple problems

    -
  1. Show that \( f(x)=x^2 \) is convex for \( x \in \mathbb{R} \) using the definition of convexity.
  2. -
- -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. $$ - -
    +
  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. $
  2. Using the second order condition show that the following functions are convex on the specified domain.
  3. -
-\( f(x) = e^x \) is convex for \( x \in \mathbb{R} \). -\( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \). + -
  1. 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.
  2. A norm is any function that satisfy the following properties
  3. + + +
-\( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \). -\( f(x+y) \leq f(x) + f(y) \) -\( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \) -Using the definition of convexity, show that a function satisfying the properties above is convex (the third condition is not needed to show this). +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).

diff --git a/doc/pub/Splines/html/._Splines-bs013.html b/doc/pub/Splines/html/._Splines-bs013.html index 742f4f3de..2a7103a97 100644 --- a/doc/pub/Splines/html/._Splines-bs013.html +++ b/doc/pub/Splines/html/._Splines-bs013.html @@ -177,7 +177,10 @@ MathJax.Hub.Config({

Revisiting our first homework

-We will use linear regression as a case study for the gradient descent methods. Linear regression is a great test case for the gradient descent methods discussed in the lectures since it has several desirable properties such as: +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as:

  1. An analytical solution (recall homework set 1).
  2. @@ -193,12 +196,12 @@ $$ with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). The linear regression model is given by $$ -h_\theta(x) = \hat{y} = \theta_0 + \theta_1 x, +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, $$ such that $$ -\hat{y}_i = \theta_0 + \theta_1 x_i. +\hat{y}_i = \beta_0 + \beta_1 x_i. $$

    diff --git a/doc/pub/Splines/html/._Splines-bs014.html b/doc/pub/Splines/html/._Splines-bs014.html index 18989a1d1..596f81cd4 100644 --- a/doc/pub/Splines/html/._Splines-bs014.html +++ b/doc/pub/Splines/html/._Splines-bs014.html @@ -177,10 +177,10 @@ MathJax.Hub.Config({

    Gradient descent example

    -Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \theta = (\theta_0, \theta_1)^T \) +Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \)

    -t is convenient to write \( \mathbf{\hat{y}} = X\theta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +t is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by $$ \begin{equation} X \equiv \begin{bmatrix} @@ -194,10 +194,10 @@ $$ The loss function is given by $$ -C(\theta) = ||X\theta-\mathbf{y}||^2 = ||X\theta||^2 - 2 \mathbf{y}^T X\theta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\theta_0 + \theta_1 x_i)^2 - 2 y_i (\theta_0 + \theta_1 x_i) + y_i^2 +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 $$ -and we want to find \( \theta \) such that \( C(\theta) \) is minimized. +and we want to find \( \beta \) such that \( C(\beta) \) is minimized.

    diff --git a/doc/pub/Splines/html/._Splines-bs015.html b/doc/pub/Splines/html/._Splines-bs015.html index c0ed6b688..1778f7a66 100644 --- a/doc/pub/Splines/html/._Splines-bs015.html +++ b/doc/pub/Splines/html/._Splines-bs015.html @@ -177,11 +177,11 @@ MathJax.Hub.Config({

    The derivative of the cost/loss function

    -Computing \( \partial C(\theta) / \partial \theta_0 \) and \( \partial C(\theta) / \partial \theta_1 \) we can show that the gradient can be written as +Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as $$ -\nabla_\theta C(\theta) = (\partial C(\theta) / \partial \theta_0, \partial C(\theta) / \partial \theta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\theta - \mathbf{y}), +\nabla_\beta C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), $$ where \( X \) is the design matrix defined above. diff --git a/doc/pub/Splines/html/._Splines-bs016.html b/doc/pub/Splines/html/._Splines-bs016.html index beaf9cc37..d4a0a6cb0 100644 --- a/doc/pub/Splines/html/._Splines-bs016.html +++ b/doc/pub/Splines/html/._Splines-bs016.html @@ -175,15 +175,15 @@ MathJax.Hub.Config({

    The Hessian matrix

    -The Hessian matrix of \( C(\theta) \) is given by +The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\theta)}{\partial \theta_0^2} & \frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} \\ -\frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} & \frac{\partial^2 C(\theta)}{\partial \theta_1^2} & \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ \end{bmatrix} = 2X^T X. $$ -This result implies that \( C(\theta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. +This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite.

    diff --git a/doc/pub/Splines/html/._Splines-bs017.html b/doc/pub/Splines/html/._Splines-bs017.html index 5eef83c31..d02aaae45 100644 --- a/doc/pub/Splines/html/._Splines-bs017.html +++ b/doc/pub/Splines/html/._Splines-bs017.html @@ -177,19 +177,19 @@ MathJax.Hub.Config({

    Simple program

    -We can now write a program that minimizes \( C(\theta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to +We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to $$ -\theta_{k+1} = \theta_k - \gamma \nabla_\theta C(\theta_k), \ k=0,1,\cdots +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots $$

    We can use the expression we computed for the gradient and let use a -\( \theta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating -when \( ||\nabla_\theta C(\theta_k) || < \epsilon = 10^{-8} \). +\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating +when \( ||\nabla_\beta C(\beta_k) || < \epsilon = 10^{-8} \).

    -And finally we can compare our solution for \( \theta \) with the analytic result given by -\( \theta= (X^TX)^{-1} X^T \mathbf{y} \). +And finally we can compare our solution for \( \beta \) with the analytic result given by +\( \beta= (X^TX)^{-1} X^T \mathbf{y} \).

    @@ -206,11 +206,11 @@ x = np. y = 5*x**2 + 0.1*np.random.randn(N) X = np.c_[np.ones(N),x] #Construct design matrix -#Compute theta according to normal equations to compare with GD solution +#Compute beta according to normal equations to compare with GD solution Xt_X_inv = np.linalg.inv(np.dot(X.T,X)) Xt_y = np.dot(X.transpose(),y) -theta_NE = np.dot(Xt_X_inv,Xt_y) -print(theta_NE) +beta_NE = np.dot(Xt_X_inv,Xt_y) +print(beta_NE)

    diff --git a/doc/pub/Splines/html/._Splines-bs018.html b/doc/pub/Splines/html/._Splines-bs018.html index e35445845..878874987 100644 --- a/doc/pub/Splines/html/._Splines-bs018.html +++ b/doc/pub/Splines/html/._Splines-bs018.html @@ -177,27 +177,27 @@ MathJax.Hub.Config({

    Gradient descent and Ridge

    -We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \theta \), +We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), $$ -C_{\text{ridge}}(\theta) = ||X\theta -\mathbf{y}||^2 + \lambda ||\theta||^2, \ \lambda \geq 0. +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. $$

    -In order to minimize \( C_{\text{ridge}}(\theta) \) using GD we only have adjust the gradient as follows +In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows $$ -\nabla_\theta C_{\text{ridge}}(\theta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \theta_0 \\ \theta_1\end{bmatrix} = 2 (X^T(X\theta - \mathbf{y})+\lambda \theta). +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). $$

    -We can now extend our program to minimize \( C_{\text{ridge}}(\theta) \) using gradient descent and compare with the analytical solution given by +We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by $$ -\theta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, $$ for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). -We can then compute \( ||\theta_{\text{ridge}}|| \) for each \( \lambda \). +We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \).

    @@ -215,7 +215,7 @@ x = np. y = 5*x**2 + 0.1*np.random.randn(N) -#Compute analytic theta for Ridge regression +#Compute analytic beta for Ridge regression X = np.c_[np.ones(N),x] XT_X = np.dot(X.T,X) @@ -223,10 +223,10 @@ l = 0.1 Id = np.eye(XT_X.shape[0]) Z = np.linalg.inv(XT_X+l*Id) -theta_ridge = np.dot(Z,np.dot(X.T,y)) +beta_ridge = np.dot(Z,np.dot(X.T,y)) -print(theta_ridge) -print(np.linalg.norm(theta_ridge)) #||theta|| +print(beta_ridge) +print(np.linalg.norm(beta_ridge)) #||beta||

    diff --git a/doc/pub/Splines/html/._Splines-bs019.html b/doc/pub/Splines/html/._Splines-bs019.html index 30a05cbaa..464a234f4 100644 --- a/doc/pub/Splines/html/._Splines-bs019.html +++ b/doc/pub/Splines/html/._Splines-bs019.html @@ -185,8 +185,8 @@ The underlying idea of SGD comes from the observation that the cost function, which we want to minimize, can almost always be written as a sum over \( n \) datapoints \( \{\mathbf{x}_i\}_{i=1}^n \), $$ -C(\mathbf{\theta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\theta}). +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

    diff --git a/doc/pub/Splines/html/._Splines-bs020.html b/doc/pub/Splines/html/._Splines-bs020.html index c92093207..953411294 100644 --- a/doc/pub/Splines/html/._Splines-bs020.html +++ b/doc/pub/Splines/html/._Splines-bs020.html @@ -180,8 +180,8 @@ MathJax.Hub.Config({ This in turn means that the gradient can be computed as a sum over \( i \)-gradients $$ -\nabla_\theta C(\mathbf{\theta}) = \sum_i^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}). +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

    diff --git a/doc/pub/Splines/html/._Splines-bs021.html b/doc/pub/Splines/html/._Splines-bs021.html index 9014dbac7..062ea2901 100644 --- a/doc/pub/Splines/html/._Splines-bs021.html +++ b/doc/pub/Splines/html/._Splines-bs021.html @@ -189,10 +189,10 @@ The idea is now to approximate the gradient by replacing the sum over all datapoints with a sum over the datapoints in one the minibatches picked at random in each gradient descent step $$ -\nabla_\theta -C(\mathbf{\theta}) = \sum_{i=1}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) \rightarrow \sum_{i \in B_k}^n \nabla_\theta -c_i(\mathbf{x}_i, \mathbf{\theta}). +\nabla_\beta +C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta +c_i(\mathbf{x}_i, \mathbf{\beta}). $$

    diff --git a/doc/pub/Splines/html/._Splines-bs022.html b/doc/pub/Splines/html/._Splines-bs022.html index 141208bfc..6dc924616 100644 --- a/doc/pub/Splines/html/._Splines-bs022.html +++ b/doc/pub/Splines/html/._Splines-bs022.html @@ -179,8 +179,8 @@ MathJax.Hub.Config({

    Thus a gradient descent step now looks like $$ -\theta_{j+1} = \theta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) +\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) $$

    diff --git a/doc/pub/Splines/html/._Splines-bs023.html b/doc/pub/Splines/html/._Splines-bs023.html index 4e7d3649b..9c98ea73d 100644 --- a/doc/pub/Splines/html/._Splines-bs023.html +++ b/doc/pub/Splines/html/._Splines-bs023.html @@ -191,7 +191,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for j += 1

    diff --git a/doc/pub/Splines/html/._Splines-bs024.html b/doc/pub/Splines/html/._Splines-bs024.html index e2f98d13c..1653551d2 100644 --- a/doc/pub/Splines/html/._Splines-bs024.html +++ b/doc/pub/Splines/html/._Splines-bs024.html @@ -185,7 +185,7 @@ is zero is valid also for local minima, so this would only tell us that we are close to a local/global minimum. However, we could also evaluate the cost function at this point, store the result and continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the \( \theta \) that +compare the values of the cost function and keep the \( \beta \) that gave the lowest value.

    diff --git a/doc/pub/Splines/html/._Splines-bs025.html b/doc/pub/Splines/html/._Splines-bs025.html index 308a160c0..49c8b196a 100644 --- a/doc/pub/Splines/html/._Splines-bs025.html +++ b/doc/pub/Splines/html/._Splines-bs025.html @@ -185,10 +185,10 @@ reasonable time such that we do not move at all. 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 \).

    -In this way we can fix the number of epochs, compute \( \theta \) and +In this way we can fix the number of epochs, compute \( \beta \) and evaluate the cost function at the end. Repeating the computation will give a different result since the scheme is random by design. Then we -pick the final \( \theta \) that gives the lowest value of the cost +pick the final \( \beta \) that gives the lowest value of the cost function.

    @@ -212,7 +212,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for beta t = epoch*m+i gamma_j = step_length(t,t0,t1) j += 1 diff --git a/doc/pub/Splines/html/Splines-reveal.html b/doc/pub/Splines/html/Splines-reveal.html index 7834dc5b1..f78ef0d25 100644 --- a/doc/pub/Splines/html/Splines-reveal.html +++ b/doc/pub/Splines/html/Splines-reveal.html @@ -163,11 +163,11 @@ MathJax.Hub.Config({

    Almost every problem in machine learning and data science starts with -a dataset \( X \), a model \( g(\theta) \), which is a function of the -parameters \( \theta \) and a cost function \( C(X, g(\theta)) \) that allows -us to judge how well the model \( g(\theta) \) explains the observations -\( X \). The model is fit by finding the values of \( \theta \) that minimize -the cost function. Ideally we would be able to solve for \( \theta \) +a dataset \( X \), a model \( g(\beta) \), which is a function of the +parameters \( \beta \) and a cost function \( C(X, g(\beta)) \) that allows +us to judge how well the model \( g(\beta) \) explains the observations +\( X \). The model is fit by finding the values of \( \beta \) that minimize +the cost function. Ideally we would be able to solve for \( \beta \) analytically, however this is not possible in general and we must use some approximative/numerical method to compute the minimum. @@ -204,7 +204,7 @@ we are always moving towards smaller function values, i.e a minimum. The previous observation is the basis of the method of steepest descent, which is also referred to as just gradient descent (GD). One starts with an initial guess \( \mathbf{x}_0 \) for a minimum of \( F \) and -compute new approximations according to +computes new approximations according to

     
    $$ @@ -214,7 +214,7 @@ $$

    The parameter \( \gamma_k \) is often referred to as the step length or -the learning rate in the context of Machine Learning. +the learning rate within the context of Machine Learning. @@ -222,10 +222,21 @@ the learning rate in the context of Machine Learning.

    The ideal

    -Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global minimum of the function \( F \). In general we do not know if we are in a global or local minimum. In the special case when \( F \) is a convex function, all local minima are also global minima, so in this case gradient descent can converge to the global solution. The advantage of this scheme is that it is conceptually simple and straightforward to implement. However the method in this form has some severe limitations: +Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global +minimum of the function \( F \). In general we do not know if we are in a +global or local minimum. In the special case when \( F \) is a convex +function, all local minima are also global minima, so in this case +gradient descent can converge to the global solution. The advantage of +this scheme is that it is conceptually simple and straightforward to +implement. However the method in this form has some severe +limitations:

    -In machine learing we are often faced with non-convex high dimensional cost functions with many local minimum. Since GD is deterministic we will get stuck in a local minimum, if the method converges, unless we have a very good intial guess. This also implies that the scheme is sensitive to the chosen initial condition. +In machine learing we are often faced with non-convex high dimensional +cost functions with many local minima. Since GD is deterministic we +will get stuck in a local minimum, if the method converges, unless we +have a very good intial guess. This also implies that the scheme is +sensitive to the chosen initial condition.

    Note that the gradient is a function of \( \mathbf{x} = @@ -240,19 +251,21 @@ Note that the gradient is a function of \( \mathbf{x} = GD is sensitive to the choice of learning rate \( \gamma_k \). This is due to the fact that we are only guaranteed that \( F(\mathbf{x}_{k+1}) \leq F(\mathbf{x}_k) \) for sufficiently small \( \gamma_k \). The problem is to -determine an optimal learning rate. If the learning rate is chosen to -small the method will take a long to converge and if it is to large we -can experience erratic behavior. +determine an optimal learning rate. If the learning rate is chosen too +small the method will take a long time to converge and if it is too +large we can experience erratic behavior.

    Many of these shortcomings can be alleviated by introducing randomness. One such method is that of Stochastic Gradient Descent -(SGD), see below +(SGD), see below.

    Gradient Descent Example

    + +

    We revisit now our simple linear regression example with a linear polynomial.

    @@ -270,30 +283,30 @@ x = 2*np.random.rand(4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) -theta = np.random.randn(2,1) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) +beta = np.random.randn(2,1) eta = 0.1 Niterations = 1000 m = 100 for iter in range(Niterations): - gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y) - theta -= eta*gradients + gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) + beta -= eta*gradients -print(theta) +print(beta) xnew = np.array([[0],[2]]) xbnew = np.c_[np.ones((2,1)), xnew] -ypredict = xbnew.dot(theta) -ypredict2 = xbnew.dot(theta_linreg) +ypredict = xbnew.dot(beta) +ypredict2 = xbnew.dot(beta_linreg) plt.plot(xnew, ypredict, "r-") plt.plot(xnew, ypredict2, "b-") plt.plot(x, y ,'ro') plt.axis([0,2.0,0, 15.0]) plt.xlabel(r'$x$') plt.ylabel(r'$y$') -plt.title(r'Random numbers ') +plt.title(r'Gradient descent example') plt.show()

    @@ -315,8 +328,8 @@ x = 2*np.random.rand(4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) sgdreg.fit(x,y.ravel()) print(sgdreg.intercept_, sgdreg.coef_) @@ -326,6 +339,8 @@ sgdreg.fit(x,y.ravel())

    Convex functions

    + +

    Ideally we want our cost/loss function to be convex(concave).

    @@ -346,7 +361,7 @@ regular polygons (triangles, rectangles, pentagons, etc...).

    Convex function

    -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

     
    +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.

    @@ -359,9 +374,7 @@ $$f(tx_1 + (1-t)x_2) \leq tf(x_1) + (1-t)f(x_2) $$ In the following we state first and second-order conditions which ensures convexity of a function \( f \). We write \( D_f \) to denote the domain of \( f \), i.e the subset of \( R^n \) where \( f \) is defined. For more -details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex -Optimization. Cambridge University Press, http://stanford.edu/ -boyd/cvxbook/, 2004. +details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press.

    @@ -404,9 +417,12 @@ This condition is particularly useful since it gives us an procedure for determi The next result is of great importance to us and the reason why we are going on about convex functions. In machine learning we frequently have to minimize a loss/cost function in order to find the best -parameters for the model we are considering. Ideally we want the -global minimum, however for high-dimensional models it is hard to know -if we have local or global minimum. However, if the cost/loss function +parameters for the model we are considering. + +

    +Ideally we want the +global minimum (for high-dimensional models it is hard to know +if we have local or global minimum). However, if the cost/loss function is convex the following result provides invaluable information:

    @@ -418,6 +434,7 @@ is minimal, where \( f \) is convex and differentiable. Then, any point \( x^* \) that satisfies \( \nabla f(x^*) = 0 \) is a global minimum.

    +

    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. @@ -426,32 +443,26 @@ This result means that if we know that the cost/loss function is convex and we a

    Some simple problems

      -

    1. Show that \( f(x)=x^2 \) is convex for \( x \in \mathbb{R} \) using the definition of convexity.
    2. -
    -

    - -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. $$ -

     
    - -

      +

    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. $
    2. Using the second order condition show that the following functions are convex on the specified domain.
    3. -
    -

    -\( f(x) = e^x \) is convex for \( x \in \mathbb{R} \). -\( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \). - -

      +
        +

      • \( f(x) = e^x \) is convex for \( x \in \mathbb{R} \).
      • +

      • \( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \).
      • +

    1. 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.
    2. A norm is any function that satisfy the following properties
    3. + +
        +

      • \( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \).
      • +

      • \( f(x+y) \leq f(x) + f(y) \)
      • +

      • \( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \)
      • +
      +

    -\( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \). -\( f(x+y) \leq f(x) + f(y) \) -\( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \) -Using the definition of convexity, show that a function satisfying the properties above is convex (the third condition is not needed to show this). +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). @@ -459,7 +470,10 @@ Using the definition of convexity, show that a function satisfying the propertie

    Revisiting our first homework

    -We will use linear regression as a case study for the gradient descent methods. Linear regression is a great test case for the gradient descent methods discussed in the lectures since it has several desirable properties such as: +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as:

    1. An analytical solution (recall homework set 1).
    2. @@ -479,14 +493,14 @@ with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additiona The linear regression model is given by

       
      $$ -h_\theta(x) = \hat{y} = \theta_0 + \theta_1 x, +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, $$

       
      such that

       
      $$ -\hat{y}_i = \theta_0 + \theta_1 x_i. +\hat{y}_i = \beta_0 + \beta_1 x_i. $$

       
      @@ -496,10 +510,10 @@ $$

      Gradient descent example

      -Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \theta = (\theta_0, \theta_1)^T \) +Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \)

      -t is convenient to write \( \mathbf{\hat{y}} = X\theta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +t is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by

       
      $$ \begin{equation} @@ -516,11 +530,11 @@ $$ The loss function is given by

       
      $$ -C(\theta) = ||X\theta-\mathbf{y}||^2 = ||X\theta||^2 - 2 \mathbf{y}^T X\theta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\theta_0 + \theta_1 x_i)^2 - 2 y_i (\theta_0 + \theta_1 x_i) + y_i^2 +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 $$

       
      -and we want to find \( \theta \) such that \( C(\theta) \) is minimized. +and we want to find \( \beta \) such that \( C(\beta) \) is minimized. @@ -528,12 +542,12 @@ and we want to find \( \theta \) such that \( C(\theta) \) is minimized.

      The derivative of the cost/loss function

      -Computing \( \partial C(\theta) / \partial \theta_0 \) and \( \partial C(\theta) / \partial \theta_1 \) we can show that the gradient can be written as +Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as

       
      $$ -\nabla_\theta C(\theta) = (\partial C(\theta) / \partial \theta_0, \partial C(\theta) / \partial \theta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\theta - \mathbf{y}), +\nabla_\beta C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), $$

       
      @@ -543,17 +557,17 @@ where \( X \) is the design matrix defined above.

      The Hessian matrix

      -The Hessian matrix of \( C(\theta) \) is given by +The Hessian matrix of \( C(\beta) \) is given by

       
      $$ \hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\theta)}{\partial \theta_0^2} & \frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} \\ -\frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} & \frac{\partial^2 C(\theta)}{\partial \theta_1^2} & \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ \end{bmatrix} = 2X^T X. $$

       
      -This result implies that \( C(\theta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. +This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite.

      @@ -561,21 +575,21 @@ This result implies that \( C(\theta) \) is a convex function since the matrix \

      Simple program

      -We can now write a program that minimizes \( C(\theta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to +We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to

       
      $$ -\theta_{k+1} = \theta_k - \gamma \nabla_\theta C(\theta_k), \ k=0,1,\cdots +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots $$

       

      We can use the expression we computed for the gradient and let use a -\( \theta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating -when \( ||\nabla_\theta C(\theta_k) || < \epsilon = 10^{-8} \). +\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating +when \( ||\nabla_\beta C(\beta_k) || < \epsilon = 10^{-8} \).

      -And finally we can compare our solution for \( \theta \) with the analytic result given by -\( \theta= (X^TX)^{-1} X^T \mathbf{y} \). +And finally we can compare our solution for \( \beta \) with the analytic result given by +\( \beta= (X^TX)^{-1} X^T \mathbf{y} \).

      @@ -592,11 +606,11 @@ x = np.random.rand(N) #Uniformly generated x-value y = 5*x**2 + 0.1*np.random.randn(N) X = np.c_[np.ones(N),x] #Construct design matrix -#Compute theta according to normal equations to compare with GD solution +#Compute beta according to normal equations to compare with GD solution Xt_X_inv = np.linalg.inv(np.dot(X.T,X)) Xt_y = np.dot(X.transpose(),y) -theta_NE = np.dot(Xt_X_inv,Xt_y) -print(theta_NE) +beta_NE = np.dot(Xt_X_inv,Xt_y) +print(beta_NE) @@ -605,33 +619,33 @@ theta_NE = np.dot(Xt_X_inv,Xt_y)

      Gradient descent and Ridge

      -We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \theta \), +We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \),

       
      $$ -C_{\text{ridge}}(\theta) = ||X\theta -\mathbf{y}||^2 + \lambda ||\theta||^2, \ \lambda \geq 0. +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. $$

       

      -In order to minimize \( C_{\text{ridge}}(\theta) \) using GD we only have adjust the gradient as follows +In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows

       
      $$ -\nabla_\theta C_{\text{ridge}}(\theta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \theta_0 \\ \theta_1\end{bmatrix} = 2 (X^T(X\theta - \mathbf{y})+\lambda \theta). +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). $$

       

      -We can now extend our program to minimize \( C_{\text{ridge}}(\theta) \) using gradient descent and compare with the analytical solution given by +We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by

       
      $$ -\theta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, $$

       
      for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). -We can then compute \( ||\theta_{\text{ridge}}|| \) for each \( \lambda \). +We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \).

      @@ -649,7 +663,7 @@ x = np.random.rand(N) y = 5*x**2 + 0.1*np.random.randn(N) -#Compute analytic theta for Ridge regression +#Compute analytic beta for Ridge regression X = np.c_[np.ones(N),x] XT_X = np.dot(X.T,X) @@ -657,10 +671,10 @@ l = 0.1 #Ridge Id = np.eye(XT_X.shape[0]) Z = np.linalg.inv(XT_X+l*Id) -theta_ridge = np.dot(Z,np.dot(X.T,y)) +beta_ridge = np.dot(Z,np.dot(X.T,y)) -print(theta_ridge) -print(np.linalg.norm(theta_ridge)) #||theta|| +print(beta_ridge) +print(np.linalg.norm(beta_ridge)) #||beta|| @@ -678,8 +692,8 @@ function, which we want to minimize, can almost always be written as a sum over \( n \) datapoints \( \{\mathbf{x}_i\}_{i=1}^n \),

       
      $$ -C(\mathbf{\theta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\theta}). +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

       
      @@ -693,8 +707,8 @@ This in turn means that the gradient can be computed as a sum over \( i \)-gradients

       
      $$ -\nabla_\theta C(\mathbf{\theta}) = \sum_i^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}). +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

       
      @@ -724,10 +738,10 @@ all datapoints with a sum over the datapoints in one the minibatches picked at random in each gradient descent step

       
      $$ -\nabla_\theta -C(\mathbf{\theta}) = \sum_{i=1}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) \rightarrow \sum_{i \in B_k}^n \nabla_\theta -c_i(\mathbf{x}_i, \mathbf{\theta}). +\nabla_\beta +C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta +c_i(\mathbf{x}_i, \mathbf{\beta}). $$

       
      @@ -740,8 +754,8 @@ $$ Thus a gradient descent step now looks like

       
      $$ -\theta_{j+1} = \theta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) +\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) $$

       
      @@ -772,7 +786,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for j += 1

      @@ -798,7 +812,7 @@ is zero is valid also for local minima, so this would only tell us that we are close to a local/global minimum. However, we could also evaluate the cost function at this point, store the result and continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the \( \theta \) that +compare the values of the cost function and keep the \( \beta \) that gave the lowest value. @@ -817,10 +831,10 @@ $$\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 \).

      -In this way we can fix the number of epochs, compute \( \theta \) and +In this way we can fix the number of epochs, compute \( \beta \) and evaluate the cost function at the end. Repeating the computation will give a different result since the scheme is random by design. Then we -pick the final \( \theta \) that gives the lowest value of the cost +pick the final \( \beta \) that gives the lowest value of the cost function.

      @@ -844,7 +858,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for beta t = epoch*m+i gamma_j = step_length(t,t0,t1) j += 1 diff --git a/doc/pub/Splines/html/Splines-solarized.html b/doc/pub/Splines/html/Splines-solarized.html index c14baf537..fc0bfdc82 100644 --- a/doc/pub/Splines/html/Splines-solarized.html +++ b/doc/pub/Splines/html/Splines-solarized.html @@ -156,11 +156,11 @@ MathJax.Hub.Config({

      Almost every problem in machine learning and data science starts with -a dataset \( X \), a model \( g(\theta) \), which is a function of the -parameters \( \theta \) and a cost function \( C(X, g(\theta)) \) that allows -us to judge how well the model \( g(\theta) \) explains the observations -\( X \). The model is fit by finding the values of \( \theta \) that minimize -the cost function. Ideally we would be able to solve for \( \theta \) +a dataset \( X \), a model \( g(\beta) \), which is a function of the +parameters \( \beta \) and a cost function \( C(X, g(\beta)) \) that allows +us to judge how well the model \( g(\beta) \) explains the observations +\( X \). The model is fit by finding the values of \( \beta \) that minimize +the cost function. Ideally we would be able to solve for \( \beta \) analytically, however this is not possible in general and we must use some approximative/numerical method to compute the minimum. @@ -195,7 +195,7 @@ we are always moving towards smaller function values, i.e a minimum. The previous observation is the basis of the method of steepest descent, which is also referred to as just gradient descent (GD). One starts with an initial guess \( \mathbf{x}_0 \) for a minimum of \( F \) and -compute new approximations according to +computes new approximations according to $$ \mathbf{x}_{k+1} = \mathbf{x}_k - \gamma_k \nabla F(\mathbf{x}_k), \ \ k \geq 0. @@ -203,7 +203,7 @@ $$

      The parameter \( \gamma_k \) is often referred to as the step length or -the learning rate in the context of Machine Learning. +the learning rate within the context of Machine Learning.

      @@ -211,10 +211,21 @@ the learning rate in the context of Machine Learning.

      The ideal

      -Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global minimum of the function \( F \). In general we do not know if we are in a global or local minimum. In the special case when \( F \) is a convex function, all local minima are also global minima, so in this case gradient descent can converge to the global solution. The advantage of this scheme is that it is conceptually simple and straightforward to implement. However the method in this form has some severe limitations: +Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global +minimum of the function \( F \). In general we do not know if we are in a +global or local minimum. In the special case when \( F \) is a convex +function, all local minima are also global minima, so in this case +gradient descent can converge to the global solution. The advantage of +this scheme is that it is conceptually simple and straightforward to +implement. However the method in this form has some severe +limitations:

      -In machine learing we are often faced with non-convex high dimensional cost functions with many local minimum. Since GD is deterministic we will get stuck in a local minimum, if the method converges, unless we have a very good intial guess. This also implies that the scheme is sensitive to the chosen initial condition. +In machine learing we are often faced with non-convex high dimensional +cost functions with many local minima. Since GD is deterministic we +will get stuck in a local minimum, if the method converges, unless we +have a very good intial guess. This also implies that the scheme is +sensitive to the chosen initial condition.

      Note that the gradient is a function of \( \mathbf{x} = @@ -229,19 +240,21 @@ Note that the gradient is a function of \( \mathbf{x} = GD is sensitive to the choice of learning rate \( \gamma_k \). This is due to the fact that we are only guaranteed that \( F(\mathbf{x}_{k+1}) \leq F(\mathbf{x}_k) \) for sufficiently small \( \gamma_k \). The problem is to -determine an optimal learning rate. If the learning rate is chosen to -small the method will take a long to converge and if it is to large we -can experience erratic behavior. +determine an optimal learning rate. If the learning rate is chosen too +small the method will take a long time to converge and if it is too +large we can experience erratic behavior.

      Many of these shortcomings can be alleviated by introducing randomness. One such method is that of Stochastic Gradient Descent -(SGD), see below +(SGD), see below.











      Gradient Descent Example

      + +

      We revisit now our simple linear regression example with a linear polynomial.

      @@ -259,30 +272,30 @@ x = 2*np.random.rand(4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) -theta = np.random.randn(2,1) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) +beta = np.random.randn(2,1) eta = 0.1 Niterations = 1000 m = 100 for iter in range(Niterations): - gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y) - theta -= eta*gradients + gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) + beta -= eta*gradients -print(theta) +print(beta) xnew = np.array([[0],[2]]) xbnew = np.c_[np.ones((2,1)), xnew] -ypredict = xbnew.dot(theta) -ypredict2 = xbnew.dot(theta_linreg) +ypredict = xbnew.dot(beta) +ypredict2 = xbnew.dot(beta_linreg) plt.plot(xnew, ypredict, "r-") plt.plot(xnew, ypredict2, "b-") plt.plot(x, y ,'ro') plt.axis([0,2.0,0, 15.0]) plt.xlabel(r'$x$') plt.ylabel(r'$y$') -plt.title(r'Random numbers ') +plt.title(r'Gradient descent example') plt.show()

      @@ -303,8 +316,8 @@ x = 2*np.random.rand(4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) sgdreg.fit(x,y.ravel()) print(sgdreg.intercept_, sgdreg.coef_) @@ -313,6 +326,8 @@ sgdreg.fit(x,y.ravel())

      Convex functions

      + +

      Ideally we want our cost/loss function to be convex(concave).

      @@ -333,7 +348,7 @@ regular polygons (triangles, rectangles, pentagons, etc...).

      Convex function

      -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. +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.











      @@ -344,9 +359,7 @@ Convex function: Let \( X \subset \mathbb{R}^n \) be a convex set. Assume that t In the following we state first and second-order conditions which ensures convexity of a function \( f \). We write \( D_f \) to denote the domain of \( f \), i.e the subset of \( R^n \) where \( f \) is defined. For more -details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex -Optimization. Cambridge University Press, http://stanford.edu/ -boyd/cvxbook/, 2004. +details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press.

      @@ -389,9 +402,12 @@ This condition is particularly useful since it gives us an procedure for determi The next result is of great importance to us and the reason why we are going on about convex functions. In machine learning we frequently have to minimize a loss/cost function in order to find the best -parameters for the model we are considering. Ideally we want the -global minimum, however for high-dimensional models it is hard to know -if we have local or global minimum. However, if the cost/loss function +parameters for the model we are considering. + +

      +Ideally we want the +global minimum (for high-dimensional models it is hard to know +if we have local or global minimum). However, if the cost/loss function is convex the following result provides invaluable information:

      @@ -403,6 +419,8 @@ is minimal, where \( f \) is convex and differentiable. Then, any point \( x^* \) that satisfies \( \nabla f(x^*) = 0 \) is a global minimum.

      + +

      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.

      @@ -411,27 +429,26 @@ This result means that if we know that the cost/loss function is convex and we a

      Some simple problems

        -
      1. Show that \( f(x)=x^2 \) is convex for \( x \in \mathbb{R} \) using the definition of convexity.
      2. -
      - -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. $$ - -
        +
      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. $
      2. Using the second order condition show that the following functions are convex on the specified domain.
      3. -
      -\( f(x) = e^x \) is convex for \( x \in \mathbb{R} \). -\( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \). +
        +
      • \( f(x) = e^x \) is convex for \( x \in \mathbb{R} \).
      • +
      • \( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \).
      • +
      -
      1. 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.
      2. A norm is any function that satisfy the following properties
      3. + +
          +
        • \( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \).
        • +
        • \( f(x+y) \leq f(x) + f(y) \)
        • +
        • \( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \)
        • +
        +
      -\( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \). -\( f(x+y) \leq f(x) + f(y) \) -\( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \) -Using the definition of convexity, show that a function satisfying the properties above is convex (the third condition is not needed to show this). +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).

      @@ -439,7 +456,10 @@ Using the definition of convexity, show that a function satisfying the propertie

      Revisiting our first homework

      -We will use linear regression as a case study for the gradient descent methods. Linear regression is a great test case for the gradient descent methods discussed in the lectures since it has several desirable properties such as: +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as:

      1. An analytical solution (recall homework set 1).
      2. @@ -455,12 +475,12 @@ $$ with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). The linear regression model is given by $$ -h_\theta(x) = \hat{y} = \theta_0 + \theta_1 x, +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, $$ such that $$ -\hat{y}_i = \theta_0 + \theta_1 x_i. +\hat{y}_i = \beta_0 + \beta_1 x_i. $$

        @@ -469,10 +489,10 @@ $$

        Gradient descent example

        -Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \theta = (\theta_0, \theta_1)^T \) +Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \)

        -t is convenient to write \( \mathbf{\hat{y}} = X\theta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +t is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by $$ \begin{equation} X \equiv \begin{bmatrix} @@ -486,10 +506,10 @@ $$ The loss function is given by $$ -C(\theta) = ||X\theta-\mathbf{y}||^2 = ||X\theta||^2 - 2 \mathbf{y}^T X\theta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\theta_0 + \theta_1 x_i)^2 - 2 y_i (\theta_0 + \theta_1 x_i) + y_i^2 +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 $$ -and we want to find \( \theta \) such that \( C(\theta) \) is minimized. +and we want to find \( \beta \) such that \( C(\beta) \) is minimized.











        @@ -497,11 +517,11 @@ and we want to find \( \theta \) such that \( C(\theta) \) is minimized.

        The derivative of the cost/loss function

        -Computing \( \partial C(\theta) / \partial \theta_0 \) and \( \partial C(\theta) / \partial \theta_1 \) we can show that the gradient can be written as +Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as $$ -\nabla_\theta C(\theta) = (\partial C(\theta) / \partial \theta_0, \partial C(\theta) / \partial \theta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\theta - \mathbf{y}), +\nabla_\beta C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), $$ where \( X \) is the design matrix defined above. @@ -510,15 +530,15 @@ where \( X \) is the design matrix defined above.









        The Hessian matrix

        -The Hessian matrix of \( C(\theta) \) is given by +The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\theta)}{\partial \theta_0^2} & \frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} \\ -\frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} & \frac{\partial^2 C(\theta)}{\partial \theta_1^2} & \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ \end{bmatrix} = 2X^T X. $$ -This result implies that \( C(\theta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. +This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite.











        @@ -526,19 +546,19 @@ This result implies that \( C(\theta) \) is a convex function since the matrix \

        Simple program

        -We can now write a program that minimizes \( C(\theta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to +We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to $$ -\theta_{k+1} = \theta_k - \gamma \nabla_\theta C(\theta_k), \ k=0,1,\cdots +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots $$

        We can use the expression we computed for the gradient and let use a -\( \theta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating -when \( ||\nabla_\theta C(\theta_k) || < \epsilon = 10^{-8} \). +\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating +when \( ||\nabla_\beta C(\beta_k) || < \epsilon = 10^{-8} \).

        -And finally we can compare our solution for \( \theta \) with the analytic result given by -\( \theta= (X^TX)^{-1} X^T \mathbf{y} \). +And finally we can compare our solution for \( \beta \) with the analytic result given by +\( \beta= (X^TX)^{-1} X^T \mathbf{y} \).

        @@ -555,11 +575,11 @@ x = np.random.rand(N) #Uniformly generated x-value y = 5*x**2 + 0.1*np.random.randn(N) X = np.c_[np.ones(N),x] #Construct design matrix -#Compute theta according to normal equations to compare with GD solution +#Compute beta according to normal equations to compare with GD solution Xt_X_inv = np.linalg.inv(np.dot(X.T,X)) Xt_y = np.dot(X.transpose(),y) -theta_NE = np.dot(Xt_X_inv,Xt_y) -print(theta_NE) +beta_NE = np.dot(Xt_X_inv,Xt_y) +print(beta_NE)

        @@ -567,27 +587,27 @@ theta_NE = np.dot(Xt_X_inv,Xt_y)

        Gradient descent and Ridge

        -We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \theta \), +We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), $$ -C_{\text{ridge}}(\theta) = ||X\theta -\mathbf{y}||^2 + \lambda ||\theta||^2, \ \lambda \geq 0. +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. $$

        -In order to minimize \( C_{\text{ridge}}(\theta) \) using GD we only have adjust the gradient as follows +In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows $$ -\nabla_\theta C_{\text{ridge}}(\theta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \theta_0 \\ \theta_1\end{bmatrix} = 2 (X^T(X\theta - \mathbf{y})+\lambda \theta). +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). $$

        -We can now extend our program to minimize \( C_{\text{ridge}}(\theta) \) using gradient descent and compare with the analytical solution given by +We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by $$ -\theta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, $$ for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). -We can then compute \( ||\theta_{\text{ridge}}|| \) for each \( \lambda \). +We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \).

        @@ -605,7 +625,7 @@ x = np.random.rand(N) y = 5*x**2 + 0.1*np.random.randn(N) -#Compute analytic theta for Ridge regression +#Compute analytic beta for Ridge regression X = np.c_[np.ones(N),x] XT_X = np.dot(X.T,X) @@ -613,10 +633,10 @@ l = 0.1 #Ridge Id = np.eye(XT_X.shape[0]) Z = np.linalg.inv(XT_X+l*Id) -theta_ridge = np.dot(Z,np.dot(X.T,y)) +beta_ridge = np.dot(Z,np.dot(X.T,y)) -print(theta_ridge) -print(np.linalg.norm(theta_ridge)) #||theta|| +print(beta_ridge) +print(np.linalg.norm(beta_ridge)) #||beta||











        @@ -632,8 +652,8 @@ The underlying idea of SGD comes from the observation that the cost function, which we want to minimize, can almost always be written as a sum over \( n \) datapoints \( \{\mathbf{x}_i\}_{i=1}^n \), $$ -C(\mathbf{\theta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\theta}). +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

        @@ -645,8 +665,8 @@ $$ This in turn means that the gradient can be computed as a sum over \( i \)-gradients $$ -\nabla_\theta C(\mathbf{\theta}) = \sum_i^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}). +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

        @@ -674,10 +694,10 @@ The idea is now to approximate the gradient by replacing the sum over all datapoints with a sum over the datapoints in one the minibatches picked at random in each gradient descent step $$ -\nabla_\theta -C(\mathbf{\theta}) = \sum_{i=1}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) \rightarrow \sum_{i \in B_k}^n \nabla_\theta -c_i(\mathbf{x}_i, \mathbf{\theta}). +\nabla_\beta +C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta +c_i(\mathbf{x}_i, \mathbf{\beta}). $$

        @@ -688,8 +708,8 @@ $$

        Thus a gradient descent step now looks like $$ -\theta_{j+1} = \theta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) +\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) $$

        @@ -719,7 +739,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for j += 1

        @@ -745,7 +765,7 @@ is zero is valid also for local minima, so this would only tell us that we are close to a local/global minimum. However, we could also evaluate the cost function at this point, store the result and continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the \( \theta \) that +compare the values of the cost function and keep the \( \beta \) that gave the lowest value.

        @@ -762,10 +782,10 @@ reasonable time such that we do not move at all. 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 \).

        -In this way we can fix the number of epochs, compute \( \theta \) and +In this way we can fix the number of epochs, compute \( \beta \) and evaluate the cost function at the end. Repeating the computation will give a different result since the scheme is random by design. Then we -pick the final \( \theta \) that gives the lowest value of the cost +pick the final \( \beta \) that gives the lowest value of the cost function.

        @@ -789,7 +809,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for beta t = epoch*m+i gamma_j = step_length(t,t0,t1) j += 1 diff --git a/doc/pub/Splines/html/Splines.html b/doc/pub/Splines/html/Splines.html index f616f2f8c..b7f5a50f9 100644 --- a/doc/pub/Splines/html/Splines.html +++ b/doc/pub/Splines/html/Splines.html @@ -161,11 +161,11 @@ MathJax.Hub.Config({

        Almost every problem in machine learning and data science starts with -a dataset \( X \), a model \( g(\theta) \), which is a function of the -parameters \( \theta \) and a cost function \( C(X, g(\theta)) \) that allows -us to judge how well the model \( g(\theta) \) explains the observations -\( X \). The model is fit by finding the values of \( \theta \) that minimize -the cost function. Ideally we would be able to solve for \( \theta \) +a dataset \( X \), a model \( g(\beta) \), which is a function of the +parameters \( \beta \) and a cost function \( C(X, g(\beta)) \) that allows +us to judge how well the model \( g(\beta) \) explains the observations +\( X \). The model is fit by finding the values of \( \beta \) that minimize +the cost function. Ideally we would be able to solve for \( \beta \) analytically, however this is not possible in general and we must use some approximative/numerical method to compute the minimum. @@ -200,7 +200,7 @@ we are always moving towards smaller function values, i.e a minimum. The previous observation is the basis of the method of steepest descent, which is also referred to as just gradient descent (GD). One starts with an initial guess \( \mathbf{x}_0 \) for a minimum of \( F \) and -compute new approximations according to +computes new approximations according to $$ \mathbf{x}_{k+1} = \mathbf{x}_k - \gamma_k \nabla F(\mathbf{x}_k), \ \ k \geq 0. @@ -208,7 +208,7 @@ $$

        The parameter \( \gamma_k \) is often referred to as the step length or -the learning rate in the context of Machine Learning. +the learning rate within the context of Machine Learning.

        @@ -216,10 +216,21 @@ the learning rate in the context of Machine Learning.

        The ideal

        -Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global minimum of the function \( F \). In general we do not know if we are in a global or local minimum. In the special case when \( F \) is a convex function, all local minima are also global minima, so in this case gradient descent can converge to the global solution. The advantage of this scheme is that it is conceptually simple and straightforward to implement. However the method in this form has some severe limitations: +Ideally the sequence \( \{ \mathbf{x}_k \}_{k=0} \) converges to a global +minimum of the function \( F \). In general we do not know if we are in a +global or local minimum. In the special case when \( F \) is a convex +function, all local minima are also global minima, so in this case +gradient descent can converge to the global solution. The advantage of +this scheme is that it is conceptually simple and straightforward to +implement. However the method in this form has some severe +limitations:

        -In machine learing we are often faced with non-convex high dimensional cost functions with many local minimum. Since GD is deterministic we will get stuck in a local minimum, if the method converges, unless we have a very good intial guess. This also implies that the scheme is sensitive to the chosen initial condition. +In machine learing we are often faced with non-convex high dimensional +cost functions with many local minima. Since GD is deterministic we +will get stuck in a local minimum, if the method converges, unless we +have a very good intial guess. This also implies that the scheme is +sensitive to the chosen initial condition.

        Note that the gradient is a function of \( \mathbf{x} = @@ -234,19 +245,21 @@ Note that the gradient is a function of \( \mathbf{x} = GD is sensitive to the choice of learning rate \( \gamma_k \). This is due to the fact that we are only guaranteed that \( F(\mathbf{x}_{k+1}) \leq F(\mathbf{x}_k) \) for sufficiently small \( \gamma_k \). The problem is to -determine an optimal learning rate. If the learning rate is chosen to -small the method will take a long to converge and if it is to large we -can experience erratic behavior. +determine an optimal learning rate. If the learning rate is chosen too +small the method will take a long time to converge and if it is too +large we can experience erratic behavior.

        Many of these shortcomings can be alleviated by introducing randomness. One such method is that of Stochastic Gradient Descent -(SGD), see below +(SGD), see below.











        Gradient Descent Example

        + +

        We revisit now our simple linear regression example with a linear polynomial.

        @@ -264,30 +277,30 @@ x = 2*np y = 4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) -theta = np.random.randn(2,1) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) +beta = np.random.randn(2,1) eta = 0.1 Niterations = 1000 m = 100 for iter in range(Niterations): - gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y) - theta -= eta*gradients + gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) + beta -= eta*gradients -print(theta) +print(beta) xnew = np.array([[0],[2]]) xbnew = np.c_[np.ones((2,1)), xnew] -ypredict = xbnew.dot(theta) -ypredict2 = xbnew.dot(theta_linreg) +ypredict = xbnew.dot(beta) +ypredict2 = xbnew.dot(beta_linreg) plt.plot(xnew, ypredict, "r-") plt.plot(xnew, ypredict2, "b-") plt.plot(x, y ,'ro') plt.axis([0,2.0,0, 15.0]) plt.xlabel(r'$x$') plt.ylabel(r'$y$') -plt.title(r'Random numbers ') +plt.title(r'Gradient descent example') plt.show()

        @@ -308,8 +321,8 @@ x = 2*np y = 4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) sgdreg.fit(x,y.ravel()) print(sgdreg.intercept_, sgdreg.coef_) @@ -318,6 +331,8 @@ sgdreg.fit(x,y.

        Convex functions

        + +

        Ideally we want our cost/loss function to be convex(concave).

        @@ -338,7 +353,7 @@ regular polygons (triangles, rectangles, pentagons, etc...).

        Convex function

        -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. +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.











        @@ -349,9 +364,7 @@ Convex function: Let \( X \subset \mathbb{R}^n \) be a convex set. Assume that t In the following we state first and second-order conditions which ensures convexity of a function \( f \). We write \( D_f \) to denote the domain of \( f \), i.e the subset of \( R^n \) where \( f \) is defined. For more -details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex -Optimization. Cambridge University Press, http://stanford.edu/ -boyd/cvxbook/, 2004. +details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press.

        @@ -394,9 +407,12 @@ This condition is particularly useful since it gives us an procedure for determi The next result is of great importance to us and the reason why we are going on about convex functions. In machine learning we frequently have to minimize a loss/cost function in order to find the best -parameters for the model we are considering. Ideally we want the -global minimum, however for high-dimensional models it is hard to know -if we have local or global minimum. However, if the cost/loss function +parameters for the model we are considering. + +

        +Ideally we want the +global minimum (for high-dimensional models it is hard to know +if we have local or global minimum). However, if the cost/loss function is convex the following result provides invaluable information:

        @@ -408,6 +424,8 @@ is minimal, where \( f \) is convex and differentiable. Then, any point \( x^* \) that satisfies \( \nabla f(x^*) = 0 \) is a global minimum.

        + +

        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.

        @@ -416,27 +434,26 @@ This result means that if we know that the cost/loss function is convex and we a

        Some simple problems

          -
        1. Show that \( f(x)=x^2 \) is convex for \( x \in \mathbb{R} \) using the definition of convexity.
        2. -
        - -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. $$ - -
          +
        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. $
        2. Using the second order condition show that the following functions are convex on the specified domain.
        3. -
        -\( f(x) = e^x \) is convex for \( x \in \mathbb{R} \). -\( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \). +
          +
        • \( f(x) = e^x \) is convex for \( x \in \mathbb{R} \).
        • +
        • \( g(x) = -\ln(x) \) is convex for \( x \in (0,\infty) \).
        • +
        -
        1. 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.
        2. A norm is any function that satisfy the following properties
        3. + +
            +
          • \( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \).
          • +
          • \( f(x+y) \leq f(x) + f(y) \)
          • +
          • \( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \)
          • +
          +
        -\( f(\alpha x) = |\alpha| f(x) \) for all \( \alpha \in \mathbb{R} \). -\( f(x+y) \leq f(x) + f(y) \) -\( f(x) \leq 0 \) for all \( x \in \mathbb{R}^n \) with equality if and only if \( x = 0 \) -Using the definition of convexity, show that a function satisfying the properties above is convex (the third condition is not needed to show this). +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).

        @@ -444,7 +461,10 @@ Using the definition of convexity, show that a function satisfying the propertie

        Revisiting our first homework

        -We will use linear regression as a case study for the gradient descent methods. Linear regression is a great test case for the gradient descent methods discussed in the lectures since it has several desirable properties such as: +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as:

        1. An analytical solution (recall homework set 1).
        2. @@ -460,12 +480,12 @@ $$ with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). The linear regression model is given by $$ -h_\theta(x) = \hat{y} = \theta_0 + \theta_1 x, +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, $$ such that $$ -\hat{y}_i = \theta_0 + \theta_1 x_i. +\hat{y}_i = \beta_0 + \beta_1 x_i. $$

          @@ -474,10 +494,10 @@ $$

          Gradient descent example

          -Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \theta = (\theta_0, \theta_1)^T \) +Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \)

          -t is convenient to write \( \mathbf{\hat{y}} = X\theta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +t is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by $$ \begin{equation} X \equiv \begin{bmatrix} @@ -491,10 +511,10 @@ $$ The loss function is given by $$ -C(\theta) = ||X\theta-\mathbf{y}||^2 = ||X\theta||^2 - 2 \mathbf{y}^T X\theta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\theta_0 + \theta_1 x_i)^2 - 2 y_i (\theta_0 + \theta_1 x_i) + y_i^2 +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 $$ -and we want to find \( \theta \) such that \( C(\theta) \) is minimized. +and we want to find \( \beta \) such that \( C(\beta) \) is minimized.











          @@ -502,11 +522,11 @@ and we want to find \( \theta \) such that \( C(\theta) \) is minimized.

          The derivative of the cost/loss function

          -Computing \( \partial C(\theta) / \partial \theta_0 \) and \( \partial C(\theta) / \partial \theta_1 \) we can show that the gradient can be written as +Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as $$ -\nabla_\theta C(\theta) = (\partial C(\theta) / \partial \theta_0, \partial C(\theta) / \partial \theta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\theta - \mathbf{y}), +\nabla_\beta C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), $$ where \( X \) is the design matrix defined above. @@ -515,15 +535,15 @@ where \( X \) is the design matrix defined above.









          The Hessian matrix

          -The Hessian matrix of \( C(\theta) \) is given by +The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\theta)}{\partial \theta_0^2} & \frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} \\ -\frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} & \frac{\partial^2 C(\theta)}{\partial \theta_1^2} & \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ \end{bmatrix} = 2X^T X. $$ -This result implies that \( C(\theta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. +This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite.











          @@ -531,19 +551,19 @@ This result implies that \( C(\theta) \) is a convex function since the matrix \

          Simple program

          -We can now write a program that minimizes \( C(\theta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to +We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to $$ -\theta_{k+1} = \theta_k - \gamma \nabla_\theta C(\theta_k), \ k=0,1,\cdots +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots $$

          We can use the expression we computed for the gradient and let use a -\( \theta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating -when \( ||\nabla_\theta C(\theta_k) || < \epsilon = 10^{-8} \). +\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating +when \( ||\nabla_\beta C(\beta_k) || < \epsilon = 10^{-8} \).

          -And finally we can compare our solution for \( \theta \) with the analytic result given by -\( \theta= (X^TX)^{-1} X^T \mathbf{y} \). +And finally we can compare our solution for \( \beta \) with the analytic result given by +\( \beta= (X^TX)^{-1} X^T \mathbf{y} \).

          @@ -560,11 +580,11 @@ x = np. y = 5*x**2 + 0.1*np.random.randn(N) X = np.c_[np.ones(N),x] #Construct design matrix -#Compute theta according to normal equations to compare with GD solution +#Compute beta according to normal equations to compare with GD solution Xt_X_inv = np.linalg.inv(np.dot(X.T,X)) Xt_y = np.dot(X.transpose(),y) -theta_NE = np.dot(Xt_X_inv,Xt_y) -print(theta_NE) +beta_NE = np.dot(Xt_X_inv,Xt_y) +print(beta_NE)

          @@ -572,27 +592,27 @@ theta_NE = np.<

          Gradient descent and Ridge

          -We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \theta \), +We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), $$ -C_{\text{ridge}}(\theta) = ||X\theta -\mathbf{y}||^2 + \lambda ||\theta||^2, \ \lambda \geq 0. +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. $$

          -In order to minimize \( C_{\text{ridge}}(\theta) \) using GD we only have adjust the gradient as follows +In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows $$ -\nabla_\theta C_{\text{ridge}}(\theta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \theta_0 \\ \theta_1\end{bmatrix} = 2 (X^T(X\theta - \mathbf{y})+\lambda \theta). +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). $$

          -We can now extend our program to minimize \( C_{\text{ridge}}(\theta) \) using gradient descent and compare with the analytical solution given by +We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by $$ -\theta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, $$ for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). -We can then compute \( ||\theta_{\text{ridge}}|| \) for each \( \lambda \). +We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \).

          @@ -610,7 +630,7 @@ x = np. y = 5*x**2 + 0.1*np.random.randn(N) -#Compute analytic theta for Ridge regression +#Compute analytic beta for Ridge regression X = np.c_[np.ones(N),x] XT_X = np.dot(X.T,X) @@ -618,10 +638,10 @@ l = 0.1 Id = np.eye(XT_X.shape[0]) Z = np.linalg.inv(XT_X+l*Id) -theta_ridge = np.dot(Z,np.dot(X.T,y)) +beta_ridge = np.dot(Z,np.dot(X.T,y)) -print(theta_ridge) -print(np.linalg.norm(theta_ridge)) #||theta|| +print(beta_ridge) +print(np.linalg.norm(beta_ridge)) #||beta||











          @@ -637,8 +657,8 @@ The underlying idea of SGD comes from the observation that the cost function, which we want to minimize, can almost always be written as a sum over \( n \) datapoints \( \{\mathbf{x}_i\}_{i=1}^n \), $$ -C(\mathbf{\theta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\theta}). +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

          @@ -650,8 +670,8 @@ $$ This in turn means that the gradient can be computed as a sum over \( i \)-gradients $$ -\nabla_\theta C(\mathbf{\theta}) = \sum_i^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}). +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). $$

          @@ -679,10 +699,10 @@ The idea is now to approximate the gradient by replacing the sum over all datapoints with a sum over the datapoints in one the minibatches picked at random in each gradient descent step $$ -\nabla_\theta -C(\mathbf{\theta}) = \sum_{i=1}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) \rightarrow \sum_{i \in B_k}^n \nabla_\theta -c_i(\mathbf{x}_i, \mathbf{\theta}). +\nabla_\beta +C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta +c_i(\mathbf{x}_i, \mathbf{\beta}). $$

          @@ -693,8 +713,8 @@ $$

          Thus a gradient descent step now looks like $$ -\theta_{j+1} = \theta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) +\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) $$

          @@ -724,7 +744,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for j += 1

          @@ -750,7 +770,7 @@ is zero is valid also for local minima, so this would only tell us that we are close to a local/global minimum. However, we could also evaluate the cost function at this point, store the result and continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the \( \theta \) that +compare the values of the cost function and keep the \( \beta \) that gave the lowest value.

          @@ -767,10 +787,10 @@ reasonable time such that we do not move at all. 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 \).

          -In this way we can fix the number of epochs, compute \( \theta \) and +In this way we can fix the number of epochs, compute \( \beta \) and evaluate the cost function at the end. Repeating the computation will give a different result since the scheme is random by design. Then we -pick the final \( \theta \) that gives the lowest value of the cost +pick the final \( \beta \) that gives the lowest value of the cost function.

          @@ -794,7 +814,7 @@ j = 0 for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for beta t = epoch*m+i gamma_j = step_length(t,t0,t1) j += 1 diff --git a/doc/pub/Splines/ipynb/Splines.ipynb b/doc/pub/Splines/ipynb/Splines.ipynb index ca6d541d7..5328f5ba0 100644 --- a/doc/pub/Splines/ipynb/Splines.ipynb +++ b/doc/pub/Splines/ipynb/Splines.ipynb @@ -20,11 +20,11 @@ "## 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(\\theta)$, which is a function of the\n", - "parameters $\\theta$ and a cost function $C(X, g(\\theta))$ that allows\n", - "us to judge how well the model $g(\\theta)$ explains the observations\n", - "$X$. The model is fit by finding the values of $\\theta$ that minimize\n", - "the cost function. Ideally we would be able to solve for $\\theta$\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", @@ -61,7 +61,7 @@ "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", - "compute new approximations according to" + "computes new approximations according to" ] }, { @@ -78,14 +78,25 @@ "metadata": {}, "source": [ "The parameter $\\gamma_k$ is often referred to as the step length or\n", - "the learning rate in the context of Machine Learning.\n", + "the learning rate within the context of Machine Learning.\n", "\n", "\n", "## The ideal\n", "\n", - "Ideally the sequence $\\{ \\mathbf{x}_k \\}_{k=0}$ converges to a global minimum of the function $F$. In general we do not know if we are in a global or local minimum. In the special case when $F$ is a convex function, all local minima are also global minima, so in this case gradient descent can converge to the global solution. The advantage of this scheme is that it is conceptually simple and straightforward to implement. However the method in this form has some severe limitations:\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 cost functions with many local minimum. Since GD is deterministic we will get stuck in a local minimum, if the method converges, unless we have a very good intial guess. This also implies that the scheme is sensitive to the chosen initial condition.\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", @@ -97,15 +108,16 @@ "GD 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 to\n", - "small the method will take a long to converge and if it is to large we\n", - "can experience erratic behavior.\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", + "(SGD), see below.\n", "\n", "## Gradient Descent Example\n", + "\n", "We revisit now our simple linear regression example with a linear polynomial." ] }, @@ -133,30 +145,30 @@ "y = 4+3*x+np.random.randn(100,1)\n", "\n", "xb = np.c_[np.ones((100,1)), x]\n", - "theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)\n", - "print(theta_linreg)\n", - "theta = np.random.randn(2,1)\n", + "beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)\n", + "print(beta_linreg)\n", + "beta = np.random.randn(2,1)\n", "\n", "eta = 0.1\n", "Niterations = 1000\n", "m = 100\n", "\n", "for iter in range(Niterations):\n", - " gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y)\n", - " theta -= eta*gradients\n", + " gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y)\n", + " beta -= eta*gradients\n", "\n", - "print(theta)\n", + "print(beta)\n", "xnew = np.array([[0],[2]])\n", "xbnew = np.c_[np.ones((2,1)), xnew]\n", - "ypredict = xbnew.dot(theta)\n", - "ypredict2 = xbnew.dot(theta_linreg)\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'Random numbers ')\n", + "plt.title(r'Gradient descent example')\n", "plt.show()" ] }, @@ -185,8 +197,8 @@ "y = 4+3*x+np.random.randn(100,1)\n", "\n", "xb = np.c_[np.ones((100,1)), x]\n", - "theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)\n", - "print(theta_linreg)\n", + "beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)\n", + "print(beta_linreg)\n", "sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1)\n", "sgdreg.fit(x,y.ravel())\n", "print(sgdreg.intercept_, sgdreg.coef_)" @@ -198,6 +210,7 @@ "source": [ "\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", @@ -212,16 +225,14 @@ "\n", "## Convex function\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", + "**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", "## Conditions on convex functions\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\n", - "Optimization. Cambridge University Press, \n", - "boyd/cvxbook/, 2004.\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", @@ -255,9 +266,11 @@ "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. Ideally we want the\n", - "global minimum, however for high-dimensional models it is hard to know\n", - "if we have local or global minimum. However, if the cost/loss function\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", @@ -267,30 +280,40 @@ "$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", "## Some simple problems\n", - "1. Show that $f(x)=x^2$ is convex for $x \\in \\mathbb{R}$ using the definition of convexity.\n", "\n", - "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", + "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", - "1. Using the second order condition show that the following functions are convex on the specified domain.\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", - "$g(x) = -\\ln(x)$ is convex for $x \\in (0,\\infty)$.\n", - "1. 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", + " * $f(x) = e^x$ is convex for $x \\in \\mathbb{R}$.\n", "\n", - "2. A norm is any function that satisfy the following properties\n", + " * $g(x) = -\\ln(x)$ is convex for $x \\in (0,\\infty)$.\n", "\n", - "$f(\\alpha x) = |\\alpha| f(x)$ for all $\\alpha \\in \\mathbb{R}$.\n", - "$f(x+y) \\leq f(x) + f(y)$\n", - "$f(x) \\leq 0$ for all $x \\in \\mathbb{R}^n$ with equality if and only if $x = 0$\n", - "Using the definition of convexity, show that a function satisfying the properties above is convex (the third condition is not needed to show this).\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", "## Revisiting our first homework\n", "\n", - "We will use linear regression as a case study for the gradient descent methods. Linear regression is a great test case for the gradient descent methods discussed in the lectures since it has several desirable properties such as:\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 (recall homework set 1).\n", "\n", @@ -323,7 +346,7 @@ "metadata": {}, "source": [ "$$\n", - "h_\\theta(x) = \\hat{y} = \\theta_0 + \\theta_1 x,\n", + "h_\\beta(x) = \\hat{y} = \\beta_0 + \\beta_1 x,\n", "$$" ] }, @@ -339,7 +362,7 @@ "metadata": {}, "source": [ "$$\n", - "\\hat{y}_i = \\theta_0 + \\theta_1 x_i.\n", + "\\hat{y}_i = \\beta_0 + \\beta_1 x_i.\n", "$$" ] }, @@ -350,9 +373,9 @@ "\n", "## Gradient descent example\n", "\n", - "Let $\\mathbf{y} = (y_1,\\cdots,y_n)^T$, $\\mathbf{\\hat{y}} = (\\hat{y}_1,\\cdots,\\hat{y}_n)^T$ and $\\theta = (\\theta_0, \\theta_1)^T$\n", + "Let $\\mathbf{y} = (y_1,\\cdots,y_n)^T$, $\\mathbf{\\hat{y}} = (\\hat{y}_1,\\cdots,\\hat{y}_n)^T$ and $\\beta = (\\beta_0, \\beta_1)^T$\n", "\n", - "t is convenient to write $\\mathbf{\\hat{y}} = X\\theta$ where $X \\in \\mathbb{R}^{100 \\times 2} $ is the design matrix given by" + "t is convenient to write $\\mathbf{\\hat{y}} = X\\beta$ where $X \\in \\mathbb{R}^{100 \\times 2} $ is the design matrix given by" ] }, { @@ -386,7 +409,7 @@ "metadata": {}, "source": [ "$$\n", - "C(\\theta) = ||X\\theta-\\mathbf{y}||^2 = ||X\\theta||^2 - 2 \\mathbf{y}^T X\\theta + ||\\mathbf{y}||^2 = \\sum_{i=1}^{100} (\\theta_0 + \\theta_1 x_i)^2 - 2 y_i (\\theta_0 + \\theta_1 x_i) + y_i^2\n", + "C(\\beta) = ||X\\beta-\\mathbf{y}||^2 = ||X\\beta||^2 - 2 \\mathbf{y}^T X\\beta + ||\\mathbf{y}||^2 = \\sum_{i=1}^{100} (\\beta_0 + \\beta_1 x_i)^2 - 2 y_i (\\beta_0 + \\beta_1 x_i) + y_i^2\n", "$$" ] }, @@ -394,11 +417,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "and we want to find $\\theta$ such that $C(\\theta)$ is minimized.\n", + "and we want to find $\\beta$ such that $C(\\beta)$ is minimized.\n", "\n", "## The derivative of the cost/loss function\n", "\n", - "Computing $\\partial C(\\theta) / \\partial \\theta_0$ and $\\partial C(\\theta) / \\partial \\theta_1$ we can show that the gradient can be written as" + "Computing $\\partial C(\\beta) / \\partial \\beta_0$ and $\\partial C(\\beta) / \\partial \\beta_1$ we can show that the gradient can be written as" ] }, { @@ -406,9 +429,9 @@ "metadata": {}, "source": [ "$$\n", - "\\nabla_\\theta C(\\theta) = (\\partial C(\\theta) / \\partial \\theta_0, \\partial C(\\theta) / \\partial \\theta_1)^T = 2\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\theta_0+\\theta_1x_i-y_i\\right) \\\\\n", - "\\sum_{i=1}^{100}\\left( x_i (\\theta_0+\\theta_1x_i)-y_ix_i\\right) \\\\\n", - "\\end{bmatrix} = 2X^T(X\\theta - \\mathbf{y}),\n", + "\\nabla_\\beta C(\\beta) = (\\partial C(\\beta) / \\partial \\beta_0, \\partial C(\\beta) / \\partial \\beta_1)^T = 2\\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} = 2X^T(X\\beta - \\mathbf{y}),\n", "$$" ] }, @@ -419,7 +442,7 @@ "where $X$ is the design matrix defined above.\n", "\n", "## The Hessian matrix\n", - "The Hessian matrix of $C(\\theta)$ is given by" + "The Hessian matrix of $C(\\beta)$ is given by" ] }, { @@ -428,8 +451,8 @@ "source": [ "$$\n", "\\hat{H} \\equiv \\begin{bmatrix}\n", - "\\frac{\\partial^2 C(\\theta)}{\\partial \\theta_0^2} & \\frac{\\partial^2 C(\\theta)}{\\partial \\theta_0 \\partial \\theta_1} \\\\\n", - "\\frac{\\partial^2 C(\\theta)}{\\partial \\theta_0 \\partial \\theta_1} & \\frac{\\partial^2 C(\\theta)}{\\partial \\theta_1^2} & \\\\\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} = 2X^T X.\n", "$$" ] @@ -438,11 +461,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This result implies that $C(\\theta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite.\n", + "This result implies that $C(\\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite.\n", "\n", "## Simple program\n", "\n", - "We can now write a program that minimizes $C(\\theta)$ using the gradient descent method with a constant learning rate $\\gamma$ according to" + "We can now write a program that minimizes $C(\\beta)$ using the gradient descent method with a constant learning rate $\\gamma$ according to" ] }, { @@ -450,7 +473,7 @@ "metadata": {}, "source": [ "$$\n", - "\\theta_{k+1} = \\theta_k - \\gamma \\nabla_\\theta C(\\theta_k), \\ k=0,1,\\cdots\n", + "\\beta_{k+1} = \\beta_k - \\gamma \\nabla_\\beta C(\\beta_k), \\ k=0,1,\\cdots\n", "$$" ] }, @@ -459,11 +482,11 @@ "metadata": {}, "source": [ "We can use the expression we computed for the gradient and let use a\n", - "$\\theta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n", - "when $||\\nabla_\\theta C(\\theta_k) || < \\epsilon = 10^{-8}$. \n", + "$\\beta_0$ be chosen randomly and let $\\gamma = 0.001$. Stop iterating\n", + "when $||\\nabla_\\beta C(\\beta_k) || < \\epsilon = 10^{-8}$. \n", "\n", - "And finally we can compare our solution for $\\theta$ with the analytic result given by \n", - "$\\theta= (X^TX)^{-1} X^T \\mathbf{y}$." + "And finally we can compare our solution for $\\beta$ with the analytic result given by \n", + "$\\beta= (X^TX)^{-1} X^T \\mathbf{y}$." ] }, { @@ -487,11 +510,11 @@ "y = 5*x**2 + 0.1*np.random.randn(N)\n", "X = np.c_[np.ones(N),x] #Construct design matrix\n", "\n", - "#Compute theta according to normal equations to compare with GD solution\n", + "#Compute beta according to normal equations to compare with GD solution\n", "Xt_X_inv = np.linalg.inv(np.dot(X.T,X))\n", "Xt_y = np.dot(X.transpose(),y)\n", - "theta_NE = np.dot(Xt_X_inv,Xt_y)\n", - "print(theta_NE)" + "beta_NE = np.dot(Xt_X_inv,Xt_y)\n", + "print(beta_NE)" ] }, { @@ -501,7 +524,7 @@ "\n", "## Gradient descent and Ridge\n", "\n", - "We have also discussed Ridge regression where the loss function contains a regularized given by the $L_2$ norm of $\\theta$," + "We have also discussed Ridge regression where the loss function contains a regularized given by the $L_2$ norm of $\\beta$," ] }, { @@ -509,7 +532,7 @@ "metadata": {}, "source": [ "$$\n", - "C_{\\text{ridge}}(\\theta) = ||X\\theta -\\mathbf{y}||^2 + \\lambda ||\\theta||^2, \\ \\lambda \\geq 0.\n", + "C_{\\text{ridge}}(\\beta) = ||X\\beta -\\mathbf{y}||^2 + \\lambda ||\\beta||^2, \\ \\lambda \\geq 0.\n", "$$" ] }, @@ -517,7 +540,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In order to minimize $C_{\\text{ridge}}(\\theta)$ using GD we only have adjust the gradient as follows" + "In order to minimize $C_{\\text{ridge}}(\\beta)$ using GD we only have adjust the gradient as follows" ] }, { @@ -525,9 +548,9 @@ "metadata": {}, "source": [ "$$\n", - "\\nabla_\\theta C_{\\text{ridge}}(\\theta) = 2\\begin{bmatrix} \\sum_{i=1}^{100} \\left(\\theta_0+\\theta_1x_i-y_i\\right) \\\\\n", - "\\sum_{i=1}^{100}\\left( x_i (\\theta_0+\\theta_1x_i)-y_ix_i\\right) \\\\\n", - "\\end{bmatrix} + 2\\lambda\\begin{bmatrix} \\theta_0 \\\\ \\theta_1\\end{bmatrix} = 2 (X^T(X\\theta - \\mathbf{y})+\\lambda \\theta).\n", + "\\nabla_\\beta C_{\\text{ridge}}(\\beta) = 2\\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", "$$" ] }, @@ -535,7 +558,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can now extend our program to minimize $C_{\\text{ridge}}(\\theta)$ using gradient descent and compare with the analytical solution given by" + "We can now extend our program to minimize $C_{\\text{ridge}}(\\beta)$ using gradient descent and compare with the analytical solution given by" ] }, { @@ -543,7 +566,7 @@ "metadata": {}, "source": [ "$$\n", - "\\theta_{\\text{ridge}} = \\left(X^T X + \\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y},\n", + "\\beta_{\\text{ridge}} = \\left(X^T X + \\lambda I_{2 \\times 2} \\right)^{-1} X^T \\mathbf{y},\n", "$$" ] }, @@ -552,7 +575,7 @@ "metadata": {}, "source": [ "for $\\lambda = {0,1,10,50,100}$ ($\\lambda = 0$ corresponds to ordinary least squares). \n", - "We can then compute $||\\theta_{\\text{ridge}}||$ for each $\\lambda$." + "We can then compute $||\\beta_{\\text{ridge}}||$ for each $\\lambda$." ] }, { @@ -576,7 +599,7 @@ "y = 5*x**2 + 0.1*np.random.randn(N)\n", "\n", "\n", - "#Compute analytic theta for Ridge regression \n", + "#Compute analytic beta for Ridge regression \n", "X = np.c_[np.ones(N),x]\n", "XT_X = np.dot(X.T,X)\n", "\n", @@ -584,10 +607,10 @@ "Id = np.eye(XT_X.shape[0])\n", "\n", "Z = np.linalg.inv(XT_X+l*Id)\n", - "theta_ridge = np.dot(Z,np.dot(X.T,y))\n", + "beta_ridge = np.dot(Z,np.dot(X.T,y))\n", "\n", - "print(theta_ridge)\n", - "print(np.linalg.norm(theta_ridge)) #||theta||" + "print(beta_ridge)\n", + "print(np.linalg.norm(beta_ridge)) #||beta||" ] }, { @@ -609,8 +632,8 @@ "metadata": {}, "source": [ "$$\n", - "C(\\mathbf{\\theta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n", - "\\mathbf{\\theta}).\n", + "C(\\mathbf{\\beta}) = \\sum_{i=1}^n c_i(\\mathbf{x}_i,\n", + "\\mathbf{\\beta}).\n", "$$" ] }, @@ -629,8 +652,8 @@ "metadata": {}, "source": [ "$$\n", - "\\nabla_\\theta C(\\mathbf{\\theta}) = \\sum_i^n \\nabla_\\theta c_i(\\mathbf{x}_i,\n", - "\\mathbf{\\theta}).\n", + "\\nabla_\\beta C(\\mathbf{\\beta}) = \\sum_i^n \\nabla_\\beta c_i(\\mathbf{x}_i,\n", + "\\mathbf{\\beta}).\n", "$$" ] }, @@ -664,10 +687,10 @@ "metadata": {}, "source": [ "$$\n", - "\\nabla_\\theta\n", - "C(\\mathbf{\\theta}) = \\sum_{i=1}^n \\nabla_\\theta c_i(\\mathbf{x}_i,\n", - "\\mathbf{\\theta}) \\rightarrow \\sum_{i \\in B_k}^n \\nabla_\\theta\n", - "c_i(\\mathbf{x}_i, \\mathbf{\\theta}).\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", "$$" ] }, @@ -685,8 +708,8 @@ "metadata": {}, "source": [ "$$\n", - "\\theta_{j+1} = \\theta_j - \\gamma_j \\sum_{i \\in B_k}^n \\nabla_\\theta c_i(\\mathbf{x}_i,\n", - "\\mathbf{\\theta})\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", "$$" ] }, @@ -723,7 +746,7 @@ " 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 theta\n", + " #Compute new suggestion for \n", " j += 1" ] }, @@ -749,7 +772,7 @@ "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 $\\theta$ that\n", + "compare the values of the cost function and keep the $\\beta$ that\n", "gave the lowest value.\n", "\n", "## Slightly different approach\n", @@ -760,10 +783,10 @@ "\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 $\\theta$ and\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 $\\theta$ that gives the lowest value of the cost\n", + "pick the final $\\beta$ that gives the lowest value of the cost\n", "function." ] }, @@ -793,7 +816,7 @@ " 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 theta\n", + " #Compute new suggestion for beta\n", " t = epoch*m+i\n", " gamma_j = step_length(t,t0,t1)\n", " j += 1\n", diff --git a/doc/pub/Splines/ipynb/ipynb-Splines-src.tar.gz b/doc/pub/Splines/ipynb/ipynb-Splines-src.tar.gz index a32e88d055fb905636e8813c9df883788915de40..a1b16d968d9d315c255e4d3233039aacb3ac3232 100644 GIT binary patch literal 210 zcmV;@04@I?iwFSoXro&I1MSbxY63A3$8pa-#XP~1b=P<<=)psww7x)OqZ|Ju+ayBw z?Ohexlf6liem|EV!wkdB`{HH(x+wBj9zBdwO4qeqa;B%(RFhkMRhC-Hs+uaT>q=Lm zhC-{6sK=f3P M1F<0zSO6#h0CqQMdjJ3c literal 209 zcmV;?051O@iwFSt8>3qQ1MSbjY63A3#&OR+#XP~1RX2MU>Y;~1X?=mn#%`)6+a!Yf z_PPpsvNtKk|L^iK%rMM+Eaoq7iy|NL=wXyndNz|GYh9gFO)m9WS!yY#(@N>Gs%s@` zDD+6w<4(HSr)=Wsl=j>DWc}T_)7X0b%bv?Ca?O8Y*}5dJ?|p8A7ay`+g|Ly&ZtJ{F zh3k61k|x+R^d#D!y^B_i@5MBY%Px4c9d|K&MYBuA_^-bK000000000000000fah@p Ljt{KN04M+eu7+mR diff --git a/doc/pub/Splines/pdf/Splines-minted.pdf b/doc/pub/Splines/pdf/Splines-minted.pdf index cc3b8bc5f068950c95d5109cb47004dc88011438..c5ac6574a2c5f4d1f5517a9ce5f554beead3072d 100644 GIT binary patch delta 113182 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%0AZ9Hr=}I1b6-0ZYZd{? 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 delta 134251 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 Q3^+6}F*XV%B}Gq03SpqQcK`qY diff --git a/doc/src/Splines/Splines.do.txt b/doc/src/Splines/Splines.do.txt index 9eb3dfa37..a1465d76d 100644 --- a/doc/src/Splines/Splines.do.txt +++ b/doc/src/Splines/Splines.do.txt @@ -7,11 +7,11 @@ DATE: today ===== Optimization, the central part of any Machine Learning algortithm ===== Almost every problem in machine learning and data science starts with -a dataset $X$, a model $g(\theta)$, which is a function of the -parameters $\theta$ and a cost function $C(X, g(\theta))$ that allows -us to judge how well the model $g(\theta)$ explains the observations -$X$. The model is fit by finding the values of $\theta$ that minimize -the cost function. Ideally we would be able to solve for $\theta$ +a dataset $X$, a model $g(\beta)$, which is a function of the +parameters $\beta$ and a cost function $C(X, g(\beta))$ that allows +us to judge how well the model $g(\beta)$ explains the observations +$X$. The model is fit by finding the values of $\beta$ that minimize +the cost function. Ideally we would be able to solve for $\beta$ analytically, however this is not possible in general and we must use some approximative/numerical method to compute the minimum. @@ -40,7 +40,7 @@ we are always moving towards smaller function values, i.e a minimum. The previous observation is the basis of the method of steepest descent, which is also referred to as just gradient descent (GD). One starts with an initial guess $\mathbf{x}_0$ for a minimum of $F$ and -compute new approximations according to +computes new approximations according to !bt \[ @@ -49,14 +49,25 @@ compute new approximations according to !et The parameter $\gamma_k$ is often referred to as the step length or -the learning rate in the context of Machine Learning. +the learning rate within the context of Machine Learning. !split ===== The ideal ===== -Ideally the sequence $\{ \mathbf{x}_k \}_{k=0}$ converges to a global minimum of the function $F$. In general we do not know if we are in a global or local minimum. In the special case when $F$ is a convex function, all local minima are also global minima, so in this case gradient descent can converge to the global solution. The advantage of this scheme is that it is conceptually simple and straightforward to implement. However the method in this form has some severe limitations: +Ideally the sequence $\{ \mathbf{x}_k \}_{k=0}$ converges to a global +minimum of the function $F$. In general we do not know if we are in a +global or local minimum. In the special case when $F$ is a convex +function, all local minima are also global minima, so in this case +gradient descent can converge to the global solution. The advantage of +this scheme is that it is conceptually simple and straightforward to +implement. However the method in this form has some severe +limitations: -In machine learing we are often faced with non-convex high dimensional cost functions with many local minimum. Since GD is deterministic we will get stuck in a local minimum, if the method converges, unless we have a very good intial guess. This also implies that the scheme is sensitive to the chosen initial condition. +In machine learing we are often faced with non-convex high dimensional +cost functions with many local minima. Since GD is deterministic we +will get stuck in a local minimum, if the method converges, unless we +have a very good intial guess. This also implies that the scheme is +sensitive to the chosen initial condition. Note that the gradient is a function of $\mathbf{x} = (x_1,\cdots,x_n)$ which makes it expensive to compute numerically. @@ -68,16 +79,17 @@ Note that the gradient is a function of $\mathbf{x} = GD is sensitive to the choice of learning rate $\gamma_k$. This is due to the fact that we are only guaranteed that $F(\mathbf{x}_{k+1}) \leq F(\mathbf{x}_k)$ for sufficiently small $\gamma_k$. The problem is to -determine an optimal learning rate. If the learning rate is chosen to -small the method will take a long to converge and if it is to large we -can experience erratic behavior. +determine an optimal learning rate. If the learning rate is chosen too +small the method will take a long time to converge and if it is too +large we can experience erratic behavior. Many of these shortcomings can be alleviated by introducing randomness. One such method is that of Stochastic Gradient Descent -(SGD), see below +(SGD), see below. !split ===== Gradient Descent Example ===== + We revisit now our simple linear regression example with a linear polynomial. !bc pycod @@ -94,30 +106,30 @@ x = 2*np.random.rand(100,1) y = 4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) -theta = np.random.randn(2,1) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) +beta = np.random.randn(2,1) eta = 0.1 Niterations = 1000 m = 100 for iter in range(Niterations): - gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y) - theta -= eta*gradients + gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) + beta -= eta*gradients -print(theta) +print(beta) xnew = np.array([[0],[2]]) xbnew = np.c_[np.ones((2,1)), xnew] -ypredict = xbnew.dot(theta) -ypredict2 = xbnew.dot(theta_linreg) +ypredict = xbnew.dot(beta) +ypredict2 = xbnew.dot(beta_linreg) plt.plot(xnew, ypredict, "r-") plt.plot(xnew, ypredict2, "b-") plt.plot(x, y ,'ro') plt.axis([0,2.0,0, 15.0]) plt.xlabel(r'$x$') plt.ylabel(r'$y$') -plt.title(r'Random numbers ') +plt.title(r'Gradient descent example') plt.show() !ec @@ -136,8 +148,8 @@ x = 2*np.random.rand(100,1) y = 4+3*x+np.random.randn(100,1) xb = np.c_[np.ones((100,1)), x] -theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) -print(theta_linreg) +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) +print(beta_linreg) sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) sgdreg.fit(x,y.ravel()) print(sgdreg.intercept_, sgdreg.coef_) @@ -146,6 +158,7 @@ print(sgdreg.intercept_, sgdreg.coef_) !split ===== Convex functions ===== + Ideally we want our cost/loss function to be convex(concave). First we give the definition of a convex set: A set $C$ in @@ -161,7 +174,7 @@ regular polygons (triangles, rectangles, pentagons, etc...). !split ===== Convex function ===== -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. +_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. !split ===== Conditions on convex functions ===== @@ -169,9 +182,7 @@ Convex function: Let $X \subset \mathbb{R}^n$ be a convex set. Assume that the f In the following we state first and second-order conditions which ensures convexity of a function $f$. We write $D_f$ to denote the domain of $f$, i.e the subset of $R^n$ where $f$ is defined. For more -details and proofs we refer to: S. Boyd and L. Vandenberghe. Convex -Optimization. Cambridge University Press, http://stanford.edu/ -boyd/cvxbook/, 2004. +details and proofs we refer to: "S. Boyd and L. Vandenberghe. Convex Optimization. Cambridge University Press":"http://stanford.edu/boyd/cvxbook/, 2004". !bblock First order condition Suppose $f$ is differentiable (i.e $\nabla f(x)$ is well defined for @@ -202,9 +213,11 @@ This condition is particularly useful since it gives us an procedure for determi The next result is of great importance to us and the reason why we are going on about convex functions. In machine learning we frequently have to minimize a loss/cost function in order to find the best -parameters for the model we are considering. Ideally we want the -global minimum, however for high-dimensional models it is hard to know -if we have local or global minimum. However, if the cost/loss function +parameters for the model we are considering. + +Ideally we want the +global minimum (for high-dimensional models it is hard to know +if we have local or global minimum). However, if the cost/loss function is convex the following result provides invaluable information: !bblock Any minimum is global for convex functions @@ -212,30 +225,33 @@ Consider the problem of finding $x \in \mathbb{R}^n$ such that $f(x)$ is minimal, where $f$ is convex and differentiable. Then, any point $x^*$ that satisfies $\nabla f(x^*) = 0$ is a global minimum. !eblock + 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. !split ===== Some simple problems ===== -o 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. $$ + +o 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. $ o Using the second order condition show that the following functions are convex on the specified domain. - -$f(x) = e^x$ is convex for $x \in \mathbb{R}$. -$g(x) = -\ln(x)$ is convex for $x \in (0,\infty)$. + * $f(x) = e^x$ is convex for $x \in \mathbb{R}$. + * $g(x) = -\ln(x)$ is convex for $x \in (0,\infty)$. o 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. o A norm is any function that satisfy the following properties + * $f(\alpha x) = |\alpha| f(x)$ for all $\alpha \in \mathbb{R}$. + * $f(x+y) \leq f(x) + f(y)$ + * $f(x) \leq 0$ for all $x \in \mathbb{R}^n$ with equality if and only if $x = 0$ -$f(\alpha x) = |\alpha| f(x)$ for all $\alpha \in \mathbb{R}$. -$f(x+y) \leq f(x) + f(y)$ -$f(x) \leq 0$ for all $x \in \mathbb{R}^n$ with equality if and only if $x = 0$ -Using the definition of convexity, show that a function satisfying the properties above is convex (the third condition is not needed to show this). +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). !split ===== Revisiting our first homework ===== -We will use linear regression as a case study for the gradient descent methods. Linear regression is a great test case for the gradient descent methods discussed in the lectures since it has several desirable properties such as: +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as: o An analytical solution (recall homework set 1). o The gradient can be computed analytically. @@ -251,22 +267,22 @@ with $x_i \in [0,1] $ chosen randomly with a uniform distribution. Additionally The linear regression model is given by !bt \[ -h_\theta(x) = \hat{y} = \theta_0 + \theta_1 x, +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, \] !et such that !bt \[ -\hat{y}_i = \theta_0 + \theta_1 x_i. +\hat{y}_i = \beta_0 + \beta_1 x_i. \] !et !split ===== Gradient descent example ===== -Let $\mathbf{y} = (y_1,\cdots,y_n)^T$, $\mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T$ and $\theta = (\theta_0, \theta_1)^T$ +Let $\mathbf{y} = (y_1,\cdots,y_n)^T$, $\mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T$ and $\beta = (\beta_0, \beta_1)^T$ -t is convenient to write $\mathbf{\hat{y}} = X\theta$ where $X \in \mathbb{R}^{100 \times 2} $ is the design matrix given by +t is convenient to write $\mathbf{\hat{y}} = X\beta$ where $X \in \mathbb{R}^{100 \times 2} $ is the design matrix given by !bt \[ \begin{equation} @@ -281,53 +297,53 @@ X \equiv \begin{bmatrix} The loss function is given by !bt \[ -C(\theta) = ||X\theta-\mathbf{y}||^2 = ||X\theta||^2 - 2 \mathbf{y}^T X\theta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\theta_0 + \theta_1 x_i)^2 - 2 y_i (\theta_0 + \theta_1 x_i) + y_i^2 +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 \] !et -and we want to find $\theta$ such that $C(\theta)$ is minimized. +and we want to find $\beta$ such that $C(\beta)$ is minimized. !split ===== The derivative of the cost/loss function ===== -Computing $\partial C(\theta) / \partial \theta_0$ and $\partial C(\theta) / \partial \theta_1$ we can show that the gradient can be written as +Computing $\partial C(\beta) / \partial \beta_0$ and $\partial C(\beta) / \partial \beta_1$ we can show that the gradient can be written as !bt \[ -\nabla_\theta C(\theta) = (\partial C(\theta) / \partial \theta_0, \partial C(\theta) / \partial \theta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\theta - \mathbf{y}), +\nabla_\beta C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), \] !et where $X$ is the design matrix defined above. !split ===== The Hessian matrix ===== -The Hessian matrix of $C(\theta)$ is given by +The Hessian matrix of $C(\beta)$ is given by !bt \[ \hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\theta)}{\partial \theta_0^2} & \frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} \\ -\frac{\partial^2 C(\theta)}{\partial \theta_0 \partial \theta_1} & \frac{\partial^2 C(\theta)}{\partial \theta_1^2} & \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ \end{bmatrix} = 2X^T X. \] !et -This result implies that $C(\theta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite. +This result implies that $C(\beta)$ is a convex function since the matrix $X^T X$ always is positive semi-definite. !split ===== Simple program ===== -We can now write a program that minimizes $C(\theta)$ using the gradient descent method with a constant learning rate $\gamma$ according to +We can now write a program that minimizes $C(\beta)$ using the gradient descent method with a constant learning rate $\gamma$ according to !bt \[ -\theta_{k+1} = \theta_k - \gamma \nabla_\theta C(\theta_k), \ k=0,1,\cdots +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots \] !et We can use the expression we computed for the gradient and let use a -$\theta_0$ be chosen randomly and let $\gamma = 0.001$. Stop iterating -when $||\nabla_\theta C(\theta_k) || < \epsilon = 10^{-8}$. +$\beta_0$ be chosen randomly and let $\gamma = 0.001$. Stop iterating +when $||\nabla_\beta C(\beta_k) || < \epsilon = 10^{-8}$. -And finally we can compare our solution for $\theta$ with the analytic result given by -$\theta= (X^TX)^{-1} X^T \mathbf{y}$. +And finally we can compare our solution for $\beta$ with the analytic result given by +$\beta= (X^TX)^{-1} X^T \mathbf{y}$. !bc pycod import numpy as np @@ -342,40 +358,40 @@ x = np.random.rand(N) #Uniformly generated x-values in [0,1] y = 5*x**2 + 0.1*np.random.randn(N) X = np.c_[np.ones(N),x] #Construct design matrix -#Compute theta according to normal equations to compare with GD solution +#Compute beta according to normal equations to compare with GD solution Xt_X_inv = np.linalg.inv(np.dot(X.T,X)) Xt_y = np.dot(X.transpose(),y) -theta_NE = np.dot(Xt_X_inv,Xt_y) -print(theta_NE) +beta_NE = np.dot(Xt_X_inv,Xt_y) +print(beta_NE) !ec !split ===== Gradient descent and Ridge ===== -We have also discussed Ridge regression where the loss function contains a regularized given by the $L_2$ norm of $\theta$, +We have also discussed Ridge regression where the loss function contains a regularized given by the $L_2$ norm of $\beta$, !bt \[ -C_{\text{ridge}}(\theta) = ||X\theta -\mathbf{y}||^2 + \lambda ||\theta||^2, \ \lambda \geq 0. +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. \] !et -In order to minimize $C_{\text{ridge}}(\theta)$ using GD we only have adjust the gradient as follows +In order to minimize $C_{\text{ridge}}(\beta)$ using GD we only have adjust the gradient as follows !bt \[ -\nabla_\theta C_{\text{ridge}}(\theta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\theta_0+\theta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\theta_0+\theta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \theta_0 \\ \theta_1\end{bmatrix} = 2 (X^T(X\theta - \mathbf{y})+\lambda \theta). +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). \] !et -We can now extend our program to minimize $C_{\text{ridge}}(\theta)$ using gradient descent and compare with the analytical solution given by +We can now extend our program to minimize $C_{\text{ridge}}(\beta)$ using gradient descent and compare with the analytical solution given by !bt \[ -\theta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, \] !et for $\lambda = {0,1,10,50,100}$ ($\lambda = 0$ corresponds to ordinary least squares). -We can then compute $||\theta_{\text{ridge}}||$ for each $\lambda$. +We can then compute $||\beta_{\text{ridge}}||$ for each $\lambda$. !bc pycod import numpy as np @@ -391,7 +407,7 @@ x = np.random.rand(N) y = 5*x**2 + 0.1*np.random.randn(N) -#Compute analytic theta for Ridge regression +#Compute analytic beta for Ridge regression X = np.c_[np.ones(N),x] XT_X = np.dot(X.T,X) @@ -399,10 +415,10 @@ l = 0.1 #Ridge parameter lambda Id = np.eye(XT_X.shape[0]) Z = np.linalg.inv(XT_X+l*Id) -theta_ridge = np.dot(Z,np.dot(X.T,y)) +beta_ridge = np.dot(Z,np.dot(X.T,y)) -print(theta_ridge) -print(np.linalg.norm(theta_ridge)) #||theta|| +print(beta_ridge) +print(np.linalg.norm(beta_ridge)) #||beta|| !ec @@ -419,8 +435,8 @@ function, which we want to minimize, can almost always be written as a sum over $n$ datapoints $\{\mathbf{x}_i\}_{i=1}^n$, !bt \[ -C(\mathbf{\theta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\theta}). +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). \] !et @@ -431,8 +447,8 @@ This in turn means that the gradient can be computed as a sum over $i$-gradients !bt \[ -\nabla_\theta C(\mathbf{\theta}) = \sum_i^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}). +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). \] !et @@ -458,10 +474,10 @@ all datapoints with a sum over the datapoints in one the minibatches picked at random in each gradient descent step !bt \[ -\nabla_\theta -C(\mathbf{\theta}) = \sum_{i=1}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) \rightarrow \sum_{i \in B_k}^n \nabla_\theta -c_i(\mathbf{x}_i, \mathbf{\theta}). +\nabla_\beta +C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta +c_i(\mathbf{x}_i, \mathbf{\beta}). \] !et @@ -471,8 +487,8 @@ c_i(\mathbf{x}_i, \mathbf{\theta}). Thus a gradient descent step now looks like !bt \[ -\theta_{j+1} = \theta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\theta c_i(\mathbf{x}_i, -\mathbf{\theta}) +\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \] !et @@ -498,7 +514,7 @@ for epoch in range(1,n_epochs+1): for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for j += 1 !ec @@ -521,7 +537,7 @@ is zero is valid also for local minima, so this would only tell us that we are close to a local/global minimum. However, we could also evaluate the cost function at this point, store the result and continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the $\theta$ that +compare the values of the cost function and keep the $\beta$ that gave the lowest value. !split @@ -533,10 +549,10 @@ reasonable time such that we do not move at all. 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$. -In this way we can fix the number of epochs, compute $\theta$ and +In this way we can fix the number of epochs, compute $\beta$ and evaluate the cost function at the end. Repeating the computation will give a different result since the scheme is random by design. Then we -pick the final $\theta$ that gives the lowest value of the cost +pick the final $\beta$ that gives the lowest value of the cost function. !bc pycod @@ -558,7 +574,7 @@ for epoch in range(1,n_epochs+1): for i in range(m): k = np.random.randint(m) #Pick the k-th minibatch at random #Compute the gradient using the data in minibatch Bk - #Compute new suggestion for theta + #Compute new suggestion for beta t = epoch*m+i gamma_j = step_length(t,t0,t1) j += 1