Faza 04 · lecția 17
Viziune auto-supervizată — SimCLR, DINO, MAE
Scopul lecției: Etichetele sunt blocajul viziunii supervizate. Preantrenarea auto-supervizată le elimină: învățați caracteristici vizuale din 100M de imagini neetichetate, apoi realizați ajustarea fină pe 10k de imagini etichetate.
Versiunea curentă AlexBred.com: primele 100 de lecții ale programului în limba română.
Cuprinsul lecției
- Obiective de învățare
- Problema
- Conceptul
- Trei familii
- Învățarea contrastivă (SimCLR)
- Profesor–student (DINO)
- Reconstrucție mascată (MAE)
- De ce 75% și nu 15%
- Evaluarea prin probing liniar
- Construiți
- Pasul 1: Flux de augmentare cu două vederi
- Pasul 2: Pierderea InfoNCE
- Pasul 3: Verificarea de plauzibilitate a InfoNCE
- Pasul 4: Mascare în stil MAE
- Utilizați
- Livrați
- Exerciții
- Termeni-cheie
- Lecturi suplimentare
Etichetele sunt blocajul viziunii supervizate. Preantrenarea auto-supervizată le elimină: învățați caracteristici vizuale din 100M de imagini neetichetate, apoi realizați ajustarea fină pe 10k de imagini etichetate.
Tip: Învățați + construiți Limbaje: Python Cerințe prealabile: Faza 4 Lecția 04 (Clasificarea imaginilor), Faza 4 Lecția 14 (ViT) Timp: ~75 de minute
Obiective de învățare
- Urmăriți cele trei familii majore auto-supervizate — contrastivă (SimCLR), profesor–student (DINO), reconstrucție mascată (MAE) — și precizați ce optimizează fiecare
- Implementați de la zero o pierdere InfoNCE și explicați de ce un lot de 512 funcționează, dar unul de 32 eșuează
- Explicați de ce raportul de mascare de 75% al MAE nu este arbitrar și în ce fel diferă de 15% pentru text în BERT
- Utilizați checkpoint-uri DINOv2 sau MAE ImageNet pentru probing liniar și regăsire zero-shot
Problema
ImageNet supervizat are 1,3M de imagini etichetate, pentru care adnotarea ar costa, estimativ, 10M de dolari. Seturile de date medicale și industriale sunt mai mici și chiar mai scumpe de etichetat. Fiecare echipă de viziune întreabă: pot fi preantrenate modele pe date neetichetate ieftine — cadre YouTube, parcurgeri web, înregistrări de la camere web, scanări prin satelit — apoi ajustate fin pe un set mic etichetat?
Notă tehnică a traducerii: Estimarea de 10M de dolari nu este o proprietate verificabilă generală a ImageNet: textul-sursă nu precizează metoda, perioada, tarifele, nivelul de control al calității sau ce activități de adnotare include. Folosiți-o numai ca motivație contextuală, nu ca buget reproductibil pentru un proiect nou.
Învățarea auto-supervizată este răspunsul. Un ViT auto-supervizat modern antrenat pe LAION sau JFT atinge ori depășește acuratețea ImageNet supervizată după ajustarea fină. De asemenea, se transferă mai bine spre sarcinile din aval (detecție, segmentare, profunzime) decât preantrenarea supervizată. DINOv2 (Meta, 2023) și MAE (Meta, 2022) sunt opțiunile implicite actuale de producție pentru caracteristici de viziune transferabile.
Notă tehnică a traducerii: Afirmațiile despre „SOTA” și despre o opțiune implicită de producție depind de sarcină, setul de date, protocolul de evaluare, cost și momentul comparației; nu reprezintă o recomandare universală. Lucrarea DINOv2 raportează rezultate pentru benchmarkurile și protocoalele sale, nu o ierarhie permanentă pentru toate utilizările de viziune.
Schimbarea conceptuală este că sarcina de pretext — lucrul pe care modelul este antrenat să îl facă — nu trebuie să fie sarcina din aval. Important este ca ea să forțeze modelul să învețe caracteristici utile. Prezicerea culorii imaginilor în tonuri de gri, rotirea imaginilor și cererea ca modelul să clasifice rotația, mascarea patch-urilor și reconstruirea lor — toate au funcționat. Cele trei abordări care se extind la scară sunt învățarea contrastivă, distilarea profesor–student și reconstrucția mascată.
Conceptul
Trei familii
Învățarea contrastivă (SimCLR)
Luați o imagine, aplicați două augmentări aleatoare și obțineți două vederi. Treceți-le pe ambele prin același encoder plus un cap de proiecție. Minimizați o pierdere care spune „aceste două reprezentări vectoriale trebuie să fie apropiate” și „această reprezentare vectorială trebuie să fie departe de reprezentările vectoriale ale fiecărei alte imagini din lot”.
Pierderea pentru perechea pozitivă (z_i, z_j) dintre 2N vederi per lot:
L_ij = -log( exp(sim(z_i, z_j) / tau) / sum_k în lot \ {i} exp(sim(z_i, z_k) / tau) )
sim = similaritate cosinus
tau = temperatură (0.1 standard)
Aceasta este pierderea InfoNCE. Ea cere multe exemple negative pentru fiecare exemplu pozitiv, astfel că dimensiunea lotului contează — SimCLR are nevoie de 512–8192. MoCo a introdus o coadă de momentum cu loturi anterioare pentru a decupla numărul de exemple negative de dimensiunea lotului.
Notă tehnică a traducerii: InfoNCE nu impune matematic pragul 512 și nici nu garantează că un lot de 32 „eșuează”. SimCLR a raportat beneficii pentru loturi mari în configurațiile sale experimentale; efectul depinde și de augmentări, encoder, temperatură, optimizator și de mecanismul folosit pentru exemple negative.
Profesor–student (DINO)
Două rețele cu aceeași arhitectură: studentul și profesorul. Profesorul este o medie mobilă exponențială (EMA) a ponderilor studentului. Ambele văd vederi augmentate ale imaginii. Ieșirea studentului este antrenată să se potrivească cu a profesorului — fără exemple negative explicite.
loss = CE( ieșire_student(vedere_1), ieșire_profesor(vedere_2) )
+ CE( ieșire_student(vedere_2), ieșire_profesor(vedere_1) )
ponderi_profesor = m * ponderi_profesor + (1 - m) * ponderi_student (m ≈ 0.996)
De ce nu colapsează la „preziceți o constantă”: ieșirea profesorului este centrată (se scade media pe dimensiune) și accentuată (se împarte la o temperatură mică). Centrarea împiedică dominarea de către o dimensiune; accentuarea previne colapsul ieșirii spre distribuția uniformă.
Notă tehnică a traducerii: În DINO, prevenirea colapsului este proprietatea întregii rețete — profesorul EMA, centrarea și accentuarea ieșirilor profesorului, augmentările multi-crop și reglajele de optimizare. Centrarea și accentuarea, luate izolat, nu oferă o garanție universală împotriva colapsului.
DINO este ceea ce DINOv2 extinde la scară, pe 142M de imagini curate. Caracteristicile rezultate sunt SOTA-ul actual pentru regăsirea vizuală zero-shot și predicția densă.
Notă tehnică a traducerii: DINOv2 nu este DINO aplicat neschimbat la mai multe date: lucrarea sa descrie un set de 142M de imagini selectate și curate, schimbări pentru stabilizarea și accelerarea antrenării la scară, precum și distilare. Rezultatele raportate nu permit deducția că orice antrenare DINO pe 142M de imagini va reproduce aceleași performanțe.
Reconstrucție mascată (MAE)
Mascați 75% dintre patch-urile unei intrări ViT. Treceți numai 25% vizibile prin encoder. Un decodor mic primește ieșirea encoderului plus tokeni de mască în pozițiile mascate și este antrenat să reconstruiască pixelii patch-urilor mascate.
Encoder: 25% dintre patch-urile vizibile -> caracteristici
Decodor: caracteristici + tokeni de mască în pozițiile mascate -> pixeli reconstruiți
Pierdere: MSE între pixelii reconstruiți și cei originali doar în patch-urile mascate
Alegeri de proiectare esențiale care fac MAE să funcționeze:
- Raport de mascare de 75% — mare. Forțează encoderul să învețe caracteristici semantice; reconstruirea a 25% ar fi aproape trivială (pixelii vecini sunt atât de corelați încât un CNN ar reuși cu ușurință).
- Encoder/decodor asimetric — encoderul ViT mare vede doar patch-urile vizibile; un decodor mic (8 straturi, 512 dimensiuni) realizează reconstrucția. Preantrenarea este de 3x mai rapidă decât BEiT-ul naiv.
- Țintă de reconstrucție în spațiul pixelilor — mai simplă decât ținta tokenizată a BEiT și funcționează mai bine pe ViT.
Notă tehnică a traducerii: Raportul de mascare de 75% și comparația „de 3x mai rapidă” sunt rezultate ale configurațiilor și protocoalelor evaluate în lucrarea MAE; nu sunt o regulă pentru toate arhitecturile, rezoluțiile, obiectivele sau acceleratoarele. Raportul de mascare trebuie ales și verificat pentru setul de date și encoderul concret.
După preantrenare, eliminați decodorul. Encoderul devine extractorul de caracteristici.
De ce 75% și nu 15%
BERT maschează 15% dintre tokeni. MAE maschează 75%. Diferența este densitatea informației.
- Limbajul natural are entropie ridicată per token. Prezicerea a 15% dintre tokeni este încă dificilă deoarece fiecare poziție mascată are multe completări plauzibile.
- Patch-urile de imagine au entropie scăzută — o vecinătate nemascată determină adesea pixelii patch-ului mascat aproape exact. Pentru a face ca predicția să necesite înțelegere semantică, trebuie să mascați agresiv.
75% este suficient de mult încât simpla extrapolare spațială nu poate rezolva sarcina; encoderul trebuie să reprezinte conținutul imaginii.
Evaluarea prin probing liniar
După preantrenarea auto-supervizată, evaluarea standard este un probe liniar: înghețați encoderul, antrenați deasupra un singur clasificator liniar pe etichete ImageNet. Se raportează acuratețea top-1.
- SimCLR ResNet-50: ~71% (2020)
- DINO ViT-S/16: ~77% (2021)
- MAE ViT-L/16: ~76% (2022)
- DINOv2 ViT-g/14: ~86% (2023)
Probing-ul liniar este o măsură pură a calității caracteristicilor; ajustarea fină adaugă de obicei 2–5 puncte, dar amestecă și efectul reantrenării capului.
Notă tehnică a traducerii: Procentele din tabel provin din arhitecturi, rezoluții, epoci, augmentări și rețete de probing liniar diferite; ele nu formează un clasament direct comparabil. Chiar pentru DINOv2 ViT-g/14, implementarea oficială raportează valori diferite pentru variantele cu și fără registre. Verificați întotdeauna configurația exactă a rezultatului citat.
Notă tehnică a traducerii: Un probe liniar păstrează encoderul înghețat. Ajustarea fină (fine-tuning) actualizează, în mod obișnuit, cel puțin o parte a encoderului; câștigul față de un probe liniar nu are o valoare universală și depinde de model, date și protocol.
Construiți
Pasul 1: Flux de augmentare cu două vederi
import torch
import torchvision.transforms as T
two_view_train = lambda: T.Compose([
T.RandomResizedCrop(96, scale=(0.2, 1.0)),
T.RandomHorizontalFlip(),
T.ColorJitter(0.4, 0.4, 0.4, 0.1),
T.RandomGrayscale(p=0.2),
T.ToTensor(),
])
class TwoViewDataset(torch.utils.data.Dataset):
def __init__(self, base):
self.base = base
self.aug = two_view_train()
def __len__(self):
return len(self.base)
def __getitem__(self, i):
img, _ = self.base[i]
v1 = self.aug(img)
v2 = self.aug(img)
return v1, v2
Fiecare __getitem__ întoarce două vederi augmentate ale aceleiași imagini; etichetele nu sunt necesare.
Pasul 2: Pierderea InfoNCE
import torch.nn.functional as F
def info_nce(z1, z2, tau=0.1):
"""
z1, z2: (N, D) L2-normalised embeddings of paired views
"""
N, D = z1.shape
z = torch.cat([z1, z2], dim=0) # (2N, D)
sim = z @ z.T / tau # (2N, 2N)
mask = torch.eye(2 * N, dtype=torch.bool, device=z.device)
sim = sim.masked_fill(mask, float("-inf"))
targets = torch.cat([torch.arange(N, 2 * N), torch.arange(0, N)]).to(z.device)
return F.cross_entropy(sim, targets)
Normalizați L2 reprezentările vectoriale înainte de apel. tau=0.1 este valoarea implicită SimCLR; o valoare mai mică face pierderea mai accentuată și cere mai multe exemple negative.
Pasul 3: Verificarea de plauzibilitate a InfoNCE
z1 = F.normalize(torch.randn(16, 32), dim=-1)
z2 = z1.clone()
loss_same = info_nce(z1, z2, tau=0.1).item()
z2_random = F.normalize(torch.randn(16, 32), dim=-1)
loss_random = info_nce(z1, z2_random, tau=0.1).item()
print(f"InfoNCE with identical pairs: {loss_same:.3f}")
print(f"InfoNCE with random pairs: {loss_random:.3f}")
Perechile identice ar trebui să dea o pierdere mică (aproape de 0 pentru un lot mare și temperatură mică). Perechile aleatoare ar trebui să dea log(2N-1) = ~log(31) = ~3.4 cu un lot de 16 perechi.
Pasul 4: Mascare în stil MAE
def random_mask_indices(num_patches, mask_ratio=0.75, seed=0):
g = torch.Generator().manual_seed(seed)
n_keep = int(num_patches * (1 - mask_ratio))
perm = torch.randperm(num_patches, generator=g)
visible = perm[:n_keep]
masked = perm[n_keep:]
return visible.sort().values, masked.sort().values
num_patches = 196
visible, masked = random_mask_indices(num_patches, mask_ratio=0.75)
print(f"visible: {len(visible)} / {num_patches}")
print(f"masked: {len(masked)} / {num_patches}")
Simplu, rapid și determinist pentru o valoare seed dată. Implementările MAE reale aplică aceasta pe loturi și păstrează măști pentru fiecare eșantion.
Utilizați
DINOv2 este standardul de producție în 2026:
import torch
from transformers import AutoImageProcessor, AutoModel
processor = AutoImageProcessor.from_pretrained("facebook/dinov2-base")
model = AutoModel.from_pretrained("facebook/dinov2-base")
model.eval()
# Per-image embeddings for zero-shot retrieval
with torch.no_grad():
inputs = processor(images=[pil_image], return_tensors="pt")
outputs = model(**inputs)
embedding = outputs.last_hidden_state[:, 0] # CLS token
Reprezentarea vectorială rezultată, cu 768 de dimensiuni, este backbone-ul fluxurilor moderne de regăsire de imagini, corespondență densă și transfer zero-shot. Ajustarea fină pe o sarcină din aval are rareori nevoie de mai mult decât un cap liniar.
Notă tehnică a traducerii: Sintagma „standard de producție” nu este o categorie tehnică formală. Pentru checkpoint-ul
facebook/dinov2-base, folosiți procesorul furnizat de checkpoint; potrivirea pentru regăsire depinde și de normalizare, metrică, index și datele-țintă. Alegerea între un encoder înghețat cu cap liniar și ajustarea fină a encoderului trebuie validată pe sarcina-țintă.
Pentru reprezentări vectoriale imagine–text, SigLIP sau OpenCLIP sunt echivalentele; pentru ajustare fină în stil MAE, depozitul timm livrează fiecare checkpoint MAE.
Notă tehnică a traducerii: DINOv2 este un encoder exclusiv vizual; el nu oferă singur alinierea imagine–text necesară pentru clasificarea zero-shot cu etichete în limbaj natural. SigLIP și OpenCLIP au obiective, checkpoint-uri, tokenizatoare și preprocesări proprii, deci nu sunt interschimbabile cu DINOv2. De asemenea, catalogul
timmoferă modele și ponderi selectate, nu o garanție că include fiecare checkpoint MAE publicat.
Livrați
Această lecție produce:
outputs/prompt-ssl-pretraining-picker.md— un prompt care alege SimCLR / MAE / DINOv2 date fiind dimensiunea setului de date, resursele de calcul și sarcina din aval.outputs/skill-linear-probe-runner.md— o competență care scrie evaluarea prin probing liniar pentru orice encoder înghețat + set de date etichetat.
Exerciții
- (Ușor) Verificați că pierderea InfoNCE scade când reduceți temperatura pentru reprezentări vectoriale bine aliniate și crește când reduceți temperatura pentru reprezentări vectoriale aleatoare. Produceți un grafic
tau in [0.05, 0.1, 0.2, 0.5]față de pierdere. - (Mediu) Implementați un buffer central în stil DINO. Arătați că, fără centrare, studentul colapsează la un vector constant în câteva epoci.
Notă tehnică a traducerii: Această experiență nu are un rezultat garantat „în câteva epoci”: eliminarea centrării poate să nu producă colaps în toate implementările, mai ales dacă restul rețetei DINO rămâne activ. Tratați exercițiul ca ablație controlată și urmăriți, pe lângă pierdere, variația și entropia ieșirilor profesorului și studentului.
- (Dificil) Antrenați MAE pe CIFAR-100 folosind TinyUNet din Lecția 10 ca backbone. Raportați acuratețea probing-ului liniar la 10, 50 și 200 de epoci. Arătați că un probe liniar preantrenat MAE depășește un probe liniar supervizat de la zero pe același subset de 1.000 de imagini.
Termeni-cheie
| Termen | Cum este numit în practică | Ce înseamnă de fapt |
|---|---|---|
| Auto-supervizată | „Fără etichete” | O sarcină de pretext care produce reprezentări utile din date neetichetate |
| Sarcină de pretext | „Sarcina falsă” | Obiectivul folosit în SSL (reconstruirea patch-urilor, potrivirea vederilor); eliminat după preantrenare |
| Probe liniar | „Encoder înghețat + cap liniar” | Evaluare SSL standard: antrenați doar un clasificator liniar deasupra caracteristicilor înghețate |
| InfoNCE | „Pierdere contrastivă” | softmax peste similarități cosinus; perechea pozitivă este clasa-țintă, toate celelalte sunt exemple negative |
| Profesor EMA | „Profesor cu medie mobilă” | Profesor ale cărui ponderi sunt o medie mobilă exponențială a ponderilor studentului; folosit de BYOL, MoCo, DINO |
| Raport de mascare | „% dintre patch-uri ascunse” | Fracțiunea de patch-uri mascate în MAE; 75% pentru viziune, 15% pentru text |
| Colapsul reprezentării | „Ieșire constantă” | Eșec SSL în care encoderul produce un vector constant pentru toate intrările; prevenit prin centrare, accentuare sau exemple negative |
| DINOv2 | „Backbone SSL de producție” | ViT auto-supervizat al Meta din 2023; caracteristici de imagine cu scop general foarte puternice în 2026 |
Lecturi suplimentare
- SimCLR (Chen et al., 2020) — referința pentru învățarea contrastivă
- DINO (Caron et al., 2021) — profesor–student cu momentum, centrare și accentuare
- MAE (He et al., 2022) — preantrenare cu autoencoder mascat pentru ViT
- DINOv2 (Oquab et al., 2023) — extinderea ViT auto-supervizat la caracteristici de producție
Sursă: Originalul în limba engleză
Navigare: ← Lecția 04.16 — Construiți un flux complet de viziune — proiect integrator · Faza 4 — Viziune computerizată · Lecția 04.18 — Viziune cu vocabular deschis — CLIP → · Catalog complet