Collecte et Prétraitement des Données
Glissez pour afficher le menu
L'entraînement des modèles génératifs nécessite non seulement une bonne architecture et des fonctions de perte adaptées, mais aussi des données propres, bien structurées et diversifiées. Cette section présente des ensembles de données de haute qualité pour les modalités visuelle, textuelle et audio, fournit des techniques de prétraitement détaillées adaptées aux pipelines génératifs modernes, et aborde des stratégies robustes de découpage des données avec des outils pratiques.
Collecte de données
La collecte de données pour la modélisation générative dépend du domaine, de la disponibilité des sources, de l'échelle et des licences. Pour les données textuelles et visuelles, les sources courantes incluent les jeux de données ouverts, le contenu extrait du web et les référentiels structurés (par exemple, archives académiques, réseaux sociaux ou plateformes de commerce électronique).
Techniques de web scraping
Lorsque les jeux de données ne sont pas facilement disponibles, les données peuvent être collectées sur le web à l'aide d'outils de scraping. Le web scraping permet d'extraire de manière programmatique des informations à partir de pages HTML. Il s'agit d'une approche puissante pour collecter des données réelles et non structurées lorsque les API ne sont pas disponibles. Cependant, le scraping implique des responsabilités techniques et éthiques.
Les méthodes de scraping impliquent généralement :
- L'envoi de requêtes HTTP pour récupérer des pages web. Cela permet d'accéder au contenu HTML brut d'une page ;
- L'analyse du contenu HTML pour extraire des données structurées. Des outils comme BeautifulSoup convertissent le HTML non structuré en balises et éléments accessibles ;
- La navigation sur des pages dynamiques à l'aide de l'automatisation de navigateur. Les sites web fortement basés sur JavaScript nécessitent des outils comme Selenium pour rendre complètement le contenu ;
- Le stockage des données extraites dans des formats exploitables comme CSV ou JSON. Cela garantit la compatibilité avec les étapes ultérieures de prétraitement et d'entraînement du modèle.
Voici deux stratégies de scraping courantes :
Extraction de texte avec BeautifulSoup
BeautifulSoup est une bibliothèque Python utilisée pour analyser des pages HTML statiques.
1234567891011import requests from bs4 import BeautifulSoup url = "https://docs.python.org/3/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # Extract paragraphs paragraphs = [p.text for p in soup.find_all('p')] text = "\n".join(paragraphs) print(text)
Extraction d'images avec Selenium
Selenium automatise un navigateur pour extraire du contenu à partir de pages rendues avec JavaScript.
123456789101112131415161718# INSTALL SELENIUM # THIS CODE DOWNLOAD IMAGES (I NEED JUST VIZUALIZATION) from selenium import webdriver import time import urllib.request url = "https://example.com/gallery" driver = webdriver.Chrome() driver.get(url) time.sleep(2) images = driver.find_elements("tag name", "img") for idx, img in enumerate(images): src = img.get_attribute('src') if src: urllib.request.urlretrieve(src, f"image_{idx}.jpg") driver.quit()
Toujours consulter les conditions d'utilisation d'un site web avant de procéder à un scraping. Utiliser des fréquences de requêtes modérées et respecter le fichier robots.txt. Un scraping inapproprié peut entraîner des interdictions d'adresse IP ou des conséquences juridiques.
Dans les contextes GenAI, le web scraping constitue souvent une étape préalable à la constitution de jeux de données de pré-entraînement, en particulier pour les langues spécifiques à un domaine ou peu dotées en ressources. Des outils comme Scrapy, playwright ou des API sans navigateur sont également fréquemment utilisés pour des tâches à grande échelle.
Techniques de prétraitement
Le prétraitement des données doit être adapté à la modalité, au type de modèle et aux contraintes de qualité. Pour la modélisation générative de niveau production, les pipelines incluent souvent des transformations spécifiques au domaine, une adaptation de la résolution et un filtrage basé sur le contenu.
Prétraitement des images
- Redimensionnement : adapter la résolution du jeu de données à l'entrée du modèle (par exemple, 64x64 pour les premiers GAN, 512x512 pour les modèles de diffusion) ;
from PIL import Image
img = Image.open("example.jpg")
resized = img.resize((256, 256))
resized.save("resized.jpg")
- Normalisation : mise à l'échelle des valeurs de pixels vers une plage standard, généralement [−1, 1] ou [0, 1] ;
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5]*3, std=[0.5]*3) # RGB to [-1, 1]
])
- Gestion de l'espace colorimétrique : garantir la cohérence des couleurs — conversion en RGB ou niveaux de gris. Pour la génération conditionnelle, conserver les canaux alpha si présents ;
from PIL import Image
img = Image.open("example.png").convert("RGB")
img.save("rgb_image.jpg")
- Augmentation des données : introduction de variations pendant l'entraînement via des transformations.
import albumentations as A
from albumentations.pytorch import ToTensorV2
transform = A.Compose([
A.RandomResizedCrop(256, 256),
A.HorizontalFlip(),
A.ColorJitter(),
A.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)),
ToTensorV2(),
])
Prétraitement du texte
- Nettoyage : suppression des caractères spéciaux, des espaces supplémentaires et du bruit ;
12345import re text = "Example text — with symbols!" cleaned = re.sub(r"[^\w\s]", "", text) cleaned = re.sub(r"\s+", " ", cleaned).strip() print(cleaned)
-
r"[^\w\s]":\w: correspond à tout caractère alphanumérique (lettres A-Z, a-z, chiffres 0-9) et au soulignement_;\s: correspond à tout caractère d'espacement (espaces, tabulations, retours à la ligne) ;[^...]: classe de caractères négative — correspond à tout ce qui n'est pas listé à l'intérieur ;- Signification : ce motif correspond à tous les caractères sauf les lettres, chiffres, soulignements et espaces. Il supprime donc la ponctuation et les symboles (comme
—,!, etc.).
-
r"\s+":\s: correspond à tout caractère d'espacement ;+: correspond à une ou plusieurs occurrences du caractère précédent ;- Signification : cela remplace plusieurs espaces consécutifs par un seul espace.
-
.strip(): supprime les espaces en début et fin de chaîne dans la chaîne nettoyée finale.
Pour plus d'informations sur la syntaxe des RegEx, consulter la documentation.
- Conversion en minuscules : standardisation du texte en minuscules pour assurer la cohérence. À appliquer de manière sélective, car certains modèles comme BERT sont sensibles à la casse ou non ;
12text = "This Is A Sentence." print(text.lower())
- Tokenisation : découpe du texte en jetons ou sous-mots pour la modélisation ;
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") encodings = tokenizer(["Example text."], padding="max_length", truncation=True, max_length=128, return_tensors="pt")
- Racination/Lemmatisation : rarement utilisée dans les pipelines d'apprentissage profond mais employée dans le NLP traditionnel ou les filtres de pré-entraînement ;
1234from nltk.stem import PorterStemmer stemmer = PorterStemmer() print(stemmer.stem("running"))
- Remplissage/Tronquage : voir l'exemple ci-dessus avec
max_length.
1234from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("gpt2") inputs = tokenizer("Short text.", max_length=10, padding="max_length", truncation=True, return_tensors="pt")
Construire des pipelines de prétraitement modulaires en gardant à l'esprit la reproductibilité. Utiliser DVC, wandb artifacts ou huggingface/datasets avec streaming + mise en cache.
Stratégies de division des données
Une division efficace des données est essentielle pour la généralisation, en particulier dans la modélisation générative où le surapprentissage des modes ou la mémorisation sont fréquents.
Division Entraînement/Validation/Test
- Ratios conventionnels : 80/10/10 ou 70/15/15 selon la taille du jeu de données ;
- Division sensible au contenu : stratification des divisions par classe (vision), sujet (texte).
- Cas d'utilisation :
- Entraînement : optimisation du modèle ;
- Validation : guidage du checkpointing, arrêt anticipé et ajustement des métriques (par exemple, FID) ;
- Test : entièrement réservé jusqu'à l'évaluation finale du modèle.
Exemple utilisant train_test_split :
from sklearn.model_selection import train_test_split
# Example: splitting an image dataset (paths or features)
train_paths, val_paths = train_test_split(image_paths, test_size=0.1, random_state=42)
train_paths, test_paths = train_test_split(train_paths, test_size=0.111, random_state=42) # 0.111 to get ~10% test
Pour les jeux de données Hugging Face :
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1")
split_dataset = dataset["train"].train_test_split(test_size=0.2, seed=42)
train_val = split_dataset["train"].train_test_split(test_size=0.1, seed=42)
train_set = train_val["train"]
val_set = train_val["test"]
test_set = split_dataset["test"]
Validation croisée et bootstrap
- Pour les domaines à faibles ressources ou sans données, utilisation de la validation croisée K-fold (par exemple, K=5 ou 10) ;
- Dans les modèles de diffusion, utilisation du FID/LPIPS bootstrappé pour évaluer la stabilité de la génération ;
- Inspection visuelle ou perceptuelle à associer à la validation numérique.
Exemple de configuration K-fold :
from sklearn.model_selection import KFold
import numpy as np
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(kf.split(data)):
print(f"Fold {fold}: Train indices {train_idx[:5]}, Val indices {val_idx[:5]}")
Jeux de données couramment utilisés
Le choix du jeu de données dépend de la modalité, de la taille des données, des licences et de l'objectif génératif spécifique (par exemple, génération inconditionnelle, synthèse conditionnelle ou transfert de style).
Jeux de données pour la vision par ordinateur
- CIFAR-10 : 60 000 images RGB basse résolution 32×32 réparties en 10 classes. Léger, idéal pour le prototypage rapide, les tests unitaires et l'évaluation des boucles d'entraînement pour les GAN d'images ;
- CelebA : plus de 200 000 visages de célébrités alignés, annotés avec 40 attributs binaires. Fréquemment utilisé pour la génération conditionnée par attributs, l'édition de visages préservant l'identité et les modèles encodeur-décodeur ;
- LSUN : jeu de données de scènes à grande échelle contenant des millions d'images dans des catégories telles que chambres, églises et salles à manger. Essentiel pour la synthèse haute résolution et l'entraînement progressif des GAN ;
- ImageNet : plus de 14 millions d'images de haute qualité annotées dans 20 000 classes. Principalement utilisé pour l'apprentissage par transfert, la pré-formation de modèles de diffusion et comme base pour la génération guidée par le style.
Jeux de données textuels
- WikiText : articles Wikipédia nettoyés (WikiText-2 : 2M tokens, WikiText-103 : 100M+). Utile pour l’évaluation du language modeling et l’ajustement fin de modèles décodeurs uniquement comme GPT ;
- BookCorpus : plus de 11 000 romans gratuits. Essentiel pour la génération de style narratif, les transformeurs à long contexte et la pré-formation de modèles fondamentaux (par exemple, BERT, GPT-2) ;
- Common Crawl / C4 : données web multilingues à l’échelle du pétaoctet. C4 est une variante dédupliquée et filtrée, conçue pour l’entraînement de modèles linguistiques de haute qualité (par exemple, T5) ;
- The Pile : 825 Go de données diversifiées (livres, ArXiv, StackExchange, GitHub, etc.). Conçu pour entraîner des modèles de type GPT compétitifs avec les LLMs d’OpenAI.
Résumé
- Sélection des jeux de données selon la qualité, la licence, l’échelle et l’adéquation avec les objectifs génératifs ;
- Application de pipelines de prétraitement adaptés à chaque modalité à l’aide d’outils robustes et industriels ;
- Mise en place de stratégies de découpage rigoureuses pour garantir la reproductibilité, éviter les fuites et permettre une évaluation équitable.
1. Pourquoi la qualité des données est-elle plus importante que la quantité lors de l’entraînement de modèles d’IA générative ?
2. Quel est un défi courant lors de la collecte de données diversifiées pour l'entraînement de modèles génératifs ?
3. Quel est l'objectif principal de l'augmentation de données dans le contexte de l'entraînement en IA générative ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion