En generativ modell är ett kraftfullt sätt att lära sig alla typer av datafördelning med hjälp av oövervakad inlärning och den har nått enorma framgångar på bara några få år. Alla typer av generativa modeller syftar till att lära sig den sanna datafördelningen i träningsuppsättningen för att generera nya datapunkter med vissa variationer. Men det är inte alltid möjligt att lära sig den exakta fördelningen av våra data, vare sig implicit eller explicit, och därför försöker vi modellera en fördelning som är så lik den sanna datafördelningen som möjligt. För detta kan vi utnyttja kraften hos neurala nätverk för att lära oss en funktion som kan approximera modellfördelningen till den sanna fördelningen.
Två av de vanligaste och mest effektiva metoderna är Variational Autoencoders (VAE) och Generative Adversarial Networks (GAN). VAE syftar till att maximera den nedre gränsen för dataloglikheten och GAN syftar till att uppnå en jämvikt mellan generator och diskriminator. I det här blogginlägget kommer jag att förklara hur VAE och GAN fungerar och vilken intuition som ligger bakom dem.
Variational Autoencoder
Jag utgår från att läsaren redan är bekant med hur en vanilla autoencoder fungerar. Vi vet att vi kan använda en autoencoder för att koda en inmatningsbild till en mycket mindre dimensionell representation som kan lagra latent information om indatafördelningen. Men i en vanilla autoencoder kan den kodade vektorn endast mappas till motsvarande indata med hjälp av en avkodare. Den kan definitivt inte användas för att generera liknande bilder med viss variabilitet.
För att uppnå detta måste modellen lära sig sannolikhetsfördelningen för träningsdata. VAE är en av de mest populära metoderna för att lära sig den komplicerade datafördelningen, t.ex. bilder, med hjälp av neurala nätverk på ett oövervakat sätt. Det är en probabilistisk grafisk modell som har sina rötter i Bayesiansk inferens, dvs. modellen syftar till att lära sig den underliggande sannolikhetsfördelningen för träningsdata så att den enkelt kan sampla nya data från den inlärda fördelningen. Tanken är att lära sig en lågdimensionell latent representation av träningsdata som kallas latenta variabler (variabler som inte observeras direkt utan snarare härleds genom en matematisk modell) som vi antar har genererat våra faktiska träningsdata. Dessa latenta variabler kan lagra användbar information om vilken typ av resultat som modellen måste generera. Sannolikhetsfördelningen för latenta variabler z betecknas med P(z). En gaussisk fördelning väljs som prioritet för att lära sig fördelningen P(z) så att nya datapunkter enkelt kan provtas under inferenstiden.
Nu är det primära målet att modellera data med några parametrar som maximerar sannolikheten för träningsdata X. Kort sagt antar vi att en lågdimensionell latent vektor har genererat våra data x (x ∈ X) och vi kan mappa denna latenta vektor till data x med hjälp av en deterministisk funktion f(z;θ) parametrerad med theta som vi måste utvärdera (se fig. 1). Under denna generativa process är vårt mål att maximera sannolikheten för varje data i X vilket ges som,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
Här gäller f(z;θ)har ersatts med en fördelning Pө(X|z).
Intuitionen bakom denna maximala sannolikhetsuppskattning är att om modellen kan generera träningsprov från dessa latenta variabler så kan den också generera liknande prov med vissa variationer. Med andra ord, om vi tar ut ett stort antal latenta variabler från P(z) och genererar x från dessa variabler så bör det genererade x matcha datafördelningen Pdata(x). Nu har vi två frågor som vi måste besvara. Hur fångar vi fördelningen av latenta variabler och hur integrerar vi ekvation 1 över alla dimensioner av z?
Oppenbarligen är det en mödosam uppgift att manuellt specificera den relevanta informationen som vi vill koda i latenta vektorn för att generera utdatabilden. Vi förlitar oss i stället på neurala nätverk för att beräkna z med antagandet att denna latenta vektor kan approximeras väl som en normalfördelning så att det är lätt att ta stickprov vid inferenstillfället. Om vi har en normalfördelning av z i ett n-dimensionellt rum är det alltid möjligt att generera vilken typ av fördelning som helst med hjälp av en tillräckligt komplicerad funktion, och inversen av denna funktion kan användas för att lära sig de latenta variablerna i sig.
I ekvation 1 genomförs integrationen över alla dimensioner av z och är därför svårhanterlig. Den kan dock beräknas med hjälp av metoder för Monte-Carlo-integration, vilket är något som inte är lätt att genomföra. Så vi följer ett annat tillvägagångssätt för att approximativt maximera Pө(X) i ekvation 1. Tanken med VAE är att härleda P(z) med hjälp av P(z|X) som vi inte känner till. Vi härleder P(z|X) med hjälp av en metod som kallas variationsinferens och som i princip är ett optimeringsproblem inom bayesiansk statistik. Vi modellerar först P(z|X) med hjälp av en enklare fördelning Q(z|X) som är lätt att hitta och vi försöker minimera skillnaden mellan P(z|X) och Q(z|X) med hjälp av KL-divergensmetriska metoder så att vår hypotes ligger nära den sanna fördelningen. Detta följs av en mängd matematiska ekvationer som jag inte kommer att förklara här, men som du kan hitta i originalhandlingen. Men jag måste säga att dessa ekvationer inte är särskilt svåra att förstå när man väl har förstått intuitionen bakom VAE.
Den slutliga målfunktionen för VAE är :-
Ovanstående ekvation har en mycket fin tolkning. Termen Q(z|X) är i princip vårt kodningsnät, z är vår kodade representation av data x(x ∈ X) och P(X|z) är vårt avkodningsnät. Så i ovanstående ekvation är vårt mål att maximera log-likelihood för vår datafördelning under ett visst fel som ges av D_KL. Det är lätt att se att VAE försöker minimera den nedre gränsen för log(P(X)) eftersom P(z|X) inte går att följa, men KL-divergenstermen är >=0. Detta är samma sak som att maximera E och minimera D_KL. Vi vet att maximering av E är en maximal sannolikhetsuppskattning och modelleras med hjälp av ett avkodningsnät. Som jag sa tidigare vill vi att vår latenta representation ska ligga nära Gauss och därför antar vi att P(z) är N(0, 1). Med detta antagande bör Q(z|X) också ligga nära denna fördelning. Om vi antar att det är en Gaussian med parametrarna μ(X) och Ʃ(X), kommer felet på grund av skillnaden mellan dessa två fördelningar, dvs, P(z) och Q(z|X) givet genom KL-divergens resulterar i en lösning i sluten form som ges nedan.
Med tanke på att vi optimerar den nedre variationsgränsen är vår optimeringsfunktion :
log(P(X|z)) – D_KL, där lösningen för den andra visas ovan.
Därmed kommer vår förlustfunktion att innehålla två termer. Den första är rekonstruktionsförlusten från input till output och den andra förlusten är KL-divergenstermen. Nu kan vi träna nätverket med hjälp av backpropagationsalgoritmen. Men det finns ett problem, nämligen att den första termen inte bara beror på parametrarna för P utan även på parametrarna för Q, men detta beroende syns inte i ekvationen ovan. Så hur kan vi bakåtpropagera genom lagret där vi tar ett slumpmässigt urval av z från fördelningen Q(z|X) eller N så att P kan avkoda. Gradienter kan inte flöda genom slumpmässiga noder. Vi använder reparameteriseringstricket (se fig) för att göra nätverket differentierbart. Vi tar ett urval från N(μ(X), Σ(X)) genom att först ta ett urval ε ∼ N(0, I) och sedan beräkna z=μ(X) + Σ1/2(X)∗ε.
Detta har visats mycket vackert i figur 2 ? . Det bör noteras att feedforward-steget är identiskt för båda dessa nätverk (vänster & höger) men gradienterna kan bara backpropagera genom höger nätverk.
Vid inferenstid kan vi helt enkelt ta ett urval av z från N(0, 1) och mata det till avkodningsnätet för att generera en ny datapunkt. Eftersom vi optimerar den nedre variationsgränsen är kvaliteten på den genererade bilden något dålig jämfört med de senaste teknikerna, t.ex. generativa adversariella nätverk.
Det bästa med VAE är att den lär sig både den generativa modellen och en inferensmodell. Även om både VAE och GANs är mycket spännande metoder för att lära sig den underliggande datafördelningen med hjälp av oövervakad inlärning ger GANs bättre resultat än VAE. I VAE optimerar vi den nedre variationsgränsen medan det i GAN inte finns något sådant antagande. Faktum är att GAN inte behandlar någon explicit uppskattning av sannolikhetstätheten. Att VAE inte lyckas generera skarpa bilder innebär att modellen inte kan lära sig den sanna efterföljande fördelningen. VAE och GAN skiljer sig främst åt i sättet att träna. Låt oss nu dyka ner i Generative Adversarial Networks.
Generative Adversarial Networks
Yann LeCun säger att adversarial training är det coolaste sedan skivat bröd. Med tanke på populariteten hos Generative Adversarial Networks och kvaliteten på de resultat de ger tror jag att de flesta av oss håller med honom. Adversarial training har helt förändrat det sätt på vilket vi lär neurala nätverk att utföra en specifik uppgift. Generative Adversarial Networks arbetar inte med någon explicit densitetsuppskattning som Variational Autoencoders. I stället bygger det på en spelteoretisk ansats med målet att hitta Nash-jämvikt mellan de två nätverken, Generator och Diskriminator. Tanken är att ta stickprov från en enkel fördelning som Gauss och sedan lära sig att omvandla detta brus till en datafördelning med hjälp av universella funktionsapproximatorer, t.ex. neurala nätverk.
Detta uppnås genom kontradiktorisk träning av dessa två nätverk. En generatormodell G lär sig att fånga datafördelningen och en diskriminatormodell D uppskattar sannolikheten för att ett prov kom från datafördelningen snarare än från modellfördelningen. I grund och botten är generatorns uppgift att generera bilder som ser naturliga ut och diskriminatorns uppgift är att avgöra om bilden är falsk eller äkta. Detta kan ses som ett mini-max-spel för två spelare där båda nätverkens prestanda förbättras med tiden. I detta spel försöker generatorn lura diskriminatorn genom att generera riktiga bilder så långt det är möjligt, och generatorn försöker att inte bli lurad av diskriminatorn genom att förbättra sin diskriminerande förmåga. Nedanstående bild visar den grundläggande arkitekturen för GAN.
Vi definierar en prioritet för inmatningsbrusvariablerna P(z) och sedan mappar generatorn detta till datafördelningen med hjälp av en komplex differentierbar funktion med parametrarna өg. Utöver detta har vi ett annat nätverk kallat Discriminator som tar in indata x och med hjälp av en annan differentierbar funktion med parametrar өd ger ut ett enda skalärt värde som anger sannolikheten för att x kommer från den sanna datafördelningen Pdata(x). Målfunktionen för GAN definieras som
I ovanstående ekvation, om inmatningen till Diskriminatorn kommer från den sanna datafördelningen bör D(x) ge ut 1 för att maximera ovanstående målfunktion w.r.t D medan om bilden har genererats från generatorn så bör D(G(z)) ge 1 för att minimera målfunktionen w.r.t G. Det senare innebär i princip att G bör generera sådana realistiska bilder som kan lura D. Vi maximerar ovanstående funktion w.r.t parametrar för Diskriminatorn med hjälp av Gradient Ascent och minimerar samma w.r.t parametrar för Generatorn med hjälp av Gradient Descent. Men det finns ett problem med att optimera målet för generatorn. I början av spelet, när generatorn inte har lärt sig något, är gradienten vanligtvis mycket liten och när den klarar sig mycket bra är gradienterna mycket höga (se figur 4). Men vi vill ha det motsatta beteendet. Vi maximerar därför E i stället för att minimera E
Träningsprocessen består av samtidig tillämpning av Stochastic Gradient Descent på diskriminatorn och generatorn. Under träningen alternerar vi mellan k steg av optimering av D och ett steg av optimering av G på minibatchen. Träningsprocessen avbryts när diskriminatorn inte kan skilja mellan ρg och ρdata, dvs. D(x, өd) = ½ eller när ρg = ρdata.
En av de tidigaste modellerna för GAN som använder sig av konvolutionella neurala nätverk var DCGAN som står för Deep Convolutional Generative Adversarial Networks (djupa konvolutionella generativa adversariella nätverk). Detta nätverk tar som indata 100 slumpmässiga tal från en enhetlig fördelning och ger ut en bild med önskad form. Nätet består av många konvolutionella, dekonvolutionella och fullt anslutna lager. Nätet använder många dekonvolutionella lager för att mappa det inmatade bruset till den önskade utdatabilden. Batch Normalization används för att stabilisera nätverksutbildningen. ReLU-aktivering används i generatorn för alla lager utom utgångslagret som använder tanh-lagret och Leaky ReLU används för alla lager i diskriminatorn. Nätverket tränades med hjälp av mini-batch stochastisk gradientavsättning och Adam optimizer användes för att påskynda träningen med inställda hyperparametrar. Resultaten i artikeln var ganska intressanta. Författarna visade att generatorerna har intressanta vektoraritmetiska egenskaper med hjälp av vilka vi kan manipulera bilder på det sätt vi vill.
En av de mest använda varianterna av GAN är villkorlig GAN som konstrueras genom att helt enkelt lägga till en villkorlig vektor tillsammans med brusvektorn (se fig. 7). Före cGAN genererade vi bilder slumpmässigt från slumpmässiga urval av brus z. Tänk om vi vill generera en bild med vissa önskade egenskaper. Finns det något sätt att ge denna extra information till modellen hur som helst om vilken typ av bild vi vill generera? Svaret är ja, och Conditional GAN är ett sätt att göra det. Genom att konditionera modellen på extra information som ges till både generatorn och diskriminatorn är det möjligt att styra datagenereringsprocessen. Konditionella GAN används i en mängd olika uppgifter, t.ex. generering av text till bild, översättning från bild till bild, automatiserad bildmärkning osv. En enhetlig struktur för båda nätverken visas i diagrammet nedan.
En av de häftiga sakerna med GAN:s är att de kan tränas även med små träningsdata. Resultaten av GANs är verkligen lovande, men träningsförfarandet är inte trivialt, särskilt när det gäller att ställa in nätverkets hyperparametrar. Dessutom är GANs svåra att optimera eftersom de inte konvergerar så lätt. Det finns naturligtvis en del tips och tricks för att hacka GANs, men de hjälper kanske inte alltid. Du kan hitta några av dessa tips här. Vi har inte heller några kriterier för den kvantitativa utvärderingen av resultaten förutom att kontrollera om de genererade bilderna är perceptuellt realistiska eller inte.
Slutsats
Deep Learning-modeller uppnår verkligen prestanda på mänsklig nivå vid övervakad inlärning, men detsamma gäller inte för oövervakad inlärning. Trots detta arbetar forskare inom djupinlärning hårt för att förbättra prestandan hos oövervakade modeller. I det här blogginlägget såg vi hur två av de mest kända ramarna för oövervakad inlärning av generativa modeller faktiskt fungerar. Vi lärde känna problemen med Variational Autoencoders och varför Adversarial networks är bättre på att producera realistiska bilder. Men det finns problem med GANs, t.ex. att stabilisera deras träning, vilket fortfarande är ett aktivt forskningsområde. GAN:s är dock mycket kraftfulla och används för närvarande i en mängd olika uppgifter, t.ex. generering av högkvalitativa bilder (se den här videon) och videor, översättning från text till bild, bildförbättring, rekonstruktion av 3D-modeller av objekt från bilder, musikgenerering, upptäckt av cancerläkemedel osv. Dessutom arbetar många forskare inom djupinlärning med att förena dessa två modeller och få ut det bästa av båda modellerna. Med tanke på den ökande takten i utvecklingen av djupinlärning tror jag att GANs kommer att öppna många stängda dörrar inom artificiell intelligens, t.ex. halvövervakad inlärning och förstärkningsinlärning. Under de närmaste åren kommer generativa modeller att vara till stor hjälp för grafisk design, utformning av attraktiva användargränssnitt osv. Det kan också bli möjligt att generera texter på naturligt språk med hjälp av generativa Adversarial Networks.