Preskočiť na obsah
coden

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.

12 minút Matěj Žalmánek 2026-10-16

Séria Základy AI Diel 45 z 52
  1. Mapa umelej inteligencie: čo je čo a ako to do seba zapadá
  2. Stručná história umelej inteligencie: od Turinga po jazykové modely
  3. Dáta, model, tréning, inferencia: základné pojmy na jednom príklade
  4. Ako čítať matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relácie: stavebnica, z ktorej sa skladajú definície v AI
  6. Funkcie a zobrazenia: prečo je každý model v AI funkcia
  7. Logika a dôkazy: pravidlá, podľa ktorých sa v AI uvažuje
  8. Grafy a stromy: štruktúra, na ktorej stojí hľadanie aj neurónové siete
  9. Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
  10. Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť
  11. Gradientný zostup: ako sa model učí
  12. Čo je pravdepodobnosť: od hodu kockou ku Kolmogorovovým axiómam
  13. Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové
  14. Náhodná premenná a distribučná funkcia: jedna funkcia, ktorá o rozdelení povie všetko
  15. Funkcia hustoty a pravdepodobnostná funkcia: prečo má spojitá premenná v bode pravdepodobnosť nula
  16. Stredná hodnota, rozptyl a kovariancia: kde rozdelenie leží, aké je široké a čo s čím súvisí
  17. Prehľad pravdepodobnostných rozdelení: Bernoulliho, binomické, Poissonovo, rovnomerné, normálne a exponenciálne
  18. Zákon veľkých čísel a centrálna limitná veta: prečo sa priemery správajú tak predvídateľne
  19. Štatistika a odhady parametrov: maximálna vierohodnosť, MAP a intervaly spoľahlivosti
  20. Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie
  21. Prehľadávanie stavového priestoru: BFS, DFS, UCS a A* s animáciami
  22. Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
  23. Splňovanie obmedzujúcich podmienok: backtracking, propagácia obmedzení a AC-3 na sudoku a mape krajov
  24. Logika a znalostné systémy: dopredné a spätné reťazenie, rezolúcia a expertné systémy
  25. Plánovanie: STRIPS, svet kociek, heuristiky z relaxácie a plánovanie v AI agentoch
  26. Lokálne hľadanie a simulované žíhanie: obchodný cestujúci cez krajské mestá
  27. Genetické algoritmy: populácia, kríženie, mutácia a výber na batohu na výlet
  28. Evolučné stratégie a genetické programovanie: od pravidla jednej pätiny po Keplerov zákon
  29. Optimalizácia mravčou kolóniou: ako feromónová stopa nájde krátku cestu
  30. Optimalizácia rojom častíc: zotrvačnosť, vlastná skúsenosť a skúsenosť roja
  31. Neuroevolúcia: evolúcia váh aj tvaru neurónových sietí a algoritmus NEAT
  32. Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“
  33. Fuzzy logika a pravdepodobnosť: prečo „trochu teplo“ neznamená „pravdepodobne teplo“
  34. Fuzzy logika: t-normy, implikácie a pravidlá AK–TAK
  35. Fuzzy riadenie: Mamdani a Sugeno od ventilátora po kyvadlo na vozíku
  36. Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidlá, ktoré sa učia z dát
  38. Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
  39. Skryté Markovove modely: Viterbiho algoritmus a nepoctivé kasíno
  40. Bayesovské siete: prečo je tráva mokrá a čo z toho vyplýva pre postrekovač
  41. Kalmanov filter: ako z nepresných meraní odhadnúť, kde auto je a ako rýchlo ide
  42. Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie
  43. Prompty, kontext a RAG: ako modelu dať správne informácie
  44. Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru
  45. Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
  46. Difúzne modely: ako sa z čistého šumu stane obrázok
  47. Markovove rozhodovacie procesy: stavy, akcie, odmeny a Bellmanove rovnice
  48. Q-learning a DQN: učenie hodnoty akcií od tabuľky po neurónovú sieť
  49. Policy gradient a PPO: učenie priamo stratégie
  50. Ako funguje AI agent: jazykový model v slučke s nástrojmi
  51. Programovanie s AI agentmi: zadanie, testy a kontrola
  52. Vyhodnocovanie a bezpečnosť AI systémov: ako merať a ako strážiť

Celá osnova série Hotovo: 52 z 83 tém

Čo si odnesiete
  • 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:

  1. generátor G : ℝk → 𝒳, ktorý šum z ~ pz prevedie na vzorku G(z); rozdelenie vzoriek G(z) značíme pG;
  2. 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.

Laicky povedané

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)
Hodnota hry V(D, G); obe stredné hodnoty sa pri učení odhadujú priemerom cez dávku.
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

  1. pôvodná (minimaxová) strata generátora ℓmm(s) = log(1 − σ(s)) = log(1 − D(G(z))), člen hodnoty hry V;
  2. 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.

Laicky povedané

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
Pri D = 0,01 dá pôvodná strata gradient −0,01, nesaturujúca −(1 − 0,01) = −0,99 — deväťdesiatdeväťkrát viac. Obe straty klesajú, keď D rastie, takže majú rovnaký cieľ. Farby zodpovedajú krivkám v grafe nižšie.
00,51 00,250,50,751 začiatok učenia D(G(z)) — pravdepodobnosť, že falzifikát je pravý (0–1) gradient |∂strata/∂s| (0–1)
Sila signálu pre generátor podľa toho, ako veľmi diskriminátor verí falzifikátu pôvodná log(1 − D) nesaturujúca −log D

Ú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
Generátor nikdy nevidí dáta; jediná informácia o nich prichádza prostredným členom.
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

  1. kvalita je podiel vzoriek blízko niektorého stredu, kvalita = 1/n · #{i ∈ {1, …, n} : minj ‖xi − cj‖ < 3σ};
  2. 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 %.

skutočné dáta krok 500 krok 2 000 krok 8 000 súradnica x₁ (bez jednotky) x₂ (bez jednotky)
Skutočné dáta a vzorky generátora v priebehu učenia (beh so semienkom 2)

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.

Laicky povedané

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:

semienkopokrytých zhlukov po krokoch 1 000 … 8 000na koncikvalita na konci
10 · 2 · 7 · 6 · 6 · 7 · 7 · 77 z 866 %
24 · 5 · 8 · 8 · 8 · 8 · 8 · 88 z 873 %
31 · 4 · 4 · 4 · 5 · 5 · 5 · 55 z 854 %
40 · 5 · 6 · 6 · 6 · 6 · 6 · 66 z 849 %
semienko 1: 7 z 8 semienko 3: 5 z 8 semienko 4: 6 z 8 súradnica x₁ (bez jednotky) x₂ (bez jednotky)
Koniec učenia pri ostatných behoch (plný krúžok = pokrytý zhluk)

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.

GAN, semienko 1 GAN, semienko 2 VAE (minulý diel)
Prvých desať vzoriek (kód / šum s 8 rozmermi)

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?

020406080 0 1 2 3 4 5 6 7 8 9 cifra (0–9) počet vzoriek (z 200)
Koľkokrát ktorá cifra medzi 200 vzorkami (podľa najbližšej trénovacej číslice) semienko 1semienko 2 rovnomerne (20)

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ú
Kantorovičova–Rubinsteinova dualita: najmenšia „práca“ potrebná na presunutie hmoty jedného rozdelenia na druhé sa rovná najväčšiemu rozdielu priemerov cez 1-lipschitzovské funkcie. V príklade vyššie stačí f(x) = −x · sgn θ: f(0) = 0 − f(θ) = −|θ|, rozdiel je 0 − (−|θ|) = |θ|.

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.

Agent na vašom počítači, ovládaný z telefónu