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.
Legyen az enkóder
tehát egy képből -dimenziós vektort készít. A pretraining során egy címke nélküli képhalmazt használunk:
Minden -hez két augmentált nézetet rendelünk, és ; a kontrasztív pretext cél egy pozitív párként kezeli -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 ebben a fázisban ismeretlenek a modell számára.
A frozen probe során adott egy címkézett halmaz
és egy rögzített enkóderparaméter . Képezzük a reprezentációkat , majd egy affin fejet tanítunk:
Batchben
mellett a logitok
.
A „frozen” szó azt jelenti, hogy a veszteség gradiensét csak
-re
és
-re
számítjuk;
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 : azon 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 egy kép enkóder-forwardjának normalizált költsége, pedig az enkóder-backwardé. A arány hardverfüggő; ebben a jegyzetben csak könyvelési konvencióként a é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
az A önfelügyelt ág normalizált költsége, ahol a pretraining epochok, a frozen probe epochok száma. A felügyelt B kiindulási ág költsége
ahol a felügyelt kép-címke párok száma, az epochok száma.
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
ahol a vizsgált módszercsalád indikátora, a számítási, a címke-, a pretraining képmennyiségi erőforrás, 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 különbséghez végtelen sok különböző módszerhatást rendelhetünk, tehát önmagában nem azonosítható.
Bizonyítás. Jelölje , és . Feltéve mellett az átlagos megfigyelt különbség
Ha például , akkor tetszőleges módszerhatáshoz választhatjuk
és ezzel ugyanazt a 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 , de vagy , akkor az adott nemnulla -val ugyanez a konstrukció elvégezhető.
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:
scene_id, ezért ugyanaz a jelenet nem kerülhet több
halmazba.Vegyünk egy , normalizált enkódert. Az A kontrasztív ág címkézetlen képet használ pretraining epochon át, majd címkével probe epochot futtat. Ekkor
A B felügyelt ág címkével és epochhal:
Az A ág tehát -szor több normalizált számítást és 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 kerethez epochot kellene kapnia, vagy az A ágnak a képből és a pretraining epochokból annyit elvenni, hogy teljesüljön.
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, 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, 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 értékét kiszámítjuk, majd a B ág epochszámát úgy állítjuk be, hogy és 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.
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 , . Az A ág , , , . A B ág , . Számítsa ki -t és -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
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ó.
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.
A címke-egyezés teljesül, mert . A számítási keret nem teljesül, mert . A B ág szükséges epochszáma:
Mivel epochok egészek, a B ágnak legalább epochot kell kapnia; ekkor , és az A ág nem használ több keretet, mint B. Alakellenőrzés: 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 relatív tűrésnél szigorúbb, 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,
;
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,
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
.
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.
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 -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.
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.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.
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.