Cet article s'inspire principalement d'une présentation issue du Deep Learning Indaba 2025 qui s'est tenu au Rwanda, organisée par Dr. Ismaila SECK, Géraud Nangue Tasse et l'équipe DLI.
L'algèbre linéaire est l'un des piliers mathématiques fondamentaux en machine learning, comme l'illustre clairement cette présentation. Comprendre ces concepts vous permettra de:
Cet article constitue la première partie d'une série couvrant les fondements mathématiques du machine learning.
Dans cet article, nous explorerons les bases de l'algèbre linéaire nécessaires pour débuter en machine learning, en nous concentrant sur les vecteurs, les matrices et leurs applications pratiques, y compris des techniques modernes comme Low-Rank Adaptation (LoRA).
Mathématiquement, un vecteur est défini comme tout élément d'un espace vectoriel. Un espace vectoriel réel \(V\) est un ensemble d'objets avec deux opérations:
Pour tous vecteurs \(a, b, c \in V\), l'addition vectorielle doit satisfaire:
Dans le machine learning, les vecteurs sont omniprésents. Considérons un dataset immobilier typique:
price | area | bedrooms | bathrooms | stories | mainroad | guestroom |
---|---|---|---|---|---|---|
13300000 | 7420 | 4 | 2 | 3 | yes | no |
12250000 | 8960 | 4 | 4 | 4 | yes | no |
Chaque ligne représente un vecteur contenant les caractéristiques d'une maison. Si nous avons une maison qui coûte 13 300 000 FCFA, avec une superficie de 7420 m², 4 chambres et 2 salles de bain, nous pouvons représenter cette maison par le vecteur:
\(Maison = [13300000, 7420, 4, 2]\)
En notation mathématique, un vecteur peut être représenté verticalement:
\[ a = \begin{bmatrix} 1 \\ 2 \\ 3 \\ 4 \end{bmatrix} \]
Ou horizontalement: \(a = [1, 2, 3, 4]\)
Addition de vecteurs: Si vous avez deux vecteurs \(a = [1, 2, 3, 4]\) et \(b = [5, 6, 7, 8]\), leur somme est:
\(a + b = [1+5, 2+6, 3+7, 4+8] = [6, 8, 10, 12]\)
Multiplication par un scalaire: Multiplier un vecteur par un nombre (scalaire) étire ou rétrécit le vecteur. Par exemple:
\(0.5 \times [1, 2, 3, 4] = [0.5, 1, 1.5, 2]\)
Ces opérations sont essentielles dans les algorithmes de machine learning, où les vecteurs représentent souvent des caractéristiques de données ou des poids de modèles.
Le produit scalaire est une méthode de multiplication de vecteurs produisant un scalaire. Pour \(a, b \in \mathbb{R}^n\), leur produit scalaire est:
\(a \cdot b = \sum_{i=1}^{n} (a_i b_i)\)
C'est simplement la somme des produits des entrées respectives dans les vecteurs.
Exemple concret: Soit \(a = [1, 2, 3, 4]\) et \(b = [5, 6, 7, 8]\) \(a \cdot b = (1 \times 5) + (2 \times 6) + (3 \times 7) + (4 \times 8) = 5 + 12 + 21 + 32 = 70\)
Le produit scalaire mesure à quel point deux vecteurs pointent dans la même direction. Plus le produit scalaire est grand, plus les vecteurs sont alignés.
Le produit scalaire est extrêmement courant en machine learning:
Dans un modèle de recommandation de films, si vous avez un vecteur représentant les préférences d'un utilisateur et un vecteur représentant les caractéristiques d'un film, leur produit scalaire indiquera à quel point le film correspond aux préférences de l'utilisateur.
Une norme mesure la "taille" ou la "longueur" d'un vecteur. C'est comme une règle qui mesure la distance d'un point à l'origine.
Pour un vecteur \(a = [1, 2, 3, 4]\): \(\|a\|_2 = \sqrt{a \cdot a} = \sqrt{1^2 + 2^2 + 3^2 + 4^2} = \sqrt{30} \approx 5.477\)
C'est la distance "à vol d'oiseau" depuis l'origine jusqu'au point représenté par le vecteur. Si vous imaginez un vecteur dans un espace 2D, c'est simplement le théorème de Pythagore: \(\sqrt{x^2 + y^2}\).
Un vecteur avec \(\|a\| = 1\) est appelé vecteur unitaire. Tout vecteur peut être normalisé en le divisant par sa norme: \(\frac{1}{\|a\|}a\).
Les normes sont utilisées pour:
Dans un modèle de prédiction de prix de maisons, si vous utilisez la norme L1 (1-norm) pour la régularisation, le modèle aura tendance à sélectionner uniquement les caractéristiques les plus importantes (comme la superficie et le nombre de chambres) et à ignorer les autres.
Une matrice \(m \times n\) est simplement un tableau \(m \times n\) de nombres réels:
\[ A = \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \dots & a_{mn} \end{bmatrix} \]
L'ensemble de toutes les matrices \(m \times n\) réelles est souvent noté \(\mathbb{R}^{m \times n}\).
La multiplication matricielle n'est pas simplement une multiplication élément par élément. C'est une opération qui combine les lignes de la première matrice avec les colonnes de la seconde.
Soit \(A\) une matrice \(m \times k\) et \(B\) une matrice \(k \times n\), multiplier \(B\) par \(A\) produit une matrice \(m \times n\) \(C\): \(C = AB\)
Les composantes de \(C\) sont: \(C_{ij} = A_{i\cdot}B_{\cdot j}\)
où \(A_{i\cdot}\) désigne la i-ème ligne de \(A\) et \(B_{\cdot j}\) la j-ème colonne de \(B\).
Exemple concret:
\[ A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}, \quad B = \begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix} \]
\(C_{11} = (1 \times 7) + (2 \times 9) + (3 \times 11) = 7 + 18 + 33 = 58\)
\(C_{12} = (1 \times 8) + (2 \times 10) + (3 \times 12) = 8 + 20 + 36 = 64\)
\(C_{21} = (4 \times 7) + (5 \times 9) + (6 \times 11) = 28 + 45 + 66 = 139\)
\(C_{22} = (4 \times 8) + (5 \times 10) + (6 \times 12) = 32 + 50 + 72 = 154\)
Donc:
\[ C = \begin{bmatrix} 58 & 64 \\ 139 & 154 \end{bmatrix} \]
Une matrice peut représenter une transformation géométrique. Voici des exemples concrets de matrices de transformation:
Pour une rotation de \(\theta\) degrés dans le plan 2D:
\[ R(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} \]
Exemple de rotation de 45° (\(\theta = \pi/4\)):
\[ R(\pi/4) = \begin{bmatrix} \sqrt{2}/2 & -\sqrt{2}/2 \\ \sqrt{2}/2 & \sqrt{2}/2 \end{bmatrix} \approx \begin{bmatrix} 0.707 & -0.707 \\ 0.707 & 0.707 \end{bmatrix} \]
Application: Si vous avez un point \((1, 0)\) et que vous appliquez cette matrice:
\[ \begin{bmatrix} 0.707 & -0.707 \\ 0.707 & 0.707 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0.707 \\ 0.707 \end{bmatrix} \]
Le point est maintenant à \((0.707, 0.707)\), ce qui correspond à une rotation de 45°.
Pour étirer selon l'axe x par un facteur \(s_x\) et selon l'axe y par un facteur \(s_y\):
\[ S = \begin{bmatrix} s_x & 0 \\ 0 & s_y \end{bmatrix} \]
Exemple d'étirement horizontal par un facteur 2 (\(s_x = 2, s_y = 1\)):
\[ S = \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix} \]
Application: Si vous avez un point \((1, 1)\) et que vous appliquez cette matrice:
\[ \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 2 \\ 1 \end{bmatrix} \]
Le point est maintenant à \((2, 1)\), ce qui signifie qu'il a été étiré horizontalement.
Pour réfléchir par rapport à l'axe x:
\[ F_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \]
Pour réfléchir par rapport à l'axe y:
\[ F_y = \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} \]
Exemple de réflexion par rapport à l'axe x:
\[ F_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \]
Application: Si vous avez un point \((2, 3)\) et que vous appliquez cette matrice:
\[ \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \end{bmatrix} = \begin{bmatrix} 2 \\ -3 \end{bmatrix} \]
Le point est maintenant à \((2, -3)\), ce qui correspond à une réflexion par rapport à l'axe x.
Pour un cisaillement horizontal:
\[ H_x = \begin{bmatrix} 1 & k \\ 0 & 1 \end{bmatrix} \]
Pour un cisaillement vertical:
\[ H_y = \begin{bmatrix} 1 & 0 \\ k & 1 \end{bmatrix} \]
Exemple de cisaillement horizontal avec \(k = 0.5\):
\[ H_x = \begin{bmatrix} 1 & 0.5 \\ 0 & 1 \end{bmatrix} \]
Application: Si vous avez un point \((1, 1)\) et que vous appliquez cette matrice:
\[ \begin{bmatrix} 1 & 0.5 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 1.5 \\ 1 \end{bmatrix} \]
Le point est maintenant à \((1.5, 1)\), ce qui correspond à un décalage horizontal proportionnel à la coordonnée y.
Pour projeter sur l'axe x:
\[ P_x = \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \]
Pour projeter sur l'axe y:
\[ P_y = \begin{bmatrix} 0 & 0 \\ 0 & 1 \end{bmatrix} \]
Exemple de projection sur l'axe x:
\[ P_x = \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \]
Application: Si vous avez un point \((2, 3)\) et que vous appliquez cette matrice:
\[ \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \end{bmatrix} = \begin{bmatrix} 2 \\ 0 \end{bmatrix} \]
Le point est maintenant à \((2, 0)\), ce qui correspond à une projection sur l'axe x.
Les transformations peuvent être combinées en multipliant les matrices. Par exemple, pour d'abord faire une rotation puis une mise à l'échelle:
\(T = S \times R(\theta)\)
Exemple:
\[ S = \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix}, \quad R(\pi/4) = \begin{bmatrix} 0.707 & -0.707 \\ 0.707 & 0.707 \end{bmatrix} \]
\[ T = \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix} \times \begin{bmatrix} 0.707 & -0.707 \\ 0.707 & 0.707 \end{bmatrix} = \begin{bmatrix} 1.414 & -1.414 \\ 0.707 & 0.707 \end{bmatrix} \]
Si vous appliquez cette transformation combinée au point \((1, 0)\):
\[ \begin{bmatrix} 1.414 & -1.414 \\ 0.707 & 0.707 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 1.414 \\ 0.707 \end{bmatrix} \]
Dans le machine learning, ces transformations matricielles sont utilisées dans divers contextes:
Si \(v\) est un vecteur de dimension \(n\) et \(A\) une matrice \(m \times n\), alors \(u = Av\) est un vecteur de dimension \(m\) avec: \(u_i = A_{i\cdot}v = \sum_{j=1}^{n} (A_{ij}v_j)\)
Dans un réseau de neurones simple, si \(x\) est un vecteur d'entrée (caractéristiques) et \(W\) est une matrice de poids, alors \(Wx\) représente la transformation linéaire appliquée aux données d'entrée avant d'appliquer une fonction d'activation.
Le produit de Hadamard est une multiplication élément par élément. Si \(A\) et \(B\) sont deux matrices \(m \times n\), alors: \(C = A \odot B\)
où \(C_{ij} = A_{ij}B_{ij}\)
Exemple:
\[ A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}, \quad B = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix}, \quad C = A \odot B = \begin{bmatrix} 1 & 8 \\ 6 & 20 \\ 15 & 36 \end{bmatrix} \]
Le produit de Hadamard est utilisé en machine learning, notamment lors de l'application d'un masque sur les poids d'un réseau de neurones (comme dans l'hypothèse du "billet gagnant" où certains poids sont mis à zéro).
Pour une matrice \(A \in \mathbb{R}^{m \times n}\), la matrice \(B \in \mathbb{R}^{n \times m}\) avec \(B_{ij} = A_{ji}\) est appelée la transposée de \(A\). On écrit \(B = A^T\).
Exemple:
\[ A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}, \quad A^T = \begin{bmatrix} 1 & 3 & 5 \\ 2 & 4 & 6 \end{bmatrix} \]
Une matrice telle que \(A = A^T\) est appelée matrice symétrique.
En traitement du langage naturel, la transposition est utilisée pour convertir entre représentations de documents-termes et termes-documents.
Pour une paire de matrices carrées \(A\) et \(B\), on dit qu'elles sont inverses l'une de l'autre si \(AB = I = BA\), où \(I\) est la matrice identité.
Les matrices qui ont un inverse sont appelées matrices inversibles.
La résolution de systèmes d'équations linéaires est une application pratique de l'inverse. Si vous avez \(Ax = b\), alors \(x = A^{-1}b\).
La trace d'une matrice carrée \(A \in \mathbb{R}^{n \times n}\) est définie comme la somme des éléments diagonaux de \(A\).
Propriétés importantes:
En optimisation, la trace est utilisée dans le calcul de la fonction de coût pour les modèles de réduction de dimensionnalité.
Imaginez que vous avez une image numérique. Une image de haute résolution nécessite beaucoup de mémoire pour être stockée. Cependant, beaucoup d'images ont des structures répétitives ou des motifs qui peuvent être représentés de manière plus compacte.
Une matrice de rang-1 \(A\) est une matrice telle qu'il existe des vecteurs \(u\) et \(v\) où \(A = uv^T\).
Exemple concret: Si \(u = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix}\) et \(v = [4, 5, 6]\), alors:
\[ A = uv^T = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} \begin{bmatrix} 4 & 5 & 6 \end{bmatrix} = \begin{bmatrix} 4 & 5 & 6 \\ 8 & 10 & 12 \\ 12 & 15 & 18 \end{bmatrix} \]
Une matrice de rang-r peut s'écrire comme une somme pondérée de r matrices de rang-1: \(A = \sum_{i=1}^{k} \sigma_i u_i v_i^T\)
C'est ce qu'on appelle la décomposition en valeurs singulières (SVD).
La compression d'images est une application pratique de cette décomposition. Une image originale (matrice) peut être approximée par une somme de quelques matrices de rang-1, réduisant ainsi considérablement la mémoire nécessaire pour la stocker.
Lorsque vous voulez adapter un grand modèle de langage (comme GPT) à une tâche spécifique (par exemple, répondre à des questions médicales), vous avez deux options:
Le problème avec le fine-tuning traditionnel est qu'il est extrêmement coûteux en ressources et crée une copie complète du modèle pour chaque adaptation.
LoRA (Low-Rank Adaptation) propose une approche intermédiaire intelligente. Au lieu de mettre à jour tous les poids, LoRA ajoute des mises à jour de faible rang aux poids existants.
Mathématiquement, si \(W\) est une matrice de poids dans le modèle pré-entraîné, LoRA propose de la mettre à jour comme suit: \(W + \Delta W = W + A \times B\)
où \(A \in \mathbb{R}^{d \times r}\) et \(B \in \mathbb{R}^{r \times k}\) sont des matrices de rang \(r \ll \min(d,k)\), et \(r\) est le rang choisi pour l'adaptation.
L'algèbre linéaire est un outil indispensable pour comprendre et développer des algorithmes de machine learning. Les vecteurs et les matrices ne sont pas seulement des structures de données pratiques, mais elles représentent des concepts géométriques puissants qui nous aident à visualiser et à comprendre comment les données sont transformées par nos modèles.
Pour approfondir vos connaissances et explorer des outils avancés, voici quelques ressources :
Ma recommandation musicale du jour : à écouter sans modération !
Écouter sur YouTube