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, -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 rétegű háló minden rétege -szorosára változtatja a jel szórását, akkor a bemeneti szórás az . réteg után közelítőleg -szeresére módosul. Amennyiben , ötven réteg után a jel nagyságrendje -szorosára csökken; ha , akkor -szeresére nő. A kérdés tehát az, milyen feltételek mellett lehet -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.
Fan-in, fan-out. Egy súlyú, affin rétegben a fan-in (bemeneti legyezőszám) a súlymátrix oszlopainak száma, , a fan-out pedig a sorok száma, . 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 , illetve , csoportosított () 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 , é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ó 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 -vel, közös varianciájukat -vel. A gyakorlatban használt sémák általában -t írnak elő; amint a hibakeresési példában látni fogjuk, a nem szimmetrikus, például -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 valószínűségi változó varianciája . Ha , akkor ez egyszerűen . A skálát a szórással, -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.
Először a kötelezően kimondandó alapállítást bizonyítjuk.
Lemma. Legyenek véges második momentumú, páronként korrelálatlan valószínűségi változók, azaz , ha (ez teljesül például, ha páronként függetlenek). Ekkor
Bizonyítás. Legyen . A variancia definíciója és a várható érték linearitása szerint , ezért
A diagonális tagok , a többi a feltétel szerint nulla.
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: esetén , általában viszont .
Gyakorlati ellenőrzésként vegyünk három független, azonos, értékű egyenletes változót. Varianciájuk egyenként , összegük -on a valószínűségekkel oszlik el, így az összeg második momentuma, egyben (zérus átlag miatt) varianciája , ami egyenlő a varianciák összegével. Nem zérus átlagú ellenőrzés: három független értékű, paraméterű Bernoulli-változó varianciája egyenként , az összeg binomiális, varianciája , az átlag () ellenére is a varianciák összege.
Tekintsünk egyetlen affin réteget bemenettel. A kimenet , ahol , , . Vizsgáljuk egyetlen kimeneti koordinátát:
Tegyük fel, hogy a súlyok iid zérus átlagúak varianciával, az bemenetek szintén zérus átlagúak varianciával, és a súlyok függetlenek a bemenettől. Ekkor a szorzat várható értéke , varianciája pedig
ahol a szorzatfüggetlenséget használtuk. A lemma szerint az összeg varianciája a tagok varianciáinak összege, így
Ez a fan-in becslés. Ha tehát azt szeretnénk, hogy a réteg kimeneti varianciája egyezzen a bemeneti varianciával, , akkor a választás adódik. Ez a Xavier/Glorot inicializálás előre irányú motivációja.
A VJP-konvencióban (4.3. Jacobi-mátrix, láncszabály és VJP) az -re vonatkozó gradiens , ahol és . Egy rögzített bemeneti koordinátára
Ha a súlyok iid zérus átlagúak és függetlenek a hátra érkező gradiensektől, továbbá azok varianciája , ugyanazzal az érveléssel
A forward kívánalom , a backward kívánalom . A kettő egyszerre általában nem teljesíthető, ha . A Xavier-kompromisszum a harmonikus közeppel dolgozik:
A népszerű uniform megvalósítás ezt úgy kapja, hogy , ahol varianciája ; a egyenletből
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.
A ReLU 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 , ahol a súlyok iid, zérus átlagúak, szórásnégyzetűek és függetlenek a aktivációktól. Ekkor , és
a tagok pedig korrelálatlanok, így
Ez a fenti fan-in becslés általánosítása: zérus átlagú bemenetnél , és visszakapjuk a alakot. Legyen most szimmetrikus, zérus várható értékű, szórásnégyzetű, és . 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:
A ReLU tehát a második momentumot felezi, nem a varianciát: . Standard normális -re , és . A két egyenletet összefűzve
A célból
ami a He-inicializálás normális eloszlású változata: . A megfelelő uniform határ az egyenletből . 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 átlaga például , akkor a szorzat varianciája a második momentummal , nem ; 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.
Tegyük fel, hogy egy réteg fan-inje , fan-outja , a bemenet varianciája , és He-féle normál inicializálást használunk: , azaz . A forward becslés szerint
majd szimmetrikus -eloszlást feltételezve a ReLU után a második momentum
tehát a következő réteg szempontjából releváns megegyezik a bemenet értékével. A ReLU-kimenet varianciája ennél kisebb: normális esetén . Ha az upstream gradiens varianciája , a backward becslés
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 kicsi. Általánosabb dimenziókra a viselkedést méréssel kell ellenőrizni.
Ugyanerre a rétegre a Xavier-uniform változat: , a súlyok -ból jönnek, varianciájuk , így a forward nulla-átlagú, lineáris esetben , ami -hoz képest enyhe növekedés. A ReLU utáni második momentum itt , 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.
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.045A futtatás parancsa python lab/n081_mini_scale.py. A
lab-profilban (PyTorch 2.14.1+cpu, float64) mért kimenet:
z var
,
E[h^2]
,
h var
.
Az elméleti
,
és
a súlyok eloszlása feletti várható érték; egyetlen
-as
súlyhúzásnál a sorok normája ettől érezhetően eltér, ezért a
szórásnégyzete
helyett
.
Az arányok viszont a súlyhúzástól függetlenül a levezetést követik:
és
.
Cél és hipotézis. A labor azt vizsgálja, hogy egy hat rétegű, 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 -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:
;
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 --shiftedAz 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
választás a forward becslésben a fan-in szerinti
helyett csak
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.
1. F1 fogalmi (nehézség 1). Adja meg egy 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 , , a bemeneti variancia , a bemenet zérus átlagú. He-féle normál inicializálással számítsa ki a előaktiváció varianciáját, a ReLU utáni varianciáját a szimmetria-feltevés mellett, majd a backward értékét, ha . 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
batchet, és visszaadja a (fan_in, fan_out, out_std)
hármasok listáját. A függvényt tesztelje két
-as
rétegen He-inicializálással, torch.float64 esetén,
seed=20261020 mellett; a várt out_std
értékeknek
közelében kell lenniük, a véletlen minta miatt
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.
1. A fan-in , a fan-out . 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 -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: . A szorzat varianciája ; a nyolc független, zérus átlagú tag összegére a lemma szerint
A ReLU szimmetrikus esetén a második momentumot felezi: (a variancia ennél kisebb, normális -re ). A backward egyetlen bemeneti koordinátára négy tagot összegez, mindegyik varianciája , így
Dimenzióellenőrzés: alakja , a forward , a backward -gradiens alakja ; a levezetett skalárok mindkét esetben varianciadimenziójúak. Szélsőesetként ha , 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
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
érték csak végtelen minta határértéke.
4. A hiba: a súlyok a intervallumból jönnek, ezért átlaguk , 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 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
közelében kell lennie, m.weight.min() közelítőleg
,
m.weight.max() közelítőleg
,
és a variancia
.
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.
A leggyakoribb tévedés az, hogy a helyes 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 -vel és -val. A súly varianciája ekkor ugyan , 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 -szorosára nő, a backward gradiens ugyancsak -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.
Í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
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
perceptron-score ugyanaz a
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
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.
Az affin réteg összege független, zérus átlagú tagok esetén varianciát ad. A backward irány hasonlóan skálát eredményez. A Xavier-inicializálás , a He-inicializálás 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.
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.