Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
Hra generátora a diskriminátora, GAN napísaný od nuly, nesaturujúca strata, osem zhlukov na kružnici a kolaps módov, číslice ostrejšie než pri VAE, ale nie všetky, a cesta od GAN k difúznym modelom.
Séria Základy AI Diel 45 z 52
- Mapa umelej inteligencie: čo je čo a ako to do seba zapadá
- Stručná história umelej inteligencie: od Turinga po jazykové modely
- Dáta, model, tréning, inferencia: základné pojmy na jednom príklade
- Ako čítať matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relácie: stavebnica, z ktorej sa skladajú definície v AI
- Funkcie a zobrazenia: prečo je každý model v AI funkcia
- Logika a dôkazy: pravidlá, podľa ktorých sa v AI uvažuje
- Grafy a stromy: štruktúra, na ktorej stojí hľadanie aj neurónové siete
- Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
- Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť
- Gradientný zostup: ako sa model učí
- Čo je pravdepodobnosť: od hodu kockou ku Kolmogorovovým axiómam
- Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové
- Náhodná premenná a distribučná funkcia: jedna funkcia, ktorá o rozdelení povie všetko
- Funkcia hustoty a pravdepodobnostná funkcia: prečo má spojitá premenná v bode pravdepodobnosť nula
- Stredná hodnota, rozptyl a kovariancia: kde rozdelenie leží, aké je široké a čo s čím súvisí
- Prehľad pravdepodobnostných rozdelení: Bernoulliho, binomické, Poissonovo, rovnomerné, normálne a exponenciálne
- Zákon veľkých čísel a centrálna limitná veta: prečo sa priemery správajú tak predvídateľne
- Štatistika a odhady parametrov: maximálna vierohodnosť, MAP a intervaly spoľahlivosti
- Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie
- Prehľadávanie stavového priestoru: BFS, DFS, UCS a A* s animáciami
- Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
- Splňovanie obmedzujúcich podmienok: backtracking, propagácia obmedzení a AC-3 na sudoku a mape krajov
- Logika a znalostné systémy: dopredné a spätné reťazenie, rezolúcia a expertné systémy
- Plánovanie: STRIPS, svet kociek, heuristiky z relaxácie a plánovanie v AI agentoch
- Lokálne hľadanie a simulované žíhanie: obchodný cestujúci cez krajské mestá
- Genetické algoritmy: populácia, kríženie, mutácia a výber na batohu na výlet
- Evolučné stratégie a genetické programovanie: od pravidla jednej pätiny po Keplerov zákon
- Optimalizácia mravčou kolóniou: ako feromónová stopa nájde krátku cestu
- Optimalizácia rojom častíc: zotrvačnosť, vlastná skúsenosť a skúsenosť roja
- Neuroevolúcia: evolúcia váh aj tvaru neurónových sietí a algoritmus NEAT
- Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“
- Fuzzy logika a pravdepodobnosť: prečo „trochu teplo“ neznamená „pravdepodobne teplo“
- Fuzzy logika: t-normy, implikácie a pravidlá AK–TAK
- Fuzzy riadenie: Mamdani a Sugeno od ventilátora po kyvadlo na vozíku
- Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidlá, ktoré sa učia z dát
- Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
- Skryté Markovove modely: Viterbiho algoritmus a nepoctivé kasíno
- Bayesovské siete: prečo je tráva mokrá a čo z toho vyplýva pre postrekovač
- Kalmanov filter: ako z nepresných meraní odhadnúť, kde auto je a ako rýchlo ide
- Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie
- Prompty, kontext a RAG: ako modelu dať správne informácie
- Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru
- Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
- Difúzne modely: ako sa z čistého šumu stane obrázok
- Markovove rozhodovacie procesy: stavy, akcie, odmeny a Bellmanove rovnice
- Q-learning a DQN: učenie hodnoty akcií od tabuľky po neurónovú sieť
- Policy gradient a PPO: učenie priamo stratégie
- Ako funguje AI agent: jazykový model v slučke s nástrojmi
- Programovanie s AI agentmi: zadanie, testy a kontrola
- Vyhodnocovanie a bezpečnosť AI systémov: ako merať a ako strážiť
Celá osnova série Hotovo: 52 z 83 tém
- Ako sa generátor učí len z gradientu diskriminátora.
- Prečo je učenie GAN nestabilné a čo je kolaps módov.
- V čom GAN vyhráva nad VAE, v čom prehráva a prečo ich dnes nahradila difúzia.
Čo sa hodí vedieť vopred: Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru, Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
Variačný autoenkodér z minulého dielu generuje poctivo, ale rozmazane. V roku 2014 prišiel Ian Goodfellow s nápadom, ktorý vyzerá skoro ako trik: nebudeme merať, ako veľmi sa vzorka líši od dát, ale necháme to posúdiť inú sieť. Dve siete hrajú hru — jedna falšuje, druhá spozná falzifikát — a obe sa pri tom zlepšujú. Tak vznikli prvé strojovo generované tváre, ktoré od fotiek nerozoznáte. V tomto diele obe siete napíšeme od nuly a uvidíme, prečo je ich učenie také vrtkavé.
Nadväzuje na diely Variačné autoenkodéry, Logistická regresia (sigmoida a krížová entropia) a Hry a protivník.
1. Falšovateľ a detektív
Definícia — generatívna adversariálna sieť (GAN)
Nech 𝒳 ⊆ ℝd je priestor dát, pdata rozdelenie dát na 𝒳 (s hustotou pdata), k ≥ 1 a pz = N(0, I) rozdelenie šumu na ℝk. Logaritmy v tomto diele sú prirodzené (log = ln). Generatívnu adversariálnu sieť (GAN; Ian Goodfellow a kol., 2014) tvoria dve neurónové siete:
- generátor G : ℝk → 𝒳, ktorý šum z ~ pz prevedie na vzorku G(z); rozdelenie vzoriek G(z) značíme pG;
- diskriminátor D : 𝒳 → (0, 1), kde D(x) je odhad pravdepodobnosti, že x pochádza zo skutočných dát, a nie z generátora.
Hodnota hry je
V(D, G) = Ex ~ pdata[log D(x)] + Ez ~ pz[log(1 − D(G(z)))]
a učenie hľadá rovnováhu hry dvoch hráčov s nulovým súčtom
minG maxD V(D, G):
diskriminátor V zvyšuje, generátor znižuje, a čo jeden získa, druhý stratí. Pre pevné G je najlepší diskriminátor D*(x) = pdata(x)/pdata(x) + pG(x) (veta nižšie). V rovnováhe generuje G presne rozdelenie dát, pG = pdata, a D* všade vracia 1/2.
Falšovateľ tlačí bankovky, detektív ich triedi na pravé a falošné. Detektív sa učí z toho, kde sa pomýlil. Falšovateľ nikdy nevidel pravú bankovku — učí sa len z toho, čo ho pred detektívom prezradilo. Keď sa obaja zlepšujú, falzifikáty sú čoraz lepšie. Koniec hry: detektív môže len hádať, a háda napoly.
minG maxD Ex ~ pdata[ log D(x) ] + Ez ~ pz[ log(1 − D(G(z))) ]
- Ex ~ pdata[log D(x)]
- diskriminátor na skutočných dátach — je najväčší (0), keď D dáva pravým vzorkám 1; logaritmus sebaistý omyl (D → 0) trestá neohraničene
- Ez[log(1 − D(G(z)))]
- diskriminátor na falzifikátoch — je najväčší, keď im dáva 0; je to jediný člen, v ktorom sa vyskytuje G, takže generátor sa učí len z neho
- maxD
- diskriminátor hodnotu zvyšuje — oba členy dohromady sú záporná binárna krížová entropia, takže je to obyčajné učenie klasifikátora „pravé / falzifikát“
- minG
- generátor hodnotu znižuje — chce, aby diskriminátor na falzifikátoch chyboval; čo jeden hráč získa, druhý stratí (nulový súčet)
Veta — najlepší diskriminátor a čo generátor minimalizuje
Nech pdata a pG sú hustoty na 𝒳 a generátor G je pevný. Potom pre každý diskriminátor D : 𝒳 → (0, 1) je
V(D, G) = ∫𝒳 [pdata(x) log D(x) + pG(x) log(1 − D(x))] dx
a v každom bode x, kde pdata(x) > 0 a pG(x) > 0, je integrand maximálny pre
D*(x) = pdata(x)/pdata(x) + pG(x).
S týmto diskriminátorom platí
V(D*, G) = −log 4 + 2 · JSD(pdata ‖ pG),
kde pre hustoty p, q na 𝒳 je m = 1/2(p + q) a Jensenova–Shannonova divergencia JSD(p ‖ q) = 1/2 DKL(p ‖ m) + 1/2 DKL(q ‖ m) (DKL je KL divergencia, pre hustoty s integrálom namiesto súčtu, pozri diel o VAE). Generátor teda proti najlepšiemu diskriminátoru minimalizuje JSD.
Dôkaz. Vzorka G(z) má hustotu pG, takže Ez[log(1 − D(G(z)))] = ∫ pG(x) log(1 − D(x)) dx; odtiaľ prvý vzorec. Integrál je najväčší, keď je v každom bode x najväčší integrand, teda funkcia f(y) = a log y + b log(1 − y) pre y ∈ (0, 1), kde a = pdata(x) > 0, b = pG(x) > 0. Jej derivácia
f′(y) = a/y − b/1 − y
je nulová práve pre y = a/a + b, a keďže f″(y) = −a/y² − b/(1 − y)² < 0, je f konkávna a ide o maximum. Odtiaľ D*. Keďže pdata + pG = 2m, je D* = pdata/2m a 1 − D* = pG/2m, takže
V(D*, G) = Epdata[log pdata/m] − log 2 + EpG[log pG/m] − log 2 = DKL(pdata ‖ m) + DKL(pG ‖ m) − log 4,
čo je −log 4 + 2 · JSD(pdata ‖ pG). ∎
Jensenova–Shannonova divergencia je nezáporná a nulová práve pre pG = pdata (obe KL divergencie sú nezáporné a nulové práve pre p = m = q). Minimum −log 4 ≈ −1,386 teda nastane práve vtedy, keď generátor generuje presne dáta.
Príklad: tam, kde je hustota dát 0,3 a falzifikátov 0,1, je D* = 0,3/0,3 + 0,1 = 0,75 (bod je skôr pravý); kde generátor prestrelí (dáta 0,1, falzifikáty 0,3), je D* = 0,1/0,1 + 0,3 = 0,25. Tam, kde sa hustoty rovnajú, je D* = 1/2 a strata diskriminátora (binárna krížová entropia na jednu vzorku) je −log 1/2 = ln 2 ≈ 0,693.
Diskriminátor je obyčajný klasifikátor so sigmoidou a krížovou entropiou, ako logistická regresia, len s vrstvami navyše. Kúzlo je v generátore: gradient jeho straty pretečie spätným šírením cez diskriminátor až do obrázka a odtiaľ do váh generátora. Diskriminátor mu tak hovorí, ktorým smerom má každý pixel posunúť, aby vyzeral vierohodnejšie.
2. Učenie: striedavé kroky
Učí sa striedavo: krok diskriminátora (dávka skutočných dát a dávka falzifikátov, zvýšiť D na pravých, znížiť na falošných), potom krok generátora (posunúť falzifikáty tam, kde ich D považuje za pravé). Obe siete u nás majú dve skryté vrstvy s leaky ReLU a učia sa Adamom.
Definícia — nesaturujúca strata generátora
Nech σ(s) = 1/1 + e−s je sigmoida a diskriminátor má tvar D(x) = σ(s(x)), kde s(x) ∈ ℝ je jeho výstup pred sigmoidou (logit). Pre falzifikát G(z) s logitom s = s(G(z)) je
- pôvodná (minimaxová) strata generátora ℓmm(s) = log(1 − σ(s)) = log(1 − D(G(z))), člen hodnoty hry V;
- nesaturujúca strata generátora ℓns(s) = −log σ(s) = −log D(G(z)).
Generátor minimalizuje strednú hodnotu zvolenej straty cez z ~ pz. Obe straty sú klesajúce funkcie D, majú teda rovnaký cieľ (zvýšiť D na falzifikátoch), ale iný gradient: s D = σ(s) je
∂ℓmm/∂s = −D, ∂ℓns/∂s = −(1 − D).
Nesaturujúca strata tak dáva silný gradient práve pri falzifikátoch, ktoré diskriminátor odhalil (D ≈ 0). Navrhli ju už Goodfellow a kol. v tom istom článku.
Na začiatku sú falzifikáty zlé a detektív ich ľahko prezradí, D je pri nich blízko nuly. Pôvodná strata v tej chvíli skoro neposiela žiadny signál — falšovateľ sa nedozvie, čo zlepšiť, práve keď to potrebuje najviac. Obrátená otázka („ako detektíva presvedčiť“) dáva silný signál hneď od začiatku.
∂/∂s log(1 − σ(s)) = −D, ∂/∂s (−log σ(s)) = −(1 − D)
- s
- logit — výstup diskriminátora pred sigmoidou; derivujeme podľa neho, pretože odtiaľ gradient tečie späť do diskriminátora a cez neho do falzifikátu
- D = σ(s)
- pravdepodobnosť, že falzifikát je pravý; používa sa σ′(s) = σ(s)(1 − σ(s)), preto vyjdú také jednoduché výrazy
- log(1 − σ(s))
- pôvodná strata generátora (minimalizuje sa) — jej gradient má veľkosť D, takže keď diskriminátor falzifikát bezpečne odhalí (D ≈ 0), je skoro nulový: saturácia
- −log σ(s)
- nesaturujúca strata — gradient má veľkosť 1 − D, teda najväčší práve pri falzifikátoch, ktoré diskriminátor odhalil
Úprimne: v našich malých pokusoch sa učila aj pôvodná strata, pretože diskriminátor nebol na začiatku taký sebaistý. Pri veľkých sieťach na obrázkoch, kde diskriminátor vyhrá rýchlo, je rozdiel zásadný. Ďalej používame nesaturujúcu stratu.
Ako sa gradient dostane až ku generátoru, ukazuje reťazové pravidlo. Falzifikát x = G(z) je pre diskriminátor len vstup, takže spätné šírenie v ňom nemusí skončiť:
∂LG/∂θG = ∂LG/∂s · ∂s/∂x · ∂x/∂θG
- ∂LG/∂s
- jedno číslo zo straty, pri nesaturujúcej −(1 − D) — „ako veľmi“ sa má falzifikát zlepšiť
- ∂s/∂x
- gradient diskriminátora podľa jeho vstupu (pri kružnici 2 čísla, pri číslici 64) — „ktorým smerom“ posunúť každú súradnicu, aby falzifikát vyzeral pravdivejšie; váhy diskriminátora sa v tomto kroku nemenia
- ∂x/∂θG
- obyčajné spätné šírenie generátorom — prevedie požadovaný posun falzifikátu na zmenu váh θG generátora
Definícia — strata diskriminátora a softplus
Nech σ(s) = 1/1 + e−s je sigmoida, diskriminátor vracia logit s(x) ∈ ℝ a D(x) = σ(s(x)). Funkcia softplus je softplus : ℝ → (0, ∞),
softplus(u) = ln(1 + eu).
Nech xr je pravá vzorka s logitom sr = s(xr) a xf = G(z) falzifikát s logitom sf = s(xf). Strata diskriminátora na tejto dvojici je binárna krížová entropia s cieľmi 1 (pravá) a 0 (falzifikát):
LD = −log σ(sr) − log(1 − σ(sf)) = softplus(−sr) + softplus(sf).
Druhá rovnosť vyplýva z −log σ(s) = ln(1 + e−s) = softplus(−s) a z 1 − σ(s) = σ(−s). Minimalizovať LD je to isté ako maximalizovať V. Program počíta softplus cez logit, nie cez D: pre s = 40 je σ(s) v pohyblivej čiarke presne 1 a log(1 − D) by vyšiel −∞, kým softplus(40) ≈ 40. Gradienty: ∂LD/∂sr = σ(sr) − 1, ∂LD/∂sf = σ(sf).
for t in range(kroku):
# 1. krok diskriminátora: pravé → 1, falzifikáty → 0
gD = 0
for _ in range(davka):
x = nahodny_vzorek(data)
gD += D.zpet(D(x), dL_ds=sigmoid(D(x)) - 1)
f = G(sum()) # falzifikát, G sa teraz neučí
gD += D.zpet(D(f), dL_ds=sigmoid(D(f)))
adam_D(gD / davka)
# 2. krok generátora: gradient prejde D až do falzifikátu
gG = 0
for _ in range(davka):
x = G(sum())
dL_ds = sigmoid(D(x)) - 1 # nesaturujúca −log σ(s)
dL_dx = D.zpet_do_vstupu(dL_ds) # váhy D bez zmeny
gG += G.zpet(dL_dx)
adam_G(gG / davka) # Adam s β₁ = 0,5 ako pri DCGAN
3. Osem zhlukov na kružnici
Klasický pokus: dáta sú body z ôsmich malých normálnych zhlukov (σ = 0,05) rozmiestnených na kružnici s polomerom 2. Generátor dostáva dvojrozmerný šum a vracia bod v rovine. Meriame kvalitu (podiel vzoriek do 3σ od niektorého stredu) a pokrytie (do koľkých zhlukov padne aspoň 2 % vzoriek).
Definícia — dáta, kvalita a pokrytie
Nech r = 2 je polomer kružnice a σ = 0,05 šírka zhlukov. Stredy zhlukov sú body c0, …, c7 ∈ ℝ2,
cj = (r cos 2πj/8, r sin 2πj/8), j = 0, …, 7.
Dátový bod je x = cJ + ε, kde J je rovnomerne náhodné z {0, …, 7} a ε ~ N(0, σ²I) je na J nezávislý šum (I je jednotková matica 2 × 2).
Nech x1, …, xn ∈ ℝ2 sú vzorky generátora, pre konečnú množinu M značí #M počet jej prvkov a pre j = 0, …, 7 je nj = #{i ∈ {1, …, n} : ‖xi − cj‖ < 3σ} počet vzoriek do 3σ od stredu cj. Potom
- kvalita je podiel vzoriek blízko niektorého stredu, kvalita = 1/n · #{i ∈ {1, …, n} : minj ‖xi − cj‖ < 3σ};
- pokrytie je počet zhlukov, do ktorých padne aspoň 2 % vzoriek, pokrytie = #{j ∈ {0, …, 7} : nj ≥ 0,02 · n}.
Čísla: 3σ = 0,15, susedné stredy sú od seba 2r sin π/8 ≈ 1,53, teda vyše desaťkrát ďalej, takže žiadna vzorka sa nezapočíta k dvom stredom. Snímky majú n = 400 vzoriek, takže zhluk sa počíta ako pokrytý od 8 vzoriek.
Ani dokonalý generátor nemá kvalitu 100 %: vzdialenosť bodu od stredu dvojrozmerného normálneho rozdelenia N(0, σ²I) má Rayleighovo rozdelenie, P(‖ε‖ < t) = 1 − exp(−t²/2σ²), a do 3σ teda padne podiel 1 − exp(−9/2) ≈ 0,989, asi 98,9 %.
Po 500 krokoch generátor vyrába rozmazaný oblak (kvalita 6 %), po 2 000 krokoch sa body sťahujú do 6 zhlukov a na konci (krok 8 000) pokrýva všetkých 8 s kvalitou 73 %. Generátor nikdy nevidel jediný skutočný bod — všetko sa dozvedel z gradientu diskriminátora.
4. Kolaps módov
Definícia — kolaps módov (mode collapse)
Nech pdata je rozdelenie dát a M1, …, MK ⊆ 𝒳 sú navzájom disjunktné oblasti, medzi ktoré sa dáta rozpadajú na oddelené skupiny, tzv. módy (zhluky, druhy obrázkov), každá s pravdepodobnosťou Pdata(Mm) > 0. Nech PG(Mm) = P(G(z) ∈ Mm), z ~ pz, je pravdepodobnosť, že generátor vyrobí vzorku z módu m. Generátor trpí kolapsom módov práve vtedy, keď pre niektorý mód m je PG(Mm) oveľa menšia než Pdata(Mm), v krajnom prípade nulová — vyrába len časť rozdelenia dát a ostatné módy vynechá. (Hranica „oveľa menšia“ nie je pevne daná; v pokuse s kružnicou nižšie berieme mód za vynechaný, keď doň padne menej než 2 % vzoriek.) Pri úplnom kolapse vyrába generátor pre každé z skoro to isté, t. j. pG je sústredené v malom okolí jediného bodu.
Strata to priamo netrestá: diskriminátor posudzuje každú vzorku zvlášť, a dobrý falzifikát jedného druhu je preňho rovnako presvedčivý ako pestrá zbierka.
Falšovateľ zistí, že detektív najhoršie spoznáva falošné stovky. Tlačí teda len stovky. Detektív si časom všimne a začne stovky podozrievať — falšovateľ preskočí na dvestovky. Hra sa točí v kruhu a falšovateľ nikdy nevyrába všetky bankovky naraz.
Veta — proti pevnému diskriminátoru je najlepší jediný bod
Nech D : 𝒳 → (0, 1) je pevný diskriminátor, ktorý nadobúda maximum v bode x* ∈ 𝒳, t. j. D(x) ≤ D(x*) pre všetky x ∈ 𝒳. Potom pre každý generátor G : ℝk → 𝒳 platí pre nesaturujúcu stratu
LG(G) = Ez ~ pz[−log D(G(z))] ≥ −log D(x*),
a rovnosť nastane pre konštantný generátor G(z) = x* pre všetky z ∈ ℝk.
Dôkaz. Pre každé z je D(G(z)) ≤ D(x*), a keďže −log je klesajúci, je −log D(G(z)) ≥ −log D(x*); stredná hodnota nerovnosť zachová. Pre konštantný generátor je −log D(G(z)) = −log D(x*) pre každé z. ∎
Strata je priemer cez jednotlivé vzorky a nič v nej neodmeňuje rozmanitosť. Proti pevnému súperovi je teda úplný kolaps optimálny; bráni mu len to, že diskriminátor reaguje a miesto x* začne podozrievať. Ak generátor preskočí rýchlejšie, než diskriminátor zabudne, točí sa hra v kruhu. Preto pomáhajú úpravy, ktoré dávajú diskriminátoru pohľad na celú dávku (minibatch discrimination, Tim Salimans a kol., 2016), alebo iná vzdialenosť rozdelení (Wasserstein, nižšie).
Rovnaká sieť, rovnaké dáta, rovnaké nastavenie — len iné náhodné semienko:
| semienko | pokrytých zhlukov po krokoch 1 000 … 8 000 | na konci | kvalita na konci |
|---|---|---|---|
| 1 | 0 · 2 · 7 · 6 · 6 · 7 · 7 · 7 | 7 z 8 | 66 % |
| 2 | 4 · 5 · 8 · 8 · 8 · 8 · 8 · 8 | 8 z 8 | 73 % |
| 3 | 1 · 4 · 4 · 4 · 5 · 5 · 5 · 5 | 5 z 8 | 54 % |
| 4 | 0 · 5 · 6 · 6 · 6 · 6 · 6 · 6 | 6 z 8 | 49 % |
Len jeden zo štyroch behov pokryl všetkých osem zhlukov. Beh so semienkom 3 skončil pri 5 a od kroku 5 000 sa už nepohol. Toto je pri GAN typické: učenie nemá jednu stratu, ktorá by klesala, ale hru dvoch hráčov, a výsledok závisí od náhody viac, než by sme chceli.
5. Číslice: ostrejšie, ale nie všetky
Teraz rovnaké číslice 8 × 8 ako pri VAE. Generátor: osemrozmerný šum → 64 → 64 → 64 pixelov so sigmoidou; diskriminátor zrkadlovo. 6 000 krokov, dva behy s rôznym semienkom. Kvalitu meriame rovnako ako v minulom diele — vzdialenosťou vzorky k najbližšej trénovacej číslici.
Vzorky GAN sú ostrejšie: vzdialenosť 0,049 a 0,042 oproti 0,054 pri VAE (skutočné číslice 0,017). GAN netrestá rozmazanosť priemerovaním ako rekonštrukčná strata VAE — rozmazaný obrázok diskriminátor ľahko spozná. Lenže ktorých číslic generátor vyrába koľko?
V dátach je každej cifry rovnako. Beh so semienkom 2 pritom vyrába hlavne šestky (69 z 200), osmičky a trojky, a cifry 0, 1, 2, 4, 7 skoro vôbec (najviac 3 vzorky). Beh so semienkom 1 je pestrejší, ale aj tam majú cifry 0, 4, 9 menej než polovicu svojho podielu (najviac 6 vzoriek namiesto 20). Je to ten istý kolaps módov ako pri kružnici, len na obrázkoch: GAN vyhráva ostrosťou, VAE pokrytím.
6. Od GAN k difúzii
- DCGAN (Alec Radford a kol., 2015) ukázal, ako stavať konvolučné GAN, ktoré sa dajú spoľahlivo učiť na fotkách.
- Wasserstein GAN (Martin Arjovsky a kol., 2017) nahradil klasifikátor „kritikom“, ktorý meria vzdialenosť rozdelení; učenie je stabilnejšie a menej náchylné na kolaps módov.
- StyleGAN (Tero Karras a kol., Nvidia, 2018–2020) generuje fotorealistické tváre v rozlíšení 1024 × 1024 — známy web „this person does not exist“.
- Okolo roku 2021 GAN predbehli difúzne modely (Prafulla Dhariwal a Alex Nichol: „Diffusion Models Beat GANs on Image Synthesis“). Sú pomalšie, ale učia sa stabilne a pokrývajú celé rozdelenie. Myšlienka diskriminátora však žije ďalej — ako pomocná strata, ktorá obrázkom dodá ostrosť, napríklad v kodéroch obrazu alebo zvuku.
Prečo Wasserstein pomáha, je vidieť na najjednoduchšom príklade (zjednodušená verzia príkladu z článku Arjovsky a kol., 2017): dáta sú jediný bod 0, generátor vyrába jediný bod θ. Kým θ ≠ 0, rozdelenia sa neprekrývajú a JSD = ln 2 ≈ 0,693 bez ohľadu na to, ako ďaleko θ je — gradient podľa θ je nulový a generátor nevie, kam ísť. Wassersteinova vzdialenosť je |θ|, takže ukazuje smer aj z veľkej diaľky.
W(pdata, pG) = sup‖f‖L ≤ 1 ( Ex ~ pdata[f(x)] − Ez ~ pz[f(G(z))] )
- sup‖f‖L ≤ 1
- suprémum cez kritikov f : 𝒳 → ℝ — sieť, ktorá namiesto pravdepodobnosti vracia ľubovoľné číslo; podmienka „1-lipschitzovská“ (|f(a) − f(b)| ≤ ‖a − b‖) mu nedovolí rozlíšiť dva blízke body ľubovoľne ostro, inak by rozdiel mohol rásť do nekonečna
- Ex ~ pdata[f(x)]
- priemerné hodnotenie skutočných dát — kritik ho chce čo najväčšie
- Ez[f(G(z))]
- priemerné hodnotenie falzifikátov — kritik ho chce čo najmenšie, generátor čo najväčšie; rozdiel je spojitý v parametroch generátora, takže gradient nezmizne, ani keď sa rozdelenia neprekrývajú
7. Zhrnutie
- GAN = generátor a diskriminátor v hre; generátor sa učí len z gradientu, ktorý mu pošle diskriminátor.
- Nesaturujúca strata −log D(G(z)) dáva generátoru silný signál aj na začiatku, keď diskriminátor vyhráva.
- Na ôsmich zhlukoch pokryl všetky len jeden zo štyroch behov (7, 8, 5, 6); výsledok veľmi závisí od náhody.
- Na čísliciach sú vzorky ostrejšie než pri VAE (0,042 oproti 0,054), ale niektoré cifry chýbajú — kolaps módov.
- Dnes obrázky generujú hlavne difúzne modely; diskriminátor zostal ako pomocník pre ostrosť.
Chcete si to vyskúšať? Nechajte AI agenta naučiť malý GAN na ôsmich zhlukoch na kružnici a pustiť ho päťkrát s rôznym semienkom. Potom nech skúsi Wasserstein GAN s rovnakou sieťou a porovná, koľko zhlukov zakaždým pokryje.
Máte na to iný názor? Napíšte na support@coden-app.com.