Salta ai contenuti

Processi stocastici e dinamiche casuali

Una variabile aleatoria estratta produce un numero. Un processo stocastico estratto produce un’intera funzione del tempo: una traiettoria. Questo capitolo costruisce il vocabolario per descrivere qualunque sistema che evolve sotto incertezza — e mostra che tre oggetti centrali dell’AI moderna, la traiettoria dei pesi di una rete durante il training, il rumore che un diffusion model aggiunge a un’immagine, il prior su funzioni di una regressione bayesiana, sono tutti, letteralmente, processi stocastici.

Quando addestri una rete neurale, i pesi non scendono lungo la loss in linea retta. Disegnano una traiettoria frastagliata, che a ogni passo devia un po’ a caso perché il gradiente è calcolato su un minibatch estratto a sorte. Quella traiettoria non è un difetto da tollerare: è un oggetto matematico con un nome preciso, un random walk con deriva, e capirne le proprietà spiega cose che altrimenti restano folklore — perché un learning rate troppo alto fa esplodere il training, perché batch più piccoli a volte generalizzano meglio, perché lo scheduling del learning rate assomiglia a un raffreddamento.

Lo stesso oggetto ricompare altrove. Un diffusion model — la famiglia di modelli dietro Stable Diffusion, DALL-E, Sora — impara a generare immagini invertendo un processo che le distrugge: parte da una foto e ci aggiunge rumore gaussiano, un po’ alla volta, finché non resta che neve televisiva. Quel “distruttore” è un processo stocastico, e il fatto che sia stocastico, markoviano e gaussiano è esattamente ciò che rende il modello addestrabile. Più in disparte, ma altrettanto fondata su questo capitolo, c’è la regressione con processi gaussiani: un modo di fare previsioni che restituisce non un numero ma una distribuzione, con barre d’incertezza che si allargano dove i dati mancano.

Tre cose diverse — un optimizer, un modello generativo, un metodo di regressione — che si capiscono bene solo se si possiede un vocabolario unico. Quel vocabolario è il contenuto del capitolo. La Parte IV ha trattato la probabilità come strumento statico: una distribuzione, un valore atteso, una varianza, fotografati in un istante. Il capitolo precedente di questa Parte, Variabili aleatorie, convergenza, disuguaglianze, ha reso rigorosa quella probabilità statica. Qui si aggiunge l’asse mancante: il tempo. Cosa succede quando l’incertezza non è una fotografia ma un film — quando la quantità aleatoria evolve, passo dopo passo, e ogni passo dipende da come è andato il precedente.

La storia dei processi stocastici comincia, curiosamente, lontano dalla matematica. Nel 1827 il botanico scozzese Robert Brown (1773-1858), osservando al microscopio granelli di polline sospesi in acqua, nota che si muovono a scatti incessanti, senza causa visibile e senza mai fermarsi. È il “moto browniano”, e per decenni resta un’osservazione senza teoria.

La prima formalizzazione matematica non arriva dalla fisica ma dalla finanza. Nel 1900 Louis Bachelier (matematico francese, 1870-1946), nella tesi di dottorato Théorie de la spéculation, modella l’andamento dei prezzi di borsa con quello che oggi chiamiamo moto browniano — cinque anni prima che Albert Einstein, nel 1905, ne dia la spiegazione fisica in termini di urti molecolari, trasformando l’osservazione di Brown in una previsione misurabile. Bachelier aveva inventato lo strumento per descrivere un mercato; si scoprì poi che lo stesso strumento descriveva una particella.

La costruzione matematica rigorosa è opera di Norbert Wiener (matematico statunitense, 1894-1964), che nel 1923 definisce in modo preciso la misura di probabilità sullo spazio delle traiettorie continue. Per questo il moto browniano matematico si chiama anche processo di Wiener. Il quadro generale, però, diventa solido solo dopo l’assiomatizzazione della probabilità: nel 1933 Andrey Kolmogorov (matematico sovietico, 1903-1987) pubblica i Grundbegriffe der Wahrscheinlichkeitsrechnung (Concetti fondamentali del calcolo delle probabilità), che fanno della probabilità un caso particolare della teoria della misura. Da lì in poi un processo stocastico ha una definizione che non lascia ambiguità.

Due famiglie di processi che il capitolo userà hanno padri propri. Le catene che oggi portano il nome di Andrey Markov (matematico russo, 1856-1922) sono introdotte da lui nel 1906. Le martingale, l’oggetto matematico del gioco equo, sono introdotte da Paul Lévy (matematico francese, 1886-1971); la teoria sistematica e il libro fondativo, Stochastic Processes (1953), sono opera di Joseph Leo Doob (matematico statunitense, 1910-2004).

Nel grafo della wiki, questo è l’ottavo capitolo della Parte VI e poggia in modo diretto su Variabili aleatorie, convergenza, disuguaglianze, da cui arrivano i mattoni: la variabile aleatoria, il valore atteso, l’indipendenza, i modi di convergenza. È l’anticamera del capitolo successivo, catene-markov (in preparazione), che approfondisce il sottoinsieme markoviano a stato discreto — stazionarietà, distribuzione invariante, mixing. Verso la Parte V si appoggia a Le distribuzioni comuni, perché Bernoulli, Poisson, normale ed esponenziale sono i mattoni dei processi fondamentali, e a Legge dei grandi numeri e teorema del limite centrale, perché il moto browniano è il limite di scala del random walk.

L’ordine del capitolo: prima i due angoli di intuizione — il processo come funzione casuale, il processo come dinamica perturbata da rumore. Poi la meccanica: la griglia tempo/stato, i quattro esempi fondamentali costruiti uno sull’altro, stazionarietà e proprietà di Markov, rumore bianco e processi gaussiani, le martingale. Poi gli esempi concreti e le applicazioni. Infine il triplo ponte verso l’AI e la sezione “dove si rompe”, ampia perché i limiti di questi strumenti contano quanto gli strumenti.

Una nota di metodo, prima di partire. Il capitolo non richiede la teoria della misura né il calcolo stocastico nella loro forma completa: dove un argomento diventerebbe troppo tecnico — la costruzione rigorosa del moto browniano, la dimostrazione dell’optional stopping, il calcolo di Itô — il testo lo nomina, ne dà l’intuizione e rimanda. Il lettore con basi matematiche da liceo può seguire tutto. Quello che conta portare via non sono le dimostrazioni, ma il vocabolario: saper riconoscere un processo stocastico quando lo si incontra sotto mentite spoglie, e sapere quali domande porgli.

L’intuizione, primo angolo: il processo come funzione casuale

Sezione intitolata “L’intuizione, primo angolo: il processo come funzione casuale”

Prima di qualsiasi formula, fissiamo cosa sia un processo stocastico, perché la differenza con una variabile aleatoria ordinaria è netta e va vista bene.

Una variabile aleatoria, quando la si “estrae”, produce un numero. Lanci un dado: esce 4. Misuri l’altezza di una persona pescata a caso: 174 cm. L’oggetto incerto è un singolo valore, e lo spazio campionario — l’insieme di tutti gli esiti possibili — è un insieme di numeri.

Un processo stocastico, quando lo si “estrae”, produce qualcosa di più grande: un’intera funzione del tempo. Non un numero, ma una curva, un percorso, una sequenza completa di valori. Pensa a un dado lanciato ogni secondo per un’ora: il risultato non è un numero ma una sequenza di 3600 numeri. Pensa al prezzo di un titolo registrato per un giorno intero: il risultato è una curva, dall’apertura alla chiusura. Quella curva, presa tutta insieme, è un singolo esito del processo.

Formalmente, un processo stocastico è una famiglia di variabili aleatorie indicizzata dal tempo: una collezione {Xt}tT\{X_t\}_{t \in T}, dove ogni XtX_t è una variabile aleatoria — il valore del processo all’istante tt — e TT è l’insieme degli istanti. Ma la definizione “famiglia di variabili” nasconde l’idea giusta. L’idea giusta è: un processo stocastico è una funzione casuale.

Ecco perché. Lo spazio campionario contiene gli esiti grezzi del caso, che chiamiamo ω\omega. Fissato un ω\omega — cioè “decisa” l’intera realizzazione del caso — ogni XtX_t assume un valore preciso, Xt(ω)X_t(\omega). La mappa tXt(ω)t \mapsto X_t(\omega), che a ogni istante associa un numero, è una funzione del tempo ordinaria, deterministica. Si chiama traiettoria, o realizzazione, o sample path. Il processo stocastico è la macchina che, a ogni estrazione, pesca una di queste traiettorie. Lo spazio campionario, per un processo stocastico, non è un insieme di numeri: è uno spazio di funzioni.

Da qui due viste, entrambe legittime, dello stesso oggetto. Taglio verticale: fissi un istante tt e guardi tutte le traiettorie in quel punto — ottieni la variabile aleatoria XtX_t, con la sua distribuzione. Taglio orizzontale: fissi un esito ω\omega e segui la sua traiettoria nel tempo — ottieni una funzione. Tenere a mente entrambe è la chiave per non confondersi: quando si parla della “distribuzione del processo a tempo tt” si guarda in verticale; quando si parla della “regolarità delle traiettorie” si guarda in orizzontale.

Questa doppia natura ha una conseguenza pratica importante. Conoscere la distribuzione di XtX_t per ogni singolo tt — tutti i tagli verticali — non basta a conoscere il processo. Mancano i legami fra istanti diversi: la correlazione, la struttura di dipendenza nel tempo. Due processi possono avere tagli verticali identici e traiettorie completamente diverse — uno con curve lisce, l’altro con curve frastagliate. L’oggetto che cattura davvero il processo è la collezione di tutte le distribuzioni congiunte, cioè le distribuzioni di blocchi (Xt1,,Xtk)(X_{t_1}, \dots, X_{t_k}) presi insieme. Il caso non si descrive un istante alla volta; si descrive guardando come gli istanti sono intrecciati.

L’intuizione, secondo angolo: il processo come dinamica casuale

Sezione intitolata “L’intuizione, secondo angolo: il processo come dinamica casuale”

Il primo angolo descrive cos’è un processo. Il secondo dice come lo si costruisce, e spiega perché serve.

Quasi ogni sistema interessante evolve nel tempo seguendo una regola, ma la regola non è perfetta: c’è sempre una componente di disturbo. Lo schema generale è questo:

Xt+1=f(Xt)+rumoretX_{t+1} = f(X_t) + \text{rumore}_t

In parole povere: il valore al prossimo istante è una parte prevedibile — la funzione ff applicata allo stato attuale, che è la “regola” del sistema — più una parte imprevedibile, il rumore di quel passo, indipendente da quanto è già successo. La parte prevedibile porta avanti il sistema in modo ordinato; il rumore lo fa deviare dal binario.

Un processo stocastico è esattamente l’oggetto che si ottiene iterando questo schema. Ed è il motivo per cui i processi stocastici sono il linguaggio naturale di qualunque cosa evolva sotto incertezza. Il prezzo di un titolo: la regola dice “resta dove sei”, il rumore è il flusso di notizie e ordini. La posizione di una particella in un fluido: la regola dice “resta ferma”, il rumore sono gli urti molecolari. La traiettoria dei pesi di una rete durante il training: la regola dice “scendi lungo il gradiente”, il rumore è l’errore introdotto dal minibatch. Il livello di degrado di un’immagine in un diffusion model: la regola dice “tieni quello che hai”, il rumore è la dose gaussiana aggiunta a ogni passo.

Il caso minimo di questo schema — la regola è “non muoverti”, f(Xt)=Xtf(X_t) = X_t — è il random walk, la passeggiata aleatoria. È il processo più semplice in cui qualcosa accade davvero, e tutto il resto del capitolo lo userà come pietra di paragone: il random walk è la dinamica del caso puro, senza direzione preferita.

Il valore di questo angolo è che rende ogni processo costruibile. Non serve postulare un oggetto astratto: si parte da uno stato iniziale, si sceglie una regola, si sceglie una sorgente di rumore, e si itera. Cambiando la regola e il rumore si ottengono processi diversi — la regola “scendi lungo il gradiente” più rumore di minibatch dà SGD; la regola “tieni quello che hai” più rumore gaussiano dà il forward process di un diffusion model; la regola “non muoverti” più passi a caso dà il random walk. Tre processi che il capitolo tratterà in dettaglio, e tutti e tre sono varianti dello stesso schema di due righe.

I due angoli non sono in conflitto. Il primo è descrittivo (cos’è un processo: una distribuzione su traiettorie), il secondo è generativo (come si fabbrica: regola più rumore, iterati). Insieme dicono tutto ciò che serve per leggere la meccanica.

Una nota sul ruolo del rumore, perché è la parte che si tende a trattare come fastidio invece che come ingrediente. Nello schema Xt+1=f(Xt)+rumoretX_{t+1} = f(X_t) + \text{rumore}_t, il rumore non è solo imprecisione da minimizzare. In molti sistemi è il rumore a dare al processo le sue proprietà utili: senza rumore, SGD si bloccherebbe al primo punto piatto della loss; senza rumore, un diffusion model non avrebbe nulla da cui generare; senza rumore, un random walk non esplorerebbe il suo spazio. Il caso, in un processo stocastico, è tanto un meccanismo di esplorazione quanto una fonte di errore — e quale dei due ruoli prevalga dipende dal sistema. Tenere a mente che il rumore “lavora” e non solo “disturba” è il modo giusto di leggere i tre ponti verso l’AI.

Un processo stocastico è caratterizzato da due insiemi, e ciascuno può essere discreto o continuo.

Il primo è lo spazio degli stati SS: l’insieme dei valori che ciascun XtX_t può assumere. Può essere discreto (gli interi, un insieme finito di simboli — “soleggiato/nuvoloso/piovoso”, le facce di un dado) o continuo (i numeri reali, lo spazio Rn\mathbb{R}^n).

Il secondo è l’insieme degli indici TT, il tempo. Se è numerabile — i naturali 0,1,2,0, 1, 2, \dots — il processo è a tempo discreto: evolve a passi, “tic dopo tic”. Se è un intervallo della retta reale, è a tempo continuo: ha un valore in ogni istante, senza buchi.

Le due dicotomie danno quattro celle, e i quattro esempi fondamentali del capitolo occupano una cella ciascuno:

Tempo discretoTempo continuo
Stato discretoprocesso di Bernoulliprocesso di Poisson
Stato continuorandom walk gaussianomoto browniano

La griglia non è solo una tassonomia ordinata: dice quali strumenti matematici servono. A tempo discreto si lavora con somme e ricorrenze — l’analisi è quella delle successioni. A tempo continuo servono integrali e, quando lo stato è anch’esso continuo, equazioni differenziali; e poiché le traiettorie del moto browniano non sono derivabili, servono equazioni differenziali di tipo speciale, le SDE. Salire di una cella verso il continuo non cambia l’idea di processo stocastico, cambia la cassetta degli attrezzi che si è costretti a usare. Per questo il capitolo costruisce gli esempi dal più semplice (Bernoulli, tutto discreto) al più impegnativo (moto browniano, tutto continuo).

Conviene costruire i quattro esempi in ordine, perché si appoggiano l’uno sull’altro. Una distinzione di vocabolario, prima di partire: parlare di “tempo” non obbliga a riferirsi a un orologio. L’indice tt è qualunque parametro lungo cui il processo si dispiega in modo ordinato. Nei diffusion model, più avanti, tt è il livello di rumore di un’immagine, non un istante cronologico; in un random walk su una griglia tt è il numero di passi compiuti. Il “tempo” di un processo stocastico è l’asse rispetto a cui il caso si accumula — e quasi sempre questo basta a coprire tutti i casi pratici.

Un’altra avvertenza utile fin da subito: due processi possono avere le stesse distribuzioni a ogni singolo istante e comportarsi in modo radicalmente diverso. Quello che distingue un processo da un altro non sono i tagli verticali presi uno per uno, ma il modo in cui i tagli a istanti diversi sono legati fra loro — la struttura di dipendenza nel tempo. È per questo che il kernel di covarianza, più avanti, è un oggetto centrale: codifica proprio quei legami.

Il processo più semplice in assoluto. Una successione X1,X2,X3,X_1, X_2, X_3, \dots di variabili aleatorie indipendenti, ciascuna che vale 1 con probabilità pp e 0 con probabilità 1p1-p. È il “lancio di moneta ripetuto all’infinito”.

Niente memoria, niente dipendenza: ogni XtX_t ignora completamente tutti gli altri. Non è un processo emozionante di per sé, ma è il mattone: da Bernoulli si costruisce il random walk (sommandone i passi) e si approssima il processo di Poisson (rendendo i passi infinitesimi). Una variabile di Bernoulli è definita in Le distribuzioni comuni; qui la novità è solo che ne mettiamo in fila infinite.

Prendi un processo di Bernoulli e trasformalo: invece di 0 e 1, ogni passo ZiZ_i vale +1+1 o 1-1, ciascuno con probabilità 1/21/2. Poi somma i passi. La posizione dopo nn passi è

Sn=Z1+Z2++ZnS_n = Z_1 + Z_2 + \dots + Z_n

dove SnS_n è lo stato del processo a tempo nn e ogni ZiZ_i è il singolo passo. Questo è il random walk simmetrico in una dimensione: parti dall’origine e a ogni tic fai un passo a destra o a sinistra, a caso.

Due fatti sono fondamentali. Primo: la posizione media è zero, E[Sn]=0\mathbb{E}[S_n] = 0, per ogni nn — il random walk non ha una direzione preferita, in media non va da nessuna parte. Secondo: la sua dispersione cresce. La varianza è Var(Sn)=n\text{Var}(S_n) = n, quindi la deviazione standard è n\sqrt{n}. In parole povere: dopo nn passi il random walk si trova tipicamente a distanza dell’ordine di n\sqrt{n} dall’origine. Si allontana, ma lentamente — per arrivare tipicamente a distanza 100 servono diecimila passi, non cento.

Questo n\sqrt{n} è lo stesso che governa la concentrazione delle medie nel capitolo precedente, e non è una coincidenza: una media di nn termini e una somma di nn termini sono lo stesso oggetto a meno di una divisione per nn.

Un dettaglio sorprendente, utile contro un’intuizione sbagliata: il random walk simmetrico in una e in due dimensioni è ricorrente, cioè torna all’origine con probabilità 1, prima o poi. In tre dimensioni e oltre è transiente: c’è una probabilità positiva che non torni mai. La battuta del matematico Shizuo Kakutani riassume il fatto — “un ubriaco prima o poi ritrova la strada di casa, un uccello ubriaco può perdersi per sempre”.

Vale la pena soffermarsi sul perché la dispersione cresce come n\sqrt{n} e non come nn, perché è il fatto quantitativo più riusato del capitolo. La somma SnS_n ha varianza nn perché i passi ZiZ_i sono indipendenti: la varianza di una somma di variabili indipendenti è la somma delle varianze, e ogni passo ±1\pm 1 ha varianza 1. La deviazione standard, che è la radice della varianza, vale dunque n\sqrt{n}. Se invece i passi puntassero tutti nella stessa direzione — perfettamente correlati — la posizione crescerebbe come nn. La differenza fra nn e n\sqrt{n} è esattamente la differenza fra passi che si rinforzano e passi che si elidono in media: il random walk è il caso in cui si elidono, e per questo va lontano lentamente. È lo stesso meccanismo della concentrazione delle medie nel capitolo precedente, visto dall’altro lato.

Cambiamo cella: tempo continuo, stato discreto. Il processo di Poisson conta eventi. N(t)N(t) è il numero di eventi accaduti dal tempo 0 fino al tempo tt: parte da zero e a ogni arrivo fa un salto di +1+1. È un counting process, una scala che sale a gradini.

Il processo di Poisson è caratterizzato da un solo numero, il tasso λ\lambda, e da due fatti equivalenti che lo definiscono. Primo: gli intervalli di tempo fra un evento e il successivo — gli interarrivi — sono variabili aleatorie indipendenti, ciascuna con distribuzione esponenziale di media 1/λ1/\lambda. Secondo: il numero di eventi in un qualunque intervallo di ampiezza tt ha distribuzione di Poisson di parametro λt\lambda t, quindi in media λt\lambda t eventi.

La proprietà che rende questo processo speciale è l’assenza di memoria della distribuzione esponenziale: se un evento non è ancora arrivato, il tempo che resta da aspettare ha la stessa distribuzione di quando hai iniziato ad aspettare. Il processo non “si ricorda” da quanto stai aspettando. È esattamente la proprietà che serve per modellare arrivi genuinamente casuali e indipendenti: richieste a un server, click su una pagina, decadimenti radioattivi, chiamate a un’API.

L’ultima cella: tutto continuo. Il moto browniano, o processo di Wiener {Wt}t0\{W_t\}_{t \ge 0}, è il random walk portato al limite — passi infinitamente piccoli, infinitamente frequenti. Si definisce con quattro proprietà:

  1. W0=0W_0 = 0: parte dall’origine.
  2. Incrementi indipendenti: quello che il processo fa su intervalli di tempo disgiunti è indipendente.
  3. Incrementi gaussiani e stazionari: l’incremento Wt+sWsW_{t+s} - W_s ha distribuzione normale di media 0 e varianza ss — dipende solo dall’ampiezza dell’intervallo, non da dove inizia.
  4. Traiettorie continue: la funzione tWtt \mapsto W_t non ha salti.

La proprietà 3 eredita il n\sqrt{n} del random walk: la varianza cresce linearmente nel tempo, quindi la dispersione cresce come t\sqrt{t}.

C’è un fatto che vale la pena assorbire, perché è controintuitivo e ha conseguenze pratiche. Le traiettorie del moto browniano sono continue ovunque ma derivabili in nessun punto. Sono curve infinitamente frastagliate: per quanto ingrandisci un tratto, resta frastagliato uguale. La conseguenza: la “velocità” di una particella browniana non esiste come funzione ordinaria, e questo è il motivo per cui i sistemi guidati da rumore browniano richiedono un calcolo proprio — il calcolo stocastico di Itô — invece del calcolo che si studia a scuola. Il capitolo equazioni-differenziali-intuizione (in preparazione) tornerà su questo.

Incrementi: la grammatica comune dei quattro processi

Sezione intitolata “Incrementi: la grammatica comune dei quattro processi”

Prima delle proprietà trasversali, conviene isolare un concetto che lega i quattro esempi: l’incremento. L’incremento di un processo fra due istanti ss e tt è la differenza XtXsX_t - X_s — quanto il processo si è mosso in quell’intervallo.

Guardare gli incrementi invece dei valori assoluti chiarisce la struttura. Il random walk ha incrementi indipendenti: quanto si muove in un intervallo non dice nulla su quanto si muoverà nel successivo. Il processo di Poisson ha incrementi indipendenti e, in più, stazionari: il numero di eventi in un intervallo dipende solo dall’ampiezza dell’intervallo, non da dove sta. Il moto browniano ha incrementi indipendenti, stazionari e gaussiani: l’incremento su un intervallo di ampiezza ss è una normale di media 0 e varianza ss.

I processi a incrementi indipendenti e stazionari hanno un nome collettivo — processi di Lévy — e il moto browniano e il processo di Poisson ne sono i due rappresentanti fondamentali: uno con traiettorie continue, l’altro a salti. Il punto didattico: un processo “complicato” si capisce spesso meglio guardando come si muove (gli incrementi) invece di dove si trova (i valori). È esattamente la mossa che, applicata al random walk e al moto browniano, trasforma processi non stazionari in processi a incrementi stazionari.

Due proprietà trasversali, che si applicano a molti processi, completano la meccanica. La prima è la stazionarietà.

Un processo è strettamente stazionario se la sua distribuzione congiunta non cambia traslando il tempo: prendi un blocco qualunque di istanti, guarda la distribuzione congiunta dei valori del processo in quel blocco, traslalo tutto in avanti di una quantità qualsiasi — la distribuzione è identica. In parole povere: il processo “si comporta allo stesso modo” in ogni epoca, non c’è un istante speciale.

Spesso questa condizione è troppo forte da verificare, e ci si accontenta della stazionarietà debole, o in senso lato: solo la media e l’autocovarianza sono invarianti per traslazione (e il secondo momento è finito). La media è costante nel tempo; la covarianza fra il processo a due istanti dipende solo dalla loro distanza, non dalla loro posizione assoluta.

Attenzione a un fraintendimento frequente: stazionario non vuol dire costante. Una traiettoria stazionaria fluttua, eccome — è la sua distribuzione a non cambiare nel tempo, non la realizzazione. Un esempio chiarisce la distinzione: il moto browniano non è stazionario, perché la sua varianza tt cresce senza limite; ma i suoi incrementi sono stazionari, perché l’incremento dipende solo dall’ampiezza dell’intervallo. Processo non stazionario, incrementi stazionari: capita spesso, ed è proprio il caso del random walk e del moto browniano.

La stazionarietà conta perché è l’ipotesi che permette di stimare le proprietà di un processo da una sola traiettoria abbastanza lunga: se il processo è stazionario, una finestra del passato è rappresentativa del futuro. Senza stazionarietà, una serie temporale non è confrontabile con sé stessa.

C’è uno strumento legato alla stazionarietà che vale la pena nominare: l’autocorrelazione. È la correlazione del processo con sé stesso a distanza di tempo hh — quanto il valore di adesso “assomiglia” al valore di hh istanti fa. Per un processo stazionario l’autocorrelazione dipende solo da hh, non dall’istante assoluto, e disegnata in funzione di hh racconta la memoria del processo: cala in fretta se il processo dimentica presto, resta alta a lungo se trascina informazione, oscilla se c’è periodicità. Il rumore bianco, che vedremo fra poco, ha autocorrelazione nulla per ogni hh diverso da zero — è il processo senza memoria per definizione. L’autocorrelazione è lo strumento diagnostico di base nell’analisi delle serie temporali.

La seconda proprietà trasversale è quella di Markov, e prepara il capitolo successivo. Un processo gode della proprietà di Markov se il futuro dipende dal passato solo attraverso il presente:

P(Xt+1Xt,Xt1,,X0)=P(Xt+1Xt)P(X_{t+1} \mid X_t, X_{t-1}, \dots, X_0) = P(X_{t+1} \mid X_t)

In parole povere: per predire il prossimo valore, conoscere tutta la storia non aggiunge nulla rispetto a conoscere solo lo stato attuale. Lo stato presente è una statistica sufficiente per il futuro — riassume in sé tutta l’informazione del passato che serve.

È bene non liquidare questo come “assenza di memoria”, perché il processo la memoria ce l’ha: lo stato presente è una memoria del passato. Il punto è che tutta la memoria utile è già condensata nello stato. E qui c’è la finezza: la proprietà di Markov dipende da cosa decidi di chiamare stato. Un processo che sembra avere memoria lunga spesso diventa markoviano se allarghi la definizione di stato — per esempio, includendovi la posizione e la velocità invece della sola posizione. Markov non è una proprietà fissa del fenomeno, è una proprietà della coppia fenomeno-rappresentazione.

Random walk, processo di Poisson e moto browniano sono tutti markoviani. Il capitolo successivo, catene-markov (in preparazione), studia in dettaglio il caso a stato discreto: come evolve la distribuzione, quando esiste una distribuzione di equilibrio, quanto in fretta il processo “dimentica” da dove è partito.

Due ultimi oggetti, che servono al ponte verso l’AI.

Il rumore bianco è un processo {εt}\{\varepsilon_t\} a media zero, varianza costante σ2\sigma^2, e incorrelato nel tempo: la covarianza fra εs\varepsilon_s ed εt\varepsilon_t è zero per ogni coppia di istanti distinti. Ogni istante è una sorpresa che non ha nulla a che vedere con il precedente. Il nome viene dall’analisi delle frequenze: la sua potenza è distribuita in modo piatto su tutte le frequenze, come la luce bianca contiene tutte le frequenze visibili. Il rumore bianco è il “rumore puro” che si somma a una dinamica nello schema Xt+1=f(Xt)+rumoretX_{t+1} = f(X_t) + \text{rumore}_t.

Un avvertimento, che ritorna fra i punti di confusione: rumore bianco non è sinonimo di “i.i.d. gaussiano”. Il rumore bianco chiede solo incorrelazione — una proprietà del momento secondo — non indipendenza piena. Indipendenza e incorrelazione coincidono solo nel caso gaussiano; per il rumore bianco gaussiano, in effetti, le due cose sono la stessa.

Un processo gaussiano è un processo in cui ogni collezione finita di valori (Xt1,,Xtk)(X_{t_1}, \dots, X_{t_k}) ha distribuzione normale multivariata. La conseguenza è potente: una distribuzione normale multivariata è completamente determinata dal suo vettore delle medie e dalla sua matrice di covarianza, quindi un processo gaussiano è completamente determinato da due sole funzioni:

  • la funzione media m(t)=E[Xt]m(t) = \mathbb{E}[X_t], che dice dove sta il processo in media a ogni istante;
  • la funzione di covarianza, o kernel, k(s,t)=Cov(Xs,Xt)k(s,t) = \text{Cov}(X_s, X_t), che dice quanto sono correlati i valori del processo a due istanti qualsiasi.

Il kernel codifica la “personalità” del processo: scegliendolo, scegli quanto le traiettorie tipiche sono lisce o frastagliate, periodiche o irregolari. Il moto browniano, per esempio, è un processo gaussiano con kernel k(s,t)=min(s,t)k(s,t) = \min(s,t) — la covarianza fra due istanti è il più piccolo dei due, il che dice che istanti più vicini all’origine condividono più storia. Un kernel diverso, che dipende solo dalla distanza st|s-t| e decade dolcemente, produce traiettorie lisce; un kernel che decade bruscamente produce traiettorie ruvide; un kernel con una componente oscillante produce traiettorie periodiche. La libertà nella scelta del kernel è ciò che rende i processi gaussiani uno strumento di modellazione flessibile.

Questa idea — un processo gaussiano specificato interamente da media e kernel — è esattamente ciò su cui poggia la regressione con processi gaussiani, nel ponte più avanti. Va sottolineato un fatto già anticipato: per i processi gaussiani la stazionarietà debole e quella stretta coincidono. La ragione è diretta: la distribuzione congiunta di un processo gaussiano è completamente determinata da media e covarianza, quindi se queste due sono invarianti per traslazione (stazionarietà debole) lo è automaticamente l’intera distribuzione congiunta (stazionarietà stretta). È l’unica famiglia di processi in cui le due nozioni sono la stessa cosa, ed è un altro motivo della loro centralità.

L’ultimo oggetto della meccanica è una proprietà, non un processo: la proprietà di martingala. Un processo {Mt}\{M_t\} è una martingala se il valore atteso del prossimo valore, condizionato a tutta la storia, è uguale al valore attuale:

E[Mt+1Mt,Mt1,,M0]=Mt\mathbb{E}[M_{t+1} \mid M_t, M_{t-1}, \dots, M_0] = M_t

In parole povere: qualunque cosa sia successa finora, la miglior previsione del prossimo valore è semplicemente il valore di adesso. Il processo non ha deriva: non tende a salire né a scendere.

L’interpretazione canonica è il gioco equo. La fortuna di un giocatore che gioca scommesse eque — scommesse in cui la vincita media è zero — è una martingala: in media non guadagna e non perde, indipendentemente da quanto ha già vinto o perso. Il random walk simmetrico è la martingala per eccellenza: parti da zero, e in media resti a zero per sempre, anche se le traiettorie vagano lontano.

Va tenuta distinta dalla proprietà di Markov, perché qui si annida un errore comune. Markov e martingala sono proprietà ortogonali, parlano di cose diverse. Markov è una condizione sulla dipendenza: il futuro guarda solo il presente. Martingala è una condizione sul valore atteso: niente deriva. Un processo può avere l’una senza l’altra. Un random walk con deriva — a ogni passo +1+1 con probabilità 0,60{,}6 e 1-1 con probabilità 0,40{,}4 — è markoviano (il prossimo passo guarda solo lo stato attuale) ma non è martingala (in media sale). Viceversa esistono martingale non markoviane.

Perché le martingale contano, oltre l’eleganza. Joseph Doob dimostra l’optional stopping theorem: se fermi una martingala a un istante deciso solo sulla base dell’informazione disponibile fino a quel momento — un tempo d’arresto — il valore atteso al momento dello stop è ancora il valore iniziale. È la formalizzazione matematica del fatto che nessuna strategia di uscita trasforma un gioco equo in un gioco vincente. Per chi costruisce sistemi AI il motivo pratico è un altro: le martingale sono lo strumento principe per dimostrare che un algoritmo stocastico converge — la traiettoria dei pesi di SGD, una volta tolta la deriva del gradiente, è una martingala — e per ottenere disuguaglianze di concentrazione su somme di variabili dipendenti, dove la disuguaglianza di Hoeffding del capitolo precedente non basta più (è la disuguaglianza di Azuma).

Un random walk simmetrico parte da 0. Dove si trova, tipicamente, dopo 100 passi? E dopo 10.000?

La posizione media è 0 in entrambi i casi: nessuna direzione preferita. La dispersione, invece, cresce. Dopo 100 passi la varianza è 100, quindi la deviazione standard è 100=10\sqrt{100} = 10: il random walk si trova tipicamente entro una decina di passi dall’origine. Dopo 10.000 passi la varianza è 10.000, la deviazione standard è 10000=100\sqrt{10000} = 100.

Si può anche chiedere la cosa opposta: quanti passi servono perché il random walk si allontani tipicamente di 1.000 dall’origine? Dovendo essere n=1000\sqrt{n} = 1000, serve n=10002=1.000.000n = 1000^2 = 1.000.000 di passi. La relazione fra distanza e tempo è quadratica nella direzione “quanto tempo per arrivare lontano”: andare due volte più lontano costa quattro volte il tempo, dieci volte più lontano costa cento volte il tempo. È il prezzo della deriva assente — il random walk arriva ovunque, ma con una lentezza che cresce con il quadrato dell’ambizione.

Il punto da assorbire: moltiplicare per 100 il numero di passi moltiplica per 10 — non per 100 — la distanza tipica. La distanza percorsa cresce con la radice del tempo. È lo stesso n\sqrt{n} della concentrazione delle medie: triplicare la precisione di una stima Monte Carlo costa nove volte i campioni, e qui dimezzare la distanza relativa percorsa costa quattro volte i passi.

Lo stesso conto, letto sui pesi di una rete, dice una cosa pratica. La componente di rumore di SGD, da sola, fa vagare i pesi come un random walk: dopo nn aggiornamenti la deviazione accumulata per puro rumore è dell’ordine di n\sqrt{n} volte l’ampiezza tipica di un passo di rumore. La componente di deriva — il gradiente vero — cresce invece linearmente in nn finché la loss non è piatta. È per questo che, lontano da un minimo, la deriva domina e il training “progredisce”; vicino a un minimo, dove la deriva svanisce, resta solo il random walk del rumore, e i pesi continuano a fluttuare attorno alla soluzione senza fermarsi mai del tutto. Il random walk non è una metafora del training: è la sua componente residua, quella che non si spegne.

Tre dei quattro processi fondamentali, in poche righe di pseudocodice. Ognuno è una traduzione diretta dello schema “regola più rumore”.

import random
def bernoulli_process(n, p):
# mattone: variabili indipendenti, niente stato
return [1 if random.random() < p else 0 for _ in range(n)]
def random_walk(n):
# somme parziali: lo stato è la posizione cumulata
pos, traiettoria = 0, []
for _ in range(n):
passo = random.choice([-1, +1]) # rumore: passo a caso
pos = pos + passo # regola: resta dove sei, poi somma
traiettoria.append(pos)
return traiettoria
def random_walk_con_deriva(n, drift):
# markoviano ma NON martingala: c'è una deriva
pos, traiettoria = 0, []
for _ in range(n):
passo = +1 if random.random() < 0.5 + drift else -1
pos = pos + passo
traiettoria.append(pos)
return traiettoria

Tre osservazioni leggendo il codice. Il processo di Bernoulli non ha una variabile pos: non c’è stato, ogni valore è indipendente. Il random walk introduce lo stato pos, ed è l’unica cosa che passa da un’iterazione alla successiva — è la forma operativa della proprietà di Markov. Il terzo, random_walk_con_deriva, differisce dal secondo per un solo numero, drift, ma quella differenza lo rende markoviano-ma-non-martingala: con drift positivo, in media sale.

Un endpoint che serve un modello riceve, in media, 30 richieste al minuto, e gli arrivi sono genuinamente indipendenti — nessuna correlazione, nessun picco programmato. Questo è il caso d’uso da manuale del processo di Poisson, con tasso λ=30\lambda = 30 richieste al minuto, cioè λ=0,5\lambda = 0{,}5 richieste al secondo.

Da questo modello si leggono cose operative. Il tempo medio fra due richieste è 1/λ=21/\lambda = 2 secondi, ma è solo la media: gli interarrivi sono esponenziali, quindi a coda lunga — capiterà spesso che due richieste arrivino quasi insieme, e capiterà di aspettare molto più di 2 secondi. Il numero di richieste in una finestra di 10 secondi è Poisson di parametro λt=0,5×10=5\lambda t = 0{,}5 \times 10 = 5: in media 5 richieste, ma con fluttuazione. La proprietà di assenza di memoria dice che, se in questo istante non è ancora arrivata una richiesta, il tempo da aspettare ha la stessa distribuzione di un istante fa: il sistema non “accumula” attesa. È esattamente la base su cui la teoria delle code calcola latenza e dimensionamento di un servizio — quante repliche servono perché la coda non esploda.

C’è una conseguenza che spesso sorprende chi dimensiona sistemi per la prima volta. Se si dimensiona la capacità sul valore medio — 30 richieste al minuto, 30 unità di capacità — il sistema sarà in coda per metà del tempo, perché la metà delle finestre temporali riceve più della media. Il processo di Poisson rende quantitativa questa intuizione: la fluttuazione attorno alla media di una variabile di Poisson di parametro μ\mu ha deviazione standard μ\sqrt{\mu}, quindi il margine da tenere sopra la media per assorbire i picchi cresce con la radice del carico. Un servizio che riceve in media 100 richieste in una finestra va dimensionato con un margine dell’ordine di 100=10\sqrt{100} = 10; uno che ne riceve 10.000, con un margine dell’ordine di 10000=100\sqrt{10000} = 100 — un margine assoluto più grande ma relativo più piccolo. È il motivo per cui i servizi grandi reggono picchi proporzionalmente meglio dei servizi piccoli: la legge della radice, di nuovo, la stessa del random walk.

Esempio in codice: simulare un processo di Poisson

Sezione intitolata “Esempio in codice: simulare un processo di Poisson”

Il processo di Poisson si simula sfruttando la definizione via interarrivi esponenziali — un esempio in codice diverso dai precedenti, perché qui il tempo è continuo e va campionato, non scandito a tic.

import random, math
def poisson_process(rate, t_max):
# restituisce i tempi degli eventi fino a t_max
eventi, t = [], 0.0
while True:
# interarrivo esponenziale: -ln(U)/rate, con U uniforme in (0,1)
attesa = -math.log(random.random()) / rate
t = t + attesa
if t > t_max:
return eventi
eventi.append(t)

Tre punti leggendo il codice. Il tempo t è un numero reale che avanza a salti irregolari, non un contatore intero: è la differenza fra tempo continuo e tempo discreto resa codice. L’interarrivo si genera con la formula -ln(U)/rate, che trasforma un numero uniforme in (0,1)(0,1) in un’esponenziale di tasso rate — è il metodo standard per campionare un’esponenziale. E non c’è alcuno stato che lega un evento al successivo oltre al tempo accumulato: gli interarrivi sono indipendenti, esattamente come prescrive la definizione. Lo stesso schema, con rate che varia nel tempo, dà il processo di Poisson non omogeneo, usato per modellare arrivi con picchi prevedibili (più traffico di giorno che di notte).

Esempio di proprietà: gioco equo e gioco truccato

Sezione intitolata “Esempio di proprietà: gioco equo e gioco truccato”

Un quarto esempio, di natura diversa: non un processo nuovo, ma due processi che differiscono per una proprietà, per vedere la proprietà di martingala all’opera.

Considera due giocatori. Il primo gioca una sequenza di scommesse eque: a ogni mano vince o perde un euro, con probabilità esatta 1/21/2 ciascuna. La sua fortuna nel tempo è un random walk simmetrico — ed è una martingala. Significa: qualunque cifra abbia in tasca adesso, e qualunque storia di vincite e perdite l’abbia portato lì, la previsione della sua fortuna alla prossima mano è esattamente la cifra di adesso. Non c’è strategia di quando smettere che cambi questo: l’optional stopping theorem garantisce che, in media, uscirà dal gioco con la stessa cifra con cui è entrato.

Il secondo giocatore gioca a una roulette, dove la presenza dello zero rende ogni scommessa leggermente sfavorevole — diciamo vince un euro con probabilità 0,480{,}48 e ne perde uno con probabilità 0,520{,}52. La sua fortuna è ancora markoviana (la prossima mano dipende solo dalla cifra attuale), ma non è più una martingala: ha una deriva negativa, E[Mt+1Mt]=Mt0,04\mathbb{E}[M_{t+1} \mid M_t] = M_t - 0{,}04. In media perde quattro centesimi a mano. Nessuna strategia di stop lo salva, perché l’optional stopping vale per le martingale e questo processo non lo è.

I due giocatori mostrano in concreto l’ortogonalità: entrambi i processi sono markoviani, solo uno è martingala. La proprietà che separa “gioco da cui esci pari” da “gioco che ti dissangua” non è la memoria — entrambi non ne hanno oltre lo stato — ma la presenza o assenza di deriva. È la distinzione che il capitolo precedente, parlando di valore atteso, non poteva ancora fare: serviva l’asse del tempo.

I tre ponti verso l’AI hanno una sezione dedicata più avanti; qui si raccolgono le applicazioni dirette dei processi stocastici, fuori dal solo deep learning.

La modellazione di carichi e arrivi è la più immediata. Ogni volta che si dimensiona un servizio — quante repliche di un modello, quanto grande una coda di richieste, quale latenza al novantanovesimo percentile — sotto c’è un processo di Poisson o una sua variante, e la teoria delle code che ci si costruisce sopra. Vale per le richieste a un endpoint LLM, per gli arrivi di token in uno streaming, per gli eventi in un sistema a coda.

La quantificazione dell’incertezza è il secondo grande uso. I processi gaussiani forniscono previsioni che non sono numeri secchi ma distribuzioni, con barre d’errore che si stringono dove ci sono dati e si allargano dove mancano. È la base dell’ottimizzazione bayesiana, la tecnica con cui si fa tuning automatico degli iperparametri di un modello: si modella la funzione “iperparametri → performance” con un processo gaussiano e si sceglie il prossimo esperimento da provare bilanciando esplorazione e sfruttamento, guidati dall’incertezza del posterior.

L’analisi delle serie temporali è il quarto territorio. Una serie temporale — il carico di un servizio ora per ora, la latenza misurata minuto per minuto, una metrica di prodotto giorno per giorno — è una singola traiettoria di un processo stocastico, e tutta la cassetta degli attrezzi per analizzarla (decomposizione in trend e stagionalità, modelli autoregressivi, forecasting) presuppone il vocabolario di questo capitolo: stazionarietà per poter generalizzare dal passato, autocorrelazione per misurare la memoria, rumore bianco come modello di ciò che resta dopo aver tolto la struttura prevedibile. Un modello di forecasting che produce residui non simili a rumore bianco sta lasciando struttura non sfruttata: il controllo dei residui è una diagnosi diretta di quanto bene il modello ha catturato il processo.

Il reinforcement learning e i bandit poggiano anch’essi qui. In un problema di multi-armed bandit le ricompense raccolte tirando le leve formano un processo stocastico; le garanzie di regret degli algoritmi UCB — la promessa che l’algoritmo non perderà troppo rispetto alla scelta ottima — si dimostrano con le disuguaglianze di concentrazione per martingale. I capitoli Bandits e trade-off esplorazione-sfruttamento e UCB e Thompson sampling usano questo apparato.

Qui i tre legami che danno al capitolo il suo scopo, in ordine di prossimità.

Quando addestri una rete neurale con la discesa del gradiente stocastica, i pesi seguono una traiettoria θ0,θ1,θ2,\theta_0, \theta_1, \theta_2, \dots generata dalla regola

θt+1=θtηg^t\theta_{t+1} = \theta_t - \eta \, \hat{g}_t

dove θt\theta_t è il vettore dei pesi al passo tt, η\eta è il learning rate e g^t\hat{g}_t è il gradiente della loss stimato su un minibatch. Il punto è che g^t\hat{g}_t è stimato su un minibatch estratto a caso, quindi non è il gradiente vero: è il gradiente vero più un errore di campionamento. Si può scrivere g^t=L(θt)+ξt\hat{g}_t = \nabla L(\theta_t) + \xi_t, dove L\nabla L è il gradiente vero della loss e ξt\xi_t è un rumore a media zero.

Sostituendo: θt+1=θtηL(θt)ηξt\theta_{t+1} = \theta_t - \eta \nabla L(\theta_t) - \eta \xi_t. È esattamente lo schema “regola più rumore” del secondo angolo di intuizione. La traiettoria dei pesi durante il training è un random walk con deriva: la deriva è ηL-\eta \nabla L, che spinge i pesi verso il basso della loss; il rumore è ηξt-\eta \xi_t, che li fa deviare.

Questa lettura non è solo elegante, è produttiva. Una linea di ricerca consolidata — il riferimento è Qianxiao Li, Cheng Tai e Weinan E, Stochastic Modified Equations and Dynamics of Stochastic Gradient Algorithms (Journal of Machine Learning Research, 2019), che deriva il risultato in modo rigoroso — mostra che, a learning rate piccolo, la traiettoria discreta di SGD è ben approssimata da un’equazione differenziale stocastica, cioè da una dinamica a tempo continuo guidata da moto browniano:

dθ=L(θ)dt+ηΣ1/2dWtd\theta = -\nabla L(\theta)\,dt + \sqrt{\eta}\,\Sigma^{1/2}\,dW_t

In parole povere: l’evoluzione dei pesi è una discesa lungo la loss (Ldt-\nabla L\,dt) perturbata da un termine di diffusione browniano, la cui intensità è governata dal learning rate η\eta e dalla struttura della covarianza del rumore Σ\Sigma. È una dinamica di diffusione.

Questa lente spiega fenomeni che altrimenti restano folklore. Il rumore aiuta il training a sfuggire dai minimi locali e dai saddle point, dove un gradiente deterministico si bloccherebbe: una particella in diffusione, prima o poi, esce da una buca poco profonda. Il rapporto fra learning rate e batch size si comporta come una temperatura: più alto, più la diffusione è agitata, più il sistema esplora invece di assestarsi — il che dà una base teorica all’osservazione che batch piccoli possono generalizzare meglio. E lo scheduling del learning rate, che lo riduce nel tempo, equivale a un raffreddamento progressivo, un annealing che lascia prima esplorare e poi assestare.

Vale la pena rendere concreto il concetto di temperatura, perché chiude un anello con la fisica da cui il moto browniano è nato. Una particella browniana in un fluido caldo si agita di più: la temperatura misura l’intensità del rumore. Nell’SDE di SGD, il termine ηΣ1/2\sqrt{\eta}\,\Sigma^{1/2} gioca lo stesso ruolo — la sua grandezza dice quanto la traiettoria dei pesi è “agitata”. Aumentare il learning rate, o ridurre il batch size (che aumenta la varianza Σ\Sigma del rumore di minibatch), alza la temperatura: i pesi esplorano più ampiamente la loss landscape e tendono ad assestarsi in minimi larghi, dove una piccola perturbazione non cambia molto la loss — e i minimi larghi sono empiricamente associati a una migliore generalizzazione. Abbassare il learning rate verso fine training raffredda il sistema e lo lascia depositare. Questo è il motivo per cui “learning rate alto all’inizio, basso alla fine” non è una ricetta arbitraria: è un programma di raffreddamento, e i processi stocastici sono il linguaggio in cui lo si legge. Una nota di onestà: la classe di queste affermazioni è quella del teorema sotto ipotesi, non del fatto universale. La validità dell’approssimazione SDE è dibattuta — Zhiyuan Li, Sadhika Malladi e Sanjeev Arora, On the Validity of Modeling SGD with Stochastic Differential Equations (NeurIPS 2021), ne discutono i limiti — e regge solo finché il learning rate è abbastanza piccolo. Resta una lente di intuizione potente, non una descrizione esatta di ogni training reale.

I diffusion model — la famiglia di modelli generativi dietro Stable Diffusion, DALL-E, Sora — costruiscono la loro intera macchina sopra un processo stocastico. Il riferimento canonico è Jonathan Ho, Ajay Jain e Pieter Abbeel, Denoising Diffusion Probabilistic Models (NeurIPS 2020), noto come DDPM.

L’idea di partenza è asimmetrica e per questo geniale: distruggere struttura è facile, ricostruirla è difficile. Il modello sfrutta la parte facile per impostare la parte difficile come problema di apprendimento.

L’asimmetria merita un momento. Aggiungere rumore a un’immagine non richiede di capire l’immagine: è un’operazione meccanica, sempre la stessa, applicabile a qualunque foto senza sapere cosa rappresenti. Rimuovere rumore, invece, richiede di sapere com’erano fatte le immagini “vere” — richiede un modello del mondo. I diffusion model fanno leva esattamente su questo: usano l’operazione facile e priva di conoscenza (il forward process, un processo stocastico fissato) per fabbricare, gratis, un numero illimitato di coppie “immagine pulita, immagine rumorosa” su cui addestrare l’operazione difficile.

La parte facile è il forward process. Si parte da un’immagine reale x0x_0 e le si aggiunge rumore gaussiano un po’ alla volta, per TT passi, secondo una variance schedule fissata β1,,βT\beta_1, \dots, \beta_T — una sequenza di numeri che decide quanto rumore aggiungere a ogni passo. Dopo abbastanza passi, l’immagine è indistinguibile da pura neve gaussiana. Questo forward process è esattamente un processo stocastico nei termini di questo capitolo: è una catena di Markov — il livello di rumore al passo t+1t+1 dipende solo da quello al passo tt — con incrementi gaussiani, lo schema “tieni quello che hai più una dose di rumore”. Non c’è niente da imparare nel forward process: la variance schedule è decisa a mano.

Un dettaglio operativo che il carattere markoviano-gaussiano regala: il forward process ha forma chiusa. Non serve simulare tutti i passi uno per uno per ottenere l’immagine rumorosa al passo tt; si può saltare direttamente da x0x_0 a xtx_t con una singola formula. È questa proprietà a rendere il training stabile e parallelizzabile — si campiona un tt a caso e si genera xtx_t in un colpo.

La parte difficile è il reverse process: tornare indietro, da rumore puro a un’immagine. Questa è la parte appresa. Una rete neurale viene addestrata a guardare un’immagine rumorosa e stimare il rumore che le è stato aggiunto; sottraendolo, si fa un passo indietro verso un’immagine più pulita. Iterando il passo all’indietro da neve gaussiana pura, la rete fabbrica un’immagine nuova. Il legame con il moto browniano è diretto: la versione a tempo continuo del forward process è un’SDE di diffusione, e l’inversione di quell’SDE — studiata nei lavori score-based di Yang Song e collaboratori — è la formulazione continua del reverse process. Il capitolo diffusion (in preparazione) deriva il tutto; qui basta vedere che il cuore del modello è un processo stocastico che il capitolo ha già nominato per intero.

Il terzo ponte usa i processi gaussiani come strumento di previsione. L’idea è dovuta nella sua forma matura a Carl Rasmussen e Christopher Williams, Gaussian Processes for Machine Learning (MIT Press, 2006), il testo di riferimento.

La regressione classica funziona così: scegli una famiglia di funzioni — rette, polinomi, una rete con un’architettura fissata — e cerchi i parametri che meglio fittano i dati. La regressione con processi gaussiani fa un passo concettuale diverso: invece di mettere un prior sui parametri di una famiglia, mette un prior direttamente sullo spazio delle funzioni. Un processo gaussiano, come visto nella meccanica, è una distribuzione su funzioni: estrarlo significa pescare una curva intera. Lo si usa come prior bayesiano.

Il meccanismo è quello dell’inferenza bayesiana, applicato a questo prior. Prima di vedere i dati, il processo gaussiano descrive tutte le funzioni plausibili a priori, con la regolarità imposta dal kernel scelto. Dopo aver osservato alcuni punti, il posterior è di nuovo un processo gaussiano — calcolabile in forma chiusa, con sole operazioni matriciali — che concentra la sua massa sulle funzioni compatibili con le osservazioni.

Conviene visualizzare il prima e il dopo. Prima di vedere qualunque dato, se si campionano traiettorie dal prior gaussiano si ottiene un fascio di curve diverse, tutte con la regolarità imposta dal kernel, sparse su tutto lo spazio: il modello “non sa nulla”, e l’incertezza è uniforme ovunque. Dopo aver osservato alcuni punti, le curve campionate dal posterior passano tutte vicino a quei punti — il fascio si stringe a imbuto attorno alle osservazioni — e restano larghe negli intervalli vuoti. La previsione in un punto nuovo è la statistica di quel fascio ristretto: la sua media e la sua dispersione.

Il vantaggio decisivo: la previsione in un punto nuovo non è un numero, è una distribuzione. Si ottengono barre di incertezza calibrate — strette vicino ai punti osservati, larghe dove i dati mancano. È esattamente l’informazione che serve quando la decisione successiva dipende da quanto ci si può fidare della previsione, come nell’ottimizzazione bayesiana descritta fra le applicazioni. Una rete neurale ordinaria, di default, non dà nulla di simile: produce un numero, ugualmente sicuro di sé sia dove ha visto molti dati sia dove non ne ha visto nessuno. Il processo gaussiano sa dire “qui non lo so”, e lo sa dire in modo quantitativo.

Il limite è il costo: l’inferenza richiede di invertire una matrice di dimensione pari al numero di osservazioni, un’operazione che costa dell’ordine di n3n^3. Per nn grande la GP regression è impraticabile senza approssimazioni — un punto ripreso nella sezione che segue.

I processi stocastici sono uno strumento potente, e come ogni strumento potente vengono applicati anche dove non reggono. I limiti contano quanto i meccanismi: la maggior parte degli errori di chi usa questi strumenti non è nei conti, è in un’ipotesi data per scontata o in un fraintendimento sul significato di un termine. La sezione raccoglie i più frequenti.

Processo stocastico scambiato per “variabile aleatoria che cambia”. È il fraintendimento di partenza. Un processo stocastico non è una variabile aleatoria che assume valori diversi nel tempo: è una famiglia di variabili aleatorie, e l’oggetto aleatorio è l’intera traiettoria. Lo spazio campionario è uno spazio di funzioni, non di numeri. Chi tiene in mente “un numero che cambia” perde di vista il fatto centrale — che il processo è una distribuzione su percorsi — e non riesce a porre le domande giuste, come “quanto sono correlati due istanti” o “che forma hanno le traiettorie tipiche”.

Markov letto come “senza memoria”. Un processo markoviano ha memoria: lo stato presente è una memoria. Il punto è che tutta la memoria utile è già condensata nello stato. E la proprietà di Markov non è intrinseca al fenomeno — dipende da cosa si sceglie come stato. Un processo che con uno stato povero sembra avere memoria lunga può diventare markoviano allargando lo stato (per esempio includendo posizione e velocità invece della sola posizione). Trattare “markoviano” come una proprietà fissa del mondo, invece che della coppia fenomeno-rappresentazione, porta a modelli sbagliati: o si scarta come “non-markoviano” qualcosa che basterebbe rappresentare meglio, o si assume Markov dove lo stato scelto non è davvero sufficiente.

Stazionario confuso con costante. Un processo stazionario fluttua — è la distribuzione a non cambiare, non la traiettoria. L’errore speculare e più costoso è l’opposto: assumere stazionarietà dove non c’è. Quasi tutte le tecniche che stimano le proprietà di un processo da una singola traiettoria — l’analisi delle serie temporali, gran parte della statistica dei processi — poggiano sull’ipotesi di stazionarietà. Nei dati reali questa ipotesi è spesso violata: c’è drift, la distribuzione cambia lentamente nel tempo. Un modello stimato su una finestra del passato e applicato al futuro, sotto drift, degrada in silenzio. È esattamente il concept drift che affligge i sistemi ML in produzione: il mondo su cui il modello è stato addestrato non è più il mondo su cui gira.

Martingala confusa con Markov. Sono proprietà ortogonali. Markov riguarda la dipendenza (il futuro guarda solo il presente), martingala riguarda il valore atteso (niente deriva). Un processo può avere l’una senza l’altra, e confonderle porta a errori concreti: per esempio, applicare l’optional stopping theorem — che vale per le martingale — a un processo che è solo markoviano ma ha una deriva.

La fallacia del giocatore applicata ai processi. Dopo una lunga serie di passi “su”, un random walk simmetrico non “deve” scendere per compensare: non ha memoria di quei passi, ogni passo futuro è una nuova moneta equa. Lo squilibrio accumulato non viene cancellato da scarti futuri di segno opposto; viene semplicemente diluito dal volume dei passi successivi. L’optional stopping theorem dà la versione forte di questo fatto: nessuna strategia di uscita, per quanto astuta, trasforma un gioco equo in un gioco vincente. Chi progetta una “strategia di stop” credendo di battere un processo senza deriva sta combattendo un teorema.

Rumore bianco scambiato per i.i.d. gaussiano. Il rumore bianco chiede solo media zero, varianza costante e incorrelazione — una proprietà del momento secondo. Non chiede indipendenza piena né gaussianità. Indipendenza e incorrelazione coincidono solo nel caso gaussiano. Trattare ogni rumore bianco come i.i.d. gaussiano significa assumere di più di quanto la definizione conceda, e costruire garanzie che non reggono se il rumore, pur incorrelato, ha code pesanti o dipendenze di ordine superiore.

Le traiettorie del moto browniano credute lisce. Sono continue ma non derivabili in nessun punto. La “velocità” di una particella browniana non esiste come funzione ordinaria. La conseguenza pratica: i sistemi guidati da rumore browniano — incluse le SDE che approssimano SGD — non si trattano con il calcolo differenziale ordinario, ma con il calcolo stocastico di Itô, dove le regole sono diverse (la regola della catena acquista un termine in più). Applicare meccanicamente il calcolo di scuola a una dinamica stocastica produce risultati sbagliati.

L’approssimazione SDE di SGD presa per esatta. Il legame “SGD è una diffusione” è prezioso come intuizione ma è un teorema sotto ipotesi, non una verità universale. L’approssimazione regge a learning rate piccolo; a learning rate grande — proprio il regime in cui si addestrano molti modelli reali — la traiettoria discreta e la sua approssimazione continua possono divergere. Inoltre l’approssimazione assume tipicamente rumore gaussiano, mentre il rumore di minibatch reale può avere code più pesanti. Le conclusioni qualitative (il rumore aiuta a sfuggire ai minimi locali, esiste un effetto temperatura) sono robuste; le conclusioni quantitative vanno verificate, non assunte.

I processi gaussiani che non scalano. La GP regression è bellissima su dati di taglia moderata e impraticabile su grandi dataset: il costo cubico nel numero di osservazioni — l’inversione di una matrice n×nn \times n — la rende inapplicabile direttamente quando nn supera qualche decina di migliaia. Esistono approssimazioni (metodi sparse, punti di induzione), ma vanno scelte con consapevolezza, perché introducono un errore proprio. Il processo gaussiano non è un sostituto universale di una rete neurale: è lo strumento giusto quando i dati sono pochi e le barre d’incertezza calibrate contano più della scala.

L’ipotesi i.i.d. dietro tutto. Molti dei processi del capitolo, e quasi tutte le garanzie che vi si appoggiano, assumono passi o incrementi indipendenti e identicamente distribuiti. Nei dati reali questo spesso non vale — esempi correlati nel tempo, drift di distribuzione, duplicati. Sotto correlazione, le dispersioni non crescono più come n\sqrt{n} e le garanzie calcolate come se i dati fossero i.i.d. sono troppo ottimistiche. L’ipotesi i.i.d. è la più silenziosa e la più spesso violata: va verificata, non data per scontata.

Confondere il modello con il fenomeno. Un processo stocastico è un modello di un fenomeno incerto, e come ogni modello è una scelta, non una verità. Decidere che gli arrivi a un servizio sono “un processo di Poisson”, che un prezzo è “un moto browniano”, che il rumore di SGD è “gaussiano” significa importare tutte le ipotesi di quel processo — assenza di memoria, incrementi indipendenti, code leggere. Quando il fenomeno reale viola quelle ipotesi, il modello non avvisa: continua a produrre numeri, solo sbagliati. Il processo stocastico giusto è quello le cui ipotesi reggono sul fenomeno in esame, e stabilire quali reggono è un lavoro empirico, non una scelta di comodità.

  • Variabili aleatorie, convergenza, disuguaglianze — il capitolo che fornisce i mattoni: variabile aleatoria, valore atteso, indipendenza, modi di convergenza. Prerequisito diretto: un processo stocastico è una famiglia di quegli oggetti.
  • catene-markov (Parte VI, in preparazione) — approfondisce il sottoinsieme markoviano a stato discreto: distribuzione di equilibrio, mixing, quanto in fretta il processo dimentica l’inizio.
  • Le distribuzioni comuni — Bernoulli, Poisson, normale ed esponenziale sono i mattoni dei quattro processi fondamentali; qui se ne mettono in fila infinite copie.
  • Legge dei grandi numeri e teorema del limite centrale — il moto browniano è il limite di scala del random walk, e il n\sqrt{n} della dispersione è lo stesso della concentrazione delle medie.
  • SGD, momentum, Adam — la traiettoria dei pesi prodotta da SGD è il processo stocastico applicativo centrale del capitolo: un random walk con deriva.
  • equazioni-differenziali-intuizione (Parte VI, in preparazione) — le SDE come ODE perturbate da rumore browniano; spiega perché le traiettorie non derivabili richiedono il calcolo di Itô.
  • diffusion (Parte XVIII, in preparazione) e image-generation-diffusion (Parte XXII, in preparazione) — i diffusion model costruiti sul forward process stocastico introdotto qui.
  • Bandits e trade-off esplorazione-sfruttamento e UCB e Thompson sampling — le ricompense sono un processo stocastico; le garanzie di regret usano disuguaglianze per martingale.
  • MAP, prior, posterior, regolarizzazione — la GP regression è inferenza bayesiana con un prior sullo spazio delle funzioni: stesso schema, oggetto diverso.
  • Joseph L. Doob, Stochastic Processes (Wiley, 1953) — il testo fondativo della disciplina moderna: la prima trattazione sistematica delle martingale e dell’optional stopping. Difficile, ma è la sorgente.
  • Jonathan Ho, Ajay Jain, Pieter Abbeel, Denoising Diffusion Probabilistic Models (NeurIPS 2020, arXiv:2006.11239) — il paper di DDPM: il forward process come catena di Markov che aggiunge rumore gaussiano, con la forma chiusa che rende il training praticabile.
  • Carl E. Rasmussen, Christopher K. I. Williams, Gaussian Processes for Machine Learning (MIT Press, 2006, disponibile gratuitamente online) — la monografia di riferimento sui processi gaussiani come prior su funzioni e sulla regressione bayesiana.
  • Qianxiao Li, Cheng Tai, Weinan E, Stochastic Modified Equations and Dynamics of Stochastic Gradient Algorithms (Journal of Machine Learning Research 20, 2019) — la derivazione rigorosa delle equazioni differenziali stocastiche che approssimano SGD.
  • Sheldon Ross, Introduction to Probability Models (Academic Press) — trattazione accessibile e ricca di esempi del processo di Poisson, delle catene di Markov e del moto browniano; il punto di partenza naturale dopo questo capitolo.
  • Yang Song et al., Score-Based Generative Modeling through Stochastic Differential Equations (ICLR 2021, arXiv:2011.13456) — la formulazione a tempo continuo dei diffusion model: il forward process come SDE e la sua inversione, per chi vuole vedere il legame col moto browniano in forma esplicita.