Negli ultimi anni, l’intelligenza artificiale ha fatto passi da gigante nel campo della generazione di contenuti creativi, come immagini e testo, uno dei modelli più innovativi e interessanti in questo ambito è il modello a diffusione, che differisce dal modello GAN (Generative Adversarial Networks) che sono note per la loro capacità di generare immagini di alta qualità e realistiche, spesso indistinguibili dalle immagini reali, grazie al meccanismo di apprendimento basato sulla competizione tra il generatore e il discriminatore, che spinge il generatore a produrre immagini sempre più realistiche nel tentativo di ingannare il discriminatore.
I modelli a diffusione, come Stable Diffusion, DALL-E, IMAGEN e tanti altri, possono offrire maggiore controllo sulla generazione delle immagini, poiché è possibile manipolare direttamente lo spazio latente o applicare condizioni specifiche durante il processo di generazione e ciò può essere utile per generare immagini con determinate caratteristiche o stili.
Comprendere il processo di “diffusione” nei dettagli
In questo articolo andremo a semplificare al massimo per poter lasciare una nozione nel lettore, poiché dietro ogni passaggio ci sono complessità algoritmiche e matematiche non di poco conto.
Quindi partiamo dal concetto di “diffusione”, in sintesi, questa rappresenta il processo di trasformazione progressiva di un vettore latente in un’immagine attraverso una serie di passaggi, consentendo al modello di generare immagini realistiche e dettagliate a partire da descrizioni testuali.
Il ruolo del vettore latente nel modello a diffusione
Ma cos’è un vettore latente?
Il termine “vettore latente” si riferisce a un vettore di numeri reali che rappresenta in modo astratto una qualche forma di informazione nascosta o latente all’interno di un sistema, in sostanza si crea un’immagine non intellegibile dagli esseri umani, un’immagine rumorosa, tipo la nebbiolina che si vedeva sulle vecchie TV analogiche.
Adesso immaginiamo di chiedere al modello di generare un’immagine da un prompt di testo, tipo: “un gatto ed una mela”
Il prompt subirà tutte le trasformazioni tipiche dei processi di NLP (Natural Language Processing), quindi sarà trasformato in vettori di embeddings, ossia rappresentazioni numeriche delle parole, pertanto:
gatto sarà [1.5,0.8,0.2,0] e la mela sarà [0.3,1,0.6,1.2], chiaramente i vettori di embeddings sono molto più complessi e lunghi, perché hanno varie componenti per le relazioni semantiche tra le varie parole (tokens).
Il modello a diffusione prende il vettore di embeddings creato dalle parole “gatto” e “mela” e lo utilizza come input per iniziare il processo di generazione dell’immagine.
Questo vettore latente viene trasformato in una prima immagine rumorosa e casuale attraverso una serie di passaggi di “diffusione”.
Figura 1 – Illustrazione del processo di diffusione. Fonte: NVIDIA Developer. Noising: aggiunta del rumore e Denoising: rimozione del rumore
Successivamente, il modello applica un processo inverso di “denoising” per rimuovere gradualmente il rumore e far emergere la struttura dell’immagine finale, questo processo di denoising è guidato da una rete neurale chiamata U-Net, che impara a mappare l’immagine rumorosa all’immagine finale dettagliata.
Figura 2 – Panoramica dell’architettura di U-Net. Fonte: U-Net’s research paper.
La U-Net è una rete neurale convoluzionale che cattura le informazioni a diverse scale spaziali, permettendo di ricostruire i dettagli dell’immagine a partire dalla rappresentazione iniziale rumorosa ed è in grado di riconoscere gli oggetti specifici come un gatto e una mela, grazie all’apprendimento effettuato durante l’addestramento del modello su vasti dataset di immagini etichettate.
Quindi, partendo dal vettore di embeddings delle parole “gatto” e “mela”, il modello a diffusione genera una prima immagine casuale, che viene poi progressivamente raffinata dalla U-Net per produrre l’immagine finale dettagliata contenente un gatto e una mela.
Il modello a diffusione condizionata
Il modello a diffusione basato sulla diffusione condizionata (Conditioned diffusion) è un approccio che consente di generare immagini dettagliate e realistiche a partire da descrizioni testuali, come nel caso dell’esempio del “gatto ed una mela“.
In questo contesto, la diffusione condizionata si riferisce alla capacità del modello di incorporare condizioni specifiche durante il processo di generazione delle immagini, le condizioni possono essere informazioni aggiuntive fornite al modello insieme al prompt di testo, che guidano la generazione dell’immagine finale in modo più preciso e controllato.
La guida al classificatore (Classifier guidance)
La guida al classificatore (Classifier guidance) è un aspetto cruciale di questo processo.
Il classificatore, all’interno del modello, svolge il ruolo di valutare la qualità e la coerenza dell’immagine generata rispetto alla descrizione testuale iniziale ed inoltre aiuta a garantire che l’immagine prodotta sia coerente con il prompt di testo e rispecchi le informazioni fornite. La guida al classificatore consiste nel fornire feedback al modello durante il processo di generazione, indicando se l’immagine in corso di creazione rispetta le condizioni specifiche imposte o se necessita di ulteriori aggiustamenti per migliorare la sua coerenza con il testo di partenza.
In questo modo, il modello a diffusione basato sulla diffusione condizionata può generare immagini più personalizzate e aderenti alle specifiche richieste, grazie alla guida fornita dal classificatore durante il processo di creazione delle immagini.
Un esempio numerico del processo di generazione di un’immagine
Facciamo un esempio numerico del processo di generazione di un’immagine a partire dal prompt “un gatto ed una mela” utilizzando un modello di diffusione:
1. Inizializzazione: partiamo dai vettori embeddings per “gatto” ([0,1,1]) e “mela” ([1,0,1]).
2. Diffusione (Aggiunta di rumore): aggiungiamo rumore progressivamente ai vettori per trasformarli in uno spazio latente. Supponiamo che il rumore sia rappresentato dal vettore ([0.5, 0.5, 0.5]) e lo aggiungiamo ai nostri embeddings:
– Gatto con rumore: ([0,1,1]) + ([0.5, 0.5, 0.5]) = ([0.5, 1.5, 1.5])
– Mela con rumore: ([1,0,1]) + ([0.5, 0.5, 0.5]) = ([1.5, 0.5, 1.5])
La rappresentazione del rumore come semplice vettore ([0.5, 0.5, 0.5]) è un’eccessiva semplificazione, in realtà, il rumore nei modelli a diffusione è generato da distribuzioni di probabilità complesse che catturano la variabilità casuale in modo più realistico.
Spazio latente: un contenitore di informazioni nascoste
3. Spazio Latente: è una rappresentazione vettoriale di dimensione inferiore rispetto al vettore di embeddings del prompt che codifica le caratteristiche essenziali delle immagini, ottenuta attraverso un processo di codifica che coinvolge tipicamente un autocodificatore variazionale (VAE).
Questo spazio è ciò che il modello utilizzerà per imparare a generare nuove immagini. – L’immagine risultante è indistinta e poco chiara (rumorosa), rappresentando concettualmente “un gatto ed una mela” in modo molto astratto.
La riduzione della dimensionalità è un aspetto fondamentale del processo di codifica, essa permette di comprimere le informazioni del prompt testuale, mantenendo solo le caratteristiche essenziali per la generazione dell’immagine e riduce la complessità del modello e ne migliora l’efficienza computazionale.
Inoltre, favorisce la generalizzazione del modello, permettendogli di generare immagini coerenti con il prompt anche in presenza di variabilità o ambiguità nel testo.
Esempio:
Un prompt testuale come “un gatto che gioca con un gomitolo di lana“, potrebbe generare un vettore di embeddings che potrebbe avere centinaia o addirittura migliaia di dimensioni, codificando informazioni dettagliate sul significato del testo.
Lo spazio latente, invece, potrebbe avere una dimensione di poche decine o centinaia di unità, catturando le caratteristiche essenziali come la forma del gatto, la presenza del gomitolo e l’azione del gioco.
In sintesi:
Lo spazio latente è di dimensioni inferiori rispetto a un’immagine ipotetica generata dal prompt, non rispetto a un’immagine originale effettivamente esistente.
La riduzione di dimensionalità è fondamentale per la codifica efficiente del prompt e la generazione di immagini coerenti.
Generazione dell’immagine finale: il processo di “denoising”
4. Processo di denoising e generazione dell’immagine finale:
Il processo di denoising avviene nello spazio latente, guidato dal vettore latente e dai vettori di embeddings di “gatto” e “mela”.
Il modello confronta iterativamente l’immagine rumorosa con lo spazio latente e modifica il vettore latente per far emergere gradualmente le caratteristiche desiderate.
Una volta ottenuto un’immagine a bassa risoluzione dal processo di denoising, la rete neurale U-Net entra in gioco. La U-Net prende l’immagine a bassa risoluzione e la trasforma in un’immagine finale ad alta definizione e ricca di dettagli.
Il modello ha imparato durante l’addestramento a comprendere le relazioni tra le caratteristiche visive e il rumore, permettendo al modello di ricostruire l’immagine originale minimizzando la quantità di rumore presente ed utilizza la rete neurale U-Net per predire il rumore che è stato aggiunto e sottrarlo per recuperare i dati originali.
5. Generazione: compare una versione raffinata dell’immagine originale in cui le caratteristiche desiderate (gatto e mela) sono state fatte emergere e il rumore è stato minimizzato, il modello può ora generare le immagini corrispondenti ed utilizza i vettori come input per una rete generativa che produce l’immagine finale.
6. Confronto e Apprendimento: Durante l’addestramento, il modello confronta le immagini generate con le rappresentazioni latenti di immagini reali o con metriche di valutazione specifiche per la qualità dell’immagine e aggiusta i suoi parametri per migliorare la qualità delle generazioni future.
L’immagine finale risulta coerente con il prompt di testo “un gatto ed una mela“.
Questo processo trasforma il prompt testuale e gli embeddings associati in un’immagine dettagliata e realistica che rappresenta il concetto richiesto.
In pratica, il processo è molto più complesso e coinvolge algoritmi avanzati per gestire il rumore e la generazione delle immagini, qui abbiamo fornito una visione semplificata di come funziona un modello a diffusione.
La fusione delle immagini attraverso l’apprendimento congiunto
La fusione di due immagini, come quella di un gatto e una mela, in un modello a diffusione segue un processo di “apprendimento e generazione”.
Apprendimento congiunto
Durante l’addestramento, il modello impara a rappresentare sia i gatti che le mele nello stesso spazio latente, questo significa che il modello capisce come sono fatti sia i gatti che le mele e quali caratteristiche li rendono unici.
Creazione dello spazio latente combinato
Quando il modello riceve i vettori per “gatto” e “mela”, crea un nuovo vettore latente che combina le caratteristiche di entrambi. Questo può essere fatto in diversi modi, come ad esempio attraverso una media ponderata dei vettori o utilizzando tecniche più complesse come l’autoencoder variazionale.
Generazione con rumore controllato
Il modello aggiunge rumore al vettore latente combinato in modo controllato, seguendo il processo inverso di rimozione del rumore che ha imparato durante l’addestramento.
Rimozione del rumore e rifinimento
Il modello inizia a rimuovere il rumore, rifinendo progressivamente il vettore latente fino a quando non emerge un’immagine chiara che rappresenta sia il gatto che la mela.
Output dell’immagine fusa
Alla fine del processo, il modello genera un’immagine che fonde le caratteristiche di un gatto e di una mela, che potrebbe risultare in un’immagine di un gatto che guarda una mela o in una composizione artistica che combina elementi di entrambi.
Questo processo è altamente semplificato e in realtà richiede un modello complesso e un grande volume di dati per l’addestramento, inoltre, la qualità dell’immagine generata dipenderà dalla capacità del modello di apprendere e generare dati coerenti con gli input ricevuti.
Esempio pratico: generazione di immagini a partire da un prompt testuale
1. Il prompt testuale “un gatto ed una mela” viene convertito in vettori di embeddings.
2. Questi vettori di embeddings vengono combinati per creare un vettore latente iniziale, che rappresenta in modo astratto le informazioni del prompt.
3. Il vettore latente iniziale viene utilizzato per generare una prima immagine rumorosa e casuale attraverso il processo di “diffusione“.
4. Questa immagine rumorosa viene confrontata con i vettori latenti nello spazio latente ( latent space), che rappresenta una struttura matematica che codifica le relazioni tra le caratteristiche visive delle immagini utilizzate per l’addestramento e il rumore applicato durante il processo di diffusione.
5. Sulla base di questo confronto, il modello inizia il processo di “denoising” per rimuovere gradualmente il rumore e far emergere gli oggetti specifici, come il gatto e la mela.
6. Questa immagine a bassa risoluzione generata dal processo di denoising viene poi passata alla rete U-Net, che la trasforma in un’immagine finale ad alta definizione e dettagliata.
Ma soffermiamoci ancora un po’ sul concetto di vettore latente e spazio latente:
1. Vettore latente:
Un vettore latente è una rappresentazione numerica di dimensione inferiore che codifica le caratteristiche essenziali di un’immagine o di un dato.
È come una descrizione concisa e astratta delle informazioni più importanti, nel contesto dei modelli a diffusione, il vettore latente viene ottenuto attraverso un processo di codifica del prompt testuale o di un’immagine di input e contiene le informazioni chiave che il modello utilizzerà per generare o ricostruire l’immagine.
2. Spazio latente:
Lo spazio latente è uno spazio matematico di dimensione inferiore in cui vengono rappresentati i vettori latenti.
Si può immaginare come una sorta di “contenitore” che racchiude tutte le possibili rappresentazioni latenti di immagini o dati.
Nel caso dei modelli a diffusione, lo spazio latente è costruito durante il processo di addestramento del modello e contiene informazioni statistiche sulle relazioni tra le caratteristiche visive delle immagini utilizzate per l’addestramento e il rumore applicato durante il processo di diffusione.
In parole semplici:
Il vettore latente è come un punto nello spazio latente.
Lo spazio latente è come l’insieme di tutti i punti possibili, dove ogni punto rappresenta un’immagine o un dato in modo astratto.
Esempio:
Se immaginiamo lo spazio latente come una mappa bidimensionale, dove ogni punto rappresenta un gatto, ogni gatto avrà un suo vettore latente unico che codifica le sue caratteristiche specifiche, come la forma del viso, il colore del pelo e la posizione delle zampe.
Lo spazio latente racchiude tutti i possibili vettori latenti per gatti, permettendo al modello di generare immagini di gatti con caratteristiche diverse.
In sostanza, il vettore latente, che è una rappresentazione numerica specifica, e lo spazio latente, che è lo spazio matematico in cui i vettori latenti sono rappresentati.
Conclusioni
Spero di esser riuscito a rendere chiaro e semplice un sistema veramente complesso e non di immediata comprensione o intuizione, ho semplificato e banalizzato molto, ma ho ritenuto utile cercare di fornire uno spiraglio, una sbirciatina a ciò che sembra magia o stregoneria e che tutti noi stiamo usando con disinvoltura e curiosità e che suscita sempre quel senso di stupore e meraviglia quando riusciamo a visualizzare un nostro pensiero in un’immagine.