Nella scorsa lezione avevamo accennato all'intuizione di Ian Goodfellow e del suo team di ricerca, che aveva dato vita a una rete neurale con un'architettura totalmente innovativa. In questa lezione cercheremo di capire meglio come funziona questa architettura.
Adversarial Training
Consideriamo la rete neurale mostrata nella figura sottostante, che impara a distinguere le immagini che rappresentano cani da tutte le altre.
Se l'immagine inviata alla rete è un cane, il valore di output dovrebbe essere pari a 1; altrimenti, l'output dovrebbe essere pari 0. Questa architettura non è dissimile da quella adoperata per classificare il noto database MNIST (ovvero, l'enorme database di cifre scritte manualmente che vanno da 0 a 9): l'unica differenza consiste nel diverso numero di output (un singolo valore, anziché dieci). Volendo apportare una modifica alla nostra architettura, potremmo pensare di classificare le foto di cani veri dalle immagini di cani disegnati a mano.
Da un punto di vista architetturale della rete nulla è cambiato: abbiamo ancora due differenti tipologie di immagini, che il classificatore deve saper distinguere. L'intuizione consiste proprio nell'addestrare la rete neurale per separare le due tipologie di immagini. Possiamo pensare al classificatore come a un "detective". Prima di qualsiasi addestramento, il detective non sarà molto bravo a distinguere i cani veri dai cani finti. Man mano che l'addestramento progredisce, però, il detective migliorerà sempre più nell'individuazione dei falsi e quindi riuscirà meglio a separarli dai cani veri.
Questa considerazione ci porta a un'importante conclusione: se invece di fornire manualmente alla rete neurale una serie di immagini raffiguranti cani disegnati potessimo in qualche modo generarli, fornendoglieli automaticamente, eviteremmo di dover cercare, creare e predisporre un dataset di falsi positivi (cani disegnati nel nostro caso). Potremmo disegnare grazie a qualche riga di codice dei triangoli casuali per fornirli direttamente alle rete neurale, addestrandola. Per rendere però la nostra rete neurale veramente robusta nell'individuazione dei cani veri, piuttosto che qualche immagine raffigurante triangoli generati automaticamente potremmo pensare di usare un'ulteriore rete neurale, addestrata per generare immagini e capace quindi di fornirci automaticamente immagini di cani falsi. Chiamiamo questa rete generatore, che distingueremo dalla precedente (che ha essenzialmente il compito di classificare i cani veri da quelli falsi) denominata discriminatore.
Pensiamo a come potremmo addestrare la rete generatore. Potremmo adottare un comportamento di tipo reward or punish: premiamo il generatore quando ottiene un'immagine che riesce ad ingannare il discriminatore, e lo "puniamo" quando il discriminatore non viene ingannato. Questo tipo di comportamento è facilmente ottenibile per mezzo di una particolare funzione, chiamata loss function.
Dall'altro lato, il compito del discriminatore è quello di separare le immagini reali da quelle false ideate dal generatore. Se il generatore non è ben fatto, il compito del discriminatore sarà molto semplice. Ma se addestriamo efficacemente il generatore, allora esso dovrebbe migliorare nella generarazione di immagini, che assomiglieranno sempre di più a immagini reali.
Architettura delle Generative Adversarial Network
Poiché il discriminatore migliora sempre di più con l'addestramento, anche il generatore deve migliorare, poichè deve superare un discriminatore sempre più capace. Alla fine, il generatore dovrebbe risultare un ottimo falsario, riuscendo a creare immagini che sono indistinguibili da quelle reali. Il discriminatore e il generatore sono destinati a competere l'uno contro l'altro come avversari, ciascuno cercando di superare l'altro, e nel processo, entrambi migliorando sempre di più. Questa architettura è chiamata Generative Adversarial Network, o GAN.
È un'architettura intelligente, non solo perché utilizza la concorrenza per promuovere il miglioramento, ma anche perché non abbiamo bisogno di definire regole dettagliate che descrivono un'immagine reale tali da essere codificate in una loss function.
Il machine learning ci ha insegnato che non siamo molto bravi a dare vita a questa tipologia di funzioni di loss. In questo senso lasciamo che le GAN stesse imparino da sè cos'è un'immagine reale.
Problematiche
Abbiamo appena parlato, senza troppe difficoltà, di come potrebbe o dovrebbe funzionare un GAN. In realtà, la creazione di una GAN può risultare un compito parecchio difficile. Se configuriamo il generatore e il discriminatore l'uno contro l'altro, vedremo che questi si miglioreranno a vicenda solo se finemente bilanciati. Se il discriminatore comincia a discriminare le immagini vere da quelle false troppo velocemente, il generatore potrebbe non recuperare mai più questo divario. Se invece il discriminatore è troppo lento a imparare, il generatore continuerà ad essere ricompensato per la generazione di immagini di scarsa qualità.