Overfitting
Le surapprentissage se produit lorsqu’un modèle mémorise ses données d’entraînement, y compris le bruit, et échoue sur de nouvelles données. Découvre comment le repérer et quelles méthodes permettent de l’éviter.
Le surapprentissage se produit lorsqu’un modèle d’apprentissage automatique s’ajuste si étroitement à ses données d’entraînement qu’il apprend le bruit et les particularités de ces exemples précis en même temps que les véritables motifs. Un modèle surajusté obtient de bons résultats sur les données qui ont servi à son entraînement et des résultats nettement moins bons sur de nouvelles données ; l’ampleur de cet écart indique le degré de surapprentissage. En termes de biais-variance, le surapprentissage correspond à une variance élevée : les prédictions du modèle dépendent excessivement des échantillons particuliers qu’il a vus.
Reconnaître le surapprentissage#
Le signe révélateur est un écart croissant entre les performances sur les données d’entraînement et sur les données de validation. Sur les courbes d’apprentissage tracées à chaque époque, la perte d’entraînement continue de diminuer, tandis que la perte de validation se stabilise puis augmente et que les métriques de validation, comme la précision moyenne (mAP), stagnent ou diminuent. La démonstration classique à petite échelle consiste à ajuster des polynômes de deux degrés différents à 12 points bruités échantillonnés sur une sinusoïde :
import numpy as np
from numpy.polynomial import Polynomial
rng = np.random.default_rng(0)
# 12 noisy training points from a sine wave, plus clean test points
x_train = rng.uniform(0, 1, 12)
y_train = np.sin(2 * np.pi * x_train) + rng.normal(0, 0.2, 12)
x_test = np.linspace(0, 1, 200)
y_test = np.sin(2 * np.pi * x_test)
for degree in (3, 9):
fit = Polynomial.fit(x_train, y_train, degree)
train_mse = np.mean((fit(x_train) - y_train) ** 2)
test_mse = np.mean((fit(x_test) - y_test) ** 2)
print(f"Degree {degree:2d}: train MSE {train_mse:.4f}, test MSE {test_mse:.4f}")Le polynôme de degré 9 a assez de flexibilité pour épouser le bruit, ce qui réduit son erreur d’entraînement de 0.0356 à 0.0148, mais multiplie par dix son erreur de test, qui passe de 0.0182 à 0.1859.
Surapprentissage et sous-apprentissage#
Le sous-apprentissage est le problème inverse : le modèle est trop simple ou entraîné trop brièvement pour saisir les motifs des données ; ses performances sont donc mauvaises à la fois sur les données d’entraînement et de validation. Comparer les deux erreurs permet de distinguer les situations et d’indiquer des solutions différentes.
Causes courantes#
- Capacité trop élevée par rapport aux données : un réseau neuronal comportant des millions de paramètres peut mémoriser intégralement quelques centaines d’images.
- Données bruitées ou mal étiquetées : les boîtes manquantes, les classes erronées et les valeurs aberrantes donnent au modèle des erreurs à apprendre qui n’existent pas dans le monde réel.
- Entraînement trop long : une fois les motifs utiles appris, les époques supplémentaires apprennent surtout le bruit restant.
- Données d’entraînement trop limitées : un détecteur entraîné uniquement sur des images diurnes provenant d’une seule caméra peut s’appuyer sur l’arrière-plan et l’éclairage de cette caméra, et manquer des objets sur un nouveau site.
Prévenir le surapprentissage#
- Des données plus nombreuses et plus variées : ajouter de nouveaux exemples réels est la solution la plus directe, et l’augmentation des données multiplie la variété en retournant, redimensionnant, recolorant et mélangeant les images existantes.
- Régularisation : la décroissance des poids pénalise les poids de grande valeur, et le dropout désactive aléatoirement des unités pendant l’entraînement afin qu’aucune caractéristique ne devienne indispensable.
- Modèles plus petits ou préentraînés : un modèle plus petit a moins de capacité à mémoriser, et l’apprentissage par transfert avec des couches initiales gelées réduit le nombre de poids à apprendre à partir d’un petit jeu de données.
- Arrêt anticipé : évaluer le modèle sur les données de validation après chaque époque et arrêter dès que le score cesse de s’améliorer évite que l’entraînement ne finisse par apprendre le bruit.
- Évaluation rigoureuse : la validation croisée fournit une estimation plus fiable de l’erreur de généralisation sur les petits jeux de données, et un jeu de test distinct permet de détecter le surapprentissage des données de validation pendant le réglage des hyperparamètres.
L’entraînement Ultralytics YOLO applique l’arrêt anticipé au moyen de l’argument patience, qui met fin à une exécution après ce nombre d’époques sans amélioration de la performance de validation (mAP50-95 pour la détection) ; les poids de la meilleure époque sont enregistrés sous best.pt, même si l’entraînement va jusqu’au bout.
from ultralytics import YOLO
# Charger un modèle YOLO26n préentraîné
model = YOLO("yolo26n.pt")
# # Autorise jusqu’à 100 époques, mais arrête après 20 époques sans amélioration de la validation
results = model.train(data="coco8.yaml", epochs=100, patience=20)La valeur par défaut est patience=100 et, pour les jeux de données de moins de 1 000 images, les conseils de réglage fin de YOLO26 recommandent epochs=50 avec patience=20.
Surapprentissage et notions connexes#
- Fuite de données : chevauchement entre les données d’entraînement et d’évaluation, qui dissimule le surapprentissage. Lorsque des images presque identiques d’une même vidéo se retrouvent à la fois dans les partitions d’entraînement et de validation, un modèle qui a mémorisé l’ensemble d’entraînement obtient toujours de bons résultats en validation, et le problème n’apparaît qu’après le déploiement. Une partition par vidéo ou par scène l’évite.
- Apprentissage de raccourcis : le modèle s’appuie sur un indice fallacieux, comme un filigrane ou l’arrière-plan, présent à la fois dans les données d’entraînement et de validation. Les scores de validation semblent bons, mais le modèle échoue sur de nouvelles données où cet indice est absent.










