From 250a59fbbd2d81571ddecc58ebd075564bf9f02a Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Sun, 5 Oct 2025 20:06:15 +0200 Subject: [PATCH] updating week 41 --- doc/pub/week41/html/week41-bs.html | 1051 +---- doc/pub/week41/html/week41-reveal.html | 795 +--- doc/pub/week41/html/week41-solarized.html | 851 +--- doc/pub/week41/html/week41.html | 851 +--- doc/pub/week41/ipynb/ipynb-week41-src.tar.gz | Bin 994410 -> 994410 bytes doc/pub/week41/ipynb/week41.ipynb | 2636 ++++++------ .../week41-checkpoint.ipynb | 3812 +++++++++++++++++ ...20B6B3DC1E8F8756667419FF9.highlight.minted | 11 + ...3B722A5D46E6B643B143D1A87.highlight.minted | 67 + ...E301CBCF11A668C5057AF3D1A.highlight.minted | 11 + ...A394E8F693820B1C98E9CDA6B0A8F.index.minted | 12 + doc/src/week41/_minted/default.style.minted | 100 + .../week41/ipynb-exercisesweek41-src.tar.gz | Bin 492792 -> 0 bytes doc/src/week41/week41.do.txt | 637 +-- 14 files changed, 5544 insertions(+), 5290 deletions(-) create mode 100644 doc/src/week41/.ipynb_checkpoints/week41-checkpoint.ipynb create mode 100644 doc/src/week41/_minted/65E03FF20B6B3DC1E8F8756667419FF9.highlight.minted create mode 100644 doc/src/week41/_minted/93B9C4D3B722A5D46E6B643B143D1A87.highlight.minted create mode 100644 doc/src/week41/_minted/FCC7426E301CBCF11A668C5057AF3D1A.highlight.minted create mode 100644 doc/src/week41/_minted/_F65A394E8F693820B1C98E9CDA6B0A8F.index.minted create mode 100644 doc/src/week41/_minted/default.style.minted delete mode 100644 doc/src/week41/ipynb-exercisesweek41-src.tar.gz diff --git a/doc/pub/week41/html/week41-bs.html b/doc/pub/week41/html/week41-bs.html index 0232fecde..608f3ab70 100644 --- a/doc/pub/week41/html/week41-bs.html +++ b/doc/pub/week41/html/week41-bs.html @@ -36,23 +36,30 @@ doconce format html week41.do.txt --html_style=bootstrap --pygments_html_style=d @@ -396,118 +328,90 @@ MathJax.Hub.Config({ @@ -529,7 +433,7 @@ MathJax.Hub.Config({
-Department of Physics, University of Oslo +Department of Physics, University of Oslo, Norway

@@ -541,27 +445,25 @@ MathJax.Hub.Config({ -

Plan for week 41, October 7-11

+

Plan for week 41, October 6-10

-

Material for the lecture on Monday October 7, 2024

+

Material for the lecture on Monday October 6, 2025

  1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.
  2. -
  3. Building our own Feed-forward Neural Network
  4. - +
  5. Building our own Feed-forward Neural Network, getting started + +
  1. These lecture notes
  2. -
  3. Rashcka et al chapter 11
  4. -
  5. For neural networks we recommend Goodfellow et al chapter 6. +
  6. For neural networks we recommend Goodfellow et al chapters 6 and 7.
  7. +
  8. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
      -
    1. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
    2. +
    3. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
  9. Building Neural Networks from scratch at https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex
  10. Video on Neural Networks at https://www.youtube.com/watch?v=CqOfi41LfDw
  11. @@ -573,15 +475,39 @@ MathJax.Hub.Config({ -

    Material for the active learning sessions on Tuesday and Wednesday

    -
      -
    • Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation
    • -
    • One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code
    • -
    • Discussion of project 2
    • -
    • Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent
    • -
    +

    Mathematics of deep learning

    + + + + -

    Lecture Monday October 7

    +

    Reminder on books with hands-on material and codes

    + + + + +

    Lab sessions on Tuesday and Wednesday

    + +
      +
    1. Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network.
    2. +
    + +

    Lecture Monday October 6

    Introduction to Neural networks

    @@ -788,213 +714,6 @@ as to not restrict the range of output values.

- -

Examples of XOR, OR and AND gates

- -

Let us first try to fit various gates using standard linear -regression. The gates we are thinking of are the classical XOR, OR and -AND gates, well-known elements in computer science. The tables here -show how we can set up the inputs \( x_1 \) and \( x_2 \) in order to yield a -specific target \( y_i \). -

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR, OR and AND gates with linear regression
-"""
-
-import numpy as np
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

What is happening here?

- - -

Does Logistic Regression do a better Job?

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR and OR gates with linear regression
-and logistic regression
-"""
-
-import matplotlib.pyplot as plt
-from sklearn.linear_model import LogisticRegression
-import numpy as np
-
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-# Now we change to logistic regression
-
-
-# Logistic Regression
-logreg = LogisticRegression()
-logreg.fit(X, yOR)
-print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR)))
-
-logreg.fit(X, yXOR)
-print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR)))
-
-
-logreg.fit(X, yAND)
-print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND)))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

Not exactly impressive, but somewhat better.

- - -

Adding Neural Networks

- - - -
-
-
-
-
-
# and now neural networks with Scikit-Learn and the XOR
-
-from sklearn.neural_network import MLPClassifier
-from sklearn.datasets import make_classification
-X, yXOR = make_classification(n_samples=100, random_state=1)
-FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)
-FFNN.predict_proba(X)
-print(f"Test set accuracy with Feed Forward Neural Network  for XOR gate:{FFNN.score(X, yXOR)}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - -

Mathematics of deep learning

- -
- -
- - - -

Reminder on books with hands-on material and codes

-
- -
- - - -

Reading recommendations

- -
    -
  1. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
  2. -
  3. Goodfellow et al, chapter 6 and 7 contain most of the neural network background.
  4. -

Mathematics of deep learning and neural networks

@@ -1311,7 +1030,7 @@ $$

In order to understand the back propagation algorithm and its derivation (an implementation of the chain rule), let us first digress with some simple examples. These examples are also meant to motivate -the link with back propagation and automatic differentiation. +the link with back propagation and automatic differentiation. We will discuss these topics next week (week 42).

@@ -1345,7 +1064,9 @@ $$

Automatic differentiation through examples

-

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767.

+

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767. +See also the video at https://www.youtube.com/watch?v=wG_nF1awSSY. +

Automatic differentiation is a represented by a repeated application of the chain rule on well-known functions and allows for the @@ -2385,484 +2106,6 @@ b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta $$ - -

Activation functions

- -

A property that characterizes a neural network, other than its -connectivity, is the choice of activation function(s). As described -in, the following restrictions are imposed on an activation function -for a FFNN to fulfill the universal approximation theorem -

- - - -

Activation functions, Logistic and Hyperbolic ones

- -

The second requirement excludes all linear functions. Furthermore, in -a MLP with only linear activation functions, each layer simply -performs a linear transformation of its inputs. -

- -

Regardless of the number of layers, the output of the NN will be -nothing but a linear function of the inputs. Thus we need to introduce -some kind of non-linearity to the NN to be able to fit non-linear -functions Typical examples are the logistic Sigmoid -

- -$$ - f(x) = \frac{1}{1 + e^{-x}}, -$$ - -

and the hyperbolic tangent function

-$$ - f(x) = \tanh(x) -$$ - - - -

Relevance

- -

The sigmoid function are more biologically plausible because the -output of inactive neurons are zero. Such activation function are -called one-sided. However, it has been shown that the hyperbolic -tangent performs better than the sigmoid for training MLPs. has -become the most popular for deep neural networks -

- - - -
-
-
-
-
-
"""The sigmoid function (or the logistic curve) is a 
-function that takes any real number, z, and outputs a number (0,1).
-It is useful in neural networks for assigning weights on a relative scale.
-The value z is the weighted sum of parameters involved in the learning algorithm."""
-
-import numpy
-import matplotlib.pyplot as plt
-import math as mt
-
-z = numpy.arange(-5, 5, .1)
-sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))
-sigma = sigma_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, sigma)
-ax.set_ylim([-0.1, 1.1])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sigmoid function')
-
-plt.show()
-
-"""Step Function"""
-z = numpy.arange(-5, 5, .02)
-step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)
-step = step_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, step)
-ax.set_ylim([-0.5, 1.5])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('step function')
-
-plt.show()
-
-"""Sine Function"""
-z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)
-t = numpy.sin(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, t)
-ax.set_ylim([-1.0, 1.0])
-ax.set_xlim([-2*mt.pi,2*mt.pi])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sine function')
-
-plt.show()
-
-"""Plots a graph of the squashing function used by a rectified linear
-unit"""
-z = numpy.arange(-2, 2, .1)
-zero = numpy.zeros(len(z))
-y = numpy.max([zero, z], axis=0)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, y)
-ax.set_ylim([-2.0, 2.0])
-ax.set_xlim([-2.0, 2.0])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('Rectified linear unit')
-
-plt.show()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - -

Fine-tuning neural network hyperparameters

- -

The flexibility of neural networks is also one of their main -drawbacks: there are many hyperparameters to tweak. Not only can you -use any imaginable network topology (how neurons/nodes are -interconnected), but even in a simple FFNN you can change the number -of layers, the number of neurons per layer, the type of activation -function to use in each layer, the weight initialization logic, the -stochastic gradient optmized and much more. How do you know what -combination of hyperparameters is the best for your task? -

- - -

However,since there are many hyperparameters to tune, and since -training a neural network on a large dataset takes a lot of time, you -will only be able to explore a tiny part of the hyperparameter space. -

- - - -

Hidden layers

- -

For many problems you can start with just one or two hidden layers and -it will work just fine. For the MNIST data set you ca easily get a -high accuracy using just one hidden layer with a few hundred neurons. -You can reach for this data set above 98% accuracy using two hidden -layers with the same total amount of neurons, in roughly the same -amount of training time. -

- -

For more complex problems, you can gradually ramp up the number of -hidden layers, until you start overfitting the training set. Very -complex tasks, such as large image classification or speech -recognition, typically require networks with dozens of layers and they -need a huge amount of training data. However, you will rarely have to -train such networks from scratch: it is much more common to reuse -parts of a pretrained state-of-the-art network that performs a similar -task. -

- - -

Vanishing gradients

- -

The Back propagation algorithm we derived above works by going from -the output layer to the input layer, propagating the error gradient on -the way. Once the algorithm has computed the gradient of the cost -function with regards to each parameter in the network, it uses these -gradients to update each parameter with a Gradient Descent (GD) step. -

- -

Unfortunately for us, the gradients often get smaller and smaller as -the algorithm progresses down to the first hidden layers. As a result, -the GD update leaves the lower layer connection weights virtually -unchanged, and training never converges to a good solution. This is -known in the literature as the vanishing gradients problem. -

- - -

Exploding gradients

- -

In other cases, the opposite can happen, namely the the gradients can -grow bigger and bigger. The result is that many of the layers get -large updates of the weights the algorithm diverges. This is the -exploding gradients problem, which is mostly encountered in -recurrent neural networks. More generally, deep neural networks suffer -from unstable gradients, different layers may learn at widely -different speeds -

- - -

Is the Logistic activation function (Sigmoid) our choice?

- -

Although this unfortunate behavior has been empirically observed for -quite a while (it was one of the reasons why deep neural networks were -mostly abandoned for a long time), it is only around 2010 that -significant progress was made in understanding it. -

- -

A paper titled Understanding the Difficulty of Training Deep -Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio found that -the problems with the popular logistic -sigmoid activation function and the weight initialization technique -that was most popular at the time, namely random initialization using -a normal distribution with a mean of 0 and a standard deviation of -1. -

- - -

Logistic function as the root of problems

- -

They showed that with this activation function and this -initialization scheme, the variance of the outputs of each layer is -much greater than the variance of its inputs. Going forward in the -network, the variance keeps increasing after each layer until the -activation function saturates at the top layers. This is actually made -worse by the fact that the logistic function has a mean of 0.5, not 0 -(the hyperbolic tangent function has a mean of 0 and behaves slightly -better than the logistic function in deep networks). -

- - -

The derivative of the Logistic funtion

- -

Looking at the logistic activation function, when inputs become large -(negative or positive), the function saturates at 0 or 1, with a -derivative extremely close to 0. Thus when backpropagation kicks in, -it has virtually no gradient to propagate back through the network, -and what little gradient exists keeps getting diluted as -backpropagation progresses down through the top layers, so there is -really nothing left for the lower layers. -

- -

In their paper, Glorot and Bengio propose a way to significantly -alleviate this problem. We need the signal to flow properly in both -directions: in the forward direction when making predictions, and in -the reverse direction when backpropagating gradients. We don’t want -the signal to die out, nor do we want it to explode and saturate. For -the signal to flow properly, the authors argue that we need the -variance of the outputs of each layer to be equal to the variance of -its inputs, and we also need the gradients to have equal variance -before and after flowing through a layer in the reverse direction. -

- - -

Insights from the paper by Glorot and Bengio

- -

One of the insights in the 2010 paper by Glorot and Bengio was that -the vanishing/exploding gradients problems were in part due to a poor -choice of activation function. Until then most people had assumed that -if Nature had chosen to use roughly sigmoid activation functions in -biological neurons, they must be an excellent choice. But it turns out -that other activation functions behave much better in deep neural -networks, in particular the ReLU activation function, mostly because -it does not saturate for positive values (and also because it is quite -fast to compute). -

- - -

The RELU function family

- -

The ReLU activation function suffers from a problem known as the dying -ReLUs: during training, some neurons effectively die, meaning they -stop outputting anything other than 0. -

- -

In some cases, you may find that half of your network’s neurons are -dead, especially if you used a large learning rate. During training, -if a neuron’s weights get updated such that the weighted sum of the -neuron’s inputs is negative, it will start outputting 0. When this -happen, the neuron is unlikely to come back to life since the gradient -of the ReLU function is 0 when its input is negative. -

- - -

ELU function

- -

To solve this problem, nowadays practitioners use a variant of the -ReLU function, such as the leaky ReLU discussed above or the so-called -exponential linear unit (ELU) function -

- -$$ -ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. -$$ - - - -

Which activation function should we use?

- -

In general it seems that the ELU activation function is better than -the leaky ReLU function (and its variants), which is better than -ReLU. ReLU performs better than \( \tanh \) which in turn performs better -than the logistic function. -

- -

If runtime performance is an issue, then you may opt for the leaky -ReLU function over the ELU function If you don’t want to tweak yet -another hyperparameter, you may just use the default \( \alpha \) of -\( 0.01 \) for the leaky ReLU, and \( 1 \) for ELU. If you have spare time and -computing power, you can use cross-validation or bootstrap to evaluate -other activation functions. -

- - -

More on activation functions, output layers

- -

In most cases you can use the ReLU activation function in the hidden -layers (or one of its variants). -

- -

It is a bit faster to compute than other activation functions, and the -gradient descent optimization does in general not get stuck. -

- -For the output layer: - - - -

Batch Normalization

- -

Batch Normalization aims to address the vanishing/exploding gradients -problems, and more generally the problem that the distribution of each -layer’s inputs changes during training, as the parameters of the -previous layers change. -

- -

The technique consists of adding an operation in the model just before -the activation function of each layer, simply zero-centering and -normalizing the inputs, then scaling and shifting the result using two -new parameters per layer (one for scaling, the other for shifting). In -other words, this operation lets the model learn the optimal scale and -mean of the inputs for each layer. In order to zero-center and -normalize the inputs, the algorithm needs to estimate the inputs’ mean -and standard deviation. It does so by evaluating the mean and standard -deviation of the inputs over the current mini-batch, from this the -name batch normalization. -

- - -

Dropout

- -

It is a fairly simple algorithm: at every training step, every neuron -(including the input neurons but excluding the output neurons) has a -probability \( p \) of being temporarily dropped out, meaning it will be -entirely ignored during this training step, but it may be active -during the next step. -

- -

The hyperparameter \( p \) is called the dropout rate, and it is typically -set to 50%. After training, the neurons are not dropped anymore. It -is viewed as one of the most popular regularization techniques. -

- - -

Gradient Clipping

- -

A popular technique to lessen the exploding gradients problem is to -simply clip the gradients during backpropagation so that they never -exceed some threshold (this is mostly useful for recurrent neural -networks). -

- -

This technique is called Gradient Clipping.

- -

In general however, Batch -Normalization is preferred. -

- - -

A top-down perspective on Neural networks

- -

The first thing we would like to do is divide the data into two or -three parts. A training set, a validation or dev (development) set, -and a test set. The test set is the data on which we want to make -predictions. The dev set is a subset of the training data we use to -check how well we are doing out-of-sample, after training the model on -the training dataset. We use the validation error as a proxy for the -test error in order to make tweaks to our model. It is crucial that we -do not use any of the test data to train the algorithm. This is a -cardinal sin in ML. Then: -

- -
    -
  1. Estimate optimal error rate
  2. -
  3. Minimize underfitting (bias) on training data set.
  4. -
  5. Make sure you are not overfitting.
  6. -
- -

More top-down perspectives

- -

If the validation and test sets are drawn from the same distributions, -then a good performance on the validation set should lead to similarly -good performance on the test set. -

- -

However, sometimes -the training data and test data differ in subtle ways because, for -example, they are collected using slightly different methods, or -because it is cheaper to collect data in one way versus another. In -this case, there can be a mismatch between the training and test -data. This can lead to the neural network overfitting these small -differences between the test and training sets, and a poor performance -on the test set despite having a good performance on the validation -set. To rectify this, Andrew Ng suggests making two validation or dev -sets, one constructed from the training data and one constructed from -the test data. The difference between the performance of the algorithm -on these two validation sets quantifies the train-test mismatch. This -can serve as another important diagnostic when using DNNs for -supervised learning. -

- - -

Limitations of supervised learning with deep networks

- -

Like all statistical methods, supervised learning using neural -networks has important limitations. This is especially important when -one seeks to apply these methods, especially to physics problems. Like -all tools, DNNs are not a universal solution. Often, the same or -better performance on a task can be achieved by using a few -hand-engineered features (or even a collection of random -features). -

- - -

Limitations of NNs

- -

Here we list some of the important limitations of supervised neural network based models.

- - - -

Homogeneous data

- - - -

More limitations

- - -

Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems.

- @@ -2874,7 +2117,7 @@ features). -->
- © 1999-2024, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2025, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/week41/html/week41-reveal.html b/doc/pub/week41/html/week41-reveal.html index 6633308c2..f973c8ef4 100644 --- a/doc/pub/week41/html/week41-reveal.html +++ b/doc/pub/week41/html/week41-reveal.html @@ -177,7 +177,7 @@ MathJax.Hub.Config({
-Department of Physics, University of Oslo +Department of Physics, University of Oslo, Norway

@@ -187,26 +187,21 @@ MathJax.Hub.Config({
- © 1999-2024, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2025, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
-

Plan for week 41, October 7-11

+

Plan for week 41, October 6-10

-

Material for the lecture on Monday October 7, 2024

+

Material for the lecture on Monday October 6, 2025

  1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.
  2. -

  3. Building our own Feed-forward Neural Network
  4. - -

    +

  5. Building our own Feed-forward Neural Network, getting started + +

@@ -214,10 +209,10 @@ MathJax.Hub.Config({

  1. These lecture notes
  2. -

  3. Rashcka et al chapter 11
  4. -

  5. For neural networks we recommend Goodfellow et al chapter 6. +

  6. For neural networks we recommend Goodfellow et al chapters 6 and 7.
  7. +

  8. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
      -

    1. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
    2. +

    3. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs

  9. Building Neural Networks from scratch at https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex
  10. @@ -230,17 +225,39 @@ MathJax.Hub.Config({
-

Material for the active learning sessions on Tuesday and Wednesday

-
    -

  • Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation
  • -

  • One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code
  • -

  • Discussion of project 2
  • -

  • Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent
  • -
+

Mathematics of deep learning

+ +
-

Lecture Monday October 7

+

Reminder on books with hands-on material and codes

+ +
+ +
+

Lab sessions on Tuesday and Wednesday

+ +
    +

  1. Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network.
  2. +
+
+ +
+

Lecture Monday October 6

@@ -461,215 +478,6 @@ as to not restrict the range of output values.
-
-

Examples of XOR, OR and AND gates

- -

Let us first try to fit various gates using standard linear -regression. The gates we are thinking of are the classical XOR, OR and -AND gates, well-known elements in computer science. The tables here -show how we can set up the inputs \( x_1 \) and \( x_2 \) in order to yield a -specific target \( y_i \). -

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR, OR and AND gates with linear regression
-"""
-
-import numpy as np
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

What is happening here?

-
- -
-

Does Logistic Regression do a better Job?

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR and OR gates with linear regression
-and logistic regression
-"""
-
-import matplotlib.pyplot as plt
-from sklearn.linear_model import LogisticRegression
-import numpy as np
-
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-# Now we change to logistic regression
-
-
-# Logistic Regression
-logreg = LogisticRegression()
-logreg.fit(X, yOR)
-print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR)))
-
-logreg.fit(X, yXOR)
-print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR)))
-
-
-logreg.fit(X, yAND)
-print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND)))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

Not exactly impressive, but somewhat better.

-
- -
-

Adding Neural Networks

- - - -
-
-
-
-
-
# and now neural networks with Scikit-Learn and the XOR
-
-from sklearn.neural_network import MLPClassifier
-from sklearn.datasets import make_classification
-X, yXOR = make_classification(n_samples=100, random_state=1)
-FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)
-FFNN.predict_proba(X)
-print(f"Test set accuracy with Feed Forward Neural Network  for XOR gate:{FFNN.score(X, yXOR)}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-

Mathematics of deep learning

- - -
- -
-

Reminder on books with hands-on material and codes

- -
- -
-

Reading recommendations

- -
    -

  1. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
  2. -

  3. Goodfellow et al, chapter 6 and 7 contain most of the neural network background.
  4. -
-
-

Mathematics of deep learning and neural networks

@@ -1030,7 +838,7 @@ $$

In order to understand the back propagation algorithm and its derivation (an implementation of the chain rule), let us first digress with some simple examples. These examples are also meant to motivate -the link with back propagation and automatic differentiation. +the link with back propagation and automatic differentiation. We will discuss these topics next week (week 42).

@@ -1073,7 +881,9 @@ $$

Automatic differentiation through examples

-

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767.

+

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767. +See also the video at https://www.youtube.com/watch?v=wG_nF1awSSY. +

Automatic differentiation is a represented by a repeated application of the chain rule on well-known functions and allows for the @@ -2329,523 +2139,6 @@ $$

 

-
-

Activation functions

- -

A property that characterizes a neural network, other than its -connectivity, is the choice of activation function(s). As described -in, the following restrictions are imposed on an activation function -for a FFNN to fulfill the universal approximation theorem -

- - -
- -
-

Activation functions, Logistic and Hyperbolic ones

- -

The second requirement excludes all linear functions. Furthermore, in -a MLP with only linear activation functions, each layer simply -performs a linear transformation of its inputs. -

- -

Regardless of the number of layers, the output of the NN will be -nothing but a linear function of the inputs. Thus we need to introduce -some kind of non-linearity to the NN to be able to fit non-linear -functions Typical examples are the logistic Sigmoid -

- -

 
-$$ - f(x) = \frac{1}{1 + e^{-x}}, -$$ -

 
- -

and the hyperbolic tangent function

-

 
-$$ - f(x) = \tanh(x) -$$ -

 
-

- -
-

Relevance

- -

The sigmoid function are more biologically plausible because the -output of inactive neurons are zero. Such activation function are -called one-sided. However, it has been shown that the hyperbolic -tangent performs better than the sigmoid for training MLPs. has -become the most popular for deep neural networks -

- - - -
-
-
-
-
-
"""The sigmoid function (or the logistic curve) is a 
-function that takes any real number, z, and outputs a number (0,1).
-It is useful in neural networks for assigning weights on a relative scale.
-The value z is the weighted sum of parameters involved in the learning algorithm."""
-
-import numpy
-import matplotlib.pyplot as plt
-import math as mt
-
-z = numpy.arange(-5, 5, .1)
-sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))
-sigma = sigma_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, sigma)
-ax.set_ylim([-0.1, 1.1])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sigmoid function')
-
-plt.show()
-
-"""Step Function"""
-z = numpy.arange(-5, 5, .02)
-step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)
-step = step_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, step)
-ax.set_ylim([-0.5, 1.5])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('step function')
-
-plt.show()
-
-"""Sine Function"""
-z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)
-t = numpy.sin(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, t)
-ax.set_ylim([-1.0, 1.0])
-ax.set_xlim([-2*mt.pi,2*mt.pi])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sine function')
-
-plt.show()
-
-"""Plots a graph of the squashing function used by a rectified linear
-unit"""
-z = numpy.arange(-2, 2, .1)
-zero = numpy.zeros(len(z))
-y = numpy.max([zero, z], axis=0)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, y)
-ax.set_ylim([-2.0, 2.0])
-ax.set_xlim([-2.0, 2.0])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('Rectified linear unit')
-
-plt.show()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-

Fine-tuning neural network hyperparameters

- -

The flexibility of neural networks is also one of their main -drawbacks: there are many hyperparameters to tweak. Not only can you -use any imaginable network topology (how neurons/nodes are -interconnected), but even in a simple FFNN you can change the number -of layers, the number of neurons per layer, the type of activation -function to use in each layer, the weight initialization logic, the -stochastic gradient optmized and much more. How do you know what -combination of hyperparameters is the best for your task? -

- - -

-

However,since there are many hyperparameters to tune, and since -training a neural network on a large dataset takes a lot of time, you -will only be able to explore a tiny part of the hyperparameter space. -

- - -
- -
-

Hidden layers

- -

For many problems you can start with just one or two hidden layers and -it will work just fine. For the MNIST data set you ca easily get a -high accuracy using just one hidden layer with a few hundred neurons. -You can reach for this data set above 98% accuracy using two hidden -layers with the same total amount of neurons, in roughly the same -amount of training time. -

- -

For more complex problems, you can gradually ramp up the number of -hidden layers, until you start overfitting the training set. Very -complex tasks, such as large image classification or speech -recognition, typically require networks with dozens of layers and they -need a huge amount of training data. However, you will rarely have to -train such networks from scratch: it is much more common to reuse -parts of a pretrained state-of-the-art network that performs a similar -task. -

-
- -
-

Vanishing gradients

- -

The Back propagation algorithm we derived above works by going from -the output layer to the input layer, propagating the error gradient on -the way. Once the algorithm has computed the gradient of the cost -function with regards to each parameter in the network, it uses these -gradients to update each parameter with a Gradient Descent (GD) step. -

- -

Unfortunately for us, the gradients often get smaller and smaller as -the algorithm progresses down to the first hidden layers. As a result, -the GD update leaves the lower layer connection weights virtually -unchanged, and training never converges to a good solution. This is -known in the literature as the vanishing gradients problem. -

-
- -
-

Exploding gradients

- -

In other cases, the opposite can happen, namely the the gradients can -grow bigger and bigger. The result is that many of the layers get -large updates of the weights the algorithm diverges. This is the -exploding gradients problem, which is mostly encountered in -recurrent neural networks. More generally, deep neural networks suffer -from unstable gradients, different layers may learn at widely -different speeds -

-
- -
-

Is the Logistic activation function (Sigmoid) our choice?

- -

Although this unfortunate behavior has been empirically observed for -quite a while (it was one of the reasons why deep neural networks were -mostly abandoned for a long time), it is only around 2010 that -significant progress was made in understanding it. -

- -

A paper titled Understanding the Difficulty of Training Deep -Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio found that -the problems with the popular logistic -sigmoid activation function and the weight initialization technique -that was most popular at the time, namely random initialization using -a normal distribution with a mean of 0 and a standard deviation of -1. -

-
- -
-

Logistic function as the root of problems

- -

They showed that with this activation function and this -initialization scheme, the variance of the outputs of each layer is -much greater than the variance of its inputs. Going forward in the -network, the variance keeps increasing after each layer until the -activation function saturates at the top layers. This is actually made -worse by the fact that the logistic function has a mean of 0.5, not 0 -(the hyperbolic tangent function has a mean of 0 and behaves slightly -better than the logistic function in deep networks). -

-
- -
-

The derivative of the Logistic funtion

- -

Looking at the logistic activation function, when inputs become large -(negative or positive), the function saturates at 0 or 1, with a -derivative extremely close to 0. Thus when backpropagation kicks in, -it has virtually no gradient to propagate back through the network, -and what little gradient exists keeps getting diluted as -backpropagation progresses down through the top layers, so there is -really nothing left for the lower layers. -

- -

In their paper, Glorot and Bengio propose a way to significantly -alleviate this problem. We need the signal to flow properly in both -directions: in the forward direction when making predictions, and in -the reverse direction when backpropagating gradients. We don’t want -the signal to die out, nor do we want it to explode and saturate. For -the signal to flow properly, the authors argue that we need the -variance of the outputs of each layer to be equal to the variance of -its inputs, and we also need the gradients to have equal variance -before and after flowing through a layer in the reverse direction. -

-
- -
-

Insights from the paper by Glorot and Bengio

- -

One of the insights in the 2010 paper by Glorot and Bengio was that -the vanishing/exploding gradients problems were in part due to a poor -choice of activation function. Until then most people had assumed that -if Nature had chosen to use roughly sigmoid activation functions in -biological neurons, they must be an excellent choice. But it turns out -that other activation functions behave much better in deep neural -networks, in particular the ReLU activation function, mostly because -it does not saturate for positive values (and also because it is quite -fast to compute). -

-
- -
-

The RELU function family

- -

The ReLU activation function suffers from a problem known as the dying -ReLUs: during training, some neurons effectively die, meaning they -stop outputting anything other than 0. -

- -

In some cases, you may find that half of your network’s neurons are -dead, especially if you used a large learning rate. During training, -if a neuron’s weights get updated such that the weighted sum of the -neuron’s inputs is negative, it will start outputting 0. When this -happen, the neuron is unlikely to come back to life since the gradient -of the ReLU function is 0 when its input is negative. -

-
- -
-

ELU function

- -

To solve this problem, nowadays practitioners use a variant of the -ReLU function, such as the leaky ReLU discussed above or the so-called -exponential linear unit (ELU) function -

- -

 
-$$ -ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. -$$ -

 
-

- -
-

Which activation function should we use?

- -

In general it seems that the ELU activation function is better than -the leaky ReLU function (and its variants), which is better than -ReLU. ReLU performs better than \( \tanh \) which in turn performs better -than the logistic function. -

- -

If runtime performance is an issue, then you may opt for the leaky -ReLU function over the ELU function If you don’t want to tweak yet -another hyperparameter, you may just use the default \( \alpha \) of -\( 0.01 \) for the leaky ReLU, and \( 1 \) for ELU. If you have spare time and -computing power, you can use cross-validation or bootstrap to evaluate -other activation functions. -

-
- -
-

More on activation functions, output layers

- -

In most cases you can use the ReLU activation function in the hidden -layers (or one of its variants). -

- -

It is a bit faster to compute than other activation functions, and the -gradient descent optimization does in general not get stuck. -

- -For the output layer: - - -
- -
-

Batch Normalization

- -

Batch Normalization aims to address the vanishing/exploding gradients -problems, and more generally the problem that the distribution of each -layer’s inputs changes during training, as the parameters of the -previous layers change. -

- -

The technique consists of adding an operation in the model just before -the activation function of each layer, simply zero-centering and -normalizing the inputs, then scaling and shifting the result using two -new parameters per layer (one for scaling, the other for shifting). In -other words, this operation lets the model learn the optimal scale and -mean of the inputs for each layer. In order to zero-center and -normalize the inputs, the algorithm needs to estimate the inputs’ mean -and standard deviation. It does so by evaluating the mean and standard -deviation of the inputs over the current mini-batch, from this the -name batch normalization. -

-
- -
-

Dropout

- -

It is a fairly simple algorithm: at every training step, every neuron -(including the input neurons but excluding the output neurons) has a -probability \( p \) of being temporarily dropped out, meaning it will be -entirely ignored during this training step, but it may be active -during the next step. -

- -

The hyperparameter \( p \) is called the dropout rate, and it is typically -set to 50%. After training, the neurons are not dropped anymore. It -is viewed as one of the most popular regularization techniques. -

-
- -
-

Gradient Clipping

- -

A popular technique to lessen the exploding gradients problem is to -simply clip the gradients during backpropagation so that they never -exceed some threshold (this is mostly useful for recurrent neural -networks). -

- -

This technique is called Gradient Clipping.

- -

In general however, Batch -Normalization is preferred. -

-
- -
-

A top-down perspective on Neural networks

- -

The first thing we would like to do is divide the data into two or -three parts. A training set, a validation or dev (development) set, -and a test set. The test set is the data on which we want to make -predictions. The dev set is a subset of the training data we use to -check how well we are doing out-of-sample, after training the model on -the training dataset. We use the validation error as a proxy for the -test error in order to make tweaks to our model. It is crucial that we -do not use any of the test data to train the algorithm. This is a -cardinal sin in ML. Then: -

- -
    -

  1. Estimate optimal error rate
  2. -

  3. Minimize underfitting (bias) on training data set.
  4. -

  5. Make sure you are not overfitting.
  6. -
-
- -
-

More top-down perspectives

- -

If the validation and test sets are drawn from the same distributions, -then a good performance on the validation set should lead to similarly -good performance on the test set. -

- -

However, sometimes -the training data and test data differ in subtle ways because, for -example, they are collected using slightly different methods, or -because it is cheaper to collect data in one way versus another. In -this case, there can be a mismatch between the training and test -data. This can lead to the neural network overfitting these small -differences between the test and training sets, and a poor performance -on the test set despite having a good performance on the validation -set. To rectify this, Andrew Ng suggests making two validation or dev -sets, one constructed from the training data and one constructed from -the test data. The difference between the performance of the algorithm -on these two validation sets quantifies the train-test mismatch. This -can serve as another important diagnostic when using DNNs for -supervised learning. -

-
- -
-

Limitations of supervised learning with deep networks

- -

Like all statistical methods, supervised learning using neural -networks has important limitations. This is especially important when -one seeks to apply these methods, especially to physics problems. Like -all tools, DNNs are not a universal solution. Often, the same or -better performance on a task can be achieved by using a few -hand-engineered features (or even a collection of random -features). -

-
- -
-

Limitations of NNs

- -

Here we list some of the important limitations of supervised neural network based models.

- - -
- -
-

Homogeneous data

- - -
- -
-

More limitations

- - -

-

Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems.

-
- diff --git a/doc/pub/week41/html/week41-solarized.html b/doc/pub/week41/html/week41-solarized.html index dc13a412e..7e5ee66e3 100644 --- a/doc/pub/week41/html/week41-solarized.html +++ b/doc/pub/week41/html/week41-solarized.html @@ -63,23 +63,30 @@ div.toc p,a { @@ -419,7 +351,7 @@ MathJax.Hub.Config({
-Department of Physics, University of Oslo +Department of Physics, University of Oslo, Norway

@@ -428,27 +360,25 @@ MathJax.Hub.Config({










-

Plan for week 41, October 7-11

+

Plan for week 41, October 6-10











-

Material for the lecture on Monday October 7, 2024

+

Material for the lecture on Monday October 6, 2025

  1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.
  2. -
  3. Building our own Feed-forward Neural Network
  4. - +
  5. Building our own Feed-forward Neural Network, getting started + +
Readings and Videos:

  1. These lecture notes
  2. -
  3. Rashcka et al chapter 11
  4. -
  5. For neural networks we recommend Goodfellow et al chapter 6. +
  6. For neural networks we recommend Goodfellow et al chapters 6 and 7.
  7. +
  8. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
      -
    1. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
    2. +
    3. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
  9. Building Neural Networks from scratch at https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex
  10. Video on Neural Networks at https://www.youtube.com/watch?v=CqOfi41LfDw
  11. @@ -459,15 +389,37 @@ MathJax.Hub.Config({









    -

    Material for the active learning sessions on Tuesday and Wednesday

    -
      -
    • Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation
    • -
    • One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code
    • -
    • Discussion of project 2
    • -
    • Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent
    • -
    +

    Mathematics of deep learning

    + + + +









    -

    Lecture Monday October 7

    +

    Reminder on books with hands-on material and codes

    + + + +









    +

    Lab sessions on Tuesday and Wednesday

    + +
      +
    1. Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network.
    2. +
    +









    +

    Lecture Monday October 6











    Introduction to Neural networks

    @@ -674,211 +626,6 @@ as to not restrict the range of output values.

-









-

Examples of XOR, OR and AND gates

- -

Let us first try to fit various gates using standard linear -regression. The gates we are thinking of are the classical XOR, OR and -AND gates, well-known elements in computer science. The tables here -show how we can set up the inputs \( x_1 \) and \( x_2 \) in order to yield a -specific target \( y_i \). -

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR, OR and AND gates with linear regression
-"""
-
-import numpy as np
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

What is happening here?

- -









-

Does Logistic Regression do a better Job?

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR and OR gates with linear regression
-and logistic regression
-"""
-
-import matplotlib.pyplot as plt
-from sklearn.linear_model import LogisticRegression
-import numpy as np
-
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-# Now we change to logistic regression
-
-
-# Logistic Regression
-logreg = LogisticRegression()
-logreg.fit(X, yOR)
-print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR)))
-
-logreg.fit(X, yXOR)
-print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR)))
-
-
-logreg.fit(X, yAND)
-print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND)))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

Not exactly impressive, but somewhat better.

- -









-

Adding Neural Networks

- - - -
-
-
-
-
-
# and now neural networks with Scikit-Learn and the XOR
-
-from sklearn.neural_network import MLPClassifier
-from sklearn.datasets import make_classification
-X, yXOR = make_classification(n_samples=100, random_state=1)
-FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)
-FFNN.predict_proba(X)
-print(f"Test set accuracy with Feed Forward Neural Network  for XOR gate:{FFNN.score(X, yXOR)}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - -









-

Mathematics of deep learning

- -
-Two recent books online -

-

    -
  1. The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen, published as Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022
  2. -
  3. Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger
  4. -
-
- - -









-

Reminder on books with hands-on material and codes

-
- -

-

-
- - -









-

Reading recommendations

- -
    -
  1. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
  2. -
  3. Goodfellow et al, chapter 6 and 7 contain most of the neural network background.
  4. -










Mathematics of deep learning and neural networks

@@ -1192,7 +939,7 @@ $$

In order to understand the back propagation algorithm and its derivation (an implementation of the chain rule), let us first digress with some simple examples. These examples are also meant to motivate -the link with back propagation and automatic differentiation. +the link with back propagation and automatic differentiation. We will discuss these topics next week (week 42).











@@ -1226,7 +973,9 @@ $$









Automatic differentiation through examples

-

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767.

+

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767. +See also the video at https://www.youtube.com/watch?v=wG_nF1awSSY. +

Automatic differentiation is a represented by a repeated application of the chain rule on well-known functions and allows for the @@ -2265,487 +2014,9 @@ b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta $$ -









-

Activation functions

- -

A property that characterizes a neural network, other than its -connectivity, is the choice of activation function(s). As described -in, the following restrictions are imposed on an activation function -for a FFNN to fulfill the universal approximation theorem -

- - -









-

Activation functions, Logistic and Hyperbolic ones

- -

The second requirement excludes all linear functions. Furthermore, in -a MLP with only linear activation functions, each layer simply -performs a linear transformation of its inputs. -

- -

Regardless of the number of layers, the output of the NN will be -nothing but a linear function of the inputs. Thus we need to introduce -some kind of non-linearity to the NN to be able to fit non-linear -functions Typical examples are the logistic Sigmoid -

- -$$ - f(x) = \frac{1}{1 + e^{-x}}, -$$ - -

and the hyperbolic tangent function

-$$ - f(x) = \tanh(x) -$$ - - -









-

Relevance

- -

The sigmoid function are more biologically plausible because the -output of inactive neurons are zero. Such activation function are -called one-sided. However, it has been shown that the hyperbolic -tangent performs better than the sigmoid for training MLPs. has -become the most popular for deep neural networks -

- - - -
-
-
-
-
-
"""The sigmoid function (or the logistic curve) is a 
-function that takes any real number, z, and outputs a number (0,1).
-It is useful in neural networks for assigning weights on a relative scale.
-The value z is the weighted sum of parameters involved in the learning algorithm."""
-
-import numpy
-import matplotlib.pyplot as plt
-import math as mt
-
-z = numpy.arange(-5, 5, .1)
-sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))
-sigma = sigma_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, sigma)
-ax.set_ylim([-0.1, 1.1])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sigmoid function')
-
-plt.show()
-
-"""Step Function"""
-z = numpy.arange(-5, 5, .02)
-step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)
-step = step_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, step)
-ax.set_ylim([-0.5, 1.5])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('step function')
-
-plt.show()
-
-"""Sine Function"""
-z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)
-t = numpy.sin(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, t)
-ax.set_ylim([-1.0, 1.0])
-ax.set_xlim([-2*mt.pi,2*mt.pi])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sine function')
-
-plt.show()
-
-"""Plots a graph of the squashing function used by a rectified linear
-unit"""
-z = numpy.arange(-2, 2, .1)
-zero = numpy.zeros(len(z))
-y = numpy.max([zero, z], axis=0)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, y)
-ax.set_ylim([-2.0, 2.0])
-ax.set_xlim([-2.0, 2.0])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('Rectified linear unit')
-
-plt.show()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - -









-

Fine-tuning neural network hyperparameters

- -

The flexibility of neural networks is also one of their main -drawbacks: there are many hyperparameters to tweak. Not only can you -use any imaginable network topology (how neurons/nodes are -interconnected), but even in a simple FFNN you can change the number -of layers, the number of neurons per layer, the type of activation -function to use in each layer, the weight initialization logic, the -stochastic gradient optmized and much more. How do you know what -combination of hyperparameters is the best for your task? -

- - -

However,since there are many hyperparameters to tune, and since -training a neural network on a large dataset takes a lot of time, you -will only be able to explore a tiny part of the hyperparameter space. -

- - -









-

Hidden layers

- -

For many problems you can start with just one or two hidden layers and -it will work just fine. For the MNIST data set you ca easily get a -high accuracy using just one hidden layer with a few hundred neurons. -You can reach for this data set above 98% accuracy using two hidden -layers with the same total amount of neurons, in roughly the same -amount of training time. -

- -

For more complex problems, you can gradually ramp up the number of -hidden layers, until you start overfitting the training set. Very -complex tasks, such as large image classification or speech -recognition, typically require networks with dozens of layers and they -need a huge amount of training data. However, you will rarely have to -train such networks from scratch: it is much more common to reuse -parts of a pretrained state-of-the-art network that performs a similar -task. -

- - -

Vanishing gradients

- -

The Back propagation algorithm we derived above works by going from -the output layer to the input layer, propagating the error gradient on -the way. Once the algorithm has computed the gradient of the cost -function with regards to each parameter in the network, it uses these -gradients to update each parameter with a Gradient Descent (GD) step. -

- -

Unfortunately for us, the gradients often get smaller and smaller as -the algorithm progresses down to the first hidden layers. As a result, -the GD update leaves the lower layer connection weights virtually -unchanged, and training never converges to a good solution. This is -known in the literature as the vanishing gradients problem. -

- -









-

Exploding gradients

- -

In other cases, the opposite can happen, namely the the gradients can -grow bigger and bigger. The result is that many of the layers get -large updates of the weights the algorithm diverges. This is the -exploding gradients problem, which is mostly encountered in -recurrent neural networks. More generally, deep neural networks suffer -from unstable gradients, different layers may learn at widely -different speeds -

- - -

Is the Logistic activation function (Sigmoid) our choice?

- -

Although this unfortunate behavior has been empirically observed for -quite a while (it was one of the reasons why deep neural networks were -mostly abandoned for a long time), it is only around 2010 that -significant progress was made in understanding it. -

- -

A paper titled Understanding the Difficulty of Training Deep -Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio found that -the problems with the popular logistic -sigmoid activation function and the weight initialization technique -that was most popular at the time, namely random initialization using -a normal distribution with a mean of 0 and a standard deviation of -1. -

- -









-

Logistic function as the root of problems

- -

They showed that with this activation function and this -initialization scheme, the variance of the outputs of each layer is -much greater than the variance of its inputs. Going forward in the -network, the variance keeps increasing after each layer until the -activation function saturates at the top layers. This is actually made -worse by the fact that the logistic function has a mean of 0.5, not 0 -(the hyperbolic tangent function has a mean of 0 and behaves slightly -better than the logistic function in deep networks). -

- -









-

The derivative of the Logistic funtion

- -

Looking at the logistic activation function, when inputs become large -(negative or positive), the function saturates at 0 or 1, with a -derivative extremely close to 0. Thus when backpropagation kicks in, -it has virtually no gradient to propagate back through the network, -and what little gradient exists keeps getting diluted as -backpropagation progresses down through the top layers, so there is -really nothing left for the lower layers. -

- -

In their paper, Glorot and Bengio propose a way to significantly -alleviate this problem. We need the signal to flow properly in both -directions: in the forward direction when making predictions, and in -the reverse direction when backpropagating gradients. We don’t want -the signal to die out, nor do we want it to explode and saturate. For -the signal to flow properly, the authors argue that we need the -variance of the outputs of each layer to be equal to the variance of -its inputs, and we also need the gradients to have equal variance -before and after flowing through a layer in the reverse direction. -

- -









-

Insights from the paper by Glorot and Bengio

- -

One of the insights in the 2010 paper by Glorot and Bengio was that -the vanishing/exploding gradients problems were in part due to a poor -choice of activation function. Until then most people had assumed that -if Nature had chosen to use roughly sigmoid activation functions in -biological neurons, they must be an excellent choice. But it turns out -that other activation functions behave much better in deep neural -networks, in particular the ReLU activation function, mostly because -it does not saturate for positive values (and also because it is quite -fast to compute). -

- -









-

The RELU function family

- -

The ReLU activation function suffers from a problem known as the dying -ReLUs: during training, some neurons effectively die, meaning they -stop outputting anything other than 0. -

- -

In some cases, you may find that half of your network’s neurons are -dead, especially if you used a large learning rate. During training, -if a neuron’s weights get updated such that the weighted sum of the -neuron’s inputs is negative, it will start outputting 0. When this -happen, the neuron is unlikely to come back to life since the gradient -of the ReLU function is 0 when its input is negative. -

- -









-

ELU function

- -

To solve this problem, nowadays practitioners use a variant of the -ReLU function, such as the leaky ReLU discussed above or the so-called -exponential linear unit (ELU) function -

- -$$ -ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. -$$ - - -









-

Which activation function should we use?

- -

In general it seems that the ELU activation function is better than -the leaky ReLU function (and its variants), which is better than -ReLU. ReLU performs better than \( \tanh \) which in turn performs better -than the logistic function. -

- -

If runtime performance is an issue, then you may opt for the leaky -ReLU function over the ELU function If you don’t want to tweak yet -another hyperparameter, you may just use the default \( \alpha \) of -\( 0.01 \) for the leaky ReLU, and \( 1 \) for ELU. If you have spare time and -computing power, you can use cross-validation or bootstrap to evaluate -other activation functions. -

- -









-

More on activation functions, output layers

- -

In most cases you can use the ReLU activation function in the hidden -layers (or one of its variants). -

- -

It is a bit faster to compute than other activation functions, and the -gradient descent optimization does in general not get stuck. -

- -For the output layer: - - -









-

Batch Normalization

- -

Batch Normalization aims to address the vanishing/exploding gradients -problems, and more generally the problem that the distribution of each -layer’s inputs changes during training, as the parameters of the -previous layers change. -

- -

The technique consists of adding an operation in the model just before -the activation function of each layer, simply zero-centering and -normalizing the inputs, then scaling and shifting the result using two -new parameters per layer (one for scaling, the other for shifting). In -other words, this operation lets the model learn the optimal scale and -mean of the inputs for each layer. In order to zero-center and -normalize the inputs, the algorithm needs to estimate the inputs’ mean -and standard deviation. It does so by evaluating the mean and standard -deviation of the inputs over the current mini-batch, from this the -name batch normalization. -

- -









-

Dropout

- -

It is a fairly simple algorithm: at every training step, every neuron -(including the input neurons but excluding the output neurons) has a -probability \( p \) of being temporarily dropped out, meaning it will be -entirely ignored during this training step, but it may be active -during the next step. -

- -

The hyperparameter \( p \) is called the dropout rate, and it is typically -set to 50%. After training, the neurons are not dropped anymore. It -is viewed as one of the most popular regularization techniques. -

- -









-

Gradient Clipping

- -

A popular technique to lessen the exploding gradients problem is to -simply clip the gradients during backpropagation so that they never -exceed some threshold (this is mostly useful for recurrent neural -networks). -

- -

This technique is called Gradient Clipping.

- -

In general however, Batch -Normalization is preferred. -

- - -

A top-down perspective on Neural networks

- -

The first thing we would like to do is divide the data into two or -three parts. A training set, a validation or dev (development) set, -and a test set. The test set is the data on which we want to make -predictions. The dev set is a subset of the training data we use to -check how well we are doing out-of-sample, after training the model on -the training dataset. We use the validation error as a proxy for the -test error in order to make tweaks to our model. It is crucial that we -do not use any of the test data to train the algorithm. This is a -cardinal sin in ML. Then: -

- -
    -
  1. Estimate optimal error rate
  2. -
  3. Minimize underfitting (bias) on training data set.
  4. -
  5. Make sure you are not overfitting.
  6. -
-









-

More top-down perspectives

- -

If the validation and test sets are drawn from the same distributions, -then a good performance on the validation set should lead to similarly -good performance on the test set. -

- -

However, sometimes -the training data and test data differ in subtle ways because, for -example, they are collected using slightly different methods, or -because it is cheaper to collect data in one way versus another. In -this case, there can be a mismatch between the training and test -data. This can lead to the neural network overfitting these small -differences between the test and training sets, and a poor performance -on the test set despite having a good performance on the validation -set. To rectify this, Andrew Ng suggests making two validation or dev -sets, one constructed from the training data and one constructed from -the test data. The difference between the performance of the algorithm -on these two validation sets quantifies the train-test mismatch. This -can serve as another important diagnostic when using DNNs for -supervised learning. -

- -









-

Limitations of supervised learning with deep networks

- -

Like all statistical methods, supervised learning using neural -networks has important limitations. This is especially important when -one seeks to apply these methods, especially to physics problems. Like -all tools, DNNs are not a universal solution. Often, the same or -better performance on a task can be achieved by using a few -hand-engineered features (or even a collection of random -features). -

- -









-

Limitations of NNs

- -

Here we list some of the important limitations of supervised neural network based models.

- - -









-

Homogeneous data

- - -









-

More limitations

- - -

Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems.

-
- © 1999-2024, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2025, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/week41/html/week41.html b/doc/pub/week41/html/week41.html index c320e3d98..91136689d 100644 --- a/doc/pub/week41/html/week41.html +++ b/doc/pub/week41/html/week41.html @@ -140,23 +140,30 @@ div.toc p,a { @@ -496,7 +428,7 @@ MathJax.Hub.Config({
-Department of Physics, University of Oslo +Department of Physics, University of Oslo, Norway

@@ -505,27 +437,25 @@ MathJax.Hub.Config({










-

Plan for week 41, October 7-11

+

Plan for week 41, October 6-10











-

Material for the lecture on Monday October 7, 2024

+

Material for the lecture on Monday October 6, 2025

  1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.
  2. -
  3. Building our own Feed-forward Neural Network
  4. - +
  5. Building our own Feed-forward Neural Network, getting started + +
Readings and Videos:

  1. These lecture notes
  2. -
  3. Rashcka et al chapter 11
  4. -
  5. For neural networks we recommend Goodfellow et al chapter 6. +
  6. For neural networks we recommend Goodfellow et al chapters 6 and 7.
  7. +
  8. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
      -
    1. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
    2. +
    3. Neural Networks demystified at https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs
  9. Building Neural Networks from scratch at https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex
  10. Video on Neural Networks at https://www.youtube.com/watch?v=CqOfi41LfDw
  11. @@ -536,15 +466,37 @@ MathJax.Hub.Config({









    -

    Material for the active learning sessions on Tuesday and Wednesday

    -
      -
    • Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation
    • -
    • One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code
    • -
    • Discussion of project 2
    • -
    • Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent
    • -
    +

    Mathematics of deep learning

    + + + +









    -

    Lecture Monday October 7

    +

    Reminder on books with hands-on material and codes

    + + + +









    +

    Lab sessions on Tuesday and Wednesday

    + +
      +
    1. Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network.
    2. +
    +









    +

    Lecture Monday October 6











    Introduction to Neural networks

    @@ -751,211 +703,6 @@ as to not restrict the range of output values.

-









-

Examples of XOR, OR and AND gates

- -

Let us first try to fit various gates using standard linear -regression. The gates we are thinking of are the classical XOR, OR and -AND gates, well-known elements in computer science. The tables here -show how we can set up the inputs \( x_1 \) and \( x_2 \) in order to yield a -specific target \( y_i \). -

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR, OR and AND gates with linear regression
-"""
-
-import numpy as np
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

What is happening here?

- -









-

Does Logistic Regression do a better Job?

- - - -
-
-
-
-
-
"""
-Simple code that tests XOR and OR gates with linear regression
-and logistic regression
-"""
-
-import matplotlib.pyplot as plt
-from sklearn.linear_model import LogisticRegression
-import numpy as np
-
-# Design matrix
-X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)
-print(f"The X.TX  matrix:{X.T @ X}")
-Xinv = np.linalg.pinv(X.T @ X)
-print(f"The invers of X.TX  matrix:{Xinv}")
-
-# The XOR gate 
-yXOR = np.array( [ 0, 1 ,1, 0])
-ThetaXOR  = Xinv @ X.T @ yXOR
-print(f"The values of theta for the XOR gate:{ThetaXOR}")
-print(f"The linear regression prediction  for the XOR gate:{X @ ThetaXOR}")
-
-
-# The OR gate 
-yOR = np.array( [ 0, 1 ,1, 1])
-ThetaOR  = Xinv @ X.T @ yOR
-print(f"The values of theta for the OR gate:{ThetaOR}")
-print(f"The linear regression prediction  for the OR gate:{X @ ThetaOR}")
-
-
-# The OR gate 
-yAND = np.array( [ 0, 0 ,0, 1])
-ThetaAND  = Xinv @ X.T @ yAND
-print(f"The values of theta for the AND gate:{ThetaAND}")
-print(f"The linear regression prediction  for the AND gate:{X @ ThetaAND}")
-
-# Now we change to logistic regression
-
-
-# Logistic Regression
-logreg = LogisticRegression()
-logreg.fit(X, yOR)
-print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR)))
-
-logreg.fit(X, yXOR)
-print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR)))
-
-
-logreg.fit(X, yAND)
-print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND)))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -

Not exactly impressive, but somewhat better.

- -









-

Adding Neural Networks

- - - -
-
-
-
-
-
# and now neural networks with Scikit-Learn and the XOR
-
-from sklearn.neural_network import MLPClassifier
-from sklearn.datasets import make_classification
-X, yXOR = make_classification(n_samples=100, random_state=1)
-FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)
-FFNN.predict_proba(X)
-print(f"Test set accuracy with Feed Forward Neural Network  for XOR gate:{FFNN.score(X, yXOR)}")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - -









-

Mathematics of deep learning

- -
-Two recent books online -

-

    -
  1. The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen, published as Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022
  2. -
  3. Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger
  4. -
-
- - -









-

Reminder on books with hands-on material and codes

-
- -

-

-
- - -









-

Reading recommendations

- -
    -
  1. Rashkca et al., chapter 11, jupyter-notebook sent separately, from GitHub
  2. -
  3. Goodfellow et al, chapter 6 and 7 contain most of the neural network background.
  4. -










Mathematics of deep learning and neural networks

@@ -1269,7 +1016,7 @@ $$

In order to understand the back propagation algorithm and its derivation (an implementation of the chain rule), let us first digress with some simple examples. These examples are also meant to motivate -the link with back propagation and automatic differentiation. +the link with back propagation and automatic differentiation. We will discuss these topics next week (week 42).











@@ -1303,7 +1050,9 @@ $$









Automatic differentiation through examples

-

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767.

+

A great introduction to automatic differentiation is given by Baydin et al., see https://arxiv.org/abs/1502.05767. +See also the video at https://www.youtube.com/watch?v=wG_nF1awSSY. +

Automatic differentiation is a represented by a repeated application of the chain rule on well-known functions and allows for the @@ -2342,487 +2091,9 @@ b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta $$ -









-

Activation functions

- -

A property that characterizes a neural network, other than its -connectivity, is the choice of activation function(s). As described -in, the following restrictions are imposed on an activation function -for a FFNN to fulfill the universal approximation theorem -

- - -









-

Activation functions, Logistic and Hyperbolic ones

- -

The second requirement excludes all linear functions. Furthermore, in -a MLP with only linear activation functions, each layer simply -performs a linear transformation of its inputs. -

- -

Regardless of the number of layers, the output of the NN will be -nothing but a linear function of the inputs. Thus we need to introduce -some kind of non-linearity to the NN to be able to fit non-linear -functions Typical examples are the logistic Sigmoid -

- -$$ - f(x) = \frac{1}{1 + e^{-x}}, -$$ - -

and the hyperbolic tangent function

-$$ - f(x) = \tanh(x) -$$ - - -









-

Relevance

- -

The sigmoid function are more biologically plausible because the -output of inactive neurons are zero. Such activation function are -called one-sided. However, it has been shown that the hyperbolic -tangent performs better than the sigmoid for training MLPs. has -become the most popular for deep neural networks -

- - - -
-
-
-
-
-
"""The sigmoid function (or the logistic curve) is a 
-function that takes any real number, z, and outputs a number (0,1).
-It is useful in neural networks for assigning weights on a relative scale.
-The value z is the weighted sum of parameters involved in the learning algorithm."""
-
-import numpy
-import matplotlib.pyplot as plt
-import math as mt
-
-z = numpy.arange(-5, 5, .1)
-sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))
-sigma = sigma_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, sigma)
-ax.set_ylim([-0.1, 1.1])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sigmoid function')
-
-plt.show()
-
-"""Step Function"""
-z = numpy.arange(-5, 5, .02)
-step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)
-step = step_fn(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, step)
-ax.set_ylim([-0.5, 1.5])
-ax.set_xlim([-5,5])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('step function')
-
-plt.show()
-
-"""Sine Function"""
-z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)
-t = numpy.sin(z)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, t)
-ax.set_ylim([-1.0, 1.0])
-ax.set_xlim([-2*mt.pi,2*mt.pi])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('sine function')
-
-plt.show()
-
-"""Plots a graph of the squashing function used by a rectified linear
-unit"""
-z = numpy.arange(-2, 2, .1)
-zero = numpy.zeros(len(z))
-y = numpy.max([zero, z], axis=0)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
-ax.plot(z, y)
-ax.set_ylim([-2.0, 2.0])
-ax.set_xlim([-2.0, 2.0])
-ax.grid(True)
-ax.set_xlabel('z')
-ax.set_title('Rectified linear unit')
-
-plt.show()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - -









-

Fine-tuning neural network hyperparameters

- -

The flexibility of neural networks is also one of their main -drawbacks: there are many hyperparameters to tweak. Not only can you -use any imaginable network topology (how neurons/nodes are -interconnected), but even in a simple FFNN you can change the number -of layers, the number of neurons per layer, the type of activation -function to use in each layer, the weight initialization logic, the -stochastic gradient optmized and much more. How do you know what -combination of hyperparameters is the best for your task? -

- - -

However,since there are many hyperparameters to tune, and since -training a neural network on a large dataset takes a lot of time, you -will only be able to explore a tiny part of the hyperparameter space. -

- - -









-

Hidden layers

- -

For many problems you can start with just one or two hidden layers and -it will work just fine. For the MNIST data set you ca easily get a -high accuracy using just one hidden layer with a few hundred neurons. -You can reach for this data set above 98% accuracy using two hidden -layers with the same total amount of neurons, in roughly the same -amount of training time. -

- -

For more complex problems, you can gradually ramp up the number of -hidden layers, until you start overfitting the training set. Very -complex tasks, such as large image classification or speech -recognition, typically require networks with dozens of layers and they -need a huge amount of training data. However, you will rarely have to -train such networks from scratch: it is much more common to reuse -parts of a pretrained state-of-the-art network that performs a similar -task. -

- - -

Vanishing gradients

- -

The Back propagation algorithm we derived above works by going from -the output layer to the input layer, propagating the error gradient on -the way. Once the algorithm has computed the gradient of the cost -function with regards to each parameter in the network, it uses these -gradients to update each parameter with a Gradient Descent (GD) step. -

- -

Unfortunately for us, the gradients often get smaller and smaller as -the algorithm progresses down to the first hidden layers. As a result, -the GD update leaves the lower layer connection weights virtually -unchanged, and training never converges to a good solution. This is -known in the literature as the vanishing gradients problem. -

- -









-

Exploding gradients

- -

In other cases, the opposite can happen, namely the the gradients can -grow bigger and bigger. The result is that many of the layers get -large updates of the weights the algorithm diverges. This is the -exploding gradients problem, which is mostly encountered in -recurrent neural networks. More generally, deep neural networks suffer -from unstable gradients, different layers may learn at widely -different speeds -

- - -

Is the Logistic activation function (Sigmoid) our choice?

- -

Although this unfortunate behavior has been empirically observed for -quite a while (it was one of the reasons why deep neural networks were -mostly abandoned for a long time), it is only around 2010 that -significant progress was made in understanding it. -

- -

A paper titled Understanding the Difficulty of Training Deep -Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio found that -the problems with the popular logistic -sigmoid activation function and the weight initialization technique -that was most popular at the time, namely random initialization using -a normal distribution with a mean of 0 and a standard deviation of -1. -

- -









-

Logistic function as the root of problems

- -

They showed that with this activation function and this -initialization scheme, the variance of the outputs of each layer is -much greater than the variance of its inputs. Going forward in the -network, the variance keeps increasing after each layer until the -activation function saturates at the top layers. This is actually made -worse by the fact that the logistic function has a mean of 0.5, not 0 -(the hyperbolic tangent function has a mean of 0 and behaves slightly -better than the logistic function in deep networks). -

- -









-

The derivative of the Logistic funtion

- -

Looking at the logistic activation function, when inputs become large -(negative or positive), the function saturates at 0 or 1, with a -derivative extremely close to 0. Thus when backpropagation kicks in, -it has virtually no gradient to propagate back through the network, -and what little gradient exists keeps getting diluted as -backpropagation progresses down through the top layers, so there is -really nothing left for the lower layers. -

- -

In their paper, Glorot and Bengio propose a way to significantly -alleviate this problem. We need the signal to flow properly in both -directions: in the forward direction when making predictions, and in -the reverse direction when backpropagating gradients. We don’t want -the signal to die out, nor do we want it to explode and saturate. For -the signal to flow properly, the authors argue that we need the -variance of the outputs of each layer to be equal to the variance of -its inputs, and we also need the gradients to have equal variance -before and after flowing through a layer in the reverse direction. -

- -









-

Insights from the paper by Glorot and Bengio

- -

One of the insights in the 2010 paper by Glorot and Bengio was that -the vanishing/exploding gradients problems were in part due to a poor -choice of activation function. Until then most people had assumed that -if Nature had chosen to use roughly sigmoid activation functions in -biological neurons, they must be an excellent choice. But it turns out -that other activation functions behave much better in deep neural -networks, in particular the ReLU activation function, mostly because -it does not saturate for positive values (and also because it is quite -fast to compute). -

- -









-

The RELU function family

- -

The ReLU activation function suffers from a problem known as the dying -ReLUs: during training, some neurons effectively die, meaning they -stop outputting anything other than 0. -

- -

In some cases, you may find that half of your network’s neurons are -dead, especially if you used a large learning rate. During training, -if a neuron’s weights get updated such that the weighted sum of the -neuron’s inputs is negative, it will start outputting 0. When this -happen, the neuron is unlikely to come back to life since the gradient -of the ReLU function is 0 when its input is negative. -

- -









-

ELU function

- -

To solve this problem, nowadays practitioners use a variant of the -ReLU function, such as the leaky ReLU discussed above or the so-called -exponential linear unit (ELU) function -

- -$$ -ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. -$$ - - -









-

Which activation function should we use?

- -

In general it seems that the ELU activation function is better than -the leaky ReLU function (and its variants), which is better than -ReLU. ReLU performs better than \( \tanh \) which in turn performs better -than the logistic function. -

- -

If runtime performance is an issue, then you may opt for the leaky -ReLU function over the ELU function If you don’t want to tweak yet -another hyperparameter, you may just use the default \( \alpha \) of -\( 0.01 \) for the leaky ReLU, and \( 1 \) for ELU. If you have spare time and -computing power, you can use cross-validation or bootstrap to evaluate -other activation functions. -

- -









-

More on activation functions, output layers

- -

In most cases you can use the ReLU activation function in the hidden -layers (or one of its variants). -

- -

It is a bit faster to compute than other activation functions, and the -gradient descent optimization does in general not get stuck. -

- -For the output layer: - - -









-

Batch Normalization

- -

Batch Normalization aims to address the vanishing/exploding gradients -problems, and more generally the problem that the distribution of each -layer’s inputs changes during training, as the parameters of the -previous layers change. -

- -

The technique consists of adding an operation in the model just before -the activation function of each layer, simply zero-centering and -normalizing the inputs, then scaling and shifting the result using two -new parameters per layer (one for scaling, the other for shifting). In -other words, this operation lets the model learn the optimal scale and -mean of the inputs for each layer. In order to zero-center and -normalize the inputs, the algorithm needs to estimate the inputs’ mean -and standard deviation. It does so by evaluating the mean and standard -deviation of the inputs over the current mini-batch, from this the -name batch normalization. -

- -









-

Dropout

- -

It is a fairly simple algorithm: at every training step, every neuron -(including the input neurons but excluding the output neurons) has a -probability \( p \) of being temporarily dropped out, meaning it will be -entirely ignored during this training step, but it may be active -during the next step. -

- -

The hyperparameter \( p \) is called the dropout rate, and it is typically -set to 50%. After training, the neurons are not dropped anymore. It -is viewed as one of the most popular regularization techniques. -

- -









-

Gradient Clipping

- -

A popular technique to lessen the exploding gradients problem is to -simply clip the gradients during backpropagation so that they never -exceed some threshold (this is mostly useful for recurrent neural -networks). -

- -

This technique is called Gradient Clipping.

- -

In general however, Batch -Normalization is preferred. -

- - -

A top-down perspective on Neural networks

- -

The first thing we would like to do is divide the data into two or -three parts. A training set, a validation or dev (development) set, -and a test set. The test set is the data on which we want to make -predictions. The dev set is a subset of the training data we use to -check how well we are doing out-of-sample, after training the model on -the training dataset. We use the validation error as a proxy for the -test error in order to make tweaks to our model. It is crucial that we -do not use any of the test data to train the algorithm. This is a -cardinal sin in ML. Then: -

- -
    -
  1. Estimate optimal error rate
  2. -
  3. Minimize underfitting (bias) on training data set.
  4. -
  5. Make sure you are not overfitting.
  6. -
-









-

More top-down perspectives

- -

If the validation and test sets are drawn from the same distributions, -then a good performance on the validation set should lead to similarly -good performance on the test set. -

- -

However, sometimes -the training data and test data differ in subtle ways because, for -example, they are collected using slightly different methods, or -because it is cheaper to collect data in one way versus another. In -this case, there can be a mismatch between the training and test -data. This can lead to the neural network overfitting these small -differences between the test and training sets, and a poor performance -on the test set despite having a good performance on the validation -set. To rectify this, Andrew Ng suggests making two validation or dev -sets, one constructed from the training data and one constructed from -the test data. The difference between the performance of the algorithm -on these two validation sets quantifies the train-test mismatch. This -can serve as another important diagnostic when using DNNs for -supervised learning. -

- -









-

Limitations of supervised learning with deep networks

- -

Like all statistical methods, supervised learning using neural -networks has important limitations. This is especially important when -one seeks to apply these methods, especially to physics problems. Like -all tools, DNNs are not a universal solution. Often, the same or -better performance on a task can be achieved by using a few -hand-engineered features (or even a collection of random -features). -

- -









-

Limitations of NNs

- -

Here we list some of the important limitations of supervised neural network based models.

- - -









-

Homogeneous data

- - -









-

More limitations

- - -

Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems.

-
- © 1999-2024, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license + © 1999-2025, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license
diff --git a/doc/pub/week41/ipynb/ipynb-week41-src.tar.gz b/doc/pub/week41/ipynb/ipynb-week41-src.tar.gz index 9050fa53f81b2922775bbb5865e033270ed5157d..1e2e85473765042ea98b6e0cc1ef38568562f35e 100644 GIT binary patch delta 64 zcmWN_DFJ{$002RLmOlaoh;V68)Ih8v2ntD;(@0Xl$a!OUV_-f=&g\n", @@ -12,44 +14,48 @@ }, { "cell_type": "markdown", - "id": "e3d91be4", - "metadata": {}, + "id": "77106a5c", + "metadata": { + "editable": true + }, "source": [ "# Week 41 Neural networks and constructing a neural network code\n", - "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo\n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo, Norway\n", "\n", "Date: **Week 41**" ] }, { "cell_type": "markdown", - "id": "6ba7a03a", - "metadata": {}, + "id": "24abde37", + "metadata": { + "editable": true + }, "source": [ - "## Plan for week 41, October 7-11" + "## Plan for week 41, October 6-10" ] }, { "cell_type": "markdown", - "id": "e8ee6c3d", - "metadata": {}, + "id": "f046f2f8", + "metadata": { + "editable": true + }, "source": [ - "## Material for the lecture on Monday October 7, 2024\n", + "## Material for the lecture on Monday October 6, 2025\n", "1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.\n", "\n", - "2. Building our own Feed-forward Neural Network\n", - "\n", - " * Video of lecture notes at \n", - "\n", - " * Whiteboard notes at \n", + "2. Building our own Feed-forward Neural Network, getting started\n", + "\n", + "\n", "\n", "**Readings and Videos:**\n", "\n", "1. These lecture notes\n", "\n", - "2. Rashcka et al chapter 11 \n", + "2. For neural networks we recommend Goodfellow et al chapters 6 and 7.\n", "\n", - "3. For neural networks we recommend Goodfellow et al chapter 6.\n", + "3. Rashkca et al., chapter 11, jupyter-notebook sent separately, from [GitHub](https://github.com/rasbt/machine-learning-book)\n", "\n", "a. Neural Networks demystified at \n", "\n", @@ -64,31 +70,59 @@ }, { "cell_type": "markdown", - "id": "f1d45fb2", - "metadata": {}, + "id": "083a57fa", + "metadata": { + "editable": true + }, "source": [ - "## Material for the active learning sessions on Tuesday and Wednesday\n", - "* Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation\n", + "## Mathematics of deep learning\n", "\n", - "* One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code\n", + "**Two recent books online.**\n", "\n", - "* Discussion of project 2\n", + "1. [The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen](https://arxiv.org/abs/2105.04026), published as [Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022](https://doi.org/10.1017/9781009025096.002)\n", "\n", - "* Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent" + "2. [Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger](https://doi.org/10.48550/arXiv.2310.20360)" ] }, { "cell_type": "markdown", - "id": "d4e77966", - "metadata": {}, + "id": "afd44c9c", + "metadata": { + "editable": true + }, "source": [ - "## Lecture Monday October 7" + "## Reminder on books with hands-on material and codes\n", + "* [Sebastian Rashcka et al, Machine learning with Sickit-Learn and PyTorch](https://sebastianraschka.com/blog/2022/ml-pytorch-book.html)" ] }, { "cell_type": "markdown", - "id": "e53c7266", - "metadata": {}, + "id": "a635e90e", + "metadata": { + "editable": true + }, + "source": [ + "## Lab sessions on Tuesday and Wednesday\n", + "\n", + "1. Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network." + ] + }, + { + "cell_type": "markdown", + "id": "117eee5e", + "metadata": { + "editable": true + }, + "source": [ + "## Lecture Monday October 6" + ] + }, + { + "cell_type": "markdown", + "id": "b17ac07a", + "metadata": { + "editable": true + }, "source": [ "## Introduction to Neural networks\n", "\n", @@ -103,8 +137,10 @@ }, { "cell_type": "markdown", - "id": "bc8b8894", - "metadata": {}, + "id": "9fabd88e", + "metadata": { + "editable": true + }, "source": [ "## Artificial neurons\n", "\n", @@ -125,8 +161,10 @@ }, { "cell_type": "markdown", - "id": "7822604f", - "metadata": {}, + "id": "4e03559d", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -141,8 +179,10 @@ }, { "cell_type": "markdown", - "id": "e1b48997", - "metadata": {}, + "id": "797b27ee", + "metadata": { + "editable": true + }, "source": [ "Here, the output $y$ of the neuron is the value of its activation function, which have as input\n", "a weighted sum of signals $x_i, \\dots ,x_n$ received by $n$ other neurons.\n", @@ -179,8 +219,10 @@ }, { "cell_type": "markdown", - "id": "17881d26", - "metadata": {}, + "id": "3ac6b2d0", + "metadata": { + "editable": true + }, "source": [ "## Neural network types\n", "\n", @@ -206,8 +248,10 @@ }, { "cell_type": "markdown", - "id": "64134ea5", - "metadata": {}, + "id": "58d8729d", + "metadata": { + "editable": true + }, "source": [ "## Feed-forward neural networks\n", "\n", @@ -225,8 +269,10 @@ }, { "cell_type": "markdown", - "id": "d1b8101c", - "metadata": {}, + "id": "7a91bacc", + "metadata": { + "editable": true + }, "source": [ "## Convolutional Neural Network\n", "\n", @@ -252,8 +298,10 @@ }, { "cell_type": "markdown", - "id": "ee76d630", - "metadata": {}, + "id": "811d80fc", + "metadata": { + "editable": true + }, "source": [ "## Recurrent neural networks\n", "\n", @@ -271,8 +319,10 @@ }, { "cell_type": "markdown", - "id": "77292572", - "metadata": {}, + "id": "755de74a", + "metadata": { + "editable": true + }, "source": [ "## Other types of networks\n", "\n", @@ -290,8 +340,10 @@ }, { "cell_type": "markdown", - "id": "31229c23", - "metadata": {}, + "id": "3e5ada1e", + "metadata": { + "editable": true + }, "source": [ "## Multilayer perceptrons\n", "\n", @@ -305,8 +357,10 @@ }, { "cell_type": "markdown", - "id": "8ef64a1c", - "metadata": {}, + "id": "39a52a85", + "metadata": { + "editable": true + }, "source": [ "## Why multilayer perceptrons?\n", "\n", @@ -324,8 +378,10 @@ }, { "cell_type": "markdown", - "id": "8a05aae8", - "metadata": {}, + "id": "b6dfa1a1", + "metadata": { + "editable": true + }, "source": [ "## Illustration of a single perceptron model and a multi-perceptron model\n", "\n", @@ -338,206 +394,10 @@ }, { "cell_type": "markdown", - "id": "53553bc4", - "metadata": {}, - "source": [ - "## Examples of XOR, OR and AND gates\n", - "\n", - "Let us first try to fit various gates using standard linear\n", - "regression. The gates we are thinking of are the classical XOR, OR and\n", - "AND gates, well-known elements in computer science. The tables here\n", - "show how we can set up the inputs $x_1$ and $x_2$ in order to yield a\n", - "specific target $y_i$." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "bd160078", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"\n", - "Simple code that tests XOR, OR and AND gates with linear regression\n", - "\"\"\"\n", - "\n", - "import numpy as np\n", - "# Design matrix\n", - "X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)\n", - "print(f\"The X.TX matrix:{X.T @ X}\")\n", - "Xinv = np.linalg.pinv(X.T @ X)\n", - "print(f\"The invers of X.TX matrix:{Xinv}\")\n", - "\n", - "# The XOR gate \n", - "yXOR = np.array( [ 0, 1 ,1, 0])\n", - "ThetaXOR = Xinv @ X.T @ yXOR\n", - "print(f\"The values of theta for the XOR gate:{ThetaXOR}\")\n", - "print(f\"The linear regression prediction for the XOR gate:{X @ ThetaXOR}\")\n", - "\n", - "\n", - "# The OR gate \n", - "yOR = np.array( [ 0, 1 ,1, 1])\n", - "ThetaOR = Xinv @ X.T @ yOR\n", - "print(f\"The values of theta for the OR gate:{ThetaOR}\")\n", - "print(f\"The linear regression prediction for the OR gate:{X @ ThetaOR}\")\n", - "\n", - "\n", - "# The OR gate \n", - "yAND = np.array( [ 0, 0 ,0, 1])\n", - "ThetaAND = Xinv @ X.T @ yAND\n", - "print(f\"The values of theta for the AND gate:{ThetaAND}\")\n", - "print(f\"The linear regression prediction for the AND gate:{X @ ThetaAND}\")" - ] - }, - { - "cell_type": "markdown", - "id": "8dc03535", - "metadata": {}, - "source": [ - "What is happening here?" - ] - }, - { - "cell_type": "markdown", - "id": "0f612b2a", - "metadata": {}, - "source": [ - "## Does Logistic Regression do a better Job?" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "b2c26240", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "\"\"\"\n", - "Simple code that tests XOR and OR gates with linear regression\n", - "and logistic regression\n", - "\"\"\"\n", - "\n", - "import matplotlib.pyplot as plt\n", - "from sklearn.linear_model import LogisticRegression\n", - "import numpy as np\n", - "\n", - "# Design matrix\n", - "X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64)\n", - "print(f\"The X.TX matrix:{X.T @ X}\")\n", - "Xinv = np.linalg.pinv(X.T @ X)\n", - "print(f\"The invers of X.TX matrix:{Xinv}\")\n", - "\n", - "# The XOR gate \n", - "yXOR = np.array( [ 0, 1 ,1, 0])\n", - "ThetaXOR = Xinv @ X.T @ yXOR\n", - "print(f\"The values of theta for the XOR gate:{ThetaXOR}\")\n", - "print(f\"The linear regression prediction for the XOR gate:{X @ ThetaXOR}\")\n", - "\n", - "\n", - "# The OR gate \n", - "yOR = np.array( [ 0, 1 ,1, 1])\n", - "ThetaOR = Xinv @ X.T @ yOR\n", - "print(f\"The values of theta for the OR gate:{ThetaOR}\")\n", - "print(f\"The linear regression prediction for the OR gate:{X @ ThetaOR}\")\n", - "\n", - "\n", - "# The OR gate \n", - "yAND = np.array( [ 0, 0 ,0, 1])\n", - "ThetaAND = Xinv @ X.T @ yAND\n", - "print(f\"The values of theta for the AND gate:{ThetaAND}\")\n", - "print(f\"The linear regression prediction for the AND gate:{X @ ThetaAND}\")\n", - "\n", - "# Now we change to logistic regression\n", - "\n", - "\n", - "# Logistic Regression\n", - "logreg = LogisticRegression()\n", - "logreg.fit(X, yOR)\n", - "print(\"Test set accuracy with Logistic Regression for OR gate: {:.2f}\".format(logreg.score(X,yOR)))\n", - "\n", - "logreg.fit(X, yXOR)\n", - "print(\"Test set accuracy with Logistic Regression for XOR gate: {:.2f}\".format(logreg.score(X,yXOR)))\n", - "\n", - "\n", - "logreg.fit(X, yAND)\n", - "print(\"Test set accuracy with Logistic Regression for AND gate: {:.2f}\".format(logreg.score(X,yAND)))" - ] - }, - { - "cell_type": "markdown", - "id": "f5dc459e", - "metadata": {}, - "source": [ - "Not exactly impressive, but somewhat better." - ] - }, - { - "cell_type": "markdown", - "id": "b2ad997b", - "metadata": {}, - "source": [ - "## Adding Neural Networks" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "df5c9c62", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# and now neural networks with Scikit-Learn and the XOR\n", - "\n", - "from sklearn.neural_network import MLPClassifier\n", - "from sklearn.datasets import make_classification\n", - "X, yXOR = make_classification(n_samples=100, random_state=1)\n", - "FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR)\n", - "FFNN.predict_proba(X)\n", - "print(f\"Test set accuracy with Feed Forward Neural Network for XOR gate:{FFNN.score(X, yXOR)}\")" - ] - }, - { - "cell_type": "markdown", - "id": "40a0930e", - "metadata": {}, - "source": [ - "## Mathematics of deep learning\n", - "\n", - "**Two recent books online.**\n", - "\n", - "1. [The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen](https://arxiv.org/abs/2105.04026), published as [Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022](https://doi.org/10.1017/9781009025096.002)\n", - "\n", - "2. [Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger](https://doi.org/10.48550/arXiv.2310.20360)" - ] - }, - { - "cell_type": "markdown", - "id": "decd7409", - "metadata": {}, - "source": [ - "## Reminder on books with hands-on material and codes\n", - "* [Sebastian Rashcka et al, Machine learning with Sickit-Learn and PyTorch](https://sebastianraschka.com/blog/2022/ml-pytorch-book.html)" - ] - }, - { - "cell_type": "markdown", - "id": "e2a4d61c", - "metadata": {}, - "source": [ - "## Reading recommendations\n", - "\n", - "1. Rashkca et al., chapter 11, jupyter-notebook sent separately, from [GitHub](https://github.com/rasbt/machine-learning-book)\n", - "\n", - "2. Goodfellow et al, chapter 6 and 7 contain most of the neural network background." - ] - }, - { - "cell_type": "markdown", - "id": "16723d55", - "metadata": {}, + "id": "7fe70d00", + "metadata": { + "editable": true + }, "source": [ "## Mathematics of deep learning and neural networks\n", "\n", @@ -553,8 +413,10 @@ }, { "cell_type": "markdown", - "id": "902a802b", - "metadata": {}, + "id": "a6350e9a", + "metadata": { + "editable": true + }, "source": [ "## Basics of an NN\n", "\n", @@ -575,8 +437,10 @@ }, { "cell_type": "markdown", - "id": "fbd06338", - "metadata": {}, + "id": "747e12b0", + "metadata": { + "editable": true + }, "source": [ "## Overarching view of a neural network\n", "\n", @@ -600,8 +464,10 @@ }, { "cell_type": "markdown", - "id": "0e9e449b", - "metadata": {}, + "id": "854e3306", + "metadata": { + "editable": true + }, "source": [ "## The optimization problem\n", "\n", @@ -615,8 +481,10 @@ }, { "cell_type": "markdown", - "id": "b06ad67d", - "metadata": {}, + "id": "be6f6f3a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(\\boldsymbol{\\Theta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\theta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\theta}\\right)\\right\\}.\n", @@ -625,8 +493,10 @@ }, { "cell_type": "markdown", - "id": "aa068f3c", - "metadata": {}, + "id": "6b12c77c", + "metadata": { + "editable": true + }, "source": [ "This function represents one of many possible ways to define\n", "the so-called cost function. Note that here we have assumed a linear dependence in terms of the paramters $\\boldsymbol{\\Theta}$. This is in general not the case." @@ -634,8 +504,10 @@ }, { "cell_type": "markdown", - "id": "2977103a", - "metadata": {}, + "id": "5b36bfaf", + "metadata": { + "editable": true + }, "source": [ "## Parameters of neural networks\n", "For neural networks the parameters\n", @@ -650,8 +522,10 @@ }, { "cell_type": "markdown", - "id": "3cd55846", - "metadata": {}, + "id": "4f6a7c65", + "metadata": { + "editable": true + }, "source": [ "## Other ingredients of a neural network\n", "\n", @@ -677,8 +551,10 @@ }, { "cell_type": "markdown", - "id": "66def2af", - "metadata": {}, + "id": "fa362d11", + "metadata": { + "editable": true + }, "source": [ "## Other parameters\n", "\n", @@ -689,8 +565,10 @@ }, { "cell_type": "markdown", - "id": "1dfc75e0", - "metadata": {}, + "id": "be99467f", + "metadata": { + "editable": true + }, "source": [ "## Universal approximation theorem\n", "\n", @@ -703,8 +581,10 @@ }, { "cell_type": "markdown", - "id": "db4ec583", - "metadata": {}, + "id": "a7786a41", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\sigma(z) = \\left\\{\\begin{array}{cc} 1 & z\\rightarrow \\infty\\\\ 0 & z \\rightarrow -\\infty \\end{array}\\right.\n", @@ -713,8 +593,10 @@ }, { "cell_type": "markdown", - "id": "e6b6f0e5", - "metadata": {}, + "id": "0ee49876", + "metadata": { + "editable": true + }, "source": [ "Given a continuous and deterministic function $F(\\boldsymbol{x})$ on the unit\n", "cube in $d$-dimensions $F\\in [0,1]^d$, $x\\in [0,1]^d$ and a parameter\n", @@ -725,8 +607,10 @@ }, { "cell_type": "markdown", - "id": "82c4e644", - "metadata": {}, + "id": "5907b6b3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\vert F(\\boldsymbol{x})-f(\\boldsymbol{x};\\boldsymbol{\\Theta})\\vert < \\epsilon \\hspace{0.1cm} \\forall \\boldsymbol{x}\\in[0,1]^d.\n", @@ -735,8 +619,10 @@ }, { "cell_type": "markdown", - "id": "4d8b622d", - "metadata": {}, + "id": "f5243715", + "metadata": { + "editable": true + }, "source": [ "## Some parallels from real analysis\n", "\n", @@ -749,8 +635,10 @@ }, { "cell_type": "markdown", - "id": "8d93823d", - "metadata": {}, + "id": "3ec7c025", + "metadata": { + "editable": true + }, "source": [ "## The approximation theorem in words\n", "\n", @@ -763,8 +651,10 @@ }, { "cell_type": "markdown", - "id": "087fd46d", - "metadata": {}, + "id": "00614dd5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}[\\vert F(\\boldsymbol{x})\\vert^2] =\\int_{\\boldsymbol{x}\\in D} \\vert F(\\boldsymbol{x})\\vert^2p(\\boldsymbol{x})d\\boldsymbol{x} < \\infty.\n", @@ -773,16 +663,20 @@ }, { "cell_type": "markdown", - "id": "7547efaa", - "metadata": {}, + "id": "3e3c5d32", + "metadata": { + "editable": true + }, "source": [ "Then we have" ] }, { "cell_type": "markdown", - "id": "65071f00", - "metadata": {}, + "id": "3d292016", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\mathbb{E}[\\vert F(\\boldsymbol{x})-f(\\boldsymbol{x};\\boldsymbol{\\Theta})\\vert^2] =\\int_{\\boldsymbol{x}\\in D} \\vert F(\\boldsymbol{x})-f(\\boldsymbol{x};\\boldsymbol{\\Theta})\\vert^2p(\\boldsymbol{x})d\\boldsymbol{x} < \\epsilon.\n", @@ -791,8 +685,10 @@ }, { "cell_type": "markdown", - "id": "7a8ecd20", - "metadata": {}, + "id": "ffccfb34", + "metadata": { + "editable": true + }, "source": [ "## More on the general approximation theorem\n", "\n", @@ -807,8 +703,10 @@ }, { "cell_type": "markdown", - "id": "41ed53e6", - "metadata": {}, + "id": "18364a7b", + "metadata": { + "editable": true + }, "source": [ "## Class of functions we can approximate\n", "\n", @@ -818,8 +716,10 @@ }, { "cell_type": "markdown", - "id": "2b83edda", - "metadata": {}, + "id": "4ff3f75c", + "metadata": { + "editable": true + }, "source": [ "## Setting up the equations for a neural network\n", "\n", @@ -833,8 +733,10 @@ }, { "cell_type": "markdown", - "id": "d27eb1c2", - "metadata": {}, + "id": "e2110836", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\cal C}(\\boldsymbol{\\Theta}) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - \\tilde{y}_i\\right)^2,\n", @@ -843,8 +745,10 @@ }, { "cell_type": "markdown", - "id": "f83f5909", - "metadata": {}, + "id": "86b8cfca", + "metadata": { + "editable": true + }, "source": [ "where the $y_i$s are our $n$ targets (the values we want to\n", "reproduce), while the outputs of the network after having propagated\n", @@ -853,8 +757,10 @@ }, { "cell_type": "markdown", - "id": "693f1f94", - "metadata": {}, + "id": "6accc6fd", + "metadata": { + "editable": true + }, "source": [ "## Layout of a neural network with three hidden layers\n", "\n", @@ -867,8 +773,10 @@ }, { "cell_type": "markdown", - "id": "c4473918", - "metadata": {}, + "id": "a7658d1e", + "metadata": { + "editable": true + }, "source": [ "## Definitions\n", "\n", @@ -882,8 +790,10 @@ }, { "cell_type": "markdown", - "id": "80c49202", - "metadata": {}, + "id": "5c32377f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z_j^l = \\sum_{i=1}^{M_{l-1}}w_{ij}^la_i^{l-1}+b_j^l,\n", @@ -892,8 +802,10 @@ }, { "cell_type": "markdown", - "id": "b95ea794", - "metadata": {}, + "id": "fe50869b", + "metadata": { + "editable": true + }, "source": [ "where $b_k^l$ are the biases from layer $l$. Here $M_{l-1}$\n", "represents the total number of nodes/neurons/units of layer $l-1$. The\n", @@ -903,8 +815,10 @@ }, { "cell_type": "markdown", - "id": "7468be96", - "metadata": {}, + "id": "ebaa515a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\hat{z}^l = \\left(\\hat{W}^l\\right)^T\\hat{a}^{l-1}+\\hat{b}^l.\n", @@ -913,8 +827,10 @@ }, { "cell_type": "markdown", - "id": "82d9ddc5", - "metadata": {}, + "id": "796833f6", + "metadata": { + "editable": true + }, "source": [ "## Inputs to the activation function\n", "\n", @@ -927,8 +843,10 @@ }, { "cell_type": "markdown", - "id": "611a8aaf", - "metadata": {}, + "id": "ee384d06", + "metadata": { + "editable": true + }, "source": [ "$$\n", "a_j^l = \\sigma(z_j^l) = \\frac{1}{1+\\exp{-(z_j^l)}}.\n", @@ -937,8 +855,10 @@ }, { "cell_type": "markdown", - "id": "adfdba0b", - "metadata": {}, + "id": "27fdce89", + "metadata": { + "editable": true + }, "source": [ "## Derivatives and the chain rule\n", "\n", @@ -947,8 +867,10 @@ }, { "cell_type": "markdown", - "id": "6b23deb7", - "metadata": {}, + "id": "20c880e6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial z_j^l}{\\partial w_{ij}^l} = a_i^{l-1},\n", @@ -957,16 +879,20 @@ }, { "cell_type": "markdown", - "id": "3dbf8b63", - "metadata": {}, + "id": "9c0f588a", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "b3228dee", - "metadata": {}, + "id": "4967d9dc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial z_j^l}{\\partial a_i^{l-1}} = w_{ji}^l.\n", @@ -975,16 +901,20 @@ }, { "cell_type": "markdown", - "id": "52be372b", - "metadata": {}, + "id": "e16de9db", + "metadata": { + "editable": true + }, "source": [ "With our definition of the activation function we have that (note that this function depends only on $z_j^l$)" ] }, { "cell_type": "markdown", - "id": "8e1cfc96", - "metadata": {}, + "id": "f8640493", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial a_j^l}{\\partial z_j^{l}} = a_j^l(1-a_j^l)=\\sigma(z_j^l)(1-\\sigma(z_j^l)).\n", @@ -993,8 +923,10 @@ }, { "cell_type": "markdown", - "id": "79b3ab6b", - "metadata": {}, + "id": "9aa93ac0", + "metadata": { + "editable": true + }, "source": [ "## Derivative of the cost function\n", "\n", @@ -1005,8 +937,10 @@ }, { "cell_type": "markdown", - "id": "4541109b", - "metadata": {}, + "id": "14cc2a9c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "{\\cal C}(\\boldsymbol{\\Theta}^L) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - \\tilde{y}_i\\right)^2=\\frac{1}{2}\\sum_{i=1}^n\\left(a_i^L - y_i\\right)^2,\n", @@ -1015,16 +949,20 @@ }, { "cell_type": "markdown", - "id": "ada15490", - "metadata": {}, + "id": "0cfa4223", + "metadata": { + "editable": true + }, "source": [ "The derivative of this function with respect to the weights is" ] }, { "cell_type": "markdown", - "id": "ef1846b1", - "metadata": {}, + "id": "9c28ca56", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial{\\cal C}(\\boldsymbol{\\Theta}^L)}{\\partial w_{jk}^L} = \\left(a_j^L - y_j\\right)\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}},\n", @@ -1033,16 +971,20 @@ }, { "cell_type": "markdown", - "id": "2bcae885", - "metadata": {}, + "id": "75fc65a8", + "metadata": { + "editable": true + }, "source": [ "The last partial derivative can easily be computed and reads (by applying the chain rule)" ] }, { "cell_type": "markdown", - "id": "14438533", - "metadata": {}, + "id": "6fa982ac", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}} = \\frac{\\partial a_j^L}{\\partial z_{j}^{L}}\\frac{\\partial z_j^L}{\\partial w_{jk}^{L}}=a_j^L(1-a_j^L)a_k^{L-1}.\n", @@ -1051,21 +993,25 @@ }, { "cell_type": "markdown", - "id": "1ea04dc6", - "metadata": {}, + "id": "c491c9c5", + "metadata": { + "editable": true + }, "source": [ "## Simpler examples first, and automatic differentiation\n", "\n", "In order to understand the back propagation algorithm and its\n", "derivation (an implementation of the chain rule), let us first digress\n", "with some simple examples. These examples are also meant to motivate\n", - "the link with back propagation and [automatic differentiation](https://en.wikipedia.org/wiki/Automatic_differentiation)." + "the link with back propagation and [automatic differentiation](https://en.wikipedia.org/wiki/Automatic_differentiation). We will discuss these topics next week (week 42)." ] }, { "cell_type": "markdown", - "id": "2c1d3d23", - "metadata": {}, + "id": "45521d36", + "metadata": { + "editable": true + }, "source": [ "## Reminder on the chain rule and gradients\n", "\n", @@ -1074,8 +1020,10 @@ }, { "cell_type": "markdown", - "id": "0a784486", - "metadata": {}, + "id": "12a8d1db", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{dt} = \\begin{bmatrix}\\frac{\\partial f}{\\partial x} & \\frac{\\partial f}{\\partial y} \\end{bmatrix} \\begin{bmatrix}\\frac{\\partial x}{\\partial t} \\\\ \\frac{\\partial y}{\\partial t} \\end{bmatrix}=\\frac{\\partial f}{\\partial x} \\frac{\\partial x}{\\partial t} +\\frac{\\partial f}{\\partial y} \\frac{\\partial y}{\\partial t}.\n", @@ -1084,8 +1032,10 @@ }, { "cell_type": "markdown", - "id": "91a6fac4", - "metadata": {}, + "id": "aee14a46", + "metadata": { + "editable": true + }, "source": [ "## Multivariable functions\n", "\n", @@ -1094,8 +1044,10 @@ }, { "cell_type": "markdown", - "id": "64245345", - "metadata": {}, + "id": "2ada2272", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial s}=\\frac{\\partial f}{\\partial x}\\frac{\\partial x}{\\partial s}+\\frac{\\partial f}{\\partial y}\\frac{\\partial y}{\\partial s},\n", @@ -1104,16 +1056,20 @@ }, { "cell_type": "markdown", - "id": "8f42f6ef", - "metadata": {}, + "id": "4e8672d5", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "23f3f62a", - "metadata": {}, + "id": "fdb8ac89", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial t}=\\frac{\\partial f}{\\partial x}\\frac{\\partial x}{\\partial t}+\\frac{\\partial f}{\\partial y}\\frac{\\partial y}{\\partial t}.\n", @@ -1122,16 +1078,20 @@ }, { "cell_type": "markdown", - "id": "31db67ce", - "metadata": {}, + "id": "984afcbb", + "metadata": { + "editable": true + }, "source": [ "the gradient of $f$ with respect to $t$ and $s$ (without the explicit unit vector components)" ] }, { "cell_type": "markdown", - "id": "54f91226", - "metadata": {}, + "id": "6351b89c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{d(s,t)} = \\begin{bmatrix}\\frac{\\partial f}{\\partial x} & \\frac{\\partial f}{\\partial y} \\end{bmatrix} \\begin{bmatrix}\\frac{\\partial x}{\\partial s} &\\frac{\\partial x}{\\partial t} \\\\ \\frac{\\partial y}{\\partial s} & \\frac{\\partial y}{\\partial t} \\end{bmatrix}.\n", @@ -1140,12 +1100,15 @@ }, { "cell_type": "markdown", - "id": "551bf4e9", - "metadata": {}, + "id": "30614241", + "metadata": { + "editable": true + }, "source": [ "## Automatic differentiation through examples\n", "\n", "A great introduction to automatic differentiation is given by Baydin et al., see .\n", + "See also the video at .\n", "\n", "Automatic differentiation is a represented by a repeated application\n", "of the chain rule on well-known functions and allows for the\n", @@ -1158,8 +1121,10 @@ }, { "cell_type": "markdown", - "id": "1d4117b4", - "metadata": {}, + "id": "2b01a0a0", + "metadata": { + "editable": true + }, "source": [ "## Simple example\n", "\n", @@ -1168,8 +1133,10 @@ }, { "cell_type": "markdown", - "id": "402669ea", - "metadata": {}, + "id": "f46c4ff5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x) =\\exp{x^2},\n", @@ -1178,16 +1145,20 @@ }, { "cell_type": "markdown", - "id": "ec119701", - "metadata": {}, + "id": "3b14ab20", + "metadata": { + "editable": true + }, "source": [ "with derivative" ] }, { "cell_type": "markdown", - "id": "bcb30e6f", - "metadata": {}, + "id": "367488fb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f'(x) =2x\\exp{x^2}.\n", @@ -1196,17 +1167,22 @@ }, { "cell_type": "markdown", - "id": "2a7acb6e", - "metadata": {}, + "id": "449e3f42", + "metadata": { + "editable": true + }, "source": [ "We can use SymPy to extract the pertinent lines of Python code through the following simple example" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "044e79d9", - "metadata": {}, + "execution_count": 1, + "id": "96bfacee", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "from __future__ import division\n", @@ -1221,8 +1197,10 @@ }, { "cell_type": "markdown", - "id": "1c3cb722", - "metadata": {}, + "id": "72314ab1", + "metadata": { + "editable": true + }, "source": [ "## Smarter way of evaluating the above function\n", "If we study this function, we note that we can reduce the number of operations by introducing an intermediate variable" @@ -1230,8 +1208,10 @@ }, { "cell_type": "markdown", - "id": "808a017a", - "metadata": {}, + "id": "73ac0b1e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "a = x^2,\n", @@ -1240,16 +1220,20 @@ }, { "cell_type": "markdown", - "id": "2330f35c", - "metadata": {}, + "id": "e4f9a39e", + "metadata": { + "editable": true + }, "source": [ "leading to" ] }, { "cell_type": "markdown", - "id": "c0b17b83", - "metadata": {}, + "id": "d7862e63", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x) = f(a(x)) = b= \\exp{a}.\n", @@ -1258,8 +1242,10 @@ }, { "cell_type": "markdown", - "id": "9129586e", - "metadata": {}, + "id": "125aa92f", + "metadata": { + "editable": true + }, "source": [ "We now assume that all operations can be counted in terms of equal\n", "floating point operations. This means that in order to calculate\n", @@ -1269,8 +1255,10 @@ }, { "cell_type": "markdown", - "id": "83209806", - "metadata": {}, + "id": "4191307d", + "metadata": { + "editable": true + }, "source": [ "## Reducing the number of operations\n", "\n", @@ -1279,8 +1267,10 @@ }, { "cell_type": "markdown", - "id": "1e04f023", - "metadata": {}, + "id": "2bde847d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f'(x) = 2xb,\n", @@ -1289,8 +1279,10 @@ }, { "cell_type": "markdown", - "id": "4015de5c", - "metadata": {}, + "id": "83266d60", + "metadata": { + "editable": true + }, "source": [ "which reduces the number of operations from four in the orginal\n", "expression to two. This means that if we need to compute $f(x)$ and\n", @@ -1304,8 +1296,10 @@ }, { "cell_type": "markdown", - "id": "cfd489e0", - "metadata": {}, + "id": "c5a7fbff", + "metadata": { + "editable": true + }, "source": [ "## Chain rule, forward and reverse modes\n", "\n", @@ -1314,8 +1308,10 @@ }, { "cell_type": "markdown", - "id": "abcfa23a", - "metadata": {}, + "id": "b2fe2411", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x) = f(a(x)) = b= \\exp{a},\n", @@ -1324,16 +1320,20 @@ }, { "cell_type": "markdown", - "id": "67bcaa0e", - "metadata": {}, + "id": "67b6afd2", + "metadata": { + "editable": true + }, "source": [ "with $a=x^2$. We can decompose the derivative of $f$ with respect to $x$ as" ] }, { "cell_type": "markdown", - "id": "d4e12796", - "metadata": {}, + "id": "c3c09fb8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{dx}=\\frac{df}{db}\\frac{db}{da}\\frac{da}{dx}.\n", @@ -1342,16 +1342,20 @@ }, { "cell_type": "markdown", - "id": "e74eed87", - "metadata": {}, + "id": "a327ede6", + "metadata": { + "editable": true + }, "source": [ "We note that since $b=f(x)$ that" ] }, { "cell_type": "markdown", - "id": "5b626985", - "metadata": {}, + "id": "0883434b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{db}=1,\n", @@ -1360,16 +1364,20 @@ }, { "cell_type": "markdown", - "id": "4b91e7a2", - "metadata": {}, + "id": "29f6a2bd", + "metadata": { + "editable": true + }, "source": [ "leading to" ] }, { "cell_type": "markdown", - "id": "6da09721", - "metadata": {}, + "id": "dee0077a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{dx}=\\frac{db}{da}\\frac{da}{dx}=2x\\exp{x^2},\n", @@ -1378,16 +1386,20 @@ }, { "cell_type": "markdown", - "id": "1ed5c66b", - "metadata": {}, + "id": "8da19ed0", + "metadata": { + "editable": true + }, "source": [ "as before." ] }, { "cell_type": "markdown", - "id": "6157ca77", - "metadata": {}, + "id": "07a932a6", + "metadata": { + "editable": true + }, "source": [ "## Forward and reverse modes\n", "\n", @@ -1396,8 +1408,10 @@ }, { "cell_type": "markdown", - "id": "d47f8037", - "metadata": {}, + "id": "fb1d92ff", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{dx}=\\frac{df}{db}\\frac{db}{da}\\frac{da}{dx},\n", @@ -1406,16 +1420,20 @@ }, { "cell_type": "markdown", - "id": "7a7bbc5d", - "metadata": {}, + "id": "c8cae913", + "metadata": { + "editable": true + }, "source": [ "which we can rewrite either as" ] }, { "cell_type": "markdown", - "id": "427cb024", - "metadata": {}, + "id": "88a96c22", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{dx}=\\left[\\frac{df}{db}\\frac{db}{da}\\right]\\frac{da}{dx},\n", @@ -1424,16 +1442,20 @@ }, { "cell_type": "markdown", - "id": "57a1aaa6", - "metadata": {}, + "id": "96c7a8cf", + "metadata": { + "editable": true + }, "source": [ "or" ] }, { "cell_type": "markdown", - "id": "a8faabb8", - "metadata": {}, + "id": "980f3549", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{df}{dx}=\\frac{df}{db}\\left[\\frac{db}{da}\\frac{da}{dx}\\right].\n", @@ -1442,8 +1464,10 @@ }, { "cell_type": "markdown", - "id": "bb053125", - "metadata": {}, + "id": "11087f75", + "metadata": { + "editable": true + }, "source": [ "The first expression is called reverse mode (or back propagation)\n", "since we start by evaluating the derivatives at the end point and then\n", @@ -1458,8 +1482,10 @@ }, { "cell_type": "markdown", - "id": "6d58682a", - "metadata": {}, + "id": "8f7ada68", + "metadata": { + "editable": true + }, "source": [ "## More complicated function\n", "\n", @@ -1468,8 +1494,10 @@ }, { "cell_type": "markdown", - "id": "e26f3e58", - "metadata": {}, + "id": "b6572672", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f(x) =\\sqrt{x^2+exp{x^2}},\n", @@ -1478,16 +1506,20 @@ }, { "cell_type": "markdown", - "id": "bd6d2ab5", - "metadata": {}, + "id": "34890dca", + "metadata": { + "editable": true + }, "source": [ "with derivative" ] }, { "cell_type": "markdown", - "id": "4df7d922", - "metadata": {}, + "id": "885dcf45", + "metadata": { + "editable": true + }, "source": [ "$$\n", "f'(x) =\\frac{x(1+\\exp{x^2})}{\\sqrt{x^2+exp{x^2}}}.\n", @@ -1496,17 +1528,22 @@ }, { "cell_type": "markdown", - "id": "451135b1", - "metadata": {}, + "id": "eb519077", + "metadata": { + "editable": true + }, "source": [ "The corresponding SymPy code reads" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "a0c4f830", - "metadata": {}, + "execution_count": 2, + "id": "041e5116", + "metadata": { + "collapsed": false, + "editable": true + }, "outputs": [], "source": [ "from __future__ import division\n", @@ -1521,8 +1558,10 @@ }, { "cell_type": "markdown", - "id": "dd8fb453", - "metadata": {}, + "id": "5ee38441", + "metadata": { + "editable": true + }, "source": [ "## Counting the number of floating point operations\n", "\n", @@ -1535,8 +1574,10 @@ }, { "cell_type": "markdown", - "id": "4a4d0c85", - "metadata": {}, + "id": "f0aa3e89", + "metadata": { + "editable": true + }, "source": [ "## Defining intermediate operations\n", "\n", @@ -1546,8 +1587,10 @@ }, { "cell_type": "markdown", - "id": "6216f527", - "metadata": {}, + "id": "7ee15116", + "metadata": { + "editable": true + }, "source": [ "$$\n", "a = x^2,\n", @@ -1556,16 +1599,20 @@ }, { "cell_type": "markdown", - "id": "36fa3364", - "metadata": {}, + "id": "816deb1e", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "d7936338", - "metadata": {}, + "id": "fc1687f8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "b = \\exp{x^2} = \\exp{a},\n", @@ -1574,16 +1621,20 @@ }, { "cell_type": "markdown", - "id": "b3c1cf2e", - "metadata": {}, + "id": "6903e979", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "3045f2f3", - "metadata": {}, + "id": "7ce8c2e9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "c= a+b,\n", @@ -1592,16 +1643,20 @@ }, { "cell_type": "markdown", - "id": "c62d9b4f", - "metadata": {}, + "id": "7c5a40b4", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "cc00424b", - "metadata": {}, + "id": "9dece790", + "metadata": { + "editable": true + }, "source": [ "$$\n", "d=f(x)=\\sqrt{c}.\n", @@ -1610,8 +1665,10 @@ }, { "cell_type": "markdown", - "id": "2880b26d", - "metadata": {}, + "id": "6c7469b5", + "metadata": { + "editable": true + }, "source": [ "## New expression for the derivative\n", "\n", @@ -1620,8 +1677,10 @@ }, { "cell_type": "markdown", - "id": "6995073b", - "metadata": {}, + "id": "660e5353", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial a}{\\partial x} = 2x,\n", @@ -1630,16 +1689,20 @@ }, { "cell_type": "markdown", - "id": "3025c95c", - "metadata": {}, + "id": "d310327e", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "eadbab8c", - "metadata": {}, + "id": "1455ef65", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial b}{\\partial a} = \\exp{a},\n", @@ -1648,16 +1711,20 @@ }, { "cell_type": "markdown", - "id": "3b92e291", - "metadata": {}, + "id": "b8baab0b", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "61abe762", - "metadata": {}, + "id": "9212114c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial c}{\\partial a} = 1,\n", @@ -1666,16 +1733,20 @@ }, { "cell_type": "markdown", - "id": "b9ed2e77", - "metadata": {}, + "id": "8afc58ba", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "3dc26776", - "metadata": {}, + "id": "b09e58b3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial c}{\\partial b} = 1,\n", @@ -1684,16 +1755,20 @@ }, { "cell_type": "markdown", - "id": "8092c5dc", - "metadata": {}, + "id": "c1985faf", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "3408773c", - "metadata": {}, + "id": "a3a8ead6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial d}{\\partial c} = \\frac{1}{2\\sqrt{c}},\n", @@ -1702,16 +1777,20 @@ }, { "cell_type": "markdown", - "id": "547d309c", - "metadata": {}, + "id": "ea8b9183", + "metadata": { + "editable": true + }, "source": [ "and finally" ] }, { "cell_type": "markdown", - "id": "3885960f", - "metadata": {}, + "id": "a1a3d3e6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial d} = 1.\n", @@ -1720,8 +1799,10 @@ }, { "cell_type": "markdown", - "id": "094da560", - "metadata": {}, + "id": "c4c7699a", + "metadata": { + "editable": true + }, "source": [ "## Final derivatives\n", "Our final derivatives are thus" @@ -1729,8 +1810,10 @@ }, { "cell_type": "markdown", - "id": "5e7784ef", - "metadata": {}, + "id": "f8796867", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial c} = \\frac{\\partial f}{\\partial d} \\frac{\\partial d}{\\partial c} = \\frac{1}{2\\sqrt{c}},\n", @@ -1739,8 +1822,10 @@ }, { "cell_type": "markdown", - "id": "da55dc29", - "metadata": {}, + "id": "7696682f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial b} = \\frac{\\partial f}{\\partial c} \\frac{\\partial c}{\\partial b} = \\frac{1}{2\\sqrt{c}},\n", @@ -1749,8 +1834,10 @@ }, { "cell_type": "markdown", - "id": "1521da52", - "metadata": {}, + "id": "c255369f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial a} = \\frac{\\partial f}{\\partial c} \\frac{\\partial c}{\\partial a}+\n", @@ -1760,16 +1847,20 @@ }, { "cell_type": "markdown", - "id": "c585cfc1", - "metadata": {}, + "id": "fb3583a2", + "metadata": { + "editable": true + }, "source": [ "and finally" ] }, { "cell_type": "markdown", - "id": "49baac68", - "metadata": {}, + "id": "6e85c1f8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial x} = \\frac{\\partial f}{\\partial a} \\frac{\\partial a}{\\partial x} = \\frac{x(1+\\exp{a})}{\\sqrt{c}},\n", @@ -1778,16 +1869,20 @@ }, { "cell_type": "markdown", - "id": "90c1b377", - "metadata": {}, + "id": "1d674382", + "metadata": { + "editable": true + }, "source": [ "which is just" ] }, { "cell_type": "markdown", - "id": "dfd1e5f5", - "metadata": {}, + "id": "64dc7923", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial x} = \\frac{x(1+b)}{d},\n", @@ -1796,16 +1891,20 @@ }, { "cell_type": "markdown", - "id": "01027588", - "metadata": {}, + "id": "143ed6f6", + "metadata": { + "editable": true + }, "source": [ "and requires only three operations if we can reuse all intermediate variables." ] }, { "cell_type": "markdown", - "id": "faf9a7f4", - "metadata": {}, + "id": "df28a5cc", + "metadata": { + "editable": true + }, "source": [ "## In general not this simple\n", "\n", @@ -1818,8 +1917,10 @@ }, { "cell_type": "markdown", - "id": "c8a60c3c", - "metadata": {}, + "id": "8fc17c97", + "metadata": { + "editable": true + }, "source": [ "## Automatic differentiation\n", "\n", @@ -1833,8 +1934,10 @@ }, { "cell_type": "markdown", - "id": "bebf89c4", - "metadata": {}, + "id": "c98c6269", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{bmatrix} x_1=x & x_2 = x^2=a & x_3 =\\exp{a}= b & x_4=c=a+b & x_5 = \\sqrt{c}=d \\end{bmatrix}.\n", @@ -1843,8 +1946,10 @@ }, { "cell_type": "markdown", - "id": "c8e55af0", - "metadata": {}, + "id": "51e1f13d", + "metadata": { + "editable": true + }, "source": [ "Furthemore, for $i=l+1, \\dots, L$ (here $i=2,3,4,5$ and $f=x_L=d$), we\n", "define the elementary functions $g_i(x_{Pa(x_i)})$ where $x_{Pa(x_i)}$ are the parent nodes of the variable $x_i$.\n", @@ -1854,8 +1959,10 @@ }, { "cell_type": "markdown", - "id": "4b69aacb", - "metadata": {}, + "id": "3051afb8", + "metadata": { + "editable": true + }, "source": [ "## Chain rule\n", "\n", @@ -1865,8 +1972,10 @@ }, { "cell_type": "markdown", - "id": "c0d54321", - "metadata": {}, + "id": "3b0d12f5", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial x_L} = 1,\n", @@ -1875,16 +1984,20 @@ }, { "cell_type": "markdown", - "id": "8486d91e", - "metadata": {}, + "id": "d6416f6d", + "metadata": { + "editable": true + }, "source": [ "which allows us to find the derivatives of the various variables $x_i$ as" ] }, { "cell_type": "markdown", - "id": "de5e8a70", - "metadata": {}, + "id": "d82132f6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial f}{\\partial x_i} = \\sum_{x_j:x_i\\in Pa(x_j)}\\frac{\\partial f}{\\partial x_j} \\frac{\\partial x_j}{\\partial x_i}=\\sum_{x_j:x_i\\in Pa(x_j)}\\frac{\\partial f}{\\partial x_j} \\frac{\\partial g_j}{\\partial x_i}.\n", @@ -1893,8 +2006,10 @@ }, { "cell_type": "markdown", - "id": "42dc3f26", - "metadata": {}, + "id": "a2cc1519", + "metadata": { + "editable": true + }, "source": [ "Whenever we have a function which can be expressed as a computation\n", "graph and the various functions can be expressed in terms of\n", @@ -1906,8 +2021,10 @@ }, { "cell_type": "markdown", - "id": "133e16c7", - "metadata": {}, + "id": "15dec134", + "metadata": { + "editable": true + }, "source": [ "## First network example, simple percepetron with one input\n", "\n", @@ -1919,8 +2036,10 @@ }, { "cell_type": "markdown", - "id": "1fd248a5", - "metadata": {}, + "id": "4e82fa87", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z_1 = w_1x+b_1,\n", @@ -1929,8 +2048,10 @@ }, { "cell_type": "markdown", - "id": "321220a1", - "metadata": {}, + "id": "ef7fc3e0", + "metadata": { + "editable": true + }, "source": [ "where $w_1$ is the weight and $b_1$ is the bias. These are the\n", "parameters we want to optimize. The output is $a_1=\\sigma(z_1)$ (see\n", @@ -1941,8 +2062,10 @@ }, { "cell_type": "markdown", - "id": "d4ef8cda", - "metadata": {}, + "id": "36cd8975", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(x;w_1,b_1)=\\frac{1}{2}(a_1-y)^2.\n", @@ -1951,8 +2074,10 @@ }, { "cell_type": "markdown", - "id": "c83257a3", - "metadata": {}, + "id": "506df9e4", + "metadata": { + "editable": true + }, "source": [ "## Layout of a simple neural network with no hidden layer\n", "\n", @@ -1965,8 +2090,10 @@ }, { "cell_type": "markdown", - "id": "41976e3b", - "metadata": {}, + "id": "29010edf", + "metadata": { + "editable": true + }, "source": [ "## Optimizing the parameters\n", "\n", @@ -1979,8 +2106,10 @@ }, { "cell_type": "markdown", - "id": "daeda85f", - "metadata": {}, + "id": "a711c13b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_1} \\hspace{0.1cm}\\mathrm{and}\\hspace{0.1cm}\\frac{\\partial C}{\\partial b_1}.\n", @@ -1989,16 +2118,20 @@ }, { "cell_type": "markdown", - "id": "cfd25fda", - "metadata": {}, + "id": "d3f80d27", + "metadata": { + "editable": true + }, "source": [ "Using the chain rule we find" ] }, { "cell_type": "markdown", - "id": "8d695dcf", - "metadata": {}, + "id": "5b9125a4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_1}=\\frac{\\partial C}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial w_1}=(a_1-y)\\sigma_1'x,\n", @@ -2007,16 +2140,20 @@ }, { "cell_type": "markdown", - "id": "dcc2f332", - "metadata": {}, + "id": "eb0f2a16", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "cb53a1ce", - "metadata": {}, + "id": "2ce24758", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial b_1}=\\frac{\\partial C}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial b_1}=(a_1-y)\\sigma_1',\n", @@ -2025,16 +2162,20 @@ }, { "cell_type": "markdown", - "id": "b547af4b", - "metadata": {}, + "id": "4b607868", + "metadata": { + "editable": true + }, "source": [ "which we later will just define as" ] }, { "cell_type": "markdown", - "id": "e05ad1a5", - "metadata": {}, + "id": "3f2688b3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}=\\delta_1.\n", @@ -2043,8 +2184,10 @@ }, { "cell_type": "markdown", - "id": "e841d792", - "metadata": {}, + "id": "83bef901", + "metadata": { + "editable": true + }, "source": [ "## Adding a hidden layer\n", "\n", @@ -2057,8 +2200,10 @@ }, { "cell_type": "markdown", - "id": "7d0be7a7", - "metadata": {}, + "id": "364b5f09", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z_1 = w_1a_0+b_1 \\hspace{0.1cm} \\wedge a_1 = \\sigma_1(z_1),\n", @@ -2067,8 +2212,10 @@ }, { "cell_type": "markdown", - "id": "99d7e794", - "metadata": {}, + "id": "38288d5b", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z_2 = w_2a_1+b_2 \\hspace{0.1cm} \\wedge a_2 = \\sigma_2(z_2),\n", @@ -2077,16 +2224,20 @@ }, { "cell_type": "markdown", - "id": "b5a9ccd1", - "metadata": {}, + "id": "b69ebeb8", + "metadata": { + "editable": true + }, "source": [ "and the cost function" ] }, { "cell_type": "markdown", - "id": "97e1f77a", - "metadata": {}, + "id": "a1c64c16", + "metadata": { + "editable": true + }, "source": [ "$$\n", "C(x;\\boldsymbol{\\Theta})=\\frac{1}{2}(a_2-y)^2,\n", @@ -2095,16 +2246,20 @@ }, { "cell_type": "markdown", - "id": "129d6040", - "metadata": {}, + "id": "78f802ec", + "metadata": { + "editable": true + }, "source": [ "with $\\boldsymbol{\\Theta}=[w_1,w_2,b_1,b_2]$." ] }, { "cell_type": "markdown", - "id": "cd905c05", - "metadata": {}, + "id": "502934b1", + "metadata": { + "editable": true + }, "source": [ "## Layout of a simple neural network with one hidden layer\n", "\n", @@ -2117,8 +2272,10 @@ }, { "cell_type": "markdown", - "id": "dc3ee985", - "metadata": {}, + "id": "2c4fcdd6", + "metadata": { + "editable": true + }, "source": [ "## The derivatives\n", "\n", @@ -2127,8 +2284,10 @@ }, { "cell_type": "markdown", - "id": "6b21de52", - "metadata": {}, + "id": "6cc539fa", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_2}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial w_2}=(a_2-y)\\sigma_2'a_1=\\delta_2a_1,\n", @@ -2137,8 +2296,10 @@ }, { "cell_type": "markdown", - "id": "04bef693", - "metadata": {}, + "id": "12891d80", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial b_2}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial b_2}=(a_2-y)\\sigma_2'=\\delta_2,\n", @@ -2147,8 +2308,10 @@ }, { "cell_type": "markdown", - "id": "6e9a9575", - "metadata": {}, + "id": "81ea70b8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_1}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial w_1}=(a_2-y)\\sigma_2'a_1\\sigma_1'a_0,\n", @@ -2157,8 +2320,10 @@ }, { "cell_type": "markdown", - "id": "c65ff641", - "metadata": {}, + "id": "7861d7fc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial b_1}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial b_1}=(a_2-y)\\sigma_2'\\sigma_1'=\\delta_1.\n", @@ -2167,16 +2332,20 @@ }, { "cell_type": "markdown", - "id": "f67e1353", - "metadata": {}, + "id": "bfd3cdb5", + "metadata": { + "editable": true + }, "source": [ "Can you generalize this to more than one hidden layer?" ] }, { "cell_type": "markdown", - "id": "7476ad06", - "metadata": {}, + "id": "900caec3", + "metadata": { + "editable": true + }, "source": [ "## Important observations\n", "\n", @@ -2189,8 +2358,10 @@ }, { "cell_type": "markdown", - "id": "520d8a90", - "metadata": {}, + "id": "68cde135", + "metadata": { + "editable": true + }, "source": [ "## The training\n", "\n", @@ -2199,8 +2370,10 @@ }, { "cell_type": "markdown", - "id": "d57d0f1d", - "metadata": {}, + "id": "7be0563a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{i}\\leftarrow w_{i}- \\eta \\delta_i a_{i-1},\n", @@ -2209,16 +2382,20 @@ }, { "cell_type": "markdown", - "id": "97925a47", - "metadata": {}, + "id": "a59fe19e", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "21bf2445", - "metadata": {}, + "id": "8d0b13ca", + "metadata": { + "editable": true + }, "source": [ "$$\n", "b_i \\leftarrow b_i-\\eta \\delta_i,\n", @@ -2227,8 +2404,10 @@ }, { "cell_type": "markdown", - "id": "de7f0e7b", - "metadata": {}, + "id": "00f9304b", + "metadata": { + "editable": true + }, "source": [ "with $\\eta$ is the learning rate.\n", "\n", @@ -2239,8 +2418,10 @@ }, { "cell_type": "markdown", - "id": "4060cfa4", - "metadata": {}, + "id": "6f93d071", + "metadata": { + "editable": true + }, "source": [ "## Code example\n", "\n", @@ -2254,67 +2435,13 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "1248e89b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[36.89563074]\n", - "[23.62323175]\n", - "[15.1251681]\n", - "[9.68402334]\n", - "[6.20020163]\n", - "[3.96963458]\n", - "[2.54150298]\n", - "[1.62714703]\n", - "[1.0417409]\n", - "[0.66694492]\n", - "[0.42699034]\n", - "[0.27336592]\n", - "[0.17501258]\n", - "[0.11204514]\n", - "[0.07173249]\n", - "[0.04592382]\n", - "[0.02940083]\n", - "[0.01882264]\n", - "[0.01205039]\n", - "[0.00771475]\n", - "[0.00493903]\n", - "[0.003162]\n", - "[0.00202433]\n", - "[0.00129599]\n", - "[0.0008297]\n", - "[0.00053118]\n", - "[0.00034006]\n", - "[0.00021771]\n", - "[0.00013938]\n", - "[8.92313548e-05]\n", - "[5.71263851e-05]\n", - "[3.6572612e-05]\n", - "[2.34139775e-05]\n", - "[1.49897504e-05]\n", - "[9.5965161e-06]\n", - "[6.14373934e-06]\n", - "[3.93325371e-06]\n", - "[2.51808934e-06]\n", - "[1.61209378e-06]\n", - "[1.03207075e-06]\n", - "[6.60737006e-07]\n", - "[4.23007231e-07]\n", - "[2.70811405e-07]\n", - "[1.73374853e-07]\n", - "[1.10995472e-07]\n", - "[7.10598715e-08]\n", - "[4.54928947e-08]\n", - "[2.91247848e-08]\n", - "[1.86458368e-08]\n", - "[1.19371605e-08]\n" - ] - } - ], + "execution_count": 3, + "id": "a9f388a5", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], "source": [ "import numpy as np\n", "# We use the Sigmoid function as activation function\n", @@ -2382,16 +2509,20 @@ }, { "cell_type": "markdown", - "id": "eabe6b42", - "metadata": {}, + "id": "2b757e0a", + "metadata": { + "editable": true + }, "source": [ "We see that after some few iterations (the results do depend on the learning rate however), we get an error which is rather small." ] }, { "cell_type": "markdown", - "id": "35974e2d", - "metadata": {}, + "id": "a746f529", + "metadata": { + "editable": true + }, "source": [ "## Exercise 1: Including more data\n", "\n", @@ -2406,8 +2537,10 @@ }, { "cell_type": "markdown", - "id": "eebf9d30", - "metadata": {}, + "id": "ec8820f7", + "metadata": { + "editable": true + }, "source": [ "## Simple neural network and the back propagation equations\n", "\n", @@ -2421,8 +2554,10 @@ }, { "cell_type": "markdown", - "id": "2f079f0b", - "metadata": {}, + "id": "75eb95db", + "metadata": { + "editable": true + }, "source": [ "$$\n", "x_0 = a_0^{(0)} \\wedge x_1 = a_1^{(0)}.\n", @@ -2431,16 +2566,20 @@ }, { "cell_type": "markdown", - "id": "50b799fe", - "metadata": {}, + "id": "105d8a64", + "metadata": { + "editable": true + }, "source": [ "The hidden layer (layer $(1)$) has nodes which yield the outputs $a_0^{(1)}$ and $a_1^{(1)}$) with weight $\\boldsymbol{w}$ and bias $\\boldsymbol{b}$ parameters" ] }, { "cell_type": "markdown", - "id": "9eeeddd7", - "metadata": {}, + "id": "2818bd8c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{ij}^{(1)}=\\left\\{w_{00}^{(1)},w_{01}^{(1)},w_{10}^{(1)},w_{11}^{(1)}\\right\\} \\wedge b^{(1)}=\\left\\{b_0^{(1)},b_1^{(1)}\\right\\}.\n", @@ -2449,8 +2588,10 @@ }, { "cell_type": "markdown", - "id": "89d239c6", - "metadata": {}, + "id": "66e9f0bf", + "metadata": { + "editable": true + }, "source": [ "## Layout of a simple neural network with two input nodes, one hidden layer and one output node\n", "\n", @@ -2463,8 +2604,10 @@ }, { "cell_type": "markdown", - "id": "bdbf35b5", - "metadata": {}, + "id": "dcbddb2f", + "metadata": { + "editable": true + }, "source": [ "## The ouput layer\n", "\n", @@ -2473,8 +2616,10 @@ }, { "cell_type": "markdown", - "id": "4e4ff5e9", - "metadata": {}, + "id": "ce85df1e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{i}^{(2)}=\\left\\{w_{0}^{(2)},w_{1}^{(2)}\\right\\} \\wedge b^{(2)}.\n", @@ -2483,8 +2628,10 @@ }, { "cell_type": "markdown", - "id": "0d262c6f", - "metadata": {}, + "id": "29bd7b18", + "metadata": { + "editable": true + }, "source": [ "Our output is $\\tilde{y}=a^{(2)}$ and we define a generic cost function $C(a^{(2)},y;\\boldsymbol{\\Theta})$ where $y$ is the target value (a scalar here).\n", "The parameters we need to optimize are given by" @@ -2492,8 +2639,10 @@ }, { "cell_type": "markdown", - "id": "bc03ac5a", - "metadata": {}, + "id": "ef82ab54", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\Theta}=\\left\\{w_{00}^{(1)},w_{01}^{(1)},w_{10}^{(1)},w_{11}^{(1)},w_{0}^{(2)},w_{1}^{(2)},b_0^{(1)},b_1^{(1)},b^{(2)}\\right\\}.\n", @@ -2502,8 +2651,10 @@ }, { "cell_type": "markdown", - "id": "59f909e2", - "metadata": {}, + "id": "d1ac57d1", + "metadata": { + "editable": true + }, "source": [ "## Compact expressions\n", "\n", @@ -2513,8 +2664,10 @@ }, { "cell_type": "markdown", - "id": "7eb0a44d", - "metadata": {}, + "id": "596a9ea8", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{bmatrix}z_0^{(1)} \\\\ z_1^{(1)} \\end{bmatrix}=\\begin{bmatrix}w_{00}^{(1)} & w_{01}^{(1)}\\\\ w_{10}^{(1)} &w_{11}^{(1)} \\end{bmatrix}\\begin{bmatrix}a_0^{(0)} \\\\ a_1^{(0)} \\end{bmatrix}+\\begin{bmatrix}b_0^{(1)} \\\\ b_1^{(1)} \\end{bmatrix},\n", @@ -2523,16 +2676,20 @@ }, { "cell_type": "markdown", - "id": "07d8d778", - "metadata": {}, + "id": "70a48160", + "metadata": { + "editable": true + }, "source": [ "with outputs" ] }, { "cell_type": "markdown", - "id": "60368bf9", - "metadata": {}, + "id": "3d8663dc", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\begin{bmatrix}a_0^{(1)} \\\\ a_1^{(1)} \\end{bmatrix}=\\begin{bmatrix}\\sigma^{(1)}(z_0^{(1)}) \\\\ \\sigma^{(1)}(z_1^{(1)}) \\end{bmatrix}.\n", @@ -2541,8 +2698,10 @@ }, { "cell_type": "markdown", - "id": "79853185", - "metadata": {}, + "id": "2cb74c95", + "metadata": { + "editable": true + }, "source": [ "## Output layer\n", "\n", @@ -2551,8 +2710,10 @@ }, { "cell_type": "markdown", - "id": "e84489fb", - "metadata": {}, + "id": "6f25a15d", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z^{(2)} = w_{0}^{(2)}a_0^{(1)} +w_{1}^{(2)}a_1^{(1)}+b^{(2)},\n", @@ -2561,16 +2722,20 @@ }, { "cell_type": "markdown", - "id": "10ac6ea6", - "metadata": {}, + "id": "980266d5", + "metadata": { + "editable": true + }, "source": [ "resulting in the output" ] }, { "cell_type": "markdown", - "id": "4bb215d6", - "metadata": {}, + "id": "70bce478", + "metadata": { + "editable": true + }, "source": [ "$$\n", "a^{(2)}=\\sigma^{(2)}(z^{(2)}).\n", @@ -2579,8 +2744,10 @@ }, { "cell_type": "markdown", - "id": "0389c02c", - "metadata": {}, + "id": "6d265593", + "metadata": { + "editable": true + }, "source": [ "## Explicit derivatives\n", "\n", @@ -2593,8 +2760,10 @@ }, { "cell_type": "markdown", - "id": "bd9a8665", - "metadata": {}, + "id": "dbd4e2a3", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_{i}^{(2)}}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\\frac{\\partial z^{(2)}}{\\partial w_{i}^{(2)}}=\\delta^{(2)}a_i^{(1)},\n", @@ -2603,16 +2772,20 @@ }, { "cell_type": "markdown", - "id": "904eef6d", - "metadata": {}, + "id": "09d2cf31", + "metadata": { + "editable": true + }, "source": [ "with" ] }, { "cell_type": "markdown", - "id": "f422cd5d", - "metadata": {}, + "id": "f79ab8f7", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta^{(2)}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\n", @@ -2621,16 +2794,20 @@ }, { "cell_type": "markdown", - "id": "0827f570", - "metadata": {}, + "id": "9c08c538", + "metadata": { + "editable": true + }, "source": [ "and finally" ] }, { "cell_type": "markdown", - "id": "0caae8eb", - "metadata": {}, + "id": "a2f6c044", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial b^{(2)}}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\\frac{\\partial z^{(2)}}{\\partial b^{(2)}}=\\delta^{(2)}.\n", @@ -2639,8 +2816,10 @@ }, { "cell_type": "markdown", - "id": "2f4011e7", - "metadata": {}, + "id": "a09f4e04", + "metadata": { + "editable": true + }, "source": [ "## Derivatives of the hidden layer\n", "\n", @@ -2649,8 +2828,10 @@ }, { "cell_type": "markdown", - "id": "4614eb63", - "metadata": {}, + "id": "6a92eb7a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_{00}^{(1)}}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\n", @@ -2660,16 +2841,20 @@ }, { "cell_type": "markdown", - "id": "954403b8", - "metadata": {}, + "id": "8fe089f9", + "metadata": { + "editable": true + }, "source": [ "which, noting that" ] }, { "cell_type": "markdown", - "id": "d0f5c05f", - "metadata": {}, + "id": "a62a5291", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z^{(2)} =w_0^{(2)}a_0^{(1)}+w_1^{(2)}a_1^{(1)}+b^{(2)},\n", @@ -2678,16 +2863,20 @@ }, { "cell_type": "markdown", - "id": "ac8c2f66", - "metadata": {}, + "id": "435fd697", + "metadata": { + "editable": true + }, "source": [ "allows us to rewrite" ] }, { "cell_type": "markdown", - "id": "9bcf7c0d", - "metadata": {}, + "id": "fa2bd02f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial z^{(2)}}{\\partial z_0^{(1)}}\\frac{\\partial z_0^{(1)}}{\\partial w_{00}^{(1)}}=w_0^{(2)}\\frac{\\partial a_0^{(1)}}{\\partial z_0^{(1)}}a_0^{(1)}.\n", @@ -2696,8 +2885,10 @@ }, { "cell_type": "markdown", - "id": "4c2c5c00", - "metadata": {}, + "id": "b809a430", + "metadata": { + "editable": true + }, "source": [ "## Final expression\n", "Defining" @@ -2705,8 +2896,10 @@ }, { "cell_type": "markdown", - "id": "eed00134", - "metadata": {}, + "id": "8d9a8843", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_0^{(1)}=w_0^{(2)}\\frac{\\partial a_0^{(1)}}{\\partial z_0^{(1)}}\\delta^{(2)},\n", @@ -2715,16 +2908,20 @@ }, { "cell_type": "markdown", - "id": "21d53946", - "metadata": {}, + "id": "4ac52a1d", + "metadata": { + "editable": true + }, "source": [ "we have" ] }, { "cell_type": "markdown", - "id": "4fbe8642", - "metadata": {}, + "id": "f146f084", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_{00}^{(1)}}=\\delta_0^{(1)}a_0^{(1)}.\n", @@ -2733,16 +2930,20 @@ }, { "cell_type": "markdown", - "id": "2325e21d", - "metadata": {}, + "id": "5152d124", + "metadata": { + "editable": true + }, "source": [ "Similarly, we obtain" ] }, { "cell_type": "markdown", - "id": "14edd073", - "metadata": {}, + "id": "ac1cc726", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_{01}^{(1)}}=\\delta_0^{(1)}a_1^{(1)}.\n", @@ -2751,8 +2952,10 @@ }, { "cell_type": "markdown", - "id": "52bbf902", - "metadata": {}, + "id": "301bfbae", + "metadata": { + "editable": true + }, "source": [ "## Completing the list\n", "\n", @@ -2761,8 +2964,10 @@ }, { "cell_type": "markdown", - "id": "98a6ed3a", - "metadata": {}, + "id": "0f8342ca", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_{10}^{(1)}}=\\delta_1^{(1)}a_0^{(1)},\n", @@ -2771,16 +2976,20 @@ }, { "cell_type": "markdown", - "id": "6ab03495", - "metadata": {}, + "id": "3c0e1892", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "dcda9d7d", - "metadata": {}, + "id": "1fd466c4", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial w_{11}^{(1)}}=\\delta_1^{(1)}a_1^{(1)},\n", @@ -2789,16 +2998,20 @@ }, { "cell_type": "markdown", - "id": "46ec3534", - "metadata": {}, + "id": "96a66261", + "metadata": { + "editable": true + }, "source": [ "where we have defined" ] }, { "cell_type": "markdown", - "id": "f10c20da", - "metadata": {}, + "id": "48fec0f6", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_1^{(1)}=w_1^{(2)}\\frac{\\partial a_1^{(1)}}{\\partial z_1^{(1)}}\\delta^{(2)}.\n", @@ -2807,8 +3020,10 @@ }, { "cell_type": "markdown", - "id": "c3c477be", - "metadata": {}, + "id": "0c74d22b", + "metadata": { + "editable": true + }, "source": [ "## Final expressions for the biases of the hidden layer\n", "\n", @@ -2817,8 +3032,10 @@ }, { "cell_type": "markdown", - "id": "0c915c97", - "metadata": {}, + "id": "0c854481", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial b_{0}^{(1)}}=\\delta_0^{(1)},\n", @@ -2827,16 +3044,20 @@ }, { "cell_type": "markdown", - "id": "646d8351", - "metadata": {}, + "id": "f10bb50d", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "4ce93a76", - "metadata": {}, + "id": "76a5d55f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial C}{\\partial b_{1}^{(1)}}=\\delta_1^{(1)}.\n", @@ -2845,16 +3066,20 @@ }, { "cell_type": "markdown", - "id": "ee7a38ed", - "metadata": {}, + "id": "e5f00732", + "metadata": { + "editable": true + }, "source": [ "As we will see below, these expressions can be generalized in a more compact form." ] }, { "cell_type": "markdown", - "id": "abdb541d", - "metadata": {}, + "id": "afdef373", + "metadata": { + "editable": true + }, "source": [ "## Gradient expressions\n", "\n", @@ -2864,8 +3089,10 @@ }, { "cell_type": "markdown", - "id": "410de8d4", - "metadata": {}, + "id": "d52eee8a", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{i}^{(2)}\\leftarrow w_{i}^{(2)}- \\eta \\delta^{(2)} a_{i}^{(1)},\n", @@ -2874,16 +3101,20 @@ }, { "cell_type": "markdown", - "id": "ca1d6736", - "metadata": {}, + "id": "38b3bf6d", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "d43c2266", - "metadata": {}, + "id": "f6068eca", + "metadata": { + "editable": true + }, "source": [ "$$\n", "b^{(2)} \\leftarrow b^{(2)}-\\eta \\delta^{(2)},\n", @@ -2892,16 +3123,20 @@ }, { "cell_type": "markdown", - "id": "56457d52", - "metadata": {}, + "id": "71ee9ceb", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "1ddc19f1", - "metadata": {}, + "id": "5c8a4ccd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{ij}^{(1)}\\leftarrow w_{ij}^{(1)}- \\eta \\delta_{i}^{(1)} a_{j}^{(0)},\n", @@ -2910,16 +3145,20 @@ }, { "cell_type": "markdown", - "id": "de8c80cd", - "metadata": {}, + "id": "02025483", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "db88453a", - "metadata": {}, + "id": "c6619121", + "metadata": { + "editable": true + }, "source": [ "$$\n", "b_{i}^{(1)} \\leftarrow b_{i}^{(1)}-\\eta \\delta_{i}^{(1)},\n", @@ -2928,16 +3167,20 @@ }, { "cell_type": "markdown", - "id": "f61958e4", - "metadata": {}, + "id": "050f3fcc", + "metadata": { + "editable": true + }, "source": [ "where $\\eta$ is the learning rate." ] }, { "cell_type": "markdown", - "id": "7ef82615", - "metadata": {}, + "id": "06a24ad2", + "metadata": { + "editable": true + }, "source": [ "## Exercise 2: Extended program\n", "\n", @@ -2946,8 +3189,10 @@ }, { "cell_type": "markdown", - "id": "f65323bf", - "metadata": {}, + "id": "4274918f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "y=f(x_0,x_1)=x_0^2+3x_0x_1+x_1^2+5.\n", @@ -2956,16 +3201,20 @@ }, { "cell_type": "markdown", - "id": "96734d00", - "metadata": {}, + "id": "56d9f66f", + "metadata": { + "editable": true + }, "source": [ "We feed our network with $n=100$ entries $x_0$ and $x_1$. We have thus two features represented by these variable and an input matrix/design matrix $\\boldsymbol{X}\\in \\mathbf{R}^{n\\times 2}$" ] }, { "cell_type": "markdown", - "id": "f776f53c", - "metadata": {}, + "id": "042c5edd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{X}=\\begin{bmatrix} x_{00} & x_{01} \\\\ x_{00} & x_{01} \\\\ x_{10} & x_{11} \\\\ x_{20} & x_{21} \\\\ \\dots & \\dots \\\\ \\dots & \\dots \\\\ x_{n-20} & x_{n-21} \\\\ x_{n-10} & x_{n-11} \\end{bmatrix}.\n", @@ -2974,8 +3223,10 @@ }, { "cell_type": "markdown", - "id": "bbf2e007", - "metadata": {}, + "id": "ce337d30", + "metadata": { + "editable": true + }, "source": [ "Write a code, based on the previous code examples, which takes as input these data and fit the above function.\n", "You can extend your code to include automatic differentiation.\n", @@ -2985,8 +3236,10 @@ }, { "cell_type": "markdown", - "id": "9d6d0a32", - "metadata": {}, + "id": "53b17e8e", + "metadata": { + "editable": true + }, "source": [ "## Getting serious, the back propagation equations for a neural network\n", "\n", @@ -2997,8 +3250,10 @@ }, { "cell_type": "markdown", - "id": "6720dd98", - "metadata": {}, + "id": "b6759476", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial{\\cal C}((\\boldsymbol{\\Theta}^L)}{\\partial w_{jk}^L} = \\left(a_j^L - y_j\\right)a_j^L(1-a_j^L)a_k^{L-1},\n", @@ -3007,16 +3262,20 @@ }, { "cell_type": "markdown", - "id": "759eb99f", - "metadata": {}, + "id": "22d35cab", + "metadata": { + "editable": true + }, "source": [ "Defining" ] }, { "cell_type": "markdown", - "id": "294cc167", - "metadata": {}, + "id": "3869fd5f", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^L = a_j^L(1-a_j^L)\\left(a_j^L - y_j\\right) = \\sigma'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", @@ -3025,16 +3284,20 @@ }, { "cell_type": "markdown", - "id": "3311576a", - "metadata": {}, + "id": "4ecac8d6", + "metadata": { + "editable": true + }, "source": [ "and using the Hadamard product of two vectors we can write this as" ] }, { "cell_type": "markdown", - "id": "892ab641", - "metadata": {}, + "id": "33824242", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\boldsymbol{\\delta}^L = \\sigma'(\\hat{z}^L)\\circ\\frac{\\partial {\\cal C}}{\\partial (\\boldsymbol{a}^L)}.\n", @@ -3043,8 +3306,10 @@ }, { "cell_type": "markdown", - "id": "e126a949", - "metadata": {}, + "id": "905fc741", + "metadata": { + "editable": true + }, "source": [ "## Analyzing the last results\n", "\n", @@ -3059,8 +3324,10 @@ }, { "cell_type": "markdown", - "id": "0640b440", - "metadata": {}, + "id": "f81d4ba5", + "metadata": { + "editable": true + }, "source": [ "## More considerations\n", "\n", @@ -3075,8 +3342,10 @@ }, { "cell_type": "markdown", - "id": "780544e8", - "metadata": {}, + "id": "36bf1dfb", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}\n", @@ -3085,16 +3354,20 @@ }, { "cell_type": "markdown", - "id": "5ed8c781", - "metadata": {}, + "id": "ef9f1e9b", + "metadata": { + "editable": true + }, "source": [ "With the definition of $\\delta_j^L$ we have a more compact definition of the derivative of the cost function in terms of the weights, namely" ] }, { "cell_type": "markdown", - "id": "9a9568a1", - "metadata": {}, + "id": "16944f70", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\frac{\\partial{\\cal C}}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1}.\n", @@ -3103,8 +3376,10 @@ }, { "cell_type": "markdown", - "id": "29ac7458", - "metadata": {}, + "id": "3af2849b", + "metadata": { + "editable": true + }, "source": [ "## Derivatives in terms of $z_j^L$\n", "\n", @@ -3113,8 +3388,10 @@ }, { "cell_type": "markdown", - "id": "693c53ac", - "metadata": {}, + "id": "aba9c751", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^L =\\frac{\\partial {\\cal C}}{\\partial z_j^L}= \\frac{\\partial {\\cal C}}{\\partial a_j^L}\\frac{\\partial a_j^L}{\\partial z_j^L},\n", @@ -3123,16 +3400,20 @@ }, { "cell_type": "markdown", - "id": "650e4dea", - "metadata": {}, + "id": "e75abc21", + "metadata": { + "editable": true + }, "source": [ "which can also be interpreted as the partial derivative of the cost function with respect to the biases $b_j^L$, namely" ] }, { "cell_type": "markdown", - "id": "4fbf17cf", - "metadata": {}, + "id": "eb71f184", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L}\\frac{\\partial b_j^L}{\\partial z_j^L}=\\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", @@ -3141,16 +3422,20 @@ }, { "cell_type": "markdown", - "id": "a7869a22", - "metadata": {}, + "id": "31ab0d28", + "metadata": { + "editable": true + }, "source": [ "That is, the error $\\delta_j^L$ is exactly equal to the rate of change of the cost function as a function of the bias." ] }, { "cell_type": "markdown", - "id": "cfd6c9d7", - "metadata": {}, + "id": "9ee59b2e", + "metadata": { + "editable": true + }, "source": [ "## Bringing it together\n", "\n", @@ -3159,8 +3444,10 @@ }, { "cell_type": "markdown", - "id": "73360f7e", - "metadata": {}, + "id": "d6fa40ac", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3175,16 +3462,20 @@ }, { "cell_type": "markdown", - "id": "2685bc86", - "metadata": {}, + "id": "1ced4984", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "ff174cf5", - "metadata": {}, + "id": "3b2fea6b", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3199,16 +3490,20 @@ }, { "cell_type": "markdown", - "id": "1c97902a", - "metadata": {}, + "id": "dd703643", + "metadata": { + "editable": true + }, "source": [ "and" ] }, { "cell_type": "markdown", - "id": "d70e9292", - "metadata": {}, + "id": "d9fdc337", + "metadata": { + "editable": true + }, "source": [ "\n", "
\n", @@ -3223,8 +3518,10 @@ }, { "cell_type": "markdown", - "id": "ffcecfbe", - "metadata": {}, + "id": "5412dee8", + "metadata": { + "editable": true + }, "source": [ "## Final back propagating equation\n", "\n", @@ -3233,8 +3530,10 @@ }, { "cell_type": "markdown", - "id": "e49c2a4e", - "metadata": {}, + "id": "e912e54c", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^l =\\frac{\\partial {\\cal C}}{\\partial z_j^l}.\n", @@ -3243,16 +3542,20 @@ }, { "cell_type": "markdown", - "id": "4c706310", - "metadata": {}, + "id": "04224d80", + "metadata": { + "editable": true + }, "source": [ "We want to express this in terms of the equations for layer $l+1$." ] }, { "cell_type": "markdown", - "id": "301cfb1f", - "metadata": {}, + "id": "9f08fbcc", + "metadata": { + "editable": true + }, "source": [ "## Using the chain rule and summing over all $k$ entries\n", "\n", @@ -3261,8 +3564,10 @@ }, { "cell_type": "markdown", - "id": "5dc4f3ba", - "metadata": {}, + "id": "faa505b9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^l =\\sum_k \\frac{\\partial {\\cal C}}{\\partial z_k^{l+1}}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}}=\\sum_k \\delta_k^{l+1}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}},\n", @@ -3271,16 +3576,20 @@ }, { "cell_type": "markdown", - "id": "3dfdac72", - "metadata": {}, + "id": "ed46f21f", + "metadata": { + "editable": true + }, "source": [ "and recalling that" ] }, { "cell_type": "markdown", - "id": "c04afa91", - "metadata": {}, + "id": "515a4eef", + "metadata": { + "editable": true + }, "source": [ "$$\n", "z_j^{l+1} = \\sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1},\n", @@ -3289,16 +3598,20 @@ }, { "cell_type": "markdown", - "id": "b7a22173", - "metadata": {}, + "id": "bee442d8", + "metadata": { + "editable": true + }, "source": [ "with $M_l$ being the number of nodes in layer $l$, we obtain" ] }, { "cell_type": "markdown", - "id": "fa9ff041", - "metadata": {}, + "id": "2b2596dd", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^l =\\sum_k \\delta_k^{l+1}w_{kj}^{l+1}\\sigma'(z_j^l),\n", @@ -3307,8 +3620,10 @@ }, { "cell_type": "markdown", - "id": "a1648ab9", - "metadata": {}, + "id": "1d832dcf", + "metadata": { + "editable": true + }, "source": [ "This is our final equation.\n", "\n", @@ -3317,8 +3632,10 @@ }, { "cell_type": "markdown", - "id": "24569ace", - "metadata": {}, + "id": "2f958487", + "metadata": { + "editable": true + }, "source": [ "## Setting up the back propagation algorithm\n", "\n", @@ -3338,8 +3655,10 @@ }, { "cell_type": "markdown", - "id": "478d8aec", - "metadata": {}, + "id": "8861c9ac", + "metadata": { + "editable": true + }, "source": [ "## Setting up the back propagation algorithm, part 2\n", "\n", @@ -3348,8 +3667,10 @@ }, { "cell_type": "markdown", - "id": "a17614e1", - "metadata": {}, + "id": "aff5f2e9", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^L = \\sigma'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", @@ -3358,16 +3679,20 @@ }, { "cell_type": "markdown", - "id": "2bc63b98", - "metadata": {}, + "id": "a12a0d0f", + "metadata": { + "editable": true + }, "source": [ "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,1$ as" ] }, { "cell_type": "markdown", - "id": "060a6a00", - "metadata": {}, + "id": "eebf7ad0", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}\\sigma'(z_j^l).\n", @@ -3376,8 +3701,10 @@ }, { "cell_type": "markdown", - "id": "f73677e1", - "metadata": {}, + "id": "5ac6e8cd", + "metadata": { + "editable": true + }, "source": [ "## Setting up the Back propagation algorithm, part 3\n", "\n", @@ -3388,8 +3715,10 @@ }, { "cell_type": "markdown", - "id": "b0faa8a5", - "metadata": {}, + "id": "219d7967", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", @@ -3398,8 +3727,10 @@ }, { "cell_type": "markdown", - "id": "4f0820e6", - "metadata": {}, + "id": "c5e69141", + "metadata": { + "editable": true + }, "source": [ "$$\n", "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", @@ -3408,16 +3739,20 @@ }, { "cell_type": "markdown", - "id": "72ac45e2", - "metadata": {}, + "id": "5f72b173", + "metadata": { + "editable": true + }, "source": [ "with $\\eta$ being the learning rate." ] }, { "cell_type": "markdown", - "id": "53cbf551", - "metadata": {}, + "id": "77500a39", + "metadata": { + "editable": true + }, "source": [ "## Updating the gradients\n", "\n", @@ -3426,8 +3761,10 @@ }, { "cell_type": "markdown", - "id": "8a9433ea", - "metadata": {}, + "id": "6d90be80", + "metadata": { + "editable": true + }, "source": [ "$$\n", "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}sigma'(z_j^l),\n", @@ -3436,16 +3773,20 @@ }, { "cell_type": "markdown", - "id": "07c92792", - "metadata": {}, + "id": "6dc431f1", + "metadata": { + "editable": true + }, "source": [ "we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,1$ and update the weights and biases according to the rules" ] }, { "cell_type": "markdown", - "id": "efa48fd7", - "metadata": {}, + "id": "bc54103e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", @@ -3454,607 +3795,18 @@ }, { "cell_type": "markdown", - "id": "6c4db201", - "metadata": {}, + "id": "8a08a83e", + "metadata": { + "editable": true + }, "source": [ "$$\n", "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", "$$" ] - }, - { - "cell_type": "markdown", - "id": "19ae4f4e", - "metadata": {}, - "source": [ - "### Activation functions\n", - "\n", - "A property that characterizes a neural network, other than its\n", - "connectivity, is the choice of activation function(s). As described\n", - "in, the following restrictions are imposed on an activation function\n", - "for a FFNN to fulfill the universal approximation theorem\n", - "\n", - " * Non-constant\n", - "\n", - " * Bounded\n", - "\n", - " * Monotonically-increasing\n", - "\n", - " * Continuous" - ] - }, - { - "cell_type": "markdown", - "id": "c478ce3c", - "metadata": {}, - "source": [ - "### Activation functions, Logistic and Hyperbolic ones\n", - "\n", - "The second requirement excludes all linear functions. Furthermore, in\n", - "a MLP with only linear activation functions, each layer simply\n", - "performs a linear transformation of its inputs.\n", - "\n", - "Regardless of the number of layers, the output of the NN will be\n", - "nothing but a linear function of the inputs. Thus we need to introduce\n", - "some kind of non-linearity to the NN to be able to fit non-linear\n", - "functions Typical examples are the logistic *Sigmoid*" - ] - }, - { - "cell_type": "markdown", - "id": "5142ca2b", - "metadata": {}, - "source": [ - "$$\n", - "f(x) = \\frac{1}{1 + e^{-x}},\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "id": "9c4a44fb", - "metadata": {}, - "source": [ - "and the *hyperbolic tangent* function" - ] - }, - { - "cell_type": "markdown", - "id": "74fded03", - "metadata": {}, - "source": [ - "$$\n", - "f(x) = \\tanh(x)\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "id": "fefab641", - "metadata": {}, - "source": [ - "### Relevance\n", - "\n", - "The *sigmoid* function are more biologically plausible because the\n", - "output of inactive neurons are zero. Such activation function are\n", - "called *one-sided*. However, it has been shown that the hyperbolic\n", - "tangent performs better than the sigmoid for training MLPs. has\n", - "become the most popular for *deep neural networks*" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "56c89538", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"The sigmoid function (or the logistic curve) is a \n", - "function that takes any real number, z, and outputs a number (0,1).\n", - "It is useful in neural networks for assigning weights on a relative scale.\n", - "The value z is the weighted sum of parameters involved in the learning algorithm.\"\"\"\n", - "\n", - "import numpy\n", - "import matplotlib.pyplot as plt\n", - "import math as mt\n", - "\n", - "z = numpy.arange(-5, 5, .1)\n", - "sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z)))\n", - "sigma = sigma_fn(z)\n", - "\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot(z, sigma)\n", - "ax.set_ylim([-0.1, 1.1])\n", - "ax.set_xlim([-5,5])\n", - "ax.grid(True)\n", - "ax.set_xlabel('z')\n", - "ax.set_title('sigmoid function')\n", - "\n", - "plt.show()\n", - "\n", - "\"\"\"Step Function\"\"\"\n", - "z = numpy.arange(-5, 5, .02)\n", - "step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0)\n", - "step = step_fn(z)\n", - "\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot(z, step)\n", - "ax.set_ylim([-0.5, 1.5])\n", - "ax.set_xlim([-5,5])\n", - "ax.grid(True)\n", - "ax.set_xlabel('z')\n", - "ax.set_title('step function')\n", - "\n", - "plt.show()\n", - "\n", - "\"\"\"Sine Function\"\"\"\n", - "z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1)\n", - "t = numpy.sin(z)\n", - "\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot(z, t)\n", - "ax.set_ylim([-1.0, 1.0])\n", - "ax.set_xlim([-2*mt.pi,2*mt.pi])\n", - "ax.grid(True)\n", - "ax.set_xlabel('z')\n", - "ax.set_title('sine function')\n", - "\n", - "plt.show()\n", - "\n", - "\"\"\"Plots a graph of the squashing function used by a rectified linear\n", - "unit\"\"\"\n", - "z = numpy.arange(-2, 2, .1)\n", - "zero = numpy.zeros(len(z))\n", - "y = numpy.max([zero, z], axis=0)\n", - "\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(111)\n", - "ax.plot(z, y)\n", - "ax.set_ylim([-2.0, 2.0])\n", - "ax.set_xlim([-2.0, 2.0])\n", - "ax.grid(True)\n", - "ax.set_xlabel('z')\n", - "ax.set_title('Rectified linear unit')\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "21bdb71c", - "metadata": {}, - "source": [ - "## Fine-tuning neural network hyperparameters\n", - "\n", - "The flexibility of neural networks is also one of their main\n", - "drawbacks: there are many hyperparameters to tweak. Not only can you\n", - "use any imaginable network topology (how neurons/nodes are\n", - "interconnected), but even in a simple FFNN you can change the number\n", - "of layers, the number of neurons per layer, the type of activation\n", - "function to use in each layer, the weight initialization logic, the\n", - "stochastic gradient optmized and much more. How do you know what\n", - "combination of hyperparameters is the best for your task?\n", - "\n", - "* You can use grid search with cross-validation to find the right hyperparameters.\n", - "\n", - "However,since there are many hyperparameters to tune, and since\n", - "training a neural network on a large dataset takes a lot of time, you\n", - "will only be able to explore a tiny part of the hyperparameter space.\n", - "\n", - "* You can use randomized search.\n", - "\n", - "* Or use tools like [Oscar](http://oscar.calldesk.ai/), which implements more complex algorithms to help you find a good set of hyperparameters quickly." - ] - }, - { - "cell_type": "markdown", - "id": "82072ebe", - "metadata": {}, - "source": [ - "## Hidden layers\n", - "\n", - "For many problems you can start with just one or two hidden layers and\n", - "it will work just fine. For the MNIST data set you ca easily get a\n", - "high accuracy using just one hidden layer with a few hundred neurons.\n", - "You can reach for this data set above 98% accuracy using two hidden\n", - "layers with the same total amount of neurons, in roughly the same\n", - "amount of training time.\n", - "\n", - "For more complex problems, you can gradually ramp up the number of\n", - "hidden layers, until you start overfitting the training set. Very\n", - "complex tasks, such as large image classification or speech\n", - "recognition, typically require networks with dozens of layers and they\n", - "need a huge amount of training data. However, you will rarely have to\n", - "train such networks from scratch: it is much more common to reuse\n", - "parts of a pretrained state-of-the-art network that performs a similar\n", - "task." - ] - }, - { - "cell_type": "markdown", - "id": "8bfa5b96", - "metadata": {}, - "source": [ - "## Vanishing gradients\n", - "\n", - "The Back propagation algorithm we derived above works by going from\n", - "the output layer to the input layer, propagating the error gradient on\n", - "the way. Once the algorithm has computed the gradient of the cost\n", - "function with regards to each parameter in the network, it uses these\n", - "gradients to update each parameter with a Gradient Descent (GD) step.\n", - "\n", - "Unfortunately for us, the gradients often get smaller and smaller as\n", - "the algorithm progresses down to the first hidden layers. As a result,\n", - "the GD update leaves the lower layer connection weights virtually\n", - "unchanged, and training never converges to a good solution. This is\n", - "known in the literature as **the vanishing gradients problem**." - ] - }, - { - "cell_type": "markdown", - "id": "a52a67bd", - "metadata": {}, - "source": [ - "## Exploding gradients\n", - "\n", - "In other cases, the opposite can happen, namely the the gradients can\n", - "grow bigger and bigger. The result is that many of the layers get\n", - "large updates of the weights the algorithm diverges. This is the\n", - "**exploding gradients problem**, which is mostly encountered in\n", - "recurrent neural networks. More generally, deep neural networks suffer\n", - "from unstable gradients, different layers may learn at widely\n", - "different speeds" - ] - }, - { - "cell_type": "markdown", - "id": "052308cd", - "metadata": {}, - "source": [ - "## Is the Logistic activation function (Sigmoid) our choice?\n", - "\n", - "Although this unfortunate behavior has been empirically observed for\n", - "quite a while (it was one of the reasons why deep neural networks were\n", - "mostly abandoned for a long time), it is only around 2010 that\n", - "significant progress was made in understanding it.\n", - "\n", - "A paper titled [Understanding the Difficulty of Training Deep\n", - "Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio](http://proceedings.mlr.press/v9/glorot10a.html) found that\n", - "the problems with the popular logistic\n", - "sigmoid activation function and the weight initialization technique\n", - "that was most popular at the time, namely random initialization using\n", - "a normal distribution with a mean of 0 and a standard deviation of\n", - "1." - ] - }, - { - "cell_type": "markdown", - "id": "2c943852", - "metadata": {}, - "source": [ - "## Logistic function as the root of problems\n", - "\n", - "They showed that with this activation function and this\n", - "initialization scheme, the variance of the outputs of each layer is\n", - "much greater than the variance of its inputs. Going forward in the\n", - "network, the variance keeps increasing after each layer until the\n", - "activation function saturates at the top layers. This is actually made\n", - "worse by the fact that the logistic function has a mean of 0.5, not 0\n", - "(the hyperbolic tangent function has a mean of 0 and behaves slightly\n", - "better than the logistic function in deep networks)." - ] - }, - { - "cell_type": "markdown", - "id": "09e98546", - "metadata": {}, - "source": [ - "## The derivative of the Logistic funtion\n", - "\n", - "Looking at the logistic activation function, when inputs become large\n", - "(negative or positive), the function saturates at 0 or 1, with a\n", - "derivative extremely close to 0. Thus when backpropagation kicks in,\n", - "it has virtually no gradient to propagate back through the network,\n", - "and what little gradient exists keeps getting diluted as\n", - "backpropagation progresses down through the top layers, so there is\n", - "really nothing left for the lower layers.\n", - "\n", - "In their paper, Glorot and Bengio propose a way to significantly\n", - "alleviate this problem. We need the signal to flow properly in both\n", - "directions: in the forward direction when making predictions, and in\n", - "the reverse direction when backpropagating gradients. We don’t want\n", - "the signal to die out, nor do we want it to explode and saturate. For\n", - "the signal to flow properly, the authors argue that we need the\n", - "variance of the outputs of each layer to be equal to the variance of\n", - "its inputs, and we also need the gradients to have equal variance\n", - "before and after flowing through a layer in the reverse direction." - ] - }, - { - "cell_type": "markdown", - "id": "89458b0d", - "metadata": {}, - "source": [ - "## Insights from the paper by Glorot and Bengio\n", - "\n", - "One of the insights in the 2010 paper by Glorot and Bengio was that\n", - "the vanishing/exploding gradients problems were in part due to a poor\n", - "choice of activation function. Until then most people had assumed that\n", - "if Nature had chosen to use roughly sigmoid activation functions in\n", - "biological neurons, they must be an excellent choice. But it turns out\n", - "that other activation functions behave much better in deep neural\n", - "networks, in particular the ReLU activation function, mostly because\n", - "it does not saturate for positive values (and also because it is quite\n", - "fast to compute)." - ] - }, - { - "cell_type": "markdown", - "id": "bb787cf2", - "metadata": {}, - "source": [ - "## The RELU function family\n", - "\n", - "The ReLU activation function suffers from a problem known as the dying\n", - "ReLUs: during training, some neurons effectively die, meaning they\n", - "stop outputting anything other than 0.\n", - "\n", - "In some cases, you may find that half of your network’s neurons are\n", - "dead, especially if you used a large learning rate. During training,\n", - "if a neuron’s weights get updated such that the weighted sum of the\n", - "neuron’s inputs is negative, it will start outputting 0. When this\n", - "happen, the neuron is unlikely to come back to life since the gradient\n", - "of the ReLU function is 0 when its input is negative." - ] - }, - { - "cell_type": "markdown", - "id": "8d6d8c18", - "metadata": {}, - "source": [ - "## ELU function\n", - "\n", - "To solve this problem, nowadays practitioners use a variant of the\n", - "ReLU function, such as the leaky ReLU discussed above or the so-called\n", - "exponential linear unit (ELU) function" - ] - }, - { - "cell_type": "markdown", - "id": "52c4e6b6", - "metadata": {}, - "source": [ - "$$\n", - "ELU(z) = \\left\\{\\begin{array}{cc} \\alpha\\left( \\exp{(z)}-1\\right) & z < 0,\\\\ z & z \\ge 0.\\end{array}\\right.\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "id": "d0dad2c7", - "metadata": {}, - "source": [ - "## Which activation function should we use?\n", - "\n", - "In general it seems that the ELU activation function is better than\n", - "the leaky ReLU function (and its variants), which is better than\n", - "ReLU. ReLU performs better than $\\tanh$ which in turn performs better\n", - "than the logistic function.\n", - "\n", - "If runtime performance is an issue, then you may opt for the leaky\n", - "ReLU function over the ELU function If you don’t want to tweak yet\n", - "another hyperparameter, you may just use the default $\\alpha$ of\n", - "$0.01$ for the leaky ReLU, and $1$ for ELU. If you have spare time and\n", - "computing power, you can use cross-validation or bootstrap to evaluate\n", - "other activation functions." - ] - }, - { - "cell_type": "markdown", - "id": "31d1148a", - "metadata": {}, - "source": [ - "## More on activation functions, output layers\n", - "\n", - "In most cases you can use the ReLU activation function in the hidden\n", - "layers (or one of its variants).\n", - "\n", - "It is a bit faster to compute than other activation functions, and the\n", - "gradient descent optimization does in general not get stuck.\n", - "\n", - "**For the output layer:**\n", - "\n", - "* For classification the softmax activation function is generally a good choice for classification tasks (when the classes are mutually exclusive).\n", - "\n", - "* For regression tasks, you can simply use no activation function at all." - ] - }, - { - "cell_type": "markdown", - "id": "d6d621a7", - "metadata": {}, - "source": [ - "## Batch Normalization\n", - "\n", - "Batch Normalization aims to address the vanishing/exploding gradients\n", - "problems, and more generally the problem that the distribution of each\n", - "layer’s inputs changes during training, as the parameters of the\n", - "previous layers change.\n", - "\n", - "The technique consists of adding an operation in the model just before\n", - "the activation function of each layer, simply zero-centering and\n", - "normalizing the inputs, then scaling and shifting the result using two\n", - "new parameters per layer (one for scaling, the other for shifting). In\n", - "other words, this operation lets the model learn the optimal scale and\n", - "mean of the inputs for each layer. In order to zero-center and\n", - "normalize the inputs, the algorithm needs to estimate the inputs’ mean\n", - "and standard deviation. It does so by evaluating the mean and standard\n", - "deviation of the inputs over the current mini-batch, from this the\n", - "name batch normalization." - ] - }, - { - "cell_type": "markdown", - "id": "379983d5", - "metadata": {}, - "source": [ - "## Dropout\n", - "\n", - "It is a fairly simple algorithm: at every training step, every neuron\n", - "(including the input neurons but excluding the output neurons) has a\n", - "probability $p$ of being temporarily dropped out, meaning it will be\n", - "entirely ignored during this training step, but it may be active\n", - "during the next step.\n", - "\n", - "The hyperparameter $p$ is called the dropout rate, and it is typically\n", - "set to 50%. After training, the neurons are not dropped anymore. It\n", - "is viewed as one of the most popular regularization techniques." - ] - }, - { - "cell_type": "markdown", - "id": "b769aa51", - "metadata": {}, - "source": [ - "## Gradient Clipping\n", - "\n", - "A popular technique to lessen the exploding gradients problem is to\n", - "simply clip the gradients during backpropagation so that they never\n", - "exceed some threshold (this is mostly useful for recurrent neural\n", - "networks).\n", - "\n", - "This technique is called Gradient Clipping.\n", - "\n", - "In general however, Batch\n", - "Normalization is preferred." - ] - }, - { - "cell_type": "markdown", - "id": "abeef409", - "metadata": {}, - "source": [ - "## A top-down perspective on Neural networks\n", - "\n", - "The first thing we would like to do is divide the data into two or\n", - "three parts. A training set, a validation or dev (development) set,\n", - "and a test set. The test set is the data on which we want to make\n", - "predictions. The dev set is a subset of the training data we use to\n", - "check how well we are doing out-of-sample, after training the model on\n", - "the training dataset. We use the validation error as a proxy for the\n", - "test error in order to make tweaks to our model. It is crucial that we\n", - "do not use any of the test data to train the algorithm. This is a\n", - "cardinal sin in ML. Then:\n", - "\n", - "1. Estimate optimal error rate\n", - "\n", - "2. Minimize underfitting (bias) on training data set.\n", - "\n", - "3. Make sure you are not overfitting." - ] - }, - { - "cell_type": "markdown", - "id": "75165741", - "metadata": {}, - "source": [ - "## More top-down perspectives\n", - "\n", - "If the validation and test sets are drawn from the same distributions,\n", - "then a good performance on the validation set should lead to similarly\n", - "good performance on the test set. \n", - "\n", - "However, sometimes\n", - "the training data and test data differ in subtle ways because, for\n", - "example, they are collected using slightly different methods, or\n", - "because it is cheaper to collect data in one way versus another. In\n", - "this case, there can be a mismatch between the training and test\n", - "data. This can lead to the neural network overfitting these small\n", - "differences between the test and training sets, and a poor performance\n", - "on the test set despite having a good performance on the validation\n", - "set. To rectify this, Andrew Ng suggests making two validation or dev\n", - "sets, one constructed from the training data and one constructed from\n", - "the test data. The difference between the performance of the algorithm\n", - "on these two validation sets quantifies the train-test mismatch. This\n", - "can serve as another important diagnostic when using DNNs for\n", - "supervised learning." - ] - }, - { - "cell_type": "markdown", - "id": "14f22927", - "metadata": {}, - "source": [ - "## Limitations of supervised learning with deep networks\n", - "\n", - "Like all statistical methods, supervised learning using neural\n", - "networks has important limitations. This is especially important when\n", - "one seeks to apply these methods, especially to physics problems. Like\n", - "all tools, DNNs are not a universal solution. Often, the same or\n", - "better performance on a task can be achieved by using a few\n", - "hand-engineered features (or even a collection of random\n", - "features)." - ] - }, - { - "cell_type": "markdown", - "id": "f5ad6d66", - "metadata": {}, - "source": [ - "## Limitations of NNs\n", - "\n", - "Here we list some of the important limitations of supervised neural network based models. \n", - "\n", - "* **Need labeled data**. All supervised learning methods, DNNs for supervised learning require labeled data. Often, labeled data is harder to acquire than unlabeled data (e.g. one must pay for human experts to label images).\n", - "\n", - "* **Supervised neural networks are extremely data intensive.** DNNs are data hungry. They perform best when data is plentiful. This is doubly so for supervised methods where the data must also be labeled. The utility of DNNs is extremely limited if data is hard to acquire or the datasets are small (hundreds to a few thousand samples). In this case, the performance of other methods that utilize hand-engineered features can exceed that of DNNs." - ] - }, - { - "cell_type": "markdown", - "id": "82f3c1c1", - "metadata": {}, - "source": [ - "## Homogeneous data\n", - "\n", - "* **Homogeneous data.** Almost all DNNs deal with homogeneous data of one type. It is very hard to design architectures that mix and match data types (i.e. some continuous variables, some discrete variables, some time series). In applications beyond images, video, and language, this is often what is required. In contrast, ensemble models like random forests or gradient-boosted trees have no difficulty handling mixed data types." - ] - }, - { - "cell_type": "markdown", - "id": "01fba9a0", - "metadata": {}, - "source": [ - "## More limitations\n", - "\n", - "* **Many problems are not about prediction.** In natural science we are often interested in learning something about the underlying distribution that generates the data. In this case, it is often difficult to cast these ideas in a supervised learning setting. While the problems are related, it is possible to make good predictions with a *wrong* model. The model might or might not be useful for understanding the underlying science.\n", - "\n", - "Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems." - ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.18" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/doc/src/week41/.ipynb_checkpoints/week41-checkpoint.ipynb b/doc/src/week41/.ipynb_checkpoints/week41-checkpoint.ipynb new file mode 100644 index 000000000..a70cfa378 --- /dev/null +++ b/doc/src/week41/.ipynb_checkpoints/week41-checkpoint.ipynb @@ -0,0 +1,3812 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "009b0d42", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "77106a5c", + "metadata": { + "editable": true + }, + "source": [ + "# Week 41 Neural networks and constructing a neural network code\n", + "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo, Norway\n", + "\n", + "Date: **Week 41**" + ] + }, + { + "cell_type": "markdown", + "id": "24abde37", + "metadata": { + "editable": true + }, + "source": [ + "## Plan for week 41, October 6-10" + ] + }, + { + "cell_type": "markdown", + "id": "f046f2f8", + "metadata": { + "editable": true + }, + "source": [ + "## Material for the lecture on Monday October 6, 2025\n", + "1. Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model.\n", + "\n", + "2. Building our own Feed-forward Neural Network, getting started\n", + "\n", + "\n", + "\n", + "**Readings and Videos:**\n", + "\n", + "1. These lecture notes\n", + "\n", + "2. For neural networks we recommend Goodfellow et al chapters 6 and 7.\n", + "\n", + "3. Rashkca et al., chapter 11, jupyter-notebook sent separately, from [GitHub](https://github.com/rasbt/machine-learning-book)\n", + "\n", + "a. Neural Networks demystified at \n", + "\n", + "2. Building Neural Networks from scratch at \n", + "\n", + "3. Video on Neural Networks at \n", + "\n", + "4. Video on the back propagation algorithm at \n", + "\n", + "We also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at ." + ] + }, + { + "cell_type": "markdown", + "id": "083a57fa", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematics of deep learning\n", + "\n", + "**Two recent books online.**\n", + "\n", + "1. [The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen](https://arxiv.org/abs/2105.04026), published as [Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022](https://doi.org/10.1017/9781009025096.002)\n", + "\n", + "2. [Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger](https://doi.org/10.48550/arXiv.2310.20360)" + ] + }, + { + "cell_type": "markdown", + "id": "afd44c9c", + "metadata": { + "editable": true + }, + "source": [ + "## Reminder on books with hands-on material and codes\n", + "* [Sebastian Rashcka et al, Machine learning with Sickit-Learn and PyTorch](https://sebastianraschka.com/blog/2022/ml-pytorch-book.html)" + ] + }, + { + "cell_type": "markdown", + "id": "a635e90e", + "metadata": { + "editable": true + }, + "source": [ + "## Lab sessions on Tuesday and Wednesday\n", + "\n", + "1. Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network." + ] + }, + { + "cell_type": "markdown", + "id": "117eee5e", + "metadata": { + "editable": true + }, + "source": [ + "## Lecture Monday October 6" + ] + }, + { + "cell_type": "markdown", + "id": "b17ac07a", + "metadata": { + "editable": true + }, + "source": [ + "## Introduction to Neural networks\n", + "\n", + "Artificial neural networks are computational systems that can learn to\n", + "perform tasks by considering examples, generally without being\n", + "programmed with any task-specific rules. It is supposed to mimic a\n", + "biological system, wherein neurons interact by sending signals in the\n", + "form of mathematical functions between layers. All layers can contain\n", + "an arbitrary number of neurons, and each connection is represented by\n", + "a weight variable." + ] + }, + { + "cell_type": "markdown", + "id": "9fabd88e", + "metadata": { + "editable": true + }, + "source": [ + "## Artificial neurons\n", + "\n", + "The field of artificial neural networks has a long history of\n", + "development, and is closely connected with the advancement of computer\n", + "science and computers in general. A model of artificial neurons was\n", + "first developed by McCulloch and Pitts in 1943 to study signal\n", + "processing in the brain and has later been refined by others. The\n", + "general idea is to mimic neural networks in the human brain, which is\n", + "composed of billions of neurons that communicate with each other by\n", + "sending electrical signals. Each neuron accumulates its incoming\n", + "signals, which must exceed an activation threshold to yield an\n", + "output. If the threshold is not overcome, the neuron remains inactive,\n", + "i.e. has zero output.\n", + "\n", + "This behaviour has inspired a simple mathematical model for an artificial neuron." + ] + }, + { + "cell_type": "markdown", + "id": "4e03559d", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + " y = f\\left(\\sum_{i=1}^n w_ix_i\\right) = f(u)\n", + "\\label{artificialNeuron} \\tag{1}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "797b27ee", + "metadata": { + "editable": true + }, + "source": [ + "Here, the output $y$ of the neuron is the value of its activation function, which have as input\n", + "a weighted sum of signals $x_i, \\dots ,x_n$ received by $n$ other neurons.\n", + "\n", + "Conceptually, it is helpful to divide neural networks into four\n", + "categories:\n", + "1. general purpose neural networks for supervised learning,\n", + "\n", + "2. neural networks designed specifically for image processing, the most prominent example of this class being Convolutional Neural Networks (CNNs),\n", + "\n", + "3. neural networks for sequential data such as Recurrent Neural Networks (RNNs), and\n", + "\n", + "4. neural networks for unsupervised learning such as Deep Boltzmann Machines.\n", + "\n", + "In natural science, DNNs and CNNs have already found numerous\n", + "applications. In statistical physics, they have been applied to detect\n", + "phase transitions in 2D Ising and Potts models, lattice gauge\n", + "theories, and different phases of polymers, or solving the\n", + "Navier-Stokes equation in weather forecasting. Deep learning has also\n", + "found interesting applications in quantum physics. Various quantum\n", + "phase transitions can be detected and studied using DNNs and CNNs,\n", + "topological phases, and even non-equilibrium many-body\n", + "localization. Representing quantum states as DNNs quantum state\n", + "tomography are among some of the impressive achievements to reveal the\n", + "potential of DNNs to facilitate the study of quantum systems.\n", + "\n", + "In quantum information theory, it has been shown that one can perform\n", + "gate decompositions with the help of neural. \n", + "\n", + "The applications are not limited to the natural sciences. There is a\n", + "plethora of applications in essentially all disciplines, from the\n", + "humanities to life science and medicine." + ] + }, + { + "cell_type": "markdown", + "id": "3ac6b2d0", + "metadata": { + "editable": true + }, + "source": [ + "## Neural network types\n", + "\n", + "An artificial neural network (ANN), is a computational model that\n", + "consists of layers of connected neurons, or nodes or units. We will\n", + "refer to these interchangeably as units or nodes, and sometimes as\n", + "neurons.\n", + "\n", + "It is supposed to mimic a biological nervous system by letting each\n", + "neuron interact with other neurons by sending signals in the form of\n", + "mathematical functions between layers. A wide variety of different\n", + "ANNs have been developed, but most of them consist of an input layer,\n", + "an output layer and eventual layers in-between, called *hidden\n", + "layers*. All layers can contain an arbitrary number of nodes, and each\n", + "connection between two nodes is associated with a weight variable.\n", + "\n", + "Neural networks (also called neural nets) are neural-inspired\n", + "nonlinear models for supervised learning. As we will see, neural nets\n", + "can be viewed as natural, more powerful extensions of supervised\n", + "learning methods such as linear and logistic regression and soft-max\n", + "methods we discussed earlier." + ] + }, + { + "cell_type": "markdown", + "id": "58d8729d", + "metadata": { + "editable": true + }, + "source": [ + "## Feed-forward neural networks\n", + "\n", + "The feed-forward neural network (FFNN) was the first and simplest type\n", + "of ANNs that were devised. In this network, the information moves in\n", + "only one direction: forward through the layers.\n", + "\n", + "Nodes are represented by circles, while the arrows display the\n", + "connections between the nodes, including the direction of information\n", + "flow. Additionally, each arrow corresponds to a weight variable\n", + "(figure to come). We observe that each node in a layer is connected\n", + "to *all* nodes in the subsequent layer, making this a so-called\n", + "*fully-connected* FFNN." + ] + }, + { + "cell_type": "markdown", + "id": "7a91bacc", + "metadata": { + "editable": true + }, + "source": [ + "## Convolutional Neural Network\n", + "\n", + "A different variant of FFNNs are *convolutional neural networks*\n", + "(CNNs), which have a connectivity pattern inspired by the animal\n", + "visual cortex. Individual neurons in the visual cortex only respond to\n", + "stimuli from small sub-regions of the visual field, called a receptive\n", + "field. This makes the neurons well-suited to exploit the strong\n", + "spatially local correlation present in natural images. The response of\n", + "each neuron can be approximated mathematically as a convolution\n", + "operation. (figure to come)\n", + "\n", + "Convolutional neural networks emulate the behaviour of neurons in the\n", + "visual cortex by enforcing a *local* connectivity pattern between\n", + "nodes of adjacent layers: Each node in a convolutional layer is\n", + "connected only to a subset of the nodes in the previous layer, in\n", + "contrast to the fully-connected FFNN. Often, CNNs consist of several\n", + "convolutional layers that learn local features of the input, with a\n", + "fully-connected layer at the end, which gathers all the local data and\n", + "produces the outputs. They have wide applications in image and video\n", + "recognition." + ] + }, + { + "cell_type": "markdown", + "id": "811d80fc", + "metadata": { + "editable": true + }, + "source": [ + "## Recurrent neural networks\n", + "\n", + "So far we have only mentioned ANNs where information flows in one\n", + "direction: forward. *Recurrent neural networks* on the other hand,\n", + "have connections between nodes that form directed *cycles*. This\n", + "creates a form of internal memory which are able to capture\n", + "information on what has been calculated before; the output is\n", + "dependent on the previous computations. Recurrent NNs make use of\n", + "sequential information by performing the same task for every element\n", + "in a sequence, where each element depends on previous elements. An\n", + "example of such information is sentences, making recurrent NNs\n", + "especially well-suited for handwriting and speech recognition." + ] + }, + { + "cell_type": "markdown", + "id": "755de74a", + "metadata": { + "editable": true + }, + "source": [ + "## Other types of networks\n", + "\n", + "There are many other kinds of ANNs that have been developed. One type\n", + "that is specifically designed for interpolation in multidimensional\n", + "space is the radial basis function (RBF) network. RBFs are typically\n", + "made up of three layers: an input layer, a hidden layer with\n", + "non-linear radial symmetric activation functions and a linear output\n", + "layer (''linear'' here means that each node in the output layer has a\n", + "linear activation function). The layers are normally fully-connected\n", + "and there are no cycles, thus RBFs can be viewed as a type of\n", + "fully-connected FFNN. They are however usually treated as a separate\n", + "type of NN due the unusual activation functions." + ] + }, + { + "cell_type": "markdown", + "id": "3e5ada1e", + "metadata": { + "editable": true + }, + "source": [ + "## Multilayer perceptrons\n", + "\n", + "One uses often so-called fully-connected feed-forward neural networks\n", + "with three or more layers (an input layer, one or more hidden layers\n", + "and an output layer) consisting of neurons that have non-linear\n", + "activation functions.\n", + "\n", + "Such networks are often called *multilayer perceptrons* (MLPs)." + ] + }, + { + "cell_type": "markdown", + "id": "39a52a85", + "metadata": { + "editable": true + }, + "source": [ + "## Why multilayer perceptrons?\n", + "\n", + "According to the *Universal approximation theorem*, a feed-forward\n", + "neural network with just a single hidden layer containing a finite\n", + "number of neurons can approximate a continuous multidimensional\n", + "function to arbitrary accuracy, assuming the activation function for\n", + "the hidden layer is a **non-constant, bounded and\n", + "monotonically-increasing continuous function**.\n", + "\n", + "Note that the requirements on the activation function only applies to\n", + "the hidden layer, the output nodes are always assumed to be linear, so\n", + "as to not restrict the range of output values." + ] + }, + { + "cell_type": "markdown", + "id": "b6dfa1a1", + "metadata": { + "editable": true + }, + "source": [ + "## Illustration of a single perceptron model and a multi-perceptron model\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1: In a) we show a single perceptron model while in b) we dispay a network with two hidden layers, an input layer and an output layer.

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "7fe70d00", + "metadata": { + "editable": true + }, + "source": [ + "## Mathematics of deep learning and neural networks\n", + "\n", + "Neural networks, in its so-called feed-forward form, where each\n", + "iterations contains a feed-forward stage and a back-propgagation\n", + "stage, consist of series of affine matrix-matrix and matrix-vector\n", + "multiplications. The unknown parameters (the so-called biases and\n", + "weights which deternine the architecture of a neural network), are\n", + "uptaded iteratively using the so-called back-propagation algorithm.\n", + "This algorithm corresponds to the so-called reverse mode of \n", + "automatic differentation." + ] + }, + { + "cell_type": "markdown", + "id": "a6350e9a", + "metadata": { + "editable": true + }, + "source": [ + "## Basics of an NN\n", + "\n", + "A neural network consists of a series of hidden layers, in addition to\n", + "the input and output layers. Each layer $l$ has a set of parameters\n", + "$\\boldsymbol{\\Theta}^{(l)}=(\\boldsymbol{W}^{(l)},\\boldsymbol{b}^{(l)})$ which are related to the\n", + "parameters in other layers through a series of affine transformations,\n", + "for a standard NN these are matrix-matrix and matrix-vector\n", + "multiplications. For all layers we will simply use a collective variable $\\boldsymbol{\\Theta}$.\n", + "\n", + "It consist of two basic steps:\n", + "1. a feed forward stage which takes a given input and produces a final output which is compared with the target values through our cost/loss function.\n", + "\n", + "2. a back-propagation state where the unknown parameters $\\boldsymbol{\\Theta}$ are updated through the optimization of the their gradients. The expressions for the gradients are obtained via the chain rule, starting from the derivative of the cost/function.\n", + "\n", + "These two steps make up one iteration. This iterative process is continued till we reach an eventual stopping criterion." + ] + }, + { + "cell_type": "markdown", + "id": "747e12b0", + "metadata": { + "editable": true + }, + "source": [ + "## Overarching view of a neural network\n", + "\n", + "The architecture of a neural network defines our model. This model\n", + "aims at describing some function $f(\\boldsymbol{x}$ which represents\n", + "some final result (outputs or tagrget values) given a specific inpput\n", + "$\\boldsymbol{x}$. Note that here $\\boldsymbol{y}$ and $\\boldsymbol{x}$ are not limited to be\n", + "vectors.\n", + "\n", + "The architecture consists of\n", + "1. An input and an output layer where the input layer is defined by the inputs $\\boldsymbol{x}$. The output layer produces the model ouput $\\boldsymbol{\\tilde{y}}$ which is compared with the target value $\\boldsymbol{y}$\n", + "\n", + "2. A given number of hidden layers and neurons/nodes/units for each layer (this may vary)\n", + "\n", + "3. A given activation function $\\sigma(\\boldsymbol{z})$ with arguments $\\boldsymbol{z}$ to be defined below. The activation functions may differ from layer to layer.\n", + "\n", + "4. The last layer, normally called **output** layer has normally an activation function tailored to the specific problem\n", + "\n", + "5. Finally we define a so-called cost or loss function which is used to gauge the quality of our model." + ] + }, + { + "cell_type": "markdown", + "id": "854e3306", + "metadata": { + "editable": true + }, + "source": [ + "## The optimization problem\n", + "\n", + "The cost function is a function of the unknown parameters\n", + "$\\boldsymbol{\\Theta}$ where the latter is a container for all possible\n", + "parameters needed to define a neural network\n", + "\n", + "If we are dealing with a regression task a typical cost/loss function\n", + "is the mean squared error" + ] + }, + { + "cell_type": "markdown", + "id": "be6f6f3a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C(\\boldsymbol{\\Theta})=\\frac{1}{n}\\left\\{\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\theta}\\right)^T\\left(\\boldsymbol{y}-\\boldsymbol{X}\\boldsymbol{\\theta}\\right)\\right\\}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6b12c77c", + "metadata": { + "editable": true + }, + "source": [ + "This function represents one of many possible ways to define\n", + "the so-called cost function. Note that here we have assumed a linear dependence in terms of the paramters $\\boldsymbol{\\Theta}$. This is in general not the case." + ] + }, + { + "cell_type": "markdown", + "id": "5b36bfaf", + "metadata": { + "editable": true + }, + "source": [ + "## Parameters of neural networks\n", + "For neural networks the parameters\n", + "$\\boldsymbol{\\Theta}$ are given by the so-called weights and biases (to be\n", + "defined below).\n", + "\n", + "The weights are given by matrix elements $w_{ij}^{(l)}$ where the\n", + "superscript indicates the layer number. The biases are typically given\n", + "by vector elements representing each single node of a given layer,\n", + "that is $b_j^{(l)}$." + ] + }, + { + "cell_type": "markdown", + "id": "4f6a7c65", + "metadata": { + "editable": true + }, + "source": [ + "## Other ingredients of a neural network\n", + "\n", + "Having defined the architecture of a neural network, the optimization\n", + "of the cost function with respect to the parameters $\\boldsymbol{\\Theta}$,\n", + "involves the calculations of gradients and their optimization. The\n", + "gradients represent the derivatives of a multidimensional object and\n", + "are often approximated by various gradient methods, including\n", + "1. various quasi-Newton methods,\n", + "\n", + "2. plain gradient descent (GD) with a constant learning rate $\\eta$,\n", + "\n", + "3. GD with momentum and other approximations to the learning rates such as\n", + "\n", + " * Adapative gradient (ADAgrad)\n", + "\n", + " * Root mean-square propagation (RMSprop)\n", + "\n", + " * Adaptive gradient with momentum (ADAM) and many other\n", + "\n", + "4. Stochastic gradient descent and various families of learning rate approximations" + ] + }, + { + "cell_type": "markdown", + "id": "fa362d11", + "metadata": { + "editable": true + }, + "source": [ + "## Other parameters\n", + "\n", + "In addition to the above, there are often additional hyperparamaters\n", + "which are included in the setup of a neural network. These will be\n", + "discussed below." + ] + }, + { + "cell_type": "markdown", + "id": "be99467f", + "metadata": { + "editable": true + }, + "source": [ + "## Universal approximation theorem\n", + "\n", + "The universal approximation theorem plays a central role in deep\n", + "learning. [Cybenko (1989)](https://link.springer.com/article/10.1007/BF02551274) showed\n", + "the following:\n", + "\n", + "Let $\\sigma$ be any continuous sigmoidal function such that" + ] + }, + { + "cell_type": "markdown", + "id": "a7786a41", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\sigma(z) = \\left\\{\\begin{array}{cc} 1 & z\\rightarrow \\infty\\\\ 0 & z \\rightarrow -\\infty \\end{array}\\right.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "0ee49876", + "metadata": { + "editable": true + }, + "source": [ + "Given a continuous and deterministic function $F(\\boldsymbol{x})$ on the unit\n", + "cube in $d$-dimensions $F\\in [0,1]^d$, $x\\in [0,1]^d$ and a parameter\n", + "$\\epsilon >0$, there is a one-layer (hidden) neural network\n", + "$f(\\boldsymbol{x};\\boldsymbol{\\Theta})$ with $\\boldsymbol{\\Theta}=(\\boldsymbol{W},\\boldsymbol{b})$ and $\\boldsymbol{W}\\in\n", + "\\mathbb{R}^{m\\times n}$ and $\\boldsymbol{b}\\in \\mathbb{R}^{n}$, for which" + ] + }, + { + "cell_type": "markdown", + "id": "5907b6b3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\vert F(\\boldsymbol{x})-f(\\boldsymbol{x};\\boldsymbol{\\Theta})\\vert < \\epsilon \\hspace{0.1cm} \\forall \\boldsymbol{x}\\in[0,1]^d.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f5243715", + "metadata": { + "editable": true + }, + "source": [ + "## Some parallels from real analysis\n", + "\n", + "For those of you familiar with for example the [Stone-Weierstrass\n", + "theorem](https://en.wikipedia.org/wiki/Stone%E2%80%93Weierstrass_theorem)\n", + "for polynomial approximations or the convergence criterion for Fourier\n", + "series, there are similarities in the derivation of the proof for\n", + "neural networks." + ] + }, + { + "cell_type": "markdown", + "id": "3ec7c025", + "metadata": { + "editable": true + }, + "source": [ + "## The approximation theorem in words\n", + "\n", + "**Any continuous function $y=F(\\boldsymbol{x})$ supported on the unit cube in\n", + "$d$-dimensions can be approximated by a one-layer sigmoidal network to\n", + "arbitrary accuracy.**\n", + "\n", + "[Hornik (1991)](https://www.sciencedirect.com/science/article/abs/pii/089360809190009T) extended the theorem by letting any non-constant, bounded activation function to be included using that the expectation value" + ] + }, + { + "cell_type": "markdown", + "id": "00614dd5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbb{E}[\\vert F(\\boldsymbol{x})\\vert^2] =\\int_{\\boldsymbol{x}\\in D} \\vert F(\\boldsymbol{x})\\vert^2p(\\boldsymbol{x})d\\boldsymbol{x} < \\infty.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3e3c5d32", + "metadata": { + "editable": true + }, + "source": [ + "Then we have" + ] + }, + { + "cell_type": "markdown", + "id": "3d292016", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\mathbb{E}[\\vert F(\\boldsymbol{x})-f(\\boldsymbol{x};\\boldsymbol{\\Theta})\\vert^2] =\\int_{\\boldsymbol{x}\\in D} \\vert F(\\boldsymbol{x})-f(\\boldsymbol{x};\\boldsymbol{\\Theta})\\vert^2p(\\boldsymbol{x})d\\boldsymbol{x} < \\epsilon.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ffccfb34", + "metadata": { + "editable": true + }, + "source": [ + "## More on the general approximation theorem\n", + "\n", + "None of the proofs give any insight into the relation between the\n", + "number of of hidden layers and nodes and the approximation error\n", + "$\\epsilon$, nor the magnitudes of $\\boldsymbol{W}$ and $\\boldsymbol{b}$.\n", + "\n", + "Neural networks (NNs) have what we may call a kind of universality no matter what function we want to compute.\n", + "\n", + "It does not mean that an NN can be used to exactly compute any function. Rather, we get an approximation that is as good as we want." + ] + }, + { + "cell_type": "markdown", + "id": "18364a7b", + "metadata": { + "editable": true + }, + "source": [ + "## Class of functions we can approximate\n", + "\n", + "The class of functions that can be approximated are the continuous ones.\n", + "If the function $F(\\boldsymbol{x})$ is discontinuous, it won't in general be possible to approximate it. However, an NN may still give an approximation even if we fail in some points." + ] + }, + { + "cell_type": "markdown", + "id": "4ff3f75c", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the equations for a neural network\n", + "\n", + "The questions we want to ask are how do changes in the biases and the\n", + "weights in our network change the cost function and how can we use the\n", + "final output to modify the weights and biases?\n", + "\n", + "To derive these equations let us start with a plain regression problem\n", + "and define our cost function as" + ] + }, + { + "cell_type": "markdown", + "id": "e2110836", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "{\\cal C}(\\boldsymbol{\\Theta}) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - \\tilde{y}_i\\right)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "86b8cfca", + "metadata": { + "editable": true + }, + "source": [ + "where the $y_i$s are our $n$ targets (the values we want to\n", + "reproduce), while the outputs of the network after having propagated\n", + "all inputs $\\boldsymbol{x}$ are given by $\\boldsymbol{\\tilde{y}}_i$." + ] + }, + { + "cell_type": "markdown", + "id": "6accc6fd", + "metadata": { + "editable": true + }, + "source": [ + "## Layout of a neural network with three hidden layers\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "a7658d1e", + "metadata": { + "editable": true + }, + "source": [ + "## Definitions\n", + "\n", + "With our definition of the targets $\\boldsymbol{y}$, the outputs of the\n", + "network $\\boldsymbol{\\tilde{y}}$ and the inputs $\\boldsymbol{x}$ we\n", + "define now the activation $z_j^l$ of node/neuron/unit $j$ of the\n", + "$l$-th layer as a function of the bias, the weights which add up from\n", + "the previous layer $l-1$ and the forward passes/outputs\n", + "$\\hat{a}^{l-1}$ from the previous layer as" + ] + }, + { + "cell_type": "markdown", + "id": "5c32377f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_j^l = \\sum_{i=1}^{M_{l-1}}w_{ij}^la_i^{l-1}+b_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "fe50869b", + "metadata": { + "editable": true + }, + "source": [ + "where $b_k^l$ are the biases from layer $l$. Here $M_{l-1}$\n", + "represents the total number of nodes/neurons/units of layer $l-1$. The\n", + "figure in the whiteboard notes illustrates this equation. We can rewrite this in a more\n", + "compact form as the matrix-vector products we discussed earlier," + ] + }, + { + "cell_type": "markdown", + "id": "ebaa515a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\hat{z}^l = \\left(\\hat{W}^l\\right)^T\\hat{a}^{l-1}+\\hat{b}^l.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "796833f6", + "metadata": { + "editable": true + }, + "source": [ + "## Inputs to the activation function\n", + "\n", + "With the activation values $\\boldsymbol{z}^l$ we can in turn define the\n", + "output of layer $l$ as $\\boldsymbol{a}^l = f(\\boldsymbol{z}^l)$ where $f$ is our\n", + "activation function. In the examples here we will use the sigmoid\n", + "function discussed in our logistic regression lectures. We will also use the same activation function $f$ for all layers\n", + "and their nodes. It means we have" + ] + }, + { + "cell_type": "markdown", + "id": "ee384d06", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a_j^l = \\sigma(z_j^l) = \\frac{1}{1+\\exp{-(z_j^l)}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "27fdce89", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives and the chain rule\n", + "\n", + "From the definition of the activation $z_j^l$ we have" + ] + }, + { + "cell_type": "markdown", + "id": "20c880e6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z_j^l}{\\partial w_{ij}^l} = a_i^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9c0f588a", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "4967d9dc", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z_j^l}{\\partial a_i^{l-1}} = w_{ji}^l.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e16de9db", + "metadata": { + "editable": true + }, + "source": [ + "With our definition of the activation function we have that (note that this function depends only on $z_j^l$)" + ] + }, + { + "cell_type": "markdown", + "id": "f8640493", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a_j^l}{\\partial z_j^{l}} = a_j^l(1-a_j^l)=\\sigma(z_j^l)(1-\\sigma(z_j^l)).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9aa93ac0", + "metadata": { + "editable": true + }, + "source": [ + "## Derivative of the cost function\n", + "\n", + "With these definitions we can now compute the derivative of the cost function in terms of the weights.\n", + "\n", + "Let us specialize to the output layer $l=L$. Our cost function is" + ] + }, + { + "cell_type": "markdown", + "id": "14cc2a9c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "{\\cal C}(\\boldsymbol{\\Theta}^L) = \\frac{1}{2}\\sum_{i=1}^n\\left(y_i - \\tilde{y}_i\\right)^2=\\frac{1}{2}\\sum_{i=1}^n\\left(a_i^L - y_i\\right)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "0cfa4223", + "metadata": { + "editable": true + }, + "source": [ + "The derivative of this function with respect to the weights is" + ] + }, + { + "cell_type": "markdown", + "id": "9c28ca56", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}(\\boldsymbol{\\Theta}^L)}{\\partial w_{jk}^L} = \\left(a_j^L - y_j\\right)\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "75fc65a8", + "metadata": { + "editable": true + }, + "source": [ + "The last partial derivative can easily be computed and reads (by applying the chain rule)" + ] + }, + { + "cell_type": "markdown", + "id": "6fa982ac", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a_j^L}{\\partial w_{jk}^{L}} = \\frac{\\partial a_j^L}{\\partial z_{j}^{L}}\\frac{\\partial z_j^L}{\\partial w_{jk}^{L}}=a_j^L(1-a_j^L)a_k^{L-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c491c9c5", + "metadata": { + "editable": true + }, + "source": [ + "## Simpler examples first, and automatic differentiation\n", + "\n", + "In order to understand the back propagation algorithm and its\n", + "derivation (an implementation of the chain rule), let us first digress\n", + "with some simple examples. These examples are also meant to motivate\n", + "the link with back propagation and [automatic differentiation](https://en.wikipedia.org/wiki/Automatic_differentiation). We will discuss these topics next week (week 42)." + ] + }, + { + "cell_type": "markdown", + "id": "45521d36", + "metadata": { + "editable": true + }, + "source": [ + "## Reminder on the chain rule and gradients\n", + "\n", + "If we have a multivariate function $f(x,y)$ where $x=x(t)$ and $y=y(t)$ are functions of a variable $t$, we have that the gradient of $f$ with respect to $t$ (without the explicit unit vector components)" + ] + }, + { + "cell_type": "markdown", + "id": "12a8d1db", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{dt} = \\begin{bmatrix}\\frac{\\partial f}{\\partial x} & \\frac{\\partial f}{\\partial y} \\end{bmatrix} \\begin{bmatrix}\\frac{\\partial x}{\\partial t} \\\\ \\frac{\\partial y}{\\partial t} \\end{bmatrix}=\\frac{\\partial f}{\\partial x} \\frac{\\partial x}{\\partial t} +\\frac{\\partial f}{\\partial y} \\frac{\\partial y}{\\partial t}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "aee14a46", + "metadata": { + "editable": true + }, + "source": [ + "## Multivariable functions\n", + "\n", + "If we have a multivariate function $f(x,y)$ where $x=x(t,s)$ and $y=y(t,s)$ are functions of the variables $t$ and $s$, we have that the partial derivatives" + ] + }, + { + "cell_type": "markdown", + "id": "2ada2272", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial s}=\\frac{\\partial f}{\\partial x}\\frac{\\partial x}{\\partial s}+\\frac{\\partial f}{\\partial y}\\frac{\\partial y}{\\partial s},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4e8672d5", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "fdb8ac89", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial t}=\\frac{\\partial f}{\\partial x}\\frac{\\partial x}{\\partial t}+\\frac{\\partial f}{\\partial y}\\frac{\\partial y}{\\partial t}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "984afcbb", + "metadata": { + "editable": true + }, + "source": [ + "the gradient of $f$ with respect to $t$ and $s$ (without the explicit unit vector components)" + ] + }, + { + "cell_type": "markdown", + "id": "6351b89c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{d(s,t)} = \\begin{bmatrix}\\frac{\\partial f}{\\partial x} & \\frac{\\partial f}{\\partial y} \\end{bmatrix} \\begin{bmatrix}\\frac{\\partial x}{\\partial s} &\\frac{\\partial x}{\\partial t} \\\\ \\frac{\\partial y}{\\partial s} & \\frac{\\partial y}{\\partial t} \\end{bmatrix}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "30614241", + "metadata": { + "editable": true + }, + "source": [ + "## Automatic differentiation through examples\n", + "\n", + "A great introduction to automatic differentiation is given by Baydin et al., see .\n", + "See also the video at .\n", + "\n", + "Automatic differentiation is a represented by a repeated application\n", + "of the chain rule on well-known functions and allows for the\n", + "calculation of derivatives to numerical precision. It is not the same\n", + "as the calculation of symbolic derivatives via for example SymPy, nor\n", + "does it use approximative formulae based on Taylor-expansions of a\n", + "function around a given value. The latter are error prone due to\n", + "truncation errors and values of the step size $\\Delta$." + ] + }, + { + "cell_type": "markdown", + "id": "2b01a0a0", + "metadata": { + "editable": true + }, + "source": [ + "## Simple example\n", + "\n", + "Our first example is rather simple," + ] + }, + { + "cell_type": "markdown", + "id": "f46c4ff5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) =\\exp{x^2},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3b14ab20", + "metadata": { + "editable": true + }, + "source": [ + "with derivative" + ] + }, + { + "cell_type": "markdown", + "id": "367488fb", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f'(x) =2x\\exp{x^2}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "449e3f42", + "metadata": { + "editable": true + }, + "source": [ + "We can use SymPy to extract the pertinent lines of Python code through the following simple example" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "96bfacee", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "from __future__ import division\n", + "from sympy import *\n", + "x = symbols('x')\n", + "expr = exp(x*x)\n", + "simplify(expr)\n", + "derivative = diff(expr,x)\n", + "print(python(expr))\n", + "print(python(derivative))" + ] + }, + { + "cell_type": "markdown", + "id": "72314ab1", + "metadata": { + "editable": true + }, + "source": [ + "## Smarter way of evaluating the above function\n", + "If we study this function, we note that we can reduce the number of operations by introducing an intermediate variable" + ] + }, + { + "cell_type": "markdown", + "id": "73ac0b1e", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a = x^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e4f9a39e", + "metadata": { + "editable": true + }, + "source": [ + "leading to" + ] + }, + { + "cell_type": "markdown", + "id": "d7862e63", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) = f(a(x)) = b= \\exp{a}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "125aa92f", + "metadata": { + "editable": true + }, + "source": [ + "We now assume that all operations can be counted in terms of equal\n", + "floating point operations. This means that in order to calculate\n", + "$f(x)$ we need first to square $x$ and then compute the exponential. We\n", + "have thus two floating point operations only." + ] + }, + { + "cell_type": "markdown", + "id": "4191307d", + "metadata": { + "editable": true + }, + "source": [ + "## Reducing the number of operations\n", + "\n", + "With the introduction of a precalculated quantity $a$ and thereby $f(x)$ we have that the derivative can be written as" + ] + }, + { + "cell_type": "markdown", + "id": "2bde847d", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f'(x) = 2xb,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "83266d60", + "metadata": { + "editable": true + }, + "source": [ + "which reduces the number of operations from four in the orginal\n", + "expression to two. This means that if we need to compute $f(x)$ and\n", + "its derivative (a common task in optimizations), we have reduced the\n", + "number of operations from six to four in total.\n", + "\n", + "**Note** that the usage of a symbolic software like SymPy does not\n", + "include such simplifications and the calculations of the function and\n", + "the derivatives yield in general more floating point operations." + ] + }, + { + "cell_type": "markdown", + "id": "c5a7fbff", + "metadata": { + "editable": true + }, + "source": [ + "## Chain rule, forward and reverse modes\n", + "\n", + "In the above example we have introduced the variables $a$ and $b$, and our function is" + ] + }, + { + "cell_type": "markdown", + "id": "b2fe2411", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) = f(a(x)) = b= \\exp{a},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "67b6afd2", + "metadata": { + "editable": true + }, + "source": [ + "with $a=x^2$. We can decompose the derivative of $f$ with respect to $x$ as" + ] + }, + { + "cell_type": "markdown", + "id": "c3c09fb8", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{dx}=\\frac{df}{db}\\frac{db}{da}\\frac{da}{dx}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a327ede6", + "metadata": { + "editable": true + }, + "source": [ + "We note that since $b=f(x)$ that" + ] + }, + { + "cell_type": "markdown", + "id": "0883434b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{db}=1,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "29f6a2bd", + "metadata": { + "editable": true + }, + "source": [ + "leading to" + ] + }, + { + "cell_type": "markdown", + "id": "dee0077a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{dx}=\\frac{db}{da}\\frac{da}{dx}=2x\\exp{x^2},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8da19ed0", + "metadata": { + "editable": true + }, + "source": [ + "as before." + ] + }, + { + "cell_type": "markdown", + "id": "07a932a6", + "metadata": { + "editable": true + }, + "source": [ + "## Forward and reverse modes\n", + "\n", + "We have that" + ] + }, + { + "cell_type": "markdown", + "id": "fb1d92ff", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{dx}=\\frac{df}{db}\\frac{db}{da}\\frac{da}{dx},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c8cae913", + "metadata": { + "editable": true + }, + "source": [ + "which we can rewrite either as" + ] + }, + { + "cell_type": "markdown", + "id": "88a96c22", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{dx}=\\left[\\frac{df}{db}\\frac{db}{da}\\right]\\frac{da}{dx},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "96c7a8cf", + "metadata": { + "editable": true + }, + "source": [ + "or" + ] + }, + { + "cell_type": "markdown", + "id": "980f3549", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{df}{dx}=\\frac{df}{db}\\left[\\frac{db}{da}\\frac{da}{dx}\\right].\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "11087f75", + "metadata": { + "editable": true + }, + "source": [ + "The first expression is called reverse mode (or back propagation)\n", + "since we start by evaluating the derivatives at the end point and then\n", + "propagate backwards. This is the standard way of evaluating\n", + "derivatives (gradients) when optimizing the parameters of a neural\n", + "network. In the context of deep learning this is computationally\n", + "more efficient since the output of a neural network consists of either\n", + "one or some few other output variables.\n", + "\n", + "The second equation defines the so-called **forward mode**." + ] + }, + { + "cell_type": "markdown", + "id": "8f7ada68", + "metadata": { + "editable": true + }, + "source": [ + "## More complicated function\n", + "\n", + "We increase our ambitions and introduce a slightly more complicated function" + ] + }, + { + "cell_type": "markdown", + "id": "b6572672", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f(x) =\\sqrt{x^2+exp{x^2}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "34890dca", + "metadata": { + "editable": true + }, + "source": [ + "with derivative" + ] + }, + { + "cell_type": "markdown", + "id": "885dcf45", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "f'(x) =\\frac{x(1+\\exp{x^2})}{\\sqrt{x^2+exp{x^2}}}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "eb519077", + "metadata": { + "editable": true + }, + "source": [ + "The corresponding SymPy code reads" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "041e5116", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "from __future__ import division\n", + "from sympy import *\n", + "x = symbols('x')\n", + "expr = sqrt(x*x+exp(x*x))\n", + "simplify(expr)\n", + "derivative = diff(expr,x)\n", + "print(python(expr))\n", + "print(python(derivative))" + ] + }, + { + "cell_type": "markdown", + "id": "5ee38441", + "metadata": { + "editable": true + }, + "source": [ + "## Counting the number of floating point operations\n", + "\n", + "A simple count of operations shows that we need five operations for\n", + "the function itself and ten for the derivative. Fifteen operations in total if we wish to proceed with the above codes.\n", + "\n", + "Can we reduce this to\n", + "say half the number of operations?" + ] + }, + { + "cell_type": "markdown", + "id": "f0aa3e89", + "metadata": { + "editable": true + }, + "source": [ + "## Defining intermediate operations\n", + "\n", + "We can indeed reduce the number of operation to half of those listed in the brute force approach above.\n", + "We define the following quantities" + ] + }, + { + "cell_type": "markdown", + "id": "7ee15116", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a = x^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "816deb1e", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "fc1687f8", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b = \\exp{x^2} = \\exp{a},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6903e979", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "7ce8c2e9", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "c= a+b,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7c5a40b4", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "9dece790", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "d=f(x)=\\sqrt{c}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6c7469b5", + "metadata": { + "editable": true + }, + "source": [ + "## New expression for the derivative\n", + "\n", + "With these definitions we obtain the following partial derivatives" + ] + }, + { + "cell_type": "markdown", + "id": "660e5353", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial a}{\\partial x} = 2x,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d310327e", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "1455ef65", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial b}{\\partial a} = \\exp{a},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b8baab0b", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "9212114c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial c}{\\partial a} = 1,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8afc58ba", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "b09e58b3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial c}{\\partial b} = 1,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c1985faf", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "a3a8ead6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial d}{\\partial c} = \\frac{1}{2\\sqrt{c}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ea8b9183", + "metadata": { + "editable": true + }, + "source": [ + "and finally" + ] + }, + { + "cell_type": "markdown", + "id": "a1a3d3e6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial d} = 1.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c4c7699a", + "metadata": { + "editable": true + }, + "source": [ + "## Final derivatives\n", + "Our final derivatives are thus" + ] + }, + { + "cell_type": "markdown", + "id": "f8796867", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial c} = \\frac{\\partial f}{\\partial d} \\frac{\\partial d}{\\partial c} = \\frac{1}{2\\sqrt{c}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7696682f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial b} = \\frac{\\partial f}{\\partial c} \\frac{\\partial c}{\\partial b} = \\frac{1}{2\\sqrt{c}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c255369f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial a} = \\frac{\\partial f}{\\partial c} \\frac{\\partial c}{\\partial a}+\n", + "\\frac{\\partial f}{\\partial b} \\frac{\\partial b}{\\partial a} = \\frac{1+\\exp{a}}{2\\sqrt{c}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "fb3583a2", + "metadata": { + "editable": true + }, + "source": [ + "and finally" + ] + }, + { + "cell_type": "markdown", + "id": "6e85c1f8", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial x} = \\frac{\\partial f}{\\partial a} \\frac{\\partial a}{\\partial x} = \\frac{x(1+\\exp{a})}{\\sqrt{c}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1d674382", + "metadata": { + "editable": true + }, + "source": [ + "which is just" + ] + }, + { + "cell_type": "markdown", + "id": "64dc7923", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial x} = \\frac{x(1+b)}{d},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "143ed6f6", + "metadata": { + "editable": true + }, + "source": [ + "and requires only three operations if we can reuse all intermediate variables." + ] + }, + { + "cell_type": "markdown", + "id": "df28a5cc", + "metadata": { + "editable": true + }, + "source": [ + "## In general not this simple\n", + "\n", + "In general, see the generalization below, unless we can obtain simple\n", + "analytical expressions which we can simplify further, the final\n", + "implementation of automatic differentiation involves repeated\n", + "calculations (and thereby operations) of derivatives of elementary\n", + "functions." + ] + }, + { + "cell_type": "markdown", + "id": "8fc17c97", + "metadata": { + "editable": true + }, + "source": [ + "## Automatic differentiation\n", + "\n", + "We can make this example more formal. Automatic differentiation is a\n", + "formalization of the previous example (see graph).\n", + "\n", + "We define $\\boldsymbol{x}\\in x_1,\\dots, x_l$ input variables to a given function $f(\\boldsymbol{x})$ and $x_{l+1},\\dots, x_L$ intermediate variables.\n", + "\n", + "In the above example we have only one input variable, $l=1$ and four intermediate variables, that is" + ] + }, + { + "cell_type": "markdown", + "id": "c98c6269", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{bmatrix} x_1=x & x_2 = x^2=a & x_3 =\\exp{a}= b & x_4=c=a+b & x_5 = \\sqrt{c}=d \\end{bmatrix}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "51e1f13d", + "metadata": { + "editable": true + }, + "source": [ + "Furthemore, for $i=l+1, \\dots, L$ (here $i=2,3,4,5$ and $f=x_L=d$), we\n", + "define the elementary functions $g_i(x_{Pa(x_i)})$ where $x_{Pa(x_i)}$ are the parent nodes of the variable $x_i$.\n", + "\n", + "In our case, we have for example for $x_3=g_3(x_{Pa(x_i)})=\\exp{a}$, that $g_3=\\exp{()}$ and $x_{Pa(x_3)}=a$." + ] + }, + { + "cell_type": "markdown", + "id": "3051afb8", + "metadata": { + "editable": true + }, + "source": [ + "## Chain rule\n", + "\n", + "We can now compute the gradients by back-propagating the derivatives using the chain rule.\n", + "We have defined" + ] + }, + { + "cell_type": "markdown", + "id": "3b0d12f5", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial x_L} = 1,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d6416f6d", + "metadata": { + "editable": true + }, + "source": [ + "which allows us to find the derivatives of the various variables $x_i$ as" + ] + }, + { + "cell_type": "markdown", + "id": "d82132f6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial f}{\\partial x_i} = \\sum_{x_j:x_i\\in Pa(x_j)}\\frac{\\partial f}{\\partial x_j} \\frac{\\partial x_j}{\\partial x_i}=\\sum_{x_j:x_i\\in Pa(x_j)}\\frac{\\partial f}{\\partial x_j} \\frac{\\partial g_j}{\\partial x_i}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a2cc1519", + "metadata": { + "editable": true + }, + "source": [ + "Whenever we have a function which can be expressed as a computation\n", + "graph and the various functions can be expressed in terms of\n", + "elementary functions that are differentiable, then automatic\n", + "differentiation works. The functions may not need to be elementary\n", + "functions, they could also be computer programs, although not all\n", + "programs can be automatically differentiated." + ] + }, + { + "cell_type": "markdown", + "id": "15dec134", + "metadata": { + "editable": true + }, + "source": [ + "## First network example, simple percepetron with one input\n", + "\n", + "As yet another example we define now a simple perceptron model with\n", + "all quantities given by scalars. We consider only one input variable\n", + "$x$ and one target value $y$. We define an activation function\n", + "$\\sigma_1$ which takes as input" + ] + }, + { + "cell_type": "markdown", + "id": "4e82fa87", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_1 = w_1x+b_1,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ef7fc3e0", + "metadata": { + "editable": true + }, + "source": [ + "where $w_1$ is the weight and $b_1$ is the bias. These are the\n", + "parameters we want to optimize. The output is $a_1=\\sigma(z_1)$ (see\n", + "graph from whiteboard notes). This output is then fed into the\n", + "**cost/loss** function, which we here for the sake of simplicity just\n", + "define as the squared error" + ] + }, + { + "cell_type": "markdown", + "id": "36cd8975", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C(x;w_1,b_1)=\\frac{1}{2}(a_1-y)^2.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "506df9e4", + "metadata": { + "editable": true + }, + "source": [ + "## Layout of a simple neural network with no hidden layer\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "29010edf", + "metadata": { + "editable": true + }, + "source": [ + "## Optimizing the parameters\n", + "\n", + "In setting up the feed forward and back propagation parts of the\n", + "algorithm, we need now the derivative of the various variables we want\n", + "to train.\n", + "\n", + "We need" + ] + }, + { + "cell_type": "markdown", + "id": "a711c13b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_1} \\hspace{0.1cm}\\mathrm{and}\\hspace{0.1cm}\\frac{\\partial C}{\\partial b_1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d3f80d27", + "metadata": { + "editable": true + }, + "source": [ + "Using the chain rule we find" + ] + }, + { + "cell_type": "markdown", + "id": "5b9125a4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_1}=\\frac{\\partial C}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial w_1}=(a_1-y)\\sigma_1'x,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "eb0f2a16", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "2ce24758", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial b_1}=\\frac{\\partial C}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial b_1}=(a_1-y)\\sigma_1',\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4b607868", + "metadata": { + "editable": true + }, + "source": [ + "which we later will just define as" + ] + }, + { + "cell_type": "markdown", + "id": "3f2688b3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}=\\delta_1.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "83bef901", + "metadata": { + "editable": true + }, + "source": [ + "## Adding a hidden layer\n", + "\n", + "We change our simple model to (see graph)\n", + "a network with just one hidden layer but with scalar variables only.\n", + "\n", + "Our output variable changes to $a_2$ and $a_1$ is now the output from the hidden node and $a_0=x$.\n", + "We have then" + ] + }, + { + "cell_type": "markdown", + "id": "364b5f09", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_1 = w_1a_0+b_1 \\hspace{0.1cm} \\wedge a_1 = \\sigma_1(z_1),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "38288d5b", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_2 = w_2a_1+b_2 \\hspace{0.1cm} \\wedge a_2 = \\sigma_2(z_2),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b69ebeb8", + "metadata": { + "editable": true + }, + "source": [ + "and the cost function" + ] + }, + { + "cell_type": "markdown", + "id": "a1c64c16", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "C(x;\\boldsymbol{\\Theta})=\\frac{1}{2}(a_2-y)^2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "78f802ec", + "metadata": { + "editable": true + }, + "source": [ + "with $\\boldsymbol{\\Theta}=[w_1,w_2,b_1,b_2]$." + ] + }, + { + "cell_type": "markdown", + "id": "502934b1", + "metadata": { + "editable": true + }, + "source": [ + "## Layout of a simple neural network with one hidden layer\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "2c4fcdd6", + "metadata": { + "editable": true + }, + "source": [ + "## The derivatives\n", + "\n", + "The derivatives are now, using the chain rule again" + ] + }, + { + "cell_type": "markdown", + "id": "6cc539fa", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_2}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial w_2}=(a_2-y)\\sigma_2'a_1=\\delta_2a_1,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "12891d80", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial b_2}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial b_2}=(a_2-y)\\sigma_2'=\\delta_2,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "81ea70b8", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_1}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial w_1}=(a_2-y)\\sigma_2'a_1\\sigma_1'a_0,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "7861d7fc", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial b_1}=\\frac{\\partial C}{\\partial a_2}\\frac{\\partial a_2}{\\partial z_2}\\frac{\\partial z_2}{\\partial a_1}\\frac{\\partial a_1}{\\partial z_1}\\frac{\\partial z_1}{\\partial b_1}=(a_2-y)\\sigma_2'\\sigma_1'=\\delta_1.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bfd3cdb5", + "metadata": { + "editable": true + }, + "source": [ + "Can you generalize this to more than one hidden layer?" + ] + }, + { + "cell_type": "markdown", + "id": "900caec3", + "metadata": { + "editable": true + }, + "source": [ + "## Important observations\n", + "\n", + "From the above equations we see that the derivatives of the activation\n", + "functions play a central role. If they vanish, the training may\n", + "stop. This is called the vanishing gradient problem, see discussions below. If they become\n", + "large, the parameters $w_i$ and $b_i$ may simply go to infinity. This\n", + "is referenced as the exploding gradient problem." + ] + }, + { + "cell_type": "markdown", + "id": "68cde135", + "metadata": { + "editable": true + }, + "source": [ + "## The training\n", + "\n", + "The training of the parameters is done through various gradient descent approximations with" + ] + }, + { + "cell_type": "markdown", + "id": "7be0563a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{i}\\leftarrow w_{i}- \\eta \\delta_i a_{i-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a59fe19e", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "8d0b13ca", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_i \\leftarrow b_i-\\eta \\delta_i,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "00f9304b", + "metadata": { + "editable": true + }, + "source": [ + "with $\\eta$ is the learning rate.\n", + "\n", + "One iteration consists of one feed forward step and one back-propagation step. Each back-propagation step does one update of the parameters $\\boldsymbol{\\Theta}$.\n", + "\n", + "For the first hidden layer $a_{i-1}=a_0=x$ for this simple model." + ] + }, + { + "cell_type": "markdown", + "id": "6f93d071", + "metadata": { + "editable": true + }, + "source": [ + "## Code example\n", + "\n", + "The code here implements the above model with one hidden layer and\n", + "scalar variables for the same function we studied in the previous\n", + "example. The code is however set up so that we can add multiple\n", + "inputs $x$ and target values $y$. Note also that we have the\n", + "possibility of defining a feature matrix $\\boldsymbol{X}$ with more than just\n", + "one column for the input values. This will turn useful in our next example. We have also defined matrices and vectors for all of our operations although it is not necessary here." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a9f388a5", + "metadata": { + "collapsed": false, + "editable": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "# We use the Sigmoid function as activation function\n", + "def sigmoid(z):\n", + " return 1.0/(1.0+np.exp(-z))\n", + "\n", + "def forwardpropagation(x):\n", + " # weighted sum of inputs to the hidden layer\n", + " z_1 = np.matmul(x, w_1) + b_1\n", + " # activation in the hidden layer\n", + " a_1 = sigmoid(z_1)\n", + " # weighted sum of inputs to the output layer\n", + " z_2 = np.matmul(a_1, w_2) + b_2\n", + " a_2 = z_2\n", + " return a_1, a_2\n", + "\n", + "def backpropagation(x, y):\n", + " a_1, a_2 = forwardpropagation(x)\n", + " # parameter delta for the output layer, note that a_2=z_2 and its derivative wrt z_2 is just 1\n", + " delta_2 = a_2 - y\n", + " print(0.5*((a_2-y)**2))\n", + " # delta for the hidden layer\n", + " delta_1 = np.matmul(delta_2, w_2.T) * a_1 * (1 - a_1)\n", + " # gradients for the output layer\n", + " output_weights_gradient = np.matmul(a_1.T, delta_2)\n", + " output_bias_gradient = np.sum(delta_2, axis=0)\n", + " # gradient for the hidden layer\n", + " hidden_weights_gradient = np.matmul(x.T, delta_1)\n", + " hidden_bias_gradient = np.sum(delta_1, axis=0)\n", + " return output_weights_gradient, output_bias_gradient, hidden_weights_gradient, hidden_bias_gradient\n", + "\n", + "\n", + "# ensure the same random numbers appear every time\n", + "np.random.seed(0)\n", + "# Input variable\n", + "x = np.array([4.0],dtype=np.float64)\n", + "# Target values\n", + "y = 2*x+1.0 \n", + "\n", + "# Defining the neural network, only scalars here\n", + "n_inputs = x.shape\n", + "n_features = 1\n", + "n_hidden_neurons = 1\n", + "n_outputs = 1\n", + "\n", + "# Initialize the network\n", + "# weights and bias in the hidden layer\n", + "w_1 = np.random.randn(n_features, n_hidden_neurons)\n", + "b_1 = np.zeros(n_hidden_neurons) + 0.01\n", + "\n", + "# weights and bias in the output layer\n", + "w_2 = np.random.randn(n_hidden_neurons, n_outputs)\n", + "b_2 = np.zeros(n_outputs) + 0.01\n", + "\n", + "eta = 0.1\n", + "for i in range(50):\n", + " # calculate gradients\n", + " derivW2, derivB2, derivW1, derivB1 = backpropagation(x, y)\n", + " # update weights and biases\n", + " w_2 -= eta * derivW2\n", + " b_2 -= eta * derivB2\n", + " w_1 -= eta * derivW1\n", + " b_1 -= eta * derivB1" + ] + }, + { + "cell_type": "markdown", + "id": "2b757e0a", + "metadata": { + "editable": true + }, + "source": [ + "We see that after some few iterations (the results do depend on the learning rate however), we get an error which is rather small." + ] + }, + { + "cell_type": "markdown", + "id": "a746f529", + "metadata": { + "editable": true + }, + "source": [ + "## Exercise 1: Including more data\n", + "\n", + "Try to increase the amount of input and\n", + "target/output data. Try also to perform calculations for more values\n", + "of the learning rates. Feel free to add either hyperparameters with an\n", + "$l_1$ norm or an $l_2$ norm and discuss your results.\n", + "Discuss your results as functions of the amount of training data and various learning rates.\n", + "\n", + "**Challenge:** Try to change the activation functions and replace the hard-coded analytical expressions with automatic derivation via either **autograd** or **JAX**." + ] + }, + { + "cell_type": "markdown", + "id": "ec8820f7", + "metadata": { + "editable": true + }, + "source": [ + "## Simple neural network and the back propagation equations\n", + "\n", + "Let us now try to increase our level of ambition and attempt at setting \n", + "up the equations for a neural network with two input nodes, one hidden\n", + "layer with two hidden nodes and one output layer with one output node/neuron only (see graph)..\n", + "\n", + "We need to define the following parameters and variables with the input layer (layer $(0)$) \n", + "where we label the nodes $x_0$ and $x_1$" + ] + }, + { + "cell_type": "markdown", + "id": "75eb95db", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "x_0 = a_0^{(0)} \\wedge x_1 = a_1^{(0)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "105d8a64", + "metadata": { + "editable": true + }, + "source": [ + "The hidden layer (layer $(1)$) has nodes which yield the outputs $a_0^{(1)}$ and $a_1^{(1)}$) with weight $\\boldsymbol{w}$ and bias $\\boldsymbol{b}$ parameters" + ] + }, + { + "cell_type": "markdown", + "id": "2818bd8c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{ij}^{(1)}=\\left\\{w_{00}^{(1)},w_{01}^{(1)},w_{10}^{(1)},w_{11}^{(1)}\\right\\} \\wedge b^{(1)}=\\left\\{b_0^{(1)},b_1^{(1)}\\right\\}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "66e9f0bf", + "metadata": { + "editable": true + }, + "source": [ + "## Layout of a simple neural network with two input nodes, one hidden layer and one output node\n", + "\n", + "\n", + "\n", + "\n", + "

Figure 1:

\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "dcbddb2f", + "metadata": { + "editable": true + }, + "source": [ + "## The ouput layer\n", + "\n", + "Finally, we have the ouput layer given by layer label $(2)$ with output $a^{(2)}$ and weights and biases to be determined given by the variables" + ] + }, + { + "cell_type": "markdown", + "id": "ce85df1e", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{i}^{(2)}=\\left\\{w_{0}^{(2)},w_{1}^{(2)}\\right\\} \\wedge b^{(2)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "29bd7b18", + "metadata": { + "editable": true + }, + "source": [ + "Our output is $\\tilde{y}=a^{(2)}$ and we define a generic cost function $C(a^{(2)},y;\\boldsymbol{\\Theta})$ where $y$ is the target value (a scalar here).\n", + "The parameters we need to optimize are given by" + ] + }, + { + "cell_type": "markdown", + "id": "ef82ab54", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{\\Theta}=\\left\\{w_{00}^{(1)},w_{01}^{(1)},w_{10}^{(1)},w_{11}^{(1)},w_{0}^{(2)},w_{1}^{(2)},b_0^{(1)},b_1^{(1)},b^{(2)}\\right\\}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "d1ac57d1", + "metadata": { + "editable": true + }, + "source": [ + "## Compact expressions\n", + "\n", + "We can define the inputs to the activation functions for the various layers in terms of various matrix-vector multiplications and vector additions.\n", + "The inputs to the first hidden layer are" + ] + }, + { + "cell_type": "markdown", + "id": "596a9ea8", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{bmatrix}z_0^{(1)} \\\\ z_1^{(1)} \\end{bmatrix}=\\begin{bmatrix}w_{00}^{(1)} & w_{01}^{(1)}\\\\ w_{10}^{(1)} &w_{11}^{(1)} \\end{bmatrix}\\begin{bmatrix}a_0^{(0)} \\\\ a_1^{(0)} \\end{bmatrix}+\\begin{bmatrix}b_0^{(1)} \\\\ b_1^{(1)} \\end{bmatrix},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "70a48160", + "metadata": { + "editable": true + }, + "source": [ + "with outputs" + ] + }, + { + "cell_type": "markdown", + "id": "3d8663dc", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\begin{bmatrix}a_0^{(1)} \\\\ a_1^{(1)} \\end{bmatrix}=\\begin{bmatrix}\\sigma^{(1)}(z_0^{(1)}) \\\\ \\sigma^{(1)}(z_1^{(1)}) \\end{bmatrix}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "2cb74c95", + "metadata": { + "editable": true + }, + "source": [ + "## Output layer\n", + "\n", + "For the final output layer we have the inputs to the final activation function" + ] + }, + { + "cell_type": "markdown", + "id": "6f25a15d", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z^{(2)} = w_{0}^{(2)}a_0^{(1)} +w_{1}^{(2)}a_1^{(1)}+b^{(2)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "980266d5", + "metadata": { + "editable": true + }, + "source": [ + "resulting in the output" + ] + }, + { + "cell_type": "markdown", + "id": "70bce478", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "a^{(2)}=\\sigma^{(2)}(z^{(2)}).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6d265593", + "metadata": { + "editable": true + }, + "source": [ + "## Explicit derivatives\n", + "\n", + "In total we have nine parameters which we need to train. Using the\n", + "chain rule (or just the back-propagation algorithm) we can find all\n", + "derivatives. Since we will use automatic differentiation in reverse\n", + "mode, we start with the derivatives of the cost function with respect\n", + "to the parameters of the output layer, namely" + ] + }, + { + "cell_type": "markdown", + "id": "dbd4e2a3", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_{i}^{(2)}}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\\frac{\\partial z^{(2)}}{\\partial w_{i}^{(2)}}=\\delta^{(2)}a_i^{(1)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "09d2cf31", + "metadata": { + "editable": true + }, + "source": [ + "with" + ] + }, + { + "cell_type": "markdown", + "id": "f79ab8f7", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta^{(2)}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "9c08c538", + "metadata": { + "editable": true + }, + "source": [ + "and finally" + ] + }, + { + "cell_type": "markdown", + "id": "a2f6c044", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial b^{(2)}}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\\frac{\\partial z^{(2)}}{\\partial b^{(2)}}=\\delta^{(2)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a09f4e04", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives of the hidden layer\n", + "\n", + "Using the chain rule we have the following expressions for say one of the weight parameters (it is easy to generalize to the other weight parameters)" + ] + }, + { + "cell_type": "markdown", + "id": "6a92eb7a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_{00}^{(1)}}=\\frac{\\partial C}{\\partial a^{(2)}}\\frac{\\partial a^{(2)}}{\\partial z^{(2)}}\n", + "\\frac{\\partial z^{(2)}}{\\partial z_0^{(1)}}\\frac{\\partial z_0^{(1)}}{\\partial w_{00}^{(1)}}= \\delta^{(2)}\\frac{\\partial z^{(2)}}{\\partial z_0^{(1)}}\\frac{\\partial z_0^{(1)}}{\\partial w_{00}^{(1)}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8fe089f9", + "metadata": { + "editable": true + }, + "source": [ + "which, noting that" + ] + }, + { + "cell_type": "markdown", + "id": "a62a5291", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z^{(2)} =w_0^{(2)}a_0^{(1)}+w_1^{(2)}a_1^{(1)}+b^{(2)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "435fd697", + "metadata": { + "editable": true + }, + "source": [ + "allows us to rewrite" + ] + }, + { + "cell_type": "markdown", + "id": "fa2bd02f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial z^{(2)}}{\\partial z_0^{(1)}}\\frac{\\partial z_0^{(1)}}{\\partial w_{00}^{(1)}}=w_0^{(2)}\\frac{\\partial a_0^{(1)}}{\\partial z_0^{(1)}}a_0^{(1)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "b809a430", + "metadata": { + "editable": true + }, + "source": [ + "## Final expression\n", + "Defining" + ] + }, + { + "cell_type": "markdown", + "id": "8d9a8843", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_0^{(1)}=w_0^{(2)}\\frac{\\partial a_0^{(1)}}{\\partial z_0^{(1)}}\\delta^{(2)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4ac52a1d", + "metadata": { + "editable": true + }, + "source": [ + "we have" + ] + }, + { + "cell_type": "markdown", + "id": "f146f084", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_{00}^{(1)}}=\\delta_0^{(1)}a_0^{(1)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5152d124", + "metadata": { + "editable": true + }, + "source": [ + "Similarly, we obtain" + ] + }, + { + "cell_type": "markdown", + "id": "ac1cc726", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_{01}^{(1)}}=\\delta_0^{(1)}a_1^{(1)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "301bfbae", + "metadata": { + "editable": true + }, + "source": [ + "## Completing the list\n", + "\n", + "Similarly, we find" + ] + }, + { + "cell_type": "markdown", + "id": "0f8342ca", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_{10}^{(1)}}=\\delta_1^{(1)}a_0^{(1)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3c0e1892", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "1fd466c4", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial w_{11}^{(1)}}=\\delta_1^{(1)}a_1^{(1)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "96a66261", + "metadata": { + "editable": true + }, + "source": [ + "where we have defined" + ] + }, + { + "cell_type": "markdown", + "id": "48fec0f6", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_1^{(1)}=w_1^{(2)}\\frac{\\partial a_1^{(1)}}{\\partial z_1^{(1)}}\\delta^{(2)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "0c74d22b", + "metadata": { + "editable": true + }, + "source": [ + "## Final expressions for the biases of the hidden layer\n", + "\n", + "For the sake of completeness, we list the derivatives of the biases, which are" + ] + }, + { + "cell_type": "markdown", + "id": "0c854481", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial b_{0}^{(1)}}=\\delta_0^{(1)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "f10bb50d", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "76a5d55f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial C}{\\partial b_{1}^{(1)}}=\\delta_1^{(1)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e5f00732", + "metadata": { + "editable": true + }, + "source": [ + "As we will see below, these expressions can be generalized in a more compact form." + ] + }, + { + "cell_type": "markdown", + "id": "afdef373", + "metadata": { + "editable": true + }, + "source": [ + "## Gradient expressions\n", + "\n", + "For this specific model, with just one output node and two hidden\n", + "nodes, the gradient descent equations take the following form for output layer" + ] + }, + { + "cell_type": "markdown", + "id": "d52eee8a", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{i}^{(2)}\\leftarrow w_{i}^{(2)}- \\eta \\delta^{(2)} a_{i}^{(1)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "38b3bf6d", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "f6068eca", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b^{(2)} \\leftarrow b^{(2)}-\\eta \\delta^{(2)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "71ee9ceb", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "5c8a4ccd", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{ij}^{(1)}\\leftarrow w_{ij}^{(1)}- \\eta \\delta_{i}^{(1)} a_{j}^{(0)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "02025483", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "c6619121", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_{i}^{(1)} \\leftarrow b_{i}^{(1)}-\\eta \\delta_{i}^{(1)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "050f3fcc", + "metadata": { + "editable": true + }, + "source": [ + "where $\\eta$ is the learning rate." + ] + }, + { + "cell_type": "markdown", + "id": "06a24ad2", + "metadata": { + "editable": true + }, + "source": [ + "## Exercise 2: Extended program\n", + "\n", + "We extend our simple code to a function which depends on two variable $x_0$ and $x_1$, that is" + ] + }, + { + "cell_type": "markdown", + "id": "4274918f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "y=f(x_0,x_1)=x_0^2+3x_0x_1+x_1^2+5.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "56d9f66f", + "metadata": { + "editable": true + }, + "source": [ + "We feed our network with $n=100$ entries $x_0$ and $x_1$. We have thus two features represented by these variable and an input matrix/design matrix $\\boldsymbol{X}\\in \\mathbf{R}^{n\\times 2}$" + ] + }, + { + "cell_type": "markdown", + "id": "042c5edd", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{X}=\\begin{bmatrix} x_{00} & x_{01} \\\\ x_{00} & x_{01} \\\\ x_{10} & x_{11} \\\\ x_{20} & x_{21} \\\\ \\dots & \\dots \\\\ \\dots & \\dots \\\\ x_{n-20} & x_{n-21} \\\\ x_{n-10} & x_{n-11} \\end{bmatrix}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ce337d30", + "metadata": { + "editable": true + }, + "source": [ + "Write a code, based on the previous code examples, which takes as input these data and fit the above function.\n", + "You can extend your code to include automatic differentiation.\n", + "\n", + "With these examples, we are now ready to embark upon the writing of more a general code for neural networks." + ] + }, + { + "cell_type": "markdown", + "id": "53b17e8e", + "metadata": { + "editable": true + }, + "source": [ + "## Getting serious, the back propagation equations for a neural network\n", + "\n", + "Now it is time to move away from one node in each layer only. Our inputs are also represented either by several inputs.\n", + "\n", + "We have thus" + ] + }, + { + "cell_type": "markdown", + "id": "b6759476", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}((\\boldsymbol{\\Theta}^L)}{\\partial w_{jk}^L} = \\left(a_j^L - y_j\\right)a_j^L(1-a_j^L)a_k^{L-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "22d35cab", + "metadata": { + "editable": true + }, + "source": [ + "Defining" + ] + }, + { + "cell_type": "markdown", + "id": "3869fd5f", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = a_j^L(1-a_j^L)\\left(a_j^L - y_j\\right) = \\sigma'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4ecac8d6", + "metadata": { + "editable": true + }, + "source": [ + "and using the Hadamard product of two vectors we can write this as" + ] + }, + { + "cell_type": "markdown", + "id": "33824242", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\boldsymbol{\\delta}^L = \\sigma'(\\hat{z}^L)\\circ\\frac{\\partial {\\cal C}}{\\partial (\\boldsymbol{a}^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "905fc741", + "metadata": { + "editable": true + }, + "source": [ + "## Analyzing the last results\n", + "\n", + "This is an important expression. The second term on the right handside\n", + "measures how fast the cost function is changing as a function of the $j$th\n", + "output activation. If, for example, the cost function doesn't depend\n", + "much on a particular output node $j$, then $\\delta_j^L$ will be small,\n", + "which is what we would expect. The first term on the right, measures\n", + "how fast the activation function $f$ is changing at a given activation\n", + "value $z_j^L$." + ] + }, + { + "cell_type": "markdown", + "id": "f81d4ba5", + "metadata": { + "editable": true + }, + "source": [ + "## More considerations\n", + "\n", + "Notice that everything in the above equations is easily computed. In\n", + "particular, we compute $z_j^L$ while computing the behaviour of the\n", + "network, and it is only a small additional overhead to compute\n", + "$\\sigma'(z^L_j)$. The exact form of the derivative with respect to the\n", + "output depends on the form of the cost function.\n", + "However, provided the cost function is known there should be little\n", + "trouble in calculating" + ] + }, + { + "cell_type": "markdown", + "id": "36bf1dfb", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ef9f1e9b", + "metadata": { + "editable": true + }, + "source": [ + "With the definition of $\\delta_j^L$ we have a more compact definition of the derivative of the cost function in terms of the weights, namely" + ] + }, + { + "cell_type": "markdown", + "id": "16944f70", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\frac{\\partial{\\cal C}}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "3af2849b", + "metadata": { + "editable": true + }, + "source": [ + "## Derivatives in terms of $z_j^L$\n", + "\n", + "It is also easy to see that our previous equation can be written as" + ] + }, + { + "cell_type": "markdown", + "id": "aba9c751", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L =\\frac{\\partial {\\cal C}}{\\partial z_j^L}= \\frac{\\partial {\\cal C}}{\\partial a_j^L}\\frac{\\partial a_j^L}{\\partial z_j^L},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "e75abc21", + "metadata": { + "editable": true + }, + "source": [ + "which can also be interpreted as the partial derivative of the cost function with respect to the biases $b_j^L$, namely" + ] + }, + { + "cell_type": "markdown", + "id": "eb71f184", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L}\\frac{\\partial b_j^L}{\\partial z_j^L}=\\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "31ab0d28", + "metadata": { + "editable": true + }, + "source": [ + "That is, the error $\\delta_j^L$ is exactly equal to the rate of change of the cost function as a function of the bias." + ] + }, + { + "cell_type": "markdown", + "id": "9ee59b2e", + "metadata": { + "editable": true + }, + "source": [ + "## Bringing it together\n", + "\n", + "We have now three equations that are essential for the computations of the derivatives of the cost function at the output layer. These equations are needed to start the algorithm and they are" + ] + }, + { + "cell_type": "markdown", + "id": "d6fa40ac", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\frac{\\partial{\\cal C}(\\hat{W^L})}{\\partial w_{jk}^L} = \\delta_j^La_k^{L-1},\n", + "\\label{_auto1} \\tag{2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1ced4984", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "3b2fea6b", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\delta_j^L = \\sigma'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)},\n", + "\\label{_auto2} \\tag{3}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "dd703643", + "metadata": { + "editable": true + }, + "source": [ + "and" + ] + }, + { + "cell_type": "markdown", + "id": "d9fdc337", + "metadata": { + "editable": true + }, + "source": [ + "\n", + "
\n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\delta_j^L = \\frac{\\partial {\\cal C}}{\\partial b_j^L},\n", + "\\label{_auto3} \\tag{4}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5412dee8", + "metadata": { + "editable": true + }, + "source": [ + "## Final back propagating equation\n", + "\n", + "We have that (replacing $L$ with a general layer $l$)" + ] + }, + { + "cell_type": "markdown", + "id": "e912e54c", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\frac{\\partial {\\cal C}}{\\partial z_j^l}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "04224d80", + "metadata": { + "editable": true + }, + "source": [ + "We want to express this in terms of the equations for layer $l+1$." + ] + }, + { + "cell_type": "markdown", + "id": "9f08fbcc", + "metadata": { + "editable": true + }, + "source": [ + "## Using the chain rule and summing over all $k$ entries\n", + "\n", + "We obtain" + ] + }, + { + "cell_type": "markdown", + "id": "faa505b9", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\sum_k \\frac{\\partial {\\cal C}}{\\partial z_k^{l+1}}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}}=\\sum_k \\delta_k^{l+1}\\frac{\\partial z_k^{l+1}}{\\partial z_j^{l}},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "ed46f21f", + "metadata": { + "editable": true + }, + "source": [ + "and recalling that" + ] + }, + { + "cell_type": "markdown", + "id": "515a4eef", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "z_j^{l+1} = \\sum_{i=1}^{M_{l}}w_{ij}^{l+1}a_i^{l}+b_j^{l+1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "bee442d8", + "metadata": { + "editable": true + }, + "source": [ + "with $M_l$ being the number of nodes in layer $l$, we obtain" + ] + }, + { + "cell_type": "markdown", + "id": "2b2596dd", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l =\\sum_k \\delta_k^{l+1}w_{kj}^{l+1}\\sigma'(z_j^l),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "1d832dcf", + "metadata": { + "editable": true + }, + "source": [ + "This is our final equation.\n", + "\n", + "We are now ready to set up the algorithm for back propagation and learning the weights and biases." + ] + }, + { + "cell_type": "markdown", + "id": "2f958487", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the back propagation algorithm\n", + "\n", + "The four equations provide us with a way of computing the gradient of the cost function. Let us write this out in the form of an algorithm.\n", + "\n", + "**First**, we set up the input data $\\hat{x}$ and the activations\n", + "$\\hat{z}_1$ of the input layer and compute the activation function and\n", + "the pertinent outputs $\\hat{a}^1$.\n", + "\n", + "**Secondly**, we perform then the feed forward till we reach the output\n", + "layer and compute all $\\hat{z}_l$ of the input layer and compute the\n", + "activation function and the pertinent outputs $\\hat{a}^l$ for\n", + "$l=1,2,3,\\dots,L$.\n", + "\n", + "**Notation**: The first hidden layer has $l=1$ as label and the final output layer has $l=L$." + ] + }, + { + "cell_type": "markdown", + "id": "8861c9ac", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the back propagation algorithm, part 2\n", + "\n", + "Thereafter we compute the ouput error $\\hat{\\delta}^L$ by computing all" + ] + }, + { + "cell_type": "markdown", + "id": "aff5f2e9", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^L = \\sigma'(z_j^L)\\frac{\\partial {\\cal C}}{\\partial (a_j^L)}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "a12a0d0f", + "metadata": { + "editable": true + }, + "source": [ + "Then we compute the back propagate error for each $l=L-1,L-2,\\dots,1$ as" + ] + }, + { + "cell_type": "markdown", + "id": "eebf7ad0", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}\\sigma'(z_j^l).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5ac6e8cd", + "metadata": { + "editable": true + }, + "source": [ + "## Setting up the Back propagation algorithm, part 3\n", + "\n", + "Finally, we update the weights and the biases using gradient descent\n", + "for each $l=L-1,L-2,\\dots,1$ and update the weights and biases\n", + "according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "219d7967", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "c5e69141", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "5f72b173", + "metadata": { + "editable": true + }, + "source": [ + "with $\\eta$ being the learning rate." + ] + }, + { + "cell_type": "markdown", + "id": "77500a39", + "metadata": { + "editable": true + }, + "source": [ + "## Updating the gradients\n", + "\n", + "With the back propagate error for each $l=L-1,L-2,\\dots,1$ as" + ] + }, + { + "cell_type": "markdown", + "id": "6d90be80", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "\\delta_j^l = \\sum_k \\delta_k^{l+1}w_{kj}^{l+1}sigma'(z_j^l),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "6dc431f1", + "metadata": { + "editable": true + }, + "source": [ + "we update the weights and the biases using gradient descent for each $l=L-1,L-2,\\dots,1$ and update the weights and biases according to the rules" + ] + }, + { + "cell_type": "markdown", + "id": "bc54103e", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "w_{jk}^l\\leftarrow = w_{jk}^l- \\eta \\delta_j^la_k^{l-1},\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "8a08a83e", + "metadata": { + "editable": true + }, + "source": [ + "$$\n", + "b_j^l \\leftarrow b_j^l-\\eta \\frac{\\partial {\\cal C}}{\\partial b_j^l}=b_j^l-\\eta \\delta_j^l,\n", + "$$" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/src/week41/_minted/65E03FF20B6B3DC1E8F8756667419FF9.highlight.minted b/doc/src/week41/_minted/65E03FF20B6B3DC1E8F8756667419FF9.highlight.minted new file mode 100644 index 000000000..d2da3799e --- /dev/null +++ b/doc/src/week41/_minted/65E03FF20B6B3DC1E8F8756667419FF9.highlight.minted @@ -0,0 +1,11 @@ +\begin{MintedVerbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}] +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{\PYGZus{}\PYGZus{}future\PYGZus{}\PYGZus{}}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{division} +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{sympy}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{o}{*} +\PYG{n}{x} \PYG{o}{=} \PYG{n}{symbols}\PYG{p}{(}\PYG{l+s+s1}{\PYGZsq{}}\PYG{l+s+s1}{x}\PYG{l+s+s1}{\PYGZsq{}}\PYG{p}{)} +\PYG{n}{expr} \PYG{o}{=} \PYG{n}{sqrt}\PYG{p}{(}\PYG{n}{x}\PYG{o}{*}\PYG{n}{x}\PYG{o}{+}\PYG{n}{exp}\PYG{p}{(}\PYG{n}{x}\PYG{o}{*}\PYG{n}{x}\PYG{p}{)}\PYG{p}{)} +\PYG{n}{simplify}\PYG{p}{(}\PYG{n}{expr}\PYG{p}{)} +\PYG{n}{derivative} \PYG{o}{=} \PYG{n}{diff}\PYG{p}{(}\PYG{n}{expr}\PYG{p}{,}\PYG{n}{x}\PYG{p}{)} +\PYG{n+nb}{print}\PYG{p}{(}\PYG{n}{python}\PYG{p}{(}\PYG{n}{expr}\PYG{p}{)}\PYG{p}{)} +\PYG{n+nb}{print}\PYG{p}{(}\PYG{n}{python}\PYG{p}{(}\PYG{n}{derivative}\PYG{p}{)}\PYG{p}{)} + +\end{MintedVerbatim} diff --git a/doc/src/week41/_minted/93B9C4D3B722A5D46E6B643B143D1A87.highlight.minted b/doc/src/week41/_minted/93B9C4D3B722A5D46E6B643B143D1A87.highlight.minted new file mode 100644 index 000000000..d0817680b --- /dev/null +++ b/doc/src/week41/_minted/93B9C4D3B722A5D46E6B643B143D1A87.highlight.minted @@ -0,0 +1,67 @@ +\begin{MintedVerbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}] +\PYG{k+kn}{import}\PYG{+w}{ }\PYG{n+nn}{numpy}\PYG{+w}{ }\PYG{k}{as}\PYG{+w}{ }\PYG{n+nn}{np} +\PYG{c+c1}{\PYGZsh{} We use the Sigmoid function as activation function} +\PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{sigmoid}\PYG{p}{(}\PYG{n}{z}\PYG{p}{)}\PYG{p}{:} + \PYG{k}{return} \PYG{l+m+mf}{1.0}\PYG{o}{/}\PYG{p}{(}\PYG{l+m+mf}{1.0}\PYG{o}{+}\PYG{n}{np}\PYG{o}{.}\PYG{n}{exp}\PYG{p}{(}\PYG{o}{\PYGZhy{}}\PYG{n}{z}\PYG{p}{)}\PYG{p}{)} + +\PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{forwardpropagation}\PYG{p}{(}\PYG{n}{x}\PYG{p}{)}\PYG{p}{:} + \PYG{c+c1}{\PYGZsh{} weighted sum of inputs to the hidden layer} + \PYG{n}{z\PYGZus{}1} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{matmul}\PYG{p}{(}\PYG{n}{x}\PYG{p}{,} \PYG{n}{w\PYGZus{}1}\PYG{p}{)} \PYG{o}{+} \PYG{n}{b\PYGZus{}1} + \PYG{c+c1}{\PYGZsh{} activation in the hidden layer} + \PYG{n}{a\PYGZus{}1} \PYG{o}{=} \PYG{n}{sigmoid}\PYG{p}{(}\PYG{n}{z\PYGZus{}1}\PYG{p}{)} + \PYG{c+c1}{\PYGZsh{} weighted sum of inputs to the output layer} + \PYG{n}{z\PYGZus{}2} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{matmul}\PYG{p}{(}\PYG{n}{a\PYGZus{}1}\PYG{p}{,} \PYG{n}{w\PYGZus{}2}\PYG{p}{)} \PYG{o}{+} \PYG{n}{b\PYGZus{}2} + \PYG{n}{a\PYGZus{}2} \PYG{o}{=} \PYG{n}{z\PYGZus{}2} + \PYG{k}{return} \PYG{n}{a\PYGZus{}1}\PYG{p}{,} \PYG{n}{a\PYGZus{}2} + +\PYG{k}{def}\PYG{+w}{ }\PYG{n+nf}{backpropagation}\PYG{p}{(}\PYG{n}{x}\PYG{p}{,} \PYG{n}{y}\PYG{p}{)}\PYG{p}{:} + \PYG{n}{a\PYGZus{}1}\PYG{p}{,} \PYG{n}{a\PYGZus{}2} \PYG{o}{=} \PYG{n}{forwardpropagation}\PYG{p}{(}\PYG{n}{x}\PYG{p}{)} + \PYG{c+c1}{\PYGZsh{} parameter delta for the output layer, note that a\PYGZus{}2=z\PYGZus{}2 and its derivative wrt z\PYGZus{}2 is just 1} + \PYG{n}{delta\PYGZus{}2} \PYG{o}{=} \PYG{n}{a\PYGZus{}2} \PYG{o}{\PYGZhy{}} \PYG{n}{y} + \PYG{n+nb}{print}\PYG{p}{(}\PYG{l+m+mf}{0.5}\PYG{o}{*}\PYG{p}{(}\PYG{p}{(}\PYG{n}{a\PYGZus{}2}\PYG{o}{\PYGZhy{}}\PYG{n}{y}\PYG{p}{)}\PYG{o}{*}\PYG{o}{*}\PYG{l+m+mi}{2}\PYG{p}{)}\PYG{p}{)} + \PYG{c+c1}{\PYGZsh{} delta for the hidden layer} + \PYG{n}{delta\PYGZus{}1} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{matmul}\PYG{p}{(}\PYG{n}{delta\PYGZus{}2}\PYG{p}{,} \PYG{n}{w\PYGZus{}2}\PYG{o}{.}\PYG{n}{T}\PYG{p}{)} \PYG{o}{*} \PYG{n}{a\PYGZus{}1} \PYG{o}{*} \PYG{p}{(}\PYG{l+m+mi}{1} \PYG{o}{\PYGZhy{}} \PYG{n}{a\PYGZus{}1}\PYG{p}{)} + \PYG{c+c1}{\PYGZsh{} gradients for the output layer} + \PYG{n}{output\PYGZus{}weights\PYGZus{}gradient} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{matmul}\PYG{p}{(}\PYG{n}{a\PYGZus{}1}\PYG{o}{.}\PYG{n}{T}\PYG{p}{,} \PYG{n}{delta\PYGZus{}2}\PYG{p}{)} + \PYG{n}{output\PYGZus{}bias\PYGZus{}gradient} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{sum}\PYG{p}{(}\PYG{n}{delta\PYGZus{}2}\PYG{p}{,} \PYG{n}{axis}\PYG{o}{=}\PYG{l+m+mi}{0}\PYG{p}{)} + \PYG{c+c1}{\PYGZsh{} gradient for the hidden layer} + \PYG{n}{hidden\PYGZus{}weights\PYGZus{}gradient} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{matmul}\PYG{p}{(}\PYG{n}{x}\PYG{o}{.}\PYG{n}{T}\PYG{p}{,} \PYG{n}{delta\PYGZus{}1}\PYG{p}{)} + \PYG{n}{hidden\PYGZus{}bias\PYGZus{}gradient} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{sum}\PYG{p}{(}\PYG{n}{delta\PYGZus{}1}\PYG{p}{,} \PYG{n}{axis}\PYG{o}{=}\PYG{l+m+mi}{0}\PYG{p}{)} + \PYG{k}{return} \PYG{n}{output\PYGZus{}weights\PYGZus{}gradient}\PYG{p}{,} \PYG{n}{output\PYGZus{}bias\PYGZus{}gradient}\PYG{p}{,} \PYG{n}{hidden\PYGZus{}weights\PYGZus{}gradient}\PYG{p}{,} \PYG{n}{hidden\PYGZus{}bias\PYGZus{}gradient} + + +\PYG{c+c1}{\PYGZsh{} ensure the same random numbers appear every time} +\PYG{n}{np}\PYG{o}{.}\PYG{n}{random}\PYG{o}{.}\PYG{n}{seed}\PYG{p}{(}\PYG{l+m+mi}{0}\PYG{p}{)} +\PYG{c+c1}{\PYGZsh{} Input variable} +\PYG{n}{x} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{array}\PYG{p}{(}\PYG{p}{[}\PYG{l+m+mf}{4.0}\PYG{p}{]}\PYG{p}{,}\PYG{n}{dtype}\PYG{o}{=}\PYG{n}{np}\PYG{o}{.}\PYG{n}{float64}\PYG{p}{)} +\PYG{c+c1}{\PYGZsh{} Target values} +\PYG{n}{y} \PYG{o}{=} \PYG{l+m+mi}{2}\PYG{o}{*}\PYG{n}{x}\PYG{o}{+}\PYG{l+m+mf}{1.0} + +\PYG{c+c1}{\PYGZsh{} Defining the neural network, only scalars here} +\PYG{n}{n\PYGZus{}inputs} \PYG{o}{=} \PYG{n}{x}\PYG{o}{.}\PYG{n}{shape} +\PYG{n}{n\PYGZus{}features} \PYG{o}{=} \PYG{l+m+mi}{1} +\PYG{n}{n\PYGZus{}hidden\PYGZus{}neurons} \PYG{o}{=} \PYG{l+m+mi}{1} +\PYG{n}{n\PYGZus{}outputs} \PYG{o}{=} \PYG{l+m+mi}{1} + +\PYG{c+c1}{\PYGZsh{} Initialize the network} +\PYG{c+c1}{\PYGZsh{} weights and bias in the hidden layer} +\PYG{n}{w\PYGZus{}1} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{random}\PYG{o}{.}\PYG{n}{randn}\PYG{p}{(}\PYG{n}{n\PYGZus{}features}\PYG{p}{,} \PYG{n}{n\PYGZus{}hidden\PYGZus{}neurons}\PYG{p}{)} +\PYG{n}{b\PYGZus{}1} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{zeros}\PYG{p}{(}\PYG{n}{n\PYGZus{}hidden\PYGZus{}neurons}\PYG{p}{)} \PYG{o}{+} \PYG{l+m+mf}{0.01} + +\PYG{c+c1}{\PYGZsh{} weights and bias in the output layer} +\PYG{n}{w\PYGZus{}2} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{random}\PYG{o}{.}\PYG{n}{randn}\PYG{p}{(}\PYG{n}{n\PYGZus{}hidden\PYGZus{}neurons}\PYG{p}{,} \PYG{n}{n\PYGZus{}outputs}\PYG{p}{)} +\PYG{n}{b\PYGZus{}2} \PYG{o}{=} \PYG{n}{np}\PYG{o}{.}\PYG{n}{zeros}\PYG{p}{(}\PYG{n}{n\PYGZus{}outputs}\PYG{p}{)} \PYG{o}{+} \PYG{l+m+mf}{0.01} + +\PYG{n}{eta} \PYG{o}{=} \PYG{l+m+mf}{0.1} +\PYG{k}{for} \PYG{n}{i} \PYG{o+ow}{in} \PYG{n+nb}{range}\PYG{p}{(}\PYG{l+m+mi}{50}\PYG{p}{)}\PYG{p}{:} + \PYG{c+c1}{\PYGZsh{} calculate gradients} + \PYG{n}{derivW2}\PYG{p}{,} \PYG{n}{derivB2}\PYG{p}{,} \PYG{n}{derivW1}\PYG{p}{,} \PYG{n}{derivB1} \PYG{o}{=} \PYG{n}{backpropagation}\PYG{p}{(}\PYG{n}{x}\PYG{p}{,} \PYG{n}{y}\PYG{p}{)} + \PYG{c+c1}{\PYGZsh{} update weights and biases} + \PYG{n}{w\PYGZus{}2} \PYG{o}{\PYGZhy{}}\PYG{o}{=} \PYG{n}{eta} \PYG{o}{*} \PYG{n}{derivW2} + \PYG{n}{b\PYGZus{}2} \PYG{o}{\PYGZhy{}}\PYG{o}{=} \PYG{n}{eta} \PYG{o}{*} \PYG{n}{derivB2} + \PYG{n}{w\PYGZus{}1} \PYG{o}{\PYGZhy{}}\PYG{o}{=} \PYG{n}{eta} \PYG{o}{*} \PYG{n}{derivW1} + \PYG{n}{b\PYGZus{}1} \PYG{o}{\PYGZhy{}}\PYG{o}{=} \PYG{n}{eta} \PYG{o}{*} \PYG{n}{derivB1} + + + +\end{MintedVerbatim} diff --git a/doc/src/week41/_minted/FCC7426E301CBCF11A668C5057AF3D1A.highlight.minted b/doc/src/week41/_minted/FCC7426E301CBCF11A668C5057AF3D1A.highlight.minted new file mode 100644 index 000000000..098dcea87 --- /dev/null +++ b/doc/src/week41/_minted/FCC7426E301CBCF11A668C5057AF3D1A.highlight.minted @@ -0,0 +1,11 @@ +\begin{MintedVerbatim}[commandchars=\\\{\},codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8\relax}] +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{\PYGZus{}\PYGZus{}future\PYGZus{}\PYGZus{}}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{n}{division} +\PYG{k+kn}{from}\PYG{+w}{ }\PYG{n+nn}{sympy}\PYG{+w}{ }\PYG{k+kn}{import} \PYG{o}{*} +\PYG{n}{x} \PYG{o}{=} \PYG{n}{symbols}\PYG{p}{(}\PYG{l+s+s1}{\PYGZsq{}}\PYG{l+s+s1}{x}\PYG{l+s+s1}{\PYGZsq{}}\PYG{p}{)} +\PYG{n}{expr} \PYG{o}{=} \PYG{n}{exp}\PYG{p}{(}\PYG{n}{x}\PYG{o}{*}\PYG{n}{x}\PYG{p}{)} +\PYG{n}{simplify}\PYG{p}{(}\PYG{n}{expr}\PYG{p}{)} +\PYG{n}{derivative} \PYG{o}{=} \PYG{n}{diff}\PYG{p}{(}\PYG{n}{expr}\PYG{p}{,}\PYG{n}{x}\PYG{p}{)} +\PYG{n+nb}{print}\PYG{p}{(}\PYG{n}{python}\PYG{p}{(}\PYG{n}{expr}\PYG{p}{)}\PYG{p}{)} +\PYG{n+nb}{print}\PYG{p}{(}\PYG{n}{python}\PYG{p}{(}\PYG{n}{derivative}\PYG{p}{)}\PYG{p}{)} + +\end{MintedVerbatim} diff --git a/doc/src/week41/_minted/_F65A394E8F693820B1C98E9CDA6B0A8F.index.minted b/doc/src/week41/_minted/_F65A394E8F693820B1C98E9CDA6B0A8F.index.minted new file mode 100644 index 000000000..b7f3a9c6f --- /dev/null +++ b/doc/src/week41/_minted/_F65A394E8F693820B1C98E9CDA6B0A8F.index.minted @@ -0,0 +1,12 @@ +{ + "jobname": "week41", + "md5": "F65A394E8F693820B1C98E9CDA6B0A8F", + "timestamp": "20251005194057", + "cachefiles": [ + "65E03FF20B6B3DC1E8F8756667419FF9.highlight.minted", + "93B9C4D3B722A5D46E6B643B143D1A87.highlight.minted", + "FCC7426E301CBCF11A668C5057AF3D1A.highlight.minted", + "_F65A394E8F693820B1C98E9CDA6B0A8F.index.minted", + "default.style.minted" + ] +} \ No newline at end of file diff --git a/doc/src/week41/_minted/default.style.minted b/doc/src/week41/_minted/default.style.minted new file mode 100644 index 000000000..3553f35b6 --- /dev/null +++ b/doc/src/week41/_minted/default.style.minted @@ -0,0 +1,100 @@ +\makeatletter +\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax% + \let\PYG@ul=\relax \let\PYG@tc=\relax% + \let\PYG@bc=\relax \let\PYG@ff=\relax} +\def\PYG@tok#1{\csname PYG@tok@#1\endcsname} +\def\PYG@toks#1+{\ifx\relax#1\empty\else% + \PYG@tok{#1}\expandafter\PYG@toks\fi} +\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{% + \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}} +\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}} + +\@namedef{PYG@tok@w}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.73,0.73}{##1}}} +\@namedef{PYG@tok@c}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}} +\@namedef{PYG@tok@cp}{\def\PYG@tc##1{\textcolor[rgb]{0.61,0.40,0.00}{##1}}} +\@namedef{PYG@tok@k}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@kp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@kt}{\def\PYG@tc##1{\textcolor[rgb]{0.69,0.00,0.25}{##1}}} +\@namedef{PYG@tok@o}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@ow}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\@namedef{PYG@tok@nb}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@nf}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\@namedef{PYG@tok@nc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\@namedef{PYG@tok@nn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\@namedef{PYG@tok@ne}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.80,0.25,0.22}{##1}}} +\@namedef{PYG@tok@nv}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\@namedef{PYG@tok@no}{\def\PYG@tc##1{\textcolor[rgb]{0.53,0.00,0.00}{##1}}} +\@namedef{PYG@tok@nl}{\def\PYG@tc##1{\textcolor[rgb]{0.46,0.46,0.00}{##1}}} +\@namedef{PYG@tok@ni}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}} +\@namedef{PYG@tok@na}{\def\PYG@tc##1{\textcolor[rgb]{0.41,0.47,0.13}{##1}}} +\@namedef{PYG@tok@nt}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@nd}{\def\PYG@tc##1{\textcolor[rgb]{0.67,0.13,1.00}{##1}}} +\@namedef{PYG@tok@s}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@sd}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@si}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}} +\@namedef{PYG@tok@se}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.67,0.36,0.12}{##1}}} +\@namedef{PYG@tok@sr}{\def\PYG@tc##1{\textcolor[rgb]{0.64,0.35,0.47}{##1}}} +\@namedef{PYG@tok@ss}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\@namedef{PYG@tok@sx}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@m}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@gh}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gu}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.50,0.00,0.50}{##1}}} +\@namedef{PYG@tok@gd}{\def\PYG@tc##1{\textcolor[rgb]{0.63,0.00,0.00}{##1}}} +\@namedef{PYG@tok@gi}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.52,0.00}{##1}}} +\@namedef{PYG@tok@gr}{\def\PYG@tc##1{\textcolor[rgb]{0.89,0.00,0.00}{##1}}} +\@namedef{PYG@tok@ge}{\let\PYG@it=\textit} +\@namedef{PYG@tok@gs}{\let\PYG@bf=\textbf} +\@namedef{PYG@tok@ges}{\let\PYG@bf=\textbf\let\PYG@it=\textit} +\@namedef{PYG@tok@gp}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,0.50}{##1}}} +\@namedef{PYG@tok@go}{\def\PYG@tc##1{\textcolor[rgb]{0.44,0.44,0.44}{##1}}} +\@namedef{PYG@tok@gt}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.27,0.87}{##1}}} +\@namedef{PYG@tok@err}{\def\PYG@bc##1{{\setlength{\fboxsep}{\string -\fboxrule}\fcolorbox[rgb]{1.00,0.00,0.00}{1,1,1}{\strut ##1}}}} +\@namedef{PYG@tok@kc}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@kd}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@kn}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@kr}{\let\PYG@bf=\textbf\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@bp}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.50,0.00}{##1}}} +\@namedef{PYG@tok@fm}{\def\PYG@tc##1{\textcolor[rgb]{0.00,0.00,1.00}{##1}}} +\@namedef{PYG@tok@vc}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\@namedef{PYG@tok@vg}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\@namedef{PYG@tok@vi}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\@namedef{PYG@tok@vm}{\def\PYG@tc##1{\textcolor[rgb]{0.10,0.09,0.49}{##1}}} +\@namedef{PYG@tok@sa}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@sb}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@sc}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@dl}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@s2}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@sh}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@s1}{\def\PYG@tc##1{\textcolor[rgb]{0.73,0.13,0.13}{##1}}} +\@namedef{PYG@tok@mb}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@mf}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@mh}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@mi}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@il}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@mo}{\def\PYG@tc##1{\textcolor[rgb]{0.40,0.40,0.40}{##1}}} +\@namedef{PYG@tok@ch}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}} +\@namedef{PYG@tok@cm}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}} +\@namedef{PYG@tok@cpf}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}} +\@namedef{PYG@tok@c1}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}} +\@namedef{PYG@tok@cs}{\let\PYG@it=\textit\def\PYG@tc##1{\textcolor[rgb]{0.24,0.48,0.48}{##1}}} + +\def\PYGZbs{\char`\\} +\def\PYGZus{\char`\_} +\def\PYGZob{\char`\{} +\def\PYGZcb{\char`\}} +\def\PYGZca{\char`\^} +\def\PYGZam{\char`\&} +\def\PYGZlt{\char`\<} +\def\PYGZgt{\char`\>} +\def\PYGZsh{\char`\#} +\def\PYGZpc{\char`\%} +\def\PYGZdl{\char`\$} +\def\PYGZhy{\char`\-} +\def\PYGZsq{\char`\'} +\def\PYGZdq{\char`\"} +\def\PYGZti{\char`\~} +% for compatibility with earlier versions +\def\PYGZat{@} +\def\PYGZlb{[} +\def\PYGZrb{]} +\makeatother diff --git a/doc/src/week41/ipynb-exercisesweek41-src.tar.gz b/doc/src/week41/ipynb-exercisesweek41-src.tar.gz deleted file mode 100644 index 2bd56c014c0f478ae90ecf588ab9664446a8277e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492792 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 z 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

d~ODF6Ns$IU1-h!bM#?i=*T2 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ΝIx(Oqakv`j+0up>bY&{&vP& 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 ov1q2mM*$I$>M3Ss$>23(a!Y_J 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 diff --git a/doc/src/week41/week41.do.txt b/doc/src/week41/week41.do.txt index 3a0da4baa..701fb667d 100644 --- a/doc/src/week41/week41.do.txt +++ b/doc/src/week41/week41.do.txt @@ -9,13 +9,13 @@ DATE: Week 41 !split ===== Material for the lecture on Monday October 6, 2025 ===== o Neural Networks, setting up the basic steps, from the simple perceptron model to the multi-layer perceptron model. -o Building our own Feed-forward Neural Network +o Building our own Feed-forward Neural Network, getting started # * Video of lecture notes at URL:"https://youtu.be/pMRUbf9E-gM" # * Whiteboard notes at URL:"https://github.com/CompPhysics/MachineLearning/blob/master/doc/HandWrittenNotes/2024/NotesOctober7.pdf" !bblock Readings and Videos: o These lecture notes -o Rashcka et al chapter 11 -o For neural networks we recommend Goodfellow et al chapter 6. +o For neural networks we recommend Goodfellow et al chapters 6 and 7. +o Rashkca et al., chapter 11, jupyter-notebook sent separately, from "GitHub":"https://github.com/rasbt/machine-learning-book" o Neural Networks demystified at URL:"https://www.youtube.com/watch?v=bxe2T-V8XRs&list=PLiaHhY2iBX9hdHaRr6b7XevZtgZRa1PoU&ab_channel=WelchLabs" o Building Neural Networks from scratch at URL:"https://www.youtube.com/watch?v=Wo5dMEP_BbI&list=PLQVvvaa0QuDcjD5BAw2DxE6OF2tius3V3&ab_channel=sentdex" o Video on Neural Networks at URL:"https://www.youtube.com/watch?v=CqOfi41LfDw" @@ -23,13 +23,27 @@ o Video on the back propagation algorithm at URL:"https://www.youtube.com/watch? We also recommend Michael Nielsen's intuitive approach to the neural networks and the universal approximation theorem, see the slides at URL:"http://neuralnetworksanddeeplearning.com/chap4.html". !eblock +!split +===== Mathematics of deep learning ===== + +!bblock Two recent books online +o "The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen":"https://arxiv.org/abs/2105.04026", published as "Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022":"https://doi.org/10.1017/9781009025096.002" + +o "Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger":"https://doi.org/10.48550/arXiv.2310.20360" +!eblock + !split -===== Material for the active learning sessions on Tuesday and Wednesday ===== -* Exercise on writing your own stochastic gradient and gradient descent codes. This exercise continues next week with studies of automatic differentiation -* One lecture at the beginning of each session on the material from weeks 39 and 40 and how to write your own gradient descent code -* Discussion of project 2 -* Your task before the sessions: revisit the material from weeks 39 and 40 and in particular the material from week 40 on stochastic gradient descent +===== Reminder on books with hands-on material and codes ===== +!bblock +* "Sebastian Rashcka et al, Machine learning with Sickit-Learn and PyTorch":"https://sebastianraschka.com/blog/2022/ml-pytorch-book.html" +!eblock + + +!split +===== Lab sessions on Tuesday and Wednesday ===== + +o Getting started with coding neural network. The exercises this week aim at setting up the feed-forward part of a neural network. @@ -221,153 +235,8 @@ as to not restrict the range of output values. FIGURE: [figures/nns.png, width=600 frac=0.8] In a) we show a single perceptron model while in b) we dispay a network with two hidden layers, an input layer and an output layer. -!split -===== Examples of XOR, OR and AND gates ===== - -Let us first try to fit various gates using standard linear -regression. The gates we are thinking of are the classical XOR, OR and -AND gates, well-known elements in computer science. The tables here -show how we can set up the inputs $x_1$ and $x_2$ in order to yield a -specific target $y_i$. - - - - -!bc pycod -""" -Simple code that tests XOR, OR and AND gates with linear regression -""" - -import numpy as np -# Design matrix -X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64) -print(f"The X.TX matrix:{X.T @ X}") -Xinv = np.linalg.pinv(X.T @ X) -print(f"The invers of X.TX matrix:{Xinv}") - -# The XOR gate -yXOR = np.array( [ 0, 1 ,1, 0]) -ThetaXOR = Xinv @ X.T @ yXOR -print(f"The values of theta for the XOR gate:{ThetaXOR}") -print(f"The linear regression prediction for the XOR gate:{X @ ThetaXOR}") - - -# The OR gate -yOR = np.array( [ 0, 1 ,1, 1]) -ThetaOR = Xinv @ X.T @ yOR -print(f"The values of theta for the OR gate:{ThetaOR}") -print(f"The linear regression prediction for the OR gate:{X @ ThetaOR}") - - -# The OR gate -yAND = np.array( [ 0, 0 ,0, 1]) -ThetaAND = Xinv @ X.T @ yAND -print(f"The values of theta for the AND gate:{ThetaAND}") -print(f"The linear regression prediction for the AND gate:{X @ ThetaAND}") -!ec - -What is happening here? - -!split -===== Does Logistic Regression do a better Job? ===== - -!bc pycod -""" -Simple code that tests XOR and OR gates with linear regression -and logistic regression -""" - -import matplotlib.pyplot as plt -from sklearn.linear_model import LogisticRegression -import numpy as np - -# Design matrix -X = np.array([ [1, 0, 0], [1, 0, 1], [1, 1, 0],[1, 1, 1]],dtype=np.float64) -print(f"The X.TX matrix:{X.T @ X}") -Xinv = np.linalg.pinv(X.T @ X) -print(f"The invers of X.TX matrix:{Xinv}") - -# The XOR gate -yXOR = np.array( [ 0, 1 ,1, 0]) -ThetaXOR = Xinv @ X.T @ yXOR -print(f"The values of theta for the XOR gate:{ThetaXOR}") -print(f"The linear regression prediction for the XOR gate:{X @ ThetaXOR}") - - -# The OR gate -yOR = np.array( [ 0, 1 ,1, 1]) -ThetaOR = Xinv @ X.T @ yOR -print(f"The values of theta for the OR gate:{ThetaOR}") -print(f"The linear regression prediction for the OR gate:{X @ ThetaOR}") - - -# The OR gate -yAND = np.array( [ 0, 0 ,0, 1]) -ThetaAND = Xinv @ X.T @ yAND -print(f"The values of theta for the AND gate:{ThetaAND}") -print(f"The linear regression prediction for the AND gate:{X @ ThetaAND}") - -# Now we change to logistic regression - - -# Logistic Regression -logreg = LogisticRegression() -logreg.fit(X, yOR) -print("Test set accuracy with Logistic Regression for OR gate: {:.2f}".format(logreg.score(X,yOR))) - -logreg.fit(X, yXOR) -print("Test set accuracy with Logistic Regression for XOR gate: {:.2f}".format(logreg.score(X,yXOR))) - - -logreg.fit(X, yAND) -print("Test set accuracy with Logistic Regression for AND gate: {:.2f}".format(logreg.score(X,yAND))) -!ec - -Not exactly impressive, but somewhat better. - -!split -===== Adding Neural Networks ===== - -!bc pycod - -# and now neural networks with Scikit-Learn and the XOR - -from sklearn.neural_network import MLPClassifier -from sklearn.datasets import make_classification -X, yXOR = make_classification(n_samples=100, random_state=1) -FFNN = MLPClassifier(random_state=1, max_iter=300).fit(X, yXOR) -FFNN.predict_proba(X) -print(f"Test set accuracy with Feed Forward Neural Network for XOR gate:{FFNN.score(X, yXOR)}") - -!ec - - - -!split -===== Mathematics of deep learning ===== - -!bblock Two recent books online -o "The Modern Mathematics of Deep Learning, by Julius Berner, Philipp Grohs, Gitta Kutyniok, Philipp Petersen":"https://arxiv.org/abs/2105.04026", published as "Mathematical Aspects of Deep Learning, pp. 1-111. Cambridge University Press, 2022":"https://doi.org/10.1017/9781009025096.002" - -o "Mathematical Introduction to Deep Learning: Methods, Implementations, and Theory, Arnulf Jentzen, Benno Kuckuck, Philippe von Wurstemberger":"https://doi.org/10.48550/arXiv.2310.20360" -!eblock - - -!split -===== Reminder on books with hands-on material and codes ===== -!bblock -* "Sebastian Rashcka et al, Machine learning with Sickit-Learn and PyTorch":"https://sebastianraschka.com/blog/2022/ml-pytorch-book.html" -!eblock - - -!split -===== Reading recommendations ===== - -o Rashkca et al., chapter 11, jupyter-notebook sent separately, from "GitHub":"https://github.com/rasbt/machine-learning-book" -o Goodfellow et al, chapter 6 and 7 contain most of the neural network background. - !split ===== Mathematics of deep learning and neural networks ===== @@ -677,7 +546,7 @@ The last partial derivative can easily be computed and reads (by applying the ch In order to understand the back propagation algorithm and its derivation (an implementation of the chain rule), let us first digress with some simple examples. These examples are also meant to motivate -the link with back propagation and "automatic differentiation":"https://en.wikipedia.org/wiki/Automatic_differentiation". +the link with back propagation and "automatic differentiation":"https://en.wikipedia.org/wiki/Automatic_differentiation". We will discuss these topics next week (week 42). !split ===== Reminder on the chain rule and gradients ===== @@ -719,6 +588,7 @@ the gradient of $f$ with respect to $t$ and $s$ (without the explicit unit vecto ===== Automatic differentiation through examples ===== A great introduction to automatic differentiation is given by Baydin et al., see URL:"https://arxiv.org/abs/1502.05767". +See also the video at URL:"https://www.youtube.com/watch?v=wG_nF1awSSY". Automatic differentiation is a represented by a repeated application of the chain rule on well-known functions and allows for the @@ -1778,462 +1648,3 @@ b_j^l \leftarrow b_j^l-\eta \frac{\partial {\cal C}}{\partial b_j^l}=b_j^l-\eta - - -!split -=== Activation functions === - - -A property that characterizes a neural network, other than its -connectivity, is the choice of activation function(s). As described -in, the following restrictions are imposed on an activation function -for a FFNN to fulfill the universal approximation theorem - - * Non-constant - - * Bounded - - * Monotonically-increasing - - * Continuous - -!split -=== Activation functions, Logistic and Hyperbolic ones === - -The second requirement excludes all linear functions. Furthermore, in -a MLP with only linear activation functions, each layer simply -performs a linear transformation of its inputs. - -Regardless of the number of layers, the output of the NN will be -nothing but a linear function of the inputs. Thus we need to introduce -some kind of non-linearity to the NN to be able to fit non-linear -functions Typical examples are the logistic *Sigmoid* - -!bt -\[ - f(x) = \frac{1}{1 + e^{-x}}, -\] -!et -and the *hyperbolic tangent* function -!bt -\[ - f(x) = \tanh(x) -\] -!et - -!split -=== Relevance === - -The *sigmoid* function are more biologically plausible because the -output of inactive neurons are zero. Such activation function are -called *one-sided*. However, it has been shown that the hyperbolic -tangent performs better than the sigmoid for training MLPs. has -become the most popular for *deep neural networks* - -!bc pycod -"""The sigmoid function (or the logistic curve) is a -function that takes any real number, z, and outputs a number (0,1). -It is useful in neural networks for assigning weights on a relative scale. -The value z is the weighted sum of parameters involved in the learning algorithm.""" - -import numpy -import matplotlib.pyplot as plt -import math as mt - -z = numpy.arange(-5, 5, .1) -sigma_fn = numpy.vectorize(lambda z: 1/(1+numpy.exp(-z))) -sigma = sigma_fn(z) - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot(z, sigma) -ax.set_ylim([-0.1, 1.1]) -ax.set_xlim([-5,5]) -ax.grid(True) -ax.set_xlabel('z') -ax.set_title('sigmoid function') - -plt.show() - -"""Step Function""" -z = numpy.arange(-5, 5, .02) -step_fn = numpy.vectorize(lambda z: 1.0 if z >= 0.0 else 0.0) -step = step_fn(z) - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot(z, step) -ax.set_ylim([-0.5, 1.5]) -ax.set_xlim([-5,5]) -ax.grid(True) -ax.set_xlabel('z') -ax.set_title('step function') - -plt.show() - -"""Sine Function""" -z = numpy.arange(-2*mt.pi, 2*mt.pi, 0.1) -t = numpy.sin(z) - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot(z, t) -ax.set_ylim([-1.0, 1.0]) -ax.set_xlim([-2*mt.pi,2*mt.pi]) -ax.grid(True) -ax.set_xlabel('z') -ax.set_title('sine function') - -plt.show() - -"""Plots a graph of the squashing function used by a rectified linear -unit""" -z = numpy.arange(-2, 2, .1) -zero = numpy.zeros(len(z)) -y = numpy.max([zero, z], axis=0) - -fig = plt.figure() -ax = fig.add_subplot(111) -ax.plot(z, y) -ax.set_ylim([-2.0, 2.0]) -ax.set_xlim([-2.0, 2.0]) -ax.grid(True) -ax.set_xlabel('z') -ax.set_title('Rectified linear unit') - -plt.show() -!ec - - - - - - - -!split -===== Fine-tuning neural network hyperparameters ===== - -The flexibility of neural networks is also one of their main -drawbacks: there are many hyperparameters to tweak. Not only can you -use any imaginable network topology (how neurons/nodes are -interconnected), but even in a simple FFNN you can change the number -of layers, the number of neurons per layer, the type of activation -function to use in each layer, the weight initialization logic, the -stochastic gradient optmized and much more. How do you know what -combination of hyperparameters is the best for your task? - -* You can use grid search with cross-validation to find the right hyperparameters. - -However,since there are many hyperparameters to tune, and since -training a neural network on a large dataset takes a lot of time, you -will only be able to explore a tiny part of the hyperparameter space. - - -* You can use randomized search. -* Or use tools like "Oscar":"http://oscar.calldesk.ai/", which implements more complex algorithms to help you find a good set of hyperparameters quickly. - -!split -===== Hidden layers ===== - - - -For many problems you can start with just one or two hidden layers and -it will work just fine. For the MNIST data set you ca easily get a -high accuracy using just one hidden layer with a few hundred neurons. -You can reach for this data set above 98% accuracy using two hidden -layers with the same total amount of neurons, in roughly the same -amount of training time. - -For more complex problems, you can gradually ramp up the number of -hidden layers, until you start overfitting the training set. Very -complex tasks, such as large image classification or speech -recognition, typically require networks with dozens of layers and they -need a huge amount of training data. However, you will rarely have to -train such networks from scratch: it is much more common to reuse -parts of a pretrained state-of-the-art network that performs a similar -task. - - - - -!split -===== Vanishing gradients ===== - -The Back propagation algorithm we derived above works by going from -the output layer to the input layer, propagating the error gradient on -the way. Once the algorithm has computed the gradient of the cost -function with regards to each parameter in the network, it uses these -gradients to update each parameter with a Gradient Descent (GD) step. - - -Unfortunately for us, the gradients often get smaller and smaller as -the algorithm progresses down to the first hidden layers. As a result, -the GD update leaves the lower layer connection weights virtually -unchanged, and training never converges to a good solution. This is -known in the literature as _the vanishing gradients problem_. - -!split -===== Exploding gradients ===== - -In other cases, the opposite can happen, namely the the gradients can -grow bigger and bigger. The result is that many of the layers get -large updates of the weights the algorithm diverges. This is the -_exploding gradients problem_, which is mostly encountered in -recurrent neural networks. More generally, deep neural networks suffer -from unstable gradients, different layers may learn at widely -different speeds - - - -!split -===== Is the Logistic activation function (Sigmoid) our choice? ===== - -Although this unfortunate behavior has been empirically observed for -quite a while (it was one of the reasons why deep neural networks were -mostly abandoned for a long time), it is only around 2010 that -significant progress was made in understanding it. - -A paper titled "Understanding the Difficulty of Training Deep -Feedforward Neural Networks by Xavier Glorot and Yoshua Bengio":"http://proceedings.mlr.press/v9/glorot10a.html" found that -the problems with the popular logistic -sigmoid activation function and the weight initialization technique -that was most popular at the time, namely random initialization using -a normal distribution with a mean of 0 and a standard deviation of -1. - -!split -===== Logistic function as the root of problems ===== - -They showed that with this activation function and this -initialization scheme, the variance of the outputs of each layer is -much greater than the variance of its inputs. Going forward in the -network, the variance keeps increasing after each layer until the -activation function saturates at the top layers. This is actually made -worse by the fact that the logistic function has a mean of 0.5, not 0 -(the hyperbolic tangent function has a mean of 0 and behaves slightly -better than the logistic function in deep networks). - - -!split -===== The derivative of the Logistic funtion ===== - -Looking at the logistic activation function, when inputs become large -(negative or positive), the function saturates at 0 or 1, with a -derivative extremely close to 0. Thus when backpropagation kicks in, -it has virtually no gradient to propagate back through the network, -and what little gradient exists keeps getting diluted as -backpropagation progresses down through the top layers, so there is -really nothing left for the lower layers. - -In their paper, Glorot and Bengio propose a way to significantly -alleviate this problem. We need the signal to flow properly in both -directions: in the forward direction when making predictions, and in -the reverse direction when backpropagating gradients. We don’t want -the signal to die out, nor do we want it to explode and saturate. For -the signal to flow properly, the authors argue that we need the -variance of the outputs of each layer to be equal to the variance of -its inputs, and we also need the gradients to have equal variance -before and after flowing through a layer in the reverse direction. - - -!split -===== Insights from the paper by Glorot and Bengio ===== - -One of the insights in the 2010 paper by Glorot and Bengio was that -the vanishing/exploding gradients problems were in part due to a poor -choice of activation function. Until then most people had assumed that -if Nature had chosen to use roughly sigmoid activation functions in -biological neurons, they must be an excellent choice. But it turns out -that other activation functions behave much better in deep neural -networks, in particular the ReLU activation function, mostly because -it does not saturate for positive values (and also because it is quite -fast to compute). - - - -!split -===== The RELU function family ===== - -The ReLU activation function suffers from a problem known as the dying -ReLUs: during training, some neurons effectively die, meaning they -stop outputting anything other than 0. - -In some cases, you may find that half of your network’s neurons are -dead, especially if you used a large learning rate. During training, -if a neuron’s weights get updated such that the weighted sum of the -neuron’s inputs is negative, it will start outputting 0. When this -happen, the neuron is unlikely to come back to life since the gradient -of the ReLU function is 0 when its input is negative. - -!split -===== ELU function ===== - -To solve this problem, nowadays practitioners use a variant of the -ReLU function, such as the leaky ReLU discussed above or the so-called -exponential linear unit (ELU) function - - -!bt -\[ -ELU(z) = \left\{\begin{array}{cc} \alpha\left( \exp{(z)}-1\right) & z < 0,\\ z & z \ge 0.\end{array}\right. -\] -!et - -!split -===== Which activation function should we use? ===== - -In general it seems that the ELU activation function is better than -the leaky ReLU function (and its variants), which is better than -ReLU. ReLU performs better than $\tanh$ which in turn performs better -than the logistic function. - -If runtime performance is an issue, then you may opt for the leaky -ReLU function over the ELU function If you don’t want to tweak yet -another hyperparameter, you may just use the default $\alpha$ of -$0.01$ for the leaky ReLU, and $1$ for ELU. If you have spare time and -computing power, you can use cross-validation or bootstrap to evaluate -other activation functions. - - -!split -===== More on activation functions, output layers ===== - -In most cases you can use the ReLU activation function in the hidden -layers (or one of its variants). - -It is a bit faster to compute than other activation functions, and the -gradient descent optimization does in general not get stuck. - -_For the output layer:_ - -* For classification the softmax activation function is generally a good choice for classification tasks (when the classes are mutually exclusive). -* For regression tasks, you can simply use no activation function at all. - - - - -!split -===== Batch Normalization ===== - -Batch Normalization aims to address the vanishing/exploding gradients -problems, and more generally the problem that the distribution of each -layer’s inputs changes during training, as the parameters of the -previous layers change. - -The technique consists of adding an operation in the model just before -the activation function of each layer, simply zero-centering and -normalizing the inputs, then scaling and shifting the result using two -new parameters per layer (one for scaling, the other for shifting). In -other words, this operation lets the model learn the optimal scale and -mean of the inputs for each layer. In order to zero-center and -normalize the inputs, the algorithm needs to estimate the inputs’ mean -and standard deviation. It does so by evaluating the mean and standard -deviation of the inputs over the current mini-batch, from this the -name batch normalization. - -!split -===== Dropout ===== - -It is a fairly simple algorithm: at every training step, every neuron -(including the input neurons but excluding the output neurons) has a -probability $p$ of being temporarily dropped out, meaning it will be -entirely ignored during this training step, but it may be active -during the next step. - -The hyperparameter $p$ is called the dropout rate, and it is typically -set to 50%. After training, the neurons are not dropped anymore. It -is viewed as one of the most popular regularization techniques. - -!split -===== Gradient Clipping ===== - -A popular technique to lessen the exploding gradients problem is to -simply clip the gradients during backpropagation so that they never -exceed some threshold (this is mostly useful for recurrent neural -networks). - -This technique is called Gradient Clipping. - -In general however, Batch -Normalization is preferred. - -!split -===== A top-down perspective on Neural networks ===== - - -The first thing we would like to do is divide the data into two or -three parts. A training set, a validation or dev (development) set, -and a test set. The test set is the data on which we want to make -predictions. The dev set is a subset of the training data we use to -check how well we are doing out-of-sample, after training the model on -the training dataset. We use the validation error as a proxy for the -test error in order to make tweaks to our model. It is crucial that we -do not use any of the test data to train the algorithm. This is a -cardinal sin in ML. Then: - -o Estimate optimal error rate -o Minimize underfitting (bias) on training data set. -o Make sure you are not overfitting. - - - -!split -===== More top-down perspectives ===== - -If the validation and test sets are drawn from the same distributions, -then a good performance on the validation set should lead to similarly -good performance on the test set. - -However, sometimes -the training data and test data differ in subtle ways because, for -example, they are collected using slightly different methods, or -because it is cheaper to collect data in one way versus another. In -this case, there can be a mismatch between the training and test -data. This can lead to the neural network overfitting these small -differences between the test and training sets, and a poor performance -on the test set despite having a good performance on the validation -set. To rectify this, Andrew Ng suggests making two validation or dev -sets, one constructed from the training data and one constructed from -the test data. The difference between the performance of the algorithm -on these two validation sets quantifies the train-test mismatch. This -can serve as another important diagnostic when using DNNs for -supervised learning. - -!split -===== Limitations of supervised learning with deep networks ===== - -Like all statistical methods, supervised learning using neural -networks has important limitations. This is especially important when -one seeks to apply these methods, especially to physics problems. Like -all tools, DNNs are not a universal solution. Often, the same or -better performance on a task can be achieved by using a few -hand-engineered features (or even a collection of random -features). - - -!split -===== Limitations of NNs ===== - -Here we list some of the important limitations of supervised neural network based models. - - - -* _Need labeled data_. All supervised learning methods, DNNs for supervised learning require labeled data. Often, labeled data is harder to acquire than unlabeled data (e.g. one must pay for human experts to label images). -* _Supervised neural networks are extremely data intensive._ DNNs are data hungry. They perform best when data is plentiful. This is doubly so for supervised methods where the data must also be labeled. The utility of DNNs is extremely limited if data is hard to acquire or the datasets are small (hundreds to a few thousand samples). In this case, the performance of other methods that utilize hand-engineered features can exceed that of DNNs. - - -!split -===== Homogeneous data ===== - -* _Homogeneous data._ Almost all DNNs deal with homogeneous data of one type. It is very hard to design architectures that mix and match data types (i.e.~some continuous variables, some discrete variables, some time series). In applications beyond images, video, and language, this is often what is required. In contrast, ensemble models like random forests or gradient-boosted trees have no difficulty handling mixed data types. - -!split -===== More limitations ===== - - -* _Many problems are not about prediction._ In natural science we are often interested in learning something about the underlying distribution that generates the data. In this case, it is often difficult to cast these ideas in a supervised learning setting. While the problems are related, it is possible to make good predictions with a *wrong* model. The model might or might not be useful for understanding the underlying science. - -Some of these remarks are particular to DNNs, others are shared by all supervised learning methods. This motivates the use of unsupervised methods which in part circumvent these problems. - - -