Contrastive Learning
L'apprendimento contrastivo addestra gli embedding avvicinando le coppie corrispondenti e allontanando gli altri campioni. Scopri InfoNCE, SimCLR, MoCo, CLIP e il codice.
L'apprendimento contrastivo addestra un modello a produrre embedding in cui le coppie corrispondenti di campioni, dette positive, si avvicinano, mentre quelle non corrispondenti, dette negative, si allontanano. Le coppie possono provenire dai dati stessi, come due ritagli aumentati della stessa foto, oppure da dati naturalmente abbinati, come un'immagine e la relativa didascalia, quindi l'apprendimento contrastivo non richiede etichette di classe. È una delle principali famiglie di metodi di apprendimento auto-supervisionato per le immagini, insieme alla ricostruzione mascherata e all'auto-distillazione. Gli encoder addestrati in questo modo producono caratteristiche trasferibili al rilevamento, alla classificazione e al recupero, e lo stesso obiettivo addestra i modelli visione-linguaggio come CLIP, che possono poi classificare le immagini usando solo il testo tramite l'apprendimento zero-shot.
Come funziona l'apprendimento contrastivo#
Un metodo contrastivo ha tre componenti: un modo per creare coppie positive, un encoder che mappa ogni campione in un embedding normalizzato e una funzione di perdita che confronta le similarità. In SimCLR, Ting Chen e i suoi colleghi di Google hanno creato due viste di ogni immagine applicando ritagli casuali, distorsioni cromatiche e sfocatura, le hanno codificate entrambe con una ResNet condivisa seguita da una piccola testa di proiezione e hanno considerato negativi gli altri elementi del batch:
L'aumento dei dati determina cosa il modello impara a ignorare. Poiché due ritagli della stessa immagine devono essere mappati in punti vicini, l'encoder impara che variazioni di posizione, scala e colore non cambiano ciò che l'immagine mostra, e conserva le caratteristiche che distinguono un'immagine da tutte le altre. Con una ResNet-50 quattro volte più larga dello standard, un classificatore lineare addestrato sulle caratteristiche congelate di SimCLR ha raggiunto un'accuratezza top-1 del 76.5% su ImageNet, pari a quella di una ResNet-50 supervisionata.
Funzioni di perdita contrastive#
- Perdita contrastiva a coppie: la funzione di perdita del 2006 di Raia Hadsell, Sumit Chopra e Yann LeCun avvicina ogni coppia positiva e allontana ogni coppia negativa finché la distanza tra i due non è almeno pari a un margine m.
- Perdita triplet: confronta un'ancora con un elemento positivo e uno negativo e richiede che il positivo sia più vicino di un margine. Nel 2015 FaceNet di Google ha addestrato gli embedding facciali con questo metodo.
- InfoNCE: confronta un elemento positivo con molti negativi contemporaneamente. Con le similarità s divise per una temperatura τ, la perdita per un'ancora è −log[exp(s₊/τ) / Σⱼ exp(sⱼ/τ)], una cross-entropia softmax in cui il positivo è la classe corretta fra tutti i candidati. Aaron van den Oord e i suoi colleghi hanno coniato il termine nel predictive coding contrastivo del 2018; la perdita NT-Xent di SimCLR e quella di CLIP ne sono varianti.
- Perdita sigmoide: SigLIP assegna a ogni coppia un punteggio indipendente di corrispondenza sì-no usando una sigmoide, quindi la perdita non richiede una normalizzazione sull'intero batch.
In PyTorch, InfoNCE si riduce alla cross-entropia su una matrice di similarità la cui diagonale contiene gli elementi positivi:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# Stand-in embeddings for 8 images, a second view of each (row i of both is a positive pair),
# and 8 unrelated images
view1 = F.normalize(torch.randn(8, 128), dim=1)
view2 = F.normalize(view1 + 0.1 * torch.randn(8, 128), dim=1)
unrelated = F.normalize(torch.randn(8, 128), dim=1)
# InfoNCE: cosine similarities divided by a temperature, then cross-entropy where
# each row's positive (the diagonal) is the correct class among all 8 candidates
temperature = 0.1
targets = torch.arange(8)
for name, keys in [("Augmented views", view2), ("Unrelated images", unrelated)]:
logits = view1 @ keys.T / temperature
print(f"{name}: loss {F.cross_entropy(logits, targets):.3f}")Stampa Augmented views: loss 0.016 e Unrelated images: loss 2.505. Quando l'elemento positivo di ogni riga è chiaramente la chiave più simile, la perdita tende a zero. Con chiavi non correlate, supera ln 8 ≈ 2.08, la perdita di un'ipotesi uniforme fra otto candidati, perché dividere per una temperatura di 0.1 trasforma similarità casuali in previsioni errate sicure. Una temperatura più bassa rende la softmax più selettiva e concentra la perdita sui negativi più difficili. MoCo usa τ = 0.07 e CLIP inizializza la propria temperatura appresa allo stesso valore.
Negativi, dimensione del batch e varianti#
InfoNCE migliora all'aumentare dei negativi, perciò il loro numero è un fattore di costo fondamentale. SimCLR li ricavava da batch molto grandi. MoCo, sviluppato da Kaiming He e dai suoi colleghi di Facebook AI Research, manteneva una coda di 65,536 embedding provenienti dai batch recenti come negativi e li codificava con una copia dell'encoder aggiornata lentamente tramite momentum; così il numero di negativi è indipendente dalla dimensione del batch. I negativi casuali possono essere falsi negativi, per esempio un'altra foto della stessa razza di cane, mentre i negativi molto facili insegnano poco: per questo il campionamento dei negativi difficili cerca campioni confondibili. L'apprendimento contrastivo supervisionato (SupCon) usa le etichette per trattare ogni campione della stessa classe come positivo. Metodi non contrastivi come BYOL, SimSiam e DINO eliminano del tutto i negativi ed evitano di mappare ogni input nello stesso embedding usando reti asimmetriche, gradienti interrotti o centratura.
Apprendimento contrastivo e concetti correlati#
- Apprendimento metrico: il compito più ampio di apprendere una funzione di distanza, da cui derivano le perdite contrastive e triplet. Oggi "apprendimento contrastivo" indica di solito la variante autosupervisionata con molti negativi resa popolare da SimCLR e MoCo.
- Autoencoder: apprendono ricostruendo l'input, quindi le loro caratteristiche devono conservare i dettagli a livello di pixel. Le caratteristiche contrastive mantengono solo ciò che distingue un campione dagli altri.
- JEPA: predice gli embedding delle regioni nascoste dell'immagine a partire da quelle visibili, apprendendo nello spazio degli embedding senza coppie negative.
- Apprendimento supervisionato: addestra il modello su un insieme fisso di classi assegnate da esseri umani, mentre il preaddestramento contrastivo richiede solo una regola per stabilire quali campioni corrispondono.
Applicazioni#
- Modelli visione-linguaggio: CLIP ha addestrato un encoder di immagini e uno di testo su 400 milioni di coppie immagine-didascalia con batch di 32,768, permettendo ai prompt testuali di classificare e recuperare immagini. I modelli Ultralytics YOLOE-26 codificano i nomi delle classi con l'encoder testuale MobileCLIP2 di Apple, addestrato con un obiettivo contrastivo in stile CLIP, e assegnano a ogni regione candidata un punteggio rispetto a quegli embedding testuali tramite una testa contrastiva; così
set_classes(["forklift", "pallet"])trasforma gli stessi pesi in un rilevatore per nuove categorie. - Ricerca semantica: gli embedding di immagini e testo addestrati con apprendimento contrastivo vengono archiviati in un database vettoriale e consultati in base alla similarità.
- Preaddestramento con poche etichette: in ambiti come l'analisi di immagini mediche, dove le etichette degli esperti sono scarse, il preaddestramento contrastivo su scansioni non etichettate fornisce un backbone che l'ottimizzazione adatta usando un piccolo insieme etichettato.
- Riconoscimento facciale e re-identificazione: le perdite contrastive e triplet addestrano embedding in cui le foto della stessa persona o dello stesso oggetto sono vicine. Gli embedding FaceNet a 128 dimensioni hanno raggiunto un'accuratezza del 99.63% sul benchmark Labeled Faces in the Wild.










