Le GAN (acronimo che sta per Generative Adversarial Network) sono reti neurali artificiali in grado di generare nuovi contenuti, in modo che questi risultini "verosimili" rispetto ad un dataset preesistente. In altre parole, una GAN può essere utilizzata per "imitare" la generazione di contenuti che è generalmente effettuata da un essere umano.
Immaginiamo, ad esempio, di addestrare una GAN con un dataset che raccoglie un gran numero di foto di volti. Dopo una fase di addestramente, la rete sarà in grado di produrre nuove immagini di volti non presenti nel dataset originale, ma al tempo stesso realistici. Questo particolare esempio è ciò che alcuni ricercatori hanno messo in pratica in ThisPersonDoesNotExist, di cui abbiamo parlato tempo fa su HTML.it.
In questa guida ci affideremo a PyTorch, una delle più diffuse ed apprezzate librerie di machine learning, spesso utilizzata in vari ambiti applicativi, e disponibile sia in C++ che in Python (il linguaggio che utilizzeremo in questa guida).
PyTorch ha guadagnato negli ultimi anni un’enorme popolarità tra sviluppatori e data scientist, grazie alla combinazione di semplicità ed efficienza che offre. Una delle caratteristiche più potenti e convenienti di questa libreria è che può essere facilmente adoperata sia su ambiente Windows che Linux. PyTorch è inoltre stato progettato per essere perfettamente integrato con molti moduli Python popolari nell'ambito della data science, quali Pandas o NumPy. In linea di massima, quindi, una buona conoscenza di Python dovrebbero permettere di apprendere l'uso di PyTorch senza troppe difficoltà.
Per evitare tediose configurazioni, nel prosieguo di questa guida ci affideremo al servizio gratuito Google Colab, una piattaforma che ci consentirà di eseguire codice sul Cloud di Google, in forma di Jupyter Notebook.
Come funziona una GAN?
Prima di procedere con i dettagli implementativi, è bene soffermarsi brevemente sul funzionamento delle GAN. Questo tipo di reti si basa su un meccanismo che, in linea di principio, dovrebbe apparire piuttosto semplice. In pratica, ogni GAN è composta da due reti neurali, l'una "in competizione" con l'altra.
Normalmente, le reti neurali vengono adoperate per ridurre le informazioni. Il classificatore MNIST ne è un ottimo esempio, dal momento che richiede 784 valori come input e ne restituisce 10.
Come possiamo vedere da questa immagine, supponendo che il triangolo verde sia il classificatore MNIST, l'immagine con la cifra 'quattro' che vediamo a sinistra e che viene passata come input alla rete ha una dimensione pari a 784 valori di grigio. Questo perchè ogni dato consiste in un'immagine di 28 × 28 pixel appiattita in una matrice con 784 valori che rappresentano l'intensità di ogni pixel. Dal momento che ci sono dieci cifre diverse da classificare (tutte quelle da 0 a 9), il classificatore restituirà un array di lunghezza pari a 10.
Facciamo adesso un ragionamento: se capovolgessimo questa rete, facendo l'opposto, ovvero espandendo i dati più piccoli in dati più grandi, potremmo dire che partendo da una cifra numerica staremmo generando un'immagine di quella stessa cifra? La risposta è sì e questo è il lavoro che svolge la GAN.
Il processo che vede il passaggio "all'indietro" di un vettore unidimensionale, che rappresenta una cifra numerica, attraverso una rete addestrata per generare un'immagine di quella cifra viene chiamato Backquery.
L'immagine precedente riassume quanto detto. È evidente, però, che esiste una certa difficoltà nel riuscire ad effettuare backquery, e questo è un problema con il quale molti ricercatori si sono trovati a dover fare i conti.
Nel 2014, Ian Goodfellow e il suo team di ricerca hanno progettato una rete neurale con un'architettura diversa da quelle viste fino a quel momento. Non si trattava di una versione con più o meno livelli rispetto alle altre reti neurali esistenti, e non utilizzava funzioni di attivazione più elaborate o tecniche di ottimizzazione più avanzate: era qualcosa di strutturalmente diverso e innovativo. Si trattava proprio di una coppia di reti neurali, il primo esempio di una GAN.
Le GAN trovano oggi numerose applicazioni pratiche in svariati ambiti, quali la generazione di dataset di immagini, foto di volti umani, paesaggi, quadri e molto altro ancora. Nelle prossime lezioni cominceremo ad addentrarci nel mondo delle GAN, cercando di capire i problemi legati alla peculiare architettura che le contraddistingue, per riuscire a risolvere il problema della generazione automatica di contenuti verosimili.