Module L36 · Partie K · Ingénierie de l’IA
Les données : collecter, annoter, nettoyer, documenter — tout ce qu’il faut savoir.
Un modèle n’est jamais meilleur que ses données. Ce chapitre traite la création d’un jeu de données de bout en bout : définir ce qu’on mesure, collecter (sources, consentement, licences, échantillonnage), annoter (consignes, accord inter-annotateurs, annotation active et assistée), nettoyer (doublons, valeurs manquantes, aberrantes, étiquettes bruitées, fuites), équilibrer et augmenter, séparer (train/val/test sans fuite), documenter (datasheet), versionner — et les données pour LLM (déduplication à grande échelle, filtrage de qualité, données synthétiques, contamination). Avec les mathématiques (taille d’échantillon, accord, bruit d’étiquettes, déduplication par MinHash) et les articles.
Durée : 4 séances · Prérequis : L08, L11, L13, L32. Objectifs : concevoir une collecte et une consigne d’annotation ; mesurer et améliorer l’accord ; nettoyer et dédupliquer (exact et quasi-doublons) ; détecter les fuites et les biais ; séparer correctement ; documenter et versionner ; savoir quand générer des données synthétiques.
Ce que vous saurez faire à la fin
- Calculer la taille d’échantillon nécessaire et le budget d’annotation.
- Écrire une consigne d’annotation qui produit un kappa > 0,7, et itérer.
- Implémenter la déduplication par MinHash/LSH et la détection d’étiquettes bruitées.
- Produire un jeu versionné et documenté, avec une séparation sans fuite.
Fiche de cours · Définitions
Définitions
Fiche de cours · Formules
Formules à connaître
Fiche de cours · Théorèmes et démonstrations
Démonstrations à savoir refaire
01 / Concevoir
Du besoin au plan de collecte : population, échantillonnage, budget
| Question de conception | Réponse à écrire avant de collecter |
|---|---|
| Population cible | Qui/quoi, où, quand, dans quelles conditions (capteurs, langues, saisons, appareils) |
| Unité d’exemple | Une image, une phrase, un document, une séquence de 10 s ? Une décision par unité |
| Étiquette | Définition opérationnelle, valeurs autorisées, cas limites tranchés, exemples |
| Sources et droits | Origine, licence, consentement, données personnelles, durée de conservation |
| Échantillonnage | Aléatoire ? stratifié par condition ? sur-collecte des cas rares ? période ? |
| Métadonnées | Tout ce qui permettra les tranches (L32) et les séparations par groupe |
02 / Annoter
Consigne, accord inter-annotateurs, arbitrage — et l’annotation active
03 / Nettoyer
Schéma, valeurs manquantes et aberrantes, étiquettes bruitées — sur un jeu réaliste
03 / Nettoyer
Déduplication approximative : MinHash et LSH implémentés (Théorèmes 1 et 2)
À l’échelle (10⁹ documents) : signatures sur GPU/Spark, LSH distribué (text-dedup, datasketch), déduplication de sous-chaînes par suffix array (Lee et al. 2022). La déduplication améliore la perplexité des LLM et réduit la mémorisation — un des rares traitements qui gagnent sur les deux tableaux.
04 / Séparer et protéger
Fuites, séparations par groupe et par temps, équilibrage — vérifiés par le code
05 / Données pour LLM
Corpus de pré-entraînement et d’affinage : filtrage, déduplication, synthèse, contamination
| Étape | Ce qu’on fait | Exemples / chiffres | Piège |
|---|---|---|---|
| Collecte | Common Crawl (pétaoctets), livres, code, articles, forums ; corpus internes | RefinedWeb : 5 000 G tokens → 600 G après filtrage ; FineWeb 15 T tokens | Droits d’auteur, données personnelles, robots.txt |
| Extraction | HTML → texte (trafilatura), langue (fastText), encodage | Perte de 50–80 % du volume brut | Menus, pubs, texte dupliqué de gabarit |
| Filtrage de qualité | Heuristiques (longueur, ponctuation, ratio de symboles, répétitions), classifieurs de qualité (entraînés sur Wikipédia/livres vs web), perplexité d’un petit LM | Gopher rules ; C4 : lignes sans point final retirées | Biais : le « bon anglais » filtre les dialectes et les langues rares |
| Déduplication | Exacte (hash de documents/lignes), quasi (MinHash LSH), sous-chaînes (suffix array) | Lee et al. 2022 : −10 % de perplexité à calcul égal, mémorisation ÷10 | Dédupliquer aussi contre les jeux de test (contamination) |
| Décontamination | Retirer tout document contenant des n-grammes des benchmarks (13-grammes) | GPT-3 : 13-gram overlap ; toujours imparfait (paraphrases) | Impossible à garantir ; d’où les jeux privés (L32) |
| Mélange et pondération | Proportions par source (web 80 %, code 10 %, livres…), sur-échantillonnage des sources rares de qualité | Le mélange influence les capacités (code → raisonnement) | Époques multiples sur les données rares : rendements décroissants après 4 (Muennighoff 2023) |
| Données d’instruction | Paires (instruction, réponse) écrites par des humains, ou générées puis filtrées (Self-Instruct, Evol-Instruct), préférences (paires) | LIMA : 1 000 exemples de haute qualité suffisent pour l’alignement de base | Réponses générées par un modèle = ses biais et ses erreurs ; licences des sorties |
| Données synthétiques | Simulation, LLM générateur + vérificateur (code exécuté, maths vérifiées) | Phi : manuels synthétiques ; robotique : sim-to-real | Effondrement du modèle si l’on entraîne en boucle sur ses propres sorties (Shumailov 2024) |
06 / Documenter et versionner
Datasheet, schéma, version : le jeu de données comme artefact logiciel
# DATASHEET — obstacles-robot-v3 (extrait)
Motivation : entraîner et évaluer la détection d'obstacles du robot R2 en intérieur (couloirs, ateliers) ; commanditaire : équipe navigation.
Composition : 24 310 images 640×480 (RGB) + 24 310 scans lidar synchronisés ; 3 sites, 11 robots, 2025-11 → 2026-06 ; classes : sol, mur,
obstacle_statique, humain, vide ; 7 % 'humain' ; 1 130 images avec ≥ 2 annotateurs (kappa 0,81) ; étalon-or : 500 images arbitrées.
Collecte : capture automatique 1 img/s pendant les missions ; échantillonnage stratifié par site et par heure ; humains floutés (RGPD, base
légale : intérêt légitime, information affichée sur site) ; aucune donnée hors des sites partenaires.
Prétraitement : déduplication exacte (hash) et approximative (pHash < 6) → −2 140 ; images floues (variance du laplacien < 50) → −310 ;
étiquettes normalisées ; 41 conflits arbitrés. Script : prep/clean.py @ a1f3c9e.
Séparation : par ROBOT (test = 3 robots jamais vus) et par période (test = 2026-05/06) ; train 17 800 / val 2 900 / test 3 610 ; test scellé (hash).
Usages : détection et segmentation ; NON prévu : reconnaissance de personnes. Licence : interne ; contact : navigation@…
Maintenance : version trimestrielle ; erreurs signalées via le formulaire ; changelog ci-dessous.
Versions : v1 (2026-01, 8 000 img) → v2 (2026-04, +site C) → v3 (2026-07, déduplication, nouvelle consigne 'humain partiel').07 / Articles
Les articles à lire
| Article | Contribution | À retenir |
|---|---|---|
| Gebru et al., Datasheets for Datasets, 2018 — 1803.09010 | Documentation standardisée | Le modèle de la partie 06 |
| Broder, On the resemblance and containment of documents, 1997 ; Leskovec, Rajaraman & Ullman, Mining of Massive Datasets, chap. 3 | MinHash, LSH | Théorèmes 1 et 2 |
| Lee et al., Deduplicating Training Data Makes Language Models Better, ACL 2022 — 2107.06499 | Déduplication exacte + approximative des corpus LLM | Moins de mémorisation, meilleure perplexité |
| Northcutt, Jiang & Chuang, Confident Learning, JAIR 2021 — 1911.00068 ; Northcutt et al., Pervasive Label Errors in Test Sets, NeurIPS 2021 — 2103.14749 | Détecter les étiquettes fausses ; 3,4 % d’erreurs dans les tests standard (ImageNet 6 %) | Théorème 4 ; cleanlab |
| Natarajan et al., Learning with Noisy Labels, NeurIPS 2013 | Théorie du bruit d’étiquettes | Pertes corrigées ; le bruit < ½ est surmontable |
| Settles, Active Learning Literature Survey, 2009 | Annotation active | Incertitude, diversité ; le test reste aléatoire |
| Kaufman et al., Leakage in Data Mining, TKDD 2012 | Taxonomie des fuites | Un score trop beau est une fuite jusqu’à preuve du contraire |
| Penedo et al., The RefinedWeb Dataset, 2023 — 2306.01116 ; FineWeb, 2024 — 2406.17557 | Pipelines de filtrage web à l’échelle, ablations | Ce que chaque filtre change, mesuré |
| Zhou et al., LIMA: Less Is More for Alignment, 2023 — 2305.11206 | 1 000 exemples de qualité | Qualité > quantité pour l’affinage |
| Shumailov et al., AI models collapse when trained on recursively generated data, Nature 2024 | Effondrement du modèle | Garder des données réelles ; tracer la provenance |
| Sambasivan et al., “Everyone wants to do the model work, not the data work”, CHI 2021 | Cascades de données dans les projets IA | Les échecs viennent des données négligées |
| Rubin, Inference and Missing Data, Biometrika 1976 | MCAR / MAR / MNAR | Le mécanisme des manquants décide de l’imputation valide |
TP guidé
TP — Un jeu de données from scratch, documenté (6 h)
- Concevoir. Une tâche réelle (classification de tickets, détection sur images du robot, extraction sur documents). Remplir le tableau de conception (population, unité, étiquette, sources/droits, échantillonnage, métadonnées) et le budget.
- Consigne et pilote. Rédiger la consigne (définitions, cas limites, 10 exemples) ; annoter 100 exemples à deux (Label Studio ou Argilla) ; kappa et matrice de désaccord ; itérer la consigne ; annoter 1 000 (20 % en double, arbitrage).
- Nettoyer. Schéma (pandera/Great Expectations), doublons exacts et MinHash, valeurs manquantes (mécanisme), aberrantes, étiquettes suspectes (cleanlab) ; journal de nettoyage chiffré.
- Séparer. Par groupe ou temps selon l’usage ; vérifier l’absence de fuite (doublons croisés, variables proxy : entraîner un modèle et regarder l’importance des variables) ; sceller le test (hash).
- Documenter et versionner. Datasheet complète ; DVC (ou LakeFS) avec v1 ; un notebook d’exploration (distributions, tranches, biais visibles).
- Livrable. Dépôt versionné, datasheet, consigne, mesures d’accord, journal de nettoyage, et une page « ce que ce jeu ne permet pas de conclure ».
Exercices
Exercices auto-corrigés
Exercice 1 — Kappa et alpha
Implémentez kappa_cohen(a, b) et kappa_pondere(a, b, K) (pondération quadratique pour des catégories ordinales 0..K−1 : poids wij = (i − j)²/(K − 1)²). Vérifiez : κ = 1 pour l’accord parfait ; κ ≈ 0 pour des annotations indépendantes ; le kappa pondéré pénalise moins un désaccord d’un cran qu’un désaccord de trois crans.
Correction
def kappa_cohen(a, b):
a, b = np.asarray(a), np.asarray(b); cats = sorted(set(a) | set(b)); po = np.mean(a == b)
pe = sum(np.mean(a == c) * np.mean(b == c) for c in cats); return (po - pe) / (1 - pe)
def kappa_pondere(a, b, K):
a, b = np.asarray(a).astype(np.intp), np.asarray(b).astype(np.intp); n = len(a); O = np.zeros((K, K)); np.add.at(O, (a, b), 1); O /= n
E = np.outer(np.bincount(a, minlength=K) / n, np.bincount(b, minlength=K) / n)
W = np.array([[(i - j) ** 2 for j in range(K)] for i in range(K)]) / (K - 1) ** 2
return 1 - (W * O).sum() / (W * E).sum()Exercice 2 — MinHash et sa précision
Écrivez minhash_simple(ensemble, k, graine) avec des fonctions de hachage hi(x) = hash((i, x)) (via hashlib), et similarite(sigA, sigB). Vérifiez sur des ensembles de Jaccard connu que l’erreur d’estimation décroît en 1/√k.
Correction
def minhash_simple(ensemble, k=64, graine=0):
sig = []
for i in range(k):
sig.append(min(int(hashlib.blake2b(f"{graine}|{i}|{x}".encode(), digest_size=8).hexdigest(), 16) for x in ensemble))
return np.array(sig)
def similarite(sa, sb): return float(np.mean(sa == sb))Exercices
Exercices auto-corrigés (suite)
Exercice 3 — Séparation par groupe sans fuite
Écrivez separer_par_groupe(groupes, frac_test, rng) qui renvoie un masque booléen du test tel qu’aucun groupe ne soit à cheval et que la fraction de lignes en test soit ≈ frac_test (±0,05), et verifier_fuite(train_ids, test_ids) qui renvoie le nombre d’identifiants (doublons) communs.
Correction
def separer_par_groupe(groupes, frac_test=0.2, rng=None):
rng = rng or np.random.default_rng(0); g = np.unique(groupes); rng.shuffle(g); tailles = {x: (groupes == x).sum() for x in g}
test, total = set(), 0
for x in g:
if total / len(groupes) >= frac_test: break
test.add(x); total += tailles[x]
return np.isin(groupes, list(test))
def verifier_fuite(train_ids, test_ids): return len(set(train_ids) & set(test_ids))Exercice 4 — Détection d’étiquettes bruitées par validation croisée
Implémentez etiquettes_suspectes(X, y, k_plis, seuil) : entraîner un classifieur simple (centroïdes par classe) sur k−1 plis, prédire les probabilités sur le pli restant (softmax des −distances), et renvoyer les indices dont la probabilité de l’étiquette annotée est < seuil. Vérifiez que sur des données avec 10 % d’étiquettes inversées, la précision de la détection et le rappel dépassent 0,6.
Correction
def etiquettes_suspectes(X, y, k_plis=5, seuil=0.2):
n = len(y); K = y.max() + 1; plis = np.arange(n) % k_plis; suspects = []
for p in range(k_plis):
tr, te = plis != p, plis == p
centres = np.array([X[tr][y[tr] == c].mean(0) for c in range(K)])
d = ((X[te][:, None, :] - centres[None, :, :]) ** 2).sum(-1); z = -d; z -= z.max(1, keepdims=True); pr = np.exp(z); pr /= pr.sum(1, keepdims=True)
idx = np.where(te)[0]; suspects += [int(i) for i, row, lab in zip(idx, pr, y[te]) if row[lab] < seuil]
return suspectsFiche de cours · Exercices corrigés
Exercices corrigés (rédaction)
Vérification
Un jeu contient 5 mesures par session et 15 sessions par robot. Le modèle servira sur de nouveaux robots. Comment séparer train et test ?
Deux questions supplémentaires
1. Que fait MinHash ? Estime la similarité de Jaccard par des signatures courtes ; LSH ne compare que les candidats probables (Théorèmes 1–2).
2. Pourquoi ré-annoter un échantillon du test avant de chercher un meilleur modèle ? Le bruit d’étiquettes plafonne l’exactitude mesurée (Théorème 4).
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Population / échantillon | Ce sur quoi le modèle servira / ce qu’on a collecté ; biais entre les deux. |
| Consigne, kappa, étalon-or | Définition opérationnelle, accord corrigé du hasard, référence arbitrée. |
| Bruit d’étiquettes | Plafonne la mesure ; détecter par désaccords et confident learning. |
| Doublon, MinHash, LSH | Exact / approximatif ; signatures ; bandes. |
| Fuite | Information indisponible en production présente à l’entraînement. |
| Séparation par groupe / temps | Reproduire l’usage ; test scellé. |
| Datasheet | Motivation, composition, collecte, prétraitement, usages, maintenance. |
| Données synthétiques | Utiles avec filtrage et évaluation sur réel ; risque d’effondrement. |
Suite
Avant d’entraîner quoi que ce soit : l’escalade des solutions.
Chapitre suivant : les étapes avant « je crée mon modèle from scratch » — règles, modèles existants, prompt, RAG, affinage léger, affinage complet, pré-entraînement — avec, pour chacune, limites, contraintes et avantages.