Ez az V. ellenőrző pont. A hallgató a 20.1.–20.3. egységekben megismerte a feature extractor és az új fej, a finomhangolás, valamint a preprocessing- és licencszerződés fogalmát. A 19.4. ConvNeXt és a recept/architektúra elválasztása a recept és az architektúra szétválasztását adta, a 16.4. IV. ellenőrző pont: a CNN-operátor teljes megértése a CNN-operátor teljes specifikációját, a 8.4. II. ellenőrző pont: korrekt tanulási állítás pedig a korrekt tanulási állítás keretét. Itt nem új réteget vezetünk be: a feladat az, hogy a három döntési dimenzió — architektúracsalád (classic/residual/efficient), tanítási mód (scratch/transfer) és erőforráskeret — együtt egyetlen, lektorálható architektúra-döntési lapba álljon össze.
É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: a riport helyett architektúra-döntési lapot adunk le; a súlypont a D5.
Induló kérdés: a GlyphLab adat 360 képet tartalmaz, -es, egycsatornás, három osztállyal. Válasszon a feladatra architektúrát és tanítási módot. Melyik döntés igényel több paramétert: egy VGG-szerű classic háló vagy egy kis saját CNN? Milyen adat- és erőforrásfeltétel zárja ki az előtanított ResNet18-at az alapforgatókönyvből? A becslést a szakasz végén a döntési lappal ellenőrizzük.
A választási feladatot három szemponthalmaz feszíti ki.
Architektúracsalád. A classic jelző itt a
VGG-stílusú, egymásra rakott konvolúciós blokkokat jelöli:
Conv → ReLU → Pooling ismétlése, skip nélkül. A
residual család a [P06]-ban bevezetett
identitás-utat alkalmazza; ennek egyszerű, kétszer
-as
basic blokkját a 18.1. Reziduális blokk és
identitásút már tárgyalta. Az efficient család depthwise
separable és inverted residual blokkokat használ; a paraméterszám
csökkentésének levezetése a 19.1. Depthwise
separable és pointwise réteg alfejezetben szerepelt. A családok nem
rangsorolhatók abszolút értelemben: a 19.4. ConvNeXt
és a recept/architektúra elválasztása alfejezetben látott
matched-recept elv éppen azt mondja ki, hogy a kísérleti összevetés csak
akkor értelmes, ha a tanítási receptet azonos szinten tartjuk.
Tanítási mód. A scratch mód véletlen inicializálással indítja az összes súlyt. A feature extractor mód egy előtanított modell konvolúciós részét fagyasztja, és csak az új fejet tanítja. A finomhangolás ezen felül a konvolúciós súlyok egy részét vagy egészét is kis tanulási rátával frissíti. A három mód a 20.1.–20.2. alfejezetben bevezetett fogalom.
Erőforráskeret és protokoll. A döntéshez rögzíteni kell: a paraméterszámot (), a konvolúciós szorzás-összeadás párok számát (MAC), az aktivációmemória nagyságrendjét, a rendelkezésre álló hardvert, az adat splitjét és a modellválasztási szabályt. A protokoll alapszabálya a 8.4. II. ellenőrző pont: korrekt tanulási állítás alfejezetből: a validációs loss választ best checkpointot, a testet pedig csak a választás után, egyszer értékeljük.
A képbatch alakja
,
a logité
,
a címke
a GlyphLab három osztályára. A konvolúciós súly alakja
,
hacsak a groups paraméter mást nem mond.
A levezetési kötelezettséghez egy olyan blokkot választunk, amelynek a paraméterszáma és műveletigénye zárt formában ellenőrizhető. A [P06] 3.1–3.2 szakaszának olvasott állapota alapján a basic residual blokk rövidítése . A jelen alfejezetben a függvényt két, bias nélküli -s konvolúció és egy közbeékelt ReLU alkotja; a normalizáló réteget a döntési lap kedvéért elhagyjuk, hogy a képlet csak a domináns konvolúciós költséget tartalmazza.
Definíció (egyszerűsített basic block). Legyen . A blokk
ahol , a két konvolúció stride-ja , paddingje , dilationje , groups paramétere , és páratlan. A a ReLU. Mivel és , a 14.1. Stride, padding, dilation és outputméret alfejezetből ismert kimeneti méretképlet szerint a térbeli méret marad, tehát az identitás-összeadás -szel alakhelyes.
Állítás (paraméterszám és konvolúciós MAC, saját levezetés). A fenti blokkra
Itt
a modellsúlyok száma,
pedig a konvolúciós szorzás-összeadás párok (multiply-accumulate)
domináns száma egy bemeneti batchre. Az állítás feltétele:
stride=1, padding=(k-1)/2,
bias=False, groups=1, dilation=1,
és a bemeneti csatornaszám
azonos a kimenetivel. Az identitás-összeadás
elemi összeadást, a ReLU
elemi maximumképzést ad; ezeket külön számoljuk, és a nagy
tartományban alacsonyabb rendűek.
Bizonyítás. Az első súlytensor elemeinek száma ; a másodiké ugyanannyi. Bias nincs, ezért . Egy konvolúcióban minden kimeneti elemhez szorzás és ugyanennyi, az akkumulátorba adódó összeadás tartozik; az első szorzat akkumulációjának hiánya rendű, ezért a MAC-becslés a domináns tag. A kimeneti elemek száma konvolúciónként , tehát egy konvolúció szorzás-összeadás párt végez. Két konvolúcióra ez .
Legyen , , , . Ekkor
Az első konvolúció kimenete , tehát elemet tartalmaz; minden elemhez MAC tartozik, ami műveletpár. A második konvolúció ugyanennyit ad, így az összeg . A skip-összeadás további elemi összeadást jelent, amit a domináns MAC-képlet expliciten nem tartalmaz.
A képlet és a PyTorch-implementáció egyezését az alábbi kontroll ellenőrzi. A kód nem futtatott; a paraméterszám a fenti, számított érték.
# lab/n080_residual_check.py
import torch
torch.manual_seed(20261020)
class BasicResidualBlock(torch.nn.Module):
def __init__(self, C, k):
super().__init__()
assert k % 2 == 1
self.conv1 = torch.nn.Conv2d(C, C, k, stride=1,
padding=(k - 1) // 2, bias=False)
self.conv2 = torch.nn.Conv2d(C, C, k, stride=1,
padding=(k - 1) // 2, bias=False)
def forward(self, x):
return self.conv2(torch.relu(self.conv1(x))) + x
model = BasicResidualBlock(C=2, k=3)
n_params = sum(p.numel() for p in model.parameters())
assert n_params == 72, n_params
x = torch.randn(1, 2, 4, 4)
with torch.no_grad():
y = model(x)
print("params:", n_params, "output shape:", tuple(y.shape))
assert y.shape == (1, 2, 4, 4)Futtatás: python lab/n080_residual_check.py. A
shape-ellenőrzés a paddingfeltételből következik: a kimenet
,
mert a két konvolúció stride-ja
és paddingje
.
A labor átadandó eredménye egy kitöltött döntési lap, három elvetett
alternatíva indokával, valamint a kiválasztott modell kis futó
kontrollja. A döntési lap a GlyphLab adatszerződésre épül: train 240,
val 60, test 60 kép, független mintavételi egység a
scene_id, bemenet float32 NCHW
,
cél int64 osztályindex.
Döntési lap.
20261020.TinyGlyphCNN néven: két classic blokk
(8,8) és (16,16) csatornával,
-as,
padding
-es
bias nélküli konvolúciókkal, ReLU-val,
-es
maxpoolinggal, majd global average poolinggal és egy
Linear(16, 3) fejjel.A kiválasztott modell paraméterszáma pontosan:
A három elvetett alternatíva:
A választott modell futó kontrollja:
# lab/n080_decision_check.py
import torch
torch.manual_seed(20261020)
class TinyGlyphCNN(torch.nn.Module):
def __init__(self):
super().__init__()
self.features = torch.nn.Sequential(
torch.nn.Conv2d(1, 8, 3, padding=1, bias=False),
torch.nn.ReLU(),
torch.nn.Conv2d(8, 8, 3, padding=1, bias=False),
torch.nn.ReLU(),
torch.nn.MaxPool2d(2),
torch.nn.Conv2d(8, 16, 3, padding=1, bias=False),
torch.nn.ReLU(),
torch.nn.Conv2d(16, 16, 3, padding=1, bias=False),
torch.nn.ReLU(),
torch.nn.MaxPool2d(2),
)
self.gap = torch.nn.AdaptiveAvgPool2d((1, 1))
self.head = torch.nn.Linear(16, 3, bias=True)
def forward(self, x):
z = self.features(x)
z = self.gap(z).flatten(1)
return self.head(z)
model = TinyGlyphCNN()
n_params = sum(p.numel() for p in model.parameters())
assert n_params == 4155, n_params
x = torch.rand(2, 1, 24, 24, dtype=torch.float32)
with torch.no_grad():
logits = model(x)
print("params:", n_params)
print("logits shape:", tuple(logits.shape))
assert logits.shape == (2, 3)Futtatás: python lab/n080_decision_check.py. Az
ellenőrzés kimenete a paraméterszámot és a
-as
logitalakot adja; az érték a képletből számított, nem mért futás.
A döntési lapot egy kis empirikus összehasonlítással lehet validálni. A jelen kézirat nem tartalmaz új mért eredményt; az alábbi protokoll a hallgatói futtatás előírása, és a kezdőlabor ellenőrzött jelentésétől független, új futásnak számít.
TinyGlyphCNN val loss-ában jobb-e, mint egy
nagyobb kapacitású változat?scene_id; a két
nézet ugyanabba a splitbe tartozik.TinyGlyphCNN, scratch, Adam,
lr=1e-3, batch 16, seed 20261020.F1 (fogalmi, nehézség 1). Definiálja a scratch, feature extractor és finomhangolás tanítási módot. Adjon egy-egy feltételt, amely mellett a GlyphLab-on a scratch, illetve a feature extractor értelmes választás. Elvárt átadandó eredmény: a három definíció, a frissített súlyok köre, és két indoklás.
F2 (levezetési/bizonyítási, nehézség 2). Adott egy
depthwise separable blokk: bemenet
,
depthwise konvolúció
-val,
groups=C, bias=False, stride=1,
padding=(k-1)/2, majd pointwise
-es
konvolúció
kimeneti csatornával, bias=False. Vezesse le a
paraméterszámot és az
konvolúciós MAC-ot. Hasonlítsa össze a 3. szakasz basic blokkjával
,
mellett. Elvárt: képletek, arány, feltételek.
F3 (implementációs, nehézség 2). Írjon
count_tiny(c1, c2) függvényt, amely a döntési lap
modelljének paraméterszámát adja vissza a két blokk csatornaszámából, és
egészítse ki a lab/n080_decision_check.py kontrollt egy
független képletalapú assert-tel. Elvárt: futtatható kód, a
4155 eset helyes visszaadása.
F4 (hibakeresési, nehézség 2). Egy döntési napló a legnagyobb modellt választotta, mert annak test accuracyja -gyel magasabb volt a baseline-nál. Mi a hiba, mi a következménye, és hogyan kell javítani? Elvárt: az ok megnevezése, a választási torzítás magyarázata és a javított munkafolyamat.
F5 (kísérleti/transzfer, nehézség 3). Tervezzen
összehasonlítást a GlyphLab-on a scratch TinyGlyphCNN és
egy külső előtanított ResNet18 feature extractor között. A terv
tartalmazza a preprocessing-szerződést, a licencellenőrzést, a
megfigyelési egységet, a baseline-t, a metrikát és az érvényességi
korlátokat. A külső súly itt opcionális; a [D13] állapota miatt a
konkrét súlyváltozatot további ellenőrzéshez kösse.
F1 megoldás. A scratch mód minden súlyt véletlen inicializálásból indít, és a teljes modellt tanítja. A feature extractor az előtanított modell konvolúciós részét fagyasztja; csak az új fej súlyai frissülnek. A finomhangolás a konvolúciós rész egy részét vagy egészét is frissíti, jellemzően kisebb tanulási rátával. A GlyphLab-on a scratch értelmes, mert a feladat kicsi, a bemenet -es grayscale, és nincs szükség külső domain reprezentációjára. A feature extractor akkor lenne értelmes, ha a külső modell bemeneti szerződése és licencfeltétele ellenőrzött, és a forrás-domain reprezentációja a célfeladatra is hasznos; a jelen adaton ez nem teljesül automatikusan.
F2 megoldás. A depthwise konvolúció súlyalakja
,
groups=C, tehát
.
A pointwise súlyalakja
,
tehát
.
Így
A depthwise konvolúció minden kimeneti elemhez MAC-ot használ, a kimeneti elemek száma , tehát . A pointwise konvolúció minden kimeneti elemhez MAC-ot használ, tehát . Összesen
A basic blokk és . , esetén , , az arány , tehát a paraméterszám kb. -kal kisebb. A MAC-arány ugyanez, mert a térbeli és batchtényező kiesik.
F3 megoldás.
def count_tiny(c1, c2):
p1 = 1 * c1 * 9 + c1 * c1 * 9
p2 = c1 * c2 * 9 + c2 * c2 * 9
head = c2 * 3 + 3
return p1 + p2 + head
assert count_tiny(8, 16) == 4155A függvény a két blokk konvolúciós súlyait és a lineáris fej súlyát,
illetve biasát adja össze. A c1=8, c2=16 eset a döntési lap
értékét adja vissza.
F4 megoldás. A hiba: a test halmazt használták modellválasztásra. Következmény: a test már nem független; a kiválasztási iteráció a testre illeszti a választást, ezért a mért test accuracy felfelé torzít, és a valós általánosítási hibát nem becsli. Javítás: a választást a val loss vagy val accuracy alapján kell elvégezni; a testet csak a rögzített, végleges modellre szabad egyszer futtatni. Ellenőrzés: a naplóban a választási oszlop val-metrikát tartalmazzon, és a test oszlop a választás előtt üres legyen.
F5 megoldásminta. Kérdés: javítja-e a külső ResNet18
feature extractor a test accuracyt a scratch baseline-hoz képest?
Hipotézis: nem, a nagy domain shift és a kis train halmaz miatt. Adat:
GlyphLab, scene-szintű split; megfigyelési egység scene_id.
Baseline: TinyGlyphCNN scratch. Változó: ResNet18
előtanított konvolúciós része fagyasztva, új Linear fejjel.
Preprocessing: a külső modell bemeneti szerződését ténylegesen
ellenőrizni kell; a GlyphLab
grayscale képét méretezni, csatornázni és normalizálni kell a forrás
szerződése szerint, ami domain shiftet visz be. Licenc: a TorchVision
súly letöltési és felhasználási feltételeit külön dokumentálni kell
[D13]. Metrika: val loss a választásra, test accuracy a végén.
Erőforrás: CPU, float32. Érvényességi korlát: az eredmény nem
általánosítható természetes képekre; a külső súly verziója és a
preprocessing pontos paramétere rögzítendő; a [D13] modellkatalógus
állapota miatt a konkrét súlyváltozat ellenőrzése a kísérlet
előfeltétele.
Tipikus tévedés. „A legnagyobb elérhető modell nem automatikusan a legjobb feladatmegoldás.” Ennek ellenpéldája egy D-s regressziós szerkesztett eset: legyen a train három pontja , a generáló összefüggés . A lineáris modell paraméterekkel tökéletesen illeszkedik a train pontokra. A nagy kapacitású, kilencedfokú polinom szintén átmegy mindhárom train ponton, mert a szorzótényező ott nulla; azonban a tesztpontban, például -nél a predikció -höz képest -tel eltolódik, azaz durván téved. A nagyobb modell tehát azonos train illeszkedés mellett rosszabb tesztpredikciót adhat. A CNN-választásnál ugyanezt a jelenséget a finite-H korlát 8.4. II. ellenőrző pont: korrekt tanulási állítás fogalmazza meg: a nagyobb hipotézisosztály szélesebb általánosítási sávot nyit.
Önellenőrzés. A döntési lap akkor teljes, ha (1) a
bemeneti szerződés és a normalizálás rögzített; (2) a split
scene-szintű, és a testet nem érinti a választás; (3) a paraméterszám és
a MAC képlete a megadott bias, groups,
stride, padding feltételekkel egyezik; (4)
külső súly esetén a verzió, preprocessing és licenc forrása azonosított;
(5) a végső következtetés csak a rögzített protokollra vonatkozik.
Visszahívás. A 16.4. IV. ellenőrző pont: a CNN-operátor teljes megértése alfejezetből: a cross-correlation alak- és gradientszabálya a döntési lap minden konvolúciós sorában érvényes; az eltolási equivariance a stride és a határfeltétel függvénye. A 19.4. ConvNeXt és a recept/architektúra elválasztása alfejezetből: az architektúra címkéje nem örök rangsor, hanem adott receptfeltételhez kötött állítás.
Az architektúra-döntési lap a családot (classic/residual/efficient),
a tanítási módot (scratch/transfer) és az erőforráskeretet együtt
rögzíti. Az analitikusan ellenőrzött basic residual blokk paraméterszáma
,
konvolúciós MAC-ja
;
a depthwise separable blokk ennél
mellett kb.
-kal
kevesebb paramétert használ. A GlyphLab-on a
paraméteres scratch TinyGlyphCNN a döntési lap választása;
a nagy classic, az előtanított ResNet18 és a nagy efficient blokk
elvetésének oka rendre a túl nagy kapacitás, a domain shift és a
licencellenőrzés, illetve a kis bemeneten elmaradó előny. A legnagyobb
modell nem automatikusan a legjobb.
A következő egység 21.1. Inicializálás és varianciaterjedés az inicializálást és a varianciaterjedést tárgyalja; ott a döntési lapon kiválasztott kis CNN súlyainak induló eloszlása közvetlenül befolyásolja a tanítás stabilitását.