Cours 1 sur 7 · AI COURSE

Mathématiques pour l’IA

Le socle commun des six autres cours : algèbre linéaire vue comme géométrie, calcul différentiel jusqu'au calcul matriciel, probabilités, maximum de vraisemblance, théorie de l'information, optimisation, puis inférence probabiliste.

21 chapitres36 blocs21 TD · 105 exercices corrigés
Un chapitre, plusieurs niveauxChaque chapitre empile les blocs du même sujet, du plus accessible au plus rigoureux.
BasesIntuition, calcul détaillé, premier TP.
Orienté LLMLe même sujet vu depuis les grands modèles.
RigueurÉnoncés, preuves, niveau master.
NouveauBlocs écrits pour combler ce cours.
Le Carnet décideLe planning indique, séance par séance, quels blocs lire.

Partie 1

Algèbre linéaire

Manipuler des tableaux de nombres, et surtout voir une matrice comme une transformation de l'espace.

Chapitre 1

Vecteurs, matrices, tenseurs

3 blocs · Bases → Orienté LLM → TD

1.1Basesex-DLZ 01
1.1

Scalaires, vecteurs, matrices, tenseurs

Prérequis : bloc DL 1.1 · Notions : dimension, shape, indexation, reshape, transposition, opérations élément par élément, broadcasting

Cours

Toutes les données d'un réseau de neurones (images, sons, textes, poids) sont stockées dans des tableaux de nombres. Ce qui distingue ces tableaux, c'est leur nombre d'axes, qu'on appelle le rang (ou l'ordre), et leur forme (shape), qui donne la taille de chaque axe.

ObjetRangNotationShapeExemple concret
Scalaire0a∈R()une température : 21,5
Vecteur1x∈Rn(n,)les 3 notes d'un élève
Matrice2A∈Rm×n(m, n)une image en niveaux de gris
Tenseur3+T∈Rd1×d2×…(d₁, d₂, …)un lot d'images couleur

R désigne l'ensemble des nombres réels. Rn est l'ensemble des listes de n réels. On écrit un vecteur en colonne :

x=(x1x2⋮xn),A=(a11a12⋯a1n⋮⋱⋮am1am2⋯amn)

L'élément aij est à la ligne i, colonne j. En Python les indices commencent à 0 : A[0, 1] correspond à a12.

Les conventions du deep learning

Le premier axe est presque toujours le batch (le lot d'exemples traités ensemble). Formes typiques à connaître par cœur :

  • Données tabulaires : (B, F), B exemples, F caractéristiques.
  • Images (PyTorch) : (B, C, H, W), canaux (3 pour RVB), hauteur, largeur.
  • Texte dans un Transformer : (B, T, D), T jetons (tokens) de dimension D.
  • Audio brut : (B, canaux, échantillons) ; un spectrogramme : (B, fréquences, trames).

Le nombre total d'éléments est le produit des tailles : un tenseur (32, 3, 64, 64) contient 32×3×64×64=393216 nombres.

Opérations de base

Reshape : réorganiser les mêmes éléments dans une autre forme, sans en changer l'ordre de lecture (ligne par ligne). Une image (28, 28) devient un vecteur (784,). Condition : le produit des tailles doit rester identique.

Transposition : échanger lignes et colonnes, (A⊤)ij=aji. Une matrice m×n devient n×m.

Opérations élément par élément : A+B, A⊙B (produit de Hadamard, terme à terme), exp⁡(A)… Elles exigent des formes compatibles et s'appliquent case par case.

Réductions : somme, moyenne, max le long d'un axe. x.sum(axis=0) fait disparaître l'axe 0.

Le broadcasting, règle par règle

Comment additionner une matrice (4, 3) et un vecteur (3,) ? NumPy et PyTorch « étirent » virtuellement le plus petit. Règle exacte : on aligne les formes par la droite ; deux tailles sont compatibles si elles sont égales ou si l'une vaut 1 ; un axe manquant à gauche compte comme 1 ; l'axe de taille 1 est recopié.

(4,3)⏟A+(4,3)⏟b→(4,3)+(1,3)→(4,3)

C'est exactement ce qui se passe quand on ajoute le biais b à chaque ligne d'un lot dans une couche de neurones. Piège classique : (4,) + (4, 1) donne (4, 4), pas (4,).

Schéma du coursDu rang 0 au rang 3 : on ajoute un axe à chaque fois.
7 scalaireshape () 2518 vecteurshape (4,) a₃₃ i j matriceshape (3, 3) tenseur rang 3shape (3, 3, 3)
Mon schémaLe broadcasting comme un tampon encreur : le vecteur biais est « tamponné » sur chaque ligne du lot.
lot X (4, 3) + biais b (3,) b₁b₂b₃ copié 4 fois aligné à droite : (4,3)+(3,) → (4,3)+(1,3) → recopié
Exemple du cours

MNIST. Une image de chiffre manuscrit fait 28×28 pixels en niveaux de gris : une matrice (28, 28). Un réseau dense (bloc DL 10.2) attend un vecteur : on aplatit en (784,) car 28×28=784. Si on traite 64 images d'un coup, le lot a la forme (64, 784).

Normalisation : les pixels valent de 0 à 255 ; on divise tout le tenseur par 255 (un scalaire, broadcasté sur les 50 176 éléments) pour obtenir des valeurs dans [0, 1].

Exemple inventé

Une table de mixage. Tu enregistres 8 pistes, chacune en stéréo, 4 secondes à 48 000 Hz. Le tenseur brut : (8, 2, 192000), soit 3 072 000 nombres. Tu veux baisser chaque piste d'un gain différent : un vecteur (8,). Pour le broadcaster, il faut le mettre en forme (8, 1, 1) : chaque gain est alors recopié sur les 2 canaux et les 192 000 échantillons de sa piste. Si tu oublies et écris gains[:, None] → (8, 1), NumPy aligne par la droite : (8, 1) contre (2, 192000)… et lève une erreur. La lecture des formes est la première compétence de débogage en deep learning.

TP · Manipuler les formes
  1. Crée un lot de 16 images RVB 32×32 aléatoires. Affiche sa forme et son nombre d'éléments.
  2. Aplatis chaque image (sans mélanger les images entre elles) pour obtenir (16, 3072).
  3. Calcule la moyenne de chaque canal sur tout le lot (résultat (3,)) et soustrais-la par broadcasting.
  4. Vérifie le piège (4,) + (4, 1).
Solution commentée
import numpy as np
rng = np.random.default_rng(1)
X = rng.random((16, 3, 32, 32))                 # (B, C, H, W)
print(X.shape, X.size)                          # (16, 3, 32, 32) 49152
assert X.size == 16 * 3 * 32 * 32

flat = X.reshape(16, -1)                        # -1 : "calcule cette taille toi-même"
assert flat.shape == (16, 3072)
assert np.allclose(flat[5], X[5].ravel())       # l'image 5 reste l'image 5

moy = X.mean(axis=(0, 2, 3))                    # on réduit batch, H, W -> reste C
assert moy.shape == (3,)
Xc = X - moy[None, :, None, None]               # (3,) -> (1, 3, 1, 1) pour aligner sur C
assert np.allclose(Xc.mean(axis=(0, 2, 3)), 0)  # chaque canal est centré

a = np.arange(4)            # (4,)
b = np.arange(4)[:, None]   # (4, 1)
print((a + b).shape)        # (4, 4) : le piège !
assert (a + b).shape == (4, 4)

À retenir

  • Rang = nombre d'axes ; shape = taille de chaque axe ; le premier axe est le batch.
  • Reshape conserve l'ordre de lecture ; transposition échange les axes.
  • Broadcasting : aligner par la droite, tailles égales ou 1.
  • Toujours écrire les formes en commentaire quand on code un réseau.
1.2Orienté LLMex-FMAZ 2
1.2

Matrices, produit matriciel et tenseurs

Prérequis : bloc 2.2 (produit scalaire).

Cours
DéfinitionUne matrice A∈Rm×n est un tableau de m lignes et n colonnes. Aij est l'élément ligne i, colonne j. Un tenseur généralise aux dimensions supérieures : un lot de séquences d'embeddings a la forme (B,T,d) = (taille du lot, longueur de séquence, dimension).

Produit matriciel

Pour A∈Rm×n et B∈Rn×p, le produit C=AB∈Rm×p est défini par :

Cij=∑k=1nAikBkj

Autrement dit : Cij est le produit scalaire de la ligne i de A avec la colonne j de B. La dimension intérieure n doit être identique : (m×n)(n×p)→(m×p). C'est la règle à vérifier en premier quand un code plante.

Propriétés à retenir

  • Non commutatif : en général AB≠BA (souvent BA n'existe même pas).
  • Associatif : (AB)C=A(BC). L'ordre des calculs change le coût, pas le résultat.
  • Transposée : (A⊤)ij=Aji et (AB)⊤=B⊤A⊤.
  • Identité : I telle que AI=IA=A.
  • Coût : m×p produits scalaires de longueur n, soit mnp multiplications et autant d'additions, donc 2mnp FLOPs. Ce chiffre servira à calculer le coût d'entraînement (blocs FM 2.1 et FM 5.2).

La couche linéaire

La brique de base de tout réseau est y=xW+b avec x∈Rdin, W∈Rdin×dout, b∈Rdout. Chaque sortie yj est un produit scalaire de l'entrée avec la colonne j de W : chaque colonne est un « détecteur » qui mesure à quel point x ressemble à un certain motif.

Sur un lot, on empile les entrées en lignes : X∈RB×din, Y=XW+b (le biais est diffusé, broadcast, sur chaque ligne). Sur des tenseurs (B,T,din), le produit s'applique sur la dernière dimension et donne (B,T,dout).

ConventionLes articles écrivent souvent Wx (vecteur colonne) ; PyTorch stocke nn.Linear.weight sous la forme (dout,din) et calcule xW⊤. Même opération, rangement différent.
Schéma du cours

Fin de l'aperçu

Débloquer la suite