Lo spazio latente: Stable Diffusion#
Il 22 agosto 2022 compare online un file da circa quattro gigabyte. Dentro ci sono i pesi di Stable Diffusion, un modello che disegna un’immagine a partire da una frase scritta: i pesi sono i milioni di numeri che una rete si ritrova dentro dopo l’addestramento, cioè tutto quello che ha imparato, e averli vuol dire avere il modello. È nato dai latent diffusion models del gruppo di Björn Ommer all’Università Ludwig Maximilian di Monaco [RBL+22], sviluppato con Runway e addestrato con la potenza di calcolo di Stability AI. La novità non è la qualità delle immagini (DALL·E 2 e Imagen, usciti pochi mesi prima, erano già impressionanti) ma le condizioni: quei modelli vivevano nei data center dei loro proprietari, accessibili con il contagocce dietro liste d’attesa e interfacce controllate. Stable Diffusion invece si scarica. Chiunque, gratis, può metterlo sul proprio computer, e per farlo girare basta la GPU di un computer da videogiochi, cioè il processore grafico, quel pezzo che nei giochi disegna le immagini a schermo e che qui fa i conti del modello. Nel giro di poche settimane i forum si riempiono di immagini, spuntano interfacce grafiche amatoriali, plugin per Photoshop e Blender, versioni modificate per ogni gusto. La generazione di immagini smette di essere una demo da guardare e diventa uno strumento da usare.
La domanda è: che cosa lo rende possibile tecnicamente? Non un modello più grande: al contrario, uno più piccolo. Il segreto è un trasloco: la diffusione che conosciamo fa le valigie, lascia i pixel e si trasferisce in uno spazio compresso, decine di volte più piccolo, dove ogni passo di pulitura costa una frazione. Conviene dire subito in che moneta si paga, perché in tutta la sezione parleremo di costi: si paga in conti da fare, cioè in secondi di attesa e in memoria occupata sulla GPU. Meno numeri da elaborare, meno conti, meno attesa.
Il traslocatore è una rete a sé, diversa da quella che toglie il rumore, e la conosciamo già: è il variational autoencoder del capitolo sui modelli latenti, che la sezione sull’ELBO deriva per intero. Qui lo riprendiamo solo per quello che serve al trasloco, cioè per il mestiere che gli si chiede in questa catena di montaggio, che non è quello per cui di solito lo si costruisce.
Il prezzo dei pixel#
Facciamo due conti. Nella sezione su come funziona la diffusione un’immagine era una griglia di numeri, uno per pixel, perché la guardavamo in bianco e nero. A colori i numeri per pixel diventano tre, uno per ciascuno dei colori con cui uno schermo compone tutti gli altri (rosso, verde, blu). Un’immagine a colori di \(512 \times 512\) pixel è fatta quindi di \(512 \times 512 \times 3 = 786\,432\) numeri. Il restauratore (la U-Net [RFB15] che predice il rumore) deve elaborarli tutti, e deve farlo a ogni passo di pulitura: centinaia o migliaia di passaggi per una sola immagine. Con le centinaia di macchine di un laboratorio si può fare; su un computer di casa no.
Ed è uno spreco, per una ragione precisa: la maggior parte di quei 786.432 numeri non descrive che cosa c’è nell’immagine, ma dettagli percettivi (la grana dell’intonaco, il micro-rumore del sensore, la trama del pelo). La compressione JPEG campa su questo da trent’anni: butta via gran parte dei bit e l’occhio quasi non se ne accorge. Un modello di diffusione che lavora sui pixel spende quindi la parte del leone del suo sforzo a modellare dettagli ad alta frequenza (i dettagli piccolissimi, quelli che cambiano da un pixel al suo vicino) che contano poco, e solo una frazione a decidere le cose importanti: dov’è il gatto, dov’è il muro, da che parte arriva la luce.
L’idea di Robin Rombach, Björn Ommer e colleghi [RBL+22] è dividere il lavoro tra due specialisti. Una prima rete impara la compressione percettiva: trasforma i pixel in una rappresentazione compatta che conserva il contenuto e scarta il dettaglio ricostruibile. La diffusione, poi, impara la composizione dentro quello spazio compatto, dove ogni passo costa decine di volte meno.
Quello spazio compatto ha un nome, ed è già comparso nella sezione sui codec neurali: si chiama spazio latente, cioè l’insieme dei riassunti che una rete si costruisce da sola, «latenti» perché nessuno le ha insegnato come farli e a guardarli non dicono niente. Là dentro c’era del suono, qui ci sono immagini; e cambia soprattutto che cosa ci si fa. Per un codec quello spazio è un corridoio: ci si entra da una parte per comprimere e si esce dall’altra. Qui invece ci si va ad abitare, perché è lì che avverrà tutta la diffusione. La ricetta si chiama infatti dei latent diffusion models, e Stable Diffusion ne è il figlio famoso.
L’archivista: il variational autoencoder#
Il pezzo che porta i mobili è il variational autoencoder (VAE) di Diederik Kingma e Max Welling [KW14], del 2014, quindi più vecchio della diffusione moderna e persino delle GAN. Con lui viene anche la metafora del capitolo sui modelli latenti, che qui accompagna il resto del capitolo: la rete che comprime è un archivista e la rappresentazione compatta che scrive è la sua scheda; la rete che ricostruisce è un copista, che dalla scheda ridipinge il quadro. Da qui in avanti «scheda» vorrà dire sempre e solo questo.
Di quel capitolo qui serve una cosa sola, ed è la differenza fra la clessidra semplice e la sua variante: la clessidra impara a comprimere e nient’altro, perché il suo unico voto è quanto la copia somiglia all’originale, e in quello spazio non si può pescare. Il VAE aggiunge il poco che serve, cioè una scheda scritta con un margine di tolleranza e la regola che tiene tutte le schede raccolte attorno a uno stesso centro. È quel poco a rendere lo spazio latente un posto dove la diffusione può lavorare.
Fig. 26.6 La rete che comprime non restituisce una scheda sola, ma una scheda e un margine di tolleranza: «all’incirca questo, più o meno tanto». È quel margine la trovata, ed è ciò che costringe schede vicine a ridiventare immagini simili. (Sulla scheda il disegno mette i nomi tecnici: \(\mu\) è il valore scritto, \(\sigma\) il margine di tolleranza, e il pallino nero il punto sorteggiato dentro quel margine. La scheda, quindi, è la coppia: il valore e il margine.)#
La Fig. 26.6 dà per scontata una cosa da fissare. Una scheda è una lista di numeri, e come tale si può immaginare come un punto su una mappa. Non più la mappa delle immagini possibili, dove ogni punto era una fotografia intera: quella delle schede, fatta allo stesso modo e con molte meno direzioni. Schede simili sono punti vicini, e fra due punti c’è sempre tutto lo spazio in mezzo. È quello che permette di dire frasi come «una scheda a metà strada fra due che esistono», che con dei foglietti di carta non vorrebbero dire niente.
Sulla mappa si rivede in un colpo d’occhio quello che il capitolo sui modelli latenti ha misurato. Un archivista senza margine di tolleranza comprime e ricostruisce benissimo, e a inventare non serve, perché nessuno ha mai chiesto alle sue schede di stare in una zona precisa: si sistemano dove capita, e in mezzo restano dei vuoti in cui il copista non ha mai messo piede. I due tratti che il VAE aggiunge alla clessidra rimediano uno per volta. Il sorteggio dentro il margine (è il pallino in mezzo alla figura) fa sì che in addestramento il copista veda ogni volta una scheda leggermente spostata, quindi lo costringe a funzionare su tutta una zona invece che su un punto, e toglie i vuoti; la regola che tiene le schede raccolte attorno a uno stesso centro dice dove pescare. Insieme fanno di quello spazio un posto in cui la diffusione può abitare, dato che la diffusione, di suo, passa il tempo a mettere piede in posti sorteggiati a caso.
L’archivista del museo è la clessidra dei modelli latenti, la stessa che nei codec neurali comprimeva il suono, qui con due mestieri al posto delle due metà: per ogni quadro l’archivista scrive una scheda molto più piccola dell’originale, e il copista deve ridipingere il quadro leggendo solo quella. Se la copia somiglia all’originale la scheda conteneva l’essenziale, e i due si allenano insieme perché una scheda è buona o cattiva solo rispetto a chi la deve leggere.
Dopo milioni di prove su milioni di quadri, l’archivista ha imparato da solo che cosa annotare (soggetto, composizione, colori dominanti) e che cosa lasciar perdere: la grana della tela, le singole pennellate dello sfondo. Non perché il copista se le ricordi, ma perché se le inventa, e una grana di tela vale l’altra.
Nei numeri di Stable Diffusion: il quadro è fatto di 786.432 valori, la scheda di 16.384, quarantotto volte meno. Quel 16.384 esce da una scelta di progetto: la scheda è una griglia di 64 caselle per lato invece delle 512 dell’immagine (otto volte meno per lato) con quattro numeri per casella, e \(64 \times 64 \times 4\) fa appunto 16.384.
La compressione però distrugge, e quello che l’archivista non ha annotato non lo recupera più nessuno: la scheda è il soffitto della qualità finale. Quattro numeri per casella bastano per un gatto su un muro e non bastano per una scritta leggibile, per un volto in secondo piano o per una mano con cinque dita: se il copista si inventa la grana della tela nessuno se ne accorge, se si inventa le lettere di un’insegna se ne accorgono tutti. I successori hanno alzato quel soffitto mettendo più numeri per casella.
E il «variational» del nome, che in italiano diremmo «variazionale»? Sta in due regole che tengono l’archivio in ordine: la scheda descrive una nuvola di possibilità («un gatto nero più o meno così») invece di inchiodare il quadro a un punto esatto, e tutte le schede stanno raccolte attorno a uno stesso centro, così si sa in che zona cercarle.
Sapere la zona non vuol dire che tutta la zona sia coperta. La regola del centro tira una scheda per volta, e non promette che le schede messe insieme riempiano davvero quella zona: chi pescasse là dentro a occhi chiusi finirebbe volentieri in una parte dove non ne è mai arrivata nessuna, e da un punto così il copista tira fuori una macchia. In Stable Diffusion il problema si aggira lasciandolo lì, perché all’archivista non si chiede di inventare quadri per conto suo: su quale scheda fermarsi lo decide il restauratore, che arriva dopo e non pesca a caso.
Un VAE è una coppia di reti. L’encoder mappa il dato \(\mathbf{x}\) non in un punto ma in una distribuzione sul latente, \(q_\phi(\mathbf{z} \mid \mathbf{x}) = \mathcal{N}\big(\mathbf{z};\, \boldsymbol{\mu}_\phi(\mathbf{x}),\, \mathrm{diag}\big(\boldsymbol{\sigma}_\phi^2(\mathbf{x})\big)\big)\) (la covarianza è diagonale, con una varianza propria per componente, non un unico valore per tutte); il decoder definisce \(p_\psi(\mathbf{x} \mid \mathbf{z})\), la ricostruzione a partire dal codice (scriviamo \(\psi\) per i suoi parametri perché in questo capitolo \(\theta\) è già impegnato dalla rete di diffusione \(\boldsymbol{\epsilon}_\theta\): sono due reti distinte, addestrate separatamente). Sul latente si impone un prior semplice, \(p(\mathbf{z}) = \mathcal{N}(\mathbf{0}, \mathbf{I})\). L’addestramento massimizza l’ELBO (evidence lower bound):
dove il primo termine premia la fedeltà della ricostruzione e il secondo (la divergenza di Kullback–Leibler vista nei richiami di matematica) penalizza gli encoder che si allontanano dal prior. Quel termine tiene aperto il margine \(\boldsymbol{\sigma}_\phi\), senza il quale il campionamento degenererebbe in un punto, e raccoglie le \(q_\phi\) attorno al prior. Dal margine viene la continuità (input simili, codici vicini); dal raccoglierle, il fatto che si sappia dove pescare \(\mathbf{z}\) senza doverne stimare la distribuzione. L’obiettivo è che ogni regione con probabilità apprezzabile sotto il prior decodifichi in un dato plausibile. Nella convenzione del libro, dove \(\mathcal{L}\) si minimizza, la loss corrispondente è \(\mathcal{L} = -\mathrm{ELBO}\). La derivazione, come limite inferiore della log-verosimiglianza, sta nella sezione sull’ELBO; qui ci basta il ruolo funzionale dei due termini.
Di quel capitolo va richiamato anche il limite, perché in Stable Diffusion determina una scelta di progetto. Il termine KL agisce su un esempio alla volta, quindi vincola ciascuna \(q_\phi(\mathbf{z} \mid \mathbf{x})\) e non l’aggregato \(q_\phi(\mathbf{z}) = \mathbb{E}_{p_{\text{dati}}}\!\big[q_\phi(\mathbf{z} \mid \mathbf{x})\big]\); i due non coincidono, e nello scarto restano regioni con massa apprezzabile sotto il prior che il decoder ha visto poco [HJ16, RLM18]. Qui il problema si aggira non risolvendolo: al VAE non si chiede affatto di generare, il peso KL è tenuto molto piccolo (la fedeltà della ricostruzione conta più della somiglianza al prior) e a decidere che cosa esce dal latente pensa la diffusione, non il decoder da solo.
Il VAE di Stable Diffusion è convoluzionale e riduce ogni lato di un fattore \(f = 8\), con 4 canali latenti: da \(512 \times 512 \times 3\) a \(64 \times 64 \times 4\), cioè da \(786\,432\) a \(16\,384\) valori, un fattore 48. Rispetto al VAE da manuale è addestrato con un peso KL molto piccolo, più una loss percettiva e una avversaria (un discriminatore in stile GAN, come nel capitolo precedente) che tengono nitide le ricostruzioni [RBL+22].
Sarebbe però un errore liquidarlo come un dettaglio di efficienza: la compressione è distruttiva, e il danno è misurabile e definitivo. Tutto ciò che il decoder non sa ricostruire è perduto prima che la U-Net veda alcunché, quindi la capacità di ricostruzione dell’autoencoder è un limite superiore sulla qualità dell’intero sistema, che nessuna quantità di diffusione può superare. Rombach e colleghi lo mettono fra i limiti dichiarati del metodo, e la conferma più netta arriva dai loro stessi successori: a parità di \(f\), portare i canali latenti da 4 a 16 migliora nettamente ogni misura di ricostruzione, ed è una delle scelte di Stable Diffusion 3 [EKB+24], che vedremo nella prossima sezione. Le due loss aggiuntive vanno lette nella stessa luce: il decoder non ricostruisce e basta, sceglie che cosa è plausibile ricostruire, il che è un’altra cosa e ha conseguenze proprie.
La ricetta in quattro mosse#
Manca un pezzo solo, tenuto finora in disparte: il testo. Le fotografie con cui questi modelli si addestrano non arrivano nude, arrivano con una didascalia accanto («un gatto nero seduto su un muro»), raccolta insieme all’immagine dal sito da cui è stata presa. È così che il modello impara ad associare le parole alle cose, ed è il motivo per cui alla fine gli si potrà scrivere che cosa disegnare. Le parole, però, una rete non le legge: legge numeri. A tradurle pensa una rete a parte, CLIP, quella della sezione su come si allineano due spazi, che qui viene riusata com’è.
La Fig. 26.7 mette allora in fila tutto: la rete che comprime, lo spazio delle schede dove avviene la diffusione, il testo che entra di lato, la rete che riporta ai pixel. Un dettaglio dell’ordine dei lavori conta più di quanto sembri: l’archivista impara il suo mestiere prima, da solo, e poi smette di imparare. Da quel momento in avanti è uno strumento fisso, e mentre il restauratore si allena nessuno gli tocca più niente. In gergo si dice che i suoi pesi vengono congelati (i pesi sono i numeri interni della rete, quelli che decidono le sue risposte, e congelarli vuol dire smettere di ritoccarli). La ragione è che il restauratore deve allenarsi su un archivio che non cambia sotto i suoi occhi.
Fig. 26.7 La catena di montaggio di Stable Diffusion. La diffusione non tocca mai i pixel: lavora sulla scheda compressa, e a ogni passo dà un’occhiata alla richiesta scritta dall’utente, che entra di lato.#
Quattro mosse. Prima: l’archivista comprime ogni fotografia dell’archivio di addestramento nella sua scheda; d’ora in poi si lavora solo su schede. Seconda: il restauratore fa esattamente il suo solito mestiere (sporca di rumore, impara a indicare il disturbo) ma su schede da 16.384 numeri invece che su quadri da 786.432, come restaurare cartoline anziché affreschi. Ogni giro di domanda e risposta costa decine di volte meno. Non proprio quarantotto: quarantotto dice quanti numeri in meno ci sono, non quanti conti in meno si fanno, e la rete delle schede è disegnata apposta per loro invece di essere quella dei quadri rimpicciolita.
Le schede, però, vanno convertite prima di finire sul tavolo del restauratore: si moltiplicano tutte per uno stesso numero fisso, 0,18215, poco meno di un quinto. Il restauratore dosa lo sporco su numeri di una certa taglia, e dall’archivio le schede escono con numeri cinque volte e mezzo più grandi di quella (cinque volte e mezzo è proprio 1 diviso 0,18215): chi salta la conversione gli dà schede su cui quella stessa dose si vede appena, e lo manda ad allenarsi su un problema più facile del vero.
Terza: mentre pulisce, il restauratore tiene sul tavolo la commissione scritta dal cliente («un gatto nero che salta sul muro, in acquerello») e a ogni pennellata le dà un’occhiata, soffermandosi sulle parole che servono in quel momento: «nero» quando decide i toni, «acquerello» quando decide il tratto. È la stessa occhiata selettiva dell’interprete della traduzione automatica, ritrovata poi nei Transformer: lì collegava due lingue, qui collega parole e immagine. (Quella commissione si chiama prompt: è la frase che si scrive nella casella di un generatore di immagini, e le due parole valgono l’una per l’altra.) Quarta: finita la pulitura si disfa la conversione di prima, e la scheda passa al copista, che ridipinge il quadro a piena risoluzione.
Per generare un’immagine nuova si parte, come sempre, dalla fine: una scheda di puro rumore sorteggiato, mai appartenuta a nessun quadro. Non è ancora una scheda buona, e nessuno pretende che lo sia: lo diventa strada facendo. Il restauratore la pulisce passo dopo passo con la commissione sotto gli occhi, e il copista trasforma il risultato in pixel. Il gatto in acquerello che compare non esisteva da nessuna parte: né il quadro, né la sua scheda.
Formalmente, le quattro componenti sono queste.
1. Compressione. L’encoder congelato porta ogni immagine nel latente. Non è una funzione, ed è la distribuzione definita sopra: il latente di addestramento si campiona, \(\mathbf{z} \sim q_\phi(\cdot \mid \mathbf{x})\), con \(\mathbf{z} \in \mathbb{R}^{64 \times 64 \times 4}\) per \(\mathbf{x} \in \mathbb{R}^{512 \times 512 \times 3}\) (scriveremo \(\mathcal{E}(\mathbf{x})\) per brevità, ricordando che sotto c’è un campionamento).
2. Diffusione nel latente. Il processo diretto e quello inverso hanno la stessa forma di quelli di DDPM, applicati a \(\mathbf{z}\) anziché a \(\mathbf{x}\), con un’avvertenza che il paragrafo sul processo diretto aveva già anticipato: lo schedule variance-preserving presuppone dati a varianza unitaria, e il latente del VAE non ce l’ha. LDM lo riscala quindi per la deviazione standard misurata sui latenti, che è un solo numero e non uno per canale (in Stable Diffusion 1.x quella costante vale \(0{,}18215\), cioè l’inverso di quella deviazione standard). Non è una limatura: Rombach e colleghi documentano che il rapporto segnale/rumore indotto dalla scala del latente incide sensibilmente sul risultato, e senza quella riscalatura tutta la taratura dello schedule sarebbe sbagliata. Fatta la riscalatura, la U-Net \(\boldsymbol{\epsilon}_\theta\) è addestrata a predire il rumore con la solita regressione, ora condizionata anche dal testo \(c\):
dove \(\mathbf{z}_t\) è il latente rumoroso al passo \(t\), \(\boldsymbol{\epsilon}\) il rumore iniettato e \(\tau\) il text encoder. Ogni valutazione della rete lavora su \(16\,384\) valori invece di \(786\,432\): è qui che si paga l’affitto ridotto dello spazio latente. Il 48 resta però il rapporto fra i valori, non fra le operazioni: la U-Net del latente è dimensionata per il latente, non è quella dei pixel rimpicciolita.
3. Condizionamento testuale. \(\tau\) è il text encoder di CLIP [RKH+21], il modello contrastivo della sezione su come si allineano due spazi: congelato, trasforma il prompt in una sequenza di 77 embedding da 768 dimensioni: 77 è la finestra fissa di CLIP, e i prompt più corti vengono riempiti fino a lì. Questi entrano nella U-Net tramite strati di cross-attention inseriti a più risoluzioni, la stessa identica formula del capitolo sui Transformer:
dove \(h(\mathbf{z}_t)\) sono le mappe di attivazione intermedie della U-Net appiattite in sequenza, \(\tau(c)\) gli embedding del prompt e \(\mathbf{W}_Q\), \(\mathbf{W}_K\), \(\mathbf{W}_V\) proiezioni apprese, che moltiplicano a destra le sequenze secondo la convenzione per righe (un token per riga) di quel capitolo. Come nel decoder del Transformer originale, le query vengono da chi genera e le key/value dalla sorgente da consultare: solo che qui chi genera è un’immagine e la sorgente è una frase.
4. Decodifica. Al termine della catena inversa la riscalatura del punto 2 va disfatta, perché il decoder è stato addestrato sui latenti grezzi; poi riporta ai pixel: \(\hat{\mathbf{x}} = \mathcal{D}(\mathbf{z}_0 / 0{,}18215)\).
Gli ordini di grandezza di Stable Diffusion v1: U-Net da circa 860 milioni di parametri, text encoder da 123 milioni (congelato), addestramento su sottoinsiemi in lingua inglese, filtrati per qualità estetica, di LAION-5B (un catalogo aperto di oltre cinque miliardi di coppie immagine–didascalia raccolte dal web).
L’asimmetria che ne risulta si misura in lavoro da fare, non in denaro. Addestrare Stable Diffusion è rimasto un mestiere da data center: la documentazione del modello dichiara centocinquantamila ore di calcolo su GPU professionali, cioè una macchina sola accesa per diciassette anni. Usarlo, grazie al trasloco nelle schede compresse, chiede alla GPU quattro gigabyte di memoria e qualche secondo di attesa. (Che siano quattro come i quattro del file scaricato è quasi un caso: quel file, caricato in memoria con numeri a metà precisione, di gigabyte ne occupa circa due, e gli altri due servono ai conti.) È il secondo di questi due conti, non il primo, ad aver cambiato chi può partecipare.
Quanto dare retta alla richiesta#
Manca un ingrediente, quello che decide quanto l’immagine obbedisce alla richiesta. L’occhiata al testo, da sola, è un suggerimento più che un ordine: lasciato libero, il modello tende a produrre immagini plausibili che rispettano il testo solo in parte; il gatto c’è, l’acquerello si è perso per strada. Il correttivo standard, usato da Stable Diffusion e da praticamente tutti i modelli che disegnano su richiesta, si chiama classifier-free guidance (letteralmente «guida senza classificatore»: fra poco si capirà da dove viene il nome), è di Jonathan Ho e Tim Salimans [HS22], ed è di una semplicità che spiazza. La Fig. 26.8 la mostra per intero.
Fig. 26.8 Le due direzioni che la rete indica nello stesso punto: quella che ha in mente solo «una figura credibile» e quella che ha in mente anche la richiesta scritta. Sono quasi la stessa, e la piccola differenza fra le due è tutto quello che il testo ha da dire. La direzione che si segue davvero è la prima più quella differenza ripetuta sette volte e mezzo, che è il peso con cui Stable Diffusion esce di serie. Il disegno fissa un divario qualunque fra le due direzioni: quanto valga sul serio dipende dal modello e dal punto.#
Il trucco comincia in addestramento: circa una volta su dieci, al modello la commissione viene nascosta. Così impara due mestieri insieme: disegnare «un’immagine plausibile qualunque» quando non ha indicazioni, e disegnare «quello che dice il testo» quando le ha.
In generazione, allora, a ogni passo puoi porre la domanda due volte e ottenere due risposte, al prezzo di fare il lavoro due volte. È il cartello della salita, quello che indica in che direzione ritoccare l’immagine per renderla più credibile, che si sdoppia: uno dice «per una figura credibile, va’ di là», l’altro «per una figura credibile e che rispetta la richiesta, va’ di là». Chiamiamole le due bussole, tenendo a mente che ognuna indica la sua direzione, e le due direzioni non coincidono.
Le due direzioni sono quasi uguali, e la piccola differenza fra loro è tutto quello che il testo ha da dire. La prima bussola dice «nord», la seconda dice «nord, un pelo verso est»: quel «pelo verso est» è il contributo della richiesta. Seguire la seconda bussola e basta è quello che si faceva prima, e l’indicazione del testo nel totale pesa pochissimo. La rete tira soprattutto verso «un’immagine credibile», e «acquerello» è una spintarella dentro quella spinta grossa, che si perde per strada: il gatto viene a olio. Il colpo di genio è prendere quel pelo verso est e moltiplicarlo: non un passo, ma sette passi e mezzo verso est, e poi camminare verso nord-est. Sette e mezzo è il numero che Stable Diffusion usa di serie, e si chiama il peso della guida, \(w\).
A \(w = 1\) non si esagera niente, ed è il gatto a olio di prima. Sotto l’uno il modello va a briglia sciolta, con immagini varie e richiesta presa alla leggera, fino a \(w = 0\) dove la richiesta viene ignorata del tutto e si segue la prima bussola e basta; sopra l’uno ubbidisce di più e inventa di meno. Esagerando davvero, ben oltre il 7 e mezzo, l’immagine viene «sovracotta»: colori saturi, contrasti duri, composizioni tutte uguali.
E il sette e mezzo? Chi misura quanto le immagini somigliano alle fotografie vere trova il punto migliore molto più in basso, e a sette e mezzo la somiglianza è già peggiorata. Sette e mezzo resta il valore di serie, e quello che si guadagna a stare così in alto si vede con gli occhi più che nelle misure.
Resta il nome. Un classificatore è una rete che guarda un’immagine e dice che cosa contiene («questo è un gatto»), e il metodo di prima ne addestrava uno a parte per tirare la generazione verso la categoria voluta: costoso, e un pezzo in più da mantenere. Ho e Salimans ottengono lo stesso effetto con due risposte della rete che c’è già, da qui classifier-free, «senza classificatore».
I negative prompt sono la stessa idea usata al contrario: al posto della bussola «qualunque cosa» ne metti una che punta verso ciò che non vuoi («sfocato, deforme, con una scritta sopra») e cammini allontanandotene.
In addestramento il condizionamento viene azzerato con probabilità fissa (condition dropout, circa \(0{,}1\) in Stable Diffusion): la stessa rete apprende sia \(\boldsymbol{\epsilon}_\theta(\mathbf{z}_t, c)\) sia il caso non condizionato \(\boldsymbol{\epsilon}_\theta(\mathbf{z}_t, \varnothing)\), dove \(\varnothing\) è il prompt vuoto. In inferenza le due predizioni si combinano per estrapolazione:
dove \(\tilde{\boldsymbol{\epsilon}}_\theta\) è la predizione di rumore effettivamente usata dal campionatore, \(c\) il prompt e \(w\) il peso di guidance: con \(w = 1\) si recupera la predizione condizionata, con \(w > 1\) ci si spinge oltre, nella direzione che separa il condizionato dal non condizionato (nella parametrizzazione originale di Ho e Salimans il coefficiente è scritto \(1 + w\), quindi la formula è la stessa e il numero no: il \(7{,}5\) di qui è \(w = 6{,}5\) nel loro paper).
Raccogliendo per peso, la stessa combinazione si scrive
ed è la forma che rende visibile tutto l’intervallo: fra \(0\) e \(1\) è una media pesata delle due predizioni, con \(w = 0\) che ignora il prompt del tutto e \(w = 1\) che usa la sola condizionata; sopra l’uno il peso della non condizionata diventa negativo, cioè non ci si limita a dar retta al testo, ci si allontana da «un’immagine plausibile qualunque».
L’ispirazione, ed è bene chiamarla così e non «l’interpretazione»: la differenza tra le due predizioni approssima \(-\sqrt{1-\bar{\alpha}_t}\,\nabla_{\mathbf{z}_t} \log p(c \mid \mathbf{z}_t)\), con il fattore negativo che lega \(\boldsymbol{\epsilon}\) e score nella sezione sotto il cofano: la differenza punta nel verso opposto al gradiente, ed è proprio sommandola alla predizione di rumore (che il campionatore poi sottrae) che si sale su \(\log p(c \mid \mathbf{z}_t)\). È ciò che la classifier guidance di [DN21] otteneva addestrando un classificatore esterno, ed è da lì che viene il nome «senza classificatore».
Qui però bisogna fermarsi, perché la formula suggerisce una conclusione che gli autori del metodo negano esplicitamente: il classificatore implicito non c’è. Essendo \(\boldsymbol{\epsilon}_\theta\) una rete non vincolata, il campo \(\tilde{\boldsymbol{\epsilon}}_\theta\) non è in generale conservativo, quindi non esiste alcun potenziale (nessuna log-verosimiglianza di classificatore) di cui sia il gradiente; è l’argomento di Ho e Salimans nel paper già citato, che aggiungono che il passo lungo \(\tilde{\boldsymbol{\epsilon}}_\theta\) non può essere letto come un attacco avversario a un classificatore di immagini. Il «classificatore implicito» è una guida al ragionamento, non un oggetto che esiste da qualche parte.
E c’è una seconda conseguenza, che le interfacce non dichiarano mai: per \(w > 1\) il campionatore non campiona più da \(p(\mathbf{x} \mid c)\), e nemmeno da \(p(\mathbf{x})\,p(c \mid \mathbf{x})^w\), la distribuzione «inclinata» che di solito si cita per giustificarlo. Bradley e Nakkiran [BN24] lo mostrano con un controesempio, e aggiungono che la guida interagisce in modo diverso con i due campionatori in uso, che quindi non producono nemmeno la stessa distribuzione fra loro. Su che cosa la guida sia, danno una risposta parziale: nel limite continuo la variante DDPM della guida è un metodo predittore-correttore, che alterna un passo di denoising e uno di affilatura. Il \(w = 7{,}5\) di default sta ben oltre il punto in cui la somiglianza statistica con i dati veri comincia a peggiorare: non è una manopola della qualità, è una manopola della preferenza, e la distinzione conta ogni volta che si valuta un modello con una metrica invece che con gli occhi.
Il prezzo è dunque triplice. Computazionale: due valutazioni della U-Net per ogni passo (in pratica, un batch di due). Statistico: al crescere di \(w\) aumenta l’aderenza al prompt ma cala la diversità dei campioni, con saturazione e artefatti per valori estremi (il trade-off fedeltà–varietà misurato sistematicamente nel paper [HS22]). E concettuale: si perde la garanzia di star campionando da una distribuzione definita. Il negative prompt delle interfacce comuni è la stessa formula con \(\varnothing\) sostituito da un prompt negativo \(c_{\mathrm{neg}}\): si estrapola allontanandosi da esso.
Dieci righe di Python#
Non riscriveremo da zero tutta la catena di montaggio: nessuno lo fa, e il modo
in cui la si usa davvero è la libreria diffusers di Hugging Face, che gira su
PyTorch e impacchetta in un blocco solo l’archivista, il copista, il
restauratore, la rete che legge la commissione scritta e la procedura che
scende la scala
(pip install diffusers transformers accelerate). Al primo avvio scarica i
pesi (qualche gigabyte); così com’è scritto vuole una GPU NVIDIA con circa
quattro gigabyte di memoria, perché la riga pipe.to("cuda") la nomina.
Cambiando quella riga la stessa pipeline gira anche sulla CPU, molto più
lentamente. Chi non ha una GPU così legge il blocco invece di lanciarlo, perché
quello che c’è da capire sta nei nomi delle opzioni.
import torch
from diffusers import StableDiffusionPipeline
# carica l'intera pipeline (VAE + U-Net + CLIP + campionatore)
pipe = StableDiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16, # mezza precisione: meno memoria
)
pipe = pipe.to("cuda") # sposta tutto sulla GPU
immagine = pipe(
prompt="a black cat jumping on a wall, watercolor",
negative_prompt="blurry, deformed, watermark",
guidance_scale=7.5, # il peso w della guidance
num_inference_steps=50, # i passi di denoising nel latente
).images[0]
immagine.save("gatto_acquerello.png")
Due note pratiche. Il prompt è in inglese perché i modelli della famiglia
SD v1 sono addestrati su didascalie in inglese: con altre lingue i
risultati peggiorano sensibilmente. E se la memoria non basta,
pipe.enable_model_cpu_offload() tiene sulla GPU un pezzo di modello per
volta e lascia gli altri nella memoria del computer: si paga in secondi e il
picco scende di molto.
L’onda lunga dei pesi aperti#
Il rilascio dei pesi ha fatto qualcosa che nessuna API può fare: ha permesso a chiunque di modificare il modello. Nel giro di mesi è nato un ecosistema di personalizzazioni leggere. Con LoRA [HSW+22], una tecnica nata per i modelli di linguaggio, si specializza il modello su uno stile o un soggetto senza toccarlo tutto: accanto ai pesi originali, che restano fermi, si addestrano due tabelle di numeri molto più piccole che ne correggono l’uscita. Il file da condividere pesa qualche megabyte invece di qualche gigabyte, ed è la ragione per cui gli stili si sono messi a circolare come circolano le canzoni. Con ControlNet [ZRA23] si vincola invece la generazione a uno schizzo, una posa o una mappa di profondità forniti dall’utente. Non li approfondiremo, ma sono il motivo per cui attorno a Stable Diffusion esiste una comunità e non solo un’utenza.
Le versioni successive raccontano una traiettoria che qui interessa per una ragione sola: dice dove è andata a finire l’architettura. Le prime rifiniscono la ricetta senza cambiarla; poi la si ingrandisce, con una rete più capiente, due lettori di testo invece di uno e una risoluzione nativa doppia; infine, nel 2024, si butta la U-Net e le si mette al posto un Transformer. Chi ha letto il capitolo sui Transformer se lo aspettava, perché la stessa sostituzione era già avvenuta nella traduzione e nella visione; ma che funzionasse anche qui non era affatto scontato, e come e perché sia successo è la storia della prossima sezione.
Le domande che restano aperte#
Il capitolo sui Transformer si era chiuso elencando i problemi aperti dei modelli di linguaggio, senza addolcirli. Qui i problemi sono paralleli e altrettanto strutturali, e sono tre.
Il primo è il consenso. La stessa catena di montaggio che dipinge un gatto in acquerello dipinge il volto di una persona reale in una scena mai avvenuta, e i pesi aperti rendono facili da rimuovere le contromisure decise da chi distribuisce il modello (filtri, parole vietate nella richiesta).
Il secondo sono i dati. Stable Diffusion è addestrato su LAION, un enorme elenco pubblico di indirizzi di immagini raccolte dal web con la loro didascalia: miliardi di voci, prese dove capitava. Dentro ci sono anche opere protette da diritto d’autore e fotografie di persone che non hanno mai acconsentito. Su questo si è aperto un contenzioso vero. All’inizio del 2023 Getty Images ha citato in giudizio Stability AI, e un gruppo di artisti ha fatto causa a Stability AI, Midjourney e DeviantArt. A qualche anno dai primi depositi, le sentenze sono parziali e diverse da un paese all’altro, e la domanda di fondo, cioè se addestrare un modello su opere protette sia lecito, non ha ancora una risposta stabile.
Il terzo è la provenienza, cioè poter dire se un’immagine è stata generata o no. Il codice di rilascio di Stable Diffusion incorporava di serie una filigrana invisibile nelle immagini che produceva, e ci sono standard, come le Content Credentials del consorzio C2PA, che provano a certificare l’origine dei contenuti. Ma chi possiede i pesi disattiva la filigrana con una riga di codice, e riconoscere l’origine dopo il fatto resta una rincorsa. Sono problemi aperti nel senso pieno: tecnici solo in parte, e non risolvibili solo con la tecnica.
Da ricordare
Lavorare sui pixel è uno spreco: quasi tutti i 786.432 numeri di una fotografia servono a descrivere la grana, non il gatto. L’idea di questa sezione è spostare tutto il lavoro su una versione compressa della fotografia, quarantotto volte più piccola, e tornare ai pixel solo alla fine.
Chi comprime è l’archivista: per ogni quadro scrive una scheda molto più piccola, e chi la legge per ridipingere il quadro è il copista. I due si allenano insieme, e la prova che la scheda è buona è che la copia somigli all’originale. La trovata dell’archivista è non scrivere un valore esatto ma un valore con un margine, così che schede vicine diventino immagini simili e attorno a ogni scheda ci sia una zona intera che il copista sa leggere. Non che l’archivio sia coperto tutto: a pescare a caso si finisce dove nessuna scheda è mai arrivata, ed è il restauratore, non il sorteggio, a decidere su quale fermarsi.
Quello che l’archivista non annota è perso per sempre: la scheda è il soffitto della qualità finale, e nessuna bravura di chi viene dopo lo alza. È una delle ragioni per cui i primi modelli di questa famiglia sbagliavano scritte, volti piccoli e mani, che sono tutte cose di dettaglio fine.
La ricetta in quattro mosse: l’archivista comprime, il restauratore fa il suo solito mestiere sulle schede invece che sui quadri, tenendo d’occhio la commissione scritta dal cliente, poi il copista ridipinge. L’archivista impara prima e poi smette di imparare.
Per decidere quanto dare retta alla richiesta si interroga la rete due volte, una senza dirle niente e una dandole la richiesta, e si guarda di quanto le due risposte differiscono: quella differenza è il contributo del testo, ed è piccola. Si cammina lungo la prima risposta più quella differenza moltiplicata, di solito per sette e mezzo. Più si moltiplica, più il modello ubbidisce e meno inventa; esagerando, l’immagine viene «sovracotta».
I pesi aperti hanno generato una comunità e non solo un’utenza: sono nate tecniche per specializzare il modello con file da pochi megabyte, o per costringerlo a seguire uno schizzo.
Restano aperti i problemi del consenso di chi finisce ritratto, dei diritti sulle immagini con cui questi modelli sono addestrati e della provenienza, cioè del riuscire a dire se un’immagine è stata generata. Sono altrettanto strutturali dei difetti dei modelli di linguaggio, e non si risolvono con la sola tecnica.
Da ricordare
Diffondere sui pixel è uno spreco: gran parte dei \(786\,432\) numeri di un’immagine \(512 \times 512\) è dettaglio percettivo. I latent diffusion models [RBL+22] spostano la diffusione in uno spazio compresso (\(64 \times 64 \times 4\): 48 volte meno).
Il traslocatore è il variational autoencoder [KW14]: encoder \(q_\phi(\mathbf{z} \mid \mathbf{x})\) e decoder \(p_\psi(\mathbf{x} \mid \mathbf{z})\) addestrati sull’ELBO, il cui termine KL tiene aperto il margine e raccoglie i codici attorno al prior. In Stable Diffusion quel termine pesa pochissimo e si aggiungono una loss percettiva e una avversaria; il VAE è addestrato prima e poi congelato, e la sua capacità di ricostruzione è un limite superiore sulla qualità del sistema.
Il latente va riscalato prima di diffonderci sopra (in SD 1.x per la costante \(0{,}18215\)), e la riscalatura va disfatta prima di decodificare: lo schedule variance-preserving presuppone varianza unitaria, che il latente del VAE non ha.
La ricetta: encoder → diffusione con U-Net nel latente → decoder; il prompt, trasformato dal text encoder di CLIP [RKH+21], entra nella U-Net via cross-attention (la stessa formula dei Transformer, con \(\mathbf{Q}\) dal latente e \(\mathbf{K}\), \(\mathbf{V}\) dal testo).
La classifier-free guidance [HS22] addestra il modello anche senza prompt e in inferenza estrapola tra predizione condizionata e non, con peso \(w\): più aderenza al testo, meno varietà. Il «classificatore implicito» è un’ispirazione, non un oggetto (il campo guidato non è conservativo), e per \(w > 1\) non si campiona più da \(p(\mathbf{x} \mid c)\) e nemmeno dall’inclinata \(p(\mathbf{x})\,p(c \mid \mathbf{x})^w\), che è la giustificazione corrente [BN24]. I negative prompt sono la stessa formula al contrario.
I pesi aperti (agosto 2022) hanno generato un ecosistema (LoRA [HSW+22], ControlNet [ZRA23], interfacce di comunità) e una traiettoria che finisce col sostituire la U-Net con un Transformer (prossima sezione).
Restano aperti i nodi di consenso, diritti sui dati di addestramento e provenienza delle immagini: paralleli ai bias e alle allucinazioni dei modelli di linguaggio, e altrettanto strutturali.