Ebben az alfejezetben két, gyakran összekevert fogalmat választunk szét: az eltolási ekvivarianciát (shift equivariance) és az eltolási invarianciát (shift invariance). Az előbbi azt mondja meg, hogyan viselkedik egy operátor kimenete, ha a bemenetet eltoljuk; az utóbbi azt, hogy a kimenet egyáltalán nem változik. A megkülönböztetés nem szóhasználati kérdés: a CNN-rétegek tervezésekor éppen az a cél, hogy a konvolúciós réteg ekvivariáns legyen, a hálózat végén lévő aggregáló rétegek pedig a kívánt mértékű invarianciát hozzák létre.
Előfeltételek: a 13.4. Határkezelés és frekvenciaintuíció egységből a véges képek határkezelése (valid, zero és circular padding), a 14.4. Csoportos és depthwise konvolúció egységből a csatornák közötti kapcsolat korlátozása, a 15.4. Független gradiensellenőrzési protokoll egységből a numerikus ellenőrzés fegyelme. Visszautalunk a 15.1. Súly- és biasgradiens súlymegosztási gondolatára, a 12.1. Tanítás, validáció és kiértékelési mód train/eval megkülönböztetésére és a 4.1. Függvény, határérték és derivált függvényfogalmára.
Induló kérdés: ha egy pixeles GlyphLab-képet három képponttal jobbra tolunk, akkor egy -as szűrő kimeneti térképe is pontosan három képponttal tolódik-e el, és a végső osztályozási logit változatlan marad-e? A válasz első fele feltételek mellett igen, második fele általában nem — ezt a megkülönböztetést dolgozzuk ki.
A jelölést a 14.2. Több bemeneti és kimeneti csatorna egység NCHW-szerződése szerint rögzítjük, de a levezetéshez a batchindexet elhagyjuk, mert az eltolás csatornánként és képenként függetlenül hat. Legyen a bemeneti kép
A kernel
,
a bias
.
A használt operátor a PyTorch Conv2d által számolt
cross-correlation, kernelmegfordítás nélkül; a 13.2. Konvolúció és cross-correlation egységben
rögzítettük, hogy ez nem azonos a matematikai konvolúcióval, de a
szimmetriafogalmak szempontjából a kernelmegfordítás egy rögzített
transzformáció, ezért az equivariance-állítás mindkét változatra azonos
szerkezetű.
Definíció (valid cross-correlation, stride 1, padding 0). A kimenet alakja , ahol , , és
Az egyes kimeneti pozíciókhoz tartozó méretű bemeneti ablakot recepciós mezőnek nevezzük; a 16.3. Elméleti és effektív recepciós mező egységben ezt általánosabban vizsgáljuk.
Definíció (eltolási operátor). Legyen . A operátor a végtelen nulla-kiterjesztésű rácson hat:
ahol a definíció szerint az eredeti tartományon kívüli indexekre értéke nulla. A véges képek világában ez azt jelenti, hogy a kép tartalma a vektorral eltolódik, a felszabaduló sáv pedig nullákkal töltődik fel. Ha , akkor
és nulla egyébként. A kép mérete változatlan marad. Más eltolási változatok — crop, circular — a laborban szerepelnek; ezek más operátort definiálnak, és az equivariance-állítás határfeltételei eltérnek.
Az eltolás itt a térbeli indexekre hat, a csatornaindexet nem érinti. A csatornák közötti permutáció egy másik szimmetria lenne, amellyel itt nem foglalkozunk.
Legyen egy tetszőleges operátor, amely képeket képekre, vagy képeket skalárokra képez.
Definíció (eltolási ekvivariancia). Az operátor eltolási ekvivariáns az eltolások egy halmazára nézve, ha minden esetén
minden olyan -re és kimeneti indexre, ahol mindkét oldal értelmezett. A a kimeneti oldalon a kimeneti rácsnak megfelelő eltolást jelöli; ha a kimeneti rács felbontása eltér, ezt külön rögzíteni kell.
Az egyenlet szemléletes jelentése: a szűrő alkalmazása és az eltolás felcserélhető. Ha előbb eltolom a képet, majd szűröm, ugyanazt kapom, mintha előbb szűrném, majd a kimeneti térképet tolnám el.
Definíció (eltolási invariancia). Az operátor eltolási invariáns az eltolások halmazára nézve, ha minden esetén
Itt a kimenet nem változik meg az eltolás hatására. Tipikus példa a globális átlagolás: ha a kép minden pixelét átlagoljuk, az eltolás a nulla-paddingelt határon kívül nem változtatja az átlagot.
A két egyenlet összevetése mutatja a lényegi különbséget: a (3) egyenletben a jobb oldalon még mindig hat a kimenetre, vagyis az eltolás megőrződik a kimenetben; a (4) egyenletben a kimenetből eltűnik az eltolás. Az ekvivariancia tehát nem gyengébb invariancia, hanem más tulajdonság: az egyik megtartja, a másik eltünteti az eltolást.
A két fogalom metszete nem üres: a nulla leképezés egyszerre invariáns () és ekvivariáns (), ezért egyik tulajdonságot sem választja el a másiktól. Szétválasztó példák: a konstans, de nem nulla kimenet, (csupa egyes kép), invariáns, de nem ekvivariáns, mert a kimeneti rácson ható nullával kitöltő a eltolásnál nullasávot hoz létre, így . Az identitásleképezés ekvivariáns, de nem invariáns, mert általában. Mindkét példában a kimeneti térre ható ugyanaz a (2) szerinti, nullával kitöltő eltolás. A fogalmi különbséget az F1 feladatban mélyítjük el.
A következő állítás az [S01] kurzusjegyzet által is tárgyalt tulajdonság saját, pontos feltételekkel ellátott levezetése.
Tétel (valid cross-correlation eltolási ekvivarianciája a belső tartományon). Legyen az (1) képlettel definiált valid cross-correlation, stride , padding . Legyen egészek, és tegyük fel, hogy és . Ekkor minden kimeneti csatornára és minden olyan párra, amelyre
teljesül
ahol a kimeneti rács eltolásának definíciója.
Az -re vonatkozó feltétel jelöli ki a belső tartományt: az alsó korlát (, ) miatt az eltolt képen a kernelablak nem éri el a bal és a felső nullasávot, a felső korlát () pedig a valid kimenet utolsó indexe, . A tartományon kívül két külön határeset van. (a) Ha vagy , a jobb oldali a kimeneti eltolás nullával kitöltött sávjába esik, tehát , a bal oldal viszont a részben nullasávra eső ablak összege plusz ; az egyenlőség általában nem áll. (b) A bias ebben a sávban önmagában is sérti az egyenlőséget: csupa nulla esetén , míg , ha . Egydimenziós ellenőrzés: , , , mellett , és ; az pont a nullasávban van és sérti az egyenlőséget, az belső pont teljesíti.
Bizonyítás. A bizonyítás a definíciók behelyettesítésén és az összegzés indexeinek átnevezésén alapul. Induljunk ki a bal oldalból, és alkalmazzuk először , majd definícióját:
A (2) definíció szerint , tehát
A feltételből , ezért a legnagyobb esetén is ; az alsó korlát és miatt pedig . Tehát minden -index az eredeti tartományban van, nullával kitöltött elem nem lép fel.
Most írjuk fel definícióját az kimeneti pozícióra — a feltételek miatt ez a pozíció értelmezett, hiszen (és ugyanígy -re), ahol :
A (6) és (7) összegek tagonként azonosak, mert a kernel független az eltolástól, és az összeadás kommutatív: az és indexek megegyeznek. A bias konstans, mindkét oldalon ugyanaz, tehát nem befolyásolja az egyenlőséget. Ezzel
ami éppen az (5) állítás.
A bizonyításból látszik a kulcsmechanizmus: a kernel súlyai minden pozícióban ugyanazok (weight sharing, 15.1. Súly- és biasgradiens), ezért az eltolás csak az indexeket mozgatja, a súlyokat nem. Ha a súlyok pozíciófüggők lennének, az egyenlőség nem állna fenn — ez az F2 feladatban visszatér.
A tétel csak nemnegatív eltolásra lett kimondva. Negatív esetén a belső tartomány feltétele tükröződik: az eltolt kép nullasávja a jobb, illetve az alsó oldalon jelenik meg, és a tartomány (ugyanígy -re). A teljes állítás mindkét irányra hasonló, de a laborban a pozitív eset elegendő.
Ha a cross-correlation stride -sel dolgozik, a kimeneti rács -szeresen ritkább. A kimeneti pozíció -höz a bemeneti ablak ponthoz kezdődik. Ha a bemenetet vektorral toljuk, ahol , akkor
a belső tartományon. A levezetés azonos az előző bizonyítással, csak az indexet -re cseréljük. A lényeg: az eltolásoknak az a halmaza, amelyre az ekvivariancia a kimeneti rácson változatlan formában teljesül, a
halmaz. Ez az összes kétdimenziós egész eltolás csoportjának részcsoportja (az összeadásra zárt, az ellentett elemet is tartalmazza). Páratlan, például eltolás esetén nincs olyan egész , amelyre teljesülne a kimeneti rácson, mert a kimeneti rács felbontása nem tud félpixeles eltolást reprezentálni. Ez a stride-részcsoport fogalma: az equivariance csak a rács ritkításának megfelelő részcsoporton áll fenn.
Legyen , , kernel , minden eleme , bias , stride 1, padding 0. A bemenet legyen , azaz
A valid kimenet . Válasszuk az eltolást -nek. A nulla-paddingelt eltolt kép sorai:
Számítsuk ki a belső tartomány egy pontját. Az kimenet -es, és a pozícióhoz tartozó ablak az bal felső része:
Az kimenet ugyancsak -es, és az pozícióhoz tartozó ablak a sorai 1–3, oszlopai 1–3:
Az , tehát az pozícióban az egyenlőség teljesül. Ez a belső tartomány része: az eltolt képen ez az ablak már teljesen az eredeti eltolt tartalmán belül helyezkedik el.
Most nézzük a határpozíciót -t. Az a bal felső ablakának összege:
A jobb oldal a kimeneti rács nullával kitöltő eltolásából , mert a kimeneti nullasávban van (). A eltérés pontosan a tétel alsó korlátját mutatja: az ablak a bemeneti nullasávba lóg, ezért nem az eredeti tartalom eltoltja. A belső tartomány itt és ; a pozíció a felső korlátot is szemlélteti: ablaka a 3–5. sora és oszlopa, vagyis az 2–4. sora és oszlopa, tehát . A laborban a numerikus ellenőrzés ugyanezt a tartományt használja.
A labor egyetlen kis NumPy szkript, amely három eltolási
implementáció — zero-fill, crop és
circular —, valamint a stride hatását méri. A
munkakönyvtár lab/n061. A kód float64-ben
dolgozik, a tolerancia a belső tartományon
,
mert a műveletek véges floating-point összegek.
# workdir: lab/n061
import numpy as np
def corr_valid(x, k):
"""Valid cross-correlation, N=1, C=1. x:(H,W), k:(kh,kw)."""
H, W = x.shape
kh, kw = k.shape
out = np.zeros((H - kh + 1, W - kw + 1), dtype=np.float64)
for i in range(out.shape[0]):
for j in range(out.shape[1]):
out[i, j] = np.sum(x[i:i+kh, j:j+kw] * k)
return out
def corr_valid_stride(x, k, s):
H, W = x.shape
kh, kw = k.shape
ho = (H - kh) // s + 1
wo = (W - kw) // s + 1
out = np.zeros((ho, wo), dtype=np.float64)
for i in range(ho):
for j in range(wo):
out[i, j] = np.sum(x[i*s:i*s+kh, j*s:j*s+kw] * k)
return out
def shift_zero(x, tau):
"""Eltolás; a felszabaduló sáv nullával töltött."""
th, tw = tau
y = np.zeros_like(x)
H, W = x.shape
y[th:, tw:] = x[:H-th, :W-tw]
return y
def shift_crop(x, tau):
"""Eltolás; a kilógó részt eldobjuk, a kép mérete csökken."""
th, tw = tau
return x[th:, tw:]
def shift_circular(x, tau):
"""Körkörös eltolás (np.roll)."""
th, tw = tau
return np.roll(x, (th, tw), axis=(0, 1))
np.random.seed(20261020)
x = np.random.rand(8, 8).astype(np.float64)
k = np.array([[1.0, 2.0, 1.0],
[2.0, 4.0, 2.0],
[1.0, 2.0, 1.0]], dtype=np.float64) # Gauss-szerű 3x3 kernel
tau = (1, 1)
# 1) zero-fill shift
F_x = corr_valid(x, k)
T_x = shift_zero(x, tau)
F_Tx = corr_valid(T_x, k)
T_Fx = np.zeros_like(F_x)
T_Fx[tau[0]:, tau[1]:] = F_x[:F_x.shape[0]-tau[0], :F_x.shape[1]-tau[1]]
# belső tartomány a tétel szerint: tau_h <= i < F_Tx.shape[0], stb.
diff_zero = np.abs(F_Tx - T_Fx)
print("zero-fill, belső max |diff|:", diff_zero[tau[0]:, tau[1]:].max())
print("zero-fill, teljes max |diff|:", diff_zero.max())
# 2) crop shift
C_x = shift_crop(x, tau) # 7x7
F_Cx = corr_valid(C_x, k) # 5x5
# a közös tartomány a teljes F_Cx
T_Fx_crop = F_x[tau[0]:F_x.shape[0], tau[1]:F_x.shape[1]] # 5x5, mert F_x 6x6
diff_crop = np.abs(F_Cx - T_Fx_crop)
print("crop, közös tartomány max |diff|:", diff_crop.max())
# 3) circular shift
C2_x = shift_circular(x, tau)
F_C2x = corr_valid(C2_x, k)
diff_circ = np.abs(F_C2x - T_Fx)
print("circular, belső max |diff|:", diff_circ[tau[0]:, tau[1]:].max())
print("circular, teljes max |diff|:", diff_circ.max())
# 4) stride 2
s = 2
F_sx = corr_valid_stride(x, k, s) # 3x3
# páros eltolás: tau = (2,0) -> kimeneti (1,0) eltolás
T2_x = np.zeros_like(x)
T2_x[2:, :] = x[:6, :]
F_sT2x = corr_valid_stride(T2_x, k, s) # 3x3
T1_Fsx = np.zeros_like(F_sx)
T1_Fsx[1:, :] = F_sx[:F_sx.shape[0]-1, :]
diff_stride_even = np.abs(F_sT2x - T1_Fsx)
print("stride 2, páros eltolás belső max |diff|:",
diff_stride_even[1:, :].max())
# páratlan eltolás: tau=(1,0) — nincs megfelelő kimeneti egész eltolás
T1_x = np.zeros_like(x)
T1_x[1:, :] = x[:7, :]
F_sT1x = corr_valid_stride(T1_x, k, s)
# referencia: F_sx eltolás nélkül; eltérés nem lehet nulla
diff_stride_odd = np.abs(F_sT1x - F_sx)
print("stride 2, páratlan eltolás teljes max |diff|:", diff_stride_odd.max())A várható, nem futtatott kimenet jellege. A zero-fill esetben a belső tartományon a maximális eltérés (gépi pontossággal), a teljes tartományon viszont nem nulla, mert a határon a nulla-sáv hatása megjelenik. A crop shift esetén a közös tartományon az eltérés , de a kimenet mérete kisebb, így a határinformáció elveszik. A circular shift esetén a belső tartományon is eltérés lép fel, mert a körkörös eltolás a kép másik széléről hoz be elemeket az ablakba; a valid cross-correlation lineáris határfeltételt használ, ezért a két operátor nem cserélhető fel. A stride 2 esetén a páros eltolásra a belső tartományon az eltérés , a páratlan eltolásra a teljes tartományon sem nulla. A konkrét számok függenek a seedtől, ezért szándékosan nem adunk meg előre rögzített értékeket; a hallgató feladata a futtatás és a fenti viselkedés ellenőrzése. A közölt elvárások nem helyettesítik a laborban rögzített mérési jegyzőkönyvet.
Adjon példát olyan operátorra, amely a (3) értelemben eltolási ekvivariáns, de nem invariáns, és olyanra, amely invariáns. Indokolja meg, hogy a globális átlagpooling miért invariáns a nulla-paddingelt eltolásra a belső tartományon, és mi történik a határon. Elvárt átadandó eredmény: a két példa az operátoregyenlettel ellenőrizve, legalább egy ellenpélda a határviselkedésre.
Bizonyítsa be a stride- cross-correlation eltolási ekvivarianciáját a stride-részcsoporton: minden -re és a belső tartományon teljesüljön
Adja meg pontosan a belső tartományt függvényében. Elvárt átadandó eredmény: a tétel feltevésekkel, a bizonyítás a definícióból, és egy -as bemenetre , mellett a belső tartomány explicit indexhalmaza.
Egészítse ki a labor kódját egy check_equiv függvénnyel,
amely adott
,
,
és
esetén visszaadja (a) a teljes tartományon, (b) a belső tartományon a
maximális abszolút eltérést. Futtassa a labor zero-fill esetére. Elvárt
átadandó eredmény: a függvény kódja, a két számérték, és egy
assert állítás, amely a belső tartományon
alatti eltérést követel meg.
Egy hallgató a következőt állítja: „Mivel a
körkörösen tolja el a képet, a
corr_valid(np.roll(x, tau), k) eredménye mindig megegyezik
np.roll(corr_valid(x, k), tau) eredményével.” Lokalizálja
az állítás hibáját, adjon konkrét
-es
bemenetet,
-es
kernelt és
eltolást, amelyre az egyenlőség megsérül, és magyarázza el a hiba okát a
határfeltételek nyelvén. Elvárt átadandó eredmény: az ellenpélda konkrét
számaival, a két kimenet kiszámítva, és a javítás (mely
shift-definícióval lenne igaz az állítás).
Tervezzen kísérletet arra, hogy megmérje: a GlyphLab osztályozó CNN (a korábbi checkpoint) mennyire invariáns az eltolásra a gyakorlatban. Vegye figyelembe a szerződést: a tesztkép eltolásakor a nulla-paddingelt részek új tartalmat visznek be, ezért az eltolást csak a kép belsejéből vett cropként, vagy a valid tartomány eltolásaként definiálja. Adjon meg nullhipotézist, metrikát (például a helyes osztály logitjának átlagos változása vagy a pontosság), a teszteléshez használt eltolástartományt, és azt, hogy miért nem elegendő egyetlen eltolás. Elvárt átadandó eredmény: egy kísérleti terv a protokoll elemeivel (adat, split, baseline, változó, metrika, korlát), futtatott eredmény nélkül.
Az identitás ekvivariáns, mert triviálisan, de nem invariáns, mert az eltolt kép általában különbözik az eredetitől. A globális átlagpooling
invarianciája a nulla-paddingelt eltolásra a belső tartományon abból következik, hogy az eltolás a pixelek összegét nem változtatja, csak a helyüket, amíg nulla-sáv nem lép be. Ha , akkor a nulla-paddingelt képből nulla elem kerül a helyére, így az átlag csökken: a hányados erejéig. Tehát a határon az invariancia sérül. Ellenpélda: csupa 1-es -es kép, ; ekkor , de .
A stride- cross-correlation definíciója:
Helyettesítsük be a eltolást, ahol :
Az -index átrendezve: . Ez pontosan az definíciója az kimeneti pozícióra, feltéve, hogy az indexek a tartományban vannak. A belső tartomány: a ablaknak teljesen az eltolt eredeti tartalomban kell lennie, azaz minden -re és is, hasonlóan -re. Innen
vagyis és . A -as bemenetre , , esetén a belső tartomány , (mert ). Ez a kimeneti -as rács alsó 2 sora.
A függvény:
def check_equiv(F, shift, x, k, tau):
"""F: (x,k)->out cross-correlation. Visszaadja a teljes és belső max eltérést."""
F_x = F(x, k)
T_x = shift(x, tau)
F_Tx = F(T_x, k)
T_Fx = np.zeros_like(F_x)
th, tw = tau
T_Fx[th:, tw:] = F_x[:F_x.shape[0]-th, :F_x.shape[1]-tw]
diff = np.abs(F_Tx - T_Fx)
full = diff.max()
interior = diff[th:, tw:].max()
return full, interior
full, interior = check_equiv(corr_valid, shift_zero, x, k, (1, 1))
assert interior < 1e-12, f"belső eltérés {interior}"
print(f"teljes={full}, belső={interior}")A belső eltérésre
várható, a teljesre a seedtől függő pozitív érték. Az ellenőrzés azért
használ float64-et és
küszöböt, mert a cross-correlation összegekben legfeljebb
tagú kerekítés halmozódik; a
a gépi epszilon
()
és a
tagú összeg szorzatának nagyságrendjébe esik.
Legyen
,
kernel
,
.
A corr_valid kimenete
:
A
sorai:
,
majd az eredeti első három sor. A corr_valid ezen:
A pedig:
A két mátrix első sora eltér
(
vs. ),
tehát az állítás hamis. A hiba oka: a körkörös eltolás a kép alsó sorát
a felsőre hozza, ezért a kernel olyan elemeket lát, amelyek az eredeti
kép másik széléről származnak. A valid cross-correlation lineáris
határfeltételt használ, ezért a két operátor nem cserélhető fel. Az
állítás akkor lenne igaz, ha a cross-correlation is körkörös paddinget
használna; a labor corr_valid függvénye ezt nem teszi.
Kérdés: A tanított GlyphLab-osztályozó predikciója mennyire stabil a bemeneti kép kis, nulla-padding nélküli eltolásaira?
Adat és split: a GlyphLab test split 60 képe; a kísérlet során a test képeket nem használjuk modellválasztásra, csak a végén értékeljük. A checkpoint a val spliten legjobb modell.
Eltolás-definíció: hogy elkerüljük a nulla-padding hatását, a -es képet először középen -ra vágjuk, majd ezt a -es rácson toljuk el a -es ablakon belül: , összesen 25 változat képenként. Így az eltolás csak valódi képtartalmat mozgat, nulla-sáv nem lép fel.
Nullhipotézis: a helyes osztály logitja az eltolás hatására nem változik szignifikánsan többet, mint a kép újra-mintavételezésének numerikus zaja.
Metrika: (a) a helyes osztály logitjának max-csökkenése a 25 eltolás között, képenként átlagolva; (b) a pontosság változása az eltolt képeken. Baseline: a checkpoint pontossága az eltolás nélküli testen.
Korlát: a GlyphLab nem természetes képi benchmark, ezért az eredmény nem általánosítható valós alkalmazásokra; a minta 60 kép, a bootstrap egység a scene_id.
A leggyakoribb tévedés azt állítja, hogy egy konvolúciós réteg, mivel „súlymegosztást” használ, a kimenetét változatlanul hagyja az eltolással szemben. Ez hamis: a cross-correlation ekvivariáns, tehát a kimenet ugyanúgy eltolódik, nem marad a helyén. Invarianciát csak a térbeli dimenziókat összevonó műveletek (globális pooling, vagy a stride-dal kombinált pooling rétegek) hozhatnak létre, és azok is csak korlátozott mértékben.
Konkrét ellenpélda: 1D jel, kernel, valid cross-correlation stride 1, padding 0. Ekkor . A eltolásra , és . Ez pontosan , vagyis a kimenet eltolódott, nem maradt . Az invariáns viselkedéshez a kimenetnek -nak kellene maradnia, ami nem teljesül.
A [P03] absztraktja szerint a modern CNN-architektúrák downsampling-rétegei miatt a hálózatok a gyakorlatban sem teljesen shift-invariánsak; a cikk teljes módszerszakasza azonban még olvasásra vár, ezért ebből itt csak az absztrakt szintű állítást idézzük.
Ellenőrizze a megértést az alábbi kérdésekkel, mielőtt továbblép:
Rövid visszahívás: a 4.1. Függvény, határérték és derivált egységben a függvényeket leképezésként definiáltuk; a (3) egyenlet két leképezés, és egyenlősége egy adott tartományon. Ez ugyanaz a szerkezet, mint a lineáris operátorok kommutálása, csak itt a tartomány korlátozott. A 15.1. Súly- és biasgradiens egységben levezetett kernelgradiens-összegzés éppen a súlymegosztás következménye; ugyanez a megosztás teszi lehetővé, hogy az eltolás csak az indexeket mozgassa.
Az eltolási ekvivariancia és invariancia két külön operátoregyenlet. Az ekvivariancia, , azt jelenti, hogy a kimenet az eltolással együtt mozog; az invariancia, , azt, hogy a kimenet nem változik. A valid cross-correlation stride 1, padding 0 mellett a belső tartományon ekvivariáns; a határon a nulla-padding miatt az állítás sérül. A stride esetén az ekvivariancia csak az részcsoport eltolásaira áll fenn. A labor a zero-fill, crop és circular shift, valamint a stride hatását méri. Egy CNN tehát nem automatikusan invariáns: az invarianciát külön aggregáló rétegeknek kell létrehozniuk.
A következő, 16.2. Pooling, downsampling és aliasing egység a pooling rétegeket vizsgálja. Ott az itt definiált invarianciafogalom válik mérhetővé: a max- és átlagpooling stride-dal kombinálva lokális invarianciát ad, de a downsampling aliasing-hoz vezethet. A 16.3. Elméleti és effektív recepciós mező egység pedig a recepciós mezőt általánosítja a többrétegű hálózatokra, ahol az ekvivariancia rétegenkénti összetétele kerül elő.