Generatywne sieci przeciwstawne (GAN): fałszerz kontra detektyw
Gra generatora i dyskryminatora, GAN napisany od zera, nienasycająca się strata, osiem skupisk na okręgu i kolaps modów, cyfry ostrzejsze niż w VAE, ale nie wszystkie, oraz droga od GAN do modeli dyfuzyjnych.
Seria Podstawy AI Część 45 z 52
- Mapa sztucznej inteligencji: co jest czym i jak to do siebie pasuje
- Krótka historia sztucznej inteligencji: od Turinga do modeli językowych
- Dane, model, trening, inferencja: podstawowe pojęcia na jednym przykładzie
- Jak czytać zapis matematyczny: symbole, indeksy, sumy i kwantyfikatory
- Zbiory i relacje: klocki, z których składają się definicje w AI
- Funkcje i odwzorowania: dlaczego każdy model AI jest funkcją
- Logika i dowody: reguły, według których rozumuje AI
- Grafy i drzewa: struktura, na której opierają się przeszukiwanie i sieci neuronowe
- Algebra liniowa dla uczenia maszynowego: wektory, macierze i dlaczego AI głównie mnoży
- Pochodne, gradient i reguła łańcuchowa: jak model ustala, w którą stronę się uczyć
- Spadek gradientu: jak uczy się model
- Czym jest prawdopodobieństwo: od rzutu kostką do aksjomatów Kołmogorowa
- Prawdopodobieństwo warunkowe i twierdzenie Bayesa: jak zmienić ocenę, gdy dowiesz się czegoś nowego
- Zmienna losowa i dystrybuanta: jedna funkcja, która mówi o rozkładzie wszystko
- Funkcja gęstości i funkcja prawdopodobieństwa: dlaczego zmienna ciągła ma w punkcie prawdopodobieństwo zero
- Wartość oczekiwana, wariancja i kowariancja: gdzie leży rozkład, jak jest szeroki i co z czym się wiąże
- Przegląd rozkładów prawdopodobieństwa: Bernoulliego, dwumianowy, Poissona, jednostajny, normalny i wykładniczy
- Prawo wielkich liczb i centralne twierdzenie graniczne: dlaczego średnie zachowują się tak przewidywalnie
- Statystyka i estymacja parametrów: największa wiarygodność, MAP i przedziały ufności
- Teoria informacji: entropia, entropia krzyżowa i dywergencja KL — skąd się biorą funkcje straty
- Przeszukiwanie przestrzeni stanów: BFS, DFS, UCS i A* z animacjami
- Gry i przeciwnik: minimax, przycinanie alfa-beta i Monte Carlo tree search
- Spełnianie ograniczeń: backtracking, propagacja ograniczeń i AC-3 na sudoku i mapie czeskich krajów
- Logika i systemy z bazą wiedzy: wnioskowanie w przód i wstecz, rezolucja i systemy ekspertowe
- Planowanie: STRIPS, świat klocków, heurystyki z relaksacji i planowanie w agentach AI
- Przeszukiwanie lokalne i symulowane wyżarzanie: komiwojażer przez czeskie miasta wojewódzkie
- Algorytmy genetyczne: populacja, krzyżowanie, mutacja i selekcja na plecaku na wycieczkę
- Strategie ewolucyjne i programowanie genetyczne: od reguły jednej piątej do prawa Keplera
- Optymalizacja kolonią mrówek: jak ślad feromonowy znajduje krótką drogę
- Optymalizacja rojem cząstek: bezwładność, własne doświadczenie i doświadczenie roju
- Neuroewolucja: ewolucja wag i kształtu sieci neuronowych oraz algorytm NEAT
- Zbiory rozmyte i funkcje przynależności: jak zapisać „trochę ciepło”
- Logika rozmyta a prawdopodobieństwo: dlaczego „trochę ciepło” nie znaczy „prawdopodobnie ciepło”
- Logika rozmyta: t-normy, implikacje i reguły JEŻELI–TO
- Sterowanie rozmyte: Mamdani i Sugeno od wentylatora po wahadło na wózku
- Klasteryzacja rozmyta: algorytm fuzzy c-means i punkty między skupieniami
- Systemy neuro-rozmyte (ANFIS): reguły rozmyte, które uczą się z danych
- Łańcuchy Markowa: macierz przejścia, rozkład stacjonarny i PageRank
- Ukryte modele Markowa: algorytm Viterbiego i nieuczciwe kasyno
- Sieci bayesowskie: dlaczego trawa jest mokra i co z tego wynika dla zraszacza
- Filtr Kalmana: jak z niedokładnych pomiarów oszacować, gdzie jest samochód i jak szybko jedzie
- Rodzaje uczenia maszynowego: nadzorowane, nienadzorowane, półnadzorowane i inne
- Prompty, kontekst i RAG: jak dać modelowi właściwe informacje
- Wariacyjne autoenkodery (VAE): nowe obrazki z ciągłej przestrzeni latentnej
- Generatywne sieci przeciwstawne (GAN): fałszerz kontra detektyw
- Modele dyfuzyjne: jak z czystego szumu powstaje obraz
- Procesy decyzyjne Markowa: stany, akcje, nagrody i równania Bellmana
- Q-learning i DQN: uczenie się wartości akcji od tabeli po sieć neuronową
- Policy gradient i PPO: uczenie się bezpośrednio polityki
- Jak działa agent AI: model językowy w pętli z narzędziami
- Programowanie z agentami AI: zadanie, testy i kontrola
- Ocena i bezpieczeństwo systemów AI: jak mierzyć i jak pilnować
Pełny program serii Gotowe: 52 z 83 tematów
- Jak generator uczy się wyłącznie z gradientu dyskryminatora.
- Dlaczego uczenie GAN jest niestabilne i czym jest kolaps modów.
- W czym GAN wygrywa z VAE, w czym przegrywa i dlaczego zastąpiła je dziś dyfuzja.
Warto wiedzieć wcześniej: Wariacyjne autoenkodery (VAE): nowe obrazki z ciągłej przestrzeni latentnej, Gry i przeciwnik: minimax, przycinanie alfa-beta i Monte Carlo tree search
Autoenkoder wariacyjny z poprzedniej części generuje rzetelnie, ale rozmyte obrazy. W 2014 roku Ian Goodfellow wpadł na pomysł, który wygląda niemal jak sztuczka: nie będziemy mierzyć, jak bardzo próbka różni się od danych, tylko pozwolimy to ocenić innej sieci. Dwie sieci grają w grę — jedna podrabia, druga rozpoznaje podróbkę — i obie przy tym stają się lepsze. Tak powstały pierwsze maszynowo wygenerowane twarze, których nie odróżnisz od zdjęć. W tej części napiszemy obie sieci od zera i zobaczymy, dlaczego ich uczenie jest tak kapryśne.
Nawiązuje do części Wariacyjne autoenkodery, Regresja logistyczna (sigmoida i entropia krzyżowa) oraz Gry i przeciwnik.
1. Fałszerz i detektyw
Definicja — generatywna sieć przeciwstawna (GAN)
GAN (Ian Goodfellow i in., 2014) składa się z dwóch sieci. Generator G przekształca losowy szum z ~ N(0, I) w próbkę G(z). Dyskryminator D zwraca prawdopodobieństwo D(x), że x pochodzi z prawdziwych danych. Grają w grę dwóch graczy o sumie zerowej:
minG maxD Ex ~ data[log D(x)] + Ez[log(1 − D(G(z)))].
Dla ustalonego G najlepszy dyskryminator to D*(x) = pdata(x) / (pdata(x) + pG(x)). W równowadze G generuje dokładnie rozkład danych, a D wszędzie zwraca ½.
Fałszerz drukuje banknoty, detektyw sortuje je na prawdziwe i fałszywe. Detektyw uczy się na tym, gdzie się pomylił. Fałszerz nigdy nie widział prawdziwego banknotu — uczy się tylko z tego, co go zdradziło przed detektywem. Gdy obaj się poprawiają, podróbki są coraz lepsze. Koniec gry: detektyw może tylko zgadywać i zgaduje pół na pół.
minG maxD Ex ~ data[ log D(x) ] + Ez ~ N(0, I)[ log(1 − D(G(z))) ]
- Ex ~ data[log D(x)]
- dyskryminator na prawdziwych danych — jest największy (0), gdy D daje prawdziwym próbkom 1; logarytm karze pewny siebie błąd (D → 0) bez ograniczeń
- Ez[log(1 − D(G(z)))]
- dyskryminator na podróbkach — jest największy, gdy daje im 0; to jedyny człon, w którym występuje G, więc generator uczy się tylko z niego
- maxD
- dyskryminator zwiększa wartość — oba człony razem to ujemna binarna entropia krzyżowa, więc jest to zwykłe uczenie klasyfikatora „prawdziwe / podróbka”
- minG
- generator zmniejsza wartość — chce, by dyskryminator mylił się na podróbkach; co jeden gracz zyska, drugi traci (suma zerowa)
Twierdzenie — najlepszy dyskryminator i co minimalizuje generator
Dla ustalonego G wartość gry wynosi ∫ [pdata(x) log D(x) + pG(x) log(1 − D(x))] dx. W każdym punkcie x maksymalizujemy funkcję a log y + b log(1 − y) dla y ∈ (0, 1), gdzie a = pdata(x), b = pG(x).
Dowód. Pochodna a/y − b/(1 − y) zeruje się dla y = a/(a + b), a funkcja jest wklęsła (druga pochodna −a/y² − b/(1 − y)² < 0), więc jest to maksimum. Stąd D*(x) = pdata(x) / (pdata(x) + pG(x)). Po podstawieniu i przekształceniu (Goodfellow i in., 2014):
V(D*, G) = −log 4 + 2 · JSD(pdata ‖ pG), JSD(p ‖ q) = ½ KL(p ‖ m) + ½ KL(q ‖ m), m = ½(p + q).
Dywergencja Jensena–Shannona jest nieujemna i równa zeru dokładnie wtedy, gdy pG = pdata. Przy najlepszym dyskryminatorze generator minimalizuje więc JSD, a minimum −log 4 ≈ −1,386 osiąga, gdy generuje dokładnie dane. ∎
Przykład: tam, gdzie gęstość danych wynosi 0,3, a podróbek 0,1, jest D* = 0,3 / 0,4 = 0,75 (punkt jest raczej prawdziwy); gdzie generator przesadzi (dane 0,1, podróbki 0,3), jest D* = 0,25. Tam, gdzie gęstości są równe, D* = ½, a strata dyskryminatora (binarna entropia krzyżowa na jedną próbkę) wynosi ln 2 ≈ 0,693.
Dyskryminator to zwykły klasyfikator z sigmoidą i entropią krzyżową, jak regresja logistyczna, tylko z dodatkowymi warstwami. Cała magia tkwi w generatorze: gradient jego straty przepływa propagacją wsteczną przez dyskryminator aż do obrazu, a stamtąd do wag generatora. Dyskryminator mówi mu w ten sposób, w którą stronę przesunąć każdy piksel, żeby wyglądał wiarygodniej.
2. Uczenie: kroki na zmianę
Uczenie odbywa się na zmianę: krok dyskryminatora (partia prawdziwych danych i partia podróbek, zwiększyć D na prawdziwych, zmniejszyć na fałszywych), potem krok generatora (przesunąć podróbki tam, gdzie D uważa je za prawdziwe). Obie sieci mają u nas dwie warstwy ukryte z leaky ReLU i uczą się Adamem.
Definicja — nienasycająca się strata generatora
Zamiast minimalizować log(1 − D(G(z))) z pierwotnej gry, generator uczy się maksymalizować log D(G(z)), czyli minimalizować −log D(G(z)). Obie straty mają ten sam cel, ale inny gradient: jeśli D = σ(s), to |∂ log(1 − D)/∂s| = D, podczas gdy |∂(−log D)/∂s| = 1 − D. Zaproponowali ją już Goodfellow i in. w tym samym artykule.
Na początku podróbki są kiepskie i detektyw łatwo je demaskuje, D jest dla nich bliskie zeru. Pierwotna strata nie wysyła wtedy prawie żadnego sygnału — fałszerz nie dowie się, co poprawić, akurat wtedy, gdy potrzebuje tego najbardziej. Odwrócone pytanie („jak przekonać detektywa”) daje silny sygnał od samego początku.
∂/∂s log(1 − σ(s)) = −D, ∂/∂s (−log σ(s)) = −(1 − D)
- s
- logit — wyjście dyskryminatora przed sigmoidą; różniczkujemy względem niego, bo stąd gradient płynie z powrotem do dyskryminatora, a przez niego do podróbki
- D = σ(s)
- prawdopodobieństwo, że podróbka jest prawdziwa; korzysta się z σ′(s) = σ(s)(1 − σ(s)), dlatego wychodzą tak proste wyrażenia
- log(1 − σ(s))
- pierwotna strata generatora (minimalizowana) — jej gradient ma wielkość D, więc gdy dyskryminator pewnie zdemaskuje podróbkę (D ≈ 0), jest prawie zerowy: nasycenie
- −log σ(s)
- nienasycająca się strata — gradient ma wielkość 1 − D, czyli największą właśnie dla podróbek, które dyskryminator zdemaskował
Szczerze mówiąc: w naszych małych eksperymentach uczyła się także pierwotna strata, bo dyskryminator nie był na początku tak pewny siebie. W dużych sieciach na obrazach, gdzie dyskryminator szybko wygrywa, różnica jest zasadnicza. Dalej używamy nienasycającej się straty.
Jak gradient dociera aż do generatora, pokazuje reguła łańcuchowa. Podróbka x = G(z) jest dla dyskryminatora tylko wejściem, więc propagacja wsteczna nie musi się na niej zatrzymać:
∂LG / ∂θG = ∂LG / ∂s · ∂s / ∂x · ∂x / ∂θG
- ∂LG / ∂s
- jedna liczba ze straty, dla nienasycającej się −(1 − D) — „jak bardzo” podróbka ma się poprawić
- ∂s / ∂x
- gradient dyskryminatora względem jego wejścia (dla okręgu 2 liczby, dla cyfry 64) — „w którą stronę” przesunąć każdą współrzędną, by podróbka wyglądała prawdziwiej; wagi dyskryminatora w tym kroku się nie zmieniają
- ∂x / ∂θG
- zwykła propagacja wsteczna przez generator — przekłada pożądane przesunięcie podróbki na zmianę wag generatora
Definicja — strata dyskryminatora i softplus
Dyskryminator zwraca logit s, a D = σ(s). Dla prawdziwej próbki z logitem sr i podróbki z logitem sf jego strata to binarna entropia krzyżowa
LD = −log σ(sr) − log(1 − σ(sf)) = softplus(−sr) + softplus(sf), softplus(u) = ln(1 + eu),
ponieważ −log σ(s) = ln(1 + e−s) i 1 − σ(s) = σ(−s). Program liczy softplus z logitu, a nie z D: dla s = 40 jest σ(s) w arytmetyce zmiennoprzecinkowej dokładnie 1 i log(1 − D) wyszedłby −∞, podczas gdy softplus(40) ≈ 40. Gradienty: ∂LD/∂sr = σ(sr) − 1, ∂LD/∂sf = σ(sf).
for t in range(kroku):
# 1. krok dyskryminatora: prawdziwe → 1, podróbki → 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()) # podróbka, G się teraz nie uczy
gD += D.zpet(D(f), dL_ds=sigmoid(D(f)))
adam_D(gD / davka)
# 2. krok generatora: gradient przechodzi przez D aż do podróbki
gG = 0
for _ in range(davka):
x = G(sum())
dL_ds = sigmoid(D(x)) - 1 # nienasycająca się −log σ(s)
dL_dx = D.zpet_do_vstupu(dL_ds) # wagi D bez zmian
gG += G.zpet(dL_dx)
adam_G(gG / davka) # Adam z β₁ = 0,5 jak w DCGAN
3. Osiem skupisk na okręgu
Klasyczny eksperyment: dane to punkty z ośmiu małych skupisk o rozkładzie normalnym (σ = 0,05) rozmieszczonych na okręgu o promieniu 2. Generator dostaje dwuwymiarowy szum i zwraca punkt na płaszczyźnie. Mierzymy jakość (odsetek próbek w odległości do 3σ od któregoś środka) i pokrycie (do ilu skupisk trafia co najmniej 2 % próbek).
Definicja — dane, jakość i pokrycie
Środki skupisk to cj = (r cos(2πj/8), r sin(2πj/8)) dla j = 0, …, 7 przy r = 2; punkt danych to cj z losowym j plus szum N(0, σ²I), σ = 0,05. Dla próbek x1, …, xn generatora:
jakość = (1/n) · #{i : minj ‖xi − cj‖ < 3σ}, pokrycie = #{j : nj ≥ 0,02 · n},
gdzie nj to liczba próbek w odległości do 3σ od środka cj. Liczby: 3σ = 0,15, sąsiednie środki są od siebie oddalone o 2r sin(π/8) ≈ 1,53, czyli ponad dziesięć razy dalej. Migawki mają n = 400 próbek, więc skupisko liczy się jako pokryte od 8 próbek.
Nawet doskonały generator nie ma jakości 100 %: odległość punktu od środka dwuwymiarowego rozkładu normalnego ma rozkład Rayleigha i do 3σ trafia odsetek 1 − e−9/2 ≈ 0,989, czyli około 98,9 %.
Po 500 krokach generator wytwarza rozmytą chmurę (jakość 6 %), po 2 000 krokach punkty skupiają się w 6 skupiskach, a na końcu (krok 8 000) pokrywa wszystkie 8 z jakością 73 %. Generator nigdy nie widział ani jednego prawdziwego punktu — wszystkiego dowiedział się z gradientu dyskryminatora.
4. Kolaps modów
Definicja — kolaps modów (mode collapse)
Generator wytwarza tylko część rozkładu danych — kilka modów (skupisk, rodzajów obrazów), a resztę pomija. Strata nie karze tego bezpośrednio: dyskryminator ocenia każdą próbkę osobno, a dobra podróbka jednego rodzaju jest dla niego tak samo przekonująca jak różnorodna kolekcja. Przy całkowitym kolapsie generator dla każdego z wytwarza niemal to samo.
Fałszerz odkrywa, że detektyw najgorzej rozpoznaje fałszywe setki. Drukuje więc tylko setki. Detektyw z czasem to zauważa i zaczyna podejrzewać setki — fałszerz przeskakuje na dwusetki. Gra kręci się w kółko, a fałszerz nigdy nie wytwarza wszystkich banknotów naraz.
Twierdzenie — przeciw ustalonemu dyskryminatorowi najlepszy jest jeden punkt
Dla ustalonego D strata generatora LG = Ez[−log D(G(z))] ≥ −log D(x*), gdzie x* to punkt, w którym D jest największe. Równość zachodzi dla generatora, który każde z wysyła do x*.
Dowód. Dla każdego z jest D(G(z)) ≤ D(x*), a ponieważ −log jest malejący, −log D(G(z)) ≥ −log D(x*); wartość oczekiwana zachowuje nierówność. ∎
Strata jest średnią po pojedynczych próbkach i nic w niej nie nagradza różnorodności. Przeciw ustalonemu przeciwnikowi całkowity kolaps jest więc optymalny; powstrzymuje go tylko to, że dyskryminator reaguje i zaczyna podejrzewać miejsce x*. Jeśli generator przeskoczy szybciej, niż dyskryminator zapomni, gra kręci się w kółko. Dlatego pomagają modyfikacje, które dają dyskryminatorowi wgląd w całą partię (minibatch discrimination, Tim Salimans i in., 2016), albo inna odległość między rozkładami (Wasserstein, niżej).
Ta sama sieć, te same dane, te same ustawienia — tylko inne losowe ziarno:
| ziarno | pokryte skupiska po krokach 1 000 … 8 000 | na końcu | jakość na końcu |
|---|---|---|---|
| 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 % |
Tylko jeden z czterech przebiegów pokrył wszystkie osiem skupisk. Przebieg z ziarnem 3 skończył na 5 i od kroku 5 000 już się nie ruszył. To typowe dla GAN: uczenie nie ma jednej straty, która by malała, tylko grę dwóch graczy, a wynik zależy od przypadku bardziej, niż byśmy chcieli.
5. Cyfry: ostrzejsze, ale nie wszystkie
Teraz te same cyfry 8 × 8 co przy VAE. Generator: ośmiowymiarowy szum → 64 → 64 → 64 piksele z sigmoidą; dyskryminator lustrzanie. 6 000 kroków, dwa przebiegi z różnym ziarnem. Jakość mierzymy tak samo jak w poprzedniej części — odległością próbki od najbliższej cyfry treningowej.
Próbki GAN są ostrzejsze: odległość 0,049 i 0,042 wobec 0,054 dla VAE (prawdziwe cyfry 0,017). GAN nie karze rozmycia uśrednianiem jak strata rekonstrukcji VAE — rozmyty obraz dyskryminator łatwo rozpozna. Tylko których cyfr i ile generator wytwarza?
W danych każdej cyfry jest tyle samo. Przebieg z ziarnem 2 wytwarza przy tym głównie szóstki (69 z 200), ósemki i trójki, a cyfr 0, 1, 2, 4, 7 prawie wcale (najwyżej 3 próbki). Przebieg z ziarnem 1 jest bardziej różnorodny, ale i tam cyfry 0, 4, 9 mają mniej niż połowę swojego udziału (najwyżej 6 próbek zamiast 20). To ten sam kolaps modów co na okręgu, tylko na obrazach: GAN wygrywa ostrością, VAE pokryciem.
6. Od GAN do dyfuzji
- DCGAN (Alec Radford i in., 2015) pokazał, jak budować konwolucyjne GAN, które da się niezawodnie uczyć na zdjęciach.
- Wasserstein GAN (Martin Arjovsky i in., 2017) zastąpił klasyfikator „krytykiem”, który mierzy odległość między rozkładami; uczenie jest stabilniejsze i mniej podatne na kolaps modów.
- StyleGAN (Tero Karras i in., Nvidia, 2018–2020) generuje fotorealistyczne twarze w rozdzielczości 1024 × 1024 — znana strona „this person does not exist”.
- Około 2021 roku GAN wyprzedziły modele dyfuzyjne (Prafulla Dhariwal i Alex Nichol: „Diffusion Models Beat GANs on Image Synthesis”). Są wolniejsze, ale uczą się stabilnie i pokrywają cały rozkład. Idea dyskryminatora żyje jednak dalej — jako pomocnicza strata, która dodaje obrazom ostrości, na przykład w koderach obrazu lub dźwięku.
Dlaczego Wasserstein pomaga, widać na najprostszym przykładzie (uproszczona wersja przykładu z artykułu Arjovsky i in., 2017): dane to jeden punkt 0, generator wytwarza jeden punkt θ. Dopóki θ ≠ 0, rozkłady się nie nakładają i JSD = ln 2 ≈ 0,693 bez względu na to, jak daleko jest θ — gradient względem θ jest zerowy, a generator nie wie, dokąd iść. Odległość Wassersteina wynosi |θ|, więc wskazuje kierunek nawet z dużej odległości.
W(pdata, pG) = sup‖f‖L ≤ 1 ( Ex ~ data[f(x)] − Ez[f(G(z))] )
- sup‖f‖L ≤ 1
- krytyk f — sieć, która zamiast prawdopodobieństwa zwraca dowolną liczbę; warunek „1-lipschitzowska” (|f(a) − f(b)| ≤ ‖a − b‖) nie pozwala mu rozróżniać dwóch bliskich punktów dowolnie ostro, inaczej różnica mogłaby rosnąć do nieskończoności
- Edata[f(x)]
- średnia ocena prawdziwych danych — krytyk chce, by była jak największa
- Ez[f(G(z))]
- średnia ocena podróbek — krytyk chce, by była jak najmniejsza, generator jak największa; różnica jest ciągła względem parametrów generatora, więc gradient nie znika, nawet gdy rozkłady się nie nakładają
7. Podsumowanie
- GAN = generator i dyskryminator w grze; generator uczy się tylko z gradientu, który przesyła mu dyskryminator.
- Nienasycająca się strata −log D(G(z)) daje generatorowi silny sygnał nawet na początku, gdy dyskryminator wygrywa.
- Na ośmiu skupiskach wszystkie pokrył tylko jeden z czterech przebiegów (7, 8, 5, 6); wynik mocno zależy od przypadku.
- Na cyfrach próbki są ostrzejsze niż w VAE (0,042 wobec 0,054), ale niektórych cyfr brakuje — kolaps modów.
- Dziś obrazy generują głównie modele dyfuzyjne; dyskryminator pozostał jako pomocnik od ostrości.
Chcesz sam spróbować? Poproś agenta AI, żeby nauczył mały GAN na ośmiu skupiskach na okręgu i uruchomił go pięć razy z różnym ziarnem. Potem niech spróbuje Wasserstein GAN z tą samą siecią i porówna, ile skupisk za każdym razem pokrywa.
Masz inne zdanie? Napisz na support@coden-app.com.