La régression linéaire est probablement l’un des modèles les plus simples du machine learning.
On lui donne des variables en entrée, il produit une valeur numérique en sortie.
Par exemple, on pourrait chercher à prédire le prix d’un appartement à partir de sa surface, ou la consommation électrique d’un bâtiment à partir de sa température.
Mais derrière cette apparente simplicité se cache déjà une grande partie des idées que l’on retrouvera ensuite dans des modèles beaucoup plus complexes :
- des paramètres
- des prédictions
- une erreur
- une fonction de coût
- et un problème d’optimisation.
Commençons avec le cas le plus simple possible.
1. Trouver une droite qui représente les données
Imaginons que nous disposions de plusieurs observations reliant une variable à une valeur .
Par exemple :
- pourrait représenter la surface d’un logement
- , son prix.
Chaque observation devient un point dans le plan.
À première vue, ces points semblent suivre une tendance : lorsque augmente, a également tendance à augmenter.
Une façon très simple de représenter cette relation consiste à tracer une droite.
Ici, représente la valeur prédite par notre modèle.
Dans les formules et les contrôles, la pente est bleue et le biais orange. Ces couleurs suivront les paramètres jusque dans leurs valeurs numériques.
Deux paramètres contrôlent entièrement la droite :
sa pente, et
son décalage vertical.
Modifier change l’inclinaison de la droite.
Modifier la déplace vers le haut ou vers le bas.
En modifiant les deux paramètres, essayez de placer la droite de manière à ce qu’elle représente au mieux les observations.
Construire votre droite
Faites varier la pente et le décalage vertical. Les points restent fixes.
Très vite, une difficulté apparaît.
On peut facilement reconnaître une droite manifestement mauvaise.
Mais entre deux droites raisonnables, laquelle est réellement la meilleure ?
Notre intuition visuelle ne suffit plus.
Il nous faut une manière de mesurer l’erreur.
2. Mesurer l’écart entre la prédiction et la réalité
Pour chaque observation , notre modèle produit une prédiction :
La valeur réelle est .
La différence entre les deux est appelée le résidu :
Graphiquement, le segment vertical relie le point observé à sa prédiction sur la droite. Le résidu est signé et la longueur du segment vaut .
Voir les résidus, puis leur annulation
Sélectionnez une observation. La somme des résidus peut être nulle même pour une mauvaise droite.
Lorsque vous modifiez ou , les résidus évoluent immédiatement.
Une meilleure droite produit généralement des résidus plus petits.
On pourrait donc être tenté d’additionner toutes les erreurs :
Mais il y a un problème.
Les résidus situés au-dessus de la droite ont un signe, ceux situés en dessous ont le signe opposé.
Ils peuvent donc s’annuler.
Une droite visiblement mauvaise peut parfaitement produire une somme des résidus proche de zéro.
Ce n’est donc pas une bonne mesure de la qualité du modèle.
3. Empêcher les erreurs de s’annuler
Une solution consiste à mettre chaque résidu au carré :
Tous les carrés sont alors positifs ou nuls.
On peut ensuite calculer leur moyenne :
Cette quantité est la Mean Squared Error, ou MSE.
Dans la suite, nous l’utiliserons comme fonction de coût (ou loss).
Plus la droite est proche des observations, plus la loss est faible.
Plus elle s’en éloigne, plus la loss augmente.
La loss réagit à votre droite
Chaque résidu est mis au carré avant de calculer la moyenne. Une petite somme signée ne suffit pas.
Essayez volontairement de produire une mauvaise droite.
La valeur augmente.
Rapprochez-la des points.
La valeur diminue.
Nous avons maintenant transformé une idée assez vague, « trouver une bonne droite » en un objectif mathématique précis :
C’est un changement important.
La régression linéaire n’est plus simplement un problème de géométrie.
Elle devient un problème d’optimisation.
4. Une droite est aussi un point
Il existe une autre manière de regarder exactement le même problème.
Prenons une droite définie par :
et
Ces deux nombres suffisent à identifier entièrement cette droite.
On peut donc représenter notre modèle non plus dans l’espace des données, mais dans un nouvel espace dont les axes sont ses paramètres.
Un axe pour .
Un axe pour .
La droite précédente devient alors simplement le point :
Chaque droite possible correspond à un point différent dans cet espace.
Et pour chacun de ces points, nous pouvons calculer une loss.
Nous obtenons alors une surface :
Une droite, un point sur la loss
À gauche, une droite. À droite, ses paramètres et leur loss. Les deux vues décrivent le même modèle.
Lorsque vous modifiez la droite à gauche, le point se déplace simultanément sur la surface à droite.
Une droite particulièrement mauvaise correspond à une région élevée de la surface.
Une meilleure droite descend vers le fond.
La meilleure droite correspond donc simplement au point le plus bas de cette surface.
Nous venons de relier deux représentations du même problème :
et
Cette idée sera importante plus tard.
Elle ne concerne pas uniquement la régression linéaire.
Une grande partie de l’apprentissage automatique consiste précisément à chercher de bons paramètres dans des espaces beaucoup plus grands.
5. Une seule variable n’est pas toujours suffisante
Jusqu’ici, notre modèle ne recevait qu’une seule variable :
Mais dans un problème réel, une prédiction dépend rarement d’une seule information.
Pour estimer le prix d’un appartement, on pourrait par exemple utiliser :
et
Notre modèle pourrait alors devenir :
La pente se sépare désormais en
: c’est le poids de la première variable et il modifie la pente sur l'axe .
Et qui corresponds au poids de la deuxième variable et qui va lui aussi gérer une pente mais cette fois ci sur l'axe .
Nous avons maintenant deux poids :
et
Chacun contrôle l’importance d’une variable dans la prédiction.
6. De la droite au plan
Avec une seule variable , notre modèle pouvait être représenté par une droite.
Avec deux variables et , chaque observation possède désormais trois coordonnées :
Nos données vivent donc dans un espace en trois dimensions.
Et notre modèle :
ne forme plus une droite.
Il forme un plan. Les observations ci-dessous utilisent des valeurs illustratives sans unité, pour garder les calculs lisibles.
Modifier incline le plan dans une direction.
Modifier l’incline dans l’autre.
Modifier déplace le plan selon l’axe des sorties , sans changer son inclinaison.
Incliner un plan, déplacer son biais
Les deux poids inclinent le plan ; le biais le déplace selon y. a est devenu w₁, toujours en bleu.
La représentation change, mais le principe reste exactement le même.
Pour chaque observation :
le modèle calcule :
Puis nous comparons cette prédiction à la valeur réelle .
7. L’espace des paramètres existe toujours
Nous pouvons reprendre exactement le raisonnement utilisé avec et .
Notre modèle possède maintenant 3 paramètres :
Chaque choix de produit un plan différent.
Et chacun de ces plans produit une loss différente.
On peut donc définir :
Un plan, un point sur une coupe de loss
La surface montre L(w₁, w₂ ; b fixé). Modifier b recalcule toute la surface, sans changer ses échelles.
Lorsque les poids changent, le plan se déforme.
Simultanément, le point représentant se déplace sur une coupe de la loss : . Modifier change toute cette surface. Trois paramètres plus la loss demanderaient quatre dimensions : cette coupe nous permet de regarder deux paramètres à la fois.
Nous sommes toujours confrontés au même problème :
La difficulté ne dépend donc pas vraiment du fait que notre modèle ressemble à une droite ou à un plan.
Elle dépend des paramètres que nous devons choisir.
8. Regarder à l’intérieur du calcul
Jusqu’ici, nous avons écrit :
Mais on peut également représenter les mêmes valeurs sous forme de vecteurs.
Prenons une observation :
et les poids du modèle :
La prédiction est simplement la somme des produits correspondants :
La somme des produits porte un nom : le produit scalaire. Nous lui ajoutons le biais pour obtenir la prédiction.
On peut l’écrire de manière plus compacte :
Cette notation peut sembler plus abstraite au premier abord.
Mais elle ne fait rien de nouveau.
Elle regroupe le produit scalaire et le biais :
en une seule opération.
Regarder chaque terme du calcul
Choisissez un point, puis suivez les valeurs, les produits et leur somme. Le biais est ajouté à la fin.
La notation vectorielle n’est donc pas une nouvelle idée.
C’est simplement une manière plus pratique d’écrire le même calcul.
9. Pourquoi utiliser des vecteurs ?
Avec seulement deux variables, écrire :
reste parfaitement lisible.
Mais imaginons maintenant que nous utilisions cent variables.
Nous aurions :
La logique n’a pourtant pas changé.
Nous faisons toujours la même chose :
- chaque variable est multipliée par un poids ;
- toutes les contributions sont additionnées ;
- le biais est ajouté à cette somme.
Avec :
et :
nous pouvons écrire tout cela simplement :
Que , ou , l’équation reste la même.
C’est précisément l’intérêt de cette notation.
10. Prédire plusieurs observations d’un seul coup
Pour l’instant, représentait une seule observation.
Mais notre dataset en contient plusieurs.
Prenons trois observations comportant chacune deux variables :
Nous pouvons les empiler dans une matrice :
Chaque ligne correspond à une observation.
Chaque colonne correspond à une variable.
Nos poids restent :
Nous pouvons maintenant calculer toutes les prédictions en une seule opération :
Le vecteur contient trois fois la valeur 1 : multiplier ce vecteur par ajoute le même biais à chacune des trois prédictions.
11. Déplier la multiplication
L’écriture :
semble extrêmement compacte.
Déplions-la.
La première ligne produit :
La deuxième :
Et ainsi de suite.
Autrement dit, la multiplication matricielle n’est ici qu’un moyen de dire :
applique le même modèle à toutes les observations.
Déplier la multiplication matricielle
Chaque ligne de X produit une prédiction. Les trois observations viennent du même nuage que les scènes précédentes.
C’est exactement le même modèle que tout à l’heure.
Nous avons seulement changé notre manière de l’écrire.
12. Généraliser à observations et variables
Nous pouvons maintenant oublier le cas particulier de deux variables.
Supposons que nous ayons :
- observations
- variables par observation.
Notre matrice de données possède alors la forme :
Le vecteur des poids :
Et les prédictions :
où contient fois la valeur 1, et avec :
La géométrie devient impossible à représenter directement lorsque augmente.
Mais le calcul ne change pas.
Pour chaque observation :
puis pour toutes les observations à la fois :
La régression linéaire en grande dimension repose donc exactement sur la même idée que notre première droite.
Nous avons simplement remplacé deux paramètres visibles par un vecteur pouvant en contenir beaucoup plus.
13. Et la loss dans tout ça ?
Notre modèle produit désormais un vecteur de prédictions :
Nous possédons également les vraies valeurs :
La différence :
contient tous les résidus du modèle.
Notre MSE devient donc :
ou, sous forme vectorielle :
Encore une fois, la notation semble beaucoup plus compacte.
Mais elle décrit exactement ce que nous faisions déjà avec notre première droite :
- produire une prédiction ;
- la comparer à la vraie valeur ;
- mesurer l’erreur ;
- chercher les paramètres qui rendent cette erreur aussi faible que possible.
La seule différence est que notre espace de paramètres peut maintenant comporter beaucoup plus de dimensions.
Avec deux paramètres, nous pouvions visualiser la surface de loss.
Avec cent paramètres, cette surface existe toujours.
Nous ne pouvons simplement plus la dessiner.
14. La régression linéaire est donc un problème d’optimisation
Nous sommes partis d’un problème très simple :
tracer une droite au milieu de quelques points.
Progressivement, cette idée est devenue :
avec un objectif :
Le rôle du modèle est de transformer les entrées en prédictions.
Le rôle de la fonction de coût est de mesurer la qualité de ces prédictions.
Il reste alors à choisir les paramètres et qui minimisent cette fonction.
Et c’est précisément ici que commence le problème suivant.
Jusqu’à présent, nous avons pu modifier les poids nous-mêmes avec des sliders.
Mais un modèle de machine learning doit pouvoir les trouver automatiquement.
Comment savoir dans quelle direction modifier chaque poids ?
De combien faut-il le modifier ?
Et maintenant que nous savons quel problème nous voulons résoudre, il reste à voir comment le résoudre automatiquement.