Intuitions mathématiques pour l'apprentissage automatique : gestion des gradients, décalages de distribution et diagnostics de modèle

  1. 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.

  1. 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.

  1. 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)
  1. 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.

  1. 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.

  1. 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

Étiquettes: PyTorch algèbre linéaire probabilité bayésienne descente de gradient validation croisée

Publié le 2 juin à 16h56