21.1 Inicializálás és varianciaterjedés

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

Ennek az alfejezetnek a célja, hogy a súlyok inicializálását ne könyvtári „varázsparaméterként”, hanem becsülhető jelterjedési jelenségként értse meg: hogyan válasszuk meg a kezdeti súlyok szórását úgy, hogy a háló elején a forward aktivációk és a backward gradiensek nagyságrendje ne omoljon össze, illetve ne robbanjon fel. Az előfeltételek közül a 6.4. Momentum és adaptív optimizálók alfejezetből a gradienslépések állapotváltozóit, a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció alfejezetből a numerikus stabilitás iránti érzékenységet, a 12.4. III. ellenőrző pont: önállóan tanuló kis háló alfejezetből a teljes tanítási ciklust, a 18.4. Reziduális blokk ablatív vizsgálata alfejezetből pedig a mélységgel növekvő normaszorzati hatásokat idézzük fel. A rétegenkénti számítást a perceptron affin score-jára, s(x)=w⊤x+bs(x)=w^\top x+b-re (9.1. Neuron és perceptron), az architekturális motivációt a LeNet réteges felépítésére (17.1. LeNet és a lokális megosztott reprezentáció), az előtanított és a frissen inicializált súly fogalmi különbségét pedig a 20.1. Feature extractor és új fej alfejezetre építjük.

Induló becslésként gondoljuk végig: ha egy LL rétegű háló minden rétege qq-szorosára változtatja a jel szórását, akkor a bemeneti szórás az LL. réteg után közelítőleg qLq^L-szeresére módosul. Amennyiben q=0,9q=0{,}9, ötven réteg után a jel nagyságrendje 0,950≈0,0050{,}9^{50}\approx 0{,}005-szorosára csökken; ha q=1,1q=1{,}1, akkor 1,150≈1171{,}1^{50}\approx 117-szeresére nő. A kérdés tehát az, milyen feltételek mellett lehet qq-t kezdéskor 1 közelébe állítani, és miért nem jelenti ez automatikusan a teljes tanítási folyamat stabilitását.

21.1.2 Definíciók és intuíció

Fan-in, fan-out. Egy W∈ℝm×dW\in\mathbb R^{m\times d} súlyú, Z=XW⊤+bZ=XW^\top+b affin rétegben a fan-in (bemeneti legyezőszám) a súlymátrix oszlopainak száma, dd, a fan-out pedig a sorok száma, mm. Más szóval a fan-in azt mondja meg, hány bemeneti érték összegződik egyetlen kimeneti egységben, a fan-out pedig azt, hogy egy bemeneti érték hány kimeneti egység hozzájárulásában szerepel. Konvolúciós rétegre a megfelelő érték Cinkhkw/gC_{in}k_hk_w/g, illetve Coutkhkw/gC_{out}k_hk_w/g, csoportosított (g>1g>1) esetben a megfelelő csoportmérettel; ebben az alfejezetben a levezetést lineáris rétegre végezzük, és a CNN-változatot csak a szóbeli megfeleltetés szintjén említjük. A bias minden kimeneti csatornához egy skalárt ad, ezért alakja mm, és a variancia-számításban közvetlenül nem vesz részt, ha kezdetben konstans, például nulla.

iid súlyok. Az inicializálási heurisztikák alapfeltevése, hogy az inicializálásból származó WijW_{ij} súlyok független és azonos eloszlású (independent and identically distributed, iid) valószínűségi változók. Jelöljük közös várható értéküket μw\mu_w-vel, közös varianciájukat σw2\sigma_w^2-vel. A gyakorlatban használt sémák általában μw=0\mu_w=0-t írnak elő; amint a hibakeresési példában látni fogjuk, a nem szimmetrikus, például [0,a][0,a]-ra inicializált súly nemcsak a várható értéket, hanem az aktiváció eloszlásának szimmetriáját is megváltoztatja.

Variancia és skála. Egy ξ\xi valószínűségi változó varianciája Var(ξ)=E[(ξ−E[ξ])2]\operatorname{Var}(\xi)=E[(\xi-E[\xi])^2]. Ha E[ξ]=0E[\xi]=0, akkor ez egyszerűen E[ξ2]E[\xi^2]. A skálát a szórással, σ=Var(ξ)\sigma=\sqrt{\operatorname{Var}(\xi)}-vel mérjük. A cél nem az, hogy minden aktiváció pontosan ugyanakkora legyen, hanem az, hogy a rétegek mélységében az eloszlás szórása ne tűnjön el exponenciálisan és ne is robbanjon fel.

21.1.3 Varianciaterjedés: az összeg szórása korrelálatlan tagokra

Először a kötelezően kimondandó alapállítást bizonyítjuk.

Lemma. Legyenek a1,…,ana_1,\ldots,a_n véges második momentumú, páronként korrelálatlan valószínűségi változók, azaz Cov(ai,aj)=0\operatorname{Cov}(a_i,a_j)=0, ha i≠ji\ne j (ez teljesül például, ha páronként függetlenek). Ekkor

Var(∑i=1nai)=∑i=1nVar(ai). \operatorname{Var}\left(\sum_{i=1}^n a_i\right) = \sum_{i=1}^n \operatorname{Var}(a_i).

Bizonyítás. Legyen μi=E[ai]\mu_i=E[a_i]. A variancia definíciója és a várható érték linearitása szerint ∑iai−E[∑iai]=∑i(ai−μi)\sum_i a_i-E[\sum_i a_i]=\sum_i(a_i-\mu_i), ezért

Var(∑iai)=E[(∑i(ai−μi))2]=∑i,jE[(ai−μi)(aj−μj)]=∑i,jCov(ai,aj). \operatorname{Var}\left(\sum_i a_i\right) = E\left[\left(\sum_i (a_i-\mu_i)\right)^2\right] = \sum_{i,j} E[(a_i-\mu_i)(a_j-\mu_j)] = \sum_{i,j}\operatorname{Cov}(a_i,a_j).

A diagonális tagok Cov(ai,ai)=Var(ai)\operatorname{Cov}(a_i,a_i)=\operatorname{Var}(a_i), a többi a feltétel szerint nulla. ▫\square

A lemmához nem kell zérus átlag: a függetlenség (vagy csak a korrelálatlanság) a nem nulla átlagú tagok kovarianciáit is eltünteti. A zérus átlag ott kap szerepet, ahol a varianciát a második momentummal azonosítjuk: E[ai]=0E[a_i]=0 esetén Var(ai)=E[ai2]\operatorname{Var}(a_i)=E[a_i^2], általában viszont E[ai2]=Var(ai)+μi2E[a_i^2]=\operatorname{Var}(a_i)+\mu_i^2.

Gyakorlati ellenőrzésként vegyünk három független, azonos, {−1,+1}\{-1,+1\} értékű egyenletes változót. Varianciájuk egyenként 11, összegük {−3,−1,1,3}\{-3,-1,1,3\}-on a 1/8,3/8,3/8,1/81/8,3/8,3/8,1/8 valószínűségekkel oszlik el, így az összeg második momentuma, egyben (zérus átlag miatt) varianciája (9+3⋅1+3⋅1+9)/8=3(9+3\cdot1+3\cdot1+9)/8=3, ami egyenlő a varianciák összegével. Nem zérus átlagú ellenőrzés: három független {0,1}\{0,1\} értékű, 1/21/2 paraméterű Bernoulli-változó varianciája egyenként 1/41/4, az összeg binomiális, varianciája 3⋅14=343\cdot\tfrac14=\tfrac34, az átlag (3/23/2) ellenére is a varianciák összege.

21.1.4 Affin réteg előre irányú varianciája és a fan-in becslés

Tekintsünk egyetlen affin réteget X∈ℝN×dX\in\mathbb R^{N\times d} bemenettel. A kimenet Z=XW⊤+bZ=XW^\top+b, ahol Z∈ℝN×mZ\in\mathbb R^{N\times m}, W∈ℝm×dW\in\mathbb R^{m\times d}, b∈ℝmb\in\mathbb R^m. Vizsgáljuk egyetlen zoz_o kimeneti koordinátát:

zo=∑i=1dWoixi+bo. z_o = \sum_{i=1}^{d} W_{oi} x_i + b_o.

Tegyük fel, hogy a WoiW_{oi} súlyok iid zérus átlagúak σw2\sigma_w^2 varianciával, az xix_i bemenetek szintén zérus átlagúak σx2\sigma_x^2 varianciával, és a súlyok függetlenek a bemenettől. Ekkor a WoixiW_{oi}x_i szorzat várható értéke E[Woi]E[xi]=0E[W_{oi}]E[x_i]=0, varianciája pedig

Var(Woixi)=E[Woi2]E[xi2]=σw2σx2, \operatorname{Var}(W_{oi}x_i) = E[W_{oi}^2]E[x_i^2] = \sigma_w^2\sigma_x^2,

ahol a szorzatfüggetlenséget használtuk. A lemma szerint az összeg varianciája a tagok varianciáinak összege, így

σz2=dσw2σx2=fan_in⋅σw2σx2. \sigma_z^2 = d\,\sigma_w^2\sigma_x^2 = \operatorname{fan\_in}\cdot\sigma_w^2\,\sigma_x^2.

Ez a fan-in becslés. Ha tehát azt szeretnénk, hogy a réteg kimeneti varianciája egyezzen a bemeneti varianciával, σz2=σx2\sigma_z^2=\sigma_x^2, akkor a σw2=1/d\sigma_w^2=1/d választás adódik. Ez a Xavier/Glorot inicializálás előre irányú motivációja.

21.1.5 Backward irány és a fan-out becslés

A VJP-konvencióban (4.3. Jacobi-mátrix, láncszabály és VJP) az XX-re vonatkozó gradiens ∇XL=∇ZLW\nabla_X L=\nabla_Z L\, W, ahol ∇ZL∈ℝN×m\nabla_Z L\in\mathbb R^{N\times m} és W∈ℝm×dW\in\mathbb R^{m\times d}. Egy rögzített bemeneti koordinátára

∇xiL=∑o=1mWoi∇zoL. \nabla_{x_i}L = \sum_{o=1}^{m} W_{oi}\,\nabla_{z_o}L.

Ha a WoiW_{oi} súlyok iid zérus átlagúak és függetlenek a hátra érkező ∇zoL\nabla_{z_o}L gradiensektől, továbbá azok varianciája σdz2\sigma_{dz}^2, ugyanazzal az érveléssel

σdx2=mσw2σdz2=fan_out⋅σw2σdz2. \sigma_{dx}^2 = m\,\sigma_w^2\sigma_{dz}^2 = \operatorname{fan\_out}\cdot\sigma_w^2\,\sigma_{dz}^2.

A forward kívánalom σw2=1/fan_in\sigma_w^2=1/\operatorname{fan\_in}, a backward kívánalom σw2=1/fan_out\sigma_w^2=1/\operatorname{fan\_out}. A kettő egyszerre általában nem teljesíthető, ha fan_in≠fan_out\operatorname{fan\_in}\ne\operatorname{fan\_out}. A Xavier-kompromisszum a harmonikus közeppel dolgozik:

σw2=2fan_in+fan_out. \sigma_w^2 = \frac{2}{\operatorname{fan\_in}+\operatorname{fan\_out}}.

A népszerű uniform megvalósítás ezt úgy kapja, hogy Wij∼U(−a,a)W_{ij}\sim U(-a,a), ahol U(−a,a)U(-a,a) varianciája a2/3a^2/3; a a2/3=2/(d+m)a^2/3=2/(d+m) egyenletből

a=6fan_in+fan_out. a=\sqrt{\frac{6}{\operatorname{fan\_in}+\operatorname{fan\_out}}}.

Ez nem bizonyítás arra, hogy a háló optimális lesz; ez egy skálázási heurisztika, amely a linearitás, a függetlenség és a nulla-átlag feltételei mellett a jel szórásának közelítő megőrzését célozza.

21.1.6 ReLU: a második momentum felezése és a He-skálázás

A ReLU ReLU(z)=max(0,z)\operatorname{ReLU}(z)=\max(0,z) kimenete nem zérus átlagú, ezért a következő réteg számára nem a varianciája, hanem a második momentuma a releváns mennyiség. Legyen a következő réteg előaktivációja zl+1,o=∑i=1fan_inWoihl,iz_{l+1,o}=\sum_{i=1}^{\operatorname{fan\_in}}W_{oi}h_{l,i}, ahol a WoiW_{oi} súlyok iid, zérus átlagúak, Var(W)=σw2\operatorname{Var}(W)=\sigma_w^2 szórásnégyzetűek és függetlenek a hlh_l aktivációktól. Ekkor E[Woihl,i]=E[Woi]E[hl,i]=0E[W_{oi}h_{l,i}]=E[W_{oi}]\,E[h_{l,i}]=0, és

Var(Woihl,i)=E[Woi2]E[hl,i2]=σw2ql,ql:=E[hl,i2], \operatorname{Var}(W_{oi}h_{l,i})=E[W_{oi}^2]\,E[h_{l,i}^2]=\sigma_w^2\,q_l,\qquad q_l:=E[h_{l,i}^2],

a tagok pedig korrelálatlanok, így

Var(zl+1)=fan_in⋅Var(W)⋅E[hl2]=fan_in⋅σw2ql. \operatorname{Var}(z_{l+1})=\operatorname{fan\_in}\cdot\operatorname{Var}(W)\cdot E[h_l^2]=\operatorname{fan\_in}\cdot\sigma_w^2\,q_l.

Ez a fenti fan-in becslés általánosítása: zérus átlagú bemenetnél ql=σx2q_l=\sigma_x^2, és visszakapjuk a fan_inσw2σx2\operatorname{fan\_in}\,\sigma_w^2\sigma_x^2 alakot. Legyen most zlz_l szimmetrikus, zérus várható értékű, σz,l2\sigma_{z,l}^2 szórásnégyzetű, és hl=max(0,zl)h_l=\max(0,z_l). A szimmetria miatt a pozitív és a negatív fél ugyanannyit ad a második momentumhoz, és a ReLU a negatív felet kinullázza:

ql=E[hl2]=E[zl2𝟏[zl>0]]=12E[zl2]=12σz,l2. q_l=E[h_l^2]=E[z_l^2\,\mathbf 1[z_l>0]]=\frac12\,E[z_l^2]=\frac12\,\sigma_{z,l}^2.

A ReLU tehát a második momentumot felezi, nem a varianciát: Var(hl)=ql−(E[hl])2<ql\operatorname{Var}(h_l)=q_l-(E[h_l])^2<q_l. Standard normális zz-re E[h]=1/2π≈0,39894E[h]=1/\sqrt{2\pi}\approx0{,}39894, E[h2]=0,5E[h^2]=0{,}5 és Var(h)=12−12π≈0,340845\operatorname{Var}(h)=\tfrac12-\tfrac1{2\pi}\approx0{,}340845. A két egyenletet összefűzve

Var(zl+1)=12fan_in⋅σw2Var(zl). \operatorname{Var}(z_{l+1})=\frac12\,\operatorname{fan\_in}\cdot\sigma_w^2\,\operatorname{Var}(z_l).

A Var(zl+1)=Var(zl)\operatorname{Var}(z_{l+1})=\operatorname{Var}(z_l) célból

σw2=2fan_in, \sigma_w^2=\frac{2}{\operatorname{fan\_in}},

ami a He-inicializálás normális eloszlású változata: Wij∼N(0,2/fan_in)W_{ij}\sim N(0,2/\operatorname{fan\_in}). A megfelelő uniform határ az a2/3=2/fan_ina^2/3=2/\operatorname{fan\_in} egyenletből a=6/fan_ina=\sqrt{6/\operatorname{fan\_in}}. A megőrzött mennyiség tehát az előaktivációk varianciája, illetve ezzel egyenértékűen az aktivációk második momentuma rétegről rétegre.

Az elnevezések a klasszikus forrásokból származnak: a Xavier-skálázást Glorot és Bengio, a ReLU-finomítást He, Zhang, Ren és Sun vezette be. Az itt adott varianciaalapú motiváció önálló levezetés; nem helyettesíti a két eredeti cikk valamennyi módszertani feltételét.

Feltétel-ellenőrzésként a ReLU-érvelésben a szimmetria valódi eloszlásfeltevés. Ha a bemeneti xix_i átlaga például μx≠0\mu_x\ne0, akkor a szorzat varianciája a második momentummal σw2E[xi2]=σw2(μx2+σx2)\sigma_w^2E[x_i^2]=\sigma_w^2(\mu_x^2+\sigma_x^2), nem σw2σx2\sigma_w^2\sigma_x^2; a csak varianciát használó becslés ezért alábecsüli a valódi szórást. A heurisztika tehát csak a kimondott feltételek mellett értelmes.

21.1.7 Kézi kis példa

Tegyük fel, hogy egy réteg fan-inje d=8d=8, fan-outja m=4m=4, a bemenet varianciája σx2=3\sigma_x^2=3, és He-féle normál inicializálást használunk: σw2=2/8=0,25\sigma_w^2=2/8=0{,}25, azaz σw=0,5\sigma_w=0{,}5. A forward becslés szerint

σz2=8⋅0,25⋅3=6, \sigma_z^2=8\cdot0{,}25\cdot3=6,

majd szimmetrikus zz-eloszlást feltételezve a ReLU után a második momentum

qh=E[h2]=12⋅6=3, q_h=E[h^2]=\frac12\cdot6=3,

tehát a következő réteg szempontjából releváns E[h2]E[h^2] megegyezik a bemenet E[x2]=σx2=3E[x^2]=\sigma_x^2=3 értékével. A ReLU-kimenet varianciája ennél kisebb: normális zz esetén Var(h)=6(12−12π)≈2,045\operatorname{Var}(h)=6\left(\tfrac12-\tfrac1{2\pi}\right)\approx2{,}045. Ha az upstream gradiens varianciája σdz2=1\sigma_{dz}^2=1, a backward becslés

σdx2=4⋅0,25⋅1=1, \sigma_{dx}^2=4\cdot0{,}25\cdot1=1,

tehát ebben a konkrét dimenziópárosításban a gradiens skálája is véges marad. A példa azt is mutatja, hogy a He-séma nem teszi a fan-out tényezőt önálló korrekcióvá; a backward stabilitás itt annak köszönhető, hogy a választott mm kicsi. Általánosabb dimenziókra a viselkedést méréssel kell ellenőrizni.

Ugyanerre a rétegre a Xavier-uniform változat: a=6/(8+4)=1/2≈0,7071a=\sqrt{6/(8+4)}=1/\sqrt2\approx0{,}7071, a súlyok U(−a,a)U(-a,a)-ból jönnek, varianciájuk a2/3=1/6a^2/3=1/6, így a forward nulla-átlagú, lineáris esetben σz2=8⋅(1/6)⋅3=4\sigma_z^2=8\cdot(1/6)\cdot3=4, ami σx2=3\sigma_x^2=3-hoz képest enyhe növekedés. A ReLU utáni második momentum itt qh=4/2=2<3q_h=4/2=2<3, tehát a Xavier-séma ReLU-láncban rétegről rétegre csökkenti a jelskálát, mert nem a ReLU aszimmetriájára van hangolva.

21.1.8 Minimális kódos ellenőrzés

A következő rövid PyTorch-munkamenet az eloszlásszintű becslést ellenőrzi egy nagy batch Monte-Carlo-közelítésben. A cél nem a teljes háló tanítása, hanem annak látványossá tétele, hogy a kezdeti lépésben a réteg szórása milyen közel van az elméleti célhoz.

# lab/n081_mini_scale.py
import math
import torch

torch.manual_seed(20261020)
dt = torch.float64            # a variancia pontos méréséhez
batch, d, m = 8192, 8, 4
x = torch.randn(batch, d, dtype=dt) * math.sqrt(3.0)  # sigma_x^2 = 3
lin = torch.nn.Linear(d, m, dtype=dt)
std_w = math.sqrt(2.0 / d)    # He normal: sigma_w^2 = 2/fan_in
torch.nn.init.normal_(lin.weight, mean=0.0, std=std_w)
torch.nn.init.zeros_(lin.bias)

with torch.no_grad():
    z = lin(x)
    h = torch.relu(z)
print("z var  :", float(z.var()))              # elmélet (súlyok felett várható): 6
print("E[h^2] :", float((h ** 2).mean()))      # elmélet: 6/2 = 3
print("h var  :", float(h.var()))              # elmélet: 6*(1/2 - 1/(2*pi)) ~ 2.045

A futtatás parancsa python lab/n081_mini_scale.py. A lab-profilban (PyTorch 2.14.1+cpu, float64) mért kimenet: z var ≈6,80\approx6{,}80, E[h^2] ≈3,36\approx3{,}36, h var ≈2,41\approx2{,}41. Az elméleti 66, 33 és 2,0452{,}045 a súlyok eloszlása feletti várható érték; egyetlen 4×84\times8-as súlyhúzásnál a sorok normája ettől érezhetően eltér, ezért a zz szórásnégyzete 66 helyett 6,86{,}8. Az arányok viszont a súlyhúzástól függetlenül a levezetést követik: E[h2]/Var(z)≈0,493≈12E[h^2]/\operatorname{Var}(z)\approx0{,}493\approx\tfrac12 és Var(h)/Var(z)≈0,355≈12−12π=0,341\operatorname{Var}(h)/\operatorname{Var}(z)\approx0{,}355\approx\tfrac12-\tfrac1{2\pi}=0{,}341.

21.1.9 Labor: aktiváció- és gradiensskála több kis rétegen

Cél és hipotézis. A labor azt vizsgálja, hogy egy hat rétegű, 6464 széles, ReLU-aktivációjú MLP első lépésében a He-inicializálás közelebb tartja-e a rétegenkénti aktiváció szórását 11-hez, mint a Xavier-uniform, és hogyan változik a bemeneti gradiens szórása. Hipotézisünk szerint szimmetrikus, zérusátlagú bemeneten a He-séma ReLU alatt jobb skálamegőrzést ad; eltolt, nem zérus átlagú bemeneten mindkét becslés pontatlanná válik.

Adat és számítás. A labor szintetikus bemenetet használ, nem GlyphLab-képeket: x∼N(0,I64)x\sim N(0,I_{64}); a bemenet tehát nem képadat, és a labor nem a teljes képklasszifikációs főút része. A súlyokat a fenti képletekkel inicializáljuk, a biast nullára. A mérés float64-ben történik a variancia pontos összehasonlításához; a tanítási főút ettől függetlenül float32 CPU marad. A kódot a lab/n081_init_scale.py fájlba írjuk.

# lab/n081_init_scale.py
import argparse
import math
import torch

def make_layers(width, layers, scheme, dt):
    result = []
    for _ in range(layers):
        lin = torch.nn.Linear(width, width, bias=True, dtype=dt)
        if scheme == "he":
            std = math.sqrt(2.0 / lin.in_features)
            torch.nn.init.normal_(lin.weight, mean=0.0, std=std)
        elif scheme == "xavier":
            a = math.sqrt(6.0 / (lin.in_features + lin.out_features))
            torch.nn.init.uniform_(lin.weight, -a, a)
        else:
            raise ValueError(f"ismeretlen séma: {scheme}")
        torch.nn.init.zeros_(lin.bias)
        result.append(lin)
    return result

def main():
    p = argparse.ArgumentParser()
    p.add_argument("--seed", type=int, default=20261020)
    p.add_argument("--dtype", choices=["float32", "float64"], default="float64")
    p.add_argument("--batch", type=int, default=8192)
    p.add_argument("--width", type=int, default=64)
    p.add_argument("--layers", type=int, default=6)
    p.add_argument("--scheme", choices=["he", "xavier"], default="he")
    p.add_argument("--shifted", action="store_true",
                   help="zérus átlag feltétel megsértése")
    args = p.parse_args()

    dt = torch.float64 if args.dtype == "float64" else torch.float32
    torch.manual_seed(args.seed)
    x = torch.randn(args.batch, args.width, dtype=dt, requires_grad=True)
    if args.shifted:
        x = x + 1.5

    layers = make_layers(args.width, args.layers, args.scheme, dt)
    h = x
    print("label layer_idx fan_in fan_out h_std")
    for i, lin in enumerate(layers):
        h = torch.relu(lin(h))
        if i < 3 or i == len(layers) - 1:
            print(args.scheme, i, lin.in_features, lin.out_features,
                  f"{float(h.std()):.4f}")
    h.sum().backward()
    print("input_grad_std", f"{float(x.grad.std()):.4f}")

if __name__ == "__main__":
    main()

A futtatási parancs:

python lab/n081_init_scale.py --seed 20261020 --dtype float64 --scheme he
python lab/n081_init_scale.py --seed 20261020 --dtype float64 --scheme xavier
python lab/n081_init_scale.py --seed 20261020 --dtype float64 --scheme he --shifted

Az alábbi kimenet jelölt szemléltetés, nem e kézirat írásakor végzett mérés:

# he, szimmetrikus bemenet; a számok a képletből és a véletlen minta
# várható ingadozásából származó szemléltető célok.
he 0 64 64 0.99
he 1 64 64 1.00
he 2 64 64 1.01
he 5 64 64 0.98
input_grad_std 1.03

Értelmezés. A He-inicializált, szimmetrikus esetben a rétegenkénti aktiváció-szórás 1 körül marad; a gradiensskála sem robban. A Xavier-séma ReLU mellett jellemzően enyhe csökkenést mutat, mert a σw2=2/(d+m)=1/64\sigma_w^2=2/(d+m)=1/64 választás a forward becslésben a fan-in szerinti 2/d2/d helyett csak 1/d1/d nagyságrendű, ezért minden ReLU réteg körülbelül felező hatású lehet. Az --shifted futtatás azt mutatja, hogy a bemenet eltolásával a zérusátlag-feltétel sérül, és a variancia a becsültnél nagyobb; ez a heurisztika érvényességi határa, nem a kód hibája. Az értékeléshez legalább három seeden érdemes futtatni, és a szórást a seedeken keresztül is feljegyezni.

21.1.10 Feladatok

1. F1 fogalmi (nehézség 1). Adja meg egy W∈ℝ10×6W\in\mathbb R^{10\times 6} súlyú affin réteg fan-injét és fan-outját, majd magyarázza el, miért nem szimmetrikus a két mennyiség szerepe a gradiensáramlásban.

2. F2 levezetési (nehézség 2). Legyen fan_in=8\operatorname{fan\_in}=8, fan_out=4\operatorname{fan\_out}=4, a bemeneti variancia σx2=3\sigma_x^2=3, a bemenet zérus átlagú. He-féle normál inicializálással számítsa ki a zz előaktiváció varianciáját, a ReLU utáni hh varianciáját a szimmetria-feltevés mellett, majd a backward σdx2\sigma_{dx}^2 értékét, ha σdz2=1\sigma_{dz}^2=1. Minden lépésben jelölje meg, melyik feltevést használja, és ellenőrizze a dimenziókat.

3. F3 implementációs (nehézség 2). Írjon egy measure_forward_scale(layers, x) függvényt, amely egy lineáris rétegekből álló listán ReLU-aktivációval végigfuttatja az xx batchet, és visszaadja a (fan_in, fan_out, out_std) hármasok listáját. A függvényt tesztelje két 8→88\to8-as rétegen He-inicializálással, torch.float64 esetén, seed=20261020 mellett; a várt out_std értékeknek 11 közelében kell lenniük, a véletlen minta miatt ±0,1\pm0{,}1 toleranciával.

4. F4 hibakeresési (nehézség 2). Egy kódban a következő inicializálás szerepel:

a = math.sqrt(6.0 / (fan_in + fan_out))
torch.nn.init.uniform_(m.weight, 0, a)

Azonosítsa a hibát, mondja meg, melyik feltevés sérül, milyen következménye lehet a ReLU-hálózat korai rétegeiben, és adja meg a javított kódot. A javítás utáni ellenőrzéshez adja meg, mit kell kiszámítani (például súlyátlag, szimmetria) és mi a várt érték.

5. F5 kísérlettervezési (nehézség 3). Tervezzen GlyphLab-CNN-kísérletet annak eldöntésére, hogy a He- vagy a Xavier-inicializálás ad-e jobb legjobb validációs pontosságot. A tervnek tartalmaznia kell: kérdés, baseline, a megváltoztatott egyetlen tényező, split, seedek, metrika, erőforrás és a következtetés határa. A tesztet a terv szerint csak a legjobb validációs modellen szabad kiértékelni.

21.1.11 Megoldások és indoklás

1. A fan-in 66, a fan-out 1010. A fan-in a forward összeg tagjainak száma: egy kimeneti egység hat súlyozott bemenetet ad össze. A fan-out a backward összeg tagjainak száma: egy bemeneti koordináta gradienséhez mind a tíz kimeneti gradiens hozzájárul WW-n keresztül. A kettő akkor lenne azonos szerepű, ha a mátrix négyzetes lenne, és a forward, valamint a transzponált szorzás ugyanannyi tagot vonna be; általános téglalapmátrix esetén a két irány más skálázást igényel.

2. He-normál: σw2=2/8=0,25\sigma_w^2=2/8=0{,}25. A szorzat varianciája σw2σx2=0,25⋅3=0,75\sigma_w^2\sigma_x^2=0{,}25\cdot3=0{,}75; a nyolc független, zérus átlagú tag összegére a lemma szerint

σz2=8⋅0,75=6. \sigma_z^2=8\cdot0{,}75=6.

A ReLU szimmetrikus zz esetén a második momentumot felezi: E[h2]=6/2=3E[h^2]=6/2=3 (a variancia ennél kisebb, normális zz-re ≈2,045\approx2{,}045). A backward egyetlen bemeneti koordinátára négy tagot összegez, mindegyik varianciája σw2σdz2=0,25⋅1=0,25\sigma_w^2\sigma_{dz}^2=0{,}25\cdot1=0{,}25, így

σdx2=4⋅0,25=1. \sigma_{dx}^2=4\cdot0{,}25=1.

Dimenzióellenőrzés: WW alakja 4×84\times8, a forward Z∈ℝN×4Z\in\mathbb R^{N\times4}, a backward XX-gradiens alakja N×8N\times8; a levezetett skalárok mindkét esetben varianciadimenziójúak. Szélsőesetként ha σx2=0\sigma_x^2=0, akkor a bemenet konstans, a szorzat is konstans nulla átlaggal, de a függetlenségi feltevés továbbra is szükséges az összegzéshez.

3. Az elvárt függvény és teszt:

def measure_forward_scale(layers, x):
    scales = []
    h = x
    for lin in layers:
        fan_in = lin.weight.shape[1]
        fan_out = lin.weight.shape[0]
        h = torch.relu(lin(h))
        scales.append((fan_in, fan_out, float(h.std())))
    return scales

import math, torch
torch.manual_seed(20261020)
dt = torch.float64
x = torch.randn(4096, 8, dtype=dt)
l1 = torch.nn.Linear(8, 8, dtype=dt)
l2 = torch.nn.Linear(8, 8, dtype=dt)
for lin in (l1, l2):
    torch.nn.init.normal_(lin.weight, 0.0, math.sqrt(2.0 / 8))
    torch.nn.init.zeros_(lin.bias)
print(measure_forward_scale([l1, l2], x))

A várt kimenet mindkét rétegre (8, 8, kb. 1.0). A tolerancia ±0,1\pm0{,}1 a 4096-os minta szórásbecslésének véletlen ingadozása miatt; ha a kimenet ennél nagyobb eltérést mutat, nem a toleranciát kell növelni, hanem a seedet, a dtype-ot és a fan_in kiszámítását kell ellenőrizni. A mintanagyság növelésével az ingadozás csökken, de a pontos 11 érték csak végtelen minta határértéke.

4. A hiba: a súlyok a [0,a][0,a] intervallumból jönnek, ezért átlaguk a/2a/2, nem nulla. A zérusátlag-feltevés közvetlenül sérül; továbbá a súlyeloszlás nem szimmetrikus, ezért a ReLU-félvariancia-érvelés is érvényét veszti. Következmény: a korai rétegek zz előaktivációja ferde eloszlású lesz, a pozitív súlyok miatt az első réteg kimenete dominánsan pozitív irányba tolódhat, a ReLU kevesebb értéket nulláz, mint a szimmetrikus modell feltételezi, és a tényleges variancia nagyobb lehet a becsültnél. A javítás:

a = math.sqrt(6.0 / (fan_in + fan_out))
torch.nn.init.uniform_(m.weight, -a, a)

Ellenőrzés: inicializálás után m.weight.mean() értékének 00 közelében kell lennie, m.weight.min() közelítőleg −a-a, m.weight.max() közelítőleg aa, és a variancia a2/3a^2/3. A [0,a][0,a]-változattal szemben a javított változat nem változtatja meg egy zérus átlagú bemenetű lineáris réteg kimenetének várható értékét.

5. Kérdés: a He- és a Xavier-inicializálás hogyan befolyásolja a GlyphLab-osztályozó legjobb validációs pontosságát? Baseline: a 17.1. LeNet és a lokális megosztott reprezentáció laborban használt kisméretű, pontosan specifikált CNN, mondjuk két konvolúciós blokk és egy affin fej, He-inicializálással. Az egyetlen megváltoztatott tényező a súlyinicializálási séma; minden más döntés rögzített: adatverzió, train/val/test scene-split, batchméret, optimizer, tanulási ráta, epochszám, checkpoint-szabály és értékelési mód. Mindkét sémát öt seeddel futtatjuk a seed-ingadozás becsléséhez. Metrika: legjobb validálási loss alapján kiválasztott modell val pontossága, valamint a kiválasztott modell test pontossága; a korrupt tesztet nem használjuk modellválasztásra. Erőforrás: CPU, float32 főút. Következtetési határ: az eredmény a 180 jelenetes, procedurális GlyphLab-adatra és a választott kis hálóra érvényes; nem állítunk általános CNN-rangsort. Negatív vagy kiegyenlítetlen eredmény esetén a seedeloszlást és a gradiensnormákat kell közölni.

21.1.12 Tipikus tévedés ellenpéldával

A leggyakoribb tévedés az, hogy a helyes σw2\sigma_w^2 megválasztásától garantáltan stabil tréninget várunk. Az inicializálási heurisztika csak a kezdeti pillanatban, a kimondott függetlenségi és zérusátlag-feltevések mellett becsli a szórások arányát. Ellenpélda: vegyünk egyetlen lineáris réteget W=3IW=3I-vel és b=0b=0-val. A súly varianciája ekkor ugyan 99, tehát a mátrix nem a He-sémából jön, de tegyük fel, hogy egy hibásan skálázott modellben ilyen állapot alakul ki. A forward jel egy lépés alatt 33-szorosára nő, a backward gradiens ugyancsak 33-szorosára; ha ez egy mély hálóban ismétlődik, a jel exponenciálisan robban. A He/Xavier-képlet kezdéskor ezt próbálja megelőzni, ám a tanítás során a súlyok elmozdulnak, a bemeneteloszlás megváltozik, a BatchNorm és az adaptív optimizáló pedig további skálahatásokat visz a rendszerbe. Az [P07] által tárgyalt BatchNorm éppen a rétegen belüli normalizálással csökkenti ezt az érzékenységet, de annak mechanizmusa sem állítható minden architektúrára igazolt garanciaként. A helyes állítás tehát: a skálázás szükséges jellegű elővigyázatosság, nem elégséges stabilitási tétel.

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

Írja fel saját szavaival a fan-in és fan-out definícióját, majd ellenőrizze a következő állításokat: a lemmában a zérus várható érték miért hagyható el nem nulla átlagú tagokra; a ReLU-félvariancia miért igényel szimmetriát; a W alakjának ismerete nélkül miért nem dönthető el, hogy egy adott σw\sigma_w a forward vagy a backward oldalt védi. A korábbi anyagból idézze fel, hogy a 9.1. Neuron és perceptron alfejezetben megismert s=w⊤x+bs=w^\top x+b perceptron-score ugyanaz a zoz_o objektum, amelynek varianciáját most elemeztük; a 17.1. LeNet és a lokális megosztott reprezentáció LeNet-változatban a konvolúciós súlyokra a fan-in CinkhkwC_{in}k_hk_w mintájára értelmezendő; a 20.1. Feature extractor és új fej alfejezetben tárgyalt előtanított súly pedig nem friss inicializálás, így annak eloszlása nem teljesíti automatikusan a fenti képleteket.

21.1.14 Rövid összefoglaló

Az affin réteg zo=∑iWoixi+boz_o=\sum_i W_{oi}x_i+b_o összege független, zérus átlagú tagok esetén fan_in⋅σw2σx2\operatorname{fan\_in}\cdot\sigma_w^2\sigma_x^2 varianciát ad. A backward irány hasonlóan fan_out⋅σw2σdz2\operatorname{fan\_out}\cdot\sigma_w^2\sigma_{dz}^2 skálát eredményez. A Xavier-inicializálás σw2=2/(fan_in+fan_out)\sigma_w^2=2/(\operatorname{fan\_in}+\operatorname{fan\_out}), a He-inicializálás σw2=2/fan_in\sigma_w^2=2/\operatorname{fan\_in} választással kompenzálja a ReLU félvarianciáját. A levezetés feltétele: iid, független, zérus átlagú súlyok és aktivációk, szimmetrikus előaktiváció. A labor kis rétegeken méri az aktiváció- és gradiensszórást, és az eltolt bemenet bemutatja a feltételsértést. A kezdőszórás megfelelő beállítása heurisztika: csökkenti a korai skálaromlást, de önmagában nem garantálja a teljes tanítási folyamat stabilitását.

21.1.15 Következő alkalmazás

A következő 21.2. Learning rate és ütemezés egység a tanulási ráta és az ütemezés kérdését viszi tovább. Ott azt vizsgáljuk, hogyan kapcsolódik az itt tárgyalt kezdeti skála a frissítés nagyságához, és miért nem választható a lépésnagyság az inicializálástól függetlenül.

21.1.16 Felhasznált források