Kratki uvod u GAN-ove

Uz objašnjenja matematike i koda

GANs ili Generative Adversarial Networks su vrsta neuronske mrežne arhitekture koja omogućuje neuronskim mrežama generiranje podataka. U posljednjih nekoliko godina postali su jedno od najpopularnijih potpolja u dubokom učenju, krećući se od stvaranja nejasnih slika znamenki do fotorealističnih slika lica.

Prije: nejasne znamenke, Nakon: fotorealistična lica

Varijante GAN-ova sada su učinile sulude stvari, poput pretvaranja slika zebri u konje i obrnuto.

Smatrao sam GAN-ove fascinantnim i u nastojanju da ih bolje razumijem, mislio sam da pišem ovaj članak i u procesu objašnjavanja matematike i koda koji se nalazi iza njih i sam ih razumem.

Evo poveznice do github repoa koji sam napravio za GAN resurse:

Pa kako funkcioniraju GAN-ovi?

GAN-ove nauče raspodjelu vjerojatnosti skupa podataka tako što će pogoditi dvije neuronske mreže jedna protiv druge.

Evo sjajnog članka koji objašnjava raspodjelu vjerojatnosti i druge koncepte za one koji ih nisu upoznati:

Jedan model, generator, djeluje slično kao krivotvorina. Pokušava stvoriti slike koje nalikuju skupu podataka. Drugi model, diskriminator, djeluje poput policije i pokušava otkriti jesu li generirane slike lažne ili ne.

Ono što se u osnovi događa je da krivotvoritelj i dalje postaje sve bolji u izradi falsifikata, dok policija stalno postaje sve bolja u otkrivanju falsifikata. Učinkovito, ova dva modela pokušavaju pobijediti jedan drugoga, sve dok nakon mnogih ponavljanja generator ne stvori slike nerazlučive od stvarnog skupa podataka.

Trening generativne protivničke mreže uključuju dva cilja:

  1. Diskriminator maksimizira vjerojatnost davanja ispravne oznake i primjerima treninga i slikama koje generira generator. I.e, policajac postaje bolji u razlikovanju lažnih i stvarnih slika.
  2. Generator minimizira vjerojatnost da diskriminator može predvidjeti da je ono što stvori lažno. I.e. Generator postaje bolji u kreiranju falsifikata

Pokušajmo ove dvije ideje kodirati u program.

Pratit ćemo ovaj kôd u ovom vodiču

Podatak

GAN-ovima je potreban skup podataka, pa ćemo za ovaj udžbenik koristiti klasični hello svijet za strojno učenje - MNIST, skup rukom pisanih znamenki.

Generatoru su također potrebni slučajni ulazni vektori za generiranje slika, a za to ćemo se poslužiti numupom

GAN funkcija

GAN igra minimax igru ​​u kojoj cijela mreža pokušava optimizirati funkciju V (D, G). Ovo je jednadžba koja definira što GAN radi:

Sada svakome tko nije dobro upućen u matematiku koja stoji iza njega, to izgleda zastrašujuće, ali ideja koju on predstavlja je jednostavna, ali moćna. To je samo matematički prikaz dva cilja kako je gore definirano.

Generator je definiran s G (z), koji pretvara neki šum z koji unosimo u neke podatke, poput slika.

Diskriminator je definiran s D (x), koji daje vjerojatnost da je ulaz x došao iz stvarnog skupa podataka ili ne.

Diskriminator se ponaša poput policije

Želimo da predviđanja na skupu podataka od strane diskriminiraju budu što bliža 1, a na generatoru da bude što bliža 0. Da bismo to postigli, koristimo vjerojatnost log-a D (x) i 1-D (z) u ciljnoj funkciji.

Dnevnik samo osigurava da što je bliža pogrešnoj vrijednosti, to je više kažnjeno.

Evo objašnjenja za gubitak dnevnika ako niste sigurni što to čini:

Kodiranje generatora

Generator je samo model vanilije neuronske mreže koji uzima slučajni ulazni vektor i emitira 784-dim vektor koji, kada se preoblikuje, postaje slika od 28 * 28 piksela.

Kodiranje Diskriminatora

Diskriminator je druga neuronska mreža koja uzima izlaz iz prethodne mreže, 784-dimenzionalni vektor i daje vjerojatnost između 0 i 1 da je došao iz skupa podataka treninga.

Sastavljanje u GAN

Sada sastavljamo oba modela u jednu protivničku mrežu, postavljajući ulaz kao 100-dimenzionalni vektor, a izlaz kao izlaz diskriminatora.

Trening GAN-a

  1. Prvo učitavamo podatke i dijelimo ih u nekoliko skupina kako bismo ih unijeli u svoj model
  2. Ovdje samo inicijaliziramo našu GAN mrežu na temelju prethodno definiranih metoda
  3. To je naša petlja za trening, u kojoj trčimo za određeni broj epoha.
  4. Generiramo slučajni šum i izvadimo neke slike iz našeg skupa podataka
  5. Generiramo neke slike pomoću generatora i stvaramo vektor X koji ima neke lažne slike i neke stvarne slike
  6. Stvaramo vektor Y koji ima "točne odgovore" koji odgovaraju X, s lažnim slikama s 0 i stvarnim slikama s 0,9. Označene su s 0 umjesto 1 jer to pomaže boljem treningu GAN-a, metodi nazvanoj jednostrano izglađivanje naljepnica.
  7. Trebamo izmjeniti obuku između diskriminatora i generatora, tako da ovdje ažuriramo diskriminatora
  8. Konačno, ažuriramo diskriminator.

Naš prvi GAN

Nakon što pokrenemo gore navedeni kod, učinkovito smo stvorili prvi GAN koji generira cifre ispočetka!

Slike generirane iz GAN-a koji smo obučavali!

Nadamo se da je ovaj članak pružio uvod u generativne adversarijalne mreže i kako ih napraviti. U skoroj budućnosti pisat ću puno više o strojnom učenju, stalno ažurirajte!

Hvala na čitanju,

Sarvasv

Želite razgovarati? Pronađite me na Twitteru i Linkedinu

Evo nekih drugih postova koje sam napisao