O scurtă introducere în GAN-uri

Cu explicații despre matematică și cod

GAN-urile sau rețelele adversare generative sunt un tip de arhitectură de rețea neuronală care permite rețelelor neuronale să genereze date. În ultimii ani, au devenit unul dintre cele mai tari domenii ale învățării profunde, trecând de la generarea de imagini confuze cu cifre la imagini fotorealiste ale fețelor.

Înainte: cifre fuzzy, După: fețe fotorealiste

Variantele GAN-urilor au făcut acum lucruri nebunești, cum ar fi transformarea imaginilor cu zebre în cai și invers.

Am găsit GAN-urile fascinante și, în efortul de a le înțelege mai bine, am crezut că voi scrie acest articol și, în procesul de a explica matematica și codul din spatele lor, să le înțeleg mai bine pe mine.

Iată un link către un referat github pe care l-am făcut pentru resursele GAN:

Deci, cum funcționează GAN-urile?

GAN-urile învață o distribuție a probabilității unui set de date prin punerea a două rețele neuronale una față de alta.

Iată un articol minunat care explică distribuțiile probabilităților și alte concepte pentru cei care nu le sunt familiarizați:

Un model, generatorul, acționează asemănător cu un falsificator de pictură. Încearcă să creeze imagini care arată foarte asemănător cu setul de date. Celălalt model, discriminatorul, acționează ca poliția și încearcă să detecteze dacă imaginile generate au fost false sau nu.

Ceea ce se întâmplă, practic, este că falsificatorul continuă să se îmbunătățească în a face falsuri, în timp ce poliția continuă să îmbunătățească detectarea falsurilor. În mod eficient, aceste două modele încearcă să se bată reciproc, până când, după multe iterații, generatorul creează imagini indistinguibile din setul de date real.

Rețelele adversare generatoare de instruire implică două obiective:

  1. Discriminatorul maximizează probabilitatea de a atribui eticheta corectă atât la exemple de instruire, cât și la imaginile generate de generator. I.e polițistul devine mai bun în diferențierea dintre falsuri și tablouri reale.
  2. Generatorul reduce la minimum probabilitatea ca discriminatorul să prezică că ceea ce generează este fals. I.e generatorul devine mai bun la crearea falsurilor

Să încercăm să codificăm aceste două idei într-un program.

Vom urma acest cod în acest tutorial

Datele

GAN-urile au nevoie de un set de date pe care să îl folosească, așa că pentru acest tutorial, vom folosi lumea clasică de salut pentru învățarea automată - MNIST, un set de date format din cifre scrise de mână.

De asemenea, generatorul are nevoie de vectori de intrare aleatorii pentru a genera imagini și, pentru aceasta, vom folosi numpy

Funcția GAN

GAN joacă un joc minimax, unde întreaga rețea încearcă să optimizeze funcția V (D, G). Aceasta este ecuația care definește ceea ce face un GAN:

Acum, pentru oricine nu este bine versat în matematica din spatele ei, pare îngrozitor, dar ideea pe care o reprezintă este simplă, dar puternică. Este doar o reprezentare matematică a celor două obiective definite mai sus.

Generatorul este definit de G (z), care transformă un zgomot z introdus în unele date, cum ar fi imaginile.

Discriminatorul este definit de D (x), care produce probabilitatea ca intrarea x să provină din setul de date real sau nu.

Discriminatorul acționează ca poliția

Vrem ca previziunile despre setul de date de către discriminator să fie cât mai aproape de 1 și pe generator să fie cât mai aproape de 0. Pentru a obține acest lucru, folosim probabilitatea logului de D (x) și 1-D (z) în funcția obiectivă.

Jurnalul se asigură doar că, cu cât este mai aproape de o valoare incorectă, cu atât este penalizat.

Iată o explicație pentru pierderea jurnalului dacă nu sunteți sigur ce face:

Codarea generatorului

Generatorul este doar un model de rețea neuronală de vanilie, care ia un vector de intrare aleatoriu și produce un vector 784 dim, care, atunci când este remodelat, devine o imagine de 28 * 28 pixeli.

Codificarea Discriminatorului

Discriminatorul este o altă rețea neurală care preia ieșirea rețelei anterioare, un vector dimensional 784 și produce o probabilitate între 0 și 1, care provine din setul de date de formare.

Compilați-l într-un GAN

Acum compilăm ambele modele într-o singură rețea adversă, setând intrarea ca vector 100-dimensional, iar ieșirea ca ieșire a discriminatorului.

Instruirea GAN

  1. În primul rând, încărcăm datele și împărțim datele în mai multe loturi pentru a le introduce în modelul nostru
  2. Aici doar inițializăm rețeaua noastră GAN pe baza metodelor definite mai sus
  3. Aceasta este bucla noastră de instruire, unde rulăm pentru numărul specificat de epoci.
  4. Generam zgomot întâmplător și scoatem câteva imagini din setul nostru de date
  5. Generam câteva imagini folosind generatorul și creăm un vector X care are unele imagini false și unele imagini reale
  6. Creăm un vector Y care are „răspunsurile corecte” care corespunde lui X, cu imaginile false etichetate 0 și imaginile reale etichetate 0.9. Acestea sunt etichetate 0.9 în loc de 1, deoarece ajută GAN-ul să se antreneze mai bine, o metodă numită etichetare unilaterală.
  7. Trebuie să alternăm pregătirea între discriminator și generator, de aceea, aici actualizăm discriminatorul
  8. În cele din urmă, actualizăm discriminatorul.

Primul nostru GAN

După ce rulăm codul de mai sus, am creat în mod eficient primul nostru GAN care generează cifre de la zero!

Imagini generate de GAN-ul pe care l-am antrenat!

Sperăm că acest articol a furnizat o introducere în rețelele generative adversare și cum să realizăm una. În viitorul apropiat, voi scrie multe mai multe despre învățarea automată, continuați să fiți la curent!

Mulțumesc pentru citit,

Sarvasv

Vrei sa vorbim? Găsește-mă pe Twitter și pe Linkedin

Iată câteva alte postări pe care le-am scris