Ez az egység a tanulás matematikai magját, az empirikus kockázat minimalizálását és annak első numerikus eszközét, a gradienslépést vezeti be. A 4.4. I. ellenőrző pont: matematika és kód megfelelése alfejezetben egy rögzített pontban számoltunk gradienst és ellenőriztük annak helyességét; ott a kérdés a számítás, nem a paraméterfrissítés volt. Az 5.4. Függő képek, seedek és resampling alfejezetben láttuk, hogy a minta statisztikai szerkezete — például a jelenetekbe rendezett képek — befolyásolja, mit jelent egy átlag bizonytalansága. Most ezt a két szálat kapcsoljuk össze: egy batch megfigyeléséből átlagolt veszteséget definiálunk, a modellparaméterekre vett gradiensét levezetjük, majd abból tényleges paraméterfrissítést készítünk.
Egy kérdés a mélytanulási kódok mindennapjából: miért szerepel a legtöbb keretrendszer veszteségében egy szorzó, és miért beszélünk külön adathibáról és regularizáló tagról, holott a kódban a kettő egyszerűen összeadódik? A válaszhoz előbb pontosan definiálnunk kell az objektívfüggvényt, a hozzá tartozó tenzoralakokat, majd a derivált skáláját — ez utóbbi a batchméret és a konstansszorzók kezelésén áll vagy bukik.
Definíció (empirikus kockázat). Legyen egy véges megfigyelés-sorozat, ahol a bemeneti vektor és a hozzá tartozó cél, amely jelen egységben regressziós esetben , osztályozásnál később osztályindex. Legyen egy paraméterű modell és egy elemenkénti veszteség. Az empirikus kockázat
A kifejezés azért kockázat, mert a teljes adathalmazra vett átlagot jelenti; a szó empirikus arra utal, hogy a várható értéket a véges mintával helyettesítettük. Folytonos cél esetén a négyzetes veszteség ; a kizárólag a derivált kényelmét szolgálja, és nincs statisztikai jelentése. Osztályozási logitokhoz ugyanitt a 7.2. Softmax és többosztályos cross-entropy alfejezetben bevezetett cross-entropy kerül, amely a logitot nem kezeli valószínűségként: a softmax abban a veszteségben belül történik.
A gyakorlati tanítás nem a teljes -re, hanem egy minibatchre számol. Legyen a batch elemszáma. A batch bemenete , ahol minden sor egy megfigyelés; a cél . A batch-átlag veszteség:
Ha , akkor ; általában azonban a batch-átlag csak közelíti az empirikus kockázatot. Az 5.4. Függő képek, seedek és resampling alfejezetből tudjuk, hogy ha a megfigyelések klaszterekbe rendeződnek, a batch-átlag statisztikai értelmezése is finomabb: a képek, nem a jelenetek szerinti átlagolás nem ugyanazt a független egységet becsli.
Definíció (regularizáló penalty). Legyen a modell lineáris paramétermátrixa, a biasvektor. Az -regularizáló tag
A skálaparaméter a regularizáció erőssége; a itt is a derivált alaktisztaságát szolgálja. A Frobenius-norma a mátrix elemnégyzet-összegének négyzetgyöke, tehát a mátrixelemek négyzetösszege. A biasra rendszerint nem alkalmazunk -tagot, mert a bias eltolást kódol, nem pedig a bemenetre ható erősítést.
Definíció (teljes batch-objektív). A regularizált batch-célfüggvény
A fenti argumentumába kerül, mert a konkrét modell ezeket használja. A gradienslépés a gradient descent:
ahol a step size (tanulási sebesség). A későbbi sztochasztikus változatnál 6.3. Sztochasztikus és minibatch gradiens a batchgradiens a minibatchből származik; itt egyelőre a frissítés alakjára koncentrálunk.
Tétel (a regularizált fél-MSE gradiense). Legyen a modell affin transzformáció: , ahol , , sorirányú broadcast mellett, és . Legyen a batch-veszteség
és a teljes cél . Ekkor
ahol a csupa egyes vektor, és .
A kifejezésben egy mátrix, tehát alakja mindvégig megegyezik alakjával. A biasgradiens a hibamátrix oszlopösszege osztva -mel, ami -dimenziós vektort ad. A tétel a láncszabály definíció szerinti alkalmazása; a levezetést teljesen elvégezzük, mert a skálatényezők — az és a — pontosan itt dőlnek el.
Levezetés. Jelölje a hibamátrixot. A veszteség elemenkénti deriváltja szerint:
mert az -nél a láncszabály faktort ad, amelyet a kiejt, és az átlagolás megmarad. Most , tehát
ahol , ha , egyébként . A szerinti parciális derivált a többváltozós láncszabállyal 4.3. Jacobi-mátrix, láncszabály és VJP:
Az utolsó összeg a mátrix eleme, mert . Tehát . A biasra hasonlóan
A biasgradiens tehát , mert alakja , és -mel szorozva az oszlopösszegeket kapjuk.
A regularizáló gradienséhez , tehát . Az összeg deriváltja tagok összege, amiből a tétel képlete adódik.
Fontos megkülönböztetés: a fenti skálázású kvadratikus tag a fél-MSE. A köznyelvi MSE definíciója , amelynek gradiense . A kettő konstansszorzóban tér el; ugyanazt a minimumot adja, de a regularizációs hangolásakor a skálát rögzítenünk kell. A gyakorlati kódok ezért expliciten dokumentálják, hogy a -es skálázást hol alkalmazzák.
A VJP-olvasat 4.4. I. ellenőrző pont: matematika és kód megfelelése szerint: legyen ; a paramétergradiensek az affin réteg backward lépéséből , illetve a biasra a oszlopösszege. A fenti tétel pontosan ezt a programozói formát adja.
A labor célja a gradienslépés mechanikájának kézi, ellenőrizhető követése. Legyen egyetlen bemeneti és kimeneti dimenzió, , és egyetlen mintapár: , . A modell (bias nélkül, a példa tisztasága érdekében). A fél-MSE egyetlen megfigyelésre:
A regularizáló mellett . A teljes cél:
A gradiens: . Analitikus optimum: , azaz
Induljunk -ból, lépésközzel. A számított lépések:
Megfigyelés: monoton csökken az első lépésekben, , , . A gradiens abszolút értéke is csökken: , , ; ez a konvergencia numerikus jele, de önmagában nem bizonyítja a végtelenben vett minimumot — a 6.2. Konvexitás és sima optimalizálási határ alfejezetben adunk majd simasági feltételek melletti kvantitatív korlátot.
Elsőrendű Taylor-indoklás: , tehát minden nem nulla gradiensű pontban elegendően kis mellett a lineáris közelítés csökkenést jelez. Ez lokális állítás; nagy -ra a kvadratikus tag felülírhatja, és a cél nőhet.
Munkakönyvtár: ch06_empirical_risk/.
Fájl: n021_gd_demo.py.
A feladat az előző kézi példa teljes megismétlése NumPy-ban, ahol minden lépés kimenetét külön ellenőrizzük. Nincs véletlen komponens, ezért seed nem szükséges; ezt kimondjuk. A dtype mindenütt float64, mert a gradiensellenőrzési fegyelem 4.4. I. ellenőrző pont: matematika és kód megfelelése szerint a magasabb pontosság a numerikus hibák elkülönítését segíti. Az eszköz CPU; PyTorch nem kell hozzá.
# n021_gd_demo.py
# Az író ezt a fájlt nem futtatta a kérésben; az alábbi kimenet kézzel számolt
# szemléltetés, a futás külön ellenőrizendő.
import numpy as np
x = np.array(3.0, dtype=np.float64) # bemeneti skalár
y = np.array(9.0, dtype=np.float64) # cél
lam = 0.2 # regularizációs erősség
eta = 0.05 # step size
def objective(w):
z = w * x
return 0.5 * (z - y) ** 2 + 0.5 * lam * w ** 2 # fél-MSE + lambda/2 w^2
def gradient(w):
z = w * x
return (z - y) * x + lam * w # (3w-9)*3 + 0.2w
def step(w):
return w - eta * gradient(w)
w = np.array(0.0, dtype=np.float64)
for t in range(6):
g = gradient(w)
print(f"t={t} w={w:.8f} F={objective(w):.8f} grad={g:.8f}")
w = step(w)
# Ellenőrzés: az első három frissítés egyezzen a kézi lépésekkel
w_repro = np.array(0.0, dtype=np.float64)
for expected in (1.35, 2.079, 2.47266):
w_repro = step(w_repro)
np.testing.assert_allclose(w_repro, expected, rtol=0.0, atol=5e-6)
print("ellenorzes: az elso harom lepes a kezi szamitassal egyezik (atol=5e-6)")Számított, nem futtatott kimenet (jelölt):
t=0 w=0.00000000 F=40.50000000 grad=-27.00000000
t=1 w=1.35000000 F=12.43350000 grad=-14.58000000
t=2 w=2.07900000 F=4.24912540 grad=-7.87320000
t=3 w=2.47266000 F=1.63274053 grad=-4.25152800
t=4 w=2.68523640 F=0.94156978 grad=-2.29582448
t=5 w=2.80002762 F=0.88775965 grad=-1.23974588
Futtatási parancs:
python n021_gd_demo.py.
Eredményértelmezés. Az értékek az analitikus képletekből számítottak; ha a futtatás eltér, előbb a kézzel való számítást, azután a kód szintaktikáját ellenőrizzük. A veszteség a tizedik lépésig várhatóan közelébe ér, mert az optimum a fent számított körüli érték; a konvergencia az esetén a szokásos lineáris sebességű, mivel , így a csillapítási tényező lépésenként közelítőleg.
F1 (fogalmi, nehézség 1). Fogalmazd meg saját szavakkal a különbséget az empirikus kockázat, a batch-átlag és a regularizáló penalty között. Adj egy példát, amelyben a batch-átlag nem egyenlő az empirikus kockázattal. Átadandó: rövid definíciók és az ellenpélda konkrét -nel, batchmérettel.
F2 (levezetési, nehézség 2). Legyen , , , , , modell (bias nélkül), , és cél . Vezesd le értékét a pontban, esetén. Átadandó: teljes levezetés, az alakellenőrzés és a konkrét numerikus gradiensvektor.
F3 (implementációs, nehézség 2). Implementáld a
fenti laborlépést általános
skalár,
bemenettel egy f3_gd.py függvényben úgy, hogy a futás a
értékeket adja vissza. Tedd ellenőrizhetővé: az
bemenetre az első három frissítés
,
,
.
Átadandó: a fájl teljes szövege, inputok, tolerancia és
futtatási parancs.
F4 (hibakeresési, nehézség 2). A következő függvény a paramétergradienst számítja:
def buggy_grad(W, X, Y):
Z = X @ W # (M, m)
R = Z - Y # (M, m)
return R.T @ X # (m, d), de hiányzik a batchnormálásMagyarázd meg, milyen hibát követ el, mi a következménye a gradienslépésre, és hogyan javítanád. Átadandó: a hiba oka, hatása és a javított függvény, valamint egy numerikus kontroll, amelyben és a javítás utáni gradiens éppen a felét adja a hibásnak.
F5 (kísérleti transzfer, nehézség 3). Tervezz kísérletet annak mérésére, hogy a regularizáció hogyan hat egy kis, procedurálisan generált lineáris regressziós feladat tanítási és validációs hibájára. A tervnek tartalmaznia kell: adatgenerálási recept, megfigyelési egység, split, baseline, a változó -értékek, a kiértékelendő metrika, a számítási erőforrás és a következtetési határ. Átadandó: a protokoll és legalább két lehetséges eredményértelmezés a korlátokkal.
F1 megoldás. Az empirikus kockázat a teljes mintára vett átlag ; a batch-átlag egy részhalmazra vett ; a penalty a modellparaméterektől függő, adattól független büntetőtag, például . Ha , , akkor , míg ; a kettő általában nem egyenlő, kivéve ha a batch éppen a teljes halmaz. A penalty akkor sem válik empirikus kockázattá, ha a batch az egész adat: az adatfüggő és paraméterbüntető tag más forrásból származik.
F2 megoldás. A tétel képletéből . Kezdőpontban , tehát . Ekkor , . A szorzat:
Így . A regularizáló zérus, tehát . Alakellenőrzés: , a gradiens is , helyes. A szerinti komponens : ha -et kis -nal növeljük, mindkét minta predikciója nő, a hibák negatívak, tehát a veszteség csökken, ezért a gradiens negatív.
F3 megoldás. A teljes fájl:
# f3_gd.py
import numpy as np
def gd_first_three(x=3.0, y=9.0, lam=0.2, eta=0.05):
def F(w):
z = w * x
return 0.5 * (z - y) ** 2 + 0.5 * lam * w ** 2
def grad(w):
return (w * x - y) * x + lam * w
w = 0.0
out = []
for _ in range(3):
w = w - eta * grad(w)
out.append(w)
return np.array(out, dtype=np.float64)
if __name__ == "__main__":
res = gd_first_three()
print(res)
np.testing.assert_allclose(res, [1.35, 2.079, 2.47266],
rtol=0.0, atol=5e-6)
print("ok")Futtatás: python f3_gd.py. Tolerancia: abszolút
,
mert a harmadik lépés értékét öt tizedesre kerekítettük; a tiszta
analitikus képletből további tizedesek is számíthatók, ezért a
tolerancia a kerekítést hidalja át.
F4 megoldás. A buggy_grad a
batch-összeget számítja, nem a batch-átlagot:
értéke
-szerese
az
átlaggradiensnek. Következmény: ha a lépésközt a normalizált gradiensre
hangoltuk, a hibás gradiens ötszörös, tízszeres, százszoros lépést
adhat, ami a célfüggvény növekedéséhez és divergenciához vezet. Javítás:
osszunk a batch méretével, vagy használjunk np.mean-alapú
szorzást:
def fixed_grad(W, X, Y):
M = X.shape[0]
Z = X @ W
R = Z - Y
return (R.T @ X) / M # (m, d), batch-átlagNumerikus kontroll: , , . Ekkor , ; a hibás grad , a javított .
F5 megoldásminta. Adat: , független standard normális , cél , . Megfigyelési egység: egy mintapont; itt nincs klaszterezés, ezért az egyszerű split elfogadható. Split: train/validation/test rétegezve a célkvantilisek szerint. Baseline: lineáris regresszió. Változó: , mindegyiknél rögzített gradienslépés, előzetes sanity checkkel. Metrika: validációs MSE; a döntés után a teszt MSE-t csak egyszer számítjuk. Erőforrás: CPU, NumPy, seed rögzítve az adatgeneráláshoz. Értelmezés: ha a validációs görbe U alakú, a kicsi alul-, a nagy túlregularizál; mivel az adat szintetikus és alacsony dimenziós, az eredmény nem vihető át nagy képmodellre. Lehetséges negatív eredmény: ha a zaj kicsi, a is jó, és a regularizálás nem javít; ez is érvényes, dokumentálandó eredmény.
Tévedés: a sum-reduction és a mean-reduction gradientse csak egy konstansban tér el, ezért a tanulási ráta átállításával mindegy, melyiket használjuk. A konstans valóban egy batch -szeres skálája, de a gyakorlati következmény éles: legyen , , , modell . A fél-MSE mean-veszteség , gradiense -nál . A sum-változat gradiense . Ha a lépésközt a mean-hez hangoltuk, a sum használata effektív -es lépést ad, ami a fenti példa stabilitási tartományát is elhagyhatja. A tanulság: a reduction nem hibátlan átskálázás, hanem a célfüggvény definíciójának része; a hangolása csak azonos skálázás mellett összehasonlítható [P02].
Önellenőrzési lista.
A fenti tétel levezetése a 2.1. Python, NumPy és tenzoralak alfejezetben bevezetett tenzoralak és broadcasting, valamint a 4.4. I. ellenőrző pont: matematika és kód megfelelése alfejezetben bemutatott elemenkénti láncszabály közvetlen következménye; a biasgradiens a broadcast backward szabálya szerint oszlopösszegből áll.
Az empirikus kockázat a teljes minta átlaga, a batch-átlag annak minibatch-közelítése, a regularizáló penalty pedig adatfüggetlen paraméterbüntetés. A fél-MSE gradiense , a biasgradiens ; az -tag gradiense . A gradienslépés . A Taylor-sor szerint elegendően kis lépésköz csökkentést jelez, de ez lokális állítás, nem globális konvergenciabizonyíték. A sum és mean reduction a gradiens skáláját batchméretezővel változtatja; ez nem közömbös konvenció.
A 6.2. Konvexitás és sima optimalizálási határ alfejezetben a konvexitás és a simaság fogalmát vezetjük be, hogy a gradienslépés csökkenésére ne csak lokális Taylor-érvünk legyen, hanem megadott Lipschitz-feltétel melletti kvantitatív korlát. A 6.3. Sztochasztikus és minibatch gradiens alfejezetben a minibatch-mintavétel varianciáját elemezzük, ahol az itt levezetett skálák döntik el a lépésköz és a batchméret együttes hangolását.