A 16.1. Eltolási equivariance és invariance egységben az eltolási ekvivarianciát operátoregyenletekkel vizsgáltuk, és láttuk, hogy a stride-os művelet az ekvivarianciát a stride-részcsoportra szűkíti. Most a pooling rétegre mint lokális aggregációra és mint mintavétel-csökkentésre koncentrálunk. A két szerep gyakran egyetlen rétegben jelenik meg, de fogalmilag különválasztható, és a különválasztás dönti el, hogy milyen eltolási tulajdonságokat várhatunk.
Előismeret: a 16.1. Eltolási equivariance és invariance eltolási operátora, a 15.2. Inputgradiens és átfedő recepciós mezők NCHW-alakkezelése és a 4.2. Parciális derivált és gradiens gradiensfogalma. A poolingnak többnyire nincs tanulható paramétere, ezért a gradiens itt csak az inputra vonatkozik; a jelen egységben azonban elsősorban az előremenő leképezés és a rácsszimmetria a tárgy.
Induló kérdés: legyen a négypixeles vektor . Egy , maxpooling után mi az eredménye -nek és a eltoltjának? Becsülje meg, tud-e a kimeneti rácson olyan eltolást mondani, amely az első kimenetet a másodikba viszi. A pontos definíciókkal ezt az alábbiakban megválaszoljuk.
Legyen a bemenet
NCHW elrendezésben. A pooling réteg csatornánként függetlenül dolgozik; a batch és csatorna dimenziók változatlanok. Az ablaktérbeli méret pozitív egész, a stride pozitív egész. Paddinget ebben az egységben zérusnak vesszük, és feltesszük, hogy az ablak mindig teljesen a bemeneti rácson belül marad; a kimeneti méret ekkor
Ez ugyanolyan alakú képlet, mint a konvolúcióé [dilation nélkül: mellett ], de itt a kernel súlyok helyett rögzített aggregáló függvény áll.
Max pooling. A , kimeneti pozícióhoz tartozó bemeneti ablak
és
Average pooling. Ugyanilyen ablakokon
A kimenet mindkét esetben . Gyakori választás a , , amely a térbeli méretet felezi.
1. definíció (lokális aggregáció). Egy térbeli leképezést lokális aggregációnak nevezünk, ha a kimenet minden pontja egy rögzített méretű, a bemeneti rács szerinti lokális környezet elemeinek egyetlen értékké való összegzése, például maximum, összeg vagy átlag, anélkül hogy a bemeneti rács felbontását megváltoztatná. Formálisan ; ilyenkor , tehát a kimeneti rács sűrűsége megmarad, csak a határ zsugorodik.
2. definíció (downsampling, leskálázás). A mintavételi sűrűség csökkentése: a bemeneti rácson kijelölünk egy ritkább rácsobjektumot, és csak ezen adjuk vissza az értékeket. Ebben a pooling-kontextusban vagy . A kimeneti rács ennek megfelelően ritkább, és az aggregálás, ha van, már ezen a ritkább rácson történik.
Fontos, hogy a , pooling egyszerre aggregál és leskáláz: az ablakot nem csúsztatjuk egyesével, hanem kettesével, tehát a kimeneti rács sűrűsége fele. Ezzel szemben , csak lokális aggregáció, nincs mintavételi sűrűségcsökkenés.
Az eltolási ekvivariancia szempontjából a különbség lényeges: az aggregáció önmagában kompatibilis az eltolással a belső tartományon, a leskálázás viszont áttér egy ritkább rácsra, ahol a bemeneti rács egypixeles eltolásának nincs egyértelmű megfelelője. Emiatt várjuk, hogy a stride-1 pooling equivariáns, a stride- pooling pedig csak az eltolásokra.
A downsampling és az eltolás viszonyát formálisan egy egydimenziós modellben rögzítjük, mert a lényeg már ott látható.
Legyen a bemeneti rács , az eltolás a belső tartományon legyen definiálva a összefüggéssel, a határra zéró értéket feltételezve, ha . A pooling legyen , maxpooling, tehát .
Lemma (nincs rögzített kimeneti eltolás az egypixeles shiftre). A maxpoolingra nem létezik olyan , amelyre minden mellett
teljesülne.
Bizonyítás. Megmutatjuk, hogy két különböző bemenet két különböző -t követel.
Válasszuk az bemenetet. Ekkor . Az egypixeles eltolt . Ennek poolingja . Tehát , ami azt jelentené, hogy , vagyis .
Válasszuk az bemenetet. Ekkor . Az eltolt , és . Ahhoz, hogy legyen, szükséges.
Nincs olyan közös , amely az első esetben , a másodikban egyszerre, ezért az egyenlet nem teljesülhet minden -re. ∎
Az ellenpélda értelmezése: a bemenetben a maximum az első ablakban van; az egypixeles eltolás a maximumot még mindig az első ablakba viszi, mert a második pozíció az első ablakban marad. A bemenetnél azonban az eltolás a maximumot átviszi a második ablakba. A pooling az ablakon belüli pozíciót eldobja, ezért az első esetben a változás láthatatlan, a másodikban ugrást okoz. A kimeneti rácson a pixeles eltolás nem létezik, ezért nincs olyan konzisztens rögzített eltolás.
Következmény. Stride pooling után az ekvivariancia-állítás csak az eltolásokra fogalmazható meg értelmesen. Ez a 16.1. Eltolási equivariance és invariance megfigyelés általánosítása: a stride az eltolási részegységet a ritkább rácshoz rögzíti.
A leskálázás egy diszkrét jelet ritkább rácson mintavételez. A klasszikus mintavételi elméletben, ha a jel spektruma a ritkább rács Nyquist-határán túlra nyúlik, akkor a magas frekvenciájú komponensek alacsony frekvenciájú hamis mintázatként, alias-ként jelennek meg. A klasszikus mintavételi tétel folytonos idejű, sávkorlátos jelekről szól: ha egy függvény nem tartalmaz ciklus/s-nál nagyobb frekvenciát, akkor egyértelműen meghatározzák az másodpercenként vett mintái ([P28], II. szakasz, „The Sampling Theorem”, Theorem 1, 11. o.). A tételt és bizonyítását itt nem reprodukáljuk. A pooling ettől eltérő helyzet: már diszkrét jelet ritkítunk tovább, és a képek általában nem sávkorlátosak, ezért a tétel feltételei itt nem teljesülnek, és rá nem hivatkozhatunk bizonyításként. Amit a laborban szemléltetünk, az a diszkrét ritkítás aliasing-jelensége: ha a ritkább rácson ábrázolható legnagyobb frekvenciánál magasabb komponens van a jelben, az a ritkítás után alacsonyabb frekvenciaként jelenik meg. Ez a szakasz szemléltetés és mérés, nem a folytonos tétel alkalmazása.
Az anti-aliasing gondolata: a leskálázás előtt egy aluláteresztő szűrővel csökkentjük a magas frekvenciákat, gyakran egyszerűen egy kis kernelű átlagolással, például box-szűrővel. Ha a szűrés megelőzi a ritkítást, akkor a leskálázás kevésbé éles, de kevésbé fázisfüggő mintázatot kap. A pooling-kontextusban a , average pooling éppen egy ilyen box-szűrő és a ritkítás egylépéses kombinációja; a max pooling nem lineáris aluláteresztő, ezért az anti-aliasing szerepét nem ugyanúgy tölti be.
A szakirodalmi kapcsolat: Zhang 2019 absztraktja szerint a stride-os konvolúciós hálózatokban a downsampling aliasing-ot okozhat, és blur-szűrős pooling javasolható az eltolási invariancia javítására [P03]. A teljes módszerszakasz olvasása folyamatban van; a részletes állításokhoz a cikk PMLR-kiadásának módszertani részét kell majd idézni. Mi itt csak a szűrés előtti leskálázás elvét vizsgáljuk, nem állítjuk a javasolt architektúra általános fölényét.
Számos osztályozó architektúra, különösen a későbbi fejezetekben tárgyalt modern CNN-ek esetében, az utolsó konvolúciós feature-térképeket global average poolinggal (GAP) redukálja. A GAP lényegében egyetlen ablak az egész térbeli dimenzióra:
a kimenet alakja vagy , attól függően, hogy a könyvtár megőrzi-e a térbeli szingleton dimenziókat. A GAP a teljes térbeli rácsot egyetlen aggregátummá sűríti, ezért explicit térbeli invarianciát ad: minden olyan permutáció, amely az intenzitásokat a képen belül átrendezi, ugyanazt a GAP-kimenetet adja. Ez erősebb, mint az eltolási invariancia, és egyben mutatja, mekkora árat fizetünk: minden térbeli szerkezet elvész.
Ezt az információs veszteséget pontosan ki tudjuk mondani a nem injektivitás nyelvén.
3. definíció (információs veszteség). Egy leképezés akkor nem injektív, ha létezik az -ből úgy, hogy . Ekkor a kimenet önmagában nem teszi lehetővé és megkülönböztetését; a leképezésnek nincs balinverze.
Lemma (a pooling nem injektív). Legyen , és tekintsük az egyablakos , illetve leképezéseket. Mindkettő nem injektív.
Bizonyítás. esetén , miközben a bemenetek különböznek, ha . esetén ugyanaz az összeg többféleképpen is előállítható: , és miatt a két bemenet különböző. ∎
A max pooling egy további, specifikus veszteséget is okoz: az ablakból csak a legnagyobb értéket tartja meg, a maximális pozíciót és az összes többi értéket eldobja. A backpropagation során — lásd a 15.2. Inputgradiens és átfedő recepciós mezők scattering-add fogalmát — a gradiens csak a maximum pozíciójába folyik tovább, az ablak többi eleme zéró gradienst kap. Az átlag pooling ezzel szemben a lokális zajcsökkentést valósítja meg, mert az átlag varianciája kisebb, mint az egyes elemeké, de a kontrasztos finom struktúrát ugyanúgy elmossa.
Vegyük a bemenetet, , :
, maxpooling esetén a kimenet :
Tehát
Ugyanezzel az ablakkal average pooling esetén:
Vegyük most az egypixeles vízszintes eltolást a belső tartományon, zéró határral: negyedik sora lesz, a harmadik , és így tovább. A maxpooling kimenete:
Az eredmény , amely nem az eredeti semmilyen kimeneti eltolása. Az egypixeles eltolás tehát nem konzisztens kimeneti eltolásként jelenik meg, hanem az ablakhatárokon átrendezi a maximumokat.
A következő kód a kézi példa műveletét adja meg NCHW bemenetre, padding és dilation nélkül, float32 pontossággal. A kimenet itt számított példa; futtatás előtt a laborban ellenőrizze.
# munkakönyvtár: lab/
# fájl: pooling_reference.py
import numpy as np
def max_pool2d(X: np.ndarray, k: tuple[int, int], s: tuple[int, int]) -> np.ndarray:
"""NCHW max pooling, zero padding nélkül, teljes ablakokkal.
X: float32, alak (N, C, H, W).
k, s: (kh, kw), (sh, sw) pozitív egészek.
"""
N, C, H, W = X.shape
kh, kw = k
sh, sw = s
Ho = (H - kh) // sh + 1
Wo = (W - kw) // sw + 1
Y = np.empty((N, C, Ho, Wo), dtype=np.float32)
for i in range(Ho):
for j in range(Wo):
patch = X[:, :, i*sh:i*sh+kh, j*sw:j*sw+kw]
Y[:, :, i, j] = patch.max(axis=(2, 3))
return Y
# kézi példa
X = np.array([[[
[1,0,2,1],
[0,3,2,0],
[0,0,4,0],
[1,0,0,1]
]]], dtype=np.float32)
Y = max_pool2d(X, (2,2), (2,2))
# várt: [[[[3,2],[1,4]]]]
print(Y.shape, Y.tolist())
# (1, 1, 2, 2) [[[[3.0, 2.0], [1.0, 4.0]]]]A stride feltétel ellenőrzése: ha
,
a kód az utolsó nem teljes ablakot dobja el, tehát a floor-képlet
érvényes. A PyTorch nn.MaxPool2d(kernel_size=2, stride=2)
ugyanezt az alakot adja, és a 12.2. Checkpoint és
folytathatóság checkpoint-megfontolásokhoz hasonlóan a modell a
paramétereit itt nem tárolja, mert nincs tanulható súlya.
A labor célja az aliasing szemléltetése. A megfigyelési egység egyetlen szintetikus kép; az eredmény itt számított várható érték, nem futtatott mérés. Az állítások csak a konkrét bemenetre vonatkoznak.
Bemenet. Két -as jel, , tartományban, float32:
Protokoll. Három műveletet hasonlítunk össze:
Várt számított kimenetek.
A sakktáblánál: a ablak mindig két -t és két -et tartalmaz, a maxpooling ezért minden ablakban -et, az average pooling minden ablakban -öt ad. A (b) művelet kimenete konstans . A (c) művelet a box-szűrő után a belső rácson -öt ad a koordináták kivételével, és a ritkított mintavétel a fázistól függ: ha a mintavételi rács a páros-páros pixeleket veszi, a kimenet konstans ; ha a páratlan-páratlan fázist, a határmenti értékek jelennek meg. A két fázis közötti különbség mutatja, hogy a filterezés önmagában nem szünteti meg teljesen a fázisfüggést, de a kontrasztos ugrást tompítja.
A sávos jelnél a maxpooling (a) kimenete az éles mintázatot őrzi, mert minden ablak tartalmaz sávot; az average pooling (b) szintén vagy , a sáv fázisától függően. A (c) lépés a box-szűrés miatt először átmeneti értékeket ad a sávhatáron, és a leskálázás utáni kimenet simább, kevésbé fázisfüggő átmeneteket mutat.
Értelmezés. A maxpooling nem simít, ezért az éles magas frekvenciájú tartalmakat a leskálázás után is élesen, de a fázistól erősen függő módon őrzi. Az average pooling a lokális átlaggal alulátereszt, de ha a stride -vel vétel történik, a simítás és a mintavétel egyszerre történik; a (c) változatban a simítás a ritkítás előtt önálló lépés. A különbség a sávhatárokon és a sakktábla-fázisokban látszik.
Részlet a laborból futtatható parancsként:
cd lab && python -c "
import numpy as np
C = ((np.indices((8,8)).sum(0))%2).astype('float32')[None,None]
# (c) egyszerű box-szűrő, stride 1, majd minden 2. pixel
sh = (C[:,:, :-1, :-1] + C[:,:,1:, :-1] + C[:,:, :-1,1:] + C[:,:,1:,1:])/4
out = sh[:,:, ::2, ::2]
print(out.shape, out[0,0].tolist())
"Ügyeljen az np.indices használatára: az
np.indices((8,8)).sum(0) a sakktáblát adja. A futtatás
seedet nem igényel, mert nincs véletlen szám; a dtype float32, a device
CPU. GPU igénybevétele nem szükséges, és kis példánkban a belső
memóriavezérlés helyett a célszerű megjelenítés a cél.
Gyakran hallani, hogy a maxpooling „érzéketlenné tesz a kis eltolásokra”. Ez az állítás túl erős, és az előző lemmában szereplő ellenpélda cáfolja. A maxpooling csak lokálisan, az ablakon belül érzéketlen az értékek permutációjára; egyetlen pixeles eltolás esetén egy ablak esetén a maximum pozíciója az ablakon belül is megváltozhat, és a kimenet ugrik. A 16.1. Eltolási equivariance és invariance terminológiájával élve: az invariancia nem következik a max műveletből, legfeljebb részcsoport-szintű equivariance vagy közelítő invariancia. Zhang 2019 absztraktja is felhívja a figyelmet arra, hogy a modern hálózatok downsampling-műveletei nem feltétlenül eltolás-invariánsak [P03]. A teljes módszer ellenőrzése azonban még nyitott.
Ellenőrizze, hogy meg tudja-e válaszolni a következőket. (1) Mi a különbség az és pooling között a kimeneti rács sűrűségét tekintve? (2) Miért nem létezik rögzített kimeneti eltolás az egypixeles bemeneti eltolásra a maxpoolingnál? (3) Mi az anti-aliasing lépés célja a downsampling előtt? (4) Miért nem injektív a maxpooling, és miért releváns ez a reprezentációs veszteségre?
Visszahívás a 15.2. Inputgradiens és átfedő recepciós mezők egységből: a konvolúciós inputgradiensben az átfedő patch-ek hozzájárulásait scatter-add formában kellett összegezni. A maxpooling backward ezzel szemben nem szór vissza minden ablakpixelbe, csak a maximum pozíciójába, ezért az átfedés esetén más gradienssűrűséget kapunk. A 4.2. Parciális derivált és gradiens egység gradiensfogalma itt akkor válik majd fontossá, amikor a tanítható hálózatban a pooling rétegen keresztül visszavezetjük a veszteséget.
A pooling réteg két funkciót ötvöz: lokális aggregációt és stride-os mintavétel-csökkentést. Az aggregáció esetén megőrzi a bemeneti rács sűrűségét; a stride esetén ritkább kimeneti rácsra térünk át. A bizonyított ellenpélda szerint a maxpoolingra nincs rögzített kimeneti eltolás, amely az egypixeles bemeneti eltolást konzisztensen reprezentálná, mert az ablakon belüli pozíció elvész. A downsampling ezért aliasing-fázisfüggőséget okozhat; az aluláteresztő szűrés a ritkítás előtt csökkenti ezt. A global average pooling teljes térbeli invarianciát ad, de nem injektív, tehát a finom szerkezetet eltünteti.
A 16.3. Elméleti és effektív recepciós mező egységben a recepciós mezőt általánosítjuk: a pooling ablakai és stride-jai a konvolúciós rétegek recepciós mezőjét nyújtják meg, ezért az itt tárgyalt rácssűrűség-csökkenést a többrétegű architektúrákban is el kell tudni számolni.
F1 (fogalmi, nehézség 1). Magyarázza el, miért nem nevezhető a , average pooling downsamplingnak, és miért nevezhető annak a , average pooling. Adja meg mindkettő kimeneti alakját egy -os bemenetre.
F2 (levezetési, nehézség 2). Bizonyítsa be a maxpooling nem injektivitásáról szóló lemmát -re úgy, hogy két konkrét vektort ad meg, amelyek képe azonos. Adjon hasonló bizonyítást az average poolingra is.
F3 (implementációs, nehézség 2). Írjon NumPy függvényt NCHW average poolingra, kernel és stride támogatással, teljes ablakokkal; ellenőrizze a , stride 2 műveletet a fejezet kézi példáján, és egy , , esetet. Tegye lehetővé a global average pooling is a teljes térbeli méret megadásával.
F4 (hibakeresési, nehézség 2). A következő sor
hibás: Y[...] = patch.sum(axis=(2,3)) / (kh + kw)
átlagpooling kiszámításához. Mi a hiba oka, mi a következménye, és
hogyan javítja ki? Ellenőrizze a kézi példán, hogy a
eset valóban
-szeres
értéket ad.
F5 (kísérleti/transzfer, nehézség 3). Tervezzen GlyphLab-alapú kísérletet, amely összehasonlítja a max- és average pooling hatását egy kicsi CNN osztályozási pontosságára a clean és corrupt teszten. Ne feltételezze, hogy az egyik győz; adja meg a megfigyelési egységet, a splitet, a baseline-t, a változó tényezőt, a metrikát és egy érvényességi korlátot.
F1. A average pooling esetén a kimeneti rács , tehát a térbeli felbontás majdnem megmarad, a kimenet . A leképezés csak lokális aggregációt végez, nincs ritkítás. A average pooling kimeneti mérete , a rács feleződik, ezért downsampling. Mindkettő kimeneti alakja .
F2. A maxpoolingra : és , de , tehát nem injektív. Average poolingra: , a bemenetek különböznek, a kép azonos. A lemma érvényes.
F3. Egy megoldás:
def avg_pool2d(X, k, s):
N,C,H,W = X.shape; kh,kw = k; sh,sw = s
Ho = (H - kh)//sh + 1; Wo = (W - kw)//sw + 1
Y = np.empty((N,C,Ho,Wo), dtype=X.dtype)
for i in range(Ho):
for j in range(Wo):
patch = X[:, :, i*sh:i*sh+kh, j*sw:j*sw+kw]
Y[:, :, i, j] = patch.mean(axis=(2,3))
return YA kézi példán a várt mátrix , a tolerancia float32 esetén abszolút. A , esetben a kimenet lesz, és a GAP-hoz használandó.
F4. A hiba oka a nevező: az átlag az ablak
elemszámának
,
nem
osztóval történik. A
ablakban a nevező
valójában egybeesne
-gyel,
ezért csak
,
például
esetben okoz torzítást: a helyes nevező 6, a hibás 5. Következmény: az
átlag érték tévesen nagyobb lesz, a kimenet eltolódik. Javítás:
/ (kh * kw). Ellenőrzés a fejezet számpéldáján: a bal felső
ablak összege 4, a helyes átlag 1, a hibás kód
itt nem mutatja a hibát; válasszon
ablakot, ahol az összeg 5, a helyes átlag
,
a hibás
.
F5. Egy lehetséges terv. Kérdés: változik-e a clean és corrupt teszten mért accuracy, ha a fix konvolúciós törzs utáni pooling max vagy average? Megfigyelési egység: GlyphLab scene_id; a train/val/test a szerződés szerinti jelenetes split. Baseline: ugyanaz a kétkonvolúciós kis CNN, ReLU aktiváció, egyetlen pooling stratégia, záró global average és lineáris fej. Változó tényező: max- vagy average pooling , stride 2. Protokoll: rögzített seed 20261020, float32 CPU, a legjobb checkpoint kiválasztása val loss alapján, a test és corrupt test páros scene_id szerinti kiértékelése. Metrika: per-image accuracy és a clean–corrupt páros csökkenés. Érvényességi korlát: az adat szintetikus, az eredmény nem általánosítható természetes képekre; egy seed nem elegendő a szóráshoz. Előre rögzített győztest nem állítunk; a negatív eredmény is rögzítendő.