Model generatywny jest potężnym sposobem uczenia się dowolnego rodzaju rozkładu danych przy użyciu uczenia bez nadzoru i osiągnął ogromny sukces w ciągu zaledwie kilku lat. Wszystkie typy modeli generatywnych mają na celu nauczenie się prawdziwego rozkładu danych w zbiorze treningowym, tak aby wygenerować nowe punkty danych z pewnymi zmianami. Jednak nie zawsze jest możliwe nauczenie się dokładnego rozkładu naszych danych w sposób jawny lub ukryty, dlatego też staramy się modelować rozkład, który jest jak najbardziej podobny do prawdziwego rozkładu danych. Dla tego, możemy wykorzystać moc sieci neuronowych do nauki funkcji, która może przybliżyć model dystrybucji do prawdziwej dystrybucji.
Dwa z najczęściej używanych i skutecznych podejść są Variational Autoencoders (VAE) i Generative Adversarial Networks (GAN). VAE ma na celu maksymalizację dolnej granicy log-likelihood danych i GAN ma na celu osiągnięcie równowagi między Generator i Discriminator. W tym blogpost, będę wyjaśniać pracę VAE i GANs i intuicji za nimi.
Variational Autoencoder
Zakładam, że czytelnik jest już zaznajomiony z pracy wanilii autoencoder. Wiemy, że możemy użyć autoenkodera do zakodowania obrazu wejściowego do znacznie mniejszej reprezentacji wymiarowej, która może przechowywać ukrytą informację o rozkładzie danych wejściowych. Ale w waniliowym auto-enkoderze, zakodowany wektor może być tylko odwzorowany na odpowiadające mu dane wejściowe przy pomocy dekodera. Z pewnością nie może być używany do generowania podobnych obrazów z pewną zmiennością.
Aby to osiągnąć, model musi nauczyć się rozkładu prawdopodobieństwa danych szkoleniowych. VAE jest jednym z najbardziej popularnych podejść do uczenia się skomplikowanych rozkładów danych, takich jak obrazy za pomocą sieci neuronowych w sposób nienadzorowany. Jest to probabilistyczny model graficzny zakorzeniony w Bayesian inference, tzn. model ma na celu poznanie rozkładu prawdopodobieństwa danych szkoleniowych, tak aby mógł łatwo próbkować nowe dane z tego rozkładu. Idea polega na uczeniu się niskowymiarowej reprezentacji danych treningowych zwanych zmiennymi ukrytymi (zmienne, które nie są bezpośrednio obserwowane, ale są raczej wnioskowane poprzez model matematyczny), które zakładamy, że wygenerowały nasze rzeczywiste dane treningowe. Te zmienne ukryte mogą przechowywać użyteczne informacje na temat rodzaju danych wyjściowych, które model musi wygenerować. Rozkład prawdopodobieństwa zmiennych ukrytych z jest oznaczany jako P(z). Rozkład gaussowski jest wybierany jako prior do nauki rozkładu P(z), aby łatwo próbkować nowe punkty danych w czasie wnioskowania.
Teraz głównym celem jest modelowanie danych za pomocą pewnych parametrów, które maksymalizują prawdopodobieństwo danych treningowych X. W skrócie, zakładamy, że niskowymiarowy wektor ukryty wygenerował nasze dane x (x ∈ X) i możemy odwzorować ten wektor ukryty na dane x używając deterministycznej funkcji f(z;θ) parametryzowanej przez theta, którą musimy oszacować (patrz rys. 1). W ramach tego procesu generatywnego, naszym celem jest maksymalizacja prawdopodobieństwa każdej danej w X, które jest dane jako,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
Tutaj, f(z;θ)został zastąpiony rozkładem Pө(X|z).
Intuicja stojąca za tą estymacją maksymalnej wiarygodności jest taka, że jeśli model może wygenerować próbki treningowe z tych zmiennych latentnych, to może również wygenerować podobne próbki z pewnymi wariacjami. Innymi słowy, jeżeli pobierzemy próbki z dużej liczby zmiennych ukrytych z P(z) i wygenerujemy x z tych zmiennych to wygenerowany x powinien pasować do rozkładu danych Pdata(x). Teraz mamy dwa pytania, na które musimy odpowiedzieć. Jak uchwycić rozkład zmiennych ukrytych i jak zintegrować równanie 1 na wszystkich wymiarach z?
Oczywiście ręczne określanie istotnych informacji, które chcielibyśmy zakodować w wektorze ukrytym w celu wygenerowania obrazu wyjściowego jest żmudnym zadaniem. Raczej polegamy na sieciach neuronowych, aby obliczyć z tylko z założeniem, że ten wektor ukryty może być dobrze przybliżony jako rozkład normalny, tak aby łatwo próbkować w czasie wnioskowania. Jeśli mamy rozkład normalny z w przestrzeni n wymiarowej, to zawsze jest możliwe wygenerowanie dowolnego rodzaju rozkładu przy użyciu wystarczająco skomplikowanej funkcji, a odwrotność tej funkcji może być użyta do uczenia się samych zmiennych ukrytych.
W równaniu 1, całkowanie jest przeprowadzane przez wszystkie wymiary z i dlatego jest niepraktyczne. Można je jednak obliczyć za pomocą metod całkowania Monte-Carlo, co nie jest łatwe do zaimplementowania. Dlatego stosujemy inne podejście, aby w przybliżeniu zmaksymalizować Pө(X) w równaniu 1. Idea VAE polega na wnioskowaniu o P(z) za pomocą P(z|X), którego nie znamy. Do wnioskowania o P(z|X) używamy metody zwanej wnioskowaniem wariacyjnym, która jest w zasadzie problemem optymalizacyjnym w statystyce bayesowskiej. Najpierw modelujemy P(z|X) używając prostszego rozkładu Q(z|X), który jest łatwy do znalezienia i staramy się zminimalizować różnicę pomiędzy P(z|X) i Q(z|X) używając metryki KL-dywergencji tak, aby nasza hipoteza była bliska prawdziwemu rozkładowi. Po tym następuje wiele równań matematycznych, których nie będę tutaj tłumaczył, ale można je znaleźć w oryginalnym artykule. Muszę jednak powiedzieć, że równania te nie są bardzo trudne do zrozumienia, gdy tylko poznasz intuicję stojącą za VAE.
Ostateczna funkcja celu VAE jest :-
Powyższe równanie ma bardzo ładną interpretację. Termin Q(z|X) jest w zasadzie naszą siatką kodera, z jest naszą zakodowaną reprezentacją danych x(x ∈ X), a P(X|z) jest naszą siatką dekodera. Tak więc w powyższym równaniu naszym celem jest maksymalizacja log-likelihood naszego rozkładu danych pod pewnym błędem danym przez D_KL. Łatwo zauważyć, że VAE stara się zminimalizować dolną granicę log(P(X)), ponieważ P(z|X) nie jest tractable, ale KL-divergence term jest >=0. To jest to samo co maksymalizacja E i minimalizacja D_KL. Wiemy, że maksymalizacja E jest estymacją maksymalnego prawdopodobieństwa i jest modelowana za pomocą sieci dekodera. Jak wspomniałem wcześniej, chcemy aby nasza reprezentacja latentna była zbliżona do gaussowskiej i stąd zakładamy, że P(z) jest N(0, 1). Podążając za tym założeniem, Q(z|X) również powinno być zbliżone do tego rozkładu. Jeśli przyjmiemy, że jest to Gaussian o parametrach μ(X) i Ʃ(X), to błąd wynikający z różnicy tych dwóch rozkładów tj, P(z) i Q(z|X) zadany przez dywergencję KL daje w wyniku rozwiązanie w postaci zamkniętej podane poniżej.
Uważając, że optymalizujemy dolną granicę wariancyjną, naszą funkcją optymalizacyjną jest :
log(P(X|z)) – D_KL, gdzie rozwiązanie drugiego z nich jest pokazane powyżej.
Więc nasza funkcja straty będzie zawierała dwa terminy. Pierwszy z nich to strata rekonstrukcji wejścia na wyjście, a drugi to termin rozbieżności KL. Teraz możemy trenować sieć za pomocą algorytmu wstecznej propagacji. Jest jednak pewien problem, a mianowicie pierwszy człon zależy nie tylko od parametrów P, ale również od parametrów Q, ale ta zależność nie pojawia się w powyższym równaniu. Jak więc dokonać wstecznej propagacji przez warstwę, w której próbkujemy z losowo z rozkładu Q(z|X) lub N tak, aby P mógł dekodować. Gradienty nie mogą przepływać przez losowe węzły. Używamy sztuczki reparametryzacji (patrz rysunek), aby uczynić sieć różniczkowalną. Próbkujemy z N(μ(X), Σ(X)) najpierw próbkując ε ∼ N(0, I), a następnie obliczając z=μ(X) + Σ1/2(X)∗ε.
To zostało bardzo pięknie pokazane na rysunku 2 ? . Należy zauważyć, że krok feedforward jest identyczny dla obu tych sieci (lewa & prawa), ale gradienty mogą wstecznie przepływać tylko przez prawą sieć.
W czasie wnioskowania, możemy po prostu pobrać próbkę z z N(0, 1) i podać ją do sieci dekodera, aby wygenerować nowy punkt danych. Ponieważ jesteśmy optymalizacji dolnej granicy wariacyjnej, jakość generowanego obrazu jest nieco słaba w porównaniu do state-of-the art technik, takich jak Generative Adversarial Networks.
Najlepszą rzeczą VAE jest to, że uczy się zarówno model generatywny i model wnioskowania. Chociaż zarówno VAE i GANs są bardzo ekscytujące podejścia do uczenia się rozkład danych przy użyciu nienadzorowanego uczenia się, ale GANs przynieść lepsze wyniki w porównaniu do VAE. W VAE, optymalizujemy dolną granicę wariacyjną, podczas gdy w GAN, nie ma takiego założenia. W rzeczywistości, GANs nie mają do czynienia z żadnym jawnym estymacji gęstości prawdopodobieństwa. Niepowodzenie VAE w generowaniu ostrych obrazów sugeruje, że model nie jest w stanie nauczyć się prawdziwego rozkładu następczego. VAE i GAN różnią się głównie w sposobie szkolenia. Zanurzmy się teraz w Generative Adversarial Networks.
Generative Adversarial Networks
Yann LeCun twierdzi, że trening przeciwstawny jest najfajniejszą rzeczą od czasu krojenia chleba. Patrząc na popularność Generative Adversarial Networks i jakość wyników, jakie generują, myślę, że większość z nas zgodziłaby się z nim. Trening adwersaryjny całkowicie zmienił sposób, w jaki uczymy sieci neuronowe wykonywania konkretnych zadań. Generative Adversarial Networks nie pracują z żadną jawną estymacją gęstości jak Variational Autoencoders. Zamiast tego, opierają się na teorii gier, której celem jest znalezienie równowagi Nasha pomiędzy dwoma sieciami, Generatorem i Dyskryminatorem. Idea polega na próbkowaniu z prostej dystrybucji jak Gaussian, a następnie nauczyć się przekształcić ten szum do dystrybucji danych przy użyciu uniwersalnych aproksymatorów funkcji, takich jak sieci neuronowe.
Osiąga się to poprzez przeciwstawne szkolenie tych dwóch sieci. Model generatora G uczy się, jak uchwycić rozkład danych, a model dyskryminatora D szacuje prawdopodobieństwo, że próbka pochodzi z rozkładu danych, a nie z rozkładu modelu. Zasadniczo zadaniem generatora jest generowanie naturalnie wyglądających obrazów, a zadaniem dyskryminatora jest podjęcie decyzji, czy obraz jest fałszywy czy prawdziwy. Można to potraktować jako grę mini-max dla dwóch graczy, w której wydajność obu sieci poprawia się z czasem. W tej grze, generator stara się oszukać dyskryminator generując prawdziwe obrazy tak dalece jak to możliwe, a generator stara się nie dać się oszukać dyskryminatorowi poprzez poprawę jego zdolności dyskryminacyjnych. Poniższy obraz przedstawia podstawową architekturę GAN.
Definiujemy prior na wejściowych zmiennych szumowych P(z), a następnie generator odwzorowuje to na rozkład danych za pomocą złożonej funkcji różniczkowalnej o parametrach өg. Oprócz tego mamy jeszcze jedną sieć o nazwie Discriminator, która przyjmuje dane wejściowe x i za pomocą innej funkcji różniczkowalnej o parametrach өd wyprowadza pojedynczą wartość skalarną oznaczającą prawdopodobieństwo, że x pochodzi z prawdziwego rozkładu danych Pdata(x). Funkcja celu GAN jest zdefiniowana jako
W powyższym równaniu, jeśli wejście do Dyskryminatora pochodzi z rozkładu prawdziwych danych, to D(x) powinien wyprowadzić 1, aby zmaksymalizować powyższą funkcję celu w.r.Jeśli obraz został wygenerowany z Generatora, wtedy D(G(z)) powinno wyjść 1 aby zminimalizować funkcję celu w.r.t G. To ostatnie oznacza, że G powinno generować takie realistyczne obrazy, które mogą oszukać D. Maksymalizujemy powyższą funkcję w.r.t parametrów Dyskryminatora używając Gradient Ascent i minimalizujemy to samo w.r.t parametrów Generatora używając Gradient Descent. Pojawia się jednak problem z optymalizacją celu Generatora. Na początku gry, kiedy generator jeszcze niczego się nie nauczył, gradient jest zazwyczaj bardzo mały, a kiedy radzi sobie bardzo dobrze, gradienty są bardzo wysokie (patrz Rys. 4). My jednak chcemy odwrotnego zachowania. Dlatego maksymalizujemy E, a nie minimalizujemy E
Proces trenowania polega na jednoczesnym zastosowaniu Stochastic Gradient Descent na Dyskryminatorze i Generatorze. Podczas treningu, naprzemiennie wykonujemy k kroków optymalizacji D i jeden krok optymalizacji G na mini-patchu. Proces szkolenia zatrzymuje się, gdy Dyskryminator nie jest w stanie odróżnić ρg od ρdata, tzn. D(x, өd) = ½ lub gdy ρg = ρdata.
Jednym z najwcześniejszych modeli GAN wykorzystujących Convolutional Neural Network był DCGAN, który oznacza Deep Convolutional Generative Adversarial Networks. Sieć ta przyjmuje na wejściu 100 losowych liczb wylosowanych z jednolitego rozkładu i wyprowadza obraz o pożądanym kształcie. Sieć składa się z wielu warstw konwolucyjnych, dekonwolucyjnych i w pełni połączonych. Sieć używa wielu warstw dekonwolucyjnych do mapowania szumu wejściowego na pożądany obraz wyjściowy. Normalizacja wsadowa jest używana do stabilizacji treningu sieci. Aktywacja ReLU jest używana w generatorze dla wszystkich warstw z wyjątkiem warstwy wyjściowej, która używa warstwy tanh i Leaky ReLU jest używana dla wszystkich warstw w dyskryminatorze. Sieć ta była trenowana przy użyciu mini-batch stochastycznego zejścia gradientowego, a optymalizator Adam został użyty do przyspieszenia treningu z dostrojonymi hiperparametrami. Wyniki pracy były dość interesujące. Autorzy pokazali, że generatory mają ciekawe właściwości arytmetyki wektorowej, za pomocą których możemy manipulować obrazami w pożądany przez nas sposób.
Jedną z najczęściej stosowanych odmian GAN-ów jest warunkowy GAN, którego konstrukcja polega na prostym dodaniu wektora warunkowego do wektora szumu (patrz Rys. 7). Przed wprowadzeniem cGAN, generowaliśmy obrazy losowo z losowych próbek szumu z. Co jeśli chcemy wygenerować obraz z pewnymi pożądanymi cechami? Czy istnieje jakiś sposób, aby przekazać modelowi dodatkowe informacje o tym, jaki typ obrazu chcemy wygenerować? Odpowiedź brzmi tak i Warunkowy GAN jest sposobem, aby to zrobić. Warunkując model na dodatkowych informacjach, które są dostarczane zarówno do generatora jak i dyskryminatora, można ukierunkować proces generowania danych. Warunkowe GAN-y są wykorzystywane w wielu różnych zadaniach, takich jak generowanie tekstu na obraz, tłumaczenie obrazu na obraz, automatyczne tagowanie obrazów itp. Jednolita struktura obu sieci została przedstawiona na poniższym diagramie.
Jedną z fajnych rzeczy w GANach jest to, że mogą być trenowane nawet z małymi danymi treningowymi. Rzeczywiście, wyniki GAN są obiecujące, ale procedura szkolenia nie jest trywialna, szczególnie jeśli chodzi o ustawianie hiperparametrów sieci. Ponadto, GAN są trudne do optymalizacji, ponieważ nie są łatwo zbieżne. Oczywiście istnieją pewne wskazówki i sztuczki, aby zhakować GANs, ale nie zawsze mogą one pomóc. Niektóre z tych wskazówek można znaleźć tutaj. Ponadto, nie mamy żadnych kryteriów ilościowej oceny wyników, z wyjątkiem sprawdzenia, czy wygenerowane obrazy są percepcyjnie realistyczne, czy nie.
Wniosek
Modele głębokiego uczenia naprawdę osiągają wydajność na poziomie człowieka w uczeniu nadzorowanym, ale to samo nie jest prawdą w uczeniu nienadzorowanym. Niemniej jednak, naukowcy zajmujący się głębokim uczeniem ciężko pracują nad poprawą wydajności modeli nienadzorowanych. W tym wpisie zobaczyliśmy, jak w rzeczywistości działają dwa z najbardziej znanych frameworków uczenia nienadzorowanego, czyli modeli generatywnych. Poznaliśmy problemy z Variational Autoencoders i dowiedzieliśmy się, dlaczego sieci adwersarzy są lepsze w tworzeniu realistycznych obrazów. Istnieją jednak problemy z GAN-ami, takie jak stabilizacja ich treningu, co wciąż jest aktywnym obszarem badań. Jednak sieci GAN są naprawdę potężne i obecnie są wykorzystywane w różnych zadaniach, takich jak generowanie wysokiej jakości obrazów (zobacz ten film) i wideo, tłumaczenie tekstu na obraz, ulepszanie obrazu, rekonstrukcja modeli 3D obiektów z obrazów, generowanie muzyki, odkrywanie leków na raka itp. Poza tym, wielu badaczy głębokiego uczenia się pracuje również nad ujednoliceniem tych dwóch modeli i uzyskaniem najlepszego z nich. Widząc rosnące tempo postępu Deep Learning, wierzę, że GAN-y otworzą wiele zamkniętych drzwi sztucznej inteligencji, takich jak Semi-supervised Learning i Reinforcement Learning. W ciągu najbliższych kilku lat modele generatywne będą bardzo pomocne w projektowaniu grafiki, projektowaniu atrakcyjnych interfejsów użytkownika itp. Być może możliwe będzie również generowanie tekstów w języku naturalnym przy użyciu Generative Adversarial Networks.