Ez az egység a generatív adversarialis hálót (GAN) nem likelihood-közelítésként, hanem két szereplős játékként vezeti be. A 31.1. VAE és variációs alsó korlát VAE-jében a tanulási cél az ELBO, tehát egy explicit látens posterior és egy dekódoló likelihood együttes maximalizálása volt. A GAN ezt a becslési keretet elhagyja: nincs következtető háló és nincs dekódoló likelihood, csak egy generátor és egy diszkriminátor versenye. Előismeret a 7.1. Entrópia, cross-entropy és KL keresztentrópiája és a 30.2. Kontrasztív cél és temperature logisztikus alakú célfüggvénye.
Induló kérdés: ha a generátor már adott, milyen diszkriminátor hozza ki a legtöbbet a valós és generált minták megkülönböztetéséből? Ennek zárt alakja lesz a központi levezetés.
Legyen a valós adatok sűrűsége -en, pedig egy rögzített látens prior, tipikusan standard normális -n. A generátor
a diszkriminátor pedig
ahol a logit, a szigmoid. A által indukált eloszlást -vel jelöljük. A [P19]-ben bevezetett kétjátékos cél természetes alapú logaritmussal:
A második tag átírható a generált eloszlás szerinti várható értékké:
A D maximalizálni, a G minimalizálni akarja -t, tehát a formális cél . Ez nem „egyetlen közös loss” minimalizálása: ugyanaz a a két paraméterkészletben ellentétes irányú.
A PyTorch-féle batchelt alakok: ; valós adat , képnél NCHW esetén ; a generált minta ; a diszkriminátor logitja , valószínűségi kimenete . Az osztálycímke a valós, a generált mintára.
A gyakorlati frissítés szétválasztott: -t csak a generátorcél, -t csak a diszkriminátorcél szerint frissítjük. Legyen
Egy méretű minibatchre
A második tagban a generált mintát detach()-kel
leválasztjuk, mert
nem frissíti
-t.
A generátor eredeti, telítődő célja
a nem telítődő (non-saturating) változat pedig
PyTorchban a (4) a binary_cross_entropy_with_logits
hívás ones_like targettel, a (3) pedig
.
A következő állítás idealizált függvényosztályra szól; nem állítja, hogy egy véges neurális háló ezt eléri.
Állítás (optimális diszkriminátor rögzített generátor mellett). Legyen és sűrűség ugyanazon tartón. minden vizsgált -re , és a függvényt az idealizált, pontonként szabadon választható -beli értékű mérhető függvények körében keressük, a határpontokat a lezárt -ben értve. Ekkor az (1) cél pontonkénti szuprémumát
adja.
Bizonyítás. Rögzített -re legyen , , és . Az integrandus ott
A deriváltak
tehát konkáv minden rögzített mellett. A kritikus pont
Ez a konkavitás miatt egyértelmű globális maximum. Ha , akkor adja a szuprémumot; ha , akkor adja a szuprémumot; az (5) képlet így a határpontokra is érvényes. Ha , a pont az integrálhoz nem járul hozzá, ott tetszőleges.
Mivel minden -ben az integrál egy tagját függetlenül maximalizáltuk, bármely más -re az integrandus pontonként legfeljebb akkora, mint -nál, így . ∎
Az (5) képlet olvasata: ahol a valós adat sűrűbb a generáltnál, ott a diszkriminátor -nél nagyobb valós valószínűséget ad; ahol fordítva, ott -nél kisebbet. Ha a két eloszlás egyenlő, .
Jensen–Shannon-kapcsolat. Legyen . Ekkor
$$ V(D^*)= \mathbb E_{p_{\mathrm{data}}}\Bigl[\ln\frac{p_{\mathrm{data}}}{p_{\mathrm{data}}+p_g}\Bigr] +\mathbb E_{p_g}\Bigl[\ln\frac{p_g}{p_{\mathrm{data}}+p_g}\Bigr]. $$
Mivel , és , ez
A KL-nemnegativitásból , egyenlőség a esetben áll fenn. Az eloszlástérbeli optimum tehát úgy áll elő, hogy a generátor a JS-távolságot nullára nyomja; ekkor . Ez idealizált eredmény: a akkor vihető el -be, ha a generátorcsalád ténylegesen képes -t előállítani.
Legyen egy generált minta logitja. A (3) telítődő loss deriváltja a logit szerint
Ha a diszkriminátor határozottan „hamisnak” látja a generált mintát, , így ez a gradiens nullához tart. A (4) nem telítődő loss deriváltja ezzel szemben
mellett ez , tehát nem tűnik el. Ezért a gyakorlati GAN-training a generátorra szinte mindig a (4) alakot használja. A „telítődés” tehát a -gradiens eltűnése, nem a diszkriminátor pontossága önmagában.
Mode collapse. Ha több jól elkülönülő módust tartalmaz, de a generátor sok -t ugyanabba a kis tartományba képez, akkor csak egy vagy kevés módust fed le. Formális egységes definíció nincs; operatív jellemzői: hiányzó módusok (a valós adat egyes tartományaiba alig vagy egyáltalán nem esik generált minta), csökkent változatosság (a generált minták szórása, illetve a különböző minták aránya lényegesen kisebb, mint a valós adaté), és az, hogy sok különböző látens pont közel azonos kimenetre képeződik. A diszkriminátorra vonatkozó feltétel nem része a definíciónak: a diverzitás összeomlása erős diszkriminátor mellett is kialakulhat (egy ideális diszkriminátor éppen felismeri, hogy a két eloszlás eltér). Lehetséges, gyakran leírt tanítási helyzet, hogy a generátor egy olyan módusra tér át, amelyet a diszkriminátor éppen nem büntet, majd a diszkriminátor alkalmazkodása után másik módusra ugrik; ez a jelenség dinamikájának egyik formája, nem a feltétele. A nem telítődő loss javítja a gradiens erősségét, de önmagában nem akadályozza meg a mode collapse-et.
Legyen diszkrét, és . Az (5) képlet pontonként:
| 0 | 0.5 | 0.2 | |
| 1 | 0.3 | 0.5 | |
| 2 | 0.2 | 0.3 |
A cél értéke az optimumnál
$$ V(D^*)=\sum_x\Bigl[p_{\mathrm{data},x}\ln D^*_x+p_{g,x}\ln(1-D^*_x)\Bigr]. $$
Behelyettesítve négy tizedesre: . Az egyenletes esetben
tehát az ideális diszkriminátor magasabb értéket ad. Az pontban a derivált-ellenőrzés: .
# munkakönyvtár: lab/n122/
# Futtatás: python optimal_d_demo.py
import numpy as np
p = np.array([0.5, 0.3, 0.2], dtype=np.float64)
q = np.array([0.2, 0.5, 0.3], dtype=np.float64)
def V(D):
return float(np.sum(p * np.log(D) + q * np.log(1.0 - D)))
D_star = p / (p + q)
D_half = np.array([0.5, 0.5, 0.5], dtype=np.float64)
print("V(0.5) =", f"{V(D_half):.6f}")
print("D* =", np.round(D_star, 6))
print("V(D*) =", f"{V(D_star):.6f}")
# Várt: V(0.5)=-1.386294; D*=[0.714286 0.375 0.4]; V(D*)=-1.284545A kód nem igényel tanítást, csak a levezetett képletet ellenőrzi a diszkrét példán.
Kérdés. Négymódusú 2D-s adaton milyen móduslefedettséget mutat a generátor, és mikor jelez a diagnosztika mode collapse-gyanút?
Adat és környezet. A valós eloszlás négy izotróp Gauss-komponens keveréke, középpontjaik , kovarianciájuk , súlyaik egyenként . A latent .
Specifikáció. A generátor
MLP ReLU aktivációval, a diszkriminátor
MLP, a kimenet logit. Adam-optimalizáló, tanulási ráta
,
batch
,
epoch
lépés. A generátor a (4) nem telítődő célfüggvényt használja. Seed
20261020, dtype float32, device
"cpu". Futtatási parancs:
python lab_toy_gan.py --seed 20261020 --epochs 20 --batch 128.
A kézirat írásakor ez a labor nem futott; az alábbi kimenet ezért jelölt
szemléltetés.
A collapse-diagnosztika a mentett generált mintákra:
# munkakönyvtár: lab/n122/
import numpy as np
samples = np.load("output/fake_seed20261020_epoch20.npy") # (2048, 2)
centers = np.array([[0.,0.],[0.,3.],[3.,0.],[3.,3.]], dtype=np.float32)
d = np.linalg.norm(samples[:,None,:] - centers[None,:,:], axis=2)
mode = d.argmin(axis=1)
counts = np.bincount(mode, minlength=4) / len(samples)
nn_dist = []
for i in range(0, len(samples), 8):
block = samples[i:i+8]
dd = np.linalg.norm(block[:,None,:]-block[None,:,:], axis=2)
np.fill_diagonal(dd, np.inf)
nn_dist.append(dd.min(axis=1))
dup_rate = float(np.mean(np.concatenate(nn_dist) < 0.05))
print("modus_ratios:", np.round(counts, 4))
print("near_duplicate_rate:", round(dup_rate, 4))A döntési szabály heurisztika: ha valamely középponthoz rendelt minta aránya alá esik, hiányzó módust jelentünk; ha a közeli duplikátumok aránya -ös küszöbnél fölé nő, az egyetlen módusra való összeomlást jelez. A küszöb a toy feladathoz tartozik, nem univerzális elméleti határ.
F1 (fogalmi, 1). Definíció szintjén adja meg a célfüggvényt, valamint a diszkriminátor- és generátorparaméterek frissítési irányát. Miért nem állítható, hogy a GAN „egyetlen közös loss” minimalizálása? Átadandó: a képlete, a két optimalizáló paraméterhalmaza, egy mondat a szerepek különbségéről.
F2 (levezetési, 2). Legyen , , . Vezesse le a értékeit, számítsa ki -ot és -öt, és ellenőrizze a konkavitást a pontbeli második deriválttal. Átadandó: a teljes számolás négy tizedes pontossággal.
F3 (implementációs, 2). Írjon NumPy/PyTorch nélküli
tiszta NumPy függvényt, amely tetszőleges azonos hosszúságú
valószínűségvektorra kiszámítja
-ot,
-ot,
és az első koordinátán egy finom rácson ellenőrzi, hogy
első eleme maximalizálja az első tagot. Átadandó: futtatható
verify_optimal_d(p,q) függvény, inputpélda, tolerancia
,
futtatási parancs.
F4 (hibakeresési, 2). Az alábbi kódrészletben hibásan van-e valamelyik optimalizáló paraméterhalmaza?
optD = torch.optim.Adam(D.parameters(), lr=2e-4)
optG = torch.optim.Adam(list(G.parameters()) + list(D.parameters()), lr=2e-4)Lokalizálja a hibát, mondja meg a következményét, javítsa, és adjon
egy torch.allclose-alapú utóellenőrzési lépést.
F5 (kísérleti transzfer, 3). Tervezzen kísérletet a telítődő (3) és nem telítődő (4) generátorcél összehasonlítására a fenti négymódusú 2D-s toy adaton öt seeddel. Rögzítse a megfigyelési egységet, a baseline-t, az összehasonlítási metrikákat, az erőforrásokat és a következtetési határt. Átadandó: protokolltáblázat és a lehetséges negatív eredmény értelmezése.
F1. A cél
A diszkriminátor paramétereit maximalizálásával, a generátor paramétereit minimalizálásával frissítjük; a gyakorlatban a generátorra gyakran a (4) nem telítődő cél kerül. Két külön paraméterkészletről és ellentétes célról van szó, ezért nem egy közös loss minimalizálása.
F2. , .
A pontban a cél , második deriváltja
tehát a pont maximum. A nevezőben a második eleme is belül van -en, így a tizedesre kerekített számolás érvényes.
F3. Példa-megoldás:
# munkakönyvtár: lab/n122/
# Futtatás: python verify_optimal_d.py
import numpy as np
def verify_optimal_d(p, q, tol=1e-6):
p = np.asarray(p, dtype=np.float64)
q = np.asarray(q, dtype=np.float64)
assert p.shape == q.shape
assert np.all(p >= 0) and np.all(q >= 0)
assert abs(p.sum()-1) < tol and abs(q.sum()-1) < tol
D_star = p / (p + q)
y = np.linspace(1e-7, 1-1e-7, 200001)
v1 = p[0]*np.log(y) + q[0]*np.log(1-y)
j = int(np.argmax(v1))
assert abs(y[j] - D_star[0]) < tol, (y[j], D_star[0])
return D_star
if __name__ == "__main__":
p = np.array([0.6, 0.4], dtype=np.float64)
q = np.array([0.9, 0.1], dtype=np.float64)
ds = verify_optimal_d(p, q)
print("D*:", ds)
print("OK, maximum a rácson:", ds[0])A rács csak az első koordinátát változtatja; a többi koordináta
rögzített. A tol=1e-6 a numerikus rácsfelbontásra és a
normalizáltságra vonatkozik.
F4. A hiba az optG konstruktorában van:
list(G.parameters()) + list(D.parameters()) a
generátor-optimalizálóhoz köti a diszkriminátor súlyait is.
Következmény: egy generátorlépés a
súlyokat is módosítja, tehát a két frissítés nem szétválasztott; a játék
nem a tervezett
sémát követi, oszcilláció vagy összeomlás léphet fel. Javítás:
optD = torch.optim.Adam(D.parameters(), lr=2e-4)
optG = torch.optim.Adam(G.parameters(), lr=2e-4)Utóellenőrzés: a
-lépés
előtt mentsük el
D_ref = [w.detach().clone() for w in D.parameters()], majd
loss_G.backward(); optG.step() után ellenőrizzük, hogy
minden torch.allclose(w.detach(), w_ref) igaz. Ha bármelyik
eltér, a
súly még mindig az optG hatókörében van.
F5. Egy lehetséges protokoll:
| Tényező | Rögzített érték |
|---|---|
| Megfigyelési egység | Egy teljes, rögzített lépésszámú training futás |
| Adat | Négymódusú 2D Gauss-keverék, seed 20261020 |
| D, G architektúra, Adam, batch | Azonos a kettő karban |
| Változó tényező | (3) vagy (4) |
| Seedek | 5–5 training seed |
| Metrika | Módusarányok, near-duplicate arány, átlag |
A baseline a telítődő cél, mert az eredeti V közvetlenül ezt tartalmazza. Előre rögzített lépésszám után értékelünk, nem válogatunk a seedek közül a metrika szerint. A következtetési határ: a négymódusú toy adat csak a mechanizmust teszteli; sem nagy képi adatra, sem termelési generatív modellre nem általánosítható. Negatív eredmény, például mindkét kar egyetlen módusra esik össze, korrekt eredmény, ha a nyers módusarányokat és a seedeket közöljük.
Tévedés: „ha bebizonyítottuk a képletét és a globális optimumot, akkor a gyakorlati GAN-training konvergálni fog.” A levezetés ideális, eloszlástéri eredmény. Ha a generátorcsalád nem képes -t előállítani, a optimum nem is eleme a paramétertérnek.
Ellenpélda: legyen egyenletes a halmazon, és legyen a generátor paraméter nélküli konstans leképezés, minden -re. Ekkor . A képlet szerint , határállapotban; a JS-távolság pozitív. A állapot ebből a generátorcsaládból elérhetetlen, bármilyen diszkriminátorfrissítést is végzünk. A nemkonvex, alternáló sztochasztikus gradiensfrissítés konvergenciája külön empirikus kérdés; az eloszlástéri optimum nem garantálja.
Ellenőrizendő: szerepel-e , a D valós címkéje és a generálté , a G nem telítődő céljában a generált minta targetje ; a D-frissítésben detach; a labor nincs futtatottként feltüntetve. A 31.1. VAE és variációs alsó korlát VAE-jében explicit posterior és likelihood volt; itt egyik sincs, ezért a két modellcsalád optimalizálási garanciái nem felcserélhetők. A 30.2. Kontrasztív cél és temperature kontrasztív cél is logisztikus alakú, de ott a pozitív pár definíciója pretext-invarianciából jött; itt a „pozitív” egyszerűen a valós adat címkéje.
A GAN a generátor és diszkriminátor minimax játékát optimalizálja: a diszkriminátor a valós és generált minták logisztikus osztályozója, a generátor a diszkriminátor megtévesztésére törekszik. Rögzített generátor mellett az ideális diszkriminátor , és a cél értéke . A telítődő generátorcél gradiense -nál eltűnik, ezért használatos a nem telítődő alak. A mode collapse a generált eloszlás diverzitásának összeomlása, amelyet külön diagnosztikával kell mérni. Az eloszlástéri optimum nem garantálja véges hálók tanítási konvergenciáját.
A 31.3. Diffúziós zajmodell és CNN-denoiser egység a denoising diffusion probabilistic modellek alapgondolatát tárgyalja; ott a generátor egy zajos képből tanul denoise-lépést, ami a GAN diszkriminátorától eltérő tanítási jelet ad. A most bevezetett „generátor mint eloszlásleképezés” fogalma ott is szükséges.