A 29.1. Lineáris és nemlineáris autoencoder egységben az autoencoder reprezentációját a rekonstrukciós célhoz mértük; ott a szűk keresztmetszet akár a downstream feladat számára haszontalan tömörítést is adhat. Itt a kérdést megfordítjuk: lehet-e úgy tanítani egy reprezentációt, hogy ne kézzel címkézett targetet használjunk, mégis a későbbi alkalmazás számára hasznos belső kódot kapjunk? Ez az önfelügyelt tanulás (self-supervised learning) központi kérdése.
Előismeret: a 22.4. Augmentációs kísérlet és domainváltozás augmentációs policy és clean–corrupt teszt megkülönböztetése, a 20.4. V. ellenőrző pont: indokolt CNN-választás architektúra-döntési lap, a 23.4. Hibaszeletek és alkalmazási határ hibaszeletek és csoportszintű értékelés, valamint a 28.4. VII. ellenőrző pont: CNN alkalmazási szerződés cél–target–loss–output–metrika–split–inference szerződés.
Induló kérdés: a GlyphLab képein egy háló megtanulja, hogy ugyanannak a jelenetnek két zajos nézete összetartozik. Ettől a reprezentáció automatikusan jó lesz-e az orientáció felismerésére? Becslés: nem feltétlenül. A két nézet összetartozása érzéketlenséget kér a zajra és a kis eltolásra; az orientáció viszont éppen egy olyan tulajdonság, amelyet egy rosszul választott transzformáció eltüntethet. A szakasz végén ezt formálisan is bebizonyítjuk, és megtervezzük a GlyphLab frozen-probe értékelését.
Definíció (pretext feladat). Legyen a bemeneti tér, például a -es szürke képek halmaza. A pretext feladat egy olyan veszteséggel és céltenzorral definiált tanítási feladat, amelynek címkéi kizárólag magából a bemenetből, emberi annotáció nélkül állnak elő. A pretext feladatot nem azért oldjuk meg, mert a kimenete önmagában érdekes, hanem mert a megoldása során a háló belső reprezentációja a bemenet olyan szerkezetét kódolja, amely más feladatra átvihető.
Definíció (downstream feladat). A downstream feladat a tényleges alkalmazási cél, például a GlyphLab orientáció-osztályozás. Ezt veszteséggel és int64 céltenzorral mérjük. A downstream feladatot a pretext után, jellemzően kevés címkével tanítjuk.
Definíció (reprezentáció és fej). A hálót két részre bontjuk: az backbone (vagy encoder) a bemenetet -dimenziós reprezentációba képezi; a fej a reprezentációból a feladat kimenetét számolja. A pretext tanítás során és egy pretext-fej optimalizálódik; downstream során és viszonyának megválasztása a két fő protokollt adja.
A GlyphLab adatszerződésben egy kép , float32, -ben. A backbone kimenete ; a downstream logit , és a CrossEntropyLoss előtt softmaxot nem alkalmazunk (7.4. Numerikus stabilitás és jelentésmegőrző implementáció). A downstream target int64.
Az önfelügyelt pretext célok egyik leggyakoribb formája a nézetpár-invariancia: ugyanabból a bemenetből két, véletlenszerűen transzformált nézetet készítünk, és , ahol egy augmentációcsalád független mintái. A pretext cél azt kéri, hogy és közel legyen egymáshoz, míg különböző bemenetek reprezentációi távol maradjanak. A konkrét kontrasztív veszteséget a következő, 30.2. Kontrasztív cél és temperature egységben vezetjük be; itt a pretext és a downstream viszonyára koncentrálunk.
A nézetpár-invariancia formális következménye az alábbi levezetés.
Állítás (a pretext invarianciaigénye). Legyen az augmentációcsalád, amely tartalmazza az identitást. Ha a pretext veszteség ideális minimumában minden -re és minden -re kielégíti az egyenlőséget, akkor invariáns minden -re abban az értelemben, hogy .
Bizonyítás. Mivel az identitás , válasszuk és értékeket. Ekkor a feltételből . ∎
Az invariancia önmagában nem hiba; akkor válik hibássá, ha a downstream cél olyan attribútumot használ, amelyet a transzformáció megváltoztat. Ezt a következő állítás rögzíti.
Állítás (rossz invariancia mint downstream-korlát). Legyen a downstream igazságfüggvény. Tegyük fel, hogy létezik és úgy, hogy . Ha invariáns a transzformációra, akkor nincs olyan downstream fej, amelyre a kompozíció mind -en, mind -en helyes.
Bizonyítás. Az invariancia miatt , ezért bármely -re Ha a kompozíció mindkét ponton helyes lenne, akkor a bal oldal -szel, a jobb oldal -szel lenne egyenlő, tehát következne. Ez ellentmond a feltételnek. ∎
A GlyphLab esetén a -os forgatás a klasszikus ellenpélda. Legyen . A downstream cél az orientáció: a vertical, a horizontal osztályra. Egy vertical képre , de a -kal elforgatott kép orientációja horizontal, azaz . Az állítás feltétele teljesül, tehát ha a pretext forgatás-invarianciát tanít, akkor bármilyen downstream fej legalább az egyik nézeten téved: nem létezik tökéletes osztályozó a két egymásnak megfelelő nézeten. A diagonal osztályra a tükrözés hasonló: a generátor csak az egyik ferde irányt tartalmazza, ezért a tükrözés a -es osztályon kívüli, új célértelmezést igénylő képet adna.
A gyakorlatban a háló nem éri el az egzakt invarianciát, ezért a downstream hiba nem feltétlenül 50%, hanem fokozatosan romlik. A fontos tanulság: a pretext transzformációk megválasztása nem semleges, azt a downstream céllal együtt kell ellenőrizni.
Kétdimenziós példa. Legyen , az augmentáció (központi tükrözés), a downstream cél . Konkrétan esetén , és , míg . Ha egy reprezentáció invariáns -re, akkor . Bármely downstream fejre tehát a két ponton nem lehet egyszerre és a kimenet. A downstream hiba legalább az egyik ponton .
Az alábbi kód a GlyphLab metaadataiból szemlélteti, hogy a
-os
forgatás nem címkemegőrző a vertical osztályra. Ez tervezett
ellenőrző kód, nem elvégzett futtatás; az olvasó a
lab könyvtárban futtathatja.
# munkakönyvtár: lab
import numpy as np
import pandas as pd
meta = pd.read_csv("data/metadata.csv")
# válasszunk egy vertical (0) train képet a scene-szintű splitből
idx = meta[(meta.split == "train") & (meta.label == 0)].index[0]
img = np.load("data/images.npy")[idx] # (1, 24, 24) float32, NCHW
rot = np.rot90(img[0], k=1) # 90 fokos forgatás a térbeli síkon
# A generátor szimmetriája szerint a rotált kép orientációja horizontal,
# ezért a downstream cél megváltozott: 0 -> 1.
print(f"eredeti label: {meta.loc[idx, 'label']}, "
f"90 fokos forgatás után várható label: 1, "
f"alak: {rot.shape}, dtype: {img.dtype}")A kód csak a kérdéses transzformáció címkemegőrzését ellenőrzi; ha a
rot képet a pretext pozitív párjaként használnánk, a
reprezentáció a két orientációt összemosná.
A labor célja a pretext–downstream szerződés megtervezése a GlyphLab adaton. Az alábbi terv nem elvégzett kísérlet; a számok és görbék jelölt szemléltetések.
Nézetképzés. A pretext feladat pozitív párja két, címkemegőrző transzformációval készült nézet ugyanabból a képből. A GlyphLab orientáció-céljához megengedett transzformációk:
clip(0,1);Kizárt transzformációk: -os forgatás (vertical horizontal felcserélés), tükrözés (diagonal irány), illetve bármely olyan művelet, amely a tengelyeket felcseréli vagy a ferde irányt tükrözi. A kizárás indoka a 3. szakasz állítása.
Backbone. Kis CPU-s CNN, NCHW bemenettel: Conv2d(1, 8, kernel=3, padding=1) + ReLU + Conv2d(8, 16, kernel=3, stride=2, padding=1) + ReLU + AdaptiveAvgPool2d(4) + Linear(256, 16). A reprezentáció dimenziója . A paraméterszám nagyságrendileg néhány ezer; a 20.4. V. ellenőrző pont: indokolt CNN-választás döntési lap szerint scratch tanítás, előtanított súly nélkül.
Pretext tanítás. A train split 240 képéből
batch-enként nézetpárokat generálunk. A kontrasztív pretext loss a
következő 30.2. Kontrasztív cél és temperature
egységben kerül bevezetésre; itt a protokoll a pozitív párok
definícióját rögzíti. A seed 20261020, dtype float32,
device CPU. A val spliten a pretext loss csak nyomon követésre
szolgál.
Frozen probe. A pretext után a backbone paramétereit
requires_grad_(False) módon rögzítjük. A train és val
képekből eval() módban, inference_mode() alatt
kiszámoljuk a
-dimenziós
reprezentációkat. Ezután egy lineáris fejet tanítunk:
Linear(16, 3), CrossEntropyLoss, Adam, tanulási ráta
,
batch 32, legfeljebb 50 epoch. A legjobb fej kiválasztása
kizárólag a val split accuracy alapján történik.
Végső kiértékelés. A befagyasztott backbone és a kiválasztott fej a test split 60 képén értékelendő. A metrika accuracy, plusz osztályonkénti bontás és scene-rétegzett bootstrap CI a 23.4. Hibaszeletek és alkalmazási határ szerint. A corrupt tesztet itt nem használjuk modellválasztásra; az opcionálisan, a protokoll végén, befagyasztott modellen értékelhető a 22.4. Augmentációs kísérlet és domainváltozás szerződés alapján.
Baseline. Ugyanaz a lineáris fej a nyers, dimenziós pixeltéren tanítva. Ez azt méri, hogy a pretext reprezentáció ad-e többletet a nyers bemenethez képest.
Ellenőrzés. A nézetképző függvény minden hívás után
megtartja a scene_id-t és a labelt; a split határok nem
sérülnek. A downstream logitokra a 7.4. Numerikus
stabilitás és jelentésmegőrző implementáció stabil logsumexp
képletét használjuk.
Értelmezési határ. A GlyphLab toy adat, három geometriai osztállyal; az eredmény nem természetes képi benchmark, és a frozen-probe pontszám csak azt mutatja, hogy ez a reprezentáció ezen a downstream feladaton mit őrzött meg.
F1 (fogalmi, nehézség 1). Definiálja a pretext és a downstream feladat közötti különbséget, és adjon egy konkrét példapárt a GlyphLab adaton, ahol a két cél más kimenetet és más veszteséget használ. Adja meg mindkettő cél-, target- és output-tenzor alakját.
F2 (levezetési, nehézség 2). Legyen , a -os forgatás. Bizonyítsa be a 3. szakasz állításának segítségével, hogy ha egy reprezentáció invariáns -re, akkor a GlyphLab vertical/horizontal downstream feladaton nincs tökéletes osztályozó. Nevezze meg a bizonyításban használt és értékét.
F3 (implementációs, nehézség 1). Írjon
Python-függvényt is_label_preserving(transform, img, label)
néven, amely a GlyphLab adatból betöltött
float32 kép és egy (1,24,24) -> (1,24,24) transzformáció
esetén ellenőrzi, hogy a transzformált kép várható orientációja
megegyezik-e a megadott label értékkel a forgatási és
tükrözési szabályok szerint. A függvény a
-os
forgatásra vertical és horizontal címkével térjen vissza különböző
értékkel; a megoldásban adja meg a teljes függvénykódot és két
tesztesetet.
F4 (hibakeresési, nehézség 2). Egy hallgató a pretext feladatban -os forgatást használ a pozitív nézetpárokhoz, mert „a forgatás úgyis csak zajos nézetet ad”. A downstream frozen-probe accuracy romlik a nyers pixeles baseline-hoz képest. Lokalizálja a hibát: mi a pontos oka, mi a következménye a reprezentációra, és mi a javítás? Ellenőrizze a javítást a 3. szakasz állításával.
F5 (kísérlettervezési/transzfer, nehézség 3). Tervezzen frozen-probe kísérletet egy új downstream célra: a GlyphLab képeken a foreground objektum jelenlétének detektálása (van-e foreground pixel, bináris cél), miközben a pretext változatlan marad. Adja meg a protokollt: megfigyelési egység, split, backbone, downstream fej, baseline, metrika, erőforrás és érvényességi korlát. Indokolja, miért nem használható a -os forgatás ebben a tervben sem.
F1 megoldása. A pretext feladat célja a reprezentáció tanítása emberi címke nélkül; a GlyphLab példában a pretext pozitív párjának célja a két nézet összetartozása. Ezt a következő egységben kontrasztív loss méri, de a target fogalma itt is megadható: minden batch-pozícióhoz egy aktív index tartozik, amely a pozitív párt jelöli. A pretext output a reprezentáció-tenzor . A downstream feladat az orientáció osztályozása: target , output logit , veszteség CrossEntropyLoss. A két cél más kimenetet és más hibamértéket használ, ezért a pretext pontossága nem fordítható közvetlenül downstream pontosságra.
F2 megoldása. Legyen egy vertical kép, . A -os forgatás után a kép orientációja horizontal, ezért . Tegyük fel, hogy invariáns -re: . Bármely downstream fejre . Ha tökéletes lenne, akkor a bal oldal , a jobb oldal lenne, ami ellentmondás. Tehát nincs tökéletes downstream osztályozó. A bizonyítás során egy tetszőleges vertical kép, az orientációt adó igazságfüggvény, .
F3 megoldása.
# munkakönyvtár: lab
import numpy as np
def is_label_preserving(transform, img, label):
"""Ellenőrzi a transformált kép várható orientációját.
img: (1, 24, 24) float32 NCHW kép.
label: 0=vertical, 1=horizontal, 2=diagonal.
A forgatási/tükrözési szabály a generátor szimmetriájából adódik:
- 90 vagy 270 fokos forgatás: vertical <-> horizontal (0<->1),
diagonal marad diagonal.
- tükrözés: diagonal irányt változtat, ezért a 2-es osztályban
új célértelmezést igényel, nem label-megőrző.
"""
out = transform(img.astype(np.float32))
# A transzformáció típusát itt a fenti szabályokból ellenőrizzük.
# A megoldásban a hallgató a konkrét transform függvényt ismeri.
# A 90 fokos forgatás a vertical/horizontal párt felcseréli.
if transform.__name__ == "rot90":
if label in (0, 1):
return label != 1 - label # mindig False, mert a címke felcserélődik
return True # diagonal esetén a 90 fokos forgatás megtartja az orientációt
# Itt további transzformációk ellenőrzése következhet.
raise NotImplementedError("A transzformáció szabálya nincs megadva.")
# Példa a meghívásra; img betöltése a metadata alapján, lásd a 4. szakaszt.
# rot90_vertical = is_label_preserving(lambda x: np.rot90(x[0], k=1)[None], img_v, 0)
# elvárt: False
# rot90_horizontal = is_label_preserving(lambda x: np.rot90(x[0], k=1)[None], img_h, 1)
# elvárt: FalseA megoldás fontos eleme, hogy a transform függvény
ismert, ezért a szabályokat explicit elágazással kell megadni. A fenti
kód a rot90 esetet mutatja; a teljes megoldásban a hallgató
a 4. szakasz np.rot90(img[0], k=1) hívását csomagolja be,
és a label értékekre a
felcserélést ellenőrzi. A diagonal esetben a
-os
forgatás önmagában megtartja az orientációt, de a tükrözés nem.
F4 megoldása. A hiba oka: a -os forgatás a vertical és horizontal osztályokat felcseréli, ezért a pretext pozitív párjaiban a két nézet különböző downstream címkéjű képeket köt össze. A reprezentáció a forgatás-invariancia irányába tolódik, ami a 3. szakasz állítása szerint felső korlátot szab a downstream pontosságnak: a vertical és horizontal jellemzők összemosódnak. A következmény a downstream accuracy romlása. A javítás: a forgatást eltávolítjuk a pretext augmentációk közül, és csak a címkemegőrző transzformációkat (kis eltolás, kis zaj, intenzitásskála) használjuk. Az ellenőrzés: a korrigált pretext után a frozen-probe accuracy nem romlik a nyers pixeles baseline alá, és a reprezentáció megtartja az orientációs információt.
F5 megoldásminta. A downstream cél: bináris
foreground-detekció, ahol a cél
,
ha a kép foreground maszkja nemüres, különben
.
A megfigyelési egység továbbra is a scene_id; a
train/val/test split változatlan. A backbone a pretext után
lefagyasztva; a downstream fej Linear(16, 1),
BCEWithLogitsLoss a 7.3. Bináris, multilabel és
regressziós cél szerint. A baseline lineáris fej nyers pixeleken,
Linear(576, 1). Metrika: AUC vagy accuracy, scene-rétegzett
bootstrap CI-vel. Erőforrás: CPU, batch 32. Érvényességi korlát: a
GlyphLab adat kis méretű és procedurális, ezért a következtetés csak
erre az adatszerződésre érvényes. A
-os
forgatás ebben a tervben sem használható, mert a pretext reprezentáció
forgatás-invarianciája a downstream foreground-detekció szempontjából
nem feltétlenül káros — a foreground jelenléte invariáns a forgatásra —,
de a 3. szakasz tanulsága szerint a transzformációt akkor is a
downstream céllal együtt kell ellenőrizni: ha a downstream cél később
orientációérzékeny elemet is tartalmaz, a forgatás ismét hibás lenne. A
tervben ezért a konzervatív választás a címkemegőrző transzformációk
megtartása mindaddig, amíg a downstream cél invarianciaigényét ki nem
mondtuk.
A leggyakoribb tévedés: „a két nézet előállításához használt transzformáció semleges, mert a pretext feladat úgyis csak egy reprezentációt tanít.” Ez azért hibás, mert a pretext cél explicit invarianciát kér a transzformációra, és az invariancia elveszi a downstream számára szükséges megkülönböztető információt. Az ellenpélda a fenti -os forgatás a GlyphLab orientáció-célján: a forgatás-invariáns reprezentáció a vertical és horizontal osztályokat összemossa, így a downstream pontosság felső korlátja elvileg sem érheti el az 1-et ezen a két osztályon. A helyes eljárás az, hogy minden pretext transzformációra kimondjuk, mely attribútumokra kérünk invarianciát, és ezt összevetjük a downstream cél attribútumigényével.
Ellenőrző lista: (1) a pretext augmentációk minden osztályra
címkemegőrzők-e; (2) a downstream best checkpoint kiválasztása csak a
val spliten történik-e; (3) a frozen probe során a backbone valóban
eval() módban és inference_mode() alatt fut-e;
(4) a downstream split scene-szintű függetlensége megmaradt-e.
Visszahívás a 29.1. Lineáris és nemlineáris autoencoder egységből: az autoencoder rekonstrukciós célja is pretext feladat, de ott a szűk keresztmetszet nem garantálja, hogy a latent kód a downstream szempontból hasznos attribútumokat őriz meg; a kontrasztív pretext ezzel szemben explicit invarianciát tanít, ezért a transzformációk megválasztása közvetlen downstream következménnyel jár. A 18.1. Reziduális blokk és identitásút reziduális blokkja a shortcut identitással a bemeneti információt őrzi meg; a pretext invariancia ezzel ellentétes irányba hathat, ha nem ellenőrizzük.
A pretext feladat célja a reprezentáció tanítása emberi címke nélkül, a downstream feladat a tényleges alkalmazás. A nézetpár-invariancia formálisan azt kéri, hogy minden augmentációra. Ha létezik , amelyre a downstream igazságfüggvény , akkor nincs tökéletes downstream osztályozó: a bizonyítás az invarianciából következő egyenlőségen alapul. A GlyphLab orientáció-célja ezért kizárja a -os forgatást és a tükrözést. A laborterv címkemegőrző nézetekkel, -dimenziós backbone-nal és frozen-probe értékeléssel méri a reprezentáció átviteli minőségét.
A 30.2. Kontrasztív cél és temperature egységben a kontrasztív veszteséget és a temperature paramétert vezetjük be; a jelen szakasz invarianciaelemzése ott azt adja, hogy mikor nem szabad egy transzformációt a pozitív pár generálására használni.