30.4 Önfelügyelt kísérlet korrekt összevetése

30.4.1 Cél, előismeret és indító kérdés

A 30.3. Negatív nélküli módszerek és collapse egységben láttuk, hogy a kontrasztív és a negatív nélküli módszerek egyaránt összeomolhatnak konstans reprezentációba, ha a stop-gradient, a veszteség vagy a teachermechanizmus nem megfelelő. Ebben az alfejezetben azt vizsgáljuk, hogyan lehet egy önfelügyelt pretraining utáni downstream eredményt korrekt módon összehasonlítani egy felügyelt kiindulási modellel. Az előismeret: a frozen probe fogalma, a train/val/test felosztás és a matched-recipe abláció 18.4. Reziduális blokk ablatív vizsgálata gondolata.

Induló kérdés: ha az A módszer 0,87, a B módszer 0,79 tesztpontosságot ér el ugyanazon a teszthalmazon, akkor állíthatjuk-e, hogy A reprezentációja jobb? A válasz csak akkor lehet igen, ha a két ág azonos címke- és számítási kerettel, azonos adatmedencével és azonos protokollal futott. Ellenkező esetben a különbség lehet pusztán a több adat vagy a több számítás következménye.

30.4.2 Definíciók: pretraining, frozen probe és erőforrás-könyvelés

Legyen az enkóder

fθ:ℝC×H×W→ℝd,f_\theta:\mathbb R^{C\times H\times W}\to\mathbb R^d,

tehát egy képből dd-dimenziós vektort készít. A pretraining során egy címke nélküli képhalmazt használunk:

𝒟pre={xi∈[0,1]C×H×W}i=1Npre.\mathcal D_{pre}=\{x_i\in[0,1]^{C\times H\times W}\}_{i=1}^{N_{pre}}.

Minden xix_i-hez két augmentált nézetet rendelünk, xiax_i^a és xibx_i^b; a kontrasztív pretext cél egy pozitív párként kezeli (xia,xib)(x_i^a,x_i^b)-t, a batch többi elemét pedig negatívként. A pretext „címke” tehát a kép példányazonossága, nem emberi osztálycímke. A downstream osztálycímkék y∈{0,…,K−1}y\in\{0,\ldots,K-1\} ebben a fázisban ismeretlenek a modell számára.

A frozen probe során adott egy címkézett halmaz

𝒟probe={(xj,yj)}j=1Lprobe,\mathcal D_{probe}=\{(x_j,y_j)\}_{j=1}^{L_{probe}},

és egy rögzített enkóderparaméter θ*\theta^*. Képezzük a reprezentációkat zj=fθ*(xj)∈ℝdz_j=f_{\theta^*}(x_j)\in\mathbb R^d, majd egy affin fejet tanítunk:

gW(z)=Wz+b,W∈ℝK×d,b∈ℝK.g_W(z)=Wz+b,\qquad W\in\mathbb R^{K\times d},\ b\in\mathbb R^K.

Batchben Z∈ℝB×dZ\in\mathbb R^{B\times d} mellett a logitok G=ZW⊤+b∈ℝB×KG=ZW^\top+b\in\mathbb R^{B\times K}. A „frozen” szó azt jelenti, hogy a veszteség gradiensét csak WW-re és bb-re számítjuk; ∇θL=0\nabla_\theta L=0 a tanítás során. PyTorchban ez a torch.no_grad() alatti forward vagy requires_grad_(False) használatát jelenti. BatchNorm-rétegeknél az enkódert kiértékelő módba kell tenni, hogy a running statisztika és ne a batch statisztikája érvényesüljön.

Címkeköltségvetés. Egy módszer címkeköltsége BlabB_{lab}: azon (x,y)(x,y) képpárok száma, amelyeket bármilyen felügyelt optimalizáláshoz, korai leállításhoz vagy modellválasztáshoz ténylegesen felhasználtunk. A tesztcímkéket a végső kiértékelésen kívül nem számítjuk ide, és a pretext augmentációból származó pozitív/negatív viszonyok sem címkék.

Számítási költségvetés. Legyen cfc_f egy kép enkóder-forwardjának normalizált költsége, cbc_b pedig az enkóder-backwardé. A ρ=cb/cf\rho=c_b/c_f arány hardverfüggő; ebben a jegyzetben csak könyvelési konvencióként a ρ=2\rho=2 értéket használjuk. A kontrasztív pretraining egy eredeti képre két nézetet, tehát két forwardot és két backwardot jelent. Egy felügyelt lépés egy képre egy forward és egy backward. Ezzel

UA=2(cf+cb)NpreEpre+cfLprobeEprobeU_A=2(c_f+c_b)N_{pre}E_{pre}+c_f L_{probe}E_{probe}

az A önfelügyelt ág normalizált költsége, ahol EpreE_{pre} a pretraining epochok, EprobeE_{probe} a frozen probe epochok száma. A felügyelt B kiindulási ág költsége

UB=(cf+cb)LBEB,U_B=(c_f+c_b)L_BE_B,

ahol LBL_B a felügyelt kép-címke párok száma, EBE_B az epochok száma.

30.4.3 Levezetés: a címke- és számítási keret mint kontrollfeltétel

Az összehasonlítás akkor tisztán a reprezentációról szól, ha az erőforrás-különbségek nem magyarázhatják a mért különbséget. Ezt egy azonosíthatósági lemmában rögzítjük.

Lemma (erőforrás-konfúzió az additív feltevés mellett). Tegyük fel, hogy egy módszer végső pontszáma

s=α+βM+γcU+γlBlab+γuNpre+ε,s=\alpha+\beta M+\gamma_c U+\gamma_l B_{lab}+\gamma_u N_{pre}+\varepsilon,

ahol M∈{0,1}M\in\{0,1\} a vizsgált módszercsalád indikátora, UU a számítási, BlabB_{lab} a címke-, NpreN_{pre} a pretraining képmennyiségi erőforrás, ε\varepsilon pedig nulla várható értékű hibatag. Ha a két megfigyelt ág között legalább egy erőforrás értéke különbözik, akkor a megfigyelt d=sA−sBd=s_A-s_B különbséghez végtelen sok különböző β\beta módszerhatást rendelhetünk, tehát β\beta önmagában nem azonosítható.

Bizonyítás. Jelölje δU=UA−UB\delta_U=U_A-U_B, δl=Blab,A−Blab,B\delta_l=B_{lab,A}-B_{lab,B} és δu=Npre,A−Npre,B\delta_u=N_{pre,A}-N_{pre,B}. Feltéve εA=εB\varepsilon_A=\varepsilon_B mellett az átlagos megfigyelt különbség

d=β+γcδU+γlδl+γuδu.d=\beta+\gamma_c\delta_U+\gamma_l\delta_l+\gamma_u\delta_u.

Ha például δU≠0\delta_U\neq 0, akkor tetszőleges β1≠β2\beta_1\neq\beta_2 módszerhatáshoz választhatjuk

γc(β)=d−β−γlδl−γuδuδU,\gamma_c^{(\beta)}=\frac{d-\beta-\gamma_l\delta_l-\gamma_u\delta_u}{\delta_U},

és ezzel ugyanazt a dd különbséget kapjuk. A választás tetszőleges, tehát a megfigyelés nem különíti el a módszerhatást az erőforráshatástól. Ha δU=0\delta_U=0, de δl≠0\delta_l\neq 0 vagy δu≠0\delta_u\neq 0, akkor az adott nemnulla δ\delta-val ugyanez a konstrukció elvégezhető. ▫\square

A lemma feltétele az additív modell, ezért nem általános statisztikai azonosíthatósági tétel. A célja az, hogy pontosan megfogalmazza: a több adatot és több számítást használó módszer fölénye nem automatikusan architekturális vagy reprezentációs bizonyíték. A gyakorlati következmény az alábbi protokoll:

  1. Címke-egyezés: Blab,A=Blab,BB_{lab,A}=B_{lab,B}. Az A ág frozen probe-ja és a B felügyelt ág ugyanannyi címkézett képet kap.
  2. Számítási keret: UA≤UBU_A\le U_B vagy |UA−UB||U_A-U_B| egy előre rögzített kis tolerancián belül van. Ha B kevesebb számítást kap, az összehasonlítás nem a módszert izolálja.
  3. Adatmedence: az A pretraininghez használt NpreN_{pre} kép nagyobb adathalmazt adhat, mint a B ág. Ez további erőforrás; vagy B is megkapja ugyanazt a medencét egy megengedett felhasználási formában, vagy a NpreN_{pre} hatást külön ablációnak nevezzük.
  4. Diszjunkt teszt: 𝒟test\mathcal D_{test} sem a pretraining, sem a probe sem a B tanítóhalmaz képeivel nem osztozhat. A GlyphLab esetében a független mintaegység a scene_id, ezért ugyanaz a jelenet nem kerülhet több halmazba.

30.4.4 Kézi számpélda

Vegyünk egy cf=1c_f=1, cb=2c_b=2 normalizált enkódert. Az A kontrasztív ág Npre=2000N_{pre}=2000 címkézetlen képet használ Epre=20E_{pre}=20 pretraining epochon át, majd Lprobe=300L_{probe}=300 címkével Eprobe=10E_{probe}=10 probe epochot futtat. Ekkor

UA=2(1+2)⋅2000⋅20+1⋅300⋅10=240,000+3,000=243,000.U_A=2(1+2)\cdot 2000\cdot 20+1\cdot 300\cdot 10=240{,}000+3{,}000=243{,}000.

A B felügyelt ág LB=300L_B=300 címkével és EB=10E_B=10 epochhal:

UB=(1+2)⋅300⋅10=9,000.U_B=(1+2)\cdot 300\cdot 10=9{,}000.

Az A ág tehát 2727-szor több normalizált számítást és 20002000 extra képet használ, miközben a címkeköltség egyenlő. Ha az A ág 0,87, a B ág 0,79 tesztpontosságot érne el, a mondat helyes formája így szól: „A kontrasztív pretraining nagyobb adat- és számítási kerettel 0,87-ot ért el”; nem pedig „a kontrasztív reprezentáció jobb”. A fair összehasonlításhoz a B ágnak UB=243,000U_B=243{,}000 kerethez EB=243,000/(3⋅300)=270E_B=243{,}000/(3\cdot 300)=270 epochot kellene kapnia, vagy az A ágnak a 20002000 képből és a pretraining epochokból annyit elvenni, hogy UA≤UBU_A\le U_B teljesüljön.

30.4.5 Labor: erőforrás-könyvelés és reprodukciós terv

A következő kód a fenti könyvelést hajtja végre. A kézirat írásakor nem futtattuk; a kimenet a képletből kézzel számított jelölt érték, nem mért futási eredmény.

# labor/n120_budget_bookkeeping.py
"""n120 erőforrás-könyvelés. Nem futtatott kód; a kimenet számított jelölt példa."""
from dataclasses import dataclass

@dataclass(frozen=True)
class Budget:
    n_pre: int      # pretraining képek száma (címke nélkül)
    e_pre: int      # pretraining epochok
    l_probe: int    # frozen probe címkézett képek
    e_probe: int    # probe epochok
    l_sup: int      # felügyelt baseline címkézett képek
    e_sup: int      # baseline epochok

def ssl_units(b: Budget, c_f: float = 1.0, c_b: float = 2.0) -> float:
    # kontrasztív: 2 nézet, mindegyik forward+backward; probe: fagyasztott forward
    return 2.0 * (c_f + c_b) * b.n_pre * b.e_pre + c_f * b.l_probe * b.e_probe

def sup_units(b: Budget, c_f: float = 1.0, c_b: float = 2.0) -> float:
    return (c_f + c_b) * b.l_sup * b.e_sup

def report(b: Budget) -> None:
    u_a = ssl_units(b)
    u_b = sup_units(b)
    label_match = b.l_probe == b.l_sup
    print(f"SSL units:          {u_a:.1f}")
    print(f"Supervised units:   {u_b:.1f}")
    print(f"Compute ratio A/B:  {u_a / u_b:.2f}")
    print(f"Label budget match: {label_match}")

config = Budget(n_pre=2000, e_pre=20,
                l_probe=300, e_probe=10,
                l_sup=300, e_sup=10)
report(config)

A képletből számolt jelölt kimenet:

SSL units:          243000.0
Supervised units:   9000.0
Compute ratio A/B:  27.00
Label budget match: True

A report függvény nem ellenőrzi a pretraining-képek diszjunkcióját; ezt a GlyphLab metadata.csv alapján külön kell megtenni:

pretrain_scenes = set(meta.loc[meta.split == "train", "scene_id"])
probe_scenes = set(meta.loc[meta.split == "train", "scene_id"])
test_scenes = set(meta.loc[meta.split == "test", "scene_id"])
assert pretrain_scenes & test_scenes == set()

Jelölt helyi reprodukciós terv (nem elvégzett futtatás). Kérdés: a kontrasztív pretraining javítja-e a GlyphLab orientációfelismerést a matched-költségű felügyelt baseline-hoz képest? Enkóder: ugyanaz a kis CNN mindkét ágban, d=32d=32 kimenettel. Pretraining: a train split 240 képe, címkék nélkül, orientációt megőrző augmentációkkal (fényességeltolás, σ=0,05\sigma=0{,}05 Gauss-zaj), 90 fokos forgatás nélkül. Probe: ugyanezen 240 train kép címkéjével, frozen enkóderrel, logitfejjel. Baseline: ugyanez a CNN és augmentáció, felügyelt tanítás a 240 train címkével. Számítási keret: az A ág UAU_A értékét kiszámítjuk, majd a B ág EBE_B epochszámát úgy állítjuk be, hogy UB≥UAU_B\ge U_A és |UB−UA||U_B-U_A| kicsi legyen. Modellválasztás: mindkét ágban a val split vesztesége szerinti legjobb checkpoint; a test splitet egyszer, a legvégén értékeljük. Három seeddel ismétlünk, és a pontosságok átlagát és szórását közöljük. A korrupt tesztet csak a befagyasztott protokoll után nézzük meg. Ez a terv még nem mért eredmény, ezért itt nem állítunk számot.

30.4.6 Feladatok

F1 (fogalmi, nehézség 1). Magyarázza el a különbséget a pretext pozitív pár és a downstream osztálycímke között. Adjon egy GlyphLab-példát, ahol egy augmentáció jó pretext pozitív párt ad, de a downstream orientáció szempontjából káros.

F2 (levezetési, nehézség 2). Legyen cf=1c_f=1, cb=2c_b=2. Az A ág Npre=500N_{pre}=500, Epre=8E_{pre}=8, Lprobe=200L_{probe}=200, Eprobe=5E_{probe}=5. A B ág LB=200L_B=200, EB=20E_B=20. Számítsa ki UAU_A-t és UBU_B-t. Címke-egyezés mellett teljesül-e a számítási keret? Ha nem, hány epochot kellene B-nek adni a keret kiegyenlítéséhez?

F3 (implementációs, nehézség 2). Bővítse a labor report függvényét úgy, hogy visszatérési értékként adja a három budget-összetevőt, és külön assert ellenőrizze a címkeegyezést. Írjon tesztet a kézi példára, amely 11 relatív tolerancián belül ellenőrzi a ssl_units képletét.

F4 (hibakeresési, nehézség 2). A következő protokollhibát látja egy hallgató kódjában: a pretraininghez a train és a test képek listáját összefűzi, mert „a test képekhez úgysem használ címkét”. Mi a hiba következménye, és milyen scene_id-alapú ellenőrzéssel lehet ezt kimutatni? Javítsa a hibát és fogalmazza meg a visszaellenőrzést.

F5 (kísérlettervezési/transzfer, nehézség 3). Tervezzen egy GlyphLab-kísérletet, amely egy kontrasztív és egy negatív nélküli pretext cél downstream hatását hasonlítja össze matched compute mellett. Adja meg a protokollt, a baseline-t, a metrikát és a következtetési korlátot. Előre nem kell győztest mondani; a negatív, de lefuttatott eredmény is elfogadható.

30.4.7 Megoldások és indoklás

F1 megoldás. A pretext cél a példányazonosság: ugyanazon kép két augmentált nézete pozitív pár, más képek nézetei negatívak. Ez nem használ emberi osztálycímkét. A downstream címke a GlyphLab három orientációja. Ha a pretraining augmentáció 90 fokos forgatást is tartalmaz, akkor egy vertical kép elforgatott nézete ugyanahhoz a példányhoz tartozik, tehát a pretext szerint pozitív pár, de a downstream orientáció szerint horizontal címkéje lenne. A reprezentáció így megtanulhatja elnyomni az orientációt, ami épp a downstream feladat számára hasznos információ.

F2 megoldás.

UA=2(1+2)⋅500⋅8+1⋅200⋅5=24,000+1,000=25,000.U_A=2(1+2)\cdot 500\cdot 8+1\cdot 200\cdot 5=24{,}000+1{,}000=25{,}000.

UB=(1+2)⋅200⋅20=12,000.U_B=(1+2)\cdot 200\cdot 20=12{,}000.

A címke-egyezés teljesül, mert 200=200200=200. A számítási keret nem teljesül, mert UA>UBU_A>U_B. A B ág szükséges epochszáma:

EB=UA(cf+cb)LB=25,0003⋅200=25,000600≈41,67.E_B=\frac{U_A}{(c_f+c_b)L_B}=\frac{25{,}000}{3\cdot 200}=\frac{25{,}000}{600}\approx 41{,}67.

Mivel epochok egészek, a B ágnak legalább 4242 epochot kell kapnia; ekkor UB=25,200U_B=25{,}200, és az A ág nem használ több keretet, mint B. Alakellenőrzés: UU skalár, az epochszám dimenziómentes.

F3 megoldás.

# labor/n120_budget_test.py
"""Bővített könyvelés teszttel. Nem futtatott kód, a várt érték kézzel számított."""
from dataclasses import dataclass

@dataclass(frozen=True)
class Budget:
    n_pre: int
    e_pre: int
    l_probe: int
    e_probe: int
    l_sup: int
    e_sup: int

def ssl_units(b: Budget, c_f: float = 1.0, c_b: float = 2.0) -> float:
    return 2.0 * (c_f + c_b) * b.n_pre * b.e_pre + c_f * b.l_probe * b.e_probe

def sup_units(b: Budget, c_f: float = 1.0, c_b: float = 2.0) -> float:
    return (c_f + c_b) * b.l_sup * b.e_sup

def report(b: Budget):
    u_a = ssl_units(b)
    u_b = sup_units(b)
    assert b.l_probe == b.l_sup, "label budget mismatch"
    return {"ssl": u_a, "sup": u_b, "label_ok": True}

b = Budget(n_pre=500, e_pre=8, l_probe=200, e_probe=5, l_sup=200, e_sup=20)
r = report(b)
assert abs(r["ssl"] - 25000.0) <= 1e-6
assert abs(r["sup"] - 12000.0) <= 1e-6
print(r)

A teszt a megadott 11 relatív tűrésnél szigorúbb, 10−610^{-6} abszolút hibát enged meg; a várt érték a levezetésből adódik.

F4 megoldás. A hiba következménye: az enkóder látja a test képeit, még ha címkék nélkül is. A kontrasztív tanulás ekkor a test képek példányszintű statisztikájához igazodhat, ezért a tesztpontosság optimistán torzít. A metadata.csv scene_id oszlopából képzett halmazok metszetét kell ellenőrizni:

pretrain_ids = set(train_meta["scene_id"])
test_ids = set(test_meta["scene_id"])
assert pretrain_ids & test_ids == set(), "scene leakage"

Javítás: a pretraining listához csak a train split képeit vegyük, a test splitet se képként, se augmentált nézetként ne használjuk. Visszaellenőrzés: az üres metszet mellett a pretraining indexek mindegyike a train splitben legyen, és a végső tesztet csak a rögzített protokoll legvégén futtassuk.

F5 megoldásminta. Protokoll: ugyanaz az enkóder, d=32d=32; a train split 240 képe a pretraining és a probe alapja, a val split a modellválasztásé, a test split csak záró kiértékelésre szolgál. Változó tényező: a pretext cél, kontrasztív (n119-ből választott loss) és negatív nélküli stop-gradient/teacher. Mindkét ághoz azonos augmentáció és azonos számítási keret tartozik a labor U_A=U_B képletéből. Mindkét ág után azonos frozen probe, L=240L=240 címkével. Metrika: test top-1 pontosság három seeddel, átlag és szórás; korrupt test páros összevetés. Baseline: ugyanaz az enkóder felügyelt traininggel, matched compute és L=240L=240. Következtetési korlát: a kis GlyphLab adat nem természetes képi benchmark; az eredmény csak erre a feladatra és erre a számítási keretre érvényes. Előre nem rögzítünk győztest; a jegyzőkönyvben a nyers pontosságokat, a seedeket és az eltéréseket közöljük.

30.4.8 Tipikus tévedés ellenpéldával

A leggyakoribb hiba az erőforrás-előny átcímkézése reprezentációs előnnyé. Például ugyanaz az enkóder kontrasztív pretraininggel 0,84, felügyelt tanítással 0,79 pontosságot ér el; a hallgató ebből azt írja, hogy a kontrasztív cél jobb reprezentációt ad. A kézi példa azonban megmutatja, hogy a kontrasztív ág 2727-ször több normalizált számítást és ezer extra képet használhatott. Ha a felügyelt ág ugyanazt a keretet kapja, a különbség eltűnhet vagy előjelet válthat. Ez a kontroll hiánya, nem architekturális bizonyíték.

30.4.9 Önellenőrzés és visszahívás

  1. Mit jelent a frozen probe gradiensszabálya? Az enkóderparaméterre ∇θL=0\nabla_\theta L=0, csak a fej paramétereit frissítjük.
  2. Miért nem elég a címke-egyezés? Mert a több pretraining kép és a nagyobb számítás ugyancsak javíthat, ahogy a lemma mutatja.
  3. Miért kell a pretraining és a teszt scene_id-halmazát diszjunktan tartani? Mert a nézetek ugyanahhoz a jelenethez tartoznak, és az átfedés optimista torzítást okoz. Visszahívás: a 30.3. Negatív nélküli módszerek és collapse alfejezetben tárgyalt stop-gradient és teachermechanizmus itt csak mint pretext cél szerepel; a 18.4. Reziduális blokk ablatív vizsgálata matched recipe gondolatát erőforrás-könyveléssel egészítettük ki. A 29.4. Anomáliapontszám rekonstrukcióból anomáliaküszöbéhez hasonlóan a teszthalmazt a választási cikluson kívül kell tartani, a 26.4. Detektálási pipeline és hibaelemzés pipeline-ellenőrzése pedig arra figyelmeztet, hogy a transzformáció és a koordinátarendszer ellentmondása láthatatlanul ronthatja az eredményt.

30.4.10 Rövid összefoglaló

Az önfelügyelt és a felügyelt ág összehasonlításához explicit erőforrás-könyvelés kell. A címkeköltség a felhasznált kép-címke párok száma; a számítási költség normalizált forward- és backward-egységekben írható fel. A kontrasztív pretraining egy eredeti képre két nézet miatt kétszeres encoderforward- és backward-költséget jelent. Ha a két ág címke-, számítási vagy adatmedencéje eltér, a pontszámkülönbségből a módszerhatás nem azonosítható, amit egy egyszerű additív lemmával bizonyítottunk. A frozen probe az enkódert rögzíti, és csak a lineáris fejet tanítja. A labor kódja kiszámítja a kereteket, de a kézirat írásakor nem futtattuk, ezért ott mért eredményt nem állítottunk.

30.4.11 Következő alkalmazás

A 31.1. VAE és variációs alsó korlát a variációs autoenckódert vezeti be. A most bevezetett frozen probe és költségkeret ott is használható: a latens reprezentáció értékelése előtt rögzíteni kell a downstream címke- és számítási protokollt, mert a generatív rekonstrukciós pontszám önmagában nem downstreambizonyíték.

30.4.12 Források