Accueil / Factory / Algos ML / Apprentissage contrastif — factory / algos ML / apprentissage auto-supervisé

APPRENTISSAGE CONTRASTIF.

Une façon d'apprendre sans étiquettes : on montre au modèle deux versions d'une même donnée et il apprend à les rapprocher, tout en éloignant les données différentes. Il en sort une représentation qui capte l'essentiel et ignore les détails sans importance. SimCLR, CLIP et les modèles d'embeddings de phrases reposent sur ce principe.

Auto-superviséDeep learningReprésentationPeu de donnéesNiveau : avancé

FICHE D'IDENTITÉ

notes sur 5 · usage entreprise
PerformanceExcellentes représentations quand les données brutes abondent
InterprétabilitéDes vecteurs appris, sans sens lisible dimension par dimension
VitesseGros lots et nombreux passages nécessaires, GPU recommandé
Facilité de réglageAugmentations et température délicates à choisir
Tolérance aux données brutesAucune étiquette requise, données brutes acceptées
EN 30 SECONDES

On montre à un apprenti deux photos du même client, l'une floue et l'autre recadrée, au milieu de photos d'autres clients. À force de retrouver la bonne paire, il apprend à reconnaître un visage, pas un cadrage.

1. On fabrique deux vues de chaque donnée

Chaque image est modifiée deux fois au hasard : décalage, bruit, recadrage, couleur. Les deux vues forment une paire positive ; les autres images du lot servent de négatifs.

2. On apprend à retrouver sa paire

Un encodeur transforme chaque vue en vecteur. La perte (InfoNCE) récompense une forte similarité avec sa propre paire et une faible similarité avec tout le reste du lot.

3. On réutilise l'encodeur

Une fois entraîné sans aucune étiquette, l'encodeur sert de base. Un classifieur simple, entraîné sur quelques exemples étiquetés, suffit ensuite pour la tâche métier.

LE CAS MÉTIER

documents peu étiquetés · banque / assurance / logistique
EN ENTRÉE

1 797 chiffres manuscrits, presque sans étiquettes

Des images de chiffres de 8 x 8 pixels. L'encodeur apprend sur toutes les images sans regarder les étiquettes. On ne s'autorise ensuite que 100 étiquettes, 10 par chiffre, pour entraîner le classifieur final.

EN SORTIE

Un encodeur robuste aux petits défauts

Parce qu'il a appris que deux versions décalées d'une même image sont la même chose, l'encodeur est conçu pour ne pas être perturbé par un léger décalage, fréquent sur des documents scannés. Le code compare avec un classifieur sur pixels bruts : sur ce jeu, celui-ci reconnaît environ 90 % des chiffres, mais moins de la moitié dès que les images sont décalées d'un pixel.

CE QU'ON MESURE

L'exactitude avec peu d'étiquettes, et sa stabilité

On mesure l'exactitude sur les images non utilisées, dans des conditions normales puis dégradées. Le bon indicateur de l'apprentissage contrastif est ce qui se passe avec peu d'étiquettes et des données imparfaites.

QUAND LE SORTIR, QUAND L'ÉVITER

OUI

  • Beaucoup de données brutes (images, textes, signaux) et très peu d'étiquettes
  • Besoin d'une représentation robuste à des variations connues : cadrage, bruit, éclairage
  • Recherche par similarité : retrouver des images, des produits ou des textes proches
  • Rapprocher deux types de données, comme une image et sa légende (principe de CLIP)

NON

  • Des modèles pré-entraînés existent déjà pour vos données : les réutiliser coûte bien moins cher
  • Peu de données brutes : l'apprentissage contrastif a besoin de volume pour trouver ses négatifs
  • Aucune idée des variations à ignorer : de mauvaises augmentations donnent une mauvaise représentation
  • Données tabulaires classiques : un modèle supervisé d'arbres reste plus simple et plus efficace
LES 4 RÉGLAGES QUI COMPTENT

Noms courants dans les implémentations PyTorch (SimCLR, MoCo, sentence-transformers).

Augmentations

Le cœur de la méthode : elles définissent ce que le modèle doit ignorer. Des augmentations trop faibles donnent une tâche triviale, trop fortes détruisent l'information utile.

Température

Divise les similarités avant la softmax (0,1 dans le code). Basse, le modèle se concentre sur les négatifs les plus proches ; trop basse, l'entraînement devient instable.

Taille de lot

Plus le lot est grand, plus il y a de négatifs par exemple. SimCLR utilisait des lots de plusieurs milliers ; MoCo contourne le problème avec une file de négatifs.

Tête de projection

Une petite couche ajoutée pendant l'entraînement puis jetée. Les représentations prises avant cette tête sont en général meilleures pour la tâche finale.

LE CODE MINIMAL

jeu d'exemple : chiffres_manuscrits.csv ↓
# Chiffres manuscrits sans étiquettes : apprentissage contrastif (type SimCLR) en Python
import pandas as pd
import torch
import torch.nn.functional as F
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

torch.manual_seed(42)
df = pd.read_csv("chiffres_manuscrits.csv")
images = torch.tensor(df.drop(columns="chiffre").values / 16, dtype=torch.float32).reshape(-1, 1, 8, 8)

def augmenter(x):  # une autre vue de chaque image : décalage d'au plus un pixel, plus du bruit
    dx, dy = torch.randint(-1, 2, (2,)).tolist()
    return torch.roll(x, shifts=(dx, dy), dims=(2, 3)) + 0.1 * torch.randn_like(x)

encodeur = torch.nn.Sequential(torch.nn.Flatten(), torch.nn.Linear(64, 256), torch.nn.ReLU(), torch.nn.Linear(256, 64))
tete = torch.nn.Sequential(torch.nn.ReLU(), torch.nn.Linear(64, 32))  # tête de projection, jetée ensuite
optim = torch.optim.Adam(list(encodeur.parameters()) + list(tete.parameters()), lr=1e-3)
for pas in range(1000):  # aucune étiquette utilisée ici
    lot = images[torch.randperm(len(images))[:256]]
    z1, z2 = (F.normalize(tete(encodeur(augmenter(lot))), dim=1) for _ in range(2))
    sim = z1 @ z2.T / 0.1  # perte InfoNCE : chaque image doit retrouver son autre vue parmi 256
    perte = (F.cross_entropy(sim, torch.arange(256)) + F.cross_entropy(sim.T, torch.arange(256))) / 2
    optim.zero_grad()
    perte.backward()
    optim.step()

y = df["chiffre"].values  # évaluation avec 100 étiquettes, sur images normales puis décalées d'un pixel
app, test = train_test_split(list(range(len(y))), train_size=100, stratify=y, random_state=42)
decalees = torch.roll(images, shifts=1, dims=3)
with torch.no_grad():
    for nom, f in [("pixels bruts", lambda x: x.flatten(1).numpy()), ("contrastif  ", lambda x: encodeur(x).numpy())]:
        clf = LogisticRegression(max_iter=2000).fit(f(images)[app], y[app])
        print(nom, ": normales", round(clf.score(f(images)[test], y[test]), 3), "| décalées", round(clf.score(f(decalees)[test], y[test]), 3))

L'apprentissage contrastif se pratique en Python (PyTorch, lightly, sentence-transformers) : pas d'équivalent R courant en entreprise.

QUESTIONS FRÉQUENTES

Quelle différence entre apprentissage contrastif et auto-supervisé ?

L'auto-supervisé regroupe toutes les méthodes qui créent leur propre tâche à partir des données brutes : deviner un mot masqué, reconstruire une image, retrouver une paire. L'apprentissage contrastif en est une famille, fondée sur le rapprochement de paires positives et l'éloignement de négatifs.

Qu'est-ce que la perte InfoNCE ?

Pour chaque exemple, on calcule sa similarité avec sa paire positive et avec tous les négatifs du lot, puis on applique une softmax. La perte vaut moins le logarithme de la probabilité attribuée à la bonne paire. C'est une classification où la bonne réponse est sa propre paire.

Quel lien entre apprentissage contrastif et CLIP ?

CLIP, publié par OpenAI en 2021, applique l'apprentissage contrastif à des paires image-légende : l'image et sa légende sont rapprochées, les autres légendes du lot éloignées. On obtient un espace commun où l'on peut comparer une image et une phrase.

LES ALGOS VOISINS

à comparer avant de choisir
l'autre voie sans étiquettes

Autoencodeur

Apprend en reconstruisant sa propre entrée. Plus simple, mais garde aussi les détails inutiles que le contrastif apprend à ignorer.

Voir la fiche →
le contrastif image-texte

CLIP (multimodal)

Rapproche chaque image de sa légende parmi des millions de paires. Permet de chercher des images avec du texte.

Voir la fiche →
la suite logique

Apprentissage par transfert

L'encodeur contrastif devient un modèle source, qu'on adapte ensuite à la tâche métier avec peu d'étiquettes.

Voir la fiche →
— formation

Passer de la fiche à la pratique

Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.

Voir les formations →