A 30.2. Kontrasztív cél és temperature egységben az InfoNCE/NT-Xent célfüggvényt vizsgáltuk: a pozitív pár hasonlóságát a negatív párokból képzett nevezővel versenyezteti. Ebben az alfejezetben azt a kérdést járjuk körül, mi történik, ha a negatív példákat teljesen elhagyjuk, és csak arra kérjük a modellt, hogy ugyanannak a jelenetnek két nézete azonos reprezentációba kerüljön. Előismeret: a 30.2. Kontrasztív cél és temperature alfejezetből a hasonlósági mátrix, a temperature és a maszk, a 29.3. Regularizált latent reprezentáció alfejezetből a latent representáció összeomlásának (collapse) fogalma, a 18.3. Pre-activation, kis batch és alternatív normalizálás alfejezetből a futó átlagok könyvtári kezelése. Induló becslés: ha a loss csak annyit mond, hogy „a két nézet kimenete egyezzen”, akkor a konstans encoder triviálisan teljesíti-e a feladatot? Ha igen, mi akadályozza meg a tanuló algoritmust abban, hogy ezt a degenerált megoldást válassza?
A negatív nélküli (noncontrastive) módszercsalád közös váza a következő. Legyen az encoder, egy kép két nézete, és a normalizált reprezentáció, feltéve, hogy a norma pozitív. A legegyszerűbb pozitív-páros cél a normalizált átlagos négyzetes hiba:
Ez a cél a teacher–student keretben bővül. Két súlyhalmazt tartunk nyilván: a student (online) hálózatot és a teacher (target) hálózatot. A veszteség
ahol egy kis predictor fej, pedig a stop-gradient operátor.
Definíció (stop-gradient). A
operátor az argumentum értékét változatlanul hagyja az előremenő
számításban, de a visszafelé számításban az argumentum felé eső
Jacobi-mátrix blokkját nullával helyettesíti. Ha a loss skalár és a
teacher kimenete
,
akkor a gyakorlati frissítésben
nem számolódik, miközben a
értéke a lossba behelyettesített, aktuális teacher-kimenet marad. A
PyTorch-beli megfelelője a tensor.detach() egy
veszteséggráfban, vagy a with torch.no_grad(): blokkba tett
forward.
A teacher súlyait exponenciális mozgóátlaggal (moving average) frissítjük:
A rendszerint közel 1 (például 0,99). Ez a forma emlékeztet a BatchNorm futó átlagára, de ott statisztikákat, itt paramétervektorokat átlagolunk; a tengely és a működési mód tehát különbözik. A frissítés sorrendje lényeges: először a student veszteségén visszaterjesztünk és a student-optimizáló lép, utána a teacher a frissített student felé mozdul. A teacher kimenetén nincs gradiens, ezért a teacher nem tanul visszaterjesztéssel, csak a momentum frissítésen keresztül követi a studentet.
A célfüggvény önmagában nem bünteti a reprezentáció inputfüggésének elvesztését. Ezt rögzíti a következő lemma.
Lemma (konstans embedding mint degenerált optimum). Legyen tetszőleges inputhalmaz, encoder, és legyen
ahol , feltéve, hogy a nevező pozitív. Tegyük fel, hogy létezik , amelyre minden esetén. Ekkor
Bizonyítás. (1) Mivel minden inputra a vektort adja, , így minden összegtag nulla, az átlaguk is nulla. A normalizált MSE definíció szerint nemnegatív, tehát a a minimum.
A lemma két kontrollt nevez meg. Az első a reprezentációs collapse-mérő: egy batchben a vektorok páronkénti koszinusz-hasonlóságának átlaga, illetve a koordinátánkénti szórás. Konstans embeddingnél a páronkénti koszinusz mátrix minden eleme 1, a szórás minden koordinátán 0. A második az downstream kontroll: egy rögzített spliten tanított lineáris fej pontossága. A degenerált reprezentáció a pretext loss optimumában ülhet, miközben a downstream kontroll véletlen szintet mutat.
Az InfoNCE-val a különbség jól látható: ott a nevező negatívokat tartalmaz, és a konstans esetén a pozitív és negatív párok azonos hasonlóságot kapnak, ezért a loss nem nulla, hanem tipikusan . A negatív nélküli cél ezt a büntetést elhagyja, ezért a collapse-ot a tréningmechanizmusnak kell megakadályoznia.
A stop-gradient és a momentum teacher szerepe nem állítható be bizonyított mechanizmusként ezen a szinten. A szakirodalmi megfigyelés az, hogy a student és a lassan változó teacher közötti aszimmetria, valamint a predictor fej jelenléte eltérő fixpontokat hozhat létre, így a konstans megoldás nem stabil vonzó pontja a teljes dinamikának. Ez azonban heurisztikus magyarázat; a BatchNorm, az optimalizáló és a súlycsökkenés szerepe a negatív nélküli tanulásban jelenleg is aktív kutatási kérdés, nem e könyv lezárt tételanyaga.
Legyen , , és válasszuk a konstans reprezentációt. Az inputok
A konstans encoder mindkettőre a sort adja. A normalizálás: ; a normalizált sor minden esetben . A veszteség minden sorra , a páronkénti koszinusz átlaga .
import numpy as np
rng = np.random.default_rng(20261020)
N, d = 6, 4
X1 = rng.normal(size=(N, d)).astype(np.float64)
X2 = rng.normal(size=(N, d)).astype(np.float64)
v = np.array([1.0, 2.0, 1.0, 0.0], dtype=np.float64)
def f_const(x):
return np.tile(v, (x.shape[0], 1)) # (N, d)
Z1 = f_const(X1); Z2 = f_const(X2)
nrm = np.linalg.norm(v)
Z1h = Z1 / nrm; Z2h = Z2 / nrm # stabilizált alak
L = np.mean(np.sum((Z1h - Z2h) ** 2, axis=1))
coord_std = Z1h.std(axis=0) # (d,)
C = Z1h @ Z1h.T # (N, N) koszinuszmátrix
mean_pair_cos = (C.sum() - np.trace(C)) / (N * (N - 1))
y = np.array([0, 1, 2, 0, 1, 2], dtype=np.int64)
acc_const = float(np.mean(np.zeros(N, dtype=np.int64) == y))
print(f"L={L:.12f}")
print(f"coord_std={coord_std}")
print(f"mean_pair_cos={mean_pair_cos:.12f}")
print(f"downstream_acc_const={acc_const:.6f}")Számított kimenet (nem futtatott, a képletből meghatározott):
L=0.000000000000, coord_std=[0. 0. 0. 0.],
mean_pair_cos=1.000000000000,
downstream_acc_const=0.333333. A downstream pontosság a
kiegyenlített
osztály miatt éppen a lemma szerinti
felső korlátot éri el.
A jelen alfejezet nem futtat kísérletet; az alábbi protokoll egy végrehajtható terv, a mért eredmény hiányát explicit jelöljük.
Hivatkozott kiindulópont. [P17] SimCLR abstracts alapján a kontrasztív keret a két nézet közötti egyezést a batchbeli negatívokkal versenyezteti. A labour kérdése: ugyanazon GlyphLab encoder, view-set és tanítási költségvetés mellett hogyan viselkedik a negatív nélküli cél a stop-gradient és a momentum teacher változatokban?
Adat és split. A GlyphLab
data/images.npy (360,1,24,24) float32 tömbje;
a train/val/test a metadata-ban rögzített jelenetek. A pretext során a
downstream címkét nem használjuk, csak a képeket; a view-párok: eredeti
kép + független additív zaj, kismértékű fényességskálázás és félegységen
belüli véletlen nulla-padding utáni visszaigazítás. A 90°-os forgatást
kizárjuk, mert az orientation-célhoz nem címkemegőrző transzformáció a
GlyphLab szerződésében; a pretextben való alkalmazása downstream
értelmezési zavart vinne be.
Modell. Ugyanaz a nyolcrétegű kis CNN encoder, mint
a 30.2. Kontrasztív cél és temperature
laborjában;
kimeneti dimenzió, float32 CPU,
torch.manual_seed(20261020). A downstream fej egyetlen
Linear(32,3).
Változó tényezők. (a) kontrasztív InfoNCE baseline, ; (b) negatív nélküli cél stop-gradient nélkül; (c) ugyanaz stop-gradienttel; (d) stop-gradient és momentum teacher, ; (e) a (d) változat predictor nélkül. Minden változathoz három seed ugyanazon a train/val/test felosztáson.
Metrikák. Pretext veszteség train/val; collapse-mérő
a val reprezentációk páronkénti átlagos koszinusza; downstream lineáris
fej pontossága a rögzített testen. A lineáris fejet a rögzített train
reprezentációkra tanítjuk azonos epoch-kerettel, a val a fej
regularizáció-választásához, a test a végső méréshez. A downstream
méréshez használjuk a tiszta, nem korrupt tesztet; a
corrupted_test.npy-t itt nem használjuk, mert az a 38.3. Végső teszt és páros korrupció projekt II
zárótesztjéhez van fenntartva.
Átadandó eredmény formája. Protokollfájl, pretext loss-görbe, collapse-mérő és downstream pontosság minden változatra seed-átlaggal. Az alábbi várható kimenet csak szemléltetés, nem mért adat: az (a) baseline downstream pontossága a korábbi egységek alapján 80–90% közötti tartományban várható; a (b) változat a konstans optimum felé csúszhat, így a downstream pontosság körül marad; a (c)–(e) változatok ettől elválthatnak, de a pontos szám a kísérlet nélkül nem állítható.
F1 (fogalmi, nehézség 1). Definiáld az alábbi három fogalmat a 30.3. Negatív nélküli módszerek és collapse jelöléseivel: teacher, student, stop-gradient. Add meg, melyik paraméterekre számolunk gradientset a tanulási lépésben, és mi a szerepe a predictor fejnek.
F2 (levezetési, nehézség 2). Tekintsd a normalizálatlan változatot: , ahol , és nincs normalizálás. Bizonyítsd be, hogy az azonosan nulla encoder minden -re a globális minimumát adja, és add meg a downstream pontosság felső korlátját ebben az esetben is. Miért nem elegendő a lemma bizonyításában a nulla vektor kizárása nélküli normalizálás?
F3 (implementációs, nehézség 2). Írj teljes NumPy
függvényt negativ_nelkuli_loss(Z1, Z2) néven, amely a
normalizált MSE-veszteséget és a collapse-mérőt (páronkénti átlagos
koszinusz) adja vissza. Az inputok (N,d) float64 tömbök, és
a függvény stabilan kezelje azt az esetet, ha egy reprezentációsor
normája nullához közeli (használj
normalizálási epsilont). Ellenőrizd a konstans
példán, és egy olyan batchen, ahol a két nézet egymástól eltér.
F4 (hibakeresési, nehézség 3). A következő vázlat a momentum teacher frissítését akarja elvégezni PyTorchban:
for tp, sp in zip(teacher.parameters(), student.parameters()):
tp.data = tau * tp.data + (1.0 - tau) * sp.data
# ... később a loss.backward() és student_optimizer.step()Azonosítsd a két lehetséges hibát, és magyarázd el a következményét:
mi történik a tanulási dinamikával, ha a frissítés (i) a
loss.backward() után, de a teacher paramétereken
gradiensgráfban marad; (ii) a student step() előtt hajtódik
végre? Add meg a javított kódot no_grad és megfelelő
sorrend használatával.
F5 (kísérlettervezési/transzfer, nehézség 3). Tervezz kísérletet a GlyphLabon, amely azt vizsgálja, hogy a negatív nélküli pretext reprezentáció jobb-e a downstream orientation osztályozáshoz, mint (i) a véletlenül inicializált encoder és (ii) az autoencoderes rekonstrukciós pretext. Add meg a megfigyelési egységet, a splitet, a baseline-okat, a változó tényezőket, a metrikákat és az érvényességi korlátot. Nem kell futást végezni, de a tervnek végrehajthatónak kell lennie a könyv CPU-s főútján.
F1. A student a paraméterű encoder, amelyen a pretext veszteség gradientsét visszaterjesztjük; a teacher a paraméterű, ugyanolyan architektúrájú encoder, amelyen gradients nem folyik keresztül, súlyát az exponenciális mozgóátlag frissíti. A stop-gradient a teacher kimenetét a loss számításában konstansként kezeli, tehát a visszaterjesztés során a teacher felé eső gradiens blokkot nullázza. A gradients kizárólag a student és a predictor paramétereire számolódik; a predictor a student oldali nemlineáris fej, amely az aszimmetriát növeli, és a módszercsalád gyakorlatában a negatív nélküli tanulás stabilitásához járul hozzá.
F2. Ha minden -re, akkor minden tag , ezért . Mivel a norma négyzete nemnegatív, ez a globális minimum. A downstream predikció konstans, így a pontosság legfeljebb , kiegyenlített esetben . A normalizált változat lemmájában a feltétel szükséges, mert a esetben a nincs értelmezve; a numerikus gyakorlatban a nullához közeli nevező instabil normalizálást és tetszőleges irányú egységvektorokat ad, ami miatt a veszteség nem feltétlenül nulla, de a reprezentáció inputfüggetlensége a downstream kontrollon továbbra is megmutatkozik.
F3. Teljes kód:
import numpy as np
def negativ_nelkuli_loss(Z1, Z2, eps=1e-12):
"""
Z1, Z2: (N, d) float64 reprezentációsorok.
Vissza: L_normalizalt_mse, mean_pair_cos.
"""
n1 = np.linalg.norm(Z1, axis=1, keepdims=True)
n2 = np.linalg.norm(Z2, axis=1, keepdims=True)
Z1h = Z1 / np.maximum(n1, eps)
Z2h = Z2 / np.maximum(n2, eps)
L = np.mean(np.sum((Z1h - Z2h) ** 2, axis=1))
C = Z1h @ Z1h.T
N = Z1h.shape[0]
mean_pair_cos = (C.sum() - np.trace(C)) / (N * (N - 1))
return L, mean_pair_cos
# Ellenőrzés konstans esetben
v = np.array([1.0, 2.0, 1.0, 0.0], dtype=np.float64)
Zc = np.tile(v, (6, 1))
Lc, mpc = negativ_nelkuli_loss(Zc, Zc)
print(f"konstans: L={Lc:.12f}, mean_pair_cos={mpc:.12f}") # 0, 1
# Eltérő nézetek: várhatóan L>0 és mpc<1
rng = np.random.default_rng(20261020)
Za = rng.normal(size=(6, 4)); Zb = rng.normal(size=(6, 4))
Ld, mpd = negativ_nelkuli_loss(Za, Zb)
print(f"eltérő: L={Ld:.6f}, mean_pair_cos={mpd:.6f}")Számított kimenet: a konstans esetben L=0.000000000000,
mean_pair_cos=1.000000000000; az eltérő esetben
és mean_pair_cos értéke a véletlen mintától függően
-en
belül, de nem garantáltan nulla. A tolerancia a konstans esetben a
float64 kerekítés miatt
alatt várható.
F4. A kód két hibája:
Ha a frissítés a teacher paramétereken gradiensgráfban marad
(például a tp.data = ... helyett
tp = tau*tp + (1-tau)*sp fordul elő no_grad
nélkül), a momentum frissítés bekerül a számítási gráfba. A következő
backward() a teacher és a student közötti
momentum-grádienst is felhalmozza, így a teacherhez gradiens kötődik, és
a stop-gradient feltétel sérül: a teacher véletlenszerű, a momentum
frissítéstől függő gradientset kaphat, ami nem kívánt tanulási
jel.
Ha a teacher frissítése a student step() előtt
történik, akkor a teacher a régi student súlyok felé mozdul. A
szándék az, hogy a teacher a frissített studentet kövesse, ezért a
sorrend: loss.backward(),
student_optimizer.step(), majd a teacher momentum
frissítés.
Javított kód:
# backward és student update
loss.backward()
student_optimizer.step()
# teacher frissítés, gradiensgráf nélkül
with torch.no_grad():
for tp, sp in zip(teacher.parameters(), student.parameters()):
tp.mul_(tau).add_(sp, alpha=1.0 - tau)Visszaellenőrzés: a teacher paraméterei nem rendelkeznek
requires_grad gráfbeli kapcsolattal a studenthez a momentum
frissítés után; a tp frissítése in-place,
no_grad alatt. A momentum frissítés utáni egységteszt:
egyetlen lépésre
méretű lineáris réteggel,
,
,
esetén a frissítés után
a mozgóátlag képletéből.
F5. Egy lehetséges terv: a GlyphLab train/val/test
jelenetfelosztását változatlanul hagyjuk; a pretext tanuláshoz minden
train képből két view-t készítünk a labor előtti augmentációs
szabályokkal. A változó a pretext cél: (A) véletlen encoder (nincs
pretext), (B) autoencoder rekonstrukciós pretext, (C) negatív nélküli
pozitív-páros pretext stop-gradienttel. A downstream fej mindhárom
esetben egy Linear(32,3) a rögzített encoder-kimeneten. A
megfigyelési egység a scene_id, ezért a val/test jeleneteket soha nem
használjuk pretext tanításra. A metrika a downstream val/test pontosság
minden változatra három seeddel. A baseline az (A) véletlen fej, mert
azt méri, mennyit ér a pretext önmagában. Az érvényességi korlát: a
GlyphLab nem természetes képi adat; a pretext transzformációk a generált
vonalak statisztikáira vannak hangolva; a scene-függő zaj miatt a
jelenetek közötti augmentációs invariance eltérhet a valós adatoktól,
így az eredmény nem általánosítható termelési modellre.
A leggyakoribb tévedés azt hinni, hogy a collapse elkerülése önmagában downstream feladatsikerrel jár. Ez nem igaz. Ellenpéldául tekintsünk olyan adatot, ahol , az , és egymástól független folytonos véletlen változók, a háromosztályos címkét pedig kizárólag alapján, azonos valószínűségű intervallumokkal képezzük. Legyen az encoder . A különböző bemenetek reprezentációi nem állandók, és normalizálás után sem mind ugyanabba az irányba mutatnak, ezért a páronkénti koszinusz-hasonlóság nem szükségképpen 1. A címkére azonban semmilyen információt nem tartalmaznak: kiegyensúlyozott osztályok mellett a belőlük dolgozó legjobb osztályozó várható pontossága legfeljebb . A nem összeomlott reprezentáció tehát nem feltétlenül hasznos a downstream feladathoz. Emiatt a pretext tanítást előre rögzített downstream kontrollal kell kiértékelni, nem csupán a collapse hiányával.
Önellenőrző kérdések: (1) A stop-gradient operátor mit tesz a veszteség Jacobi-mátrixában? (2) Miért nulla a konstans encoder vesztesége a normalizált MSE alatt, és mi a downstream pontosság felső korlátja kiegyenlített osztályoknál? (3) Miben különbözik a momentum teacher frissítés a BatchNorm futó statisztikájától? (4) Miért nem elég a páronkénti koszinusz átlaga 1-től való eltérése a downstream hasznosság igazolásához?
Visszahívás: a 29.3. Regularizált latent reprezentáció autoencdernél a rekonstrukcióból nem következik szemantikai tudás; az itt tárgyalt negatív nélküli pretext a pozitív invarianciából ugyanígy nem kap downstream garanciát. A 26.3. NMS, confidence és AP tanulsága, hogy a nyers score és a működési pont különválik; a downstream lineáris fej pontossága egyetlen küszöböt mér, a kalibrálást külön kell vizsgálni. A 18.3. Pre-activation, kis batch és alternatív normalizálás futó átlagos állapota párhuzamos a momentum teacher exponenciális átlagával, de a frissített objektum és a tengelyek eltérnek.
A negatív nélküli pretext cél csak pozitív párokat használ: ugyanannak a jelenetnek két nézete azonos normalizált reprezentációba kerüljön. A konstans encoder a normalizált MSE veszteséget nullára csökkenti, miközben a downstream pontosság csak lehet; ezt a lemmát a jelen alfejezet bizonyítja. A collapse ellen a gyakorlatban stop-gradient, momentum teacher és predictor fej szolgál, de ezek hatása heurisztikus, nem lezárt tétel. A laborban a SimCLR-keretből kiinduló mechanizmus- és ablatív tervet készítünk, a feladatokban pedig a kontrollt és a tipikus tévedéseket gyakoroljuk.
A következő 30.4. Önfelügyelt kísérlet korrekt összevetése egység az önfelügyelt kísérletek korrekt összevetését vizsgálja: ott az itt definiált negatív nélküli pretext, a collapse-mérő és a downstream kontroll kapcsolódik össze a véletlen, rekonstrukciós és kontrasztív baseline-ok fair összehasonlításában.
Források: