Generatiivinen malli on tehokas tapa oppia mitä tahansa datajakaumaa valvomattomalla oppimisella, ja se on saavuttanut valtavan menestyksen vain muutamassa vuodessa. Kaikentyyppiset generatiiviset mallit pyrkivät oppimaan harjoitusjoukon todellisen datajakauman, jotta voidaan tuottaa uusia datapisteitä, joissa on joitakin variaatioita. Aina ei kuitenkaan ole mahdollista oppia datan tarkkaa jakaumaa joko implisiittisesti tai eksplisiittisesti, joten pyrimme mallintamaan jakauman, joka muistuttaa mahdollisimman paljon todellista datajakaumaa. Tätä varten voimme hyödyntää neuroverkkojen voimaa oppiaksemme funktion, joka voi lähentää mallijakaumaa todelliseen jakaumaan.
Kaksi yleisimmin käytettyä ja tehokkainta lähestymistapaa ovat Variational Autoencoders (VAE) ja Generative Adversarial Networks (GAN). VAE pyrkii maksimoimaan datan log-likelihoodin alarajan ja GAN pyrkii saavuttamaan tasapainon generaattorin ja diskriminaattorin välillä. Tässä blogipostauksessa selitän VAE:n ja GAN:ien toimintaa ja intuitiota niiden taustalla.
Variationaalinen autokooderi
Oletan, että lukija tuntee jo vanilja-autokooderin toiminnan. Tiedämme, että voimme käyttää autokooderia koodaamaan syötekuvan paljon pienemmän ulottuvuuden esitykseen, joka voi tallentaa latenttia tietoa syötetiedon jakaumasta. Vanilja-autokooderissa koodattu vektori voidaan kuitenkin yhdistää vastaavaan syötteeseen vain dekooderin avulla. Sitä ei todellakaan voida käyttää tuottamaan samankaltaisia kuvia, joissa on jonkin verran vaihtelua.
Tämän saavuttamiseksi mallin on opittava harjoitusdatan todennäköisyysjakauma. VAE on yksi suosituimmista lähestymistavoista monimutkaisen datajakauman, kuten kuvien, oppimiseen neuroverkkojen avulla valvomattomasti. Se on todennäköisyysgrafiikkamalli, jonka juuret ovat Bayesin päättelyssä, eli malli pyrkii oppimaan harjoitusdatan taustalla olevan todennäköisyysjakauman, jotta se voisi helposti ottaa näytteitä uudesta datasta tästä opitusta jakaumasta. Ajatuksena on oppia harjoitteluaineiston matalaulotteinen latentti esitys, jota kutsutaan latenteiksi muuttujiksi (muuttujat, joita ei havaita suoraan, vaan jotka pikemminkin päätellään matemaattisen mallin avulla), joiden oletetaan tuottaneen varsinaisen harjoitteluaineistomme. Näihin latentteihin muuttujiin voidaan tallentaa hyödyllistä tietoa siitä, minkä tyyppistä tulosta mallin on tuotettava. Latenttien muuttujien z todennäköisyysjakauma on P(z). Jakauman P(z) oppimiseen valitaan ennakkojakaumaksi Gaussin jakauma, jotta uusia datapisteitä voidaan helposti ottaa näytteeksi inferenssiaikana.
Nyt ensisijainen tavoite on mallintaa data joillakin parametreilla, jotka maksimoivat harjoitusdatan X todennäköisyyden. Lyhyesti sanottuna oletamme, että matalaulotteinen latentti vektori on tuottanut datamme x (x ∈ X) ja voimme kuvata tämän latentin vektorin dataan x käyttämällä determinististä funktiota f(z;θ), joka on parametrisoitu theta-arvolla ja jota meidän on arvioitava (ks. kuva 1). Tässä generatiivisessa prosessissa tavoitteemme on maksimoida kunkin datan todennäköisyys X:ssä, joka saadaan seuraavasti,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
Tässä f(z;θ)on korvattu jakaumalla Pө(X|z).
Tämän maksimaalisen todennäköisyyden estimoinnin taustalla oleva intuitio on se, että jos malli pystyy tuottamaan harjoitusnäytteitä näistä latenttimuuttujista, niin se pystyy myös tuottamaan samankaltaisia näytteitä joillakin variaatioilla. Toisin sanoen, jos otamme suuren määrän latentteja muuttujia P(z):stä ja generoimme x:n näistä muuttujista, niin generoidun x:n pitäisi vastata datajakaumaa Pdata(x). Nyt meillä on kaksi kysymystä, joihin meidän on vastattava. Miten kaapata latenttien muuttujien jakauma ja miten integroida yhtälö 1 kaikkien z:n ulottuvuuksien yli?
On selvää, että on työlästä määritellä manuaalisesti asiaankuuluva informaatio, jonka haluaisimme koodata latenttiin vektoriin tulostuskuvan tuottamiseksi. Pikemminkin luotamme neuroverkkoihin z:n laskemiseksi vain olettaen, että tämä latentti vektori voidaan approksimoida hyvin normaalijakaumana, jotta voimme helposti ottaa näytteitä päättelyhetkellä. Jos meillä on z:n normaalijakauma n-ulotteisessa avaruudessa, on aina mahdollista tuottaa mikä tahansa jakauma käyttämällä riittävän monimutkaista funktiota, ja tämän funktion käänteislukua voidaan käyttää itse latenttien muuttujien oppimiseen.
Yhtälössä 1 integraatio suoritetaan kaikkien z:n ulottuvuuksien yli, ja se on siksi vaikeasti toteutettavissa. Se voidaan kuitenkin laskea Monte-Carlo-integrointimenetelmillä, mikä on jotain, mitä ei ole helppo toteuttaa. Seuraamme siis toista lähestymistapaa maksimoidaksemme likimääräisesti Pө(X) yhtälössä 1. VAE:n ideana on päätellä P(z) käyttämällä P(z|X), jota emme tunne. Päättelemme P(z|X) käyttämällä menetelmää nimeltä variationaalinen päättely, joka on periaatteessa Bayesin tilastotieteen optimointiongelma. Mallinnamme ensin P(z|X) käyttämällä yksinkertaisempaa jakaumaa Q(z|X), joka on helppo löytää, ja yritämme minimoida P(z|X):n ja Q(z|X):n välisen eron KL-divergenssimittariston avulla niin, että hypoteesimme on lähellä todellista jakaumaa. Tätä seuraa paljon matemaattisia yhtälöitä, joita en selitä tässä, mutta löydät ne alkuperäisestä artikkelista. Täytyy kuitenkin sanoa, että nuo yhtälöt eivät ole kovin vaikeita ymmärtää, kunhan VAE:n taustalla oleva intuitio on hahmottunut.
VAE:n lopullinen tavoitefunktio on :-
Yllä olevalla yhtälöllä on erittäin mukava tulkinta. Termi Q(z|X) on periaatteessa koodausverkkomme, z on koodattu esitys tiedosta x(x ∈ X) ja P(X|z) on dekoodausverkkomme. Yllä olevassa yhtälössä tavoitteemme on siis maksimoida datajakaumamme log-likelihoodia jossakin virheessä, joka on annettu D_KL:n avulla. Voidaan helposti nähdä, että VAE yrittää minimoida log(P(X)):n alarajan, koska P(z|X) ei ole seurattavissa, mutta KL-divergenssitermi on >=0. Tämä on sama kuin E:n maksimointi ja D_KL:n minimointi. Tiedämme, että E:n maksimointi on suurimman todennäköisyyden estimointi ja se mallinnetaan dekooderiverkon avulla. Kuten aiemmin totesin, haluamme latentin esityksemme olevan lähellä Gaussia, ja siksi oletamme P(z):n olevan N(0, 1). Tämän oletuksen mukaisesti myös Q(z|X):n pitäisi olla lähellä tätä jakaumaa. Jos oletamme, että se on Gaussin jakauma, jonka parametrit ovat μ(X) ja Ʃ(X), näiden kahden jakauman välisestä erosta johtuva virhe, ts, – D_KL, jossa toisen ratkaisu on esitetty yllä.
Häviöfunktiomme sisältää siis kaksi termiä. Ensimmäinen on rekonstruktiohäviö tulosta lähtöön ja toinen häviö on KL-divergenssitermi. Nyt voimme kouluttaa verkon käyttämällä backpropagation-algoritmia. Ongelmana on kuitenkin se, että ensimmäinen termi ei riipu ainoastaan P:n parametreista vaan myös Q:n parametreista, mutta tämä riippuvuus ei näy edellä olevassa yhtälössä. Miten siis backpropagoida kerroksen läpi, jossa otamme z:n satunnaisesti jakaumasta Q(z|X) tai N, jotta P voi dekoodata. Gradientit eivät voi kulkea satunnaisten solmujen läpi. Käytämme uudelleenparametrisointitemppua (ks. kuva) tehdäksemme verkosta differentioituvan. Otamme näytteen N(μ(X), Σ(X)) ottamalla ensin näytteen ε ∼ N(0, I) ja laskemalla sitten z=μ(X) + Σ1/2(X)∗ε.
Tämä on hyvin kauniisti esitetty kuvassa 2 ? . On huomattava, että feedforward-askel on identtinen näissä molemmissa verkoissa (vasen & oikea), mutta gradientit voivat edetä taaksepäin vain oikean verkon kautta.
Päätelmöintihetkellä voimme yksinkertaisesti ottaa näytteen z:stä N(0, 1):stä ja syöttää sen dekooderiverkkoon uuden datapisteen tuottamiseksi. Koska optimoimme alemman variaatiorajan, generoidun kuvan laatu on hieman huono verrattuna uusimpiin tekniikoihin, kuten generatiivisiin adversaaliverkkoihin.
VaE:n paras puoli on, että se oppii sekä generatiivisen mallin että inferenssimallin. Vaikka sekä VAE että GANit ovatkin erittäin jännittäviä lähestymistapoja taustalla olevan datajakauman oppimiseen valvomattoman oppimisen avulla, GANit tuottavat parempia tuloksia kuin VAE. VAE:ssä optimoidaan alempaa variaatiorajoitusta, kun taas GAN:ssa tällaista oletusta ei ole. Itse asiassa GANit eivät käsittele mitään eksplisiittistä todennäköisyystiheyden estimointia. VAE:n epäonnistuminen terävien kuvien tuottamisessa viittaa siihen, että malli ei pysty oppimaan todellista jälkijakaumaa. VAE ja GAN eroavat toisistaan lähinnä koulutustavan suhteen. Sukelletaan nyt Generative Adversarial Networksiin.
Generative Adversarial Networks
Yann LeCun sanoo, että adversariaalinen harjoittelu on siistein asia sitten viipaloidun leivän. Kun näkee Generative Adversarial Networksin suosion ja sen tuottamien tulosten laadun, uskon, että useimmat meistä ovat hänen kanssaan samaa mieltä. Vastakohtainen harjoittelu on muuttanut täysin tapaa, jolla neuroverkkoja opetetaan tekemään tietty tehtävä. Generatiiviset adversaaliverkot eivät toimi eksplisiittisen tiheysarvion avulla, kuten varioivat autokooderit. Sen sijaan se perustuu peliteoreettiseen lähestymistapaan, jonka tavoitteena on löytää Nash-tasapaino kahden verkon, generaattorin ja erottelijan, välille. Ideana on ottaa näyte yksinkertaisesta jakaumasta, kuten Gaussin jakaumasta, ja sitten oppia muuntamaan tämä kohina datajakaumaksi käyttämällä universaaleja funktion approksimaattoreita, kuten neuroverkkoja.
Tämä saavutetaan kouluttamalla nämä kaksi verkkoa vastakkain. Generaattorimalli G oppii vangitsemaan datajakauman ja diskriminaattorimalli D arvioi todennäköisyyden, että näyte tuli datajakaumasta eikä mallijakaumasta. Periaatteessa generaattorin tehtävänä on tuottaa luonnollisen näköisiä kuvia ja diskriminaattorin tehtävänä on päättää, onko kuva väärennös vai aito. Tätä voidaan ajatella kahden pelaajan mini-max-pelinä, jossa molempien verkkojen suorituskyky paranee ajan myötä. Tässä pelissä generaattori yrittää huijata diskriminaattoria tuottamalla mahdollisimman paljon aitoja kuvia, ja generaattori yrittää olla huijaamatta diskriminaattoria parantamalla erottelukykyään. Alla olevassa kuvassa on esitetty GANin perusarkkitehtuuri.
Määritellään priori sisääntuleville kohinamuuttujille P(z), minkä jälkeen generaattori kuvaa tämän datajakaumaksi käyttämällä kompleksista differentioituvaa funktiota, jonka parametrit ovat өg. Tämän lisäksi meillä on toinen verkko nimeltä Discriminator, joka ottaa syötteen x ja käyttää toista differentioituvaa funktiota, jonka parametrit ovat өd, ja tuottaa yhden skalaarisen arvon, joka ilmaisee todennäköisyyden, että x on peräisin todellisesta datajakaumasta Pdata(x). GAN:n tavoitefunktio määritellään seuraavasti
Yllä olevasta yhtälöstä voidaan päätellä, että jos diskriminaattorin syöte tulee todellisesta datajakaumasta, D(x):n tulisi antaa tuloksena 1, jotta edellä mainittu tavoitefunktio maksimoitaisiin w.r..t D:n kanssa, kun taas jos kuva on luotu generaattorista, D(G(z)) pitäisi antaa tulokseksi 1, jotta tavoitefunktio minimoitaisiin suhteessa G:hen. Jälkimmäinen tarkoittaa pohjimmiltaan sitä, että G:n pitäisi tuottaa sellaisia realistisia kuvia, jotka voivat huijata D:tä. Maksimoimme edellä esitettyä funktiota diskriminaattorin parametreihin nähden käyttämällä Gradient Ascent -menetelmää (Gradient Ascent) ja minimoimme samaa parametreihin nähden generaattorin parametreihin nähden käyttämällä Gradient Descent -menetelmää. Generaattorin tavoitteen optimoinnissa on kuitenkin ongelma. Pelin alussa, kun generaattori ei ole oppinut mitään, gradientti on yleensä hyvin pieni ja kun se pärjää hyvin, gradientit ovat hyvin suuria (ks. kuva 4). Haluamme kuitenkin päinvastaista käyttäytymistä. Maksimoimme siis E:n sen sijaan, että minimoisimme E
Harjoitteluprosessi koostuu stokastisen gradienttilaskun samanaikaisesta soveltamisesta diskriminaattoriin ja generaattoriin. Koulutuksen aikana vuorottelemme k askelta optimoimalla D:tä ja yhtä askelta optimoimalla G:tä minierään. Koulutusprosessi pysähtyy, kun diskriminaattori ei pysty erottamaan ρg:tä ja ρdata:ta eli D(x, өd) = ½ tai kun ρg = ρdata.
Yksi varhaisimmista GAN-malleista, joissa käytettiin konvolutiivista neuroverkkoa, oli DCGAN, joka on lyhenne sanoista Deep Convolutional Generative Adversarial Networks. Tämä verkko ottaa syötteenä 100 satunnaislukua, jotka on poimittu tasaisesta jakaumasta, ja antaa tuloksena halutun muotoisen kuvan. Verkko koostuu monista konvoluutio-, dekonvoluutio- ja täysin kytketyistä kerroksista. Verkko käyttää monia dekonvoluutiokerroksia, jotta syötekohinasta saadaan haluttu tuloskuva. Eränormalisointia käytetään verkon harjoittelun vakauttamiseen. ReLU-aktivointia käytetään generaattorissa kaikissa kerroksissa paitsi ulostulokerroksessa, jossa käytetään tanh-kerrosta, ja Leaky ReLU:ta käytetään kaikissa diskriminaattorin kerroksissa. Tämä verkko koulutettiin käyttämällä minierän stokastista gradienttilaskeutumista ja Adam-optimointia käytettiin nopeuttamaan koulutusta viritetyillä hyperparametreilla. Työn tulokset olivat varsin mielenkiintoisia. Kirjoittajat osoittivat, että generaattoreilla on mielenkiintoisia vektoriaritmeettisia ominaisuuksia, joiden avulla voimme manipuloida kuvia haluamallamme tavalla.
Yksi yleisimmin käytetyistä GAN:ien variaatioista on ehdollinen GAN, joka rakennetaan yksinkertaisesti lisäämällä ehdollinen vektori yhdessä kohinavektorin kanssa (ks. kuva 7). Ennen cGANia generoimme kuvia satunnaisesti satunnaisnäytteistä kohinasta z. Entä jos haluamme generoida kuvan, jolla on joitakin haluttuja ominaisuuksia. Voimmeko mitenkään antaa mallille tätä lisätietoa siitä, minkä tyyppisen kuvan haluamme tuottaa? Vastaus on kyllä, ja Conditional GAN on tapa tehdä se. Ehdollistamalla mallia lisätiedolla, joka annetaan sekä generaattorille että diskriminaattorille, on mahdollista ohjata tiedon tuottamisprosessia. Ehdollisia GAN-malleja käytetään monissa eri tehtävissä, kuten tekstistä kuvaksi tuottamisessa, kuvasta kuvaksi kääntämisessä, automaattisessa kuvien merkitsemisessä jne. Molempien verkkojen yhtenäinen rakenne on esitetty alla olevassa kaaviossa.
Yksi GAN:ien hienoimmista puolista on se, että niitä voidaan kouluttaa jopa pienellä harjoitusdatalla. GANien tulokset ovatkin lupaavia, mutta koulutusprosessi ei ole triviaali varsinkaan verkon hyperparametrien asettaminen. Lisäksi GAN-verkkoja on vaikea optimoida, koska ne eivät konvergoi helposti. Tietenkin on olemassa joitakin vinkkejä ja temppuja GAN:ien hakkeroimiseksi, mutta ne eivät välttämättä aina auta. Löydät joitakin näistä vinkeistä täältä. Meillä ei myöskään ole mitään kriteerejä tulosten kvantitatiivista arviointia varten, paitsi sen tarkistaminen, ovatko luodut kuvat havaintorealistisia vai eivät.
Johtopäätös
Syväluotaavat oppimismallit todella saavuttavat inhimillisen tason suorituskyvyn valvotussa oppimisessa, mutta sama ei päde valvomattomaan oppimiseen. Syväoppimisen tutkijat tekevät kuitenkin kovasti töitä parantaakseen valvomattomien mallien suorituskykyä. Tässä blogipostauksessa näimme, miten kaksi tunnetuinta generatiivisten mallien valvomattoman oppimisen kehystä todella toimii. Tutustuimme Variational Autoencodersin ongelmiin ja siihen, miksi Adversarial-verkot tuottavat paremmin realistisia kuvia. GAN-verkoissa on kuitenkin ongelmia, kuten niiden harjoittelun vakauttaminen, joka on edelleen aktiivinen tutkimusalue. GAN-verkot ovat kuitenkin todella tehokkaita, ja tällä hetkellä niitä käytetään monissa eri tehtävissä, kuten korkealaatuisten kuvien (katso tämä video) ja videoiden luomisessa, tekstin kääntämisessä kuvaan, kuvien parantamisessa, objektien 3D-mallien rekonstruoinnissa kuvista, musiikin luomisessa, syöpälääkkeiden löytämisessä jne. Tämän lisäksi monet syväoppimisen tutkijat työskentelevät näiden kahden mallin yhdistämiseksi ja molempien mallien parhaiden ominaisuuksien hyödyntämiseksi. Koska syväoppiminen kehittyy yhä nopeammin, uskon, että GANit avaavat monia tekoälyn suljettuja ovia, kuten puolivalvotun oppimisen ja vahvistusoppimisen. Lähivuosina generatiivisista malleista on paljon apua grafiikan suunnittelussa, houkuttelevien käyttöliittymien suunnittelussa jne. Saattaa myös olla mahdollista luoda luonnollisen kielen tekstejä generatiivisten vastakkaisverkkojen avulla.