A 37.2. Backward és ellenőrzési lefedettség egységben levezettük a konvolúciós réteg értékeit, és az átfedő bemeneti foltok miatt az inputgradienst összegezéssel képeztük. Most ugyanazt az operátort matematikai leképezésként vizsgáljuk, és szétválasztjuk a bizonyított operátortulajdonságot a választott implementáció futási tulajdonságától. A szükséges előismeret a 37.2. Backward és ellenőrzési lefedettség referencia-ősszegező konvolúciója, a 4.3. Jacobi-mátrix, láncszabály és VJP alfejezetből a Jacobi-mátrix és a 13.2. Konvolúció és cross-correlation alfejezetből a cross-correlation definíciója.
Induló kérdés: egy -as, 1 csatornás képen -as kernellel, stride 1 és padding 0 mellett a bias nélküli réteg hány dimenzióból hány dimenzióba képez? Van-e lineáris inverze? Tippeljen, mielőtt a levezetést elolvassa; a választ a szakasz végén numerikusan is ellenőrizzük.
A [D10] szerint a Conv2d térbeli
cross-correlationt számol; a könyvben a
operátor ezt valósítja meg. Legyen a bemenet
,
a súly
,
a bias
,
a stride
,
a szimmetrikus zero padding
,
a dilation
.
A kimenet
,
ahol
és ugyanígy számolandó. Az alapeset , . A bias nélküli operátort jelöli, és a komponensenkénti definíció
A bias az összegzés után adódik hozzá: , ahol . Az -et vektorizálhatjuk sorrendben; ekkor a rögzített melletti lineáris leképezést egy mátrix reprezentálhat.
A „lineáris” szót itt a lineáris algebra pontos értelmében használjuk.
Tétel (a bias nélküli operátor linearitása). Rögzített , , , és alakok mellett a leképezés lineáris: minden azonos alakú bemenetre és minden -re
ha az összegzés tartománya mindkét oldalon ugyanaz a rács.
Bizonyítás. A homogenitáshoz írjuk be a definíciót. Az bemenetre a kimenet komponensenként:
Az additivitás ugyanezzel az indexfelbontással:
mert az összeadás a rögzített indexhalmazon tagonkénti. A két szumma éppen és komponense. ∎
A így lineáris operátor, de a biasos nem lineáris. Ennek közvetlen oka, hogy a lineáris leképezés a nullvektort nullvektorba viszi, míg
A affin: eltolással komponál lineáris leképezést. Az eltolás itt nem egy input-eltolás, hanem a kimeneti tér konstans eleme; ezért a -t nem lehet egyszerűen egy alakú bias nélküli operátorral helyettesíteni, hacsak nem bővítjük az inputot egy rögzített 1 értékű csatornával. A gyakorlatban a bias éppen ezt a bővítést valósítja meg anélkül, hogy a bemeneti tenzort meg kellene növelni.
A véges dimenziós tereken a szokásos valós belső szorzat a tenzorok Frobenius-szorzata:
Ezzel az euklideszi struktúrával definiálhatjuk a adjungáltját mint azt a leképezést, amelyre minden megfelelő alakú esetén
A [D11] szerint a ConvTranspose2d ennek az adjungált
operátornak a diszkrét megvalósítása a megfelelő stride, padding,
output_padding konvencióval; a dokumentáció és az [S01] is
megkülönbözteti a matematikai konvolúció inverzétől.
Tétel (adjungált azonosság). Rögzített mellett az és tenzorokra fennáll
ahol a jobb oldalon az összegzés azokra az indexekre megy, amelyek kielégítik a feltüntetett két egyenletet, és a indexhatárok automatikusan a definíciós tartományra szorítkoznak.
Bizonyítás. A bal oldal három egymásba ágyazott összeg: -szumma szerint, belső szumma szerint. Az összeadás kommutativitása miatt a szummákat tetszőlegesen átrendezhetjük, ha minden tag véges sokszor szerepel. Az indexeket az -indexek szerint csoportosítjuk: minden rögzített bemeneti pozícióhoz azok a súlypozíciók tartoznak, amelyekre létezik , hogy és . Ekkor a tag
és az minden -ra közös tényezőként emelhető ki a belső szummából. Ez adja a fenti jobb oldalt. ∎
A bizonyítás közvetlen következménye: a 37.2. Backward és ellenőrzési lefedettség alfejezetben levezetett képlet éppen , ha az upstream gradiens . A 37.2. Backward és ellenőrzési lefedettség overlap-összegzése tehát nem egy numerikus trükk, hanem az adjungált operátor definíciójának implementációja. A batchdimenzió és a csatornadimenzió független a térbeli átrendezéstől, ezért a levezetés tagonként azonos.
Az adjungáltságból nem következik invertálhatóság. A általában nem injektív, tehát nincs bal oldali inverz, és a sem általános inverz.
Állítás (dimenziócsökkenés). Ha , akkor a lineáris leképezés nem lehet injektív, így nem invertálható.
Bizonyítás. A rang–nullitás tétel szerint , és . Így , tehát létezik nemnulla , amelyre . ∎
A tisztán dimenziós érvelés után adjunk konkrét nulltér-elemet. Legyen , , , stride 1, padding 0. A kimenet , a leképezés . Válasszuk a kernelt
Ekkor a bal felső -es blokkra. Az
bemenetekre , noha . A tehát több különböző inputot képez ugyanabba az outputba; a kép jobb alsó sarka „nem látszik” a kimeneten.
Ugyanez a példa azt is mutatja, hogy a
nem adhat általános rekonstrukciót: a rekonstrukcióhoz szükséges
elveszett
komponens a kimenetből elvileg nem állítható elő, mert a kimenetbeli
minden tagja csak a
tartományból olvas. A későbbi ConvTranspose2d laborban
ezért sosem várunk allclose(x_hat, x) egyezést.
Legyen az infinite-lattice eltolása vektorral. A véges képet a zero padding zónán túl zérusnak tekintve -et kiterjesztjük -re; ugyanez a kiterjesztés érvényes -re is. A kernel súlyai pozíciófüggetlenek, ezért stride 1 és zero padding mellett a konvolúció minden egész eltolással kommutál:
Bizonyítás (váz). A definíciójában a kernelindexek szerinti összegzés ugyanaz marad, ha a bemeneti indexet helyett írjuk; mivel a padding zóna is eltolódik a alatt, az összegzés tartománya invariáns. Az output oldalán ugyanez az eredmény a -vel eltolt pozíció.
A határfeltétel két ponton szűkíti ezt az állítást.
Ellenpélda stride 2-re. Legyen , , stride 2, pad 0, , tehát , output . Legyen az inputban , a többi 0. Ekkor a outputban 1. Toljuk el a bemenetet-gyel: a delta a pozícióba kerül, amely nincs a mintavételi rácson, ezért . Másrészt az output -eltolása a -re kiterjesztett -en az 1-et a pozícióba viszi, tehát . A két oldal különbözik.
Határ-ellenpélda replicate paddingre. Legyen , , kernel -es identitás, stride 1, replicate padding 1. Input: a pixel 1, a többi 0. A replicate padding a jobb szélső oszlopot másolja a padding zónába, ezért az -ös kimeneten a , , pozíciókban 1. Most toljuk az inputot jobbra 1-gyel a zéróval kiterjesztett infinite-rácson: az input delta kilép a -as ablakból, így . Ezzel szemben az output jobbra tolva nem nulla: a és pozícióban 1. A replicate padding tehát a határnál megtöri az equivarianciát, mert a paddingérték az ablakhatártól függ, nem pedig a shiftelt infinite-rács kiterjesztésétől. Ez a példa egyben a „boundary counterexample” szerepét tölti be: a határkezelés választása nem semleges operátorazonosság, hanem további előfeltétel.
A 37.2. Backward és ellenőrzési lefedettség.
egységben elkészített reference_conv.py felületét
használjuk. Az alábbi szkript a lab/ munkakönyvtárból
futtatható, feltételezve, hogy a 37.2. Backward és
ellenőrzési lefedettség referenciája az NCHW bemenetet,
groups=1-et, szimmetrikus paddinget és a fent definiált
összegző képletet valósítja meg. A kód az adjungált tesztet a belső
szorzat azonossággal, a linearitást két oldal összehasonlításával, a
nem-invertálhatóságot a nulltér-példával, az equivariancia-korlátot
pedig a stride=2 és replicate példák ellenőrzésével vizsgálja.
# lab/n147_operator_report.py
import numpy as np
# A n146 saját referenciája; az aláírás az ott rögzített specifikációt követi.
from reference_conv import conv2d_forward_np as conv_ref
rng = np.random.default_rng(20261020)
tol = 1e-12
# 1) Linearitás bias nélkül
X1 = rng.normal(size=(1, 2, 5, 5)).astype(np.float64)
X2 = rng.normal(size=(1, 2, 5, 5)).astype(np.float64)
K = rng.normal(size=(3, 2, 3, 3)).astype(np.float64)
left = conv_ref(X1 + X2, K, bias=None, padding=1, stride=1)
right = conv_ref(X1, K, bias=None, padding=1, stride=1) + conv_ref(X2, K, bias=None, padding=1, stride=1)
print("linearity max|left-right|:", np.max(np.abs(left - right)))
assert np.allclose(left, right, atol=tol, rtol=tol)
# 2) Adjungált azonosság: <T_K X, Y> == <X, T_K^* Y>
Y = rng.normal(size=(1, 3, 5, 5)).astype(np.float64) # stride=1, pad=1, k=3 => H_out=5
TX = conv_ref(X1, K, bias=None, padding=1, stride=1)
TstarY = conv_ref(Y, np.transpose(K, (1, 0, 2, 3))[:, :, ::-1, ::-1],
bias=None, padding=1, stride=1) # a transposed operátor a kernelfordítással
print("adjoint lhs:", np.sum(TX * Y))
print("adjoint rhs:", np.sum(X1 * TstarY))
assert np.allclose(np.sum(TX * Y), np.sum(X1 * TstarY), atol=1e-10, rtol=1e-10)A fenti conv_ref hívás bias=None
argumentuma a 37.2. Backward és ellenőrzési
lefedettség specifikációjában azt jelenti, hogy a biasvektor
elhagyható; ha a saját függvény más aláírást használ, a hívást igazítsa
hozzá. A transposed operátor kernelkonvenciója: az adjungáltban a súlyt
a kimeneti–bemeneti csatornák felcserélésével és a két térbeli tengely
megfordításával kapjuk, mert a cross-correlation kernelje az adjungált
képletben pontosan így jelenik meg.
A jegyzőkönyv formátuma a 36.3. Szakirodalmi reprodukció és attribúció. mintát követi:
| Állítás | Típus | Ellenőrzés | Várt eredmény |
|---|---|---|---|
| lineáris | tétel, fent bizonyítva | numerikus a referencián, seed 20261020, float64 | max eltérés |
| adjungált | tétel, fent bizonyítva | belső szorzat-azonosság | relatív eltérés |
| nem invertálható | ellenpélda | nulltér | két különböző input azonos outputot ad |
| stride=2 equivariance korlát | ellenpélda | , , delta input |
A kimeneti sorok a képletekből számított elvárt
értékek, nem mért futási eredmény; a 37.2.
Backward és ellenőrzési lefedettség referenciakóddal való tényleges
futtatáskor ugyanezeket a tűréseket kell reprodukálni. A parancs a
lab könyvtárból:
python n147_operator_report.pyA szkript célja nem a sebesség mérése, hanem a matematikai jegyzőkönyv négy sorának gépi kontrollja.
F1 (fogalmi, nehézség 1). Pontosan idézze fel a lineáris leképezés két axiómáját, és mutassa meg egy konkrét, bemenetű, , stride 1, padding 0 konvolúción, miért sérti meg a két axiómát a bias. Elvárt átadandó: az axiómák nevei, két olyan konkrét input, amelyre a homogenitás vagy additivitás ellentmondásba kerül, és a kiszámolt outputok.
F2 (levezetési, nehézség 2). Vezesse le a teljes mátrixát a , , , , stride 1, padding 0, esetre, és ellenőrizze a azonosságot egy olyan -szel, amelynek minden eleme 1, és -nal, amelynek minden eleme 1. Elvárt átadandó: a konkrét -es mátrixa, a két belső szorzat kiszámítása, és annak indoklása, miért térhetnek el az egyes komponensek, miközben az összeg egyezik.
F3 (implementációs, nehézség 1). Egészítse ki a 37.2. Backward és ellenőrzési lefedettség
referenciakódját egy test_linear_adjoint függvénnyel, amely
a fenti laborban megadott seed mellett ellenőrzi a linearitást és az
adjungált azonosságot, majd három különböző padding értékre
is futtatja. Elvárt átadandó: a függvény forrása, a futtatási parancs, a
három assert feltétele, és a tolerancia indoklása.
F4 (hibakeresési, nehézség 2). Az alábbi hibás érvelés szerint egy réteg rekonstruálható az adjungálttal:
x_hat = conv_transpose(conv(x, K), K_flipped) # remélt x
assert np.allclose(x_hat, x) # gyakran elhasalLokalizálja a hibát az operátor tulajdonságaira hivatkozva, mutassa meg a -es példán a rekonstrukció kudarcát, és adja meg a javítás módját: mit lehet és mit nem lehet ebből a műveletpárból garantálni. Elvárt átadandó: az ok, a következmény, a javított assert, és az ellenőrzés visszaigazolása.
F5 (kísérlettervezési, nehézség 3). Tervezzen megismételhető vizsgálatot, amely a reflect padding equivarianciáját a véges kép határa mentén összehasonlítja a zero paddinggel. Használja a 36.3. Szakirodalmi reprodukció és attribúció. protokollsablonját. Elvárt átadandó: kérdés, hipotézis, megfigyelési egység, baseline, változó tényező, metrika (például max abszolút eltérés ), a használt véges shiftlista, a számítási keret, és az érvényességi korlát leírása. Előre megadott eredmény nem elvárt; a kézzel kiszámolt replicate ellenpéldát referenciaesetként kell szerepeltetni.
F1. A lineáris leképezés axiómái: (additivitás) és (homogenitás). A biasos rétegben legyen , , , bemenet , kimenet . Ekkor , , ezért . Ugyanakkor , tehát , az additivitás sérül. A homogenitás is sérül például -re és -re: ? Ez éppen egyezik; a homogenitás sérülése általában -val látszik: . A biasos réteg affin, nem lineáris.
F2. A minden elemét 1-nek választva minden kimeneti eleme . A belső szorzat . A komponenseit az adjungált indexfeltétel adja: minden bemeneti pozícióra azon kombinációk összege, amelyekre , . A kiszámított mátrix:
és az elemek összege , egyezik. A komponensek eltérése abból fakad, hogy a határpixelek kevesebb output-patchben szerepelnek; a azonban a teljes összeget őrzi meg, mert az indexcsere minden tagot pontosan egyszer számol.
F3. Egy lehetséges teljes függvény:
def test_linear_adjoint(rng=20261020):
rng = np.random.default_rng(rng)
X1 = rng.normal(size=(1, 2, 7, 7)).astype(np.float64)
X2 = rng.normal(size=(1, 2, 7, 7)).astype(np.float64)
K = rng.normal(size=(3, 2, 3, 3)).astype(np.float64)
for pad in (0, 1, 2):
left = conv_ref(X1 + X2, K, bias=None, padding=pad, stride=1)
right = conv_ref(X1, K, bias=None, padding=pad, stride=1) + conv_ref(X2, K, bias=None, padding=pad, stride=1)
assert np.allclose(left, right, atol=1e-12, rtol=1e-12)
Y = rng.normal(size=left.shape).astype(np.float64)
TstarY = conv_ref(Y, np.transpose(K, (1, 0, 2, 3))[:, :, ::-1, ::-1], bias=None, padding=pad, stride=1)
assert np.allclose(np.sum(left * Y), np.sum(X1 * TstarY), atol=1e-10, rtol=1e-10)
return "OK"A toleranciát a float64 összegzési hibája és az adjungáltnál az
-eltolású
transposed rács konvenciója indokolja; a 1e-12 az additív,
a 1e-10 a szorzatösszeg relatív hibájára szól. A
esetben a transposed hívás és az adjungált indexfeltétel bemeneti
tartománya pontosan illeszkedik a padding=pad konvencióhoz;
a három paddingérték a null-, kis- és nagy-padding szélső eseteket
fedi.
F4. A hiba oka: az adjungált nem általános inverz. A
leképezés nem injektív, ezért bármely lineáris
leképezésre
sem lehet identitás
-en;
a
önadjungált, de nem invertálható. A
-as,
-es
kernel példán a jobb alsó
pixel semelyik outputra nem hat, így a transposed út sem állíthatja
vissza. A assert np.allclose(x_hat, x) ezért szükségszerűen
megbukik. A javítás: az adjungáltat kizárólag a belső szorzat
azonossággal ellenőrizzük, a rekonstrukciós állítást pedig csak akkor
fogalmazzuk meg, ha teljes rangú, négyzetes operátorral dolgozunk; a
jelen példában ez nem áll fenn. A javított teszt a labor 2. pontja.
F5. A protokoll a 36.3. Szakirodalmi reprodukció és attribúció. sablonja szerint: kérdés, hogy a reflect padding a határ mentén megtöri-e a shift-ekvivarianciát; hipotézis, hogy legalább egy határmenti shiftre eltérés van; megfigyelési egység egy -es, rögzített seeddel generált véletlen kép; baseline a zero padding ugyanazon kernelre és shiftre; változó tényező a padding módja; metrika , ahol a rács eltolása a megfelelő kiterjesztéssel; a számítási keret a 37.2. Backward és ellenőrzési lefedettség NumPy-referenciája CPU-n, float64. A teszt akkor érvényes, ha a zero padding minden esetén a numerikus tűrésen belül, a reflect padding viszont legalább egy -nél pozitív , és a kézzel kiszámolt replicate/reflect ellenpélda minimálisan reprodukálódik. A korlát: az észlelt hiba a padding-implementáció és a rögzített ablak határán mérhető jelenség; nem általános bizonyítás tetszőleges képre, de egy ellenpélda az equivarianciát mint univerzális állítást megcáfolja.
Gyakori hiba, hogy a matematikai operátor és a választott gyors implementáció futási költségét azonosítják. Például egy -as kernel hatása felírható naiv összegzéssel, im2col bontással, Winograd-gyorsítással vagy depthwise separable közelítéssel; ez utóbbi gyorsabb lehet, de más operátort ad. Az az állítás, hogy „a gyorsabb implementáció nem lineáris, mert hardveresen szaturál”, az operátortulajdonságra nem vonatkozik, csak az implementáció numerikus tartományára. Megfordítva: abból, hogy két implementáció azonos matematikai -t számol, nem következik azonos futási költség vagy azonos numerikus hiba. Az operátor linearitását, adjungáltságát és equivarianciáját a definiáló összegzésből bizonyítjuk; a futási idő mérése külön, a 24.2. CPU/GPU profiling és helyes időmérés alfejezetben tárgyalt protokollt igénylő empirikus állítás.
Ellenőrizze a levezetést négy ponton: a bias nélküli nullvektorra nullát ad; az adjungált azonosság jobb oldalán az összegzés valóban az -indexek szerint csoportosít; a stride=2 példában a mintavételi rács ; a replicate példában az output shift a paddingos output egész rácsán értelmezett, nem a ablak csonkításán. A 37.2. Backward és ellenőrzési lefedettség alfejezetből idézzük vissza, hogy az inputgradiens overlap-összegzése pontosan az itt bizonyított ; a 36.3. Szakirodalmi reprodukció és attribúció alfejezetből a jegyzőkönyv formátuma; a 33.3. torch.export és ONNX alfejezetből, hogy az export ekvivalenciájának ellenőrzése ugyanilyen feltételeket és toleranciát igényel; a 25.3. Kis adat és feature-alapú baseline alfejezetből pedig azt, hogy a lineáris pixelmodell is operátor, és reprezentációértékelésnél a leképezés tulajdonságait a tanulási kísérlettől külön kell kezelni.
A bias nélküli cross-correlation
lineáris operátor, mert a definiáló összegzés tagonként homogenitást és
additivitást ad; a biasos réteg affin, de nem lineáris. A
Frobenius-belső szorzatra nézve az adjungált indexcserével bizonyítható,
és a ConvTranspose2d-féle operátort adja; ez nem általános
inverz. A nem-invertálhatóságot dimenziócsökkenéssel és konkrét
nulltér-elemmel mutattuk. A shift-ekvivariancia stride 1 és zero padding
mellett teljesül az infinite-rácson, de stride
-nél
csak az
-részcsoportra,
replicate paddingnél pedig a határon sem. A referenciakódos jegyzőkönyv
minden állítást analitikus és numerikus kettős kontroll alá helyez.
A 37.4. Rétegből kis tanulómodell egység ezt az operátort kis tanulómodellé építi: a réteg paramétereit gradienslépéssel tanítjuk, ahol a backward éppen a művelet, a linearitás pedig a gradienslinearitást garantálja. A 37.4. Rétegből kis tanulómodell laborjában az itteni jegyzőkönyvteszteket a tanítás előtti automatikus ellenőrzésként futtatjuk.
Felhasznált források: