En generativ model er en effektiv måde at lære enhver form for datafordeling på ved hjælp af uovervåget læring, og den har opnået enorm succes i løbet af få år. Alle typer generative modeller har til formål at lære den sande datafordeling i træningssættet med henblik på at generere nye datapunkter med visse variationer. Men det er ikke altid muligt at lære den nøjagtige fordeling af vores data enten implicit eller eksplicit, og derfor forsøger vi at modellere en fordeling, der ligner den sande datafordeling så meget som muligt. Til dette formål kan vi udnytte kraften i neurale netværk til at lære en funktion, der kan tilnærme modelfordelingen til den sande fordeling.
To af de mest almindeligt anvendte og effektive metoder er Variational Autoencoders (VAE) og Generative Adversarial Networks (GAN). VAE sigter mod at maksimere den nedre grænse for dataenes log-likelihood, og GAN sigter mod at opnå en ligevægt mellem Generator og Diskriminator. I dette blogindlæg vil jeg forklare, hvordan VAE og GAN’er fungerer, og hvad intuitionen bag dem er.
Variational Autoencoder
Jeg går ud fra, at læseren allerede er bekendt med, hvordan en vanilla autoencoder fungerer. Vi ved, at vi kan bruge en autoencoder til at kode et indgangsbillede til en meget mindre dimensionel repræsentation, som kan lagre latente oplysninger om inddatafordelingen. Men i en vanilla-autoenkoder kan den kodede vektor kun afbildes til det tilsvarende input ved hjælp af en dekoder. Den kan bestemt ikke bruges til at generere lignende billeder med en vis variabilitet.
For at opnå dette skal modellen lære sandsynlighedsfordelingen af træningsdataene. VAE er en af de mest populære tilgange til at lære den komplicerede datafordeling som f.eks. billeder ved hjælp af neurale netværk på en uovervåget måde. Det er en probabilistisk grafisk model med rod i Bayesiansk inferens, dvs. modellen sigter mod at lære den underliggende sandsynlighedsfordeling af træningsdataene, således at den let kan udtage nye data fra den lærte fordeling. Ideen er at lære en lavdimensionel latent repræsentation af træningsdataene kaldet latente variabler (variabler, der ikke observeres direkte, men snarere udledes gennem en matematisk model), som vi antager at have genereret vores faktiske træningsdata. Disse latente variabler kan gemme nyttige oplysninger om den type output, som modellen skal generere. Sandsynlighedsfordelingen af latente variabler z betegnes med P(z). Der vælges en gaussisk fordeling som prior for at lære fordelingen P(z), så det er let at udtage nye datapunkter i løbet af inferenstiden.
Nu er det primære mål at modellere dataene med nogle parametre, som maksimerer sandsynligheden for træningsdata X. Kort sagt antager vi, at en lavdimensionel latent vektor har genereret vores data x (x ∈ X), og vi kan afbilde denne latente vektor til data x ved hjælp af en deterministisk funktion f(z;θ), der er parametreret ved theta, som vi skal evaluere (se fig. 1). Under denne generative proces er vores mål at maksimere sandsynligheden for hver data i X, som er givet som,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
Her gælder f(z;θ)er blevet erstattet af en fordeling Pө(X|z).
Intuitionen bag denne maximum likelihood-estimation er, at hvis modellen kan generere træningsprøver fra disse latente variabler, så kan den også generere lignende prøver med nogle variationer. Med andre ord, hvis vi udtager et stort antal latente variabler fra P(z) og genererer x fra disse variabler, så bør det genererede x stemme overens med datafordelingen Pdata(x). Nu har vi to spørgsmål, som vi skal besvare. Hvordan fanger vi fordelingen af latente variabler, og hvordan integrerer vi ligning 1 over alle dimensionerne af z?
Det er naturligvis en kedelig opgave manuelt at angive de relevante oplysninger, som vi ønsker at indkode i latente vektorer for at generere outputbilledet. I stedet for stoler vi på neurale netværk til at beregne z blot med en antagelse om, at denne latente vektor kan tilnærmes godt som en normalfordeling, så det er let at foretage stikprøver på inferenstidspunktet. Hvis vi har en normalfordeling af z i et n-dimensionelt rum, er det altid muligt at generere enhver form for fordeling ved hjælp af en tilstrækkelig kompliceret funktion, og den inverse af denne funktion kan bruges til at lære de latente variabler selv.
I ligning 1 foretages integrationen over alle dimensioner af z og er derfor intraktil. Den kan dog beregnes ved hjælp af metoder til Monte-Carlo-integration, hvilket er noget, der ikke er let at gennemføre. Så vi følger en anden fremgangsmåde for at maksimere Pө(X) i ligning 1 tilnærmelsesvis. Ideen med VAE er at udlede P(z) ved hjælp af P(z|X), som vi ikke kender. Vi udleder P(z|X) ved hjælp af en metode kaldet variational inference, som grundlæggende er et optimeringsproblem i bayesiansk statistik. Vi modellerer først P(z|X) ved hjælp af en enklere fordeling Q(z|X), som er let at finde, og vi forsøger at minimere forskellen mellem P(z|X) og Q(z|X) ved hjælp af en KL-divergensmetrisk tilgang, så vores hypotese ligger tæt på den sande fordeling. Dette efterfølges af en masse matematiske ligninger, som jeg ikke vil forklare her, men som du kan finde i det originale papir. Men jeg må sige, at disse ligninger ikke er særlig svære at forstå, når man først har forstået intuitionen bag VAE.
Den endelige målfunktion for VAE er :-
Overstående ligning har en meget fin fortolkning. Udtrykket Q(z|X) er dybest set vores encodernet, z er vores kodede repræsentation af data x(x ∈ X) og P(X|z) er vores decodernet. Så i ovenstående ligning er vores mål at maksimere log-likelihood for vores datafordeling under en vis fejl givet ved D_KL. Det kan let ses, at VAE forsøger at minimere den nedre grænse for log(P(X)), da P(z|X) ikke er håndterbar, men KL-divergensudtrykket er >=0. Dette er det samme som at maksimere E og minimere D_KL. Vi ved, at maksimering af E er et maximum likelihood-estimat og er modelleret ved hjælp af et dekodernet. Som jeg sagde tidligere, at vi ønsker, at vores latente repræsentation skal være tæt på Gaussisk, og derfor antager vi P(z) som N(0, 1). I overensstemmelse med denne antagelse bør Q(z|X) også ligge tæt på denne fordeling. Hvis vi antager, at det er en Gaussian med parametrene μ(X) og Ʃ(X), vil fejlen som følge af forskellen mellem disse to fordelinger, dvs, P(z) og Q(z|X) givet ved KL-divergens resulterer i en lukket formløsning givet nedenfor.
I betragtning af at vi optimerer den nedre variationsgrænse, er vores optimeringsfunktion :
log(P(X|z)) – D_KL, hvor løsningen af den anden er vist ovenfor.
Hermed vil vores tabsfunktion indeholde to termer. Den første er rekonstruktionstabet af input til output, og det andet tab er KL-divergenstermen. Nu kan vi træne netværket ved hjælp af backpropagationsalgoritmen. Men der er et problem, nemlig at det første udtryk ikke kun afhænger af parametrene for P, men også af parametrene for Q, men denne afhængighed fremgår ikke af ovenstående ligning. Så hvordan kan vi backpropagere gennem det lag, hvor vi udtager z tilfældigt fra fordelingen Q(z|X) eller N, så P kan afkode. Gradienter kan ikke strømme gennem tilfældige knudepunkter. Vi bruger reparameteriseringstrick (se fig) for at gøre netværket differentierbart. Vi udtager prøver fra N(μ(X), Σ(X)) ved først at udtage ε ∼ N(0, I) og derefter beregne z=μ(X) + Σ1/2(X)∗ε.
Dette er meget smukt vist i fig. 2 ? . Det skal bemærkes, at feedforward-trinnet er identisk for begge disse netværk (venstre & højre), men gradienterne kan kun backpropagere gennem højre netværk.
På inferenstidspunktet kan vi simpelthen prøve z fra N(0, 1) og fodre det til dekodernettet for at generere et nyt datapunkt. Da vi optimerer den nedre variationsgrænse, er kvaliteten af det genererede billede noget dårlig sammenlignet med state-of-the art-teknikker som generative adversarial networks.
Det bedste ved VAE er, at den lærer både den generative model og en inferencemodel. Selv om både VAE og GAN’er er meget spændende metoder til at lære den underliggende datafordeling ved hjælp af uovervåget læring, giver GAN’er bedre resultater end VAE. I VAE optimerer vi den nedre variationsgrænse, mens der i GAN ikke er nogen sådan antagelse. GAN’er beskæftiger sig faktisk ikke med nogen eksplicit sandsynlighedstæthedsvurdering. At VAE ikke formår at generere skarpe billeder, betyder, at modellen ikke er i stand til at lære den sande posteriore fordeling. VAE og GAN adskiller sig hovedsageligt ved den måde, hvorpå de trænes. Lad os nu dykke ned i Generative Adversarial Networks.
Generative Adversarial Networks
Yann LeCun siger, at adversarial træning er den fedeste ting siden skiveskåret brød. Når man ser på populariteten af Generative Adversarial Networks og kvaliteten af de resultater, de producerer, tror jeg, at de fleste af os vil give ham ret. Adversarial træning har fuldstændig ændret den måde, hvorpå vi lærer neurale netværk at udføre en bestemt opgave. Generative Adversarial Networks arbejder ikke med nogen eksplicit tæthedsvurdering som Variational Autoencoders. I stedet er det baseret på en spilteoretisk tilgang med et mål om at finde Nash-ligevægt mellem de to netværk, Generator og Diskriminator. Idéen er at udtage prøver fra en simpel fordeling som f.eks. en Gaussisk fordeling og derefter lære at omdanne denne støj til en datafordeling ved hjælp af universelle funktionsapproximatorer som f.eks. neurale netværk.
Dette opnås ved adversarial træning af disse to netværk. En generatormodel G lærer at indfange datafordelingen, og en diskriminatormodel D vurderer sandsynligheden for, at en prøve stammer fra datafordelingen snarere end fra modelfordelingen. Grundlæggende er generatorens opgave at generere naturligt udseende billeder, og diskriminatorens opgave er at afgøre, om billedet er falsk eller ægte. Dette kan opfattes som et mini-max-spil for to spillere, hvor begge netværks præstationer forbedres over tid. I dette spil forsøger generatoren at narre diskriminatoren ved så vidt muligt at generere ægte billeder, og generatoren forsøger at undgå at blive narret af diskriminatoren ved at forbedre sin diskriminationsevne. Nedenstående billede viser den grundlæggende arkitektur for GAN.
Vi definerer en prior på inputstøjvariabler P(z), og derefter kortlægger generatoren dette til datafordeling ved hjælp af en kompleks differentierbar funktion med parametre өg. Ud over dette har vi et andet netværk kaldet Discriminator, som tager input x ind og ved hjælp af en anden differentiabel funktion med parametre өd udsender en enkelt skalarværdi, der angiver sandsynligheden for, at x kommer fra den sande datafordeling Pdata(x). GAN’s målfunktion er defineret som
I ovenstående ligning skal D(x), hvis input til Diskriminatoren kommer fra den sande datafordeling, output 1 for at maksimere ovenstående målfunktion m.h.t.t D, mens hvis billedet er blevet genereret fra generatoren, så bør D(G(z)) output 1 for at minimere målfunktionen w.r.t G. Sidstnævnte indebærer grundlæggende, at G bør generere sådanne realistiske billeder, som kan narre D. Vi maksimerer ovenstående funktion w.r.t parametre af Discriminator ved hjælp af Gradient Ascent og minimerer det samme w.r.t parametre af Generator ved hjælp af Gradient Descent. Men der er et problem med at optimere generatorens målsætning. I starten af spillet, når generatoren ikke har lært noget, er gradienten normalt meget lille, og når den klarer sig meget godt, er gradienterne meget høje (se fig. 4). Men vi ønsker den modsatte adfærd. Vi maksimerer derfor E i stedet for at minimere E
Træningsprocessen består af samtidig anvendelse af Stochastic Gradient Descent på diskriminator og generator. Under træningen veksler vi mellem k trin til optimering af D og et trin til optimering af G på minibatchen. Træningsprocessen stopper, når diskriminatoren ikke er i stand til at skelne ρg og ρdata, dvs. D(x, өd) = ½, eller når ρg = ρdata.
En af de tidligste modeller for GAN, der anvender Convolutional Neural Network, var DCGAN, som står for Deep Convolutional Generative Adversarial Networks (dybe Convolutional Generative Adversarial Networks). Dette netværk tager som input 100 tilfældige tal udtrukket fra en ensartet fordeling og udsender et billede med den ønskede form. Netværket består af mange konvolutionelle, dekonvolutionelle og fuldt forbundne lag. Nettet anvender mange dekonvolutionelle lag til at kortlægge den indgående støj til det ønskede udgangsbillede. Batch-normalisering anvendes til at stabilisere træningen af netværket. ReLU-aktivering anvendes i generatoren for alle lag undtagen outputlaget, som anvender tanh-laget, og Leaky ReLU anvendes for alle lag i diskriminatoren. Dette netværk blev trænet ved hjælp af mini-batch stokastisk gradientafstigning, og Adam optimizer blev brugt til at fremskynde træningen med indstillede hyperparametre. Resultaterne i papiret var ganske interessante. Forfatterne viste, at generatorerne har interessante vektoraritmetiske egenskaber, som vi kan bruge til at manipulere billeder på den måde, vi ønsker.
En af de mest udbredte variationer af GAN’er er betinget GAN, som konstrueres ved simpelthen at tilføje betinget vektor sammen med støjvektoren (se fig. 7). Før cGAN genererede vi billeder tilfældigt ud fra tilfældige stikprøver af støj z. Hvad nu, hvis vi ønsker at generere et billede med nogle ønskede egenskaber. Er der nogen måde at give denne ekstra information til modellen alligevel om, hvilken type billede vi ønsker at generere? Svaret er ja, og Conditional GAN er den rette måde at gøre det på. Ved at konditionere modellen på yderligere oplysninger, som gives til både generator og diskriminator, er det muligt at styre datagenereringsprocessen. Betingede GAN’er anvendes til en række opgaver såsom tekst til billedgenerering, oversættelse fra billede til billede, automatiseret billedmærkning osv. En samlet struktur for begge netværk er vist i nedenstående diagram.
En af de smarte ting ved GAN’er er, at de kan trænes selv med små træningsdata. Resultaterne af GAN’er er faktisk lovende, men træningsproceduren er ikke triviel, især ikke opsætningen af netværkets hyperparametre. Desuden er GAN’er vanskelige at optimere, da de ikke konvergerer så let. Der findes naturligvis nogle tips og tricks til at hacke GAN’er, men de hjælper måske ikke altid. Du kan finde nogle af disse tips her. Vi har heller ikke nogen kriterier for den kvantitative evaluering af resultaterne, bortset fra at kontrollere, om de genererede billeder er perceptuelt realistiske eller ej.
Slutning
Deep Learning-modeller opnår virkelig præstationer på menneskeligt niveau i overvåget læring, men det samme gælder ikke for uovervåget læring. Ikke desto mindre arbejder forskere inden for dyb indlæring hårdt på at forbedre præstationen af uovervågede modeller. I dette blogindlæg så vi, hvordan to af de mest berømte uovervågede læringsrammer for generative modeller faktisk fungerer. Vi lærte problemerne i Variational Autoencoders at kende, og hvorfor Adversarial networks er bedre til at producere realistiske billeder. Men der er problemer med GAN’er som f.eks. stabilisering af deres træning, hvilket stadig er et aktivt forskningsområde. GAN’er er imidlertid virkelig effektive, og i øjeblikket anvendes de til en lang række opgaver som f.eks. generering af billeder af høj kvalitet (se denne video) og video, oversættelse fra tekst til billede, billedforbedring, rekonstruktion af 3D-modeller af objekter fra billeder, musikgenerering, opdagelse af kræftmedicin osv. Desuden arbejder mange forskere inden for deep learning også på at forene disse to modeller og få det bedste ud af begge modeller. I betragtning af den stigende hastighed, hvormed Deep Learning udvikler sig, tror jeg, at GAN’er vil åbne mange lukkede døre inden for kunstig intelligens som f.eks. semi-supervised Learning og Reinforcement Learning. I de næste par år vil generative modeller være meget nyttige i forbindelse med grafisk design, design af attraktive brugergrænseflader osv. Det kan også blive muligt at generere naturlige sprogtekster ved hjælp af generative Adversarial Networks.