- Mathématiques appliquées à l'ingénierie de l'apprentissage automatique
Les fondements mathématiques de l'apprentissage automatique ne sont pas une fin en soi, mais un ensemble d'outils pratiques pour résoudre les problèmes courants des modèles. Par exemple, l'instabilité des gradients ou les chutes de performance en production découlent souvent d'une compréhension insuffisante des principes sous-jacents. Ce guide met l'accent sur l'intuition mathématique nécesasire pour déboguer efficacement, en couvrant l'algèbre linéaire, les probabilités, le calcul différentiel et l'inférence statistique.
- Algèbre linéaire : interpréter les transformations de données
2.1 Vecteurs et matrices : au-delà des tableaux numériques
Dans les modèles d'apprentissage, les matrices représentent des transformations linéaires. Par exemple, une couche d'embedding dans un réseau neuronal projette des identifiants discrets dans un espace vectoriel continu. La similarité cosinus entre vecteurs reflète la proximité sémantique, bien plus que la différence numérique des identifiants.
La multiplication matricielle X @ W implique une rotation et une mise à l'échelle des coordonnées. Si les colonnes de W ont des normes élevées, cela peut indiquer un surajustement. Pour surveiller cela, on peut calculer le nombre de condition de la matrice :
# Vérification périodique du conditionnement de la matrice de poids
if step % 150 == 0:
cond_num = torch.linalg.cond(weight_matrix)
if cond_num > 1000:
logger.warning(f"Conditionnement détérioré : {cond_num:.3f}")
2.2 Valeurs propres et vecteurs propres : identifier les points focaux du modèle
Les vecteurs propres révèlent les directions principales dans lesquelles les données varient. Dans les mécanismes d'attention, la matrice de similarité Q @ K.T peut être décomposée pour identifier les combinaisons de tokens clés. Par exemple, après décomposition, les premiers vecteurs propres peuvent correspondre aux mots importants d'une requête.
On peut analyser cela avec :
# Extraction de la matrice d'attention moyenne par tête
attn_matrix = model.attention_layers[layer_idx].weights.mean(dim=0)
eigenvalues, eigenvectors = torch.linalg.eig(attn_matrix)
# Ratio de la valeur propre dominante
dominant_ratio = eigenvalues[0].real / eigenvalues.sum().real
if dominant_ratio < 0.3:
print("Attention diffuse : ajuster le paramètre de température")
2.3 Décomposition matricielle : SVD pour la compression et le diagnostic
La décomposition en valeurs singulières (SVD) aide à comprednre le rang intrinsèque d'une matrice. Par exemple, pour optimiser un modèle de recommandation, on peut tronquer la SVD en gardant les k premières valeurs singulières, en choisissant k au point de coude de la courbe de décroissance.
Ce k peut servir d'indicateur de santé : une augmentation soudaine peut signaler un décalage de distribution.
- Théorie des probabilités : quantifier l'incertitude
3.1 Perspectives bayésiennes : interprétation des techniques de régularisation
La décroissance de poids (weight_decay) correspond à une prior gaussienne sur les paramètres, encourageant des valeurs proches de zéro. Le Dropout équivaut à une prior de Bernoulli, favorisant la parcimonie. La normalisation par lots (BatchNorm) impose une distribution d'entrée stable, facilitant l'optimisation.
Choisir ces hyperparamètres revient à spécifier des croyances a priori :
- Pour une régularisation forte, augmenter
weight_decay. - Pour des caractéristiques éparses, préférer Dropout.
- Pour des variations d'échelle, ajuster l'epsilon de BatchNorm.
3.2 Probabilités conditionnelles : modélisation des relations complexes
Les modèles supervisés apprennent p(y|x). Par exemple, les réseaux neuronaux estiment une densité de probabilité conditionnelle complexe. Pour des données séquentielles, des modèles comme les champs aléatoires conditionnels (CRF) modélisent les dépendances entre étiquettes adjacentes.
Les modèles génératifs comme les VAE apprennent p(x|z) via une réparamétrisation : z = μ + σ·ε, où ε ~ N(0,1). Si les reconstructions sont floues, la variance σ peut être trop petite ; l'introduction d'un coefficient β dans la perte KL peut aider.
3.3 Modèles graphiques probabilistes : raisonnement causal
Pour des problèmes de recommandation ou de diagnostic, les réseaux bayésiens modélisent les relations causales. Par exemple, une chaîne Utiilsateur → Clic → Achat → Retour peut être analysée via des tables de probabilités conditionnelles (CPT).
# Exemple de définition d'une CPT avec PyMC3
import pymc3 as pm
with pm.Model() as bayesian_model:
p_return = pm.Normal('p_return', mu=0.1, sigma=0.05)
observations = pm.Bernoulli('obs', p=p_return, observed=data)
trace = pm.sample(500)
- Calcul différentiel et optimisation : guider la descente de gradient
4.1 Nature des gradients : approximations linéaires locales
Le gradient ∇L représente la meilleure approximation linéaire de la perte autour du point courant. Le taux d'apprentissage η contrôle la taille du pas, assurant la validité de l'approximation. Des gradients instables peuvent être stabilisés par l'écrêtage :
# Écrêtage des gradients pour éviter l'explosion
def clip_gradients(gradients, max_norm=1.0):
total_norm = torch.norm(torch.stack([torch.norm(g) for g in gradients]))
clip_coef = max_norm / (total_norm + 1e-6)
if clip_coef < 1:
for g in gradients:
g.detach().mul_(clip_coef)
4.2 Optimisation du second ordre : défis en apprentissage profond
Les méthodes comme Newton utilisent la Hessienne H, mais son calcul est coûteux. Des approches quasi-Newton comme L-BFGS sont utilisées pour des problèmes de petite taille. Pour détecter les points selles, on peut estimer la courbure via le produit Hessien-vecteur :
def hessian_vector_product(loss, params, vector):
grad = torch.autograd.grad(loss, params, create_graph=True)
hv = torch.autograd.grad(grad, params, grad_outputs=vector)
return hv
4.3 Taux d'apprentissage adaptatifs : défauts et corrections d'Adam
Adam utilise des moyennes mobiles exponentielles des moments. Pour les gradients épars, l'initialisation de v_t à epsilon peut prévenir la divergence. De plus, désactiver la correction de biais en début d'entraînement peut stabiliser l'apprentissage.
- Inférence statistique : évaluation et diagnostic des modèles
5.1 Décomposition biais-variance : diagnostic de la généralisation
L'erreur de généralisation se décompose en biais carré, variance et erreur irréductible. Une variance élevée indique un surajustement, pouvant être réduit par des techniques comme l'encodage cible ou l'augmentation des données.
5.2 Validation croisée : pièges et solutions
La validation croisée K-fold suppose des données i.i.d., ce qui n'est pas toujours vrai. Pour les données temporelles, utiliser une validation croisée séquentielle. Pour les données groupées, utiliser GroupKFold pour éviter la fuite d'information.
5.3 Quantification de l'incertitude : prédictions fiables
Pour fournir des intervalles de confiance, des méthodes comme le Dropout Monte Carlo sont utilisées :
def predict_with_uncertainty(model, input_data, n_forward=50):
preds = [model(input_data) for _ in range(n_forward)]
mean_pred = torch.stack(preds).mean(dim=0)
std_pred = torch.stack(preds).std(dim=0)
return mean_pred, std_pred
Combiner cela avec un ensemble de modèles améliore la robustesse.
- Débogage courant : table de correspondance mathématique
Pour diagnostiquer les problèmes d'entraînement :
| Symptôme | Indicateur clé | Cause mathématique | Solution |
|---|---|---|---|
| Perte non décroissante | ||∇L|| < 1e-6 |
Gradient évanouissant | Changer d'activation, utiliser BatchNorm |
| Perte explosive | ||∇L|| > 1e3 |
Gradient explosif | Écrêtage des gradients |
| Oscillations | Conditionnement κ > 1000 | Matrice mal conditionnée | Normalisation spectrale des poids |