Az előző egységben, az 5.3. Mintavételi bizonytalanság és intervallum alfejezetben a mintavételi bizonytalanságot független, azonos eloszlású (iid) megfigyelésekre vizsgáltuk. A gyakorlati képi adatok azonban gyakran csoportokba rendeződnek: a GlyphLab egy jelenetének két nézete ugyanazt a geometriát tartalmazza, csak a zaj különbözik. Ha ezeket független képként kezeljük, a becslés bizonytalanságát alulbecsülhetjük. Az egység célja a statisztikai elemzés egységének, a páros összehasonlításnak és a klaszterbootstrapnek a bevezetése, valamint az adatminta- és a tanítási seed hatásának szétválasztása.
Előismeret: az 5.3. Mintavételi bizonytalanság és intervallum fogalmai (becslő, standard hiba, lefedettség, konfidenciaintervallum), valamint a 4.4. I. ellenőrző pont: matematika és kód megfelelése alfejezetből a determinisztikus reprodukálhatóság és az 1.4. Tanulási diagnózis és kísérleti napló alfejezetből a seed, illetve futásazonosító megkülönböztetése. Nem tételezünk fel haladó statisztikai elméletet.
Induló kérdés: a GlyphLab tanítóhalmaza 240 képet tartalmaz, de ezek 120 jelenetből származnak, jelenetenként két nézettel. Hány független megfigyelésünk van: 240 vagy 120? A válasz a kérdés feltevésétől függ, és ez az egész egység központi problémája.
Definíció (megfigyelési egység és klaszter). Legyen
adott egy véges sokaság, amelyből mintát veszünk. A megfigyelési
egység az a legkisebb rekord, amelyen a célváltozót mérjük — itt
egy kép. A klaszter (csoport, angolul cluster)
megfigyelések olyan halmaza, amelyen belül a függetlenség nem indokolt;
a mintavételi terv a klaszter egészét választja ki vagy hagyja el. A
GlyphLab-ban a klaszter a scene_id: egy jelenet két nézete
közös véletlen geometriai konfigurációból származik, ezért a képszintű
függetlenség sérül. A kettő közötti különbség nem pusztán formális: ha a
jeleneten belüli képek korreláltak, akkor
kép kevesebb információt hordoz, mint
független megfigyelés.
Definíció (páros megfigyelés). Két mérés akkor páros, ha ugyanahhoz a klaszterhez tartozik, és a két feltétel közötti különbséget klaszteren belül értelmezzük. A GlyphLab zárótesztjében a clean és a corrupted változat ugyanazt a 60 tesztképet módosítja; a két feltétel képenként párosítható, ezért a pontosságkülönbség páros összehasonlítással elemezhető. A páros elemzés előnye, hogy a klaszterek közötti (jelenetek közötti) szórást kiküszöbölheti a különbségből — hasonlóan ahhoz, ahogy az 5.3. Mintavételi bizonytalanság és intervallum alfejezetben a becslő varianciája a megfigyelések varianciájából származott.
Jelölés. Legyen a klaszterek száma, az -edik klaszter elemszáma, az átlagos klaszterméret, és a teljes képszám. A GlyphLab tanítóhalmazában , minden -re, . Egy becslőt -val jelölünk; a bootstrap replikátumait , ahol a replikátumok száma.
Intuíció. Ha egy jelenet két nézete szinte azonos, a második nézet alig ad új információt. A képenkénti elemzés úgy tesz, mintha minden kép független lenne; a jelenetenkénti elemzés a jelenetet tekinti a véletlen mintavétel egységének. A kettő közötti választást nem a kényelem, hanem az adatgeneráló folyamat és a kutatási kérdés határozza meg.
A következő állítás mutatja meg, hogy a képszám növelése nem feltétlenül csökkenti a becslés varianciáját, ha a klaszterszerkezetet figyelmen kívül hagyjuk.
Lemma (klaszterkorrelált átlag varianciája). Legyen klaszter, mindegyikben pontosan megfigyelés. Tegyük fel, hogy az érték (, ) felbontása
ahol konstans, és független véletlen változók, , , . Ekkor a teljes mintaátlag
varianciája
Bizonyítás. A kovarianciák a felbontásból közvetlenül adódnak. Ha és , akkor . Ha , de , akkor a közös miatt a kovariancia . Ha , akkor a függetlenség miatt a kovariancia . A variancia a kettős összeg kovarianciáinak összege, osztva -tel:
Az esetben klaszter van, klaszterenként azonos pár és különböző pár. Így
$$\mathrm{Var}(\bar X) = \frac{1}{(Mr)^2}\Bigl[Mr(\tau^2+\sigma^2) + Mr(r-1)\tau^2\Bigr] = \frac{Mr\sigma^2 + Mr^2\tau^2}{(Mr)^2} = \frac{\sigma^2}{Mr}+\frac{\tau^2}{M}.$$
Ezzel az állítást beláttuk. ∎
Kétcsoportos ellenpélda. Legyen jelenet, jelenetenként kép, tehát kép. Válasszunk és értékeket, amelyek azt fejezik ki, hogy a jelenetek közötti szóródás dominál. A lemma szerint a mintaátlag tényleges varianciája
Ha valaki tévesen független képet feltételez, akkor az iid képlet alapján — amely az 5.3. Mintavételi bizonytalanság és intervallum alfejezetből ismert alak — azt becsülné, hogy
ami csaknem tízszer kisebb. A képszám tehát valóban 20, de az effektív független egységek száma a variancia szempontjából 2-hez közeli: a tag nem csökken növelésével. A levezetés saját; a klaszterkorrelált varianciabontás az [B01] 6. fejezetében tárgyalt variancia- és kovarianciafogalmakra épül, de a konkrét lemma itteni kidolgozás.
Vegyünk két jelenetet, mindegyikből két képet. A mért értékek legyenek az alábbiak.
| Jelenet | Kép 1 | Kép 2 |
|---|---|---|
| A | 10 | 12 |
| B | 20 | 22 |
A teljes mintaátlag . A jelenetenkénti bootstrap a két jelenet közül húz visszatevéssel kettőt, és minden kiválasztott jelenethez mindkét képét hozzáveszi. A lehetséges húzások:
A jelenetalapú replikátumok eloszlása: 11, 16, 16, 21, mindegyik valószínűséggel. Ebből a bootstrap-átlag várható értéke , ami megegyezik a teljes mintaátlaggal, és a szórásnégyzete .
A képenkénti bootstrap ezzel szemben a négy kép közül húz négyet visszatevéssel; a egyformán valószínű rendezett minta teljes felsorolható. Ennek az eloszlásnak a tartóhalmaza bővebb: olyan minták is keletkeznek, mint (10, 10, 10, 10), átlag 10, vagy (22, 22, 22, 22), átlag 22. A tartóhalmaz szélessége azonban nem a szóródás mértéke: ezek az extrém minták egyenként csak valószínűségűek. A szóródást a variancia méri. A visszatevéses empirikus bootstrap átlagának pontos varianciája a populációs (1/N-es) tapasztalati variancia osztva -nel: a négy érték négyzetes eltéréseinek összege a 16-os átlag körül , így
ami a 256 minta felsorolásával pontosan ellenőrizhető. Ettől külön mennyiség a klasszikus plug-in standard hiba, amely az korrigált mintavarianciát használja: . Az összevetés tehát a varianciákon: a képenkénti bootstrap varianciája , a jelenetenkéntié , vagyis a képenkénti bootstrap szűkebb bizonytalanságot mutat, mert a két nézetet független megfigyelésnek kezeli, és figyelmen kívül hagyja, hogy a jelenetek közötti eltérés (A: 11, B: 21) adja a szóródás nagyobb részét. A jelenetalapú megközelítés a klaszterek közti szórást tükrözi; ez a kis példa azt mutatja, hogy a két bootstrap más bizonytalanságot mér, és a jelenetalapú a helyes, ha a jelenet a független mintavételi egység.
A labor a GlyphLab tanítóhalmazán hasonlítja össze a két
bootstrapstratégiát. A becslő az átlagos pixelintenzitás a
tanítóképeken; ez egyszerű, és jól mutatja a klaszterhatást, mert
ugyanazon jelenet két nézete erősen korrelált. A feladat nem a
modellpontosság becslése, hanem a bootstrap egységének szerepe. A kódot
CPU-n, NumPy-val futtatjuk; a képek float32 típusúak, a
replikátumok float64-ben gyűlnek.
# n020_lab.py — futtatás: python n020_lab.py
# Munkakönyvtár: a projekt gyökere, ahol a lab/data/ elérhető.
import numpy as np
import pandas as pd
from pathlib import Path
data_dir = Path("lab/data")
rng = np.random.default_rng(20261020) # seed a replikátumokhoz
images = np.load(data_dir / "images.npy") # (360,1,24,24), float32
labels = np.load(data_dir / "labels.npy") # (360,), int64
meta = pd.read_csv(data_dir / "metadata.csv") # index, scene_id, view_id, ...
train = meta[meta["split"] == "train"].reset_index(drop=True)
# train: 240 kép, 120 jelenet, osztályonként 40 jelenet
train_idx = train["index"].to_numpy() # (240,)
train_images = images[train_idx] # (240,1,24,24)
def estimator(imgs: np.ndarray) -> float:
"""Átlagos intenzitás; float64-re konvertálva a stabil összegzéshez."""
return float(np.asarray(imgs, dtype=np.float64).mean())
B = 2000
# 1) Képenkénti bootstrap: 240 képből 240 húzás visszatevéssel.
boot_img = np.empty(B, dtype=np.float64)
for b in range(B):
idx = rng.integers(0, len(train_images), size=len(train_images))
boot_img[b] = estimator(train_images[idx])
# 2) Jelenetenkénti, osztályonként rétegzett bootstrap.
# A GlyphLab generálása osztályonként rögzített jelenetszámot használ;
# a bootstrap ezt a rétegzést megőrzi: osztályonként 40 jelenetet húz.
scenes_by_label = {lab: np.unique(train.loc[train["label"] == lab, "scene_id"])
for lab in np.unique(train["label"])}
scene_to_idx = train.groupby("scene_id")["index"].apply(np.array).to_dict()
boot_scene = np.empty(B, dtype=np.float64)
for b in range(B):
chosen = []
for lab, scene_ids in scenes_by_label.items():
drawn = rng.choice(scene_ids, size=len(scene_ids), replace=True)
for sid in drawn:
chosen.extend(scene_to_idx[sid])
sel = np.array(chosen, dtype=np.int64)
assert len(sel) == len(train_images), "a rétegzett bootstrap mérete sérült"
boot_scene[b] = estimator(train_images[sel])
ci_img = np.quantile(boot_img, [0.025, 0.975])
ci_scene = np.quantile(boot_scene, [0.025, 0.975])
print(f"train képek száma: {len(train_images)}, jelenetek száma: {train['scene_id'].nunique()}")
print(f"képenkénti bootstrap: átlag={boot_img.mean():.6f}, sd={boot_img.std(ddof=1):.6f}, "
f"95% percentilis CI=({ci_img[0]:.6f}, {ci_img[1]:.6f})")
print(f"jelenetenkénti bootstrap: átlag={boot_scene.mean():.6f}, sd={boot_scene.std(ddof=1):.6f}, "
f"95% percentilis CI=({ci_scene[0]:.6f}, {ci_scene[1]:.6f})")
print(f"szórások aránya (jelenet/kép): {boot_scene.std(ddof=1)/boot_img.std(ddof=1):.3f}")Ellenőrzés és értelmezés. A kód két beépített kontrollt végez: a rétegzett minta mérete minden replikátumban pontosan 240, és a replikátumok átlaga összehasonlítható a teljes tanítóhalmaz átlagával — a bootstrap várható értéke közelíti a mintabeli becslést, de ez önmagában nem garancia. A közölt kimenet számított szemléltetés, nem mért eredmény. A várt mintázat: a jelenetenkénti szórás nagyobb, mint a képenkénti, mert a jeleneten belüli korreláció csökkenti az effektív mintaméretet. A szórások aránya adatspecifikus; a GlyphLab két nézete közös geometriájú, de külön zajú, ezért az arány várhatóan 1-nél nagyobb, de nem extrém. A percentilis CI az [S02]-ben tárgyalt ismételt mintavételi értelmezésű intervallum analogonja, azzal a különbséggel, hogy a bootstrap esetén a lefedettség csak közelítő, és a klaszterek számának növelésével javul.
F1 (fogalmi, nehézség 1). Fogalmazza meg saját szavaival, mi a különbség a megfigyelési egység és a statisztikai mintavételi egység között. Adjon egy olyan konkrét ellenpéldát, amelyben a képszám nagy, de a független egységek száma kicsi.
F2 (levezetési, nehézség 2). A lemmában klaszter, klaszterenként megfigyelés, , szerepel. Számítsa ki a mintaátlag tényleges varianciáját, a naiv iid képletből adódó értéket, és magyarázza el a különbséget. Minden lépést írjon le a kovarianciaösszegzésig.
F3 (implementációs, nehézség 2). Írjon
Python-függvényt cluster_bootstrap(data, clusters, B, rng)
néven, ahol data egy (N,) alakú tömb,
clusters egy (N,) alakú, klaszterazonosítókat
tartalmazó tömb, B a replikátumok száma, és
rng egy numpy.random.Generator. A függvény
minden replikátumban klasztereket húz visszatevéssel, az összes hozzájuk
tartozó elemet megtartja, és a becslő (átlag) replikátumait adja vissza
(B,) alakú float64 tömbben. Ellenőrizze egy
háromklaszteres, ismert átlagú adaton, hogy a replikátumok átlaga a
teljes mintaátlag közelében van (tolerancia
).
F4 (hibakeresési, nehézség 2). Tekintse a következő kódrészletet, amely a GlyphLab train képeire bootstrapel:
idx_all = np.arange(len(train_images))
for b in range(B):
sample = rng.permutation(idx_all)[:len(idx_all)] # visszatevés nélkül!
boot[b] = estimator(train_images[sample])Azonosítsa a két hibát: miért nem jelenetalapú ez a mintavétel, és miért hibás a visszatevés nélküli permutáció? Mi a következményük a konfidenciaintervallumra, és hogyan javítaná a kódot?
F5 (kísérleti transzfer, nehézség 3). Tervezzen kísérletet a GlyphLab clean és corrupted tesztkészletének páros összehasonlítására. Adja meg: a kutatási kérdést, a nullhipotézist, a metrikát, a párosítás egységét, a bootstrap protokollt (jelenetalapú, rétegzett), a szükséges modellválasztási korlátot (a corrupted teszt nem használható modellválasztásra), és egy lehetséges következtetési korlátot. Nem kell futtatnia, de a tervnek végrehajthatónak kell lennie az 1.3. Adatfelosztás és a megfigyelési egység alfejezetben rögzített split és a GlyphLab séma szerint.
F1 megoldás. A megfigyelési egység a mérés legkisebb rekordja: itt egy kép. A statisztikai mintavételi egység az a szint, amelyen a függetlenség feltételezhető, és amelyet a bootstrapben visszatevéssel húzunk: itt a jelenet. A kettő akkor tér el, ha több megfigyelés származik ugyanabból a klaszterből. Ellenpélda: 1000 képet készítünk egyetlen jelenetből kismértékű zajvariációval. A képszám 1000 nagy, de a független egységek száma 1; az átlagos intenzitás konfidenciaintervalluma nem szűkül a képszám növelésével arányosan, mert a jelenethatás közös minden képen. Megfigyelési egység és mintavételi egység tehát nem felcserélhető fogalom.
F2 megoldás. A lemma képlete szerint , , így
A naiv iid képlet az összes megfigyelést függetlennek tekinti, és a per-megfigyelés varianciát -nek veszi:
A valódi variancia tehát -szerese a naiv értéknek. A levezetés a lemma bizonyításának mintájára: az esetben azonos pár és különböző, azonos klaszterbe tartozó pár van; a keresztklaszteres párok kovarianciája nulla. Az összeg ; osztva -gyel: . Ez az ellenőrzés megerősíti a képletet.
F3 megoldás. A függvény:
import numpy as np
def cluster_bootstrap(data, clusters, B, rng):
data = np.asarray(data, dtype=np.float64)
clusters = np.asarray(clusters)
unique_clusters = np.unique(clusters)
result = np.empty(B, dtype=np.float64)
for b in range(B):
drawn = rng.choice(unique_clusters, size=len(unique_clusters), replace=True)
mask = np.isin(clusters, drawn)
result[b] = data[mask].mean()
return resultEllenőrzés: legyen három klaszter, mindegyik két elemmel, értékek
rendre 1,1, 2,2, 3,3. A teljes átlag 2.
rng = np.random.default_rng(0) mellett
replikátum átlaga
közelében kell legyen; a klaszterek húzása visszatevéses, ezért a
replikátumok mindig hat eleműek, és az átlaguk a három klaszterátlag (1,
2, 3) újramintavételezett átlaga. Az elvárt átlag pontosan 2, a
numerikus tolerancia
indokolt a véges
mintavételi hibája miatt. Szélsőeset: ha minden klaszter mérete 1, a
klaszterbootstrap a szokásos iid bootstrapre redukálódik, mert
np.isin minden húzott elemhez egy értéket rendel; az
ellenőrző teszt ezt is lefedi.
F4 megoldás. Az első hiba: a kód a képek indexeit
keveri, nem a jeleneteket, ezért az azonos scene_id-hez
tartozó két nézet szétválasztható, és a replikátumban a
klaszterstruktúra megszűnik. A második hiba: a
rng.permutation visszatevés nélküli permutáció, így minden
replikátum pontosan az eredeti képek egy átrendezése; a bootstrap becslő
ingadozása eltűnik, mert az átlag permutációinvariáns — a replikátumok
mind azonosak lesznek, a CI nulla szélességű. A következmény: a
képenkénti és visszatevés nélküli mintavétel együtt drasztikusan
alulbecsli a bizonytalanságot. Javítás: a replikátumon belül először a
jelenetazonosítókból húzunk visszatevéssel, majd a kiválasztott
jelenetek összes képét válogatjuk be; a jelenetek húzása
rng.choice(scene_ids, size=len(scene_ids), replace=True)
legyen. A javított változatot ellenőrizzük: egy replikátumban sem
szerepelhet egy jelenetnek csak az egyik nézete, és a replikátumok
szórása nullától különböző.
F5 megoldás. Kérdés: mennyivel romlik a modell pontossága a korrupt tesztváltozaton a tiszta teszthez képest? Nullhipotézis: a modell várható pontossága a két feltételen azonos; a különbség 0. Metrika: páronkénti pontosságkülönbség, azaz képenként ; a becslő a 60 páron vett átlag. A párosítás egysége a kép, de a bootstrap egysége a jelenet: a 30 tesztjelenetből húzunk visszatevéssel 30-at, osztályonként rétegzetten (osztályonként 10 jelenet), és minden kiválasztott jelenet mindkét view-ját, clean és corrupt változatát együtt tartjuk. A modellt csak a train/val adaton szabad kiválasztani; a corrupted teszt kizárólag a végső, befagyasztott modell kiértékelésére szolgál. A 95%-os percentilis CI a jelenetalapú replikátumokból számítható. Következtetési korlát: a GlyphLab szintetikus és kicsi, ezért a robusztussági következtetés nem vihető át valós képi adatra; továbbá a bootstrap a modellválasztási bizonytalanságot nem tartalmazza, mert ugyanazt a betanított modellt értékeljük újra.
Tévedés: „Ha több tanítási seeddel futtatom ugyanazt a modellt ugyanazon az adaton, akkor a kapott pontosságok szórása a valódi adatfelvétel bizonytalanságát méri.” Ez hibás. A seed az inicializálást, a minibatch-sorrendet és az esetleges dropout-maszkokat változtatja meg; az adateloszlás és a minta rögzített marad. A több seedből származó szórás a tanítási algoritmus sztochasztikusságát méri. Az adatminta bizonytalanságát csak új, független minta vagy a jelenetalapú bootstrap közelítheti, és ez utóbbi is feltételezi, hogy a jelenetek reprezentatív mintái a sokaságnak. A két komponens össze is adódhat: a teljes variancia közelítő dekompozíciója , de ez csak közelítés, és a kereszthatást külön vizsgálni kell. Konkrét ellenpélda: 5 különböző seed futtatása 240 képen mind 0.91 és 0.93 közötti val pontosságot adhat, miközben a jelenetalapú bootstrap CI 0.85–0.97; a seed-szórás önmagában a széles adatbizonytalanságot nem mutatja meg.
Ellenőrző kérdések: (1) Mi a bootstrap mintavételi egysége a GlyphLab esetén, és miért? (2) Mi a különbség a páros és a független csoportos összehasonlítás között a varianciakomponensek szempontjából? (3) Melyik 5.3. Mintavételi bizonytalanság és intervallum alfejezetbeli fogalom adja a konfidenciaintervallum ismételt mintavételi értelmezését? (4) Miért nem elegendő egy seed a tanítási sztochasztikusság jellemzésére, és miért nem azonos ez az adatminta újrahúzásával?
Válaszok röviden: (1) a jelenet, mert a két nézet közös geometriájú, korrelált; (2) a páros elemzés a klaszterek közötti szórást kiejtheti a különbségből, ezért gyakran kisebb standard hibát ad; (3) a lefedettség fogalma; (4) a seed csak az algoritmus véletlenjét változtatja, az adatot nem, ezért a kettő két külön varianciaforrás. A visszahívás a 4.4. I. ellenőrző pont: matematika és kód megfelelése alfejezetből: a gradiensellenőrzés determinisztikus numerikus protokollt követ; itt a statisztikai szórás más természetű, és nem keverhető a lebegőpontos hibával. Az 1.4. Tanulási diagnózis és kísérleti napló alfejezetből: a seed a generátor állapota, a futásazonosító a napló kulcsa; a többseed-kísérletben mindkettőt rögzíteni kell.
A megfigyelési egység és a statisztikai mintavételi egység akkor tér el, ha képek klaszterekbe, például jelenetekbe rendeződnek. A klaszteren belüli korreláció miatt a mintaátlag varianciája , ahol a jelenetek, a képek száma; a képszám növelése a tagot nem csökkenti. A jelenetalapú bootstrap a teljes klasztereket húzza visszatevéssel, és szélesebb konfidenciaintervallumot adhat, mint a képenkénti. A páros összehasonlítás a klaszteren belüli különbséget elemzi. A tanítási seed ismétlése az algoritmus, nem az adatminta bizonytalanságát méri; a kettőt külön kísérleti tervben kell kezelni.
A 6.1. Objektív, reguláris tag és gradienslépés alfejezetben az empirikus kockázat és a gradienslépés következik. A jelenetalapú bootstrap és a páros gondolat a későbbi modellértékelésben, a 23.3. Páros összehasonlítás és csoportszintű intervallum alfejezetben tér vissza csoportszintű intervallumokkal.