37.3 Linearitás, adjungált és határfeltétel

37.3.1 Cél, előismeret és induló kérdés

A 37.2. Backward és ellenőrzési lefedettség egységben levezettük a konvolúciós réteg ∇X,∇K,∇b\nabla_X,\nabla_K,\nabla_b é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 3×33\times3-as, 1 csatornás képen 3×33\times3-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.

37.3.2 Operátordefiníció és jelölések

A [D10] szerint a Conv2d térbeli cross-correlationt számol; a könyvben a TT operátor ezt valósítja meg. Legyen a bemenet X∈ℝN×Cin×H×WX\in\mathbb R^{N\times C_{in}\times H\times W}, a súly K∈ℝCout×Cin×kh×kwK\in\mathbb R^{C_{out}\times C_{in}\times k_h\times k_w}, a bias b∈ℝCoutb\in\mathbb R^{C_{out}}, a stride s≥1s\ge1, a szimmetrikus zero padding p≥0p\ge0, a dilation d≥1d\ge1. A kimenet Y=TK,b(X)∈ℝN×Cout×Hout×WoutY=T_{K,b}(X)\in\mathbb R^{N\times C_{out}\times H_{out}\times W_{out}}, ahol

Hout=⌊H+2p−d(kh−1)−1s⌋+1,H_{out}=\left\lfloor\frac{H+2p-d(k_h-1)-1}{s}\right\rfloor+1,

és WoutW_{out} ugyanígy számolandó. Az alapeset d=1d=1, s=1s=1. A bias nélküli operátort TK=TK,0T_K=T_{K,0} jelöli, és a komponensenkénti definíció

TK(X)n,o,i,j=∑c=0Cin−1∑u=0kh−1∑v=0kw−1Xn,c,si−p+u,sj−p+vKo,c,u,v.T_K(X)_{n,o,i,j}=\sum_{c=0}^{C_{in}-1}\sum_{u=0}^{k_h-1}\sum_{v=0}^{k_w-1}X_{n,c,\,si-p+u,\,sj-p+v}\,K_{o,c,u,v}.

A bias az összegzés után adódik hozzá: TK,b(X)=TK(X)+BT_{K,b}(X)=T_K(X)+B, ahol Bn,o,i,j=boB_{n,o,i,j}=b_o. Az XX-et vektorizálhatjuk vec(X)∈ℝNCinHW\mathrm{vec}(X)\in\mathbb R^{N C_{in} H W} sorrendben; ekkor a rögzített KK melletti TKT_K lineáris leképezést egy MK∈ℝ(NCoutHoutWout)×(NCinHW)M_K\in\mathbb R^{(N C_{out}H_{out}W_{out})\times(N C_{in} H W)} mátrix reprezentálhat.

37.3.3 A bias nélküli linearitás

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 KK, ss, pp, dd és alakok mellett a TKT_K leképezés lineáris: minden X1,X2X_1,X_2 azonos alakú bemenetre és minden α∈ℝ\alpha\in\mathbb R-re

TK(X1+X2)=TKX1+TKX2,TK(αX1)=αTKX1,T_K(X_1+X_2)=T_K X_1+T_K X_2,\qquad T_K(\alpha X_1)=\alpha T_K X_1,

ha az összegzés tartománya mindkét oldalon ugyanaz a Hout×WoutH_{out}\times W_{out} rács.

Bizonyítás. A homogenitáshoz írjuk be a definíciót. Az αX1\alpha X_1 bemenetre a kimenet komponensenként:

TK(αX1)n,o,i,j=∑c,u,v(αX1)n,c,si−p+u,sj−p+vKo,c,u,v=α∑c,u,vX1,n,c,si−p+u,sj−p+vKo,c,u,v=αTK(X1)n,o,i,j.T_K(\alpha X_1)_{n,o,i,j}=\sum_{c,u,v}(\alpha X_1)_{n,c,\,si-p+u,\,sj-p+v}K_{o,c,u,v} =\alpha\sum_{c,u,v}X_{1,n,c,\,si-p+u,\,sj-p+v}K_{o,c,u,v} =\alpha T_K(X_1)_{n,o,i,j}.

Az additivitás ugyanezzel az indexfelbontással:

TK(X1+X2)n,o,i,j=∑c,u,v(X1+X2)n,c,si−p+u,sj−p+vKo,c,u,v=∑c,u,vX1,n,c,…Ko,c,u,v+∑c,u,vX2,n,c,…Ko,c,u,v,T_K(X_1+X_2)_{n,o,i,j} =\sum_{c,u,v}(X_1+X_2)_{n,c,\,si-p+u,\,sj-p+v}K_{o,c,u,v} =\sum_{c,u,v}X_{1,n,c,\dots}K_{o,c,u,v}+\sum_{c,u,v}X_{2,n,c,\dots}K_{o,c,u,v},

mert az összeadás a rögzített indexhalmazon tagonkénti. A két szumma éppen TKX1T_K X_1 és TKX2T_K X_2 komponense. ∎

A TKT_K így lineáris operátor, de a biasos TK,bT_{K,b} nem lineáris. Ennek közvetlen oka, hogy a lineáris leképezés a nullvektort nullvektorba viszi, míg

TK,b(0)=B≠0,ha b≠0.T_{K,b}(0)=B\neq0,\quad\text{ha }b\neq0.

A TK,bT_{K,b} 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 BB eleme; ezért a TK,bT_{K,b}-t nem lehet egyszerűen egy TK′T_{K'} 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.

37.3.4 Adjungált azonosság és a transposed convolution

A véges dimenziós tereken a szokásos valós belső szorzat a tenzorok Frobenius-szorzata:

⟨A,B⟩F=∑n,o,i,jAn,o,i,jBn,o,i,j.\langle A,B\rangle_F=\sum_{n,o,i,j}A_{n,o,i,j}B_{n,o,i,j}.

Ezzel az euklideszi struktúrával definiálhatjuk a TKT_K adjungáltját mint azt a TK*T_K^* leképezést, amelyre minden megfelelő alakú X,YX,Y esetén

⟨TKX,Y⟩F=⟨X,TK*Y⟩F.\langle T_K X,Y\rangle_F=\langle X,T_K^* Y\rangle_F.

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 K,s,pK,s,p mellett az X∈ℝN×Cin×H×WX\in\mathbb R^{N\times C_{in}\times H\times W} és Y∈ℝN×Cout×Hout×WoutY\in\mathbb R^{N\times C_{out}\times H_{out}\times W_{out}} tenzorokra fennáll

∑n,o,i,jYn,o,i,j∑c,u,vXn,c,si−p+u,sj−p+vKo,c,u,v=∑n,c,p,qXn,c,p,q∑o,u,vp=si−ppad+uq=sj−ppad+vYn,o,i,jKo,c,u,v,\sum_{n,o,i,j}Y_{n,o,i,j}\sum_{c,u,v}X_{n,c,\,si-p+u,\,sj-p+v}K_{o,c,u,v} =\sum_{n,c,p,q}X_{n,c,p,q}\sum_{\substack{o,u,v\\ p=si-p_{pad}+u\\ q=sj-p_{pad}+v}}Y_{n,o,i,j}K_{o,c,u,v},

ahol a jobb oldalon az összegzés azokra az (i,j,u,v)(i,j,u,v) indexekre megy, amelyek kielégítik a feltüntetett két egyenletet, és a pqp_q indexhatárok automatikusan a definíciós tartományra szorítkoznak.

Bizonyítás. A bal oldal három egymásba ágyazott összeg: YY-szumma n,o,i,jn,o,i,j szerint, belső szumma c,u,vc,u,v szerint. Az összeadás kommutativitása miatt a szummákat tetszőlegesen átrendezhetjük, ha minden tag véges sokszor szerepel. Az indexeket az XX-indexek szerint csoportosítjuk: minden rögzített (c,p,q)(c,p,q) bemeneti pozícióhoz azok a (o,u,v)(o,u,v) súlypozíciók tartoznak, amelyekre létezik (i,j)(i,j), hogy p=si−ppad+up=si-p_{pad}+u és q=sj−ppad+vq=sj-p_{pad}+v. Ekkor a tag

Yn,o,i,jXn,c,p,qKo,c,u,v,Y_{n,o,i,j}\,X_{n,c,p,q}\,K_{o,c,u,v},

és az Xn,c,p,qX_{n,c,p,q} minden p,qp,q-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 ∇X\nabla_X képlet éppen TK*(Y)T_K^*(Y), ha az upstream gradiens YY. 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ó NN és a csatornadimenzió CC független a térbeli átrendezéstől, ezért a levezetés tagonként azonos.

37.3.5 Nem-invertálhatósági példa

Az adjungáltságból nem következik invertálhatóság. A TKT_K általában nem injektív, tehát nincs bal oldali inverz, és a TK*T_K^* sem általános inverz.

Állítás (dimenziócsökkenés). Ha CinHW>CoutHoutWoutC_{in}HW>C_{out}H_{out}W_{out}, akkor a TK:ℝCinHW→ℝCoutHoutWoutT_K:\mathbb R^{C_{in}HW}\to\mathbb R^{C_{out}H_{out}W_{out}} lineáris leképezés nem lehet injektív, így nem invertálható.

Bizonyítás. A rang–nullitás tétel szerint dimkerTK+dimranTK=dim(input)=CinHW\dim\ker T_K+\dim\operatorname{ran}T_K=\dim(\text{input})=C_{in}HW, és dimranTK≤CoutHoutWout\dim\operatorname{ran}T_K\le C_{out}H_{out}W_{out}. Így dimkerTK≥CinHW−CoutHoutWout>0\dim\ker T_K\ge C_{in}HW-C_{out}H_{out}W_{out}>0, tehát létezik nemnulla XX, amelyre TKX=0T_K X=0. ∎

A tisztán dimenziós érvelés után adjunk konkrét nulltér-elemet. Legyen N=Cin=Cout=1N=C_{in}=C_{out}=1, H=W=3H=W=3, kh=kw=2k_h=k_w=2, stride 1, padding 0. A kimenet 2×22\times2, a leképezés ℝ9→ℝ4\mathbb R^9\to\mathbb R^4. Válasszuk a kernelt

K=(1000).K=\begin{pmatrix}1&0\\0&0\end{pmatrix}.

Ekkor Yi,j=Xi,jY_{i,j}=X_{i,j} a bal felső 2×22\times2-es blokkra. Az

X1=(000000001),X2=(000000000)X_1=\begin{pmatrix}0&0&0\\0&0&0\\0&0&1\end{pmatrix},\qquad X_2=\begin{pmatrix}0&0&0\\0&0&0\\0&0&0\end{pmatrix}

bemenetekre TKX1=TKX2=0T_K X_1=T_K X_2=0, noha X1≠X2X_1\neq X_2. A TKT_K 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 TK*:ℝ4→ℝ9T_K^*:\mathbb R^4\to\mathbb R^9 nem adhat általános rekonstrukciót: a rekonstrukcióhoz szükséges elveszett X2,2X_{2,2} komponens a kimenetből elvileg nem állítható elő, mert a kimenetbeli Yi,jY_{i,j} minden tagja csak a 0≤i,j≤10\le i,j\le1 tartományból olvas. A későbbi ConvTranspose2d laborban ezért sosem várunk allclose(x_hat, x) egyezést.

37.3.6 Eltolási equivariance és annak határfeltétele

Legyen τv\tau_v az infinite-lattice ℤ2\mathbb Z^2 eltolása v=(vh,vw)v=(v_h,v_w) vektorral. A véges képet a zero padding zónán túl zérusnak tekintve XX-et kiterjesztjük ℤ2\mathbb Z^2-re; ugyanez a kiterjesztés érvényes TKXT_K X-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:

TK(τvX)=τv(TKX),s=1.T_K(\tau_v X)=\tau_v(T_K X),\qquad s=1.

Bizonyítás (váz). A TKT_K definíciójában a kernelindexek (u,v)(u,v) szerinti összegzés ugyanaz marad, ha a bemeneti indexet p+qp+q helyett p+vh+up+v_h+u írjuk; mivel a padding zóna is eltolódik a τv\tau_v alatt, az összegzés tartománya invariáns. Az output oldalán ugyanez az eredmény a vv-vel eltolt pozíció.

A határfeltétel két ponton szűkíti ezt az állítást.

  1. Stride-részcsoport. Ha s>1s>1, az equivariance csak az sℤ2s\mathbb Z^2 rács eltolásaira áll: TK(τsuX)=τsuTK(X)T_K(\tau_{s u}X)=\tau_{s u}T_K(X) minden u∈ℤ2u\in\mathbb Z^2-re, de egy általános vv eltolásra nem. Ennek oka, hogy az output csak minden ss-edik rácsponton mintavételez.
  2. Nem zéró padding. A reflect/replicate padding szabálya a véges ablak határához kötött, ezért nem viselkedik transzláció-invariáns kiterjesztésként. Itt a τv\tau_v-equivariance már stride 1 mellett is meghiúsul a határ közelében.

Ellenpélda stride 2-re. Legyen H=W=4H=W=4, k=2k=2, stride 2, pad 0, K=(1000)K=\begin{pmatrix}1&0\\0&0\end{pmatrix}, tehát Yi,j=X2i,2jY_{i,j}=X_{2i,2j}, output 2×22\times2. Legyen az inputban X0,0=1X_{0,0}=1, a többi 0. Ekkor TKXT_K X a (0,0)(0,0) outputban 1. Toljuk el a bemenetetτ(0,1)\tau_{(0,1)}-gyel: a delta a (0,1)(0,1) pozícióba kerül, amely nincs a 2ℤ22\mathbb Z^2 mintavételi rácson, ezért TK(τ(0,1)X)=0T_K(\tau_{(0,1)}X)=0. Másrészt az output τ(0,1)\tau_{(0,1)}-eltolása a ℤ2\mathbb Z^2-re kiterjesztett TKXT_K X-en az 1-et a (0,1)(0,1) pozícióba viszi, tehát τ(0,1)TKX≠0\tau_{(0,1)}T_K X\neq0. A két oldal különbözik.

Határ-ellenpélda replicate paddingre. Legyen N=Cin=Cout=1N=C_{in}=C_{out}=1, H=W=3H=W=3, kernel 1×11\times1-es identitás, stride 1, replicate padding 1. Input: a (0,2)(0,2) pixel 1, a többi 0. A replicate padding a jobb szélső oszlopot másolja a padding zónába, ezért TKXT_K X az 5×55\times5-ös kimeneten a (0,2)(0,2), (0,3)(0,3), (0,4)(0,4) 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 3×33\times3-as ablakból, így TK(τ(0,1)X)=0T_K(\tau_{(0,1)}X)=0. Ezzel szemben az output jobbra tolva nem nulla: τ(0,1)TKX\tau_{(0,1)}T_K X a (0,3)(0,3) és (0,4)(0,4) 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.

37.3.7 Labor: matematikai jegyzőkönyv a referenciakódhoz

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
TKT_K lineáris tétel, fent bizonyítva numerikus a referencián, seed 20261020, float64 max eltérés <10−12<10^{-12}
TK*T_K^* adjungált tétel, fent bizonyítva belső szorzat-azonosság relatív eltérés <10−10<10^{-10}
TKT_K nem invertálható ellenpélda 3×3→2×23\times3\to2\times2 nulltér két különböző input azonos outputot ad
stride=2 equivariance korlát ellenpélda 4×44\times4, k=2k=2, delta input TKτX≠τTKXT_K\tau X\neq\tau T_K X

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.py

A szkript célja nem a sebesség mérése, hanem a matematikai jegyzőkönyv négy sorának gépi kontrollja.

37.3.8 Feladatok

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, 1×1×2×21\times1\times2\times2 bemenetű, k=2k=2, stride 1, padding 0 konvolúción, miért sérti meg a két axiómát a b=2b=2 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 TK*T_K^* teljes mátrixát a Cin=Cout=1C_{in}=C_{out}=1, H=3H=3, W=4W=4, k=2k=2, stride 1, padding 0, K=(1234)K=\begin{pmatrix}1&2\\3&4\end{pmatrix} esetre, és ellenőrizze a ⟨TKX,Y⟩=⟨X,TK*Y⟩\langle T_K X,Y\rangle=\langle X,T_K^*Y\rangle azonosságot egy olyan XX-szel, amelynek minden eleme 1, és YY-nal, amelynek minden eleme 1. Elvárt átadandó: a T*YT^*Y konkrét 3×43\times4-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 elhasal

Lokalizálja a hibát az operátor tulajdonságaira hivatkozva, mutassa meg a 3×3→2×23\times3\to2\times2-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 TKτv−τvTKT_K\tau_v-\tau_vT_K), 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.

37.3.9 Megoldások és indoklás

F1. A lineáris leképezés axiómái: L(x1+x2)=L(x1)+L(x2)L(x_1+x_2)=L(x_1)+L(x_2) (additivitás) és L(αx)=αL(x)L(\alpha x)=\alpha L(x) (homogenitás). A b=2b=2 biasos rétegben legyen K=(1000)K=\begin{pmatrix}1&0\\0&0\end{pmatrix}, X1=(1000)X_1=\begin{pmatrix}1&0\\0&0\end{pmatrix}, X2=(0001)X_2=\begin{pmatrix}0&0\\0&1\end{pmatrix}, bemenet 2×22\times2, kimenet 1×11\times1. Ekkor TK,b(X1)=1+2=3T_{K,b}(X_1)=1+2=3, TK,b(X2)=0+2=2T_{K,b}(X_2)=0+2=2, ezért T(X1)+T(X2)=5T(X_1)+T(X_2)=5. Ugyanakkor TK,b(X1+X2)=1+2=3T_{K,b}(X_1+X_2)=1+2=3, tehát 3≠53\neq5, az additivitás sérül. A homogenitás is sérül például X1X_1-re és α=2\alpha=2-re: T(2X1)=4+2=6≠2⋅3=6T(2X_1)=4+2=6\neq2\cdot3=6? Ez éppen egyezik; a homogenitás sérülése általában α=0\alpha=0-val látszik: T(0)=2≠0⋅T(X1)=0T(0)=2\neq0\cdot T(X_1)=0. A biasos réteg affin, nem lineáris.

F2. A YY minden elemét 1-nek választva TKXT_K X minden kimeneti eleme 1+2+3+4=101+2+3+4=10. A belső szorzat ⟨TKX,Y⟩=6⋅10=60\langle T_K X,Y\rangle=6\cdot10=60. A TK*YT_K^*Y komponenseit az adjungált indexfeltétel adja: minden (p,q)(p,q) bemeneti pozícióra azon (i,j,u,v)(i,j,u,v) kombinációk összege, amelyekre p=i+up=i+u, q=j+vq=j+v. A kiszámított mátrix:

TK*Y=(13324101063774),T_K^*Y=\begin{pmatrix}1&3&3&2\\4&10&10&6\\3&7&7&4\end{pmatrix},

és az elemek összege 1+3+3+2+4+10+10+6+3+7+7+4=601+3+3+2+4+10+10+6+3+7+7+4=60, egyezik. A komponensek eltérése abból fakad, hogy a határpixelek kevesebb output-patchben szerepelnek; a ⟨X,T*Y⟩\langle X,T^*Y\rangle 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 HoutH_{out}-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 p=0p=0 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 TK:ℝ9→ℝ4T_K:\mathbb R^9\to\mathbb R^4 leképezés nem injektív, ezért bármely lineáris UU leképezésre UTKU T_K sem lehet identitás ℝ9\mathbb R^9-en; a TK*TKT_K^*T_K önadjungált, de nem invertálható. A 3×33\times3-as, 2×22\times2-es kernel példán a jobb alsó X2,2X_{2,2} 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 7×77\times7-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 e(v)=maxn,o,i,j|TK(τvX)−τvTK(X)|e(v)=\max_{n,o,i,j}|T_K(\tau_vX)-\tau_vT_K(X)|, ahol τv\tau_v a v∈{−1,0,1}2v\in\{-1,0,1\}^2 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 vv esetén e(v)=0e(v)=0 a numerikus tűrésen belül, a reflect padding viszont legalább egy vv-nél pozitív e(v)e(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.

37.3.10 Tipikus tévedés és ellenpélda

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 3×33\times3-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 TKT_K-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.

37.3.11 Önellenőrzés és korábbi fogalom visszahívása

Ellenőrizze a levezetést négy ponton: a bias nélküli TKT_K nullvektorra nullát ad; az adjungált azonosság jobb oldalán az összegzés valóban az XX-indexek szerint csoportosít; a stride=2 példában a mintavételi rács 2ℤ22\mathbb Z^2; a replicate példában az output shift a paddingos output egész rácsán értelmezett, nem a HoutH_{out} 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 TK*T_K^*; 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.

37.3.12 Rövid összefoglaló

A bias nélküli cross-correlation TKT_K 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 s>1s>1-nél csak az sℤ2s\mathbb Z^2-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.

37.3.13 Következő alkalmazás és források

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 TK*T_K^* 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: