A Meredekség és numerikus derivált alfejezet egyetlen bemeneti koordináta mentén értelmezte a deriváltat. A predikciós modellek azonban általában több paraméterrel dolgoznak: egy lineáris modell súlyvektora dimenziós, és a veszteségfüggvény minden paraméter együttesétől függ. Itt két paraméter felületén dolgozunk, hogy megkülönböztessük az egyirányú változást a teljes gradiensvektortól.
Konkrét helyzet. Bemenet: a paraméterpárból álló vektor; megfigyelési egység: egy paraméterpont; kimenet: a skalár veszteség
Cél: kiszámítani a parciális deriváltakat és a gradienst, megrajzolni a szintvonalakat (contour), majd három gradienslépés irányát megjelölni. Ellenőrzési feltétel: a parciális deriváltak numerikus centrális közelítése a pontban -ön belül egyezzen a képletből kapott értékkel, és mindhárom gradienslépés csökkentse a veszteséget. Induló becslés: a pontban ; várt gradiens ; az tanulási rátával tett három lépés után a veszteség -ról körülbelül -re csökken.
Egy függvény -edik koordinátája szerinti parciális deriváltja (partial derivative) azt méri, hogyan változik a kimenet, ha csak a bemenetet mozdítjuk, a többi koordinátát pedig rögzítjük:
Jelölések: a koordináta indexe; a kis lépés; a skalár kimenet. A megszokott egyenes helyett a görbített jel különbözteti meg a többváltozós esetet. A mértékegység ugyanaz a logika, mint az egyváltozós deriváltnál: a veszteség egysége osztva a -edik paraméter egységével.
A példánkban a rögzítésével egyváltozós függvényként viselkedik, ezért a Meredekség és numerikus derivált alfejezetben tanult szabállyal
A gradiens (gradient) a parciális deriváltakat egyetlen, a bemenettel azonos dimenziójú vektorba gyűjti:
A (nabla) operátor jelzi, hogy minden koordináta szerinti deriváltat egyszerre képzünk. A NumPy-tömbben a gradiens shape-je ugyanaz, mint a paramétervektoré, tehát esetünkben . A példában
A gradiens pontbeli értéke a pontban
A gradiens nem két egymástól független szám: vektorként iránya és hossza is van. A hossz a Mátrixszorzás és lineáris transzformáció alfejezetben bevezetett euklideszi norma:
A norma mértékegysége veszteség per paraméteregység; számszerűen azt mondja meg, hogy a leggyorsabb növekedési irányban egységnyi paraméterelmozdulásra körülbelül egység veszteségváltozás jut.
Miért a gradiens mutat a legmeredekebb emelkedő felé? Legyen egy egységvektor, azaz . Az irányú iránymenti derivált azt méri, mennyire változik , ha -ből irányba mozdulunk. Két változóra a lineáris közelítésből:
ahol a gradiens és közötti szög, a pedig a Mátrixszorzás és lineáris transzformáció alfejezetből ismert skalárszorzat. A akkor maximális, ha , azaz párhuzamos a gradienssel. Ekkor a derivált . A leggyorsabb csökkenés ezért a irány, amelyet csökkenési iránynak (descent direction) nevezünk.
A szintvonal (contour) azon pontok halmaza, ahol a függvényérték állandó. A alakú görbét kell elképzelni. A példánkban
Ha , akkor csak az origó tartozik ide. Ha , az egyenletet alakra rendezve látszik: ellipsziseket kapunk, amelyek a tengely mentén laposabbak, mert a tag miatt ott gyorsabban nő a veszteség. A szintvonalak sűrűsége ezért a irányban nagyobb: ugyanakkora elmozdulás mellett több értékszintet lépünk át.
A gradiens a szintvonal érintőjére merőlegesen áll, és a nagyobb értékek felé mutat. Ez következik az iránymenti deriváltból is: ha érintő irányú, akkor a szintvonalon haladva a veszteség nem változik, tehát . A skalárszorzat nulla volta éppen a két vektor merőlegességét jelenti.
A gradiens módszer (gradient descent) a csökkenési irányt használja iteratív lépésekre:
Jelölések: a paramétervektor a -adik iterációban; a tanulási ráta (learning rate); a gradiens a -adik pontban. A lépés mértékegysége konzisztens: az paraméteregység négyzete per veszteségegység, így az szorzat visszaadja a paraméter mértékegységét. A gyakorlatban -t dimenziótlan hangolóparaméterként kezeljük.
A lineáris közelítés megmutatja, miért csökken kis lépésnél a veszteség:
Mivel a tag nemnegatív, kis mellett a második tag csökkentést ad. A gradiens tehát lokális változási információ: megmondja az irányt, de a távolságot nem. Azt a tanulási ráta dönti el, és túl nagy esetén a lineáris közelítés érvényét veszti.
A labor célja a kétdimenziós kvadratikus veszteség contour-rajza és
három gradienslépés irányának jelölése. A kód a lab projekt
alap numerikus csomagjait használja; a munkakönyvtár legyen a projekt
gyökere. Nincs szükség hálózatra vagy külső API-ra. Futtatás platformtól
függetlenül:
python s042_gradient_steps.pyA PowerShell és a macOS/Linux terminál is ezt a parancsot használja a projekt gyökeréből. A kód a következő.
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
def loss(w):
w1, w2 = w
return w1**2 + 4 * w2**2
def grad(w):
w1, w2 = w
return np.array([2 * w1, 8 * w2])
# Három gradienslépés a (2, 1.5) pontból.
w0 = np.array([2.0, 1.5])
eta = 0.1
points = [w0]
w = w0.copy()
for k in range(3):
w = w - eta * grad(w)
points.append(w)
print("Lépések és veszteségek (elméletileg várható):")
for k, p in enumerate(points):
print(f"k={k}: w=({p[0]:.6f}, {p[1]:.6f}), L={loss(p):.6f}")
# Numerikus ellenőrzés centrális differenciával, s041 öröksége.
h = 1e-5
g_approx = np.array([
(loss(w0 + np.array([h, 0])) - loss(w0 - np.array([h, 0]))) / (2 * h),
(loss(w0 + np.array([0, h])) - loss(w0 - np.array([0, h]))) / (2 * h),
])
print("Analitikus gradiens:", grad(w0))
print("Numerikus gradiens:", g_approx)
print("Maximális eltérés:", np.max(np.abs(g_approx - grad(w0))))
# SciPy ellenőrzés: a gradiens és a loss ugyanazt a minimumot adja-e.
res = minimize(loss, x0=[2.0, 1.5], jac=grad, method="BFGS")
print("SciPy minimumhely (elméletileg várható):", res.x, "veszteség:", res.fun)
# Contour- és lépésrajz.
w1 = np.linspace(-2.5, 2.5, 101)
w2 = np.linspace(-2.0, 2.0, 101)
W1, W2 = np.meshgrid(w1, w2)
Z = W1**2 + 4 * W2**2
fig, ax = plt.subplots(figsize=(7, 5))
cs = ax.contour(W1, W2, Z, levels=[0.5, 1, 2, 5, 10, 15], colors="0.7")
ax.clabel(cs, fontsize=8)
ax.scatter([p[0] for p in points], [p[1] for p in points], color="black", s=18, zorder=3)
# A nyilak csak az irányt mutatják, nem a teljes lépéshosszt: -grad / norma.
for p in points[:3]:
direction = -grad(p) / np.linalg.norm(grad(p))
ax.arrow(p[0], p[1], 0.4 * direction[0], 0.4 * direction[1],
width=0.02, color="black", length_includes_head=True, zorder=4)
ax.set_xlabel("w1")
ax.set_ylabel("w2")
ax.set_aspect("equal")
ax.grid(True, alpha=0.3)
ax.set_title("Kvadratikus veszteség és három gradienslépés")
fig.tight_layout()
fig.savefig("s042_gradient_steps.png", dpi=150)A s042_gradient_steps.png fájl a labor átadandó
eredménye. A nyilak a
irányt mutatják, tehát a csökkenési irányt, nem a tanulási rátával
skálázott tényleges lépéshosszat. Ez az ábrán a szintvonalra merőleges
stációként jelenik meg.
A kód kimenete elméletileg várt, nem e szöveg írásakor futtatott mérés. A várt numerikus értékek:
A veszteség csökken; tehát az tanulási ráta ehhez a felülethez elég kicsi, és a lineáris közelítés mindhárom lépésben működik. A gradiens első lépése : az y irányú komponens nagyobb, mert a tag miatt ott meredekebb a felület. A szintvonalak ennek megfelelően az y tengely mentén sűrűbbek.
Kézi kontroll az első lépésre:
A veszteség . A második lépésben a gradiens , a harmadikban . A csökkenés egyre lassul, mert az origóhoz közeledve a gradiens hossza is csökken. Invariáns: az origóban a gradiens ; ott a gradienslépés nem változtat semmit. A numerikus ellenőrzés a centrális differenciával a Meredekség és numerikus derivált alfejezetben tanult egyensúlyt használja: a hiba csonkítási tagjából és a lebegőpontos kerekítésből adódik, ezért a várt eltérés alatt marad.
A gradiens normáját a paraméterek választott skálája befolyásolja. A paraméterek átparaméterezése után a koordinátánkénti gradiens és az optimális lépésköz megváltozik; ezért a konvergenciát ne kizárólag a nyers gradiensnormából ítéljük meg.
Értelmezés. Adott ugyanez az függvény. a) Add meg a parciális deriváltakat és a gradienst a pontban. b) Igazold számítással, hogy a gradiens irányába mutató egységvektorral vett iránymenti derivált -lel egyenlő. c) Számítsd ki a irányú iránymenti deriváltat is, és magyarázd meg, miért kisebb annál, mint a gradiens irányában.
Megvalósítás. Írj egy rövid Python-függvényt,
amely loss, grad, w0,
eta és steps bemenetekkel elvégzi a
gradienslépéseket, és visszaadja a lépések listáját, valamint
True értéket, ha a veszteség minden lépésben csökkent,
egyébként False-t. Ellenőrizd
függvényen
lépéssel,
,
bemenetekkel. A kódnak a bemeneti hibákra, például a nem
hosszú w0-ra, ValueError-t kell
dobnia.
Hibadiagnózis. Az alábbi kód állítólag minimalizál, de a veszteség nem csökken:
w = np.array([2.0, 1.5])
for k in range(3):
g = np.array([8 * w[0], 2 * w[1]])
w = w + 0.1 * gMagyarázd meg a két hibát, javítsd ki, és ellenőrizd az első lépés utáni veszteséget.
1. feladat. a) A képletből , . A pontban . b) A norma ; az egységvektor . A skalárszorzat , ami a várt normával egyezik kerekítési tűrésen belül. c) A irányban . Ez kisebb, mint ; mert a irány nem a leggyorsabb növekedés iránya.
2. feladat. A függvény:
def descent(loss, grad, w0, eta, steps):
if len(w0) != 2:
raise ValueError("A w0 vektor hossza 2 legyen.")
decreasing = True
points = [w0.copy()]
previous = loss(w0)
w = w0.copy()
for _ in range(steps):
w = w - eta * grad(w)
current = loss(w)
if current >= previous:
decreasing = False
points.append(w)
previous = current
return points, decreasingA
lépés után a veszteség
-ról
körülbelül
-ra
csökken, és decreasing True, mert az
ennél a felületnél elég kicsi. A ValueError ellenőrzése
w0=np.array([1.0]) bemenettel egyszerűen tesztelhető.
3. feladat. Az első hiba: a parciális deriváltak fel vannak cserélve. Az gradienséhez kell, nem . A második hiba az előjel: a csökkenési irány , ezért hozzáadása helyett ki kell vonni. A javított lépés:
w = w - 0.1 * np.array([2 * w[0], 8 * w[1]])Az első lépés után , , szemben a hibás lépés , értékével, ami növekedés.
4. feladat. a) A belső deriváltja , a deriváltja ; a konstans deriváltja . Ezért
és a minimum ott van, ahol mindkét komponens nulla: , ; a minimumérték . b) A pontban a gradiens , a lépés
A veszteség előtte , utána . c) A gradiens normája a lokális meredekség, nem a minimum távolsága. A veszteség felülete itt anizotrop: a irányban -es, a irányban -ös együttható skáláz. A gradiens e skálák kombinációjából adódik, míg a paramétertérbeli távolság . A két mennyiség más mértékegységű és más információt hordoz: a gradiens normája a pillanatnyi változási ráta, a távolság a megmaradt út.
Gyakori tévedés. „A gradiens a minimum helye.” Ez hibás. A gradiens pontbeli lokális változási információ, és általában nem a minimum koordinátája. Ellenpélda: az felületen a pontban a gradiens , de a minimum a . Ha valaki a gradiens értékét minimumként olvasná, a pontba jutna, ahol a veszteség , vagyis sokkal rosszabb, mint a kiinduló . A gradienslépés csak a irányba mozdít; a tényleges célhoz több iteráción át, megfelelő tanulási rátával közelít.
Visszautalás korábbi fogalomra. A Meredekség és numerikus derivált egyváltozós deriváltja a parciális derivált speciális esete: ha , akkor egyetlen szám. A centrális differencia itt koordinátánként ugyanazt a képletet használja, csak a többi koordinátát rögzítjük. A Mátrixszorzás és lineáris transzformáció alfejezetből a vektorok és a skalárszorzat adja a keretet: a gradiens dimenziós vektor, az iránymenti derivált pedig az skalárszorzat. A Join-kardinalitás és duplázódó célváltozó alfejezethez hasonlóan itt is fontos az egységek következetessége: a veszteség és a paraméterek mértékegységét nem szabad összekeverni.
Önellenőrzés.
Válaszok: 1. A parciális derivált ugyanaz a határérték, de a többi bemenetet rögzítjük. 2. Az irány a legmeredekebb növekedés, a hossz az abban az irányban vett meredekség nagysága. 3. Merőleges a szintvonal érintőjére. 4. Túl nagy tanulási ráta esetén a lineáris közelítés érvényét veszti, és a módszer túllendül a csökkenő tartományon.
A parciális derivált egy koordináta menti változási ráta, a gradiens pedig az összes parciális deriváltból álló, a paramétertérrel azonos dimenziójú vektor. A gradiens iránya a legmeredekebb emelkedőt, hossza a legnagyobb meredekséget mutatja; a csökkenési irány ezért . A szintvonalakon a gradiens merőleges az érintőre. A gradienslépés ; a tanulási ráta a lépés hosszát szabja, túl nagy értéknél a veszteség nőhet. A kvadratikus felület laborja három ellenőrzött lépéssel és contour-rajzzal igazolta ezt. A következő Láncszabály és számítási gráf a láncszabályon át a számítási gráfot és a többrétegű függvények gradiensét építi fel.