Salta ai contenuti

Ottimizzare funzioni di funzioni

L’ottimizzazione che hai incontrato finora cerca un numero: il valore di xx che rende f(x)f(x) più piccolo possibile. Il calcolo delle variazioni cerca qualcosa di molto più grande — un’intera funzione, una curva, una distribuzione di probabilità — quella che rende minimo un funzionale. Un funzionale è una “funzione di funzioni”: prende in input non un numero ma un’intera funzione, e restituisce un singolo numero. Questo capitolo costruisce l’idea da zero, mostra come la derivata ordinaria si trasforma in derivata variazionale, attraversa quattro problemi classici — brachistocrona, geodetica, catenaria, minima azione — e poi segue il filo fino al machine learning moderno: l’inferenza variazionale, l’ELBO, i variational autoencoder, i diffusion model. La distinzione che il capitolo tiene ferma per tutto il percorso è quella fra ciò che è analogia e ciò che è equivalenza dimostrata.

Nel 1696 il matematico svizzero Johann Bernoulli (1667-1748) lancia una sfida pubblica alla comunità matematica europea. La domanda è semplice da enunciare: date due posizioni nello spazio, una più in alto e una più in basso, lungo quale guida una pallina che scivola senza attrito sotto gravità impiega il minimo tempo per andare dalla prima alla seconda? Non il percorso più corto: il più veloce. La risposta arriva da Newton, Leibniz, l’Hospital, da Jakob Bernoulli e dallo stesso Johann, e non è una retta. È un problema che l’analisi che conosci non sa affrontare, perché l’incognita non è un numero: è un’intera curva.

Questo è il salto che il capitolo chiede di fare. Per tutta la Parte VI l’ottimizzazione ha cercato un punto: trova xx tale che il gradiente di ff sia nullo. Il calcolo delle variazioni alza il problema di un piano. L’incognita diventa una funzione intera, e l’obiettivo diventa un funzionale — un oggetto che a ogni funzione candidata associa un numero.

Il tempo di discesa della pallina è un funzionale: dipende da tutta la curva, non da un suo valore in un punto. Minimizzarlo significa cercare, fra infinite curve possibili, quella che lo rende più piccolo. La differenza con l’ottimizzazione ordinaria non è di grado ma di tipo: lì lo spazio di ricerca era R\mathbb{R} o Rn\mathbb{R}^n, un numero o un vettore di numeri; qui è lo spazio di tutte le funzioni che collegano AA a BB, uno spazio infinito-dimensionale. Eppure, e questa è la promessa del capitolo, l’idea per affrontarlo resta sorprendentemente la stessa.

C’è una ragione precisa per cui un capitolo del genere appartiene a una wiki sull’intelligenza artificiale, e non è la fisica. Tre fra le idee più produttive del machine learning generativo degli ultimi quindici anni — l’inferenza variazionale, il variational autoencoder, l’obiettivo di training dei diffusion model — sono problemi variazionali travestiti. La parola “variational” che compare in “variational inference” e in “variational autoencoder” non è decorativa: viene esattamente da qui.

Quando un VAE si addestra massimizzando una quantità chiamata ELBO, sta cercando, dentro una famiglia di distribuzioni, quella che minimizza un funzionale. Chi conosce il calcolo delle variazioni vede subito perché la loss ha la forma che ha; chi non lo conosce la prende come una formula calata dall’alto. La differenza non è cosmetica: è la differenza fra usare uno strumento e capirlo.

Il capitolo non chiede di saper risolvere problemi variazionali. Chiede di capire l’idea: cosa significa derivare rispetto a una funzione, perché la condizione di stazionarietà assume la forma dell’equazione di Eulero-Lagrange, e dove tutto questo riappare nell’AI. È matematica avanzata, ed è dichiaratamente opzionale — ma è anche il filo che lega la meccanica del Settecento ai modelli generativi del 2020.

Questo è il decimo capitolo della Parte VI, e poggia su quasi tutti i precedenti. Da Analisi matematica: limiti, continuità, derivate arriva l’idea di derivata come pendenza e di punto stazionario come luogo dove la pendenza si annulla. Da Derivate parziali, gradienti, Jacobiani arriva il gradiente, il vettore che raccoglie le derivate parziali e indica la direzione di massima crescita. Da Taylor come approssimazione locale arriva l’idea di sviluppo al primo ordine, che ritroveremo travestita da “prima variazione”. Da Convessità, Jensen, minimi globali arriva la disuguaglianza di Jensen, che è quella che rende valido l’ELBO. Il calcolo delle variazioni non è una materia a sé: è l’analisi della Parte VI applicata a oggetti più ricchi.

Storicamente il campo nasce prima del suo nome. Per tutto il Sei e Settecento i matematici si scontrano con problemi della stessa forma: fra tutte le curve possibili, quale ottimizza un certo criterio? La brachistocrona di Johann Bernoulli (1696) è il problema fondante. Ma c’erano già: la geodetica, cioè il cammino più corto su una superficie; la catenaria, cioè la forma che assume una catena appesa per i due estremi, studiata da Huygens, Leibniz e Johann Bernoulli nel 1690-91; e soprattutto i principi di minimo della fisica — il principio di Fermat (Pierre de Fermat, matematico francese, intorno al 1660), secondo cui la luce segue il cammino di tempo minimo.

La sfida della brachistocrona ha anche un risvolto aneddotico che dice molto sull’epoca. Johann Bernoulli pubblica il problema sulla rivista Acta Eruditorum dandosi sei mesi di tempo per le risposte, e lo formula quasi come un guanto di sfida rivolto ai “matematici più acuti”. Newton, si racconta, lo riceve a fine giornata di lavoro alla Zecca di Londra e lo risolve in una notte, inviando la soluzione in forma anonima. Bernoulli, leggendola, riconosce comunque l’autore — con la frase rimasta celebre, tanquam ex ungue leonem, “si riconosce il leone dall’artiglio”. L’episodio fissa una data: con la brachistocrona, “trovare la curva ottima” diventa una classe di problemi che la comunità matematica prende sul serio.

A trasformare la collezione di trucchi ad hoc in un metodo è Leonhard Euler (matematico svizzero, 1707-1783), che nel 1744 fornisce un argomento generale, e Joseph-Louis Lagrange (matematico italo-francese, 1736-1813), che intorno al 1755 introduce la tecnica algebrica delle “variazioni” — da cui Euler conia il nome calcolo delle variazioni. Il risultato centrale del loro lavoro è l’equazione che oggi porta i loro due nomi: l’equazione di Eulero-Lagrange, la condizione che ogni soluzione di un problema variazionale deve soddisfare.

Sul versante fisico, il principio di minima azione viene formulato esplicitamente da Pierre-Louis Maupertuis (matematico e naturalista francese, 1698-1759) nel 1744, come tentativo di estendere il principio di tempo minimo di Fermat dalla luce alla materia. Euler, lo stesso anno, ne dà una versione rigorosa. Più tardi William Rowan Hamilton (matematico irlandese, 1805-1865) mostra che l’intera meccanica classica si può riformulare come un problema variazionale: questo è il principio di Hamilton, o di azione stazionaria. Da problema di curve, il calcolo delle variazioni è diventato il linguaggio di una legge fisica generale.

Nel grafo della wiki, questo capitolo guarda in due direzioni. A monte sta l’analisi della Parte VI. A valle stanno i modelli generativi — variational autoencoder (in preparazione), diffusion model (in preparazione) — e le scienze cognitive, dove il free energy principle riusa lo stesso funzionale. È un capitolo-ponte: la matematica è del Settecento, le applicazioni sono di ieri.

L’ordine del capitolo segue la costruzione del concetto. Prima cos’è un funzionale. Poi tre angoli di intuizione sulla derivata variazionale. Poi la meccanica: la prima variazione e l’equazione di Eulero-Lagrange, presentata come idea e non come derivazione. Poi gli esempi classici. Poi il ponte verso il machine learning. Infine, la sezione più lunga: dove l’analogia con la derivata ordinaria si rompe, e quali confusioni il calcolo delle variazioni invita a fare.

L’intuizione, primo angolo: derivare rispetto a una funzione

Sezione intitolata “L’intuizione, primo angolo: derivare rispetto a una funzione”

Riprendiamo la pallina di Bernoulli e guardiamola con calma.

La pallina parte ferma dal punto AA, in alto, e scivola senza attrito fino al punto BB, più in basso. La forma della guida è una curva, che possiamo descrivere con una funzione y(x)y(x): per ogni posizione orizzontale xx, l’altezza yy della guida. Cambiare la guida significa cambiare la funzione yy.

A ogni scelta di yy corrisponde un tempo di discesa: una guida ripida all’inizio fa guadagnare subito velocità, una guida più dolce no. Chiamiamo T[y]T[y] il tempo di discesa lungo la curva yy. Le parentesi quadre non sono un capriccio di notazione: segnalano che l’argomento non è un numero ma un’intera funzione. È la convenzione che useremo per tutto il capitolo — parentesi tonde per le funzioni ordinarie, parentesi quadre per i funzionali.

T[y]T[y] è un funzionale. Un funzionale è un oggetto che prende in input una funzione intera e restituisce un numero. Altri esempi: la lunghezza di una curva è un funzionale (input: la curva; output: un numero, la sua lunghezza). L’energia potenziale di una catena appesa è un funzionale (input: la forma della catena; output: un numero, l’energia). L’area sotto un grafico è un funzionale.

Tutti hanno in comune una cosa: il numero in uscita dipende da com’è fatta la funzione ovunque, non da un suo valore in un punto. Se cambi la curva in un solo tratto, il tempo di discesa cambia — non puoi calcolarlo guardando un punto solo. È questa dipendenza “globale” dalla funzione intera a definire un funzionale, e a renderlo un oggetto diverso da una funzione ordinaria.

Ora il problema. Nell’analisi ordinaria, per minimizzare f(x)f(x) cerchi il punto dove f(x)=0f'(x) = 0: il punto dove, spostandoti di poco a destra o a sinistra, il valore non cambia al primo ordine. Il terreno è piatto. Vorremmo fare lo stesso con T[y]T[y]. Ma “spostarsi di poco” ora non significa cambiare un numero: significa deformare leggermente la funzione.

Ecco l’idea centrale. Prendi una curva candidata y(x)y(x) e deformala un pochino: aggiungi una piccola increspatura. In formule, considera y(x)+εη(x)y(x) + \varepsilon\,\eta(x), dove η\eta è una funzione di perturbazione qualsiasi — la forma dell’increspatura — ed ε\varepsilon è un numero piccolo che ne controlla l’ampiezza. La funzione η\eta deve annullarsi agli estremi: gli estremi AA e BB sono fissati, la curva può ondeggiare nel mezzo ma deve sempre partire da AA e arrivare a BB.

Adesso guarda come cambia il funzionale al variare di ε\varepsilon. Tenendo fissa l’increspatura η\eta, la quantità T[y+εη]T[y + \varepsilon\eta] è una funzione ordinaria del solo numero ε\varepsilon — e su una funzione ordinaria sai già operare: puoi derivarla rispetto a ε\varepsilon e valutarla in zero.

Se per ogni increspatura η\eta possibile quella derivata in ε=0\varepsilon=0 è nulla, allora la curva yy è stazionaria: è un candidato minimo. È esattamente la condizione f(x)=0f'(x) = 0, trasportata in uno spazio dove i “punti” sono funzioni. Il trucco, e vale la pena notarlo, è ricondurre l’ignoto al noto: la derivata rispetto a una funzione si definisce tramite infinite derivate ordinarie rispetto a un numero, una per ogni direzione di perturbazione η\eta.

La quantità che misura questo cambiamento al primo ordine si chiama prima variazione, e si scrive δT\delta T. È l’analogo del differenziale dfdf: il “quanto cambia” l’obiettivo per una deformazione infinitesima.

E la derivata variazionale, scritta δT/δy(x)\delta T / \delta y(x), è l’analogo del gradiente: dice, punto per punto lungo la curva, quanto il funzionale è sensibile a un piccolo “pizzicotto” della funzione in quel punto. Dove la derivata variazionale è grande, spostare la curva lì cambia molto il funzionale; dove è nulla, la curva lì è già “piatta” rispetto a quel funzionale. Una curva è stazionaria quando la derivata variazionale è nulla in ogni punto: non c’è nessun pizzicotto, da nessuna parte, che la migliori al primo ordine.

Mettiamo la corrispondenza in tabella. È utile, ma va letta con un’avvertenza che riprenderemo nella sezione “Dove si rompe”: questa è un’analogia strutturale, non un’equivalenza. Lo spazio delle funzioni ha infinite dimensioni, e diverse cose che in Rn\mathbb{R}^n funzionano automaticamente, in dimensione infinita richiedono ipotesi aggiuntive.

Calcolo ordinarioCalcolo delle variazioni
variabile xx, un numero (o un vettore)funzione intera y()y(\cdot)
funzione f(x)f(x)funzionale J[y]J[y]
spostarsi: x+εvx + \varepsilon vdeformare: y+εηy + \varepsilon\,\eta
differenziale dfdfprima variazione δJ\delta J
gradiente f\nabla fderivata variazionale δJ/δy\delta J / \delta y
candidato minimo: f=0\nabla f = 0candidato minimo: δJ=0\delta J = 0 ovunque

In una frase: il calcolo delle variazioni è l’ottimizzazione di sempre, dove però il “punto da trovare” è un’intera funzione, e “derivare” significa misurare come reagisce il funzionale quando deformi quella funzione.

C’è un dettaglio della tabella che merita una sosta, perché chiarisce la natura della derivata variazionale. Il gradiente di una funzione di nn variabili è un vettore di nn numeri: una componente per ogni direzione lungo cui ti puoi spostare. La derivata variazionale, coerentemente, ha una “componente” per ogni direzione lungo cui puoi deformare la funzione — e le direzioni sono infinite, una per ogni punto xx del dominio. Per questo δJ/δy\delta J/\delta y non è un numero né un vettore finito: è essa stessa una funzione di xx. Dice, punto per punto, la sensibilità del funzionale. La condizione di stazionarietà chiede che questa funzione sia identicamente nulla — non in un punto, ovunque. È il motivo per cui il candidato minimo non è “un valore” ma “un’equazione che vale lungo tutta la curva”.

L’intuizione, secondo angolo: infiniti vincoli locali da una richiesta globale

Sezione intitolata “L’intuizione, secondo angolo: infiniti vincoli locali da una richiesta globale”

C’è un secondo modo di guardare la stessa cosa, e serve a rendere meno misteriosa la forma dell’equazione che incontreremo fra poco.

La richiesta di partenza è globale. Il funzionale J[y]J[y] è una somma — un integrale — di contributi presi lungo tutta la curva. Chiedere che sia stazionario è una sola richiesta, e riguarda la curva nella sua interezza.

Ma la curva ha infiniti punti, e li puoi perturbare uno indipendentemente dall’altro. Immagina di deformare la curva solo attorno a un punto x0x_0: una piccola increspatura localizzata lì, e zero dappertutto altrove. Chiedere che JJ non cambi sotto questa increspatura impone un vincolo, e il vincolo è locale: riguarda solo cosa succede attorno a x0x_0. Adesso fai scorrere x0x_0 su tutto l’intervallo. Ogni posizione dà il suo vincolo locale. L’unica richiesta globale — ”JJ stazionario” — si è frantumata in infiniti vincoli locali, uno per ogni punto della curva.

L’equazione di Eulero-Lagrange è la forma compatta di tutti questi vincoli messi insieme. È una sola equazione differenziale che, dovendo valere in ogni punto xx, racchiude l’intera famiglia. Vista così non è una formula calata dall’alto: è la traduzione inevitabile di “la perturbazione localizzata, ovunque la metti, non deve cambiare il funzionale”.

Il passaggio tecnico che rende rigoroso questo ragionamento ha un nome: il lemma fondamentale del calcolo delle variazioni. Dice una cosa intuitiva. Se l’integrale del prodotto fra una certa funzione continua g(x)g(x) e una perturbazione η(x)\eta(x) è nullo per ogni perturbazione possibile, allora g(x)g(x) deve essere identicamente zero.

La giustificazione intuitiva: se gg fosse diversa da zero in un punto, potresti scegliere un’increspatura η\eta concentrata proprio lì, dello stesso segno di gg, e l’integrale risulterebbe diverso da zero. L’unica gg che “sopravvive” a tutte le perturbazioni è quella nulla ovunque. È il lemma fondamentale a trasformare la frase “la prima variazione è nulla per ogni η\eta” — un enunciato su infinite perturbazioni — nella frase “una certa funzione è zero in ogni punto”, che è l’equazione di Eulero-Lagrange. Senza di esso, il ponte fra la condizione globale e l’equazione differenziale locale non reggerebbe.

Tieni questi due angoli in mente insieme. Il primo dice cosa cerchiamo: la funzione dove la derivata variazionale si annulla. Il secondo dice perché la condizione prende la forma di un’equazione differenziale: perché una richiesta globale, frantumata punto per punto, diventa un vincolo locale che vale ovunque.

L’intuizione, terzo angolo: il limite di un’ottimizzazione su molti punti

Sezione intitolata “L’intuizione, terzo angolo: il limite di un’ottimizzazione su molti punti”

C’è un terzo modo di guardare il calcolo delle variazioni, ed è quello che lo rende meno spaventoso per chi ha scritto codice. Una funzione, su un computer, non è un oggetto continuo: è una lista di valori. Se vuoi rappresentare la curva y(x)y(x) su un intervallo, la campioni in NN punti e ottieni un vettore (y1,y2,,yN)(y_1, y_2, \dots, y_N) — l’altezza della curva in NN posizioni equispaziate.

Con questa rappresentazione, il funzionale smette di essere misterioso. L’integrale Fdx\int F\,dx diventa una somma finita: iF(xi,yi,pendenzai)Δx\sum_i F(x_i, y_i, \text{pendenza}_i)\,\Delta x, dove la pendenza in ogni punto si approssima con una differenza, (yi+1yi)/Δx(y_{i+1}-y_i)/\Delta x. Il funzionale J[y]J[y] è diventato una funzione ordinaria di NN variabili, J(y1,,yN)J(y_1, \dots, y_N). E minimizzarla è il problema di sempre: si calcola il gradiente — le NN derivate parziali rispetto a ogni yiy_i — e si annulla.

Ecco la chiave. La derivata parziale J/yi\partial J/\partial y_i del funzionale discretizzato è la versione su griglia della derivata variazionale δJ/δy(x)\delta J/\delta y(x). La derivata variazionale è il gradiente — letteralmente, nel limite in cui i punti della griglia diventano infinitamente fitti. L’equazione di Eulero-Lagrange è ciò che la condizione "J=0\nabla J = 0" diventa quando NN tende all’infinito e la somma ridiventa un integrale.

Questo angolo ha un risvolto pratico immediato. Spiega perché, nel machine learning, l’ottimizzazione di un funzionale e l’ottimizzazione di una funzione ordinaria si confondono così facilmente: non sono due mondi separati, sono lo stesso mondo a due risoluzioni diverse. Discretizza il problema variazionale e ottieni un problema di discesa del gradiente; raffina la griglia all’infinito e riottieni il problema variazionale.

È anche, concretamente, il modo in cui molti problemi variazionali si risolvono al computer: si discretizza, si minimizza il vettore, si raffina. Un computer non sa manipolare “una funzione” come oggetto astratto; sa manipolare vettori di numeri. Ogni volta che un software risolve un problema variazionale — il profilo ottimale di un’ala, la traiettoria di costo minimo di un razzo, la forma di una struttura — sotto il cofano c’è una griglia, un vettore, e un gradiente. La teoria continua dell’equazione di Eulero-Lagrange e la pratica numerica della discesa del gradiente sono i due volti dello stesso oggetto, separati solo dalla finezza della griglia.

La meccanica: prima variazione ed equazione di Eulero-Lagrange

Sezione intitolata “La meccanica: prima variazione ed equazione di Eulero-Lagrange”

Adesso la formula. La presentiamo come idea, non come derivazione: il taglio del capitolo è “a intuizione”, e la derivazione completa con tutti i passaggi di integrazione per parti appartiene a un corso di analisi.

Prima un’immagine per “stazionario”, perché è la parola attorno a cui ruota tutto. Pensa al funzionale come a un’altitudine: a ogni curva candidata corrisponde un’altezza, il valore di JJ. Lo spazio delle curve è il “terreno”, infinito-dimensionale, su cui questa altitudine è definita. Una curva è stazionaria quando, in quel punto del terreno, ogni passo infinitesimo — ogni piccola deformazione — ti lascia alla stessa altezza al primo ordine. Sei su un pianoro. Può essere il fondo di una valle (minimo), la cima di un colle (massimo) o un passo di montagna (sella): “stazionario” dice solo che il terreno lì è piatto, non in che tipo di luogo ti trovi. L’equazione di Eulero-Lagrange è lo strumento per individuare questi pianori.

Quasi tutti i funzionali interessanti hanno la stessa forma standard:

J[y]=abF(x,y(x),y(x))dxJ[y] = \int_a^b F\big(x,\, y(x),\, y'(x)\big)\, dx

Leggiamola pezzo per pezzo. L’integrale da aa a bb è la somma dei contributi lungo la curva, dall’estremo sinistro a quello destro. La funzione FF è la densità, o lagrangiana: è una funzione ordinaria di tre argomenti — la posizione xx, il valore yy che la funzione assume in quel punto, e la pendenza yy' della funzione in quel punto. Il funzionale JJ somma il contributo locale FF in ogni punto. Tutta la ricchezza del calcolo delle variazioni sta in questo: il numero J[y]J[y] è costruito da una densità locale FF, ma dipende dalla funzione yy ovunque, perché ovunque entra nell’integrale.

Esempio per fissare le idee. Per la lunghezza di una curva nel piano, un piccolo tratto lungo dxdx contribuisce con 1+y2dx\sqrt{1 + y'^2}\,dx (il teorema di Pitagora applicato a uno spostamento orizzontale dxdx e verticale ydxy'\,dx). Quindi la densità è F=1+y2F = \sqrt{1 + y'^2}, e la lunghezza è L[y]=ab1+y2dxL[y] = \int_a^b \sqrt{1+y'^2}\,dx. Qui FF dipende solo da yy', non da xx né da yy.

La condizione di stazionarietà — la prima variazione nulla, δJ=0\delta J = 0 per ogni perturbazione — sviluppata con il lemma fondamentale, diventa l’equazione di Eulero-Lagrange:

Fyddx ⁣(Fy)=0\frac{\partial F}{\partial y} - \frac{d}{dx}\!\left(\frac{\partial F}{\partial y'}\right) = 0

Leggiamola con cura, perché la notazione spaventa più del contenuto.

Il termine F/y\partial F / \partial y è la derivata parziale di FF rispetto al suo secondo argomento. “Parziale” significa: tratta FF come una funzione ordinaria di tre variabili indipendenti (x,y,y)(x, y, y') e derivala rispetto a yy, tenendo fissi gli altri due. È un’operazione che sai già fare: è la derivata parziale del capitolo sui gradienti.

Il termine F/y\partial F / \partial y' è la stessa cosa rispetto al terzo argomento: deriva FF rispetto a yy', fingendo che yy' sia una variabile come le altre.

Il termine ddx()\frac{d}{dx}(\cdots) è una derivata totale rispetto a xx: prima calcoli F/y\partial F/\partial y' — che risulta essere un’espressione in x,y,yx, y, y' — e poi la derivi rispetto a xx tenendo conto che yy e yy' a loro volta dipendono da xx.

In parole povere, questa equazione dice: lungo la curva ottima, in ogni punto, c’è un equilibrio esatto fra due effetti. Da un lato quanto la densità FF cambia se alzi la curva (F/y\partial F/\partial y). Dall’altro come cambia, spostandosi lungo la curva, la sensibilità della densità alla pendenza (ddxF/y\frac{d}{dx}\,\partial F/\partial y'). Dove i due si bilanciano, la derivata variazionale è nulla: deformare la curva lì non cambia il funzionale. La curva che soddisfa questo bilancio in ogni punto è la curva stazionaria.

Da dove esce, intuitivamente, quel secondo termine con la derivata rispetto a xx? Quando perturbi la curva con un’increspatura η\eta, cambi due cose insieme: il valore yy e la pendenza yy'. Il primo effetto si propaga nel funzionale tramite F/y\partial F/\partial y, ed è diretto. Il secondo è più sottile: la pendenza dell’increspatura è η\eta', la derivata della perturbazione.

Il passaggio tecnico che il capitolo non svolge — l’integrazione per parti — serve esattamente a “scaricare” quella derivata da η\eta' a η\eta, in modo da poter applicare il lemma fondamentale, che parla di η\eta e non di η\eta'. È l’integrazione per parti a produrre il segno meno e la derivata ddx\frac{d}{dx} del secondo termine. Per gli scopi del capitolo basta sapere che il termine c’è perché perturbare una funzione perturba simultaneamente il suo valore e la sua pendenza, e le due perturbazioni non sono indipendenti — la seconda è la derivata della prima.

Vediamo la macchina girare sul caso più semplice. Per la lunghezza, F=1+y2F = \sqrt{1+y'^2}. La densità non contiene yy: quindi F/y=0\partial F/\partial y = 0. Resta ddx(F/y)=0\frac{d}{dx}(\partial F/\partial y') = 0, cioè F/y\partial F/\partial y' è costante lungo la curva.

Calcoliamo F/y\partial F/\partial y' trattando yy' come una variabile qualsiasi: la derivata di 1+u2\sqrt{1+u^2} rispetto a uu è u/1+u2u/\sqrt{1+u^2}, quindi F/y=y/1+y2\partial F/\partial y' = y'/\sqrt{1+y'^2}. Perché questa espressione sia costante, yy' deve essere costante: la pendenza non cambia mai. Una pendenza costante è una retta. La macchina dell’equazione di Eulero-Lagrange, applicata al funzionale-lunghezza, produce in poche righe la risposta che ci aspettavamo. È un buon test: se su un problema dalla risposta nota la procedura sbagliasse, non potremmo fidarci di lei sui problemi dalla risposta ignota.

Una scorciatoia ricorrente, vista qui all’opera, merita un nome. Quando la densità FF non dipende esplicitamente da xx — come capita nella maggior parte dei problemi fisici, dove la legge è la stessa in ogni punto dello spazio — l’equazione di Eulero-Lagrange ammette una quantità conservata, chiamata talvolta integrale di Beltrami: la combinazione FyF/yF - y'\,\partial F/\partial y' resta costante lungo la curva soluzione. Trasforma un’equazione differenziale del secondo ordine in una del primo ordine, molto più facile da risolvere.

Non è un trucco isolato: è la versione variazionale del legame fra simmetrie e leggi di conservazione. Lo stesso principio per cui in fisica l’invarianza nel tempo produce la conservazione dell’energia, e l’invarianza nello spazio la conservazione della quantità di moto — il contenuto del teorema di Emmy Noether (matematica tedesca, 1882-1935), uno dei risultati più profondi della fisica matematica. Per la brachistocrona e la catenaria è proprio questa scorciatoia a rendere i conti gestibili.

Un’osservazione che fa risparmiare lavoro. Se la densità FF non dipende esplicitamente da yy — come nel caso della lunghezza — allora F/y=0\partial F/\partial y = 0, e l’equazione si riduce a ddx(F/y)=0\frac{d}{dx}(\partial F/\partial y') = 0, cioè F/y\partial F/\partial y' è costante lungo la curva. È una “quantità conservata”, e semplifica enormemente i conti. È lo stesso meccanismo per cui, in fisica, una simmetria del problema produce una legge di conservazione.

Ultimo punto, e va sottolineato perché è una fonte di errori. L’equazione di Eulero-Lagrange è una condizione necessaria, non sufficiente. Trova le curve stazionarie — quelle dove la prima variazione si annulla — esattamente come f(x)=0f'(x)=0 trova i candidati nell’analisi ordinaria. Ma una curva stazionaria può essere un minimo, un massimo, o un “punto di sella”. Per distinguere serve un’analisi di secondo ordine, l’analogo della seconda derivata o dell’Hessiana. Eulero-Lagrange ti dà i candidati; non ti garantisce di aver trovato il minimo.

Esempio numerico: la geodetica e la curva curva che batte la retta

Sezione intitolata “Esempio numerico: la geodetica e la curva curva che batte la retta”

Iniziamo da un esempio dove possiamo mettere numeri concreti e verificare la risposta. Da A=(0,0)A=(0,0) a B=(4,3)B=(4,3), qual è la curva di lunghezza minima nel piano? L’equazione di Eulero-Lagrange, applicata al funzionale-lunghezza come visto nella sezione precedente, dice: la retta. La sua lunghezza è 42+32=5\sqrt{4^2+3^2}=5. Qualunque altra curva fra AA e BB è più lunga: una semicirconferenza che li collega misura circa 7,857{,}85, una spezzata che passa per (2,4)(2,4) misura 22+42+22+124,47+2,24=6,71\sqrt{2^2+4^2}+\sqrt{2^2+1^2}\approx 4{,}47+2{,}24=6{,}71. La retta vince, e di parecchio.

Qui la macchina variazionale produce la risposta ovvia, ed è esattamente quello che serve: un test di sanità. Su un problema dalla risposta nota la procedura non sbaglia; questo dà fiducia per i casi dove la risposta non è ovvia — la brachistocrona del prossimo esempio.

Su una superficie curva il risultato cambia, e in modo misurabile. Da Roma a New York, su una mappa piatta (proiezione di Mercatore) la retta sembra la via più breve. Ma la Terra è una sfera, e sulla sfera la geodetica — il cammino più corto — è un arco di cerchio massimo, il cerchio più grande che passa per i due punti.

La rotta di cerchio massimo Roma-New York è circa 300300 km più corta della rotta che su mappa piatta appare diritta, e per questo le rotte aeree intercontinentali, viste su una carta, sembrano incurvarsi assurdamente verso nord. La geodetica è la generalizzazione di “linea retta” a uno spazio curvo: in relatività generale i corpi in caduta libera seguono le geodetiche dello spaziotempo, ed è così che la teoria di Einstein descrive la gravità senza parlare di forze. Lo stesso oggetto matematico — la curva che minimizza un funzionale-lunghezza — collega una rotta aerea e la struttura della gravità.

Torniamo alla pallina di Bernoulli. AA in alto, BB in basso e di lato, scivolamento senza attrito sotto gravità, partenza da fermo. Qual è la forma della guida che minimizza il tempo?

Per costruire il funzionale serve un’osservazione fisica. Per la conservazione dell’energia, dopo essere scesa di un’altezza hh la pallina ha velocità v=2ghv = \sqrt{2gh}: tutta l’energia potenziale persa è diventata energia cinetica. Il tempo per percorrere un tratto lungo dsds è ds/vds/v, e ds=1+y2dxds = \sqrt{1+y'^2}\,dx come per la lunghezza.

Mettendo insieme i pezzi, il funzionale-tempo ha densità proporzionale a (1+y2)/y\sqrt{(1+y'^2)/y} — dove yy è la profondità di discesa. Questa volta FF dipende sia da yy sia da yy': l’equazione di Eulero-Lagrange è meno banale che per la geodetica, e la scorciatoia di Beltrami (la densità non dipende da xx) è ciò che la rende risolvibile. La curva soluzione è un arco di cicloide, la curva tracciata da un punto sul bordo di una ruota che rotola su una superficie piana.

La parte controintuitiva merita una pausa. La retta da AA a BB è il cammino più corto, ma non il più veloce. La cicloide scende ripida all’inizio: la pallina guadagna subito molta velocità, e con quella velocità percorre rapidamente la parte restante, più lunga. Il guadagno di velocità batte la perdita per la maggiore lunghezza.

Ancora più sorprendente: per certe disposizioni di AA e BB, la cicloide ottima fa risalire la pallina per un tratto prima di arrivare a BB — e il percorso resta comunque il più veloce. La nostra intuizione confonde sistematicamente “più corto” con “più rapido”. Il calcolo delle variazioni, applicato al funzionale giusto, smonta la confusione.

C’è anche una proprietà che dà alla cicloide il suo secondo nome, tautocrona (dal greco, “stesso tempo”). Una pallina lasciata cadere lungo un arco di cicloide impiega lo stesso tempo a raggiungere il fondo qualunque sia il punto da cui parte: una pallina lasciata vicino al fondo e una lasciata in cima arrivano in basso simultaneamente. È il fatto che Christiaan Huygens (fisico e matematico olandese, 1629-1695) sfruttò provando a costruire pendoli a oscillazione isocrona — di periodo costante — basati su guide cicloidali. Lo stesso funzionale, lo stesso oggetto matematico, due problemi distinti che vi convergono: è il tipo di sorpresa che il calcolo delle variazioni produce con regolarità.

Una catena flessibile e inestensibile, appesa per i due estremi: che forma assume? La fisica dà il criterio: il sistema si dispone nella configurazione di minima energia potenziale gravitazionale. Più la catena pende in basso, minore è l’energia di un suo tratto; ma la lunghezza totale della catena è fissata, quindi non può pendere all’infinito.

Il funzionale è l’energia potenziale, con densità proporzionale a y1+y2y\sqrt{1+y'^2}: l’altezza yy di ogni tratto pesata dalla lunghezza 1+y2dx\sqrt{1+y'^2}\,dx del tratto stesso. Più un tratto è basso e più il suo contributo all’energia è piccolo; il sistema “vorrebbe” quindi che tutta la catena fosse il più in basso possibile.

La novità rispetto agli esempi precedenti è il vincolo che impedisce a quel desiderio di realizzarsi senza limiti: la lunghezza totale 1+y2dx\int\sqrt{1+y'^2}\,dx deve essere un valore fissato. Si gestisce con un moltiplicatore di Lagrange, esattamente la tecnica dei vincoli nell’ottimizzazione ordinaria — si aggiunge alla densità un termine proporzionale alla densità di lunghezza, con un coefficiente da determinare.

Il risultato è la catenaria, y=acosh(x/a)y = a\cosh(x/a), dove cosh\cosh è il coseno iperbolico e aa un parametro che dipende dalla lunghezza della catena e dalla distanza fra gli appigli. È un fatto utile da sapere: la catenaria non è una parabola, anche se le somiglia molto. La differenza, piccola a occhio, è rilevante nel design strutturale — archi, ponti sospesi, profilo di sag dei cavi dell’alta tensione. Un arco rovesciato a forma di catenaria sostiene il proprio peso in pura compressione: per questo molte strutture autoportanti hanno quel profilo.

Questo esempio insegna qualcosa che vale ben oltre la catena. Il vincolo “lunghezza fissata” è la stessa cosa che, nell’ottimizzazione ordinaria, gestisci con i moltiplicatori di Lagrange: aggiungi all’obiettivo un termine penalizzante, pesato da un moltiplicatore, e cerchi la stazionarietà del tutto. Nel calcolo delle variazioni la tecnica è identica, solo applicata a un funzionale invece che a una funzione. Lo ritroverai senza cambiamenti nell’ELBO del VAE: il termine di regolarizzazione KL gioca esattamente il ruolo del vincolo, e nelle varianti come il β\beta-VAE quel termine viene pesato da un coefficiente che è, nello spirito, un moltiplicatore di Lagrange. La grammatica dei vincoli non cambia quando si sale dallo spazio dei numeri allo spazio delle funzioni.

Esempio in codice: risolvere un problema variazionale per discretizzazione

Sezione intitolata “Esempio in codice: risolvere un problema variazionale per discretizzazione”

Il terzo angolo di intuizione diceva che un funzionale discretizzato diventa una funzione di NN variabili. Vediamolo all’opera. Prendiamo il problema più semplice — la geodetica nel piano, dove sappiamo già che la risposta è la retta — e risolviamolo numericamente, senza usare l’equazione di Eulero-Lagrange. È il modo concreto in cui molti problemi variazionali si affrontano al computer, e mostra che “ottimizzare un funzionale” non è un’astrazione irraggiungibile.

L’idea: rappresentiamo la curva come NN valori di altezza, teniamo fissi i due estremi, definiamo la lunghezza come somma sui tratti, e lasciamo che una discesa del gradiente trovi la curva più corta.

import numpy as np
N = 50 # numero di punti della griglia
x = np.linspace(0.0, 1.0, N)
dx = x[1] - x[0]
# curva iniziale: una "gobba" qualunque fra gli estremi fissati
y = np.sin(np.pi * x) * 0.6
y[0], y[-1] = 0.0, 0.0 # estremi fissi: A=(0,0), B=(1,0)
def lunghezza(y):
# funzionale discretizzato: somma di sqrt(dx^2 + dy^2) sui tratti
dy = np.diff(y)
return np.sum(np.sqrt(dx**2 + dy**2))
# discesa del gradiente sui punti interni; il gradiente, calcolato
# numericamente, e la versione su griglia della derivata variazionale
passo = 0.5
for _ in range(20000):
grad = np.zeros(N)
eps = 1e-6
for i in range(1, N - 1): # estremi esclusi: sono fissi
y_perturbata = y.copy()
y_perturbata[i] += eps
grad[i] = (lunghezza(y_perturbata) - lunghezza(y)) / eps
y[1:-1] -= passo * grad[1:-1]
print(f"lunghezza finale: {lunghezza(y):.4f}") # -> ~1.0000, la retta

Tre cose vanno notate. Primo: la curva è un vettore y di N numeri, e il funzionale lunghezza è una funzione ordinaria di quel vettore — esattamente il terzo angolo di intuizione. Secondo: gli estremi y[0] e y[-1] non si toccano mai, perché il problema fissa AA e BB; si perturbano solo i punti interni, come la funzione η\eta che si annulla agli estremi. Terzo: il vettore grad è la derivata variazionale discretizzata — quanto la lunghezza cambia se “pizzichi” la curva nel punto ii. La discesa del gradiente la annulla, e la curva converge alla retta da (0,0)(0,0) a (1,0)(1,0), di lunghezza 11.

Lo stesso schema — discretizza, scrivi il funzionale come somma, minimizza il vettore — funziona per la brachistocrona (basta cambiare la funzione lunghezza con il funzionale-tempo) e per la catenaria (aggiungendo il vincolo di lunghezza). È la dimostrazione operativa che “ottimizzare una funzione di funzioni” non richiede magie: richiede solo abbastanza punti di griglia.

Il codice qui sopra calcola il gradiente in modo grezzo, perturbando un punto alla volta — è didatticamente trasparente ma lento, perché ogni passo richiede N valutazioni del funzionale. In pratica si userebbe la differenziazione automatica, lo stesso meccanismo che sta sotto la backpropagation: si scrive il funzionale come un grafo di operazioni e una libreria propaga il gradiente all’indietro in un colpo solo. Vale la pena notarlo, perché chiude un anello. Addestrare una rete neurale e risolvere numericamente un problema variazionale non sono attività imparentate alla lontana: sono lo stesso atto — discretizzare, calcolare un gradiente, scendere — applicato a oggetti che il terzo angolo di intuizione ha mostrato essere la stessa cosa, una funzione e un vettore con molte componenti.

L’esempio che dà al calcolo delle variazioni la sua portata, e che è la motivazione fisica più profonda.

In meccanica classica si definisce una grandezza chiamata azione. È forse l’esempio di funzionale più importante della scienza, e vale la pena introdurlo con calma. Data la traiettoria q(t)q(t) di un sistema — la sua posizione in funzione del tempo — l’azione è il funzionale

S[q]=t1t2Ldt,L=TVS[q] = \int_{t_1}^{t_2} L\,dt, \qquad L = T - V

dove LL è la lagrangiana, definita come l’energia cinetica TT meno l’energia potenziale VV. Il principio di minima azione — più correttamente principio di azione stazionaria, o principio di Hamilton — afferma che, fra tutte le traiettorie immaginabili che collegano una configurazione iniziale a una finale, quella che il sistema percorre davvero è quella che rende l’azione stazionaria.

Applica l’equazione di Eulero-Lagrange a questo funzionale e ottieni le equazioni del moto di Newton. Questo è notevole. È un cambio completo di prospettiva sulla fisica.

La formulazione di Newton è locale e causale: in ogni istante la forza determina l’accelerazione, F=maF = ma, e la traiettoria si costruisce passo dopo passo. La formulazione variazionale è globale: fra tutte le storie possibili, il sistema “sceglie” quella stazionaria. Le due formulazioni descrivono lo stesso moto — non sono in competizione, sono lo stesso contenuto fisico scritto in due linguaggi.

C’è un’obiezione naturale, e vale la pena affrontarla perché illumina il principio. Come fa la pallina a “sapere”, istante per istante, quale sarà la traiettoria di azione stazionaria, se la stazionarietà è una proprietà globale dell’intera storia? La risposta è che non lo sa, e non deve. Le due formulazioni sono matematicamente equivalenti: applicare l’equazione di Eulero-Lagrange al funzionale-azione produce le equazioni locali del moto. Il sistema obbedisce alla legge locale, istante per istante; ma chi guarda la traiettoria completa, a posteriori, la trova stazionaria. Il principio variazionale non è un meccanismo causale alternativo: è una descrizione equivalente, e spesso più maneggevole, dello stesso fatto fisico.

La portata va oltre la meccanica. Il principio di Fermat per l’ottica (la luce segue il cammino di tempo stazionario), le equazioni dell’elettromagnetismo, la relatività generale, e — nella formulazione di Feynman tramite l’integrale sui cammini — la meccanica quantistica: tutte si possono scrivere come principi variazionali. È una delle idee unificanti più forti della fisica, e il calcolo delle variazioni è il suo linguaggio. È anche la ragione per cui il salto verso il machine learning, che segue, non è un’analogia forzata: dire che un modello generativo “minimizza un funzionale” lo colloca nella stessa famiglia di formulazioni che descrive la luce, le orbite e i campi.

Applicazioni pratiche: il ponte verso il machine learning

Sezione intitolata “Applicazioni pratiche: il ponte verso il machine learning”

Fin qui curve, palline, catene. Ora il salto che giustifica il capitolo in una wiki sull’AI. Il calcolo delle variazioni non è solo fisica del Settecento: è la struttura matematica dietro alcune delle idee più produttive del machine learning generativo.

Inferenza variazionale: trasformare integrazione in ottimizzazione

Sezione intitolata “Inferenza variazionale: trasformare integrazione in ottimizzazione”

In statistica bayesiana il problema ricorrente è questo. Hai un modello con variabili nascoste — chiamiamole zz, le cause o variabili latenti — e dati osservati xx. Dopo aver visto i dati vuoi la distribuzione a posteriori p(zx)p(z \mid x): cosa puoi dire sulle cause, viste le osservazioni.

Un esempio concreto rende meno astratto il discorso. Hai un mucchio di foto di volti e vuoi un modello che li abbia “capiti”. Le variabili latenti zz sarebbero i fattori nascosti che generano un volto — l’orientamento della testa, l’illuminazione, l’espressione, l’identità — e xx è l’immagine di pixel osservata. La posterior p(zx)p(z\mid x) risponde alla domanda: vista questa foto, quali fattori latenti l’hanno prodotta? È esattamente ciò che serve per generare volti nuovi, o per ritrovare due foto della stessa persona vicine nello spazio dei fattori.

Il guaio è che questa posterior è quasi sempre intrattabile: scriverla richiede di calcolare un integrale di normalizzazione che, per modelli realistici, non si sa fare in forma chiusa e costa troppo numericamente. Il denominatore della regola di Bayes, p(x)p(x), è un integrale su tutte le possibili configurazioni latenti — e quelle configurazioni sono troppe per enumerarle.

L’inferenza variazionale (variational inference) aggira il problema con una mossa che è puro calcolo delle variazioni. Invece di calcolare la posterior esatta, la approssima. Si sceglie una famiglia di distribuzioni maneggevoli — chiamiamole q(z)q(z), per esempio tutte le gaussiane — e si cerca, dentro quella famiglia, la qq “più vicina possibile” alla vera posterior. La vicinanza si misura con la divergenza di Kullback-Leibler KL(qp)\mathrm{KL}(q \,\|\, p), una misura di quanto due distribuzioni differiscono (è sempre non negativa, e vale zero solo quando le due distribuzioni coincidono); è il tema del capitolo entropia-cross-entropy (in preparazione).

Guarda cosa è appena successo. L’incognita non è un numero: è una funzione, la densità qq. L’obiettivo — la KL da minimizzare — è un numero che dipende da tutta la funzione qq. È un funzionale. Cercare la qq che minimizza la KL è un problema variazionale. L’inferenza variazionale, in una frase, trasforma un problema di integrazione in un problema di ottimizzazione — e l’ottimizzazione è su uno spazio di funzioni.

C’è un ostacolo: la KL che vorremmo minimizzare contiene proprio la costante intrattabile da cui stavamo scappando. Si aggira con un’identità esatta. Per ogni scelta di qq vale

logp(x)=ELBO[q]+KL(qp(zx))\log p(x) = \mathrm{ELBO}[q] + \mathrm{KL}\big(q \,\|\, p(z\mid x)\big)

dove l’ELBO (Evidence Lower BOund, limite inferiore dell’evidenza) è il funzionale

ELBO[q]=Eq[logp(x,z)]Eq[logq(z)]\mathrm{ELBO}[q] = \mathbb{E}_{q}\big[\log p(x, z)\big] - \mathbb{E}_{q}\big[\log q(z)\big]

In parole: l’ELBO è il valore atteso, secondo qq, della log-probabilità congiunta del modello, meno il valore atteso della log-densità di qq stessa — un termine, quest’ultimo, che è l’entropia di qq.

L’identità è il punto chiave. Il termine logp(x)\log p(x) — la log-evidenza — è un numero fisso: non dipende da qq. La KL è sempre non negativa (è una conseguenza della disuguaglianza di Jensen, capitolo sulla convessità).

Quindi l’ELBO è sempre minore o uguale a logp(x)\log p(x): è un limite inferiore dell’evidenza, da cui il nome. E poiché la loro somma è costante, massimizzare l’ELBO equivale esattamente a minimizzare la KL. Spingendo in alto il limite inferiore, lo avvicini al valore fisso che sta sopra, e quel valore fisso è raggiungibile solo quando la KL è zero — cioè quando qq coincide con la vera posterior.

Va marcata la classe di questa affermazione, perché è il cuore del capitolo. Non è un’analogia: è un’equivalenza dimostrata. Si legge direttamente dall’identità: se la somma di due termini è costante e tu fai crescere il primo, il secondo cala della stessa quantità. Massimizzare l’ELBO è minimizzare la KL, non assomiglia a. L’ELBO è un funzionale di qq — prende in input una distribuzione, restituisce un numero — e il problema “trova la migliore approssimazione della posterior” è il problema variazionale “massimizza questo funzionale”.

Un’immagine numerica per fissarla. Immagina che la log-evidenza valga 100-100 — un numero che non sai calcolare, ma che è fisso. La tua qq attuale produce un ELBO di 115-115: il divario, 1515, è la KL, la “distanza” residua dalla vera posterior. Migliori qq, l’ELBO sale a 103-103: la KL è scesa a 33. La qq è ora molto più vicina alla posterior. Non hai mai calcolato la posterior né la log-evidenza; hai solo fatto crescere un numero che sai calcolare, l’ELBO, e l’altro è calato da solo. Questo è il senso operativo di “trasformare l’integrazione in ottimizzazione”: rinunci a calcolare la posterior esatta e in cambio ottieni un funzionale da massimizzare e una garanzia — più alto l’ELBO, più vicina l’approssimazione.

Va distinto il caso davvero variazionale da quello solo parametrico, perché il termine “inferenza variazionale” copre entrambi. Nella sua forma classica, l’inferenza variazionale mean-field, non si fissa alcuna famiglia parametrica: si assume soltanto che qq si fattorizzi — le variabili latenti sono indipendenti sotto qq — e si cerca la migliore qq in quello spazio enorme di funzioni-distribuzione. La condizione di ottimo che ne esce è una vera equazione variazionale, cugina di Eulero-Lagrange: ogni fattore di qq, all’ottimo, deve avere una forma precisa che dipende dagli altri fattori, e si itera fino a convergenza. Qui il problema è genuinamente “ottimizzare una funzione di funzioni”. È il caso, per esempio, dei modelli a variabili latenti in statistica bayesiana classica.

VAE: inferenza variazionale dentro una rete neurale

Sezione intitolata “VAE: inferenza variazionale dentro una rete neurale”

Il variational autoencoder (VAE), introdotto da Diederik Kingma e Max Welling nel paper Auto-Encoding Variational Bayes (2013, presentato a ICLR 2014), è l’incarnazione concreta di tutto questo dentro una rete neurale.

Un VAE ha due reti. L’encoder prende un input — per esempio un’immagine — e produce i parametri di una distribuzione q(zx)q(z\mid x) gaussiana su uno spazio latente: una media e una varianza. Il decoder prende un punto zz campionato da quella distribuzione e prova a ricostruire l’input.

L’obiettivo di training è l’ELBO, che per il VAE si riscrive come somma di due termini interpretabili: un termine di ricostruzione — quanto bene il decoder riproduce l’input — e un termine di regolarizzazione KL — quanto la distribuzione prodotta dall’encoder si discosta da un prior fissato sul latente, di solito una gaussiana standard.

Adesso si capisce perché la loss del VAE ha proprio quella forma. Il termine di ricostruzione e il termine KL non sono due ingredienti scelti a mano e bilanciati a occhio: sono i due pezzi in cui si spacca naturalmente l’ELBO. Il “variational” del nome viene da qui — dall’inferenza variazionale.

Il VAE, tecnicamente, è inferenza variazionale amortizzata. Nella variational inference classica, per ogni nuovo dato osservato si dovrebbe risolvere da capo un problema di ottimizzazione per trovare la qq ottima di quel dato. Il VAE elimina questo costo ripetuto: una rete — l’encoder — impara una funzione che, dato un input qualsiasi, sputa fuori direttamente i parametri della qq approssimante. Si paga una volta sola, addestrando l’encoder, e poi l’inferenza su un dato nuovo costa quanto un passaggio in avanti nella rete. L‘“amortizzazione” è esattamente questo: il costo dell’ottimizzazione spalmato su tutti gli input presenti e futuri.

Resta un dettaglio che chiude il cerchio con il calcolo delle variazioni e merita un cenno: il reparameterization trick. Per addestrare il VAE con la discesa del gradiente serve poter derivare l’ELBO rispetto ai parametri dell’encoder, ma in mezzo c’è un campionamento casuale da qq — e attraverso un campionamento il gradiente non passa. Il trucco riscrive il campione come una trasformazione deterministica dei parametri più un rumore fisso, in modo che la derivata possa attraversarlo. È un accorgimento tecnico, non variazionale; ma è ciò che permette al principio variazionale (massimizzare l’ELBO) di essere realizzato con l’algoritmo parametrico (la discesa del gradiente). Tieni a mente questa coppia — principio variazionale, esecuzione parametrica — perché è la confusione centrale che la sezione successiva smonta.

Il filo si allunga in due direzioni.

Verso le scienze cognitive: il free energy principle del neuroscienziato britannico Karl Friston propone che i sistemi biologici, il cervello in primis, agiscano per minimizzare una quantità chiamata energia libera variazionale. Quella quantità è, matematicamente, lo stesso oggetto dell’ELBO con il segno cambiato: minimizzare l’energia libera è massimizzare l’ELBO. Questa è ancora un’equivalenza formale, non un’analogia — i due funzionali sono lo stesso oggetto. Qui è solo un richiamo: il free energy principle è trattato a fondo nel capitolo Predictive processing e cervello come macchina predittiva. Il punto che interessa è il filo: lo stesso funzionale variazionale appare come obiettivo di training di un modello generativo e come principio proposto del funzionamento del cervello.

Verso i modelli generativi più recenti: i diffusion model — la famiglia di modelli dietro generatori di immagini come Stable Diffusion — si addestrano anch’essi con un obiettivo che discende da un ELBO. Un diffusion model definisce un processo forward che aggiunge rumore gaussiano a un dato in molti piccoli passi, fino a ridurlo a puro rumore, e impara il processo reverse che rimuove il rumore passo dopo passo.

La loss di training è un limite inferiore variazionale della log-verosimiglianza dei dati, e si scompone in una somma di termini KL, uno per ogni passo di rumore. Il legame con i processi stocastici è diretto: forward e reverse sono processi stocastici, e nella versione discreta sono catene di Markov — l’ELBO si scompone proprio passo per passo lungo la catena.

C’è un dettaglio storico che chiarisce la parentela. Il VAE ha un solo passo latente; un diffusion model si può leggere come un VAE gerarchico con centinaia o migliaia di passi latenti incatenati, dove ogni passo è una versione lievemente più rumorosa della precedente. L’ELBO dell’uno è la versione “a un livello” dell’ELBO dell’altro. Anche qui vale la distinzione che ribadiremo nella prossima sezione: il principio è variazionale, l’ottimizzazione effettiva è discesa del gradiente sui parametri di una rete.

C’è un quarto luogo dove il calcolo delle variazioni riappare, e fa da ponte verso le Parti su control theory e reinforcement learning. Il problema del controllo ottimo è: dato un sistema che evolve nel tempo, trovare la legge di controllo u(t)u(t) — la sequenza di azioni — che minimizza un funzionale di costo, tipicamente un integrale nel tempo che pesa l’errore rispetto a un obiettivo e lo sforzo speso. L’incognita u(t)u(t) è una funzione del tempo, il costo è un funzionale di uu: è un problema variazionale.

Storicamente il controllo ottimo è il discendente diretto del calcolo delle variazioni. Il principio del massimo di Pontryagin (Lev Pontryagin, matematico sovietico, 1908-1988, con il suo gruppo, fine anni ‘50) e la programmazione dinamica di Richard Bellman (matematico statunitense, 1920-1984) sono le sue due grandi riformulazioni novecentesche.

L’equazione di Bellman, che è il cuore del reinforcement learning, è la versione “su stati e decisioni discrete” della stessa idea: cercare la funzione — qui la policy, la strategia — che ottimizza un costo accumulato lungo una traiettoria. Quando in RL si ottimizza una policy parametrica con la discesa del gradiente vale, ancora, la distinzione del paragrafo seguente: il principio è variazionale, l’algoritmo è parametrico.

Vale la pena tirare le somme di questa sezione, perché il filo è lungo. Inferenza variazionale, ELBO, VAE, free energy principle, diffusion model, controllo ottimo: in tutti questi casi l’incognita non è un numero ma una funzione — una distribuzione, una policy, una traiettoria — e l’obiettivo è un funzionale. Il calcolo delle variazioni non è una curiosità storica relegata alla fisica del Settecento: è la cornice concettuale comune a una buona parte del machine learning generativo e del decision making. Conoscerla non ti fa scrivere meglio il codice di un VAE, ma ti fa capire perché quel codice ha la forma che ha, e ti permette di vedere come imparentati strumenti che, presi uno per uno, sembrano scollegati.

Il calcolo delle variazioni è potente, e proprio per questo invita a confusioni precise. Questa sezione le elenca, perché distinguerle è metà del valore del capitolo.

Il primo inciampo è lessicale. “Funzione di funzioni” suona come f(g(x))f(g(x)), la composizione di funzioni che conosci dalla programmazione e dall’analisi. Non è quello. In f(g(x))f(g(x)) l’input finale è ancora un numero, xx, e gg è solo un passaggio intermedio.

In un funzionale J[y]J[y] l’input è l’intera funzione yy, considerata come un singolo oggetto. La lunghezza di una curva non è una curva valutata in un punto: è un numero che dipende da come la curva è fatta ovunque. Un modo di tenerli separati: f(g(x))f(g(x)) produce un numero diverso per ogni xx che gli passi — è ancora una funzione di un numero. Un funzionale J[y]J[y] produce un solo numero per l’intera yy. Tenere separati “comporre funzioni” e “valutare un funzionale” è il primo passo per non confondersi.

”Minima azione” raramente significa “minimo”

Sezione intitolata “”Minima azione” raramente significa “minimo””

Il principio si chiama storicamente “di minima azione”, ma il nome corretto è “di azione stazionaria”. La traiettoria fisica rende l’azione stazionaria — derivata variazionale nulla — e questo può essere un minimo, ma anche un massimo o un punto di sella. Per molti sistemi reali la traiettoria è in effetti un punto di sella dell’azione, non un minimo.

“Minima azione” è il nome che la storia ci ha lasciato, e in parte riflette una posizione filosofica del Settecento — Maupertuis vi vedeva un segno di economia della natura. Ma matematicamente è una descrizione imprecisa: il principio corretto chiede stazionarietà. Lo stesso vale per l’equazione di Eulero-Lagrange in generale, e per ogni problema variazionale. Dà la stazionarietà, non il minimo. Confondere i due è l’analogo, un piano sopra, di credere che f(x)=0f'(x)=0 implichi “minimo”.

Conseguenza del punto precedente, ma merita una voce sua. L’equazione di Eulero-Lagrange è una condizione necessaria: ogni soluzione del problema variazionale la soddisfa. Non è sufficiente: una curva che la soddisfa non è automaticamente un minimo. È lo stesso rapporto che c’è fra f(x)=0f'(x)=0 e “minimo” nell’analisi ordinaria — la derivata nulla individua i candidati, ma servono le condizioni di secondo ordine per classificarli.

In dimensione infinita può andare peggio. Esistono problemi variazionali ben posti il cui minimo non viene raggiunto da nessuna funzione liscia: l’estremo inferiore del funzionale esiste come numero, ma nessuna funzione lo realizza, perché le funzioni che si avvicinano al valore ottimo diventano sempre più “increspate” e non convergono a una funzione regolare. È un fenomeno controintuitivo — in Rn\mathbb{R}^n un insieme chiuso e limitato contiene sempre il suo minimo — e non ha analogo nell’ottimizzazione di funzioni di poche variabili. La branca dei “metodi diretti” del calcolo delle variazioni nasce proprio per stabilire, prima di cercarla, quando una soluzione esiste davvero. Per il taglio di questa wiki basta sapere che la domanda esiste: non si dà per scontato che un funzionale abbia un minimo solo perché è facile da scrivere.

La KL è asimmetrica, e la scelta della direzione cambia il risultato

Sezione intitolata “La KL è asimmetrica, e la scelta della direzione cambia il risultato”

Una confusione specifica dell’inferenza variazionale, e seria. La divergenza di Kullback-Leibler non è una distanza simmetrica: KL(qp)\mathrm{KL}(q \,\|\, p) e KL(pq)\mathrm{KL}(p \,\|\, q) sono due numeri diversi. L’inferenza variazionale, così come l’abbiamo presentata, minimizza KL(qp)\mathrm{KL}(q \,\|\, p) — la KL “in avanti”, da qq verso pp. Questa scelta non è neutra: ha una conseguenza qualitativa precisa, chiamata mode-seeking. La qq ottima tende a concentrarsi su una sola delle regioni di alta probabilità della vera posterior, anche quando la posterior ne ha diverse, e a sottostimare la varianza. L’altra direzione, KL(pq)\mathrm{KL}(p \,\|\, q), avrebbe il comportamento opposto, mode-covering: la qq proverebbe a coprire tutta la posterior, sovrastimandone la dispersione.

La conseguenza pratica: un’approssimazione variazionale della posterior tende a essere troppo “sicura di sé”, più stretta di quanto la vera incertezza giustifichi. Chi usa l’inferenza variazionale per quantificare l’incertezza deve saperlo. Non è un difetto di implementazione: è una proprietà strutturale della scelta di quale KL minimizzare, e va dichiarata, non scoperta a posteriori.

L’analogia con il gradiente è strutturale, non un’identità

Sezione intitolata “L’analogia con il gradiente è strutturale, non un’identità”

La tabella del primo angolo è uno strumento di intuizione potente, e va usata. Ma va usata sapendo che è un’analogia strutturale, non un’equivalenza. Lo spazio delle funzioni ha infinite dimensioni, e diverse cose che in Rn\mathbb{R}^n sono gratuite — l’esistenza di un minimo per una funzione continua su un insieme chiuso e limitato, la compattezza — in dimensione infinita non valgono più senza ipotesi extra.

Il rigore del campo — gli spazi di Sobolev, i metodi diretti, le condizioni di semicontinuità — esiste esattamente per gestire la distanza fra l’analogia comoda e la realtà infinito-dimensionale. È la stessa relazione che, nel terzo angolo, lega la griglia a NN punti al limite continuo: finché NN è finito sei in RN\mathbb{R}^N e tutto funziona come ti aspetti, ma il passaggio al limite NN\to\infty può far perdere proprietà. Per gli scopi di questa wiki l’analogia basta e avanza; ma “la derivata variazionale è il gradiente” è una frase da leggere con “è come” e non con “è”.

Principio variazionale contro ottimizzazione parametrica

Sezione intitolata “Principio variazionale contro ottimizzazione parametrica”

È la confusione più rilevante per chi viene dal machine learning, e va sciolta con cura. Il nodo è che la parola “variazionale” compare in due ruoli diversi, e scivolare dall’uno all’altro è facilissimo.

Dire “il VAE usa il calcolo delle variazioni” è vero — a livello di principio. L’ELBO è un funzionale, e nella sua forma più generale, l’inferenza variazionale mean-field, la distribuzione qq ottima viene cercata in un intero spazio di funzioni, con condizioni di stazionarietà che sono parenti strette dell’equazione di Eulero-Lagrange. Lì il problema è genuinamente variazionale.

Ma l’addestramento concreto di un VAE non risolve un problema variazionale. La qq non viene cercata in uno spazio di funzioni qualsiasi: viene scelta parametrica — una gaussiana la cui media e varianza sono prodotte da una rete neurale con parametri ϕ\phi. Una volta fissata la famiglia parametrica, l’incognita torna a essere un vettore di numeri, ϕ\phi, e l’ottimizzazione torna a essere quella ordinaria: discesa del gradiente sui parametri, il metodo del capitolo discesa-gradiente (in preparazione).

La distinzione è netta e va tenuta ferma. Il calcolo delle variazioni motiva l’obiettivo: spiega perché si massimizza l’ELBO, perché l’ELBO ha quella forma, cosa significa “approssimare la posterior”. Ma il calcolo delle variazioni non è l’algoritmo che gira quando addestri un VAE o un diffusion model. Il principio è variazionale; l’implementazione è parametrica. Confondere i due livelli — credere che addestrare un VAE significhi risolvere un’equazione di Eulero-Lagrange — è l’errore tipico che questo capitolo vuole prevenire.

Vale la pena dirlo chiaramente. La stragrande maggioranza del lavoro pratico con modelli di AI non richiede il calcolo delle variazioni. Usi una libreria che implementa la loss del VAE; addestri un diffusion model con un trainer già scritto. Il calcolo delle variazioni serve a capire da dove viene quella loss, non a scriverla da zero ogni volta.

C’è anche un rischio opposto da segnalare, quello di vedere problemi variazionali ovunque. Non ogni ottimizzazione che coinvolge funzioni è calcolo delle variazioni. Quando addestri una rete a classificare immagini, l’incognita sono i pesi — un vettore di numeri — e la rete è solo lo strumento che li usa: è ottimizzazione ordinaria, anche se il numero di parametri è enorme. Il calcolo delle variazioni entra in gioco quando l’oggetto che cerchi è concettualmente una funzione intera — una distribuzione, una traiettoria, una policy — e l’obiettivo dipende da come quella funzione è fatta dappertutto. La discriminante non è “ci sono funzioni in mezzo”, è “l’incognita è una funzione”.

È un capitolo della Parte VI, dichiaratamente opzionale: chi lo salta può usare un VAE lo stesso. Chi lo legge smette di vedere l’ELBO come una formula arbitraria e comincia a vederlo come quello che è — un funzionale, e il problema di massimizzarlo come l’ultimo discendente di una linea che parte dalla pallina di Bernoulli nel 1696.

  • Analisi matematica: limiti, continuità, derivate — la derivata come pendenza e il punto stazionario come luogo a pendenza nulla: il calcolo delle variazioni è quella stessa idea trasportata sulle funzioni.
  • Derivate parziali, gradienti, Jacobiani — la derivata variazionale è l’analogo infinito-dimensionale del gradiente; le derivate parziali di FF rispetto a yy e yy' entrano direttamente nell’equazione di Eulero-Lagrange.
  • Hessiana, curvatura, condizionamento — distinguere un minimo da un punto di sella richiede l’analisi di secondo ordine, l’analogo variazionale dell’Hessiana.
  • Taylor come approssimazione locale — la prima variazione è lo sviluppo al primo ordine del funzionale: la stessa idea dell’approssimazione di Taylor, estesa allo spazio delle funzioni.
  • Convessità, Jensen, minimi globali — la non negatività della divergenza di Kullback-Leibler, che rende l’ELBO un vero limite inferiore, è una conseguenza diretta della disuguaglianza di Jensen.
  • Processi stocastici e dinamiche casuali — i processi forward e reverse di un diffusion model sono processi stocastici, e l’obiettivo variazionale è ciò che li allinea.
  • Catene di Markov, stazionarietà, mixing — il processo di diffusione discreto è una catena di Markov; l’ELBO dei diffusion model si scompone in termini KL passo per passo lungo la catena.
  • Predictive processing e cervello come macchina predittiva — il free energy principle di Friston usa l’energia libera variazionale, che è l’ELBO cambiato di segno.
  • entropia-cross-entropy (in preparazione) — la divergenza di Kullback-Leibler e l’entropia sono i due mattoni con cui è costruito l’ELBO.
  • discesa-gradiente (in preparazione) — l’ottimizzazione parametrica dell’ELBO è discesa del gradiente: il contrasto con il principio variazionale chiarisce cosa è variazionale e cosa no.
  • vae (in preparazione) — il variational autoencoder è l’applicazione diretta dell’inferenza variazionale dentro una rete neurale.
  • diffusion (in preparazione) — i modelli di diffusione si addestrano con un obiettivo che discende da un ELBO scomposto lungo la catena di rumore.
  • Jeff Calder, The Calculus of Variations (lecture notes, University of Minnesota, 2017) — note di corso accessibili: funzionale, prima variazione, derivazione dell’equazione di Eulero-Lagrange, brachistocrona e geodetiche con i conti svolti.
  • Richard Feynman, The Principle of Least Action (The Feynman Lectures on Physics, Vol. II, Cap. 19) — l’esposizione classica e intuitiva del principio di minima azione: perché un sistema fisico “sceglie” la traiettoria stazionaria. Disponibile gratuitamente online.
  • David Blei, Alp Kucukelbir, Jon McAuliffe, Variational Inference: A Review for Statisticians (Journal of the American Statistical Association, 2017) — la review canonica dell’inferenza variazionale: KL, ELBO, mean-field, scritta per chi vuole capire i fondamenti senza inseguire la letteratura più recente.
  • Diederik Kingma, Max Welling, Auto-Encoding Variational Bayes (ICLR 2014) — il paper che introduce il variational autoencoder e il reparameterization trick. È il punto in cui inferenza variazionale e reti neurali si incontrano.
  • Karl Friston, The free-energy principle: a unified brain theory? (Nature Reviews Neuroscience, 2010) — l’articolo di riferimento sul free energy principle, per vedere come lo stesso funzionale variazionale dei modelli generativi viene proposto come principio del funzionamento del cervello.