# Rete generativa avversaria

Una rete generativa avversaria (in inglese generative adversarial network o GAN) è una classe di metodi di apprendimento automatico, introdotta per la prima volta da Ian Goodfellow, in cui due reti neurali vengono addestrate in maniera competitiva nel contesto di un gioco a somma zero. Questo tipo di framework permette alla rete neurale di apprendere come generare nuovi dati aventi la stessa distribuzione dei dati usati in fase di addestramento. Ad esempio, è possibile ottenere una rete neurale in grado di generare volti umani iperrealistici, come dimostrato nel 2018 da NVIDIA, azienda produttrice di GPU.
La rete generativa avversaria è detta anche rete antagonista generativa o rete contraddittoria generativa.

## Metodo

Nella sua versione originale, una rete generativa avversaria è composta da due componenti: un modello generativo, o generatore $G$, e un modello discriminativo, o discriminatore $D$, entrambi realizzati tramite reti neurali. Lo scopo del modello generativo è quello di produrre nuovi dati, mentre il modello discriminativo apprende come distinguere i dati reali da quelli generati artificialmente. In particolare, dato uno spazio latente ${\boldsymbol {z}}$, avente una distribuzione a priori $p_{\boldsymbol {z}}({\boldsymbol {z}})$, il generatore rappresenta una funzione differenziabile $G({\boldsymbol {z}};\theta _{g})$ che fornisce in output i nuovi dati secondo una certa distribuzione $p_{g}$, dove $\theta _{g}$ sono i parametri del modello generativo. Il discriminatore rappresenta una funzione differenziabile $D({\boldsymbol {x}};\theta _{d})$, dove $\theta _{d}$ sono i parametri del modello discriminativo, che produce in output la probabilità che ${\boldsymbol {x}}$ provenga dalla distribuzione dei dati di addestramento $p_{data}$. Lo scopo è quello di ottenere un generatore che sia un buono stimatore di $p_{data}$. Quando questo avviene, il discriminatore viene "ingannato" e non riesce più a distinguere i campioni provenienti da $p_{data}$ da quelli provenienti da $p_{g}$.
La chiave per raggiungere questa situazione è l'addestramento competitivo. La rete discriminativa viene addestrata in modo da massimizzare la probabilità di classificare correttamente i campioni provenienti dai dati di addestramento e i campioni generati. Allo stesso tempo, la rete generativa viene addestrata minimizzando
    $\log(1-D(G({\boldsymbol {z}}))$,
e massimizzando quindi la probabilità del discriminatore di considerare i campioni prodotti dalla rete generativa, ovvero ${\boldsymbol {x}}\sim p_{g}$, come provenienti da $p_{data}$.
L'apprendimento consiste quindi nell'ottimizzare un gioco minimax a due giocatori (D e G):
    $\min _{G}\max _{D}\mathbb {E} _{{\boldsymbol {x}}\sim p_{data}({\boldsymbol {x}})}[\log D({\boldsymbol {x}})]+\mathbb {E} _{{\boldsymbol {z}}\sim p_{\boldsymbol {z}}({\boldsymbol {z}})}[\log(1-D(G({\boldsymbol {z}})))]$,
che ha un ottimo globale per $p_{g}=p_{data}$.
Le due reti vengono addestrate in maniera alternata tramite retropropagazione dell'errore, mantenendo invariati i parametri del modello generativo durante l'addestramento del discriminatore e, viceversa, mantenendo invariati i parametri della rete discriminativa durante l'addestramento del generatore.

## Varianti

Negli ultimi anni si è assistito ad un rapido sviluppo di metodi che rappresentano versioni modificate del framework originale.

### Rete generativa avversaria condizionata

Una rete generativa avversaria condizionata, o in inglese conditional generative adversarial network (cGAN), è un'estensione della GAN in cui sia il generatore che il discriminatore vengono condizionati tramite l'utilizzo di qualche tipo di informazione aggiuntiva ${\boldsymbol {y}}$. La funzione obiettivo diventa:
    $\min _{G}\max _{D}\mathbb {E} _{{\boldsymbol {x}}\sim p_{data}({\boldsymbol {x}})}[\log D({\boldsymbol {x}}|{\boldsymbol {y}})]+\mathbb {E} _{{\boldsymbol {z}}\sim p_{\boldsymbol {z}}({\boldsymbol {z}})}[\log(1-D(G({\boldsymbol {z}}|{\boldsymbol {y}})))]$.
Ad esempio, è possibile generare una nuova immagine di una specifica cifra scritta a mano fornendo l'etichetta relativa alla sua classificazione, ovvero uno scalare in $[0,9]$, come input addizionale alle due reti, oppure generare automaticamente immagini di ambienti esterni a partire da un layout semantico della scena. In generale, i possibili campi applicativi ricadono nel dominio dei problemi di traduzione di un'immagine in un'altra: generazione di foto realistiche a partire da etichette semantiche, generazione di immagini aeree a partire da mappe urbane (ad esempio Google Maps), generazione di immagini realistiche a partire dai contorni della scena o da uno disegno, inpainting, e molti altri.

### VAE-GAN

Questa classe di metodi si basa sull'unione di autoencoder variazionali, o in inglese variational autoencoders (VAE), e le GAN. In generale, un discriminatore viene usato per distinguere tra gli esempi forniti in output dal VAE e quelli reali. In questo modo, invece di usare una funzione di errore definita, il discriminatore permette di apprendere una funzione di similarità tra l'esempio ricostruito in uscita dal VAE e quello fornito in input. Questo approccio fa sì che si ottengano ricostruzioni migliori rispetto al singolo VAE.

### cycleGAN

Una cycleGAN, dall'inglese cycle-consistent generative adversarial network, è un'evoluzione della rete generativa avversaria in cui l'addestramento avviene in maniera non supervisionata. In questo modo è possibile apprendere un modello capace di tradurre un'immagine da un dominio $X$ ad un altro $Y$ , e viceversa, senza dover utilizzare immagini target, spesso non disponibili, durante la fase di addestramento. Il modello è composto da due generatori $G:X\rightarrow Y$ e $F:Y\rightarrow X$ per tradurre, rispettivamente, immagini dal dominio $X$ al dominio $Y$ e viceversa, e da due discriminatori, $D_{X}$ e $D_{Y}$, per distinguere tra gli esempi generati e quelli reali per ciascun dominio. Durante l'addestramento, in aggiunta alla classica funzione obiettivo avversaria, viene minimizzata la seguente funzione di consistenza:
    ${\mathcal {L}}(G,F)=\mathbb {E} _{x\sim p_{\text{data}}(x)}\left[\|F(G(x))-x\|_{1}\right]+\mathbb {E} _{y\sim p_{\text{data}}(y)}\left[\|G(F(y))-y\|_{1}\right]$.
L'idea è che, date due immagini $x\in X$ e $y\in Y$, applicando i due generatori in cascata $F(G(x))$ e $G(F(y))$ si ottengono di nuovo le rispettive immagini $x$ e $y$. Questo tipo di modello viene applicato con successo in problemi in cui non esistono dati di addestramento accoppiati, ovvero in cui non è disponibile per ogni elemento di un dominio $X$ il suo corrispettivo nel dominio target $Y$ (es., trasferimento dello stile da un'immagine ad un'altra).

### Altre varianti

Sono presenti molte altre varianti del framework principale. In particolare, numerosi metodi si sono specializzati a seconda del dominio applicativo che differiscono sia dal punto di vista dell'architettura della rete che per la funzione obiettivo adottata durante l'addestramento. Lo sviluppo delle reti generative avversarie è avvenuta soprattutto nel campo della visione artificiale, in cui sono state fortemente impiegate sin dalla loro prima apparizione.