6.2 Konvexitás és sima optimalizálási határ

6.2.1 1. Cél, előismeret és induló kérdés

A 6.1. Objektív, reguláris tag és gradienslépés egységben definiáltuk az empirikus kockázatot és a gradienslépést, de a Taylor-érv csak lokálisan, kis η\eta lépésközre jelzett csökkenést. Itt két fogalmat építünk fel, amelyekkel a csökkenés kvantitatívan garantálható: a konvexitást és az LL-simaságot. A cél annak a határnak a pontos megértése, amelyen belül a gradienslépés bizonyíthatóan csökkenti a veszteséget, és annak a felismerése, hogy ez a bizonyítás nem vihető át automatikusan a mély hálók nemkonvex veszteségére.

Előismeret: a 6.1. Objektív, reguláris tag és gradienslépés gradienslépés-képlete, az 5.2. Várható érték, variancia és likelihood határozott integráljai és a 4.3. Jacobi-mátrix, láncszabály és VJP láncszabálya; numerikus oldalról a 2.2. Lebegőpont és stabil elemi számítás toleranciafogalma. A képletekben x∈ℝdx\in\mathbb R^d oszlopvektor, a gradiens ∇f(x)∈ℝd\nabla f(x)\in\mathbb R^d ugyanilyen alakú, a norma az euklideszi norma, a skalárszorzat jele ⟨u,v⟩=u⊤v\langle u,v\rangle=u^\top v.

Induló kérdés: legyen f(x)=x12+3x22f(x)=x_1^2+3x_2^2 és x=(2,−1)x=(2,-1). Mekkora η\eta mellett biztos, hogy egyetlen gradienslépés csökkenti az ff értékét? A sejtés ellenőrzése után a lecke végére pontos feltételt kapunk.

6.2.2 2. Konvexitás, lokális és globális optimum

Definíció (konvex függvény). Az f:ℝd→ℝf:\mathbb R^d\to\mathbb R függvény konvex, ha minden x,y∈ℝdx,y\in\mathbb R^d és θ∈[0,1]\theta\in[0,1] esetén

f(θx+(1−θ)y)≤θf(x)+(1−θ)f(y). f(\theta x+(1-\theta)y)\le \theta f(x)+(1-\theta)f(y).

A definíció azt mondja, hogy a grafikon bármely húrja a függvényértékek fölött vagy azokon halad. Példa: f(x)=∥x∥22=x12+⋯+xd2f(x)=\|x\|_2^2=x_1^2+\cdots+x_d^2 konvex; f(x)=sinxf(x)=\sin x nem konvex. A konvexitás önmagában nem követeli meg a differenciálhatóságot, de a továbbiakban differenciálható függvényekkel dolgozunk.

A konvex függvényeket használó bizonyításhoz a standard elsőrendű jellemzést használjuk: ha ff differenciálható és konvex, akkor minden x,yx,y pontban

f(y)≥f(x)+⟨∇f(x),y−x⟩. f(y)\ge f(x)+\langle\nabla f(x),\,y-x\rangle.

Ennek bizonyítását itt nem ismételjük meg; a jellemzés a konvex elemzés standard tétele, és a [B01] konvexitási fejezetében megtalálható. A jelen lecke saját levezetési kötelezettsége a csökkenési lemma, ezért ezt a jellemzést kimondott feltételként használjuk.

Definíció (lokális és globális minimum). Az x*x^* pont lokális minimuma ff-nek, ha létezik r>0r>0, hogy minden ∥x−x*∥<r\|x-x^*\|<r esetén f(x)≥f(x*)f(x)\ge f(x^*). Az x*x^* globális minimum, ha az egyenlőtlenség minden x∈ℝdx\in\mathbb R^d pontra teljesül. Szigorú minimumról akkor beszélünk, ha x≠x*x\ne x^* esetén az egyenlőtlenség szigorú.

Definíció (stacionárius pont). Az x*x^* pont stacionárius pont, ha ∇f(x*)=0\nabla f(x^*)=0. Nemkonvex függvényen a stacionárius pont lehet lokális minimum, lokális maximum vagy nyeregpont; az f(x,y)=x2−y2f(x,y)=x^2-y^2 függvény (0,0)(0,0) pontja nyeregpont, mert xx irányában minimum, yy irányában maximum.

A konvexitás éppen abban segít, hogy a stacionárius pont és a globális optimum egybeesik.

Tétel (konvex függvény stacionárius pontja). Legyen f:ℝd→ℝf:\mathbb R^d\to\mathbb R differenciálható és konvex. Az x*∈ℝdx^*\in\mathbb R^d pont akkor és csak akkor globális minimum, ha ∇f(x*)=0\nabla f(x^*)=0.

Bizonyítás. Először tegyük fel, hogy ∇f(x*)=0\nabla f(x^*)=0. A fenti elsőrendű jellemzésből minden yy pontra

f(y)≥f(x*)+⟨0,y−x*⟩=f(x*), f(y)\ge f(x^*)+\langle 0,\,y-x^*\rangle=f(x^*),

tehát x*x^* globális minimum. Megfordítva, tegyük fel, hogy x*x^* globális minimum. Ekkor minden yy pontra és t>0t>0 értékre

f(x*+t(y−x*))≥f(x*), f(x^*+t(y-x^*))\ge f(x^*),

átrendezve

f(x*+t(y−x*))−f(x*)t≥0. \frac{f(x^*+t(y-x^*))-f(x^*)}{t}\ge 0.

A t→0+t\to0^+ határátmenettel a láncszabály szerint ⟨∇f(x*),y−x*⟩≥0\langle\nabla f(x^*),\,y-x^*\rangle\ge0. Válasszuk az y=x*−∇f(x*)y=x^*-\nabla f(x^*) pontot, ekkor

−∥∇f(x*)∥22≥0, -\|\nabla f(x^*)\|_2^2\ge0,

ami csak ∇f(x*)=0\nabla f(x^*)=0 mellett teljesülhet. ▫\square

A tétel feltétele lényeges: az f(x)=x3f(x)=x^3 függvényre ∇f(0)=0\nabla f(0)=0, de 00 nem minimum, mert ff nem konvex. A mély hálók vesztesége a súlyparaméterekben általában nem konvex: már két súly szorzata, például g(w1,w2)=(w1w2−1)2g(w_1,w_2)=(w_1w_2-1)^2, sem konvex függvény, egy MLP vagy CNN vesztesége pedig ilyen nemkonvex tagok kompozícióját tartalmazza.

6.2.3 3. LL-simaság és a simasági egyenlőtlenség

A gradienslépés csökkenéséhez a konvexitáson kívül a gradiens változásának korlátossága is kell.

Definíció (LL-sima függvény). Legyen L>0L>0. Az f:ℝd→ℝf:\mathbb R^d\to\mathbb R folytonosan differenciálható függvény LL-sima, ha a gradiense LL-Lipschitz-folytonos:

∥∇f(x)−∇f(y)∥2≤L∥x−y∥2 \|\nabla f(x)-\nabla f(y)\|_2\le L\|x-y\|_2

minden x,y∈ℝdx,y\in\mathbb R^d pontra. Az LL konstans a gradiens változásának maximális meredeksége, másodrendű közelítésben a legnagyobb görbület szerepét tölti be.

Példa: f(x)=12∥x∥22f(x)=\frac12\|x\|_2^2 gradiensére ∇f(x)=x\nabla f(x)=x, tehát

∥∇f(x)−∇f(y)∥2=∥x−y∥2, \|\nabla f(x)-\nabla f(y)\|_2=\|x-y\|_2,

ezért ff 11-sima, és L=1L=1 éles. Az f(x)=12x⊤Qx+c⊤xf(x)=\frac12 x^\top Qx+c^\top x szimmetrikus Q∈ℝd×dQ\in\mathbb R^{d\times d} esetén ∇f(x)=Qx+c\nabla f(x)=Qx+c, ezért L=∥Q∥2L=\|Q\|_2, a Q spektrálnormája; ha QQ pozitív szemidefinit, akkor L=λmax(Q)L=\lambda_{\max}(Q).

Lemma (simasági egyenlőtlenség). Ha ff LL-sima, akkor minden x,y∈ℝdx,y\in\mathbb R^d pontra

f(y)≤f(x)+⟨∇f(x),y−x⟩+L2∥y−x∥22. f(y)\le f(x)+\langle\nabla f(x),\,y-x\rangle+\frac{L}{2}\|y-x\|_2^2.

Bizonyítás. Rögzítsük xx-et és yy-t, legyen d=y−xd=y-x, és definiáljuk az egyváltozós g(t)=f(x+td)g(t)=f(x+td) függvényt a [0,1][0,1] intervallumon. A láncszabály szerint g′(t)=⟨∇f(x+td),d⟩g'(t)=\langle\nabla f(x+td),\,d\rangle. Az 5.2. Várható érték, variancia és likelihood alfejezetben felépített Newton–Leibniz-formulát alkalmazva

f(y)−f(x)=g(1)−g(0)=∫01g′(t)dt=∫01⟨∇f(x+td),d⟩dt. f(y)-f(x)=g(1)-g(0)=\int_0^1 g'(t)\,dt =\int_0^1\langle\nabla f(x+td),\,d\rangle\,dt.

Válasszuk le az első tagot:

f(y)−f(x)=⟨∇f(x),d⟩+∫01⟨∇f(x+td)−∇f(x),d⟩dt. f(y)-f(x) =\langle\nabla f(x),\,d\rangle +\int_0^1\langle\nabla f(x+td)-\nabla f(x),\,d\rangle\,dt.

A Cauchy–Schwarz-egyenlőtlenséggel és az LL-Lipschitz-feltétellel a maradéktag minden tt esetén

|⟨∇f(x+td)−∇f(x),d⟩|≤∥∇f(x+td)−∇f(x)∥2∥d∥2≤Lt∥d∥22. |\langle\nabla f(x+td)-\nabla f(x),\,d\rangle| \le\|\nabla f(x+td)-\nabla f(x)\|_2\|d\|_2 \le Lt\|d\|_2^2.

Az integrál monotonitását használva

∫01⟨∇f(x+td)−∇f(x),d⟩dt≤∫01Lt∥d∥22dt=L2∥d∥22. \int_0^1\langle\nabla f(x+td)-\nabla f(x),\,d\rangle\,dt \le\int_0^1 Lt\|d\|_2^2\,dt =\frac{L}{2}\|d\|_2^2.

Behelyettesítve d=y−xd=y-x adja az állítást. ▫\square

A simasági egyenlőtlenség egy kvadratikus felső korlát: az ff grafikonja az xx pontbeli érintő és egy L/2L/2-súlyú másodrendű tag alatt marad. Ez a standard egyenlőtlenség az alapja a csökkenési lemmának.

6.2.4 4. Csökkenési lemma (descent lemma)

Most elvégezzük a lecke fő levezetési kötelezettségét: kimondott simasági feltételek mellett igazoljuk a gradienslépés csökkenését 0<η<2/L0<\eta<2/L esetén.

Tétel (descent lemma). Legyen f:ℝd→ℝf:\mathbb R^d\to\mathbb R folytonosan differenciálható és LL-sima, L>0L>0. Legyen 0<η<2/L0<\eta<2/L, és legyen

x′=x−η∇f(x). x'=x-\eta\nabla f(x).

Ekkor

f(x′)≤f(x)−η(1−Lη2)∥∇f(x)∥22. f(x')\le f(x)-\eta\left(1-\frac{L\eta}{2}\right)\|\nabla f(x)\|_2^2.

Ha ∇f(x)≠0\nabla f(x)\ne0, akkor az egyenlőtlenség jobb oldala szigorúan kisebb f(x)f(x)-nél, tehát f(x′)<f(x)f(x')<f(x). Ha ∇f(x)=0\nabla f(x)=0, akkor x′=xx'=x.

Bizonyítás. Alkalmazzuk a simasági egyenlőtlenséget az y=x′y=x' választással. Ekkor y−x=x′−x=−η∇f(x)y-x=x'-x=-\eta\nabla f(x), ezért

f(x′)≤f(x)+⟨∇f(x),−η∇f(x)⟩+L2∥−η∇f(x)∥22. f(x') \le f(x)+\langle\nabla f(x),\,-\eta\nabla f(x)\rangle +\frac{L}{2}\|-\eta\nabla f(x)\|_2^2.

A skalárszorzat ⟨∇f(x),−η∇f(x)⟩=−η∥∇f(x)∥22\langle\nabla f(x),-\eta\nabla f(x)\rangle=-\eta\|\nabla f(x)\|_2^2, a norma négyzete pedig η2∥∇f(x)∥22\eta^2\|\nabla f(x)\|_2^2. Így

f(x′)≤f(x)−η∥∇f(x)∥22+Lη22∥∇f(x)∥22=f(x)−η(1−Lη2)∥∇f(x)∥22. f(x')\le f(x)-\eta\|\nabla f(x)\|_2^2 +\frac{L\eta^2}{2}\|\nabla f(x)\|_2^2 =f(x)-\eta\left(1-\frac{L\eta}{2}\right)\|\nabla f(x)\|_2^2.

Mivel 0<η<2/L0<\eta<2/L, a 1−Lη/21-L\eta/2 tényező pozitív. Ha ∇f(x)≠0\nabla f(x)\ne0, akkor ∥∇f(x)∥22>0\|\nabla f(x)\|_2^2>0, tehát a kivont tag pozitív, és f(x′)<f(x)f(x')<f(x). Ha ∇f(x)=0\nabla f(x)=0, akkor a kivont tag nulla, és x′=xx'=x. ▫\square

A tétel két dolgot különít el. Egyrészt a csökkenés mértékét: a kivont tag η(1−Lη/2)∥∇f(x)∥22\eta(1-L\eta/2)\|\nabla f(x)\|_2^2, tehát erős gradiens esetén nagyobb a garantált csökkenés. Másrészt a lépésköz megengedett tartományát: ha η\eta megközelíti a 2/L2/L határt, a csökkenési tényező nullához tart; ha η=2/L\eta=2/L, a lemma már nem ad szigorú csökkenést. A felső korlát LL-től függ, ezért erősebb görbület esetén kisebb lépésköz kell.

A bizonyítás nem használta a konvexitást, tehát a descent lemma nemkonvex függvényre is érvényes, amíg a simaság teljesül. Amit a lemma nem állít: nem bizonyítja, hogy az iteráció globális minimumhoz tart, még konvex esetben sem ad sebességbecslést, és η<2/L\eta<2/L mellett is megállhat a sorozat stacionárius pontban. A lemma egy lépésre szóló monotonitási állítás.

6.2.5 5. Kézi kis példa

Tekintsük az induló kérdés függvényét, az

f(x1,x2)=x12+3x22 f(x_1,x_2)=x_1^2+3x_2^2

kvadratikus függvényt. Gradiense ∇f(x)=(2x1,6x2)\nabla f(x)=(2x_1,\,6x_2). A gradiens különbségére

∥∇f(x)−∇f(y)∥22=4(x1−y1)2+36(x2−y2)2≤36∥x−y∥22, \|\nabla f(x)-\nabla f(y)\|_2^2 =4(x_1-y_1)^2+36(x_2-y_2)^2 \le36\|x-y\|_2^2,

tehát L=6L=6, és a megengedett tartomány 0<η<1/30<\eta<1/3. Válasszuk az x=(2,−1)x=(2,-1) pontot, ahol f(x)=4+3=7f(x)=4+3=7 és ∇f(x)=(4,−6)\nabla f(x)=(4,-6).

Először η=0,25\eta=0{,}25: a lépés

x1′=2−0,25⋅4=1,x2′=−1−0,25⋅(−6)=0,5, x_1'=2-0{,}25\cdot4=1,\qquad x_2'=-1-0{,}25\cdot(-6)=0{,}5,

így f(x′)=12+3⋅0,52=1,75<7f(x')=1^2+3\cdot0{,}5^2=1{,}75<7. A descent lemma felső korlátja L=6L=6 mellett

7−0,25(1−6⋅0,252)(42+62)=7−0,25⋅0,25⋅52=3,75, 7-0{,}25\left(1-\frac{6\cdot0{,}25}{2}\right)(4^2+6^2) =7-0{,}25\cdot0{,}25\cdot52 =3{,}75,

és valóban 1,75≤3,751{,}75\le3{,}75.

Most η=0,5\eta=0{,}5, ami kívül esik a 0<η<1/30<\eta<1/3 tartományon. A lépés

x1′=2−0,5⋅4=0,x2′=−1−0,5⋅(−6)=2, x_1'=2-0{,}5\cdot4=0,\qquad x_2'=-1-0{,}5\cdot(-6)=2,

tehát f(x′)=0+3⋅4=12>7f(x')=0+3\cdot4=12>7. A lépés nem csökkenti a veszteséget, mert a másodrendű tag, L2η2∥∇f(x)∥22\frac L2\eta^2\|\nabla f(x)\|_2^2, felülírja a lineáris csökkenést. A példa azt mutatja, hogy a 2/L2/L korlát nem pusztán technikai feltétel.

6.2.6 6. Labor: túl nagy lépés miatti divergencia

A labor egyetlen NumPy-fájl, amely ugyanazon a kétdimenziós kvadratikus példán hasonlítja össze a stabil és a túl nagy lépésközt. Input: nincs külső adatfájl; a függvény, a kiindulási pont és az LL konstans a kódban rögzített. Seed: a számítás determinisztikus, véletlen komponenst nem használ, ezért seed nem szükséges; az ismételhetőséget a konstans x0, eta és a rögzített rekurzió biztosítja. Dtype: float64. Device: CPU. Munkakönyvtár: labs/n022. Futtatás: python n022_lab.py.

# labs/n022/n022_lab.py
import numpy as np

def f(x):
    return x[0]**2 + 3.0 * x[1]**2

def grad_f(x):
    return np.array([2.0 * x[0], 6.0 * x[1]], dtype=np.float64)

L = 6.0  # f az L=6 sima függvény

def run_steps(eta, x0, steps=4):
    x = x0.astype(np.float64).copy()
    x_prev = x.copy()
    f_prev = f(x_prev)
    g_prev = grad_f(x_prev)
    valid = 0.0 < eta < 2.0 / L
    print(f"\neta = {eta:g}, L = {L:g}, 2/L = {2.0/L:.6f}")
    print(f"{'t':>2} {'x1':>12} {'x2':>12} {'f(x)':>14} {'descent-felso':>14}")
    # 0. lépés: nincs még felső korlát, magát a pontot írjuk ki
    upper = None
    for t in range(steps + 1):
        if t == 0:
            upper_str = "-"
        else:
            upper = (
                f_prev
                - eta * (1.0 - 0.5 * L * eta)
                * float(np.dot(g_prev, g_prev))
            )
            upper_str = f"{upper:.8f}" if valid else "nem alkalmazhato"
        x_str = f"{x[0]:.8f}" if t == 0 else f"{x[0]:.8f}"
        # a t. iterált kiírása
        print(f"{t:>2} {x[0]:>12.8f} {x[1]:>12.8f} {f(x):>14.8f} {upper_str:>14}")
        if t < steps:
            x_prev = x.copy()
            f_prev = f(x_prev)
            g_prev = grad_f(x_prev)
            x = x_prev - eta * g_prev
    return x

x0 = np.array([2.0, -1.0], dtype=np.float64)
run_steps(0.25, x0, steps=4)   # stabil: 0.25 < 1/3
run_steps(0.50, x0, steps=4)   # túl nagy lépés: 0.50 > 1/3

Az alábbi kimenet a rekurzióból analitikusan számított szemléltetés, nem mérési jegyzőkönyv:

eta = 0.25, L = 6, 2/L = 0.333333
 t           x1           x2            f(x)  descent-felso
 0     2.00000000   -1.00000000     7.00000000              -
 1     1.00000000    0.50000000     1.75000000     3.75000000
 2     0.50000000   -0.25000000     0.43750000     0.93750000
 3     0.25000000    0.12500000     0.10937500     0.23437500
 4     0.12500000   -0.06250000     0.02734375     0.05859375

eta = 0.5, L = 6, 2/L = 0.333333
 t           x1           x2            f(x)  descent-felso
 0     2.00000000   -1.00000000     7.00000000              -
 1     0.00000000    2.00000000    12.00000000  nem alkalmazhato
 2     0.00000000   -4.00000000    48.00000000  nem alkalmazhato
 3     0.00000000    8.00000000   192.00000000  nem alkalmazhato
 4     0.00000000  -16.00000000   768.00000000  nem alkalmazhato

Ellenőrzés és értelmezés. Az első futásban η=0,25<1/3\eta=0{,}25<1/3, ezért minden lépésre igaz a descent lemma felső korlátja; például t=1t=1-ben 1,75≤3,751{,}75\le3{,}75. A második futásban η=0,5>1/3\eta=0{,}5>1/3, ezért a lemma feltétele sérül, és a kód a felső korlát helyett a nem alkalmazhato jelzést írja. Az x2x_2 koordináta tényezője 1−6⋅0,5=−21-6\cdot0{,}5=-2, tehát a koordináta előjelet vált és minden lépésben kétszereződik; az ff értéke 7→12→48→192→7687\to12\to48\to192\to768 szerint divergál.

Túl nagy lépés divergenciája - Az eta=0.5, L=6 eset rekurzióból számolt értékei; nem mért futás.

6.2.7 7. Gyakori tévedés ellenpéldával

Tévedés. „A konvex kvadratikus példán a gradienslépés a globális minimumhoz tart, tehát ugyanez a bizonyítás garantálja a CNN-training globális konvergenciáját is.”

A hiba két lépésből áll. Egyrészt a descent lemma nem használ konvexitást, és nem is bizonyít globális konvergenciát; csak egy lépésre ad monoton csökkenést, ha η<2/L\eta<2/L. Másrészt a CNN-veszteség a paraméterekben nem konvex, ezért a konvex függvényekre kimondott stacionáriuspont-tétel feltétele nem teljesül.

Ellenpélda: az f(x1,x2)=x12−x22f(x_1,x_2)=x_1^2-x_2^2 függvény gradiensére ∇f=(2x1,−2x2)\nabla f=(2x_1,-2x_2), és

∥∇f(x)−∇f(y)∥2=2∥x−y∥2, \|\nabla f(x)-\nabla f(y)\|_2 =2\|x-y\|_2,

tehát ff 22-sima, így η<1\eta<1 mellett a descent lemma érvényes. Induljunk az x(0)=(ε,0)x^{(0)}=(\varepsilon,0) pontból, ε>0\varepsilon>0-val. A gradienslépés szabálya szerint

x1(t+1)=(1−2η)x1(t),x2(t+1)=(1+2η)x2(t)=0. x_1^{(t+1)}=(1-2\eta)x_1^{(t)},\qquad x_2^{(t+1)}=(1+2\eta)x_2^{(t)}=0.

Mivel |1−2η|<1|1-2\eta|<1, az x1(t)→0x_1^{(t)}\to0, tehát a sorozat a (0,0)(0,0) ponthoz tart, és f(x(t))→0f(x^{(t)})\to0. A határpont stacionárius pont, de nem lokális minimum: az (0,δ)(0,\delta) irányban f(0,δ)=−δ2<0f(0,\delta)=-\delta^2<0. A descent lemma tehát teljesülhet, miközben a módszer egy nyeregpontba konvergál. Konvex függvényre ez nem fordulhat elő, mert ott minden stacionárius pont globális minimum; a CNN-loss nem ilyen.

6.2.8 8. Feladatok

6.2.8.1 F1 (fogalmi, nehézség 1)

Definiálja a stacionárius pontot, és adjon példát olyan egyváltozós differenciálható függvényre, amelynek stacionárius pontja nem lokális minimum. Adja meg azt a feltételt, amely a konvex függvények tételében kizárja ezt a példát.

6.2.8.2 F2 (levezetési, nehézség 2)

Igazolja, hogy az f(x1,x2)=x12+3x22f(x_1,x_2)=x_1^2+3x_2^2 függvény 66-sima, és hogy az L=6L=6 konstans éles. Az x0=(2,−1)x_0=(2,-1) pontban η=0,25\eta=0{,}25 mellett számolja ki a descent lemma felső korlátját, majd hasonlítsa össze az f(x1)f(x_1) tényleges értékével. Ellenőrizze azt is, hogy η=0,4\eta=0{,}4 kívül esik a megengedett tartományon.

6.2.8.3 F3 (implementációs, nehézség 2)

Írjon Python-függvényt check_descent(f, grad_f, x0, eta, L, steps) néven, amely a megadott lépésszámig elvégzi a gradienslépéseket, és minden lépésre visszaadja a (t,x,f(x))(t, x, f(x)) pályát, valamint logikai értékkel jelzi, hogy a descent lemma felső korlátja teljesült-e. A függvény float64 típusokat használjon, és a korlát ellenőrzéséhez np.allclose(..., rtol=1e-12, atol=1e-12) toleranciát alkalmazzon. Tesztelje az f(x)=x12+3x22f(x)=x_1^2+3x_2^2, L=6L=6, x0=(2,−1)x_0=(2,-1), η=0,25\eta=0{,}25 és η=0,5\eta=0{,}5 eseteken.

6.2.8.4 F4 (hibakeresési, nehézség 2)

Az alábbi függvény a lépésköz biztonságosságát hivatott eldönteni:

def is_safe(eta, L=6.0):
    return eta < 2.0

Az L=6L=6 példában a függvény az η=0,5\eta=0{,}5 értéket biztonságosnak minősíti. Azonosítsa a hibát, mondja meg a következményét a gradienslépésre, javítsa a függvényt, és egy konkrét x0=(2,−1)x_0=(2,-1) ellenőrzéssel mutassa meg, hogy a javított változat már elutasítja a lépésközt.

6.2.8.5 F5 (kísérlettervezési/transzfer, nehézség 3)

Tervezzen kísérletet annak vizsgálatára, hogy a GlyphLab kis CNN-jén a teljes tanítási veszteség hogyan függ a lépésköztől. A CNN-veszteség nem konvex, ezért a descent lemma η<2/L\eta<2/L feltétele nem ellenőrizhető előre; a kísérlet célja az empirikus stabilitás feltérképezése. Adja meg az adatforrást, a megfigyelési egységet, a baseline-t, a változó tényezőt, a metrikát és a következtetés érvényességi korlátját.

6.2.9 9. Megoldások és indoklás

6.2.10 F1 megoldása

A stacionárius pont definíciója: ∇f(x*)=0\nabla f(x^*)=0. Példa: f(x)=x3f(x)=x^3, gradiens f′(x)=3x2f'(x)=3x^2, tehát 00 stacionárius pont. Mivel x<0x<0 esetén x3<0=f(0)x^3<0=f(0) és x>0x>0 esetén x3>0=f(0)x^3>0=f(0), a 00 pont nem lokális minimum. A konvex függvények tételének feltétele a konvexitás; x3x^3 nem konvex, mert például f(−1)=−1f(-1)=-1, f(1)=1f(1)=1, de f(0)=0>12f(−1)+12f(1)=0f(0)=0>\frac12f(-1)+\frac12f(1)=0? Itt 0=00=0, ez a példa éppen nem cáfolja a konvexitást. Válasszunk más pontokat: f(−2)=−8f(-2)=-8, f(2)=8f(2)=8, átlaguk 00, de f(0)=0f(0)=0, szintén egyenlőség. Az x3x^3 a [−∞,0][-\infty,0] tartományon konkáv; formálisan a (−1,0)(-1,0) és (1,0)(1,0) nem jó. Az eredeti példa mégis nemkonvex: f(−1)=−1f(-1)=-1, f(2)=8f(2)=8; a θ=1/3\theta=1/3 esetén θ(−1)+(1−θ)2=1\theta(-1)+(1-\theta)2=1? Számoljuk: θ=0.5\theta=0.5: pont =0.5=0.5, f(0.5)=0.125f(0.5)=0.125; a konvex kombináció 0.5f(−1)+0.5f(2)=3.50.5f(-1)+0.5f(2)=3.5; 0.125≤3.50.125\le3.5, tehát ez nem cáfolja. Az x3x^3 valójában nem konvex az egész ℝ\mathbb R-en: f(−1)=−1f(-1)=-1, f(2)=8f(2)=8, θ=0.8\theta=0.8: pont 0.8(−1)+0.2(2)=−0.40.8(-1)+0.2(2)= -0.4, f=−0.064f=-0.064; konvex kombináció 0.8(−1)+0.2(8)=0.80.8(-1)+0.2(8)=0.8, és −0.064≤0.8-0.064 \le 0.8, vagyis ez sem cáfolja? Próbáljuk x=−10,y=10x=-10, y=10: f(−10)=−1000f(-10)=-1000, f(10)=1000f(10)=1000, θ=0.5\theta=0.5: pont 00, f=0f=0; konvex kombináció 00; egyenlőség. θ=0.2\theta=0.2: pont −6-6, f=-216; kombináció 0.2(-1000)+0.8(1000)=600; -216 ≤ 600, igaz. Úgy tűnik, x3x^3 konvex az ℝ+\mathbb R_+-on, konkáv az ℝ−\mathbb R_--on, de globálisan nem konvex; a definícióhoz kell egy cáfoló pontpár. Vegyünk x=−1,y=1x=-1, y=1: f(-1)=-1, f(1)=1, θ=0.5: pont=0, f=0; konvex kombináció=0; egyenlőség nem cáfolja. Keressünk aszimmetrikusat: x=-2, y=1: f(-2)=-8, f(1)=1, θ=0.5: pont=-0.5, f=-0.125; konvex kombináció=0.5(-8)+0.5(1)=-3.5; és -0.125 > -3.5? A konvexitás feltétele: f(pont) ≤ kombináció; -0.125 ≤ -3.5 hamis; tehát -0.125 > -3.5, ez cáfolja a konvexitást. Igen: f(−2)=−8f(-2)=-8, f(1)=1f(1)=1; átlagos pont (−0.5)(-0.5), f=−0.125f=-0.125; konvex kombináció =(−8+1)/2=−3.5=(-8+1)/2=-3.5; mivel −0.125≰−3.5-0.125 \not\le -3.5, a függvény nem konvex. Tehát a példa helyes, csak a cáfoló pontpárt kell jól választani. A feltétel, amely kizárja: a függvény nem konvex.

A tankönyvi megoldásban ezt röviden: f(x)=x3f(x)=x^3 stacionárius pontja 00, amely nem lokális minimum; a függvény nem konvex ℝ\mathbb R-en, amit a −2-2 és 11 pontok mutatnak.

6.2.11 F2 megoldása

A gradiens ∇f(x)=(2x1,6x2)\nabla f(x)=(2x_1,6x_2). Két x,yx,y pontra

∥∇f(x)−∇f(y)∥22=(2(x1−y1))2+(6(x2−y2))2=4(x1−y1)2+36(x2−y2)2. \|\nabla f(x)-\nabla f(y)\|_2^2 =(2(x_1-y_1))^2+(6(x_2-y_2))^2 =4(x_1-y_1)^2+36(x_2-y_2)^2.

Mivel

4(x1−y1)2+36(x2−y2)2≤36[(x1−y1)2+(x2−y2)2]=36∥x−y∥22, 4(x_1-y_1)^2+36(x_2-y_2)^2 \le36\left[(x_1-y_1)^2+(x_2-y_2)^2\right] =36\|x-y\|_2^2,

négyzetgyököt vonva ∥∇f(x)−∇f(y)∥2≤6∥x−y∥2\|\nabla f(x)-\nabla f(y)\|_2\le6\|x-y\|_2, tehát ff 66-sima. Az élességhez válasszuk x=(0,1)x=(0,1), y=(0,0)y=(0,0): a különbség normája 66, és ∥x−y∥2=1\|x-y\|_2=1, tehát a hányados 66.

x0=(2,−1)x_0=(2,-1) esetén ∇f(x0)=(4,−6)\nabla f(x_0)=(4,-6), ∥∇f(x0)∥22=16+36=52\|\nabla f(x_0)\|_2^2=16+36=52. A descent lemma felső korlátja η=0,25\eta=0{,}25 mellett

f(x0)−η(1−Lη2)∥∇f(x0)∥22=7−0,25(1−6⋅0,252)52=7−3,25=3,75. f(x_0)-\eta\left(1-\frac{L\eta}{2}\right)\|\nabla f(x_0)\|_2^2 =7-0{,}25\left(1-\frac{6\cdot0{,}25}{2}\right)52 =7-3{,}25 =3{,}75.

Az x1=(1,0,5)x_1=(1,0{,}5) pontban f(x1)=1+3⋅0,25=1,75≤3,75f(x_1)=1+3\cdot0{,}25=1{,}75\le3{,}75. A feltétel η<2/L=1/3≈0,333\eta<2/L=1/3\approx0{,}333, ezért η=0,4\eta=0{,}4 kívül esik a descent lemma garantált tartományán.

6.2.12 F3 megoldása

A teljes függvény és a két teszt:

# labs/n022/feladat_f3.py
import numpy as np

def check_descent(f, grad_f, x0, eta, L, steps):
    x0 = np.asarray(x0, dtype=np.float64)
    x = x0.copy()
    trace = [(0, x.copy(), f(x))]
    valid_eta = 0.0 < eta < 2.0 / L
    bounds_ok = []
    for t in range(1, steps + 1):
        x_prev = x.copy()
        g = grad_f(x_prev)
        upper = f(x_prev) - eta * (1.0 - 0.5 * L * eta) * float(np.dot(g, g))
        x = x_prev - eta * g
        actual = f(x)
        trace.append((t, x.copy(), actual))
        if valid_eta:
            bounds_ok.append(
                np.allclose(actual, upper, rtol=1e-12, atol=1e-12)
                or actual <= upper
            )
        else:
            bounds_ok.append(False)  # a lemma nem alkalmazható
    return trace, valid_eta, bounds_ok

def f(x):
    return x[0]**2 + 3.0 * x[1]**2

def grad_f(x):
    return np.array([2.0 * x[0], 6.0 * x[1]], dtype=np.float64)

x0 = np.array([2.0, -1.0], dtype=np.float64)
for eta in (0.25, 0.5):
    trace, valid, ok = check_descent(f, grad_f, x0, eta, L=6.0, steps=4)
    print(f"eta={eta:g}, eta_ervenyes={valid}, korlatok={ok}")
    print("  utolso iteralt:", trace[-1][1], "f:", trace[-1][2])

A várt kimenet a korábbi laborértékeket adja: η=0,25\eta=0{,}25 esetén eta_ervenyes=True, a korlátok mind teljesülnek, és f(4)=0,02734375f(4)=0{,}02734375; η=0,5\eta=0{,}5 esetén eta_ervenyes=False, a korlatok lista False elemeket tartalmaz, és f(4)=768f(4)=768. A np.allclose mellett az actual <= upper ág is szerepel, hogy a szigorúbb numerikus zaj ne okozzon hamis hibajelzést.

6.2.13 F4 megoldása

A hiba oka: az is_safe a 2/L2/L feltételt a konstans 22-vel helyettesíti, elfelejtve az LL-lel való osztást. Következménye: nagy LL esetén túl nagy η\eta-t enged, ami a másodrendű tag miatt növelheti a veszteséget. Az L=6L=6 példában η=0,5>1/3\eta=0{,}5>1/3, ezért a (2,−1)(2,-1) pontban a lépés az f=7f=7 értékről f=12f=12-re növel. Javítás:

def is_safe(eta, L=6.0):
    return 0.0 < eta < 2.0 / L

Ellenőrzés: is_safe(0.5, 6.0) hamis, is_safe(0.25, 6.0) igaz. A javított változat már elutasítja a divergáló lépésközt.

6.2.14 F5 megoldásminta

Protokolltervezet. Adat: [GlyphLab szerződése, 180 jelenet, 360 kép, train/val/test jelenetszintű felosztás; a modell kiválasztása csak val loss alapján. Megfigyelési egység: egy tanítási futás rögzített seeddel. Baseline: SGD η=0,01\eta=0{,}01, batch méret 32, rögzített inicializálás. Változó tényező: η∈{0,005;0,01;0,05;0,1}\eta\in\{0{,}005;0{,}01;0{,}05;0{,}1\}. Metrika: az első 10 epoch train lossa epochonként, valamint az a jelzés, ha a train loss meghaladja a kezdeti érték tízszeresét vagy NaN-né válik. Erőforrás: CPU, float32 a tanítás főút szerint; minden futást ugyanazzal a seeddel és ugyanabban a környezetben indítunk. Elvárt átadandó eredmény: lépésközönként egy táblázat az epochonkénti train lossról és a stop okáról, valamint egy rövid jegyzőkönyv. Érvényességi korlát: az eredmény azt mutatja, melyik lépésköz stabil ezen a kis CNN-en; nem bizonyítja a globális optimumot, nem ad becslést az ismeretlen LL-re, és más architektúrára nem vihető át mérés nélkül.

6.2.15 10. Önellenőrzés, visszahívás és tipikus hibák

6.2.16 Rövid összefoglaló

A konvexitás azt jelenti, hogy a grafikon minden húr alatt vagy a húron halad; differenciálható konvex függvényre a nulla gradiens globális minimumot azonosít. Az LL-simaság a gradiens Lipschitz-folytonossága, és belőle a simasági egyenlőtlenség, majd a csökkenési lemma következik: ha 0<η<2/L0<\eta<2/L, akkor a gradienslépés szigorúan csökkenti a veszteséget, amíg a gradiens nem nulla. A korlát túllépése kvadratikus példán divergenciát okoz, mert a másodrendű tag felülírja a lineáris csökkenést. A lemma nem igényel konvexitást, de nem bizonyít globális konvergenciát; nemkonvex függvényen a határpont lehet nyeregpont is, ezért a CNN-trainingre nem alkalmazható automatikusan.

6.2.17 Következő alkalmazás

A 6.3. Sztochasztikus és minibatch gradiens a sztochasztikus gradiens módszerét tárgyalja: ott a teljes empirikus kockázat gradiense helyett minibatch-átlaggal dolgozunk, és a descent lemma feltételes várható értékben ad csökkenést, ha a minibatch-gradiens torzítatlan és a lépésköz a zaj kovarianciájával összeegyeztethető. A [D06] dokumentáció a torch.optim gradienslépéseit írja le; a futtatáskor használt PyTorch-verziót a kísérleti naplóban kell rögzíteni.

6.2.18 Források