Modelli generativi profondi

Un modello generativo è un modo potente di imparare qualsiasi tipo di distribuzione dei dati usando l’apprendimento non supervisionato e ha raggiunto un enorme successo in pochi anni. Tutti i tipi di modelli generativi mirano ad apprendere la vera distribuzione dei dati dell’insieme di allenamento in modo da generare nuovi punti dati con alcune variazioni. Ma non è sempre possibile imparare l’esatta distribuzione dei nostri dati sia implicitamente che esplicitamente e quindi cerchiamo di modellare una distribuzione che sia il più possibile simile alla vera distribuzione dei dati. Per questo, possiamo sfruttare la potenza delle reti neurali per imparare una funzione che possa approssimare la distribuzione del modello alla vera distribuzione.

Due degli approcci più comunemente usati ed efficienti sono i Variational Autoencoders (VAE) e le Generative Adversarial Networks (GAN). VAE mira a massimizzare il limite inferiore della log-likelihood dei dati e GAN mira a raggiungere un equilibrio tra generatore e discriminatore. In questo blogpost, spiegherò il funzionamento di VAE e GAN e l’intuizione dietro di loro.

Variational Autoencoder

Presumo che il lettore abbia già familiarità con il funzionamento di un vanilla autoencoder. Sappiamo che possiamo usare un autocodificatore per codificare un’immagine di input in una rappresentazione dimensionale molto più piccola che può memorizzare informazioni latenti sulla distribuzione dei dati di input. Ma in un autocodificatore vanilla, il vettore codificato può solo essere mappato all’input corrispondente usando un decodificatore. Non può certo essere usato per generare immagini simili con una certa variabilità.

Per ottenere questo, il modello ha bisogno di imparare la distribuzione di probabilità dei dati di allenamento. VAE è uno degli approcci più popolari per imparare la distribuzione di dati complicati come le immagini utilizzando reti neurali in modo non supervisionato. Si tratta di un modello grafico probabilistico radicato nell’inferenza bayesiana, cioè il modello mira ad apprendere la distribuzione di probabilità sottostante ai dati di allenamento in modo da poter facilmente campionare nuovi dati da quella distribuzione appresa. L’idea è quella di imparare una rappresentazione latente a bassa dimensione dei dati di allenamento chiamata variabili latenti (variabili che non sono direttamente osservate ma sono piuttosto dedotte attraverso un modello matematico) che si presume abbiano generato i nostri dati di allenamento effettivi. Queste variabili latenti possono conservare informazioni utili sul tipo di output che il modello deve generare. La distribuzione di probabilità delle variabili latenti z è indicata con P(z). Una distribuzione gaussiana è selezionata come priore per imparare la distribuzione P(z) in modo da campionare facilmente nuovi punti dati durante il tempo di inferenza.

Ora l’obiettivo primario è quello di modellare i dati con alcuni parametri che massimizzano la probabilità dei dati di allenamento X. In breve, stiamo assumendo che un vettore latente a bassa dimensione abbia generato i nostri dati x (x ∈ X) e possiamo mappare questo vettore latente ai dati x usando una funzione deterministica f(z;θ) parametrizzata da theta che dobbiamo valutare (vedi fig. 1). Sotto questo processo generativo, il nostro scopo è di massimizzare la probabilità di ogni dato in X che è dato come,

Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)

Qui, f(z;θ)è stata sostituita da una distribuzione Pө(X|z).

Fig. 1. Il vettore latente mappato alla distribuzione dei dati usando il parametro ө

L’intuizione dietro questa stima di massima verosimiglianza è che se il modello può generare campioni di allenamento da queste variabili latenti allora può anche generare campioni simili con alcune variazioni. In altre parole, se campioniamo un gran numero di variabili latenti da P(z) e generiamo x da queste variabili, allora la x generata dovrebbe corrispondere alla distribuzione dei dati Pdata(x). Ora abbiamo due domande a cui dobbiamo rispondere. Come catturare la distribuzione delle variabili latenti e come integrare l’equazione 1 su tutte le dimensioni di z?

Ovviamente è un compito noioso specificare manualmente le informazioni rilevanti che vorremmo codificare nel vettore latente per generare l’immagine di uscita. Piuttosto ci affidiamo alle reti neurali per calcolare z solo con l’assunzione che questo vettore latente possa essere ben approssimato come una distribuzione normale in modo da campionare facilmente al momento dell’inferenza. Se abbiamo una distribuzione normale di z in uno spazio n dimensionale, allora è sempre possibile generare qualsiasi tipo di distribuzione usando una funzione sufficientemente complicata e l’inverso di questa funzione può essere usato per imparare le variabili latenti stesse.

Nell’equazione 1, l’integrazione viene effettuata su tutte le dimensioni di z ed è quindi intrattabile. Tuttavia, può essere calcolata usando metodi di integrazione Monte-Carlo che è qualcosa di non facile da implementare. Quindi seguiamo un altro approccio per massimizzare approssimativamente Pө(X) nell’equazione 1. L’idea di VAE è di dedurre P(z) usando P(z|X) che non conosciamo. Noi deduciamo P(z|X) usando un metodo chiamato inferenza variazionale che è fondamentalmente un problema di ottimizzazione nella statistica bayesiana. Prima modelliamo P(z|X) usando una distribuzione più semplice Q(z|X) che è facile da trovare e cerchiamo di minimizzare la differenza tra P(z|X) e Q(z|X) usando l’approccio della metrica KL-divergenza in modo che la nostra ipotesi sia vicina alla distribuzione vera. Questo è seguito da un sacco di equazioni matematiche che non spiegherò qui ma che potete trovare nel documento originale. Ma devo dire che queste equazioni non sono molto difficili da capire una volta che si ottiene l’intuizione dietro VAE.

La funzione obiettivo finale di VAE è :-

L’equazione sopra ha una interpretazione molto bella. Il termine Q(z|X) è fondamentalmente la nostra rete di codifica, z è la nostra rappresentazione codificata dei dati x(x ∈ X) e P(X|z) è la nostra rete di decodifica. Così nell’equazione di cui sopra il nostro obiettivo è quello di massimizzare la log-likelihood della nostra distribuzione dei dati sotto un certo errore dato da D_KL. Si può facilmente vedere che VAE sta cercando di minimizzare il limite inferiore di log(P(X)) poiché P(z|X) non è trattabile ma il termine di divergenza KL è >=0. Questo è uguale a massimizzare E e minimizzare D_KL. Sappiamo che la massimizzazione di E è una stima di massima verosimiglianza ed è modellata usando una rete di decodifica. Come ho detto prima, vogliamo che la nostra rappresentazione latente sia vicina alla gaussiana e quindi assumiamo P(z) come N(0, 1). Seguendo questa assunzione, anche Q(z|X) dovrebbe essere vicino a questa distribuzione. Se assumiamo che sia una gaussiana con parametri μ(X) e Ʃ(X), l’errore dovuto alla differenza tra queste due distribuzioni cioè, P(z) e Q(z|X) data dalla divergenza KL risulta in una soluzione in forma chiusa data di seguito.

Considerando che stiamo ottimizzando il limite variazionale inferiore, la nostra funzione di ottimizzazione è :

log(P(X|z)) – D_KL, dove la soluzione del secondo è mostrata sopra.

Quindi, la nostra funzione di perdita conterrà due termini. Il primo è la perdita di ricostruzione dell’ingresso all’uscita e la seconda perdita è il termine di divergenza KL. Ora possiamo addestrare la rete usando l’algoritmo di backpropagation. Ma c’è un problema e cioè il primo termine non dipende solo dai parametri di P ma anche dai parametri di Q ma questa dipendenza non appare nell’equazione di cui sopra. Quindi come fare il backpropagate attraverso lo strato in cui stiamo campionando z in modo casuale dalla distribuzione Q(z|X) o N in modo che P possa decodificare. I gradienti non possono fluire attraverso nodi casuali. Usiamo il trucco della riparametrizzazione (vedi fig.) per rendere la rete differenziabile. Campioniamo da N(μ(X), Σ(X)) campionando prima ε ∼ N(0, I), poi calcolando z=μ(X) + Σ1/2(X)∗ε.

Questo è stato mostrato molto bene nella figura 2 ? . Va notato che il passo di feedforward è identico per entrambe queste reti (sinistra & destra) ma i gradienti possono solo retroagire attraverso la rete destra.

Fig.2. Al momento dell’inferenza, possiamo semplicemente campionare z da N(0, 1) e darlo in pasto alla rete di decodifica per generare un nuovo punto dati. Poiché stiamo ottimizzando il limite variazionale inferiore, la qualità dell’immagine generata è un po’ scarsa rispetto alle tecniche più avanzate come le Reti Generative Adversariali.

La cosa migliore di VAE è che impara sia il modello generativo che un modello di inferenza. Anche se sia VAE che GAN sono approcci molto eccitanti per imparare la distribuzione dei dati sottostanti usando l’apprendimento non supervisionato, le GAN danno risultati migliori rispetto alle VAE. In VAE, ottimizziamo il limite variazionale inferiore mentre in GAN, non c’è tale presupposto. Infatti, le GAN non hanno a che fare con alcuna stima esplicita della densità di probabilità. Il fallimento di VAE nel generare immagini nitide implica che il modello non è in grado di imparare la vera distribuzione posteriore. VAE e GAN differiscono principalmente nel modo di addestramento. Immergiamoci ora nelle Reti Adversariali Generative.

Reti Adversariali Generative

Yann LeCun dice che l’addestramento adversariale è la cosa più cool dopo il pane affettato. Vedendo la popolarità delle Reti Adversariali Generative e la qualità dei risultati che producono, penso che la maggior parte di noi sia d’accordo con lui. L’addestramento avversario ha cambiato completamente il modo in cui insegniamo alle reti neurali a fare un compito specifico. Le Generative Adversarial Networks non lavorano con una stima esplicita della densità come gli Autoencoder Variazionali. Invece, si basa sull’approccio della teoria dei giochi con l’obiettivo di trovare l’equilibrio di Nash tra le due reti, Generator e Discriminator. L’idea è di campionare da una distribuzione semplice come quella gaussiana e poi imparare a trasformare questo rumore in una distribuzione di dati usando approssimatori di funzioni universali come le reti neurali.

Questo si ottiene con un addestramento avversario di queste due reti. Un modello generatore G impara a catturare la distribuzione dei dati e un modello discriminatore D stima la probabilità che un campione provenga dalla distribuzione dei dati piuttosto che dalla distribuzione del modello. Fondamentalmente il compito del generatore è quello di generare immagini dall’aspetto naturale e il compito del discriminatore è quello di decidere se l’immagine è falsa o reale. Questo può essere pensato come un gioco mini-max a due giocatori dove le prestazioni di entrambe le reti migliorano nel tempo. In questo gioco, il generatore cerca di ingannare il discriminatore generando immagini reali per quanto possibile e il generatore cerca di non farsi ingannare dal discriminatore migliorando la sua capacità discriminativa. L’immagine seguente mostra l’architettura di base del GAN.

Fig.3. Si definisce una priorità sulle variabili di rumore in ingresso P(z) e poi il generatore la mappa alla distribuzione dei dati usando una funzione complessa differenziabile con parametri өg. Oltre a questo, abbiamo un’altra rete chiamata Discriminatore che prende in input x e usando un’altra funzione differenziabile con parametri өd produce un singolo valore scalare che denota la probabilità che x provenga dalla vera distribuzione dei dati Pdata(x). La funzione obiettivo del GAN è definita come

Nell’equazione di cui sopra, se l’input al discriminatore proviene dalla vera distribuzione dei dati, allora D(x) dovrebbe produrre 1 per massimizzare la funzione obiettivo di cui sopra cont D mentre se l’immagine è stata generata dal generatore allora D(G(z)) dovrebbe dare 1 per minimizzare la funzione obiettivo w.r.t G. Quest’ultimo implica fondamentalmente che G dovrebbe generare immagini così realistiche che possono ingannare D. Massimizziamo la funzione di cui sopra w.r.t parametri del discriminatore usando Gradient Ascent e minimizziamo la stessa w.r.t parametri del generatore usando Gradient Descent. Ma c’è un problema nell’ottimizzazione dell’obiettivo del generatore. All’inizio del gioco, quando il generatore non ha imparato nulla, il gradiente è di solito molto piccolo e quando sta facendo molto bene, i gradienti sono molto alti (vedi Fig. 4). Ma noi vogliamo il comportamento opposto. Quindi massimizziamo E piuttosto che minimizzare E

Fig.4. Costo per il generatore in funzione della risposta del discriminatore sull’immagine generata

Il processo di addestramento consiste nell’applicazione simultanea di Stochastic Gradient Descent sul discriminatore e sul generatore. Durante l’addestramento, si alternano k passi di ottimizzazione di D e un passo di ottimizzazione di G sul mini-batch. Il processo di addestramento si ferma quando il Discriminatore non è in grado di distinguere ρg e ρdata, cioè D(x, өd) = ½ o quando ρg = ρdata.

Uno dei primi modelli di GAN che impiega la Rete Neurale Convoluzionale è DCGAN che sta per Deep Convolutional Generative Adversarial Networks. Questa rete prende come input 100 numeri casuali tratti da una distribuzione uniforme e produce un’immagine della forma desiderata. La rete consiste di molti strati convoluzionali, deconvoluzionali e completamente connessi. La rete usa molti strati deconvolutivi per mappare il rumore in ingresso all’immagine di uscita desiderata. La normalizzazione batch è usata per stabilizzare l’addestramento della rete. L’attivazione ReLU è usata nel generatore per tutti gli strati eccetto lo strato di uscita che usa lo strato tanh e Leaky ReLU è usato per tutti gli strati nel Discriminatore. Questa rete è stata addestrata usando la discesa del gradiente stocastico mini-batch e l’ottimizzatore Adam è stato usato per accelerare l’addestramento con iperparametri sintonizzati. I risultati dell’articolo sono stati piuttosto interessanti. Gli autori hanno mostrato che i generatori hanno interessanti proprietà aritmetiche vettoriali con cui possiamo manipolare le immagini nel modo che vogliamo.

Fig.5. Generatore di DCGAN

Fig.6. Discriminatore di DCGAN

Una delle varianti di GAN più usate è la GAN condizionale che è costruita semplicemente aggiungendo il vettore condizionale insieme al vettore rumore (vedi Fig. 7). Prima di cGAN, stavamo generando immagini in modo casuale da campioni casuali di rumore z. Cosa succede se vogliamo generare un’immagine con alcune caratteristiche desiderate. C’è un modo per fornire questa informazione extra al modello in qualsiasi modo su quale tipo di immagine vogliamo generare? La risposta è sì e il GAN condizionale è il modo per farlo. Condizionando il modello su informazioni aggiuntive che vengono fornite sia al generatore che al discriminatore, è possibile dirigere il processo di generazione dei dati. Le GAN condizionali sono utilizzate in una varietà di compiti come la generazione da testo a immagine, la traduzione da immagine a immagine, il tagging automatico delle immagini, ecc. Una struttura unificata di entrambe le reti è stata mostrata nel diagramma sottostante.

Fig. 7. Un esempio base di cGAN con y come vettore di condizionamento

Una delle cose belle delle GAN è che possono essere addestrate anche con piccoli dati di allenamento. In effetti, i risultati delle GAN sono promettenti, ma la procedura di addestramento non è banale, in particolare l’impostazione degli iperparametri della rete. Inoltre, le GAN sono difficili da ottimizzare perché non convergono facilmente. Naturalmente ci sono alcuni suggerimenti e trucchi per hackerare le GAN, ma non sempre possono aiutare. Potete trovare alcuni di questi suggerimenti qui. Inoltre, non abbiamo alcun criterio per la valutazione quantitativa dei risultati, tranne che per controllare se le immagini generate sono percettivamente realistiche o meno.

Conclusione

I modelli di deep learning stanno davvero raggiungendo prestazioni di livello umano nell’apprendimento supervisionato ma lo stesso non è vero per l’apprendimento non supervisionato. Tuttavia, gli scienziati del deep learning stanno lavorando duramente per migliorare le prestazioni dei modelli non supervisionati. In questo blogpost, abbiamo visto come funzionano due dei più famosi framework di apprendimento non supervisionato dei modelli generativi. Abbiamo conosciuto i problemi degli autocodificatori variazionali e perché le reti adversariali sono migliori nel produrre immagini realistiche. Ma ci sono problemi con le GAN come la stabilizzazione del loro addestramento che è ancora un’area attiva di ricerca. Tuttavia le GAN sono davvero potenti e attualmente vengono utilizzate in una varietà di compiti come la generazione di immagini (vedi questo video) e video di alta qualità, la traduzione da testo a immagine, il miglioramento delle immagini, la ricostruzione di modelli 3D di oggetti da immagini, la generazione di musica, la scoperta di farmaci contro il cancro ecc. Oltre a questo, molti ricercatori di deep learning stanno anche lavorando per unificare questi due modelli e per ottenere il meglio di entrambi. Vedendo il crescente tasso di avanzamento del Deep Learning, credo che i GAN apriranno molte porte chiuse dell’intelligenza artificiale come l’apprendimento semi-supervisionato e il Reinforcement Learning. Nei prossimi anni, i modelli generativi saranno molto utili per la progettazione grafica, la progettazione di interfacce utente attraenti, ecc. Potrebbe anche essere possibile generare testi in linguaggio naturale usando Reti Generative Adversariali.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.