Ez a IX. ellenőrző pont: a 36.3. Szakirodalmi reprodukció és attribúció alfejezetben felépített forráskövetést és a 36.2. Ismétlések és eredménybizonytalanság alfejezetben rögzített eredménybizonytalanság-kezelést egyetlen, lektorálható modellállítás-csomaggá zárjuk. A cél nem új réteg vagy veszteség bevezetése, hanem annak bemutatása, hogy egy reprodukálható kísérlet és egy matematikai levezetés akkor válik bírálhatóvá, ha hat komponense együtt, ellenőrizhető formában áll rendelkezésre. Előismeret: a 36.3. Szakirodalmi reprodukció és attribúció attribúciós szabályai, a 35.4. Korlátok, eredet és döntési felelősség korlát- és felelősségi kerete, a 32.4. VIII. ellenőrző pont: célhoz illő neurális modell modellválasztási döntési lapja és a 24.4. VI. ellenőrző pont: megbízható CNN-training megbízható training-csomagja.
Értékelés. A közös 0–4 rubrikát, a PASS-szabályt és a hibatípusonkénti visszautakat az 1.4. Tanulási diagnózis és kísérleti napló „Tanulási főút és ellenőrző pontok” szakasza adja meg; itt csak az eltérés: ez az egység maga vezeti be a közös riportszabály hat komponensét; a súlypont a D4 és a D5.
Induló kérdés: elegendő-e egy Jupyter notebook tiszta kimenete ahhoz, hogy egy neurális modellről szóló állítást lektorálhatónak nevezzünk? Becslés: nem. A tiszta kimenet a code komponens egy szelete; hiányzik a matematikai állítás feltételrendszere, a forrásnyom, a futási környezet, a páros eredmény és a következtetési korlát.
A továbbiakban a következő hat komponenst követeljük meg, és mindegyikhez megadjuk a lektor kérdését:
| Komponens | Mit tartalmaz | A lektor kérdése |
|---|---|---|
| proof | Állítás, feltételek, bizonyítás vagy jelölt átvétel, ellenpélda | A feltételek elégségesek és kimondottak-e? |
| source trace | Olvasott forrás, változat, szakasz, átvétel és saját rész | A státusz őrzi-e az ellenőrzés mélységét? |
| code | Teljes futtatható kód, input, seed, dtype, device, parancs | Végrehajtható-e az itt leírt környezetben? |
| run manifest | Környezet, verziók, adatsha, parancs, nyers metrika | Újrafuttatható-e, és látszik-e a nyers adat? |
| paired result | Ugyanazon megfigyelési egységre vonatkozó páros összevetés | A párosítás a helyes szinten történik-e? |
| limits | Mire nem következtethetünk az eredményből | A következtetés nem lép-e túl az adaton? |
Egy komponens hiánya nem feltétlenül teszi hamissá az állítást, de nem lektorálhatóvá teszi a csomagot: a lektor nem tudja megkülönböztetni a bizonyított, a mért és a feltételezett állítást.
A csomag matematikai magjának egy gyakran pontatlanul kimondott CNN-állítást választunk: az eltolási ekvivarianciát. A feladat nem az állítás puszta elfogadása, hanem a feltételek, a jelölés és az ellenpéldák bírálata.
Először rögzítsük a főút cross-correlation definícióját egyetlen képre, groups=1 mellett. Legyen
szimmetrikus zero padding , stride . A paddingolt bemenetet -sel jelöljük, ahol , ha és , különben . A kimenet
Definiáljuk a diszkrét eltolást: , ahol a definíciós tartományon kívüli indexre az érték . A kérdés: mikor teljesül
A (2) egyenletet nem mondhatjuk ki feltétel nélkül. A pontos állítás a következő.
Állítás (belső shift-ekvivariancia, ). Legyen , . Tegyük fel, hogy minden olyan kimeneti indexre, amelyre a (2) jobb oldala értelmes, a számításakor használt teljes bemeneti ablak az eredeti kép definíciós tartományába esik, vagyis a kernel egyetlen pozícióban sem olvas a zero padding területéről. Ekkor (2) fennáll.
Bizonyítás. A feltevés miatt paddingolt változatára minden szükséges indexre, és a padding nem lép be. Helyettesítsük be (1)-be:
Az összegzési indexeket változatlanul hagyva a kifejezés éppen , feltéve, hogy az utóbbi index a kimeneti tartományban van. Ez a (2) egyenlet.
A bírálat három ponton talál hibát a naiv megfogalmazásban.
(a) A véges kép határán az állítás hamis. Ha a shiftelt bemenet kernel-ablaka a paddinget érinti, ott értéke , míg az eredeti kimenet eltoltja az eredeti képértékeket használná. A zero padding nem a shiftelt jel, hanem egy másik, nullával kiterjesztett jel.
(b) Stride esetén a pontos állítás a stride-részcsoportra vonatkozik. A kimeneti rácsot tizedeli; egy bemeneti eltolás a kimenetben eltolásnak felel meg, ami csak akkor egész, ha , . A nem osztható eltolásokra a páros és páratlan fázisú mintavétel más bemeneti pixeleket lát, ezért (2) nem is értelmezhető ugyanazon a rácson.
(c) A paddingelt shift nem azonos a shiftelt paddinggel. Ha a shift műveletet a padding után végezzük, akkor a padding nullái is eltolódnak; ha a paddingot a shift után adjuk hozzá, akkor más jelet kapunk. A (2) állítás a második konvenciót rögzíti, és ezt a szövegben mindig ki kell mondani.
Ellenpélda a feltétel szükségességére. Legyen , , , , , , és minden -re. Legyen , minden más . Az (1) képletből:
és hasonlóan . Az egyetlen nemnulla bemeneti érték hatására:
Most legyen . A shiftelt bemenet , minden más . A shiftelt bemenetből számított kimenet:
és
Ha (2) teljesülne, akkor értelmezhetetlen lenne, és ; de a kapott eltérést mutat, mert a kernel a határról „behúz” egy új értéket. A belső feltétel tehát nem elhagyható.
A kézi példa két esetet ellenőriz: egy belső shiftet, ahol (2) teljesül, és a fenti határ-shift ellenpéldát, ahol nem. A kód a főút NumPy-referenciáját használja, groups=1, NCHW, float32, CPU. A kimenet a szövegben számított érték, nem mért futás.
# Munkakönyvtár: lab/
# Futtatás: python equivariance_check.py
import numpy as np
def cross_corr_np(x, k, p, s=1):
"""groups=1, NCHW, szimmetrikus zero padding, float32 NumPy referencia."""
x = np.asarray(x, dtype=np.float32)
k = np.asarray(k, dtype=np.float32)
N, C, H, W = x.shape
O, _, kh, kw = k.shape
Hout = (H + 2 * p - kh) // s + 1
Wout = (W + 2 * p - kw) // s + 1
xp = np.pad(x, ((0, 0), (0, 0), (p, p), (p, p)))
y = np.zeros((N, O, Hout, Wout), dtype=np.float32)
for n in range(N):
for o in range(O):
for i in range(Hout):
for j in range(Wout):
si, sj = i * s, j * s
y[n, o, i, j] = np.sum(
xp[n, :, si:si + kh, sj:sj + kw] * k[o]
)
return y
# 1. Belső shift: H=W=5, p=1, 3x3 delta kernel (középső súly 1)
x_inner = np.zeros((1, 1, 5, 5), dtype=np.float32)
x_inner[0, 0, 2, 2] = 1.0
k_delta = np.zeros((1, 1, 3, 3), dtype=np.float32)
k_delta[0, 0, 1, 1] = 1.0
y_inner = cross_corr_np(x_inner, k_delta, p=1) # (1,1,5,5)
x_shift = np.zeros_like(x_inner)
x_shift[0, 0, 3, 2] = 1.0 # Delta=(1,0)
y_shift = cross_corr_np(x_shift, k_delta, p=1)
# A delta kernel középső súlya identitásként viselkedik a belső tartományon:
assert y_inner[0, 0, 2, 2] == 1.0
assert y_shift[0, 0, 3, 2] == 1.0
assert y_shift[0, 0, 2, 2] == 0.0
print("Belső shift-ekvivariancia: OK")
# 2. Határ-shift ellenpélda: H=W=4, p=0, 3x3 sum kernel
x_edge = np.zeros((1, 1, 4, 4), dtype=np.float32)
x_edge[0, 0, 0, 0] = 1.0
k_sum = np.ones((1, 1, 3, 3), dtype=np.float32)
y_edge = cross_corr_np(x_edge, k_sum, p=0) # (1,1,2,2)
x_edge_shift = np.zeros_like(x_edge)
x_edge_shift[0, 0, 1, 0] = 1.0 # Delta=(1,0)
y_edge_shift = cross_corr_np(x_edge_shift, k_sum, p=0)
# A naiv ekvivariancia azt jósolná: y_edge_shift[0,0,0,1] == y_edge[0,0,0,0]==1
# és y_edge_shift[0,0,0,0] == 0. A tényleges érték ehelyett 1.
assert y_edge_shift[0, 0, 0, 0] == 1.0, "a határ-shift megtöri az ekvivarianciát"
print("Határ-shift ellenpélda: a feltétel nélküli állítás cáfolva")A kód mindkét ága determinisztikus, seedre nincs szükség; a környezet
NumPy 1.x, CPU. A PyTorch Conv2d ugyanezt a
cross-correlationt számolja, ezért az ellenpélda a könyvtári rétegre is
érvényes.
A labor a GlyphLab szerződés egy szűkített, CPU-n futtatható osztályozási kísérletét csomagolja be. A jelen kézirat nem futtatta a kísérletet; a mérési tábla ezért jelölt szemléltetés. A hallgatói futáshoz a pontos protokoll:
data/ könyvtár images.npy,
labels.npy, metadata.csv és
corrupted_test.npy fájlja; input float32 NCHW
,
címke int64.metadata.csv split oszlopa szerint; a test 60
képe és a corrupt teszt ugyanazon scene/view sorrendben párosul.lab/model.py
fájlban rögzítendő.A run manifest mintája:
környezet: Python 3.12, NumPy 1.26, PyTorch 2.2 CPU
adat: data/manifest.json SHA-256 egyezés ellenőrizve
parancs: python train_cnn.py --epochs 20 --batch 16 --lr 1e-3 --seed 20261020
kimenet: lab/nyers_metrika.json, lab/best_model.pt
A nyers mérési tábla jelölt szemléltetés, nem mért futás:
| Epoch | Train loss | Val acc | Test clean acc | Test corrupt acc | Páros delta átlag |
|---|---|---|---|---|---|
| 20 | 0,31 | 0,92 | 0,90 | 0,72 |
A paired result értelmezése: a delta negatív előjele azt mutatja, hogy a corrupt bemenetek rontják a helyes predikciót; a párosítás kizárja, hogy a clean és corrupt halmaz összetételének különbsége magyarázza az eltérést. A képenkénti bootstrap itt nem független, mert a megfigyelési egység a scene; a megbízható intervallumhoz scene-szintű, osztály-stratifikált resampling kell (5.4. Függő képek, seedek és resampling, S02).
A forrásnapló a csomag része:
| Kulcs | Ellenőrzött státusz | Átvett tartalom | Saját adaptáció |
|---|---|---|---|
| S01 | kurzusjegyzet releváns oldala olvasva | cross-correlation, stride, padding, receptive field fogalma | a belső shift-ekvivariancia bizonyítása és az ellenpélda eredeti |
| S02 | hivatalos módszertani oldal olvasva | a CI feltételes, ismételt mintavételi értelmezése | a scene-szintű páros delta értelmezése |
| P25 | eredeti arXiv-rekord és absztrakt ellenőrizve | motiváció: automatikus metrika nem helyettesíti a sanity checket | a lektorálási kapu megfogalmazása |
A P25 státusza nem teszi lehetővé, hogy részletes módszerállítást alapozzunk rá; erre a forrásnaplóban külön figyelmeztetünk.
A limits szakasz rögzíti: a GlyphLab eredménye nem természetes képi benchmark és nem termelési validáció; a softmax kimenet nem bizonytalansági garancia; a corrupt teszt csak a definiált zaj- és fényességgradiens-korrupcióra vonatkozik; high-stakes döntéshez emberi felülvizsgálat és a 35.4. Korlátok, eredet és döntési felelősség szerinti modellkártya szükséges.
F1 (fogalmi, nehézség 1). Sorolja fel a bírálható csomag hat komponensét, és indokolja meg, miért nem elegendő a tiszta kódkimenet önmagában. Adjon egy konkrét példát egy olyan hibára, amelyet a kód kimenete nem tár fel.
F2 (levezetési, nehézség 2). Vezesse le a stride esetre a pontos shift-ekvivariancia állítást az -hez hasonló indexhelyettesítéssel. Mondja ki, mely eltolásokra értelmes az állítás, bizonyítsa a belső tartományra, és adjon ellenpéldát -ra , , , mellett.
F3 (implementációs, nehézség 2). A 4. szakasz kódját
egészítse ki egy check_stride2 függvénnyel, amely a stride
2 esetre ellenőrzi:
-ra
a belső tartományon a shiftelt kimenet megegyezik az eredeti kimenet
eltoltjával,
-ra
viszont nem. Adja meg a teljes függvényt, a bemeneteket, a várt assert
üzeneteket és a futtatási parancsot.
F4 (hibakeresési, nehézség 2). Az alábbi két hibát tartalmazó riportrészletben lokalizálja a hibákat, írja le a következményt és a javítást: (a) a forrásnapló a P25 absztraktjára hivatkozva részletes sanity-check protokollt állít; (b) a páros delta konfidenciaintervallumát képenkénti bootstrapből számítják, pedig a scene_id a független egység.
F5 (kísérleti/transzfer, nehézség 3). Egy mérnök a GlyphLab-on elért 0,90 test accuracy alapján azt állítja, hogy a modell alkalmas valós ipari felületi hibák osztályozására. Tervezzen ellenőrzési protokollt a domain shift kezelésére: mi legyen a baseline, a split, az adaptációs szabály, a metrika, és mit kell dokumentálni a 35.4. Korlátok, eredet és döntési felelősség modellkártyájában? Indokolja, miért nem elég a GlyphLab accuracy.
F1 megoldás. A hat komponens: proof, source trace, code, run manifest, paired result, limits. A kód kimenete az implementációt ellenőrzi, de nem mutatja meg (i) a matematikai állítás érvényességi tartományát, (ii) a forrás ellenőrzési mélységét, (iii) a környezet reprodukálhatóságát, (iv) a párosítás egységét, (v) a következtetés korlátait. Példa: egy notebook 0,90 accuracyt mutat, de a test halmazt a tanítás előtt használták modellválasztásra; a kimenet önmagában ezt a szivárgást nem fedi fel.
F2 megoldás. Legyen . Az (1) képletben a kimeneti pozíció az és bemeneti indexeket olvassa. Ha a bemenetet -val toljuk, a kimeneti pozíciók által látott értékek az eredeti bemenet indexeinek felelnek meg. A (2) típusú egyenlőség azt követelné meg, hogy az új kimeneti rács az eredeti kimeneti rács eltolásával essen egybe. Ez pontosan akkor lehetséges, ha valamely egész vektorra, mert a kimeneti rács osztása . A bizonyítás ezután szó szerint megegyezik a 3. szakasz indexhelyettesítésével, az és helyettesítéssel.
Ellenpélda -ra: legyen , tetszőleges, , , . Ekkor . A kimenet az mintavételezés. Legyen , minden más ; ekkor . A shiftelt bemenet , tehát , , azaz . Ha az ekvivariancia a eltolásra is fennállna, akkor a a valamilyen félegész eltoltja lenne, ami a kimeneti rácson nem létezik; a kapott csupa nulla vektor minden lehetséges egész eltolttól különbözik. Ezzel az állítás érvényességi köre pontosan a stride-részcsoport.
F3 megoldás. A függvény a 4. szakasz
cross_corr_np-jét használja:
def check_stride2():
# Belső tartomány, Delta=(2,0): ekvivariancia teljesül
x = np.zeros((1, 1, 6, 6), dtype=np.float32)
x[0, 0, 3, 3] = 1.0
k = np.ones((1, 1, 1, 1), dtype=np.float32)
y = cross_corr_np(x, k, p=0, s=2) # (1,1,3,3)
x2 = np.zeros_like(x)
x2[0, 0, 5, 3] = 1.0 # Delta=(2,0)
y2 = cross_corr_np(x2, k, p=0, s=2)
assert y[0, 0, 1, 1] == 1.0 and y2[0, 0, 2, 1] == 1.0
assert y2[0, 0, 1, 1] == 0.0
# Nem osztható eltolás, Delta=(1,0): nincs tiszta shift
x1 = np.zeros_like(x)
x1[0, 0, 4, 3] = 1.0
y1 = cross_corr_np(x1, k, p=0, s=2)
# y1[0,0,2,1]=1, de y[0,0,1,1]=1 is; a két kimenet nem egymás egész eltoltja
assert y1[0, 0, 2, 1] == 1.0
assert not np.allclose(y1[0, 0], y[0, 0])
print("Stride-2 részcsoport-ekvivariancia: OK")A futtatás: python equivariance_check.py; a várt kimenet
a három OK üzenet. A tolerancia itt szigorú egyenlőség,
mert a műveletek egész értékű float32 összegek.
F4 megoldás. (a) Hiba: a P25 státusza „absztrakt ellenőrizve”, ezért részletes módszerállítás forrásaként nem használható. Következmény: a riport olyan eljárást tulajdonít a cikknek, amelyet a szerző nem ellenőrzött, sérül az attribúciós lánc. Javítás: a P25-öt csak motivációként idézni, a konkrét protokollhoz a teljes releváns szakaszt elolvasni, vagy a saját eljárást önálló adaptációként feltüntetni. (b) Hiba: a CI-t képenkénti bootstrapből számítják, de a GlyphLab független egysége a scene, és egy scene két nézete összefügg. Következmény: a CI szűkebbnek mutatja a bizonytalanságot, mint amit az adat igazol. Javítás: scene-szintű, osztály-stratifikált resampling, a páros delta ugyanazon scene/view páron számítva.
F5 megoldásminta. Lehetséges terv: (1) baseline: a GlyphLab modellt fagyasztott feature extractorként használni, és egy logisztikus regressziós fejet tanítani; (2) split: a valós adatot gyártási tétel vagy idő szerint csoportosítva bontani, hogy a szivárgást elkerüljük; (3) adaptáció: először a fej tanítása alacsony tanulási rátával, majd szükség esetén finomhangolás, minden lépés előre rögzített val-loss választással; (4) metrika: a feladathoz illő pontosság mellett confusion matrix, osztályonkénti recall, és a téves döntés költségének megfelelő küszöb; (5) dokumentáció: adateredet, domain eltérések, súlylicenc, a modell határai, emberi felülvizsgálati pont. A GlyphLab accuracy azért nem elég, mert a procedurális szintetikus alakzatok és a valós felületi hibák eloszlása, textúrája és annotációs hibája különbözik; a transzfer csak új, független valós méréssel igazolható.
A tipikus tévedés: az automatikus ellenőrzést lektorálásnak tekinteni. A gradiensellenőrzés, az assert és a CI-számítás a csomag implementációs és numerikus bizonyítékai, de nem helyettesítik a matematikai feltételvizsgálatot. Ellenpélda: a 4. szakasz kódja a belső shiftre áthaladó assertet ad; ha ebből általánosítjuk az ekvivarianciát, a határ-shift assertje a cáfolatot is lefuttatja. Az automatikus ellenőrzés tehát szükséges, de nem elégséges kapu.
Önellenőrzés: (1) Mind a hat komponens szerepel-e? (2) Az állítás feltételei és az ellenpélda ugyanabban a jelölésben vannak-e? (3) A nyers tábla jelöli-e, hogy szemléltetés vagy mért futás? (4) A forrásnapló őrzi-e a státuszkülönbséget? (5) A páros eredmény a scene szintjén párosul-e?
Visszahívás: a 36.3. Szakirodalmi reprodukció és attribúció attribúciós elve, a 35.4. Korlátok, eredet és döntési felelősség modellkártya és döntési felelősség, a 32.4. VIII. ellenőrző pont: célhoz illő neurális modell célhoz illő modellválasztási lap, valamint a 24.4. VI. ellenőrző pont: megbízható CNN-training megbízható training-csomag. Ez a négy előzmény a jelen csomag hat komponensének közvetlen előzménye.
A IX. ellenőrző pont egyetlen csomagba rendezi a modellállítás hat bizonyítéktípusát: a feltételeivel kimondott matematikai állítást, a forrásnyomot, a futtatható kódot, a futási jegyzőkönyvet, a páros eredményt és a következtetési korlátokat. A belső shift-ekvivariancia példája megmutatja, hogy ugyanaz az állítás feltétel nélkül hamis, pontos feltételekkel bizonyítható, a stride esetén pedig részcsoportra szorul. A labor kimenete nem mért futás, hanem jelölt szemléltetés; a hallgatói riportnak a nyers adatot, a forrásnaplót és a javítási listát együtt kell tartalmaznia. Az automatikus ellenőrzés szükséges, de a szakmai lektorálást nem helyettesíti. A következő egység a teljes konvolúciós projektet nyitja.