Blog.

GAN: Come funziona una rete generativa avversaria


Autore
Andrea Provino
Data
Tempo di lettura
6 minuti
Categoria
AI, machine-learning

come-funziona-gan-generative-adversarial-networks-italia-rete-generativa-avversaria-rete-antagonista-generativa

Il funzionamento di una rete generativa avversaria (GAN) è complesso: cercheremo di semplificarlo e approfondirlo con i giusti esempi e le dovute spiegazioni.

Nel precedente post abbiamo visto cosa sono le GAN: Generative Adversarial Networks.

Una piccola tappa fondamentale nel nostro viaggio.

Ottimo!

Lasciami fare una breve digressione.

Devi sapere che mi piace molto il mare, e l’idea di navigare come veri esploratori in acque incontaminate.

Questo è il motivo per cui ricorro spesso alla metafora del marinaio e del comandante.

Continua a leggere…

Oltre a farci vivere l’avventura e il piacere della scoperta, è quasi allegoria di una vita equilibrata in cui a volte ci troviamo nei panni di un capitano che deve decidere, guidare e tenere la rotta, e altre siamo l’umile marinaio che ascolta, ed esegue a tesa china con sommo rigore le disposizioni del capitano.

Allora lasciami dire una cosa.

Il porto è ormai lontano e il mare aperto potrebbe sembrare intimidatorio.

Non temere, perché il nostro capitano ci guiderà in queste insidiose acque, lontano dai pericoli, verso l’attesa destinazione.

Quindi? Con il vento di levante, issiamo le vele: alla scoperta del funzionamento delle GAN!

Come funziona una rete generativa avversaria (GAN)

Citando l’articolo accademico di Yoshua Bengio, un informatico canadese che ha studiato l’apprendimento profondo, il Deep Learning promette di scoprire ricchi, modelli gerarchici che rappresentano distribuzioni di probabilità su dati quali immagini, conversazioni audio, e testo.

Al di là dei livelli di complessità di una simile definizione, quello che dobbiamo sapere sono, per il momento, le basi.

L’obiettivo ultimo di un progetto di Deep Learning è sviluppare un modello che rappresenti una certa realtà: un’immagine, un testo, etc.

Quindi partiamo dai dati, di cui disponiamo, stabiliamo delle funzioni matematiche e attraverso iterazioni successive e l’ausilio di qualche gran bel algoritmo, ricaviamo i parametri che definiscono la funzione, di conseguenza il modello.

A questo punto è molto utile approfondire il funzionamento delle Reti Neurali Convoluzionali, di cui abbiamo parlato qui.

Mi raccomando, tornerà utile tra poco.

Tornano a noi, sembra semplice il funzionamento?

Quando si tratta d’imparare, o apprendere, da dati presenti… Abbastanza. Perlomeno è intuitivo.

Come facciamo però a generare dei dati che siano verosimili?

Ecco che entrano in gioco le GAN.

Nel precedente post abbiamo chiarito che il framework di Generative Adversarial Nets prevede due Deep Networks: un generatore, Generator G, e un discriminatore, Discriminator D.

Prima di capire come allenare un generatore, comprendiamo il sistema attraverso cui avviene la generazione dell’informazione: una immagine.

Generating random variables

Come input per il nostro modello, occorre generare dei numeri casuali.

Questa apparentemente semplice operazione nasconde un’insidia.

I computer, queste stupide seppur preziose macchine, sono sistemi deterministici per natura.

Cosa significa?

È teoricamente impossibile generare numeri realmente casuali (potremmo aprire una digressione filosofia sul concetto di casualità, anche se per il momento penso sia meglio tralasciare).

La soluzione è definire algoritmi che generino sequenze numeriche, le cui proprietà risultino affini a quelle generate casualmente.

Aumentando la complessità, possiamo dire che usando un generatore numerico pseudocasuale siamo in grado di creare sequenze di numeri che seguono approssimativamente una distribuzione uniforme tra 0 e 1.

Si tratta di un caso elementare questo: variabili casuali complesse possono essere inizializzate con sistemi differenti.

Un esempio?

Metodi di Inverse Tranform Samping, molto utili per stupire colleghi e amici, ma poco per comprendere davvero il funzionamento di un Rete Generativa Avversaria.

Non facciamoci distrarre dalle affascinanti sirene lungo il tragitto: manteniamo il focus sull’orizzonte.

Ora che abbiamo il nostro input z, usiamo il Generator G per creare un’immagine x.

Perfetto. Finito. Tutti amici come prima.

Beh… non proprio.

Concettualmente, z è la rappresentazione delle caratteristiche latenti dell’immagine generate.

Quali sono queste caratteristiche? Non chiedere. Non le conosciamo.

Vedi, questa è la magia: non controlliamo il significato semantico di quelle caratteristiche, lo gestisce interamente la rete neurale e spetta al processo di training capire quali siano.

Facciamo finta che tu sia una persona ostinata e curiosa.

Vuoi sapere cosa accada under the hood ? Benissimo!

Possiamo stampare le immagini generate ed esaminarle.

Come ci spiega questo articolo accademico, ecco l’aspetto dei volti che potremmo ottenere:

celeba-hq-deep-learning-gan-nvidia-test-deep-learning
Progressive growing of GANs from CELEBA-HQ dataset.

Ok Ok.

Non so te, ma a me sembra ci siano parecchi buchi di logici.

Come funziona il generatore?

Il Generator di una rete generativa avversaria

Come per le Reti Neurali Convoluzionali, anche le GANs hanno un ventaglio di architetture tipicamente usate. Una di queste è la DCGAN, una delle più popolari per la rete generativa.

Attraverso convoluzioni multiple trasposte eseguiamo l’upsampling da z per generare x. Per semplificare concettualmente l’argomento, possiamo considerare la struttura un deep learning classifier con un funzionamento opposto:

Il funzionamento dei layer convoluzionali lo abbiamo spiegato qui.

Ora arriva il bello.

Devi sapere che un Generator sarebbe in grado di produrre puro rumore.

E vorrei ben vedere! Gli diamo in pasto numeri casuali, e lui dovrebbe tirare fuori un dipinto impressionista in pieno stile Monet?

Palesemente qualcosa non torna.

Un momento. Dove hai messo il Discriminator?

Ecco prendilo.

Il Discriminator di una rete generativa avversaria

Il Discrimintaor guida il Generator sull’immagine da creare.

Consideriamo un’applicazione di GANs, nel dettaglio una così detta CycleGAN. I dettagli li vedremo in un prossimo post.

Per il momento devi sapere che questa rete può applicare a un’immagine reale lo stile di Monet.

source

Allenato con immagini reali e generate, una Generative Adversial Nets è in grado di affinare il Discriminator per riconoscere le caratteristiche veritiere.

Lo stesso Discriminator fornisce poi un feedback al Generator affinché crei dipinti simili a quelli di Monet.

gan-rete-generativa-avversaria-machine-learning-deep-learning-data-science-discriminator-feedback

Ok. Ok.

Tecnicamente però, cosa diamine succede?

Il Discriminator esamina le foto reali (del dataset di training) e genera immagini separatamente.

Produce una probabilità D(x) che l’immagine in input sia reale o fittizia

rete-generativa-avversaria-generator-discriminator-real-image-description

Il Discriminator è simile a un deep network binary classifier: 1, immagine reale; 0, immagine generata.

Allo stesso tempo vogliamo però che il Generator crei immagini che riproducano quelle reali, e che siano quindi interpretate dal Discriminator come D(x) = 1.

Ancora una volta, l’algoritmo di retropropagazione dell’errore corre in nostro soccorso.

Lo abbiamo studiato nel post sul funzionamento delle reti neurali, che ti invito a leggere.

rete-generativa-avversaria-generator-discriminator-real-image-description-backpropagation

Al termine del processo di training, i modelli di GAN convergono e producono immagini che sembrano reali.

Ora è arrivato il momento di sporcarsi le mani e iniziare a scrivere qualche riga di codice.

Ti consiglio allora questo corso: non te pentirai!

Per il momento è tutto.

Per aspera, ad astra.

Un caldo abbraccio, Andrea

Taggeddeep learningmachine learningneural networkteoria


Ultimi post

Patricia Merkle Trie

Il Practical Algorithm To Retrieve Information Coded In Alphanumeric Merkle Trie, o Patricia Merkle Trie è una struttura dati chiave-valore usatada Ethereum e particolarmente efficiente per il salvataggio e la verifica dell’integrità dell’informazione. In questo post ne studieremo le caratteristiche. Prima di procedere, ci conviene ripassare l’introduzione al Merkle Tree nella quale abbiamo chiarito il […]

Andrea Provino
ethereum-patricia-merkle-tree
Tree Data Structure: cos’è un Merkle Tree

Un Merkle Tree è una struttura dati efficiente per verificare che un dato appartenga a un insieme esteso di elementi. È comunemente impiegato nelle Peer to Peer network in cui la generazione efficiente di prove (proof) contribuisce alla scalabilità della rete. Capire i vantaggi di questa struttura ci tornerà utile nel nostro percorso di esplorazione […]

Andrea Provino
merkle-tree-cover
UTXO: come funziona il modello Unspent Transaction Outputs

Per tenere traccia dei bilanci utente, la blockchain di Bitcoin sfrutta un modello di contabilità definito UTXO o Unspent Transaction Outputs. In questo articolo ne esaminiamo le caratteristiche. Ogni blockchain è dotata di un sistema di contabilità, un meccanismo attraverso cui tenere traccia dei bilanci di ciascun utente. I due grandi modelli di riferimento nel […]

Andrea Provino
bitcoin-utxo
Cos’è Ethereum

Possiamo definire Ethereum come una macchina a stati distribuita che traccia le transizioni di un archivio dati general-purpose (i.e. una memoria in grado di registrare qualsiasi dato esprimibile come coppia di chiave e valore o key-value) all’interno della Ethereum Blockchain. È arrivato il momento di esplorare uno dei progetti tecnologici più innovativi e interessanti degli […]

Andrea Provino
ethereum