Le GAN (Generative Adversarial Networks) sono un’architettura per addestrare un modello generativo di AI, che ha rivoluzionato il modo in cui si creano dei contenuti artificiali; questo tipo di rete è stato introdotto per la prima volta nel 2014 da Ian Goodfellow[1], all’epoca ricercatore presso l’Università di Montreal.
Come sono costituite le GAN
Le GAN sono costituite da due reti neurali: un generatore e un discriminatore.
La prima ha il compito di creare nuovi dati che possano ingannare il discriminatore. la seconda ha, invece, la mansione di distinguere tra i dati creati dal generatore e quelli reali, in sostanza è un classificatore, ossia una rete da addestrare a distinguere tra i dati reali e quelli “fake” generati dal generatore, estraendone le caratteristiche.
In sostanza il generatore parte da un dato completamente inventato anche detto “latent vector” e lo passa al discriminatore che si addestra a riconoscere un determinato tipo di dato, per esempio, foto di gatti, volti umani, testi, suoni, video, da dei dataset di input reali e da quelli finti generati dal generatore.
Il processo d’addestramento
Durante il processo d’addestramento, le due reti si sfidano a vicenda: il generatore cerca di migliorare la qualità dei dati che produce in modo da ingannare il discriminatore, mentre quest’ultimo cerca di migliorare la sua capacità di distinguere tra i dati reali e quelli falsi.
Questa competizione tra le due reti porta alla creazione di dati artificiali che possono essere abbastanza realistici, ma inesistenti nella realtà, quindi completamente partoriti dalla rete generativa.
Ripeto l’esempio che ho già descritto in un mio articolo:
- Un’immagine casuale viene generata da una rete che chiameremo “Generatore”.
- Il Generatore ha il compito di ingannare una rete avversaria chiamata Discriminatore e fargli credere che il dato da lui generato possa essere un qualcosa che il Discriminatore ha già “imparato”, ad esempio un volto umano.
- Il Discriminatore valuta l’input fornitogli dal Generatore e gli fornisce un punteggio, chiamiamolo di “plausibilità”, oppure un punteggio di “perdita”.
- Il Generatore allora migliorerà il proprio input da passare al discriminatore, magari migliorando l’immagine.
- Quando il Discriminatore sarà ingannato a dovere, quindi giudicherà quell’input abbastanza bene da poter dire che è un volto, allora l’immagine sarà generata e fornita in output.
Utilizzi pratici e svantaggi delle GAN
Le GAN hanno molti utilizzi pratici, tra cui:
- Creazione di contenuti per videogiochi, film e animazioni
- Generazione di dati per la visione artificiale e l’apprendimento automatico
- Creazione di immagini e video a partire da descrizioni testuali (ad esempio, “un’immagine di un panda che vive sulla luna”)
- Creazione di immagini e video di alta qualità a partire da immagini e video di bassa qualità
- Creazione di immagini e video di oggetti o scene che non esistono nella realtà
Ci sono però anche degli svantaggi; le GAN possono essere difficili da addestrare e possono produrre dati che non sono sempre coerenti con la realtà, creando output non affidabili.
Un esempio
Ho scritto questo programmino in Python, che non sfrutta i modelli di GAN, ma, a mio vedere, fa comprendere meglio il meccanismo.
In questo programma vi è una funzione Generatore che crea delle sequenze di 6 lettere da un alfabeto di 26 lettere e le sottopone al vaglio della funzione Discriminatore che confronta le stringhe casuali del generatore con le 100 stringhe che lei reputa valide, ma se la distanza euclidea[2] tra la stringa casuale e quella presente nel “database” (il file ab.txt) del discriminatore è compresa tra 0 e 2, esclusi, allora stampa la stringa casuale, insomma è come se l’accettasse come stringa valida, così si son create delle stringhe inesistenti nella conoscenza del discriminatore, ma accettabili, spero che questo renda più chiaro il concetto delle GAN.
OUTPUT:
Dall’output si nota che la stringa creata casualmente dal generatore è veramente abbastanza simile ad una presente nella base di conoscenza del discriminatore; quindi, è sufficientemente ingannevole da esser accettata secondo il criterio del discriminatore.
Questo esempio non sfrutta modelli di AI, che sono molto complessi e richiedono molta potenza di elaborazione, perché lavorano sui modelli di Deep Learning ed algoritmi di calcolo della funzione di perdita, che deve essere massimizzata da parte del discriminatore, mentre il generatore cercherà di minimizzarla.
In sintesi, il discriminatore, cerca di massimizzare la funzione di perdita, perché durante l’addestramento della GAN, l’obiettivo del discriminatore è quello di distinguere tra i dati reali e quelli fake generati dal generatore; più il discriminatore è in grado di distinguere tra i dati reali e quelli finti, maggiore sarà la funzione di perdita e quindi maggiore sarà l’errore del generatore; pertanto, il generatore cerca di minimizzare la funzione di perdita, così i suoi dati saranno probabilisticamente accettati dal discriminatore.
Esempi di applicazione delle GAN
Esempi di applicazioni delle GAN sono:
- StyleGAN: uno dei più famosi esempi di GAN utilizzati per la generazione di immagini di alta qualità, con una risoluzione fino a 1024×1024 pixel. StyleGAN è stato utilizzato per creare immagini di volti umani, animali, paesaggi e altro ancora.
- CycleGAN: una GAN utilizzata per la traduzione di immagini da una classe a un’altra senza la necessità di una corrispondenza diretta tra le immagini di input e di output; per esempio, CycleGAN può essere utilizzata per tradurre immagini di cavalli in immagini di zebre.
- TextGAN: una GAN utilizzata per generare testo naturale, come ad esempio recensioni di prodotti, descrizioni di immagini e altro ancora.
- MuseGAN: una GAN utilizzata per la generazione di musica.
Tra le GAN o modelli di AI basati su GAN più popolari possiamo pensare a MidJourney e Dall-E, Deep-Ai, Craiyon, ma ce ne sono tante online, c’è solo l’imbarazzo della scelta.
Le GAN stanno diventando sempre più popolari nel campo dell’apprendimento automatico ed è possibile che saranno utilizzate in modo sempre più creativo in futuro.
Bibliografia
- https://github.com/goodfeli/adversarial ↑
- DISTANZA EUCLIDEA: si calcola facendo la radice quadrata della somma dei quadrati delle differenze tra i codici ASCII dei caratteri corrispondenti nelle due stringhe. ↑