To be able to edit code and run cells, you need to run the notebook yourself. Where would you like to run the notebook?

This notebook takes about 5 minutes to run.

In the cloud (experimental)

Binder is a free, open source service that runs scientific notebooks in the cloud! It will take a while, usually 2-7 minutes to get a session.

On your computer

(Recommended if you want to store your changes.)

  1. Copy the notebook URL:
  2. Run Pluto

    (Also see: How to install Julia and Pluto)

  3. Paste URL in the Open box

Frontmatter

If you are publishing this notebook on the web, you can set the parameters below to provide HTML metadata. This is useful for search engines and social media.

Author 1

Automatic Differentiation

On peut calculer des dérivées partielles de différentes manières:

  1. De façon symbolique, en fixant une des variables et en dérivant les autres soit à la main, soit par ordinateur.

  2. De façon numérique, avec la formule $f'(x) \approx (f(x + h) - f(x)) / h$.

  3. De façon algorithmique, soit forward, soit reverse, c'est ce que nous verons ici.

Pour illustrer, nous utiliserons l'exemple de classification de points de deux formes de lunes.

👀 Reading hidden code
md"""
# Automatic Differentiation

On peut calculer des dérivées partielles de différentes manières:
1. De façon symbolique, en fixant une des variables et en dérivant les autres soit à la main, soit par ordinateur.
2. De façon numérique, avec la formule ``f'(x) \approx (f(x + h) - f(x)) / h``.
3. De façon algorithmique, soit forward, soit reverse, c'est ce que nous verons ici.

Pour illustrer, nous utiliserons l'exemple de classification de points de deux formes de lunes.
"""
553 μs
X_table, y_cat = MLJBase.make_moons(100, noise=0.1)
👀 Reading hidden code
1.2 s
plot_w (generic function with 2 methods)
👀 Reading hidden code
4.8 ms
plot_w()
👀 Reading hidden code
806 ms

Nous travaillerons avec une matrice X contenant dans chaque ligne, les coordonnées d'un point.

👀 Reading hidden code
207 μs
100×2 Matrix{Float64}:
  0.767941    0.571447
  1.53399    -0.492154
  1.92821    -0.247528
  0.901771    0.210004
 -0.0218448  -0.0309249
  0.712682   -0.552641
  0.205547    1.03797
  ⋮          
  0.18925    -0.21273
  0.594293    0.862584
  1.42587    -0.583722
  0.376296    0.967954
  1.14375     0.141922
 -0.868097    0.176707
X = Tables.matrix(X_table)
👀 Reading hidden code
3.4 ms

Le vecteur y contiendra 1 pour les points de la lune bleue et -1 pour les points de la lune rouge.

👀 Reading hidden code
220 μs
y = 2(float.(y_cat.refs) .- 1.5)
👀 Reading hidden code
55.9 ms

Nous illustrons le calcul de dérivée automatique par l'entrainement du modèle linéaire $y \approx X w$. Commençons avec des poids aléatoires. Le modèle n'est pour le moment pas très précis comme il est aléatoire.

👀 Reading hidden code
246 μs
w = rand(2)
👀 Reading hidden code
49.3 μs
plot_w(w)
👀 Reading hidden code
150 ms

En effet, les prédictions ne correspondent pas à y.

👀 Reading hidden code
206 μs
y_est = X * w
👀 Reading hidden code
33.8 μs

On peut regrouper les erreurs des estimations de tous les points en les comparant avec y.

👀 Reading hidden code
227 μs
errors = y_est - y
👀 Reading hidden code
14.8 μs

Essayons de trouver des poids w qui minimisent la somme des carrés des erreurs (aka MSE):

👀 Reading hidden code
209 μs
1.1943184854669826
mean_squared_error = sum(errors.^2) / length(errors)
👀 Reading hidden code
55.4 ms
mse (generic function with 1 method)
mse(w, X, y) = sum((X * w - y).^2 / length(y))
👀 Reading hidden code
1.3 ms
1.1943184854669826
mse(w, X, y)
👀 Reading hidden code
20.5 μs

Forward Differentiation

Commençons par définir la forward differentiation. Cette différentiation algorithmique se base sur l'observation que la chain rule permet de calculer la dérivée de n'importe quelle fonction dès lors qu'on connait sont gradient et la dérivée de chacun de ses paramètres. En d'autres mots, supposons qu'on doive calculer

$$\frac{\partial}{\partial x} f(g(x), h(x))$$

Supposons que la fonction f soit une fonction f(a, b) simple (telle que +, *, -) dont on connait la formules des dérivée partielles $\partial f / \partial a$ en fonction de a et $\partial f / \partial b$ en fonction de b: La chain rule nous donne

$$\frac{\partial}{\partial x} f(g(x), h(x)) = \frac{\partial f}{\partial a}(g(x), h(x)) \frac{\partial g}{\partial x} + \frac{\partial f}{\partial b}(g(x), h(x)) \frac{\partial h}{\partial x}$$

Pour calculer cette expression, ils nous faut les valeurs de $g(x)$ et $h(x)$ ainsi que les dérivées $\partial g / \partial x$ et $\partial h / \partial x$.

👀 Reading hidden code
459 μs
Dual
begin
struct Dual{T}
value::T
derivative::T
end
Dual(x, y) = Dual{typeof(x)}(x, convert(typeof(x), y))
end
👀 Reading hidden code
2.9 ms
Loading more cells...