Een Generatief Model is een krachtige manier om elke soort gegevensverdeling te leren door gebruik te maken van leren zonder toezicht en het heeft in slechts enkele jaren enorm veel succes geboekt. Alle soorten generatieve modellen zijn gericht op het leren van de ware gegevensverdeling van de trainingsset om zo nieuwe gegevenspunten met enige variaties te genereren. Maar het is niet altijd mogelijk om de exacte verdeling van onze gegevens impliciet of expliciet te leren en dus proberen we een verdeling te modelleren die zo veel mogelijk lijkt op de echte gegevensverdeling. Daartoe kunnen wij gebruik maken van de kracht van neurale netwerken om een functie te leren die de modelverdeling kan benaderen tot de ware verdeling.
Twee van de meest gebruikte en efficiënte benaderingen zijn Variational Autoencoders (VAE) en Generative Adversarial Networks (GAN). VAE is gericht op het maximaliseren van de ondergrens van de data log-likelihood en GAN is gericht op het bereiken van een evenwicht tussen Generator en Discriminator. In deze blogpost zal ik de werking van VAE en GANs en de intuïtie erachter uitleggen.
Variationele Autoencoder
Ik ga ervan uit dat de lezer al bekend is met de werking van een vanilla autoencoder. We weten dat we een autoencoder kunnen gebruiken om een invoerbeeld te coderen naar een veel kleinere dimensionale representatie waarin latente informatie over de verdeling van de invoergegevens kan worden opgeslagen. Maar in een vanilla autoencoder kan de gecodeerde vector alleen met behulp van een decoder worden omgezet in de overeenkomstige invoer. Hij kan zeker niet worden gebruikt om gelijksoortige beelden met enige variabiliteit te genereren.
Om dit te bereiken, moet het model de waarschijnlijkheidsverdeling van de trainingsgegevens leren. VAE is een van de meest populaire benaderingen om de gecompliceerde verdeling van gegevens, zoals beelden met behulp van neurale netwerken te leren in een unsupervised mode. Het is een probabilistisch grafisch model dat gebaseerd is op Bayesiaanse inferentie, d.w.z. dat het model de onderliggende kansverdeling van de trainingsdata wil leren, zodat het gemakkelijk nieuwe data kan bemonsteren uit die geleerde verdeling. Het idee is om een laagdimensionale latente representatie van de trainingsgegevens te leren, latente variabelen genaamd (variabelen die niet direct worden waargenomen, maar eerder worden afgeleid via een wiskundig model), waarvan we aannemen dat zij onze eigenlijke trainingsgegevens hebben gegenereerd. Deze latente variabelen kunnen nuttige informatie bevatten over het soort output dat het model moet genereren. De waarschijnlijkheidsverdeling van latente variabelen z wordt aangeduid met P(z). Een Gaussische verdeling wordt gekozen als een prior om de verdeling P(z) te leren, zodat tijdens de inferentietijd gemakkelijk nieuwe gegevenspunten kunnen worden bemonsterd.
Nu is het primaire doel de gegevens te modelleren met enkele parameters die de waarschijnlijkheid van de trainingsgegevens X maximaliseren. Kortom, wij gaan ervan uit dat een laagdimensionale latente vector onze gegevens x heeft gegenereerd (x ∈ X) en wij kunnen deze latente vector in de gegevens x in kaart brengen met behulp van een deterministische functie f(z;θ), geparametriseerd door theta, die wij moeten evalueren (zie fig. 1). In dit generatieve proces is ons doel de waarschijnlijkheid van elk gegeven in X te maximaliseren, hetgeen gegeven wordt als,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
Hier is f(z;θ)vervangen door een verdeling Pө(X|z).
De intuïtie achter deze maximale waarschijnlijkheidsschatting is dat als het model trainingsmonsters van deze latente variabelen kan genereren, het ook soortgelijke monsters met enige variaties kan genereren. Met andere woorden, als we een groot aantal latente variabelen uit P(z) bemonsteren en x uit deze variabelen genereren, moet de gegenereerde x overeenkomen met de gegevensverdeling Pdata(x). Nu hebben we twee vragen die we moeten beantwoorden. Hoe kunnen we de verdeling van latente variabelen vastleggen en hoe kunnen we vergelijking 1 integreren over alle dimensies van z?
Het is uiteraard een vervelende taak om handmatig de relevante informatie te specificeren die we in de latente vector willen coderen om het uitgangsbeeld te genereren. In plaats daarvan vertrouwen wij op neurale netwerken om z te berekenen, alleen met de aanname dat deze latente vector goed kan worden benaderd als een normale verdeling, zodat wij gemakkelijk kunnen bemonsteren op het moment van inferentie. Indien wij een normale verdeling van z hebben in een n dimensionale ruimte, dan is het altijd mogelijk om een willekeurige verdeling te genereren met behulp van een voldoende gecompliceerde functie en de inverse van deze functie kan worden gebruikt om de latente variabelen zelf te leren.
In vergelijking 1 wordt de integratie uitgevoerd over alle dimensies van z en is daarom niet uitvoerbaar. Zij kan echter worden berekend met behulp van methoden van Monte-Carlo integratie, hetgeen niet gemakkelijk te implementeren is. Wij volgen dus een andere aanpak om Pө(X) in vergelijking 1 bij benadering te maximaliseren. Het idee van VAE is om P(z) af te leiden uit P(z|X) die wij niet kennen. Wij leiden P(z|X) af met behulp van een methode die variationele inferentie wordt genoemd en die in feite een optimalisatieprobleem in de Bayesiaanse statistiek is. Eerst modelleren wij P(z|X) met behulp van een eenvoudiger verdeling Q(z|X) die gemakkelijk te vinden is en wij proberen het verschil tussen P(z|X) en Q(z|X) te minimaliseren met behulp van de KL-divergentiemethode, zodat onze hypothese dicht bij de ware verdeling ligt. Dit wordt gevolgd door een heleboel wiskundige vergelijkingen die ik hier niet zal uitleggen, maar die u in het oorspronkelijke artikel kunt vinden. Maar ik moet zeggen dat die vergelijkingen niet erg moeilijk te begrijpen zijn als je eenmaal de intuïtie achter VAE doorhebt.