Diepe Generatieve Modellen

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).

Fig. 1. Latente vector toegewezen aan gegevensverdeling met parameter ө

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.

De uiteindelijke doelfunctie van VAE is :-

De bovenstaande vergelijking heeft een heel mooie interpretatie. De term Q(z|X) is in feite ons encoder-net, z is onze gecodeerde weergave van gegevens x(x ∈ X) en P(X|z) is ons decoder-net. In de bovenstaande vergelijking is ons doel dus de logo-waarschijnlijkheid van onze gegevensverdeling te maximaliseren onder een fout die gegeven wordt door D_KL. Het is gemakkelijk te zien dat VAE probeert de ondergrens van log(P(X)) te minimaliseren aangezien P(z|X) niet tractabel is maar de KL-afwijkingsterm >=0. Dit is hetzelfde als E maximaliseren en D_KL minimaliseren. We weten dat het maximaliseren van E een maximum likelihood schatting is en gemodelleerd wordt met een decoder net. Zoals ik eerder al zei, willen we dat onze latente representatie dicht bij Gaussisch ligt en daarom nemen we aan dat P(z) N(0, 1) is. Volgens deze aanname zou Q(z|X) ook dicht bij deze verdeling moeten liggen. Als we aannemen dat het een Gaussische verdeling is met parameters μ(X) en Ʃ(X), is de fout als gevolg van het verschil tussen deze twee verdelingen d.w.z, P(z) en Q(z|X) gegeven door KL-afwijking resulteert in een gesloten vorm oplossing die hieronder wordt gegeven.

Gezien het feit dat we de onderste variatiegrens optimaliseren, is onze optimalisatiefunctie :

log(P(X|z)) – D_KL, waarbij de oplossing van de tweede hierboven is weergegeven.

Hieruit volgt dat onze verliesfunctie twee termen zal bevatten. De eerste is het reconstructieverlies van de invoer naar de uitvoer en het tweede verlies is de KL-afwijkingsterm. Nu kunnen we het netwerk trainen met behulp van het backpropagation algoritme. Maar er is een probleem en dat is dat de eerste term niet alleen afhangt van de parameters van P maar ook van de parameters van Q maar deze afhankelijkheid komt niet voor in de bovenstaande vergelijking. Dus hoe backpropageren we door de laag waar we z willekeurig bemonsteren uit de verdeling Q(z|X) of N zodat P kan decoderen. Gradiënten kunnen niet door willekeurige knooppunten stromen. We gebruiken de reparameterization-truc (zie fig) om het netwerk differentieerbaar te maken. We bemonsteren uit N(μ(X), Σ(X)) door eerst ε ∼ N(0, I) te bemonsteren, en dan z=μ(X) + Σ1/2(X)∗ε.

Dit is heel mooi weergegeven in figuur 2 ? . Opgemerkt moet worden dat de feedforward-stap identiek is voor beide netwerken (links & rechts), maar dat gradiënten alleen door het rechter netwerk kunnen backpropageren.

Fig.2. Reparameterization trick used to backpropagate through random nodes

Tijdens de inferentie kunnen we eenvoudigweg z uit N(0, 1) samplen en dit aan het decodernetwerk toevoeren om een nieuw gegevenspunt te genereren. Aangezien we de onderste variatiegrens optimaliseren, is de kwaliteit van het gegenereerde beeld enigszins slecht in vergelijking met state-of-the-art technieken zoals Generative Adversarial Networks.

Het beste van VAE is dat het zowel het generatieve model als een inferentiemodel leert. Hoewel zowel VAE als GAN’s zeer opwindende benaderingen zijn om de onderliggende gegevensverdeling te leren met behulp van leren zonder toezicht, maar GAN’s leveren betere resultaten op in vergelijking met VAE. In VAE optimaliseren we de onderste variatiegrens terwijl er in GAN geen dergelijke veronderstelling is. In feite hebben GAN’s geen expliciete schatting van de kansdichtheid nodig. Het falen van VAE in het genereren van scherpe beelden impliceert dat het model niet in staat is om de ware posterior verdeling te leren. VAE en GAN verschillen vooral in de manier van trainen. Laten we ons nu eens verdiepen in Generative Adversarial Networks.

Generative Adversarial Networks

Yann LeCun zegt dat adversarial training het coolste is sinds gesneden brood. Gezien de populariteit van Generative Adversarial Networks en de kwaliteit van de resultaten die zij opleveren, denk ik dat de meesten van ons het met hem eens zouden zijn. Adversarial training heeft de manier waarop we neurale netwerken leren een specifieke taak uit te voeren volledig veranderd. Generatieve Adversariale Netwerken werken niet met een expliciete dichtheidsschatting zoals Variationele Autoencoders. In plaats daarvan is het gebaseerd op een speltheoretische benadering met als doel een Nash-evenwicht te vinden tussen de twee netwerken, Generator en Discriminator. Het idee is om een steekproef te nemen uit een eenvoudige verdeling zoals Gaussisch en dan te leren om deze ruis te transformeren naar een gegevensverdeling met behulp van universele functie-benaderingen zoals neurale netwerken.

Dit wordt bereikt door een tegenstrijdige training van deze twee netwerken. Een generatormodel G leert de gegevensverdeling vast te leggen en een discriminatormodel D schat de waarschijnlijkheid in dat een monster afkomstig is van de gegevensverdeling en niet van de modelverdeling. In principe is het de taak van de generator om natuurlijk ogende beelden te genereren en de taak van de discriminator is om te beslissen of het beeld nep of echt is. Dit kan worden gezien als een mini-max spel voor twee spelers waarbij de prestaties van beide netwerken in de loop van de tijd verbeteren. In dit spel probeert de generator de discriminator voor de gek te houden door zoveel mogelijk echte beelden te genereren en de generator probeert niet voor de gek te worden gehouden door de discriminator door zijn onderscheidingsvermogen te verbeteren. Onderstaande afbeelding toont de basisarchitectuur van GAN.

Fig.3. Bouwsteen van Generative Adversarial Network

We definiëren een prior op de input ruisvariabelen P(z) en vervolgens brengt de generator dit in data distributie met behulp van een complex differentieerbare functie met parameters өg. Daarnaast hebben we een ander netwerk, Discriminator genaamd, dat invoer x ontvangt en met behulp van een andere differentieerbare functie met parameters өd een enkele scalaire waarde output die de waarschijnlijkheid aangeeft dat x afkomstig is van de ware gegevensverdeling Pdata(x). De doelfunctie van de GAN wordt gedefinieerd als

In de bovenstaande vergelijking moet, als de invoer in de Discriminator afkomstig is van de ware gegevensverdeling, D(x) 1 weergeven om de bovenstaande doelfunctie te maximaliseren w.r.D te maximaliseren, terwijl als het beeld is gegenereerd door de generator, D(G(z)) 1 moet uitvoeren om de doelfunctie voor G te minimaliseren. Dit laatste impliceert dat G realistische beelden moet genereren die D voor de gek kunnen houden. We maximaliseren de bovenstaande functie voor de parameters van de Discriminator met behulp van Gradient Ascent en minimaliseren dezelfde functie voor de parameters van de Generator met behulp van Gradient Descent. Maar er is een probleem bij het optimaliseren van de Generator doelstelling. In het begin van het spel, wanneer de generator niets geleerd heeft, is de gradiënt meestal erg klein en wanneer hij het erg goed doet, zijn de gradiënten erg hoog (zie Fig. 4). Maar wij willen het tegenovergestelde gedrag. Daarom maximaliseren we E in plaats van E te minimaliseren

Fig.4. Kosten voor de generator als functie van de respons van de discriminator op het gegenereerde beeld

Het trainingsproces bestaat uit de gelijktijdige toepassing van Stochastische Gradient Descent op de discriminator en de generator. Tijdens het trainen worden afwisselend k stappen van optimalisatie van D en één stap van optimalisatie van G op de minipatch uitgevoerd. Het trainingsproces stopt wanneer de Discriminator niet in staat is ρg en ρdata te onderscheiden, d.w.z. D(x, өd) = ½ of wanneer ρg = ρdata.

Een van de vroegste GAN-modellen die gebruik maken van Convolutionele Neurale Netwerken was DCGAN, wat staat voor Deep Convolutional Generative Adversarial Networks. Dit netwerk neemt als invoer 100 willekeurige getallen getrokken uit een uniforme verdeling en produceert een beeld met de gewenste vorm. Het netwerk bestaat uit vele convolutionele, deconvolutionele en volledig aangesloten lagen. Het netwerk gebruikt vele deconvolutionele lagen om de inputruis om te zetten in het gewenste outputbeeld. Batch Normalisatie wordt gebruikt om de training van het netwerk te stabiliseren. ReLU activering wordt gebruikt in generator voor alle lagen behalve de output laag die tanh laag gebruikt en Leaky ReLU wordt gebruikt voor alle lagen in de Discriminator. Dit netwerk werd getraind met behulp van mini-batch stochastische gradiënt afdaling en Adam optimizer werd gebruikt om de training te versnellen met afgestemde hyperparameters. De resultaten van het artikel waren zeer interessant. De auteurs toonden aan dat de generatoren interessante vectoraritmetische eigenschappen hebben waarmee we beelden kunnen manipuleren op de manier die we willen.

Fig.5. Generator van DCGAN

Fig.6. Discriminator van DCGAN

Een van de meest gebruikte variaties van GANs is conditionele GAN die wordt geconstrueerd door eenvoudigweg een conditionele vector toe te voegen aan de ruisvector (zie Fig. 7). Vóór cGAN, genereerden wij beelden willekeurig uit willekeurige steekproeven van ruis z. Wat als wij een beeld willen genereren met sommige gewenste eigenschappen. Is er een manier om het model toch al die extra informatie te geven over het type beeld dat we willen genereren? Het antwoord is ja en Conditional GAN is de manier om dat te doen. Door het model te conditioneren op extra informatie die zowel aan de generator als aan de discriminator wordt verstrekt, is het mogelijk het proces van gegevensgeneratie te sturen. Voorwaardelijke GAN’s worden gebruikt in een verscheidenheid van taken, zoals tekst naar beeld generatie, beeld naar beeld vertaling, geautomatiseerde afbeelding tagging, enz. Een uniforme structuur van beide netwerken is weergegeven in het onderstaande diagram.

Fig. 7. Een basisvoorbeeld van cGAN met y als conditioneringsvector

Een van de leuke dingen aan GANs is dat ze zelfs met kleine trainingsgegevens kunnen worden getraind. De resultaten van GAN’s zijn inderdaad veelbelovend, maar de trainingsprocedure is niet triviaal, vooral het instellen van de hyperparameters van het netwerk. Bovendien zijn GAN’s moeilijk te optimaliseren omdat ze niet gemakkelijk convergeren. Natuurlijk zijn er enkele tips en trucs om GANs te hacken, maar die helpen niet altijd. Een aantal van deze tips vind je hier. Ook hebben we geen criteria voor de kwantitatieve evaluatie van de resultaten, behalve om te controleren of de gegenereerde beelden perceptueel realistisch zijn of niet.

Conclusie

Deep Learning-modellen bereiken echt prestaties op menselijk niveau in supervised learning, maar hetzelfde is niet waar voor unsupervised learning. Toch werken deep learning-wetenschappers hard aan het verbeteren van de prestaties van unsupervised modellen. In deze blogpost zagen we hoe twee van de bekendste unsupervised learning frameworks van generatieve modellen eigenlijk werken. We leerden de problemen kennen in Variationele Autoencoders en waarom Adversarial netwerken beter zijn in het produceren van realistische beelden. Maar er zijn problemen met GANs zoals het stabiliseren van hun training, wat nog steeds een actief onderzoeksgebied is. GANs zijn echter zeer krachtig en worden momenteel gebruikt in een verscheidenheid van taken zoals het genereren van hoge kwaliteit beelden (zie deze video) en video’s, tekst naar beeld vertaling, beeldverbetering, reconstructie van 3D modellen van objecten uit beelden, muziek generatie, kanker geneesmiddelen ontdekking, enz. Daarnaast zijn veel onderzoekers op het gebied van deep learning ook bezig om deze twee modellen te verenigen en om het beste uit deze twee modellen te halen. Gezien de toenemende vooruitgang van Deep Learning, geloof ik dat GANs veel gesloten deuren van kunstmatige intelligentie zullen openen, zoals Semi-supervised Learning en Reinforcement Learning. In de komende jaren zullen generatieve modellen zeer nuttig zijn voor grafisch ontwerpen, het ontwerpen van aantrekkelijke User-Interfaces, enz. Het kan ook mogelijk zijn om natuurlijke taalteksten te genereren met behulp van Generative Adversarial Networks.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.