Automatic Differentiation
On peut calculer des dérivées partielles de différentes manières:
De façon symbolique, en fixant une des variables et en dérivant les autres soit à la main, soit par ordinateur.
De façon numérique, avec la formule $f'(x) \approx (f(x + h) - f(x)) / h$.
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.
x1 | x2 | |||
---|---|---|---|---|
Float64 | Float64 | |||
1 | 0.767941 | 0.571447 | ||
2 | 1.53399 | -0.492154 | ||
3 | 1.92821 | -0.247528 | ||
4 | 0.901771 | 0.210004 | ||
5 | -0.0218448 | -0.0309249 | ||
6 | 0.712682 | -0.552641 | ||
7 | 0.205547 | 1.03797 | ||
8 | -0.00386792 | 1.04954 | ||
9 | 0.0906013 | 0.133817 | ||
10 | -0.873629 | 0.484711 | ||
0
1
1
0
1
1
0
0
1
0
plot_w (generic function with 2 methods)
Nous travaillerons avec une matrice X
contenant dans chaque ligne, les coordonnées d'un point.
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
Le vecteur y
contiendra 1
pour les points de la lune bleue et -1
pour les points de la lune rouge.
-1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
-1.0
1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
-1.0
1.0
-1.0
-1.0
-1.0
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.
0.164418
0.30309
En effet, les prédictions ne correspondent pas à y
.
0.299464
0.103049
0.24201
0.211918
-0.0129647
-0.0503223
0.348395
0.317468
0.0554551
0.00327052
-0.0184666
-0.173016
0.213025
-0.00520082
-0.0573999
0.314147
0.370534
0.187764
0.262364
-0.0655597
-0.138581
0.174855
0.124704
0.292444
-0.0333601
0.359153
0.057519
0.355247
0.231069
-0.0891729
On peut regrouper les erreurs des estimations de tous les points en les comparant avec y
.
1.29946
-0.896951
-0.75799
1.21192
-1.01296
-1.05032
1.3484
1.31747
-0.944545
1.00327
-1.01847
0.826984
1.21302
-1.0052
-1.0574
1.31415
-0.629466
1.18776
-0.737636
-1.06556
-1.13858
-0.825145
-0.875296
1.29244
-1.03336
1.35915
-0.942481
1.35525
1.23107
0.910827
Essayons de trouver des poids w
qui minimisent la somme des carrés des erreurs (aka MSE):
1.1943184854669826
mse (generic function with 1 method)
1.1943184854669826
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$.
Dual