La maledizione della dimensionalità
In alta dimensione la geometria smette di assomigliare a quella che hai imparato. Tutti i punti sono al bordo, tutte le distanze si schiacciano sulla stessa media, e il “vicino” perde la sua promessa di essere informativo.
Perché questo capitolo
Sezione intitolata “Perché questo capitolo”Ogni intuizione che hai costruito su due e tre dimensioni — il punto al centro, il volume che riempie il cubo, le distanze che separano gruppi distinti — inizia a tradirti già a dieci dimensioni e mente sistematicamente oltre le cento. Eppure ogni embedding moderno vive in 768, 1024, 3072 o più dimensioni. Ogni feature vector di una rete neurale di taglio, ogni KV cache, ogni ricerca vettoriale di una pipeline RAG (Retrieval Augmented Generation) opera in territori dove la geometria a cui sei abituato semplicemente non funziona più. Non si tratta di sottigliezze accademiche: pipeline RAG che falliscono silenziosamente, top-k retrieval che restituisce risultati indistinguibili, kNN che non trova niente di significativo, soglie di cosine similarity calibrate male — tutto questo è la maledizione della dimensionalità che si manifesta in produzione.
C’è anche un secondo motivo, complementare. Capire la maledizione è capire perché esistono le sue contromisure: PCA (Principal Component Analysis), UMAP (Uniform Manifold Approximation and Projection), t-SNE per visualizzazione, ANN (approximate nearest neighbor) come HNSW e IVF-PQ per scalare la ricerca, re-ranker basati su cross-encoder, hybrid search con BM25, manifold learning. Nessuna di queste tecniche è gratuita: ognuna nasce per aggirare un effetto specifico della dimensionalità. Senza il modello mentale della curse non si capisce quando una di queste tecniche è la scelta giusta e quando è cargo cult.
Vale la pena anticipare un equivoco frequente. La curse non è una caratteristica univoca: è una famiglia di fenomeni distinti che condividono il fatto di emergere quando d cresce. Esplosione combinatoria di stati discreti (la versione di Bellman). Concentrazione delle distanze euclidee (la versione di Beyer). Caduta di accuracy di classificatori a campione fisso (la versione di Hughes). Compressione dello spettro di cosine similarity (la versione operativa per RAG). Sono fenomeni diversi, con cause matematiche diverse, e con cure diverse. Confonderli porta a applicare la cura sbagliata al sintomo sbagliato.
C’è infine un motivo culturale. La curse è uno dei pochi punti in cui matematica, statistica, deep learning e ingegneria della ricerca convergono sullo stesso fenomeno. Bellman l’ha vista nei primi anni del calcolo numerico, gli statistici la incontrano sotto forma di Hughes phenomenon, gli ingegneri di retrieval la combattono con LSH, i ricercatori in mechanistic interpretability la sfruttano nella forma di superposition. Ascoltarla in questi diversi accenti aiuta a capire non solo cosa è, ma anche cosa non è — perché il deep learning, contro ogni intuizione classica, ci convive bene.
Contesto
Sezione intitolata “Contesto”Il termine curse of dimensionality è una coniazione di Richard Bellman (matematico americano della RAND Corporation) nel libro Dynamic Programming (Princeton University Press, 1957), il volume in cui Bellman fonda la programmazione dinamica come disciplina. Bellman lo introduce nel capitolo iniziale, parlando di problemi di ottimizzazione su spazi di stato continui: per ogni nuova dimensione, una griglia regolare moltiplica per un fattore costante il numero di celle, e il calcolo diventa rapidamente impossibile. È un’osservazione operativa, non un teorema, e il nome poetico — “una maledizione” — denota un atteggiamento ironico verso un problema concreto che Bellman incontrava ogni giorno.
Il termine sopravvive a Bellman e si specializza. Negli anni sessanta, Thomas Cover (Stanford, statistico e teorico dell’informazione) dimostra in Geometrical and statistical properties of systems of linear inequalities (IEEE Trans. Electronic Computers, 1965) che la separabilità lineare di n punti in R^d è quasi garantita quando d cresce: una prima forma di “blessing”. Nel 1968 Gordon F. Hughes pubblica On the Mean Accuracy of Statistical Pattern Recognizers (IEEE Trans. Information Theory), descrivendo il peaking phenomenon: un classificatore con dataset finito raggiunge un picco di accuracy a una certa dimensione e poi degrada — più feature non è sempre meglio.
Negli anni novanta la curse arriva in machine learning applicato. Kevin Beyer, Jonathan Goldstein, Raghu Ramakrishnan e Uri Shaft, nel paper When Is “Nearest Neighbor” Meaningful? (ICDT 1999), dimostrano formalmente quello che molti ingegneri sospettavano: per distribuzioni i.i.d. su R^d, la differenza relativa fra distanza massima e minima da un query point ai dati va a zero al crescere di d. Il nearest neighbor in alta dimensione perde discriminanza. È il teorema che sotto sotto governa ogni discussione moderna su RAG, vector search e similarity.
David Donoho (statistico di Stanford) dà alla questione la sua formulazione matura nel 2000, in una AMS Math Challenges Lecture intitolata High-Dimensional Data Analysis: The Curses and Blessings of Dimensionality. Donoho argomenta che alta dimensione è due cose insieme: maledizione per i metodi classici (kNN, density estimation, griglie) e benedizione per altri argomenti (concentration of measure, random projections, separabilità). La dualità diventa il modo in cui la statistica matematica pensa la dimensionalità, e il paper di William B. Johnson e Joram Lindenstrauss, Extensions of Lipschitz mappings into a Hilbert space (Contemporary Mathematics 26, 1984) — che dimostra che n punti possono essere proiettati da R^d a R^k con k = O(log n / ε²) preservando le distanze — è il blessing più citato.
Il filo si chiude in deep learning. La manifold hypothesis — i dati naturali vivono su sotto-varietà a dimensione intrinseca molto inferiore alla dimensione ambiente — è il modo in cui il campo spiega perché reti neurali profonde funzionano malgrado lavorino in spazi di centinaia di migliaia di dimensioni. Yoshua Bengio, Aaron Courville e Pascal Vincent la articolano in Representation Learning: A Review and New Perspectives (IEEE TPAMI 2013) come la giustificazione informale del deep learning. Più recentemente, Kawin Ethayarajh in How Contextual are Contextualized Word Representations? (EMNLP 2019) documenta che gli embedding di BERT, ELMo, GPT-2 sono fortemente anisotropi — occupano un cono stretto in R^d invece di distribuirsi uniformemente — e Tianyu Gao, Xingcheng Yao, Danqi Chen mostrano in SimCSE (EMNLP 2021) come contrastive training riduca l’anisotropia.
timeline
title Curse of dimensionality, 1957-2021
1957 : Bellman, "Dynamic Programming"
1965 : Cover, separabilità in alta dimensione
1968 : Hughes, peaking phenomenon
1984 : Johnson-Lindenstrauss, lemma di proiezione
1998 : Indyk-Motwani, LSH
1999 : Beyer et al., "When is NN meaningful?"
2000 : Donoho, "High-Dimensional Data Analysis: curses and blessings"
2013 : Bengio et al., representation learning
2018 : HNSW (Malkov-Yashunin)
: Gorban-Tyukin, blessing of dimensionality
2019 : Ethayarajh, anisotropia degli embedding
2021 : SimCSE, contrastive learning per embedding isotropi
Figura 1 — historical timeline of curse-of-dimensionality milestones from Bellman 1957 to SimCSE 2021
Una nota di metodo storico: il termine “curse” attraversa cinquant’anni e cambia significato senza che chi lo usa se ne accorga sempre. Per Bellman è un’esplosione combinatoria di stati. Per Beyer è una concentration di distanze. Per Hughes è un trade-off bias-varianza. Per Donoho è una dualità con benedizioni. Per chi fa RAG nel 2026 è il motivo per cui i top-k cosine collassano. Sono tutti collegati, ma non sono lo stesso fenomeno: tenerli distinti aiuta a non confondere diagnosi e cura. Una pipeline RAG che fallisce per anisotropia non si ripara con PCA; un Q-learning tabellare che esplode non si ripara con un re-ranker.
Questo capitolo presuppone che tu abbia attraversato vettori e spazi vettoriali, norme e distanze, prodotto scalare, autovalori e autovettori, probabilità di base ed embedding come concetto. Diversi di quei capitoli accennano alla curse; qui è il protagonista.
L’intuizione
Sezione intitolata “L’intuizione”Primo angolo: il volume si rifugia nel guscio
Sezione intitolata “Primo angolo: il volume si rifugia nel guscio”Pensa a una palla di raggio 1 in dimensione 2 — un disco. Il bordo è un cerchio di spessore zero, l’interno è quasi tutto il disco. Ora prendi la stessa palla in 3 dimensioni: una sfera. Anche qui il bordo è una superficie di spessore zero, e l’interno (il volume) è ben distribuito. La tua intuizione di “centro pieno, bordo sottile” funziona benissimo.
Adesso pensa a una palla di raggio 1 in 100 dimensioni. Considera il guscio fra raggio 0.99 e raggio 1: la fettina sottile vicino al bordo, di spessore 0.01. Quanto del volume totale sta in questo guscio?
Il rapporto fra volume del guscio e volume totale è 1 - (1 - 0.01)^100 ≈ 1 - 0.366 ≈ 0.634. Il 63 per cento del volume sta nell’1 per cento esterno della palla. In dimensione 1000 con lo stesso guscio dell’1 per cento, il rapporto è 1 - 0.99^1000 ≈ 0.99996: praticamente tutto il volume sta in un guscio di spessore 0.01.
Questo è un TEOREMA, non un’analogia: deriva dalla formula del volume di una palla in R^d e si verifica numericamente in due righe di codice. La conseguenza è controintuitiva e profonda: in alta dimensione un punto random scelto uniformemente nella palla unitaria è, con probabilità altissima, un punto vicino al bordo. La nozione classica di “centro tipico di una distribuzione” — ereditata dalla statistica monodimensionale, dove “media” e “tipico” coincidono spesso — si rompe.
Secondo angolo: tutti i punti diventano quasi equidistanti
Sezione intitolata “Secondo angolo: tutti i punti diventano quasi equidistanti”Genera n=1000 punti random in R^d con componenti gaussiane standard, indipendenti. Genera anche un query point random q. Calcola la distanza euclidea da q a ciascuno degli n punti. Hai n distanze: quanto varia il loro range?
In R^2 le distanze hanno un range largo: alcuni punti sono molto vicini, altri molto lontani. Il rapporto (max - min) / min è tipicamente intorno a 3 o 4. In R^10 si stringe a circa 1. In R^100 a circa 0.2. In R^1000 a circa 0.07. La differenza relativa fra il punto più vicino e il punto più lontano da q va a zero al crescere di d.
In prosa: in alta dimensione tutti i punti sono quasi ugualmente lontani da te. Il “tuo nearest neighbor” è solo marginalmente più vicino del tuo “decimo neighbor”, che è solo marginalmente più vicino del tuo “centesimo neighbor”. La nozione stessa di “vicino” perde discriminanza. È il TEOREMA di Beyer-Goldstein-Ramakrishnan-Shaft del 1999, verificabile in poche righe di numpy.
Tieni insieme i due angoli. Il primo dice dove sta il volume (al bordo). Il secondo dice come si comportano le distanze (concentrano). I due fenomeni sono manifestazioni della stessa cosa, la concentration of measure — la regola generale per cui funzioni regolari di tante variabili indipendenti si concentrano fortemente attorno alla loro media.
Terzo angolo: angoli quasi retti dappertutto
Sezione intitolata “Terzo angolo: angoli quasi retti dappertutto”Un terzo angolo aiuta a fissare l’idea, perché tocca una grandezza che usi tutti i giorni se lavori con embedding: il cosine. Prendi due vettori random in R^d con componenti gaussiane standard indipendenti. In due dimensioni il loro angolo è uniformemente distribuito fra 0 e 2π — qualsiasi orientamento è possibile, e cosine 0.5, 0.7, -0.3 sono tutti facilmente osservabili. In tre dimensioni l’orientamento è già un po’ meno uniforme sull’angolo: angoli vicini a 90 gradi sono più probabili degli estremi. In dieci dimensioni la concentrazione diventa percepibile. In mille dimensioni il cosine è quasi sempre vicino a zero — angoli quasi retti — con deviazione standard 1/sqrt(1000) ≈ 0.03. Cosine 0.1 in mille dimensioni è già un’anomalia statistica; cosine 0.5 è un evento estremamente raro su coppie casuali.
Da qui un’osservazione che diventa pratica: lo “spazio di possibili orientamenti” cresce esponenzialmente in d, ma due vettori random praticamente non comunicano fra loro — sono ortogonali. Questo è il blessing of dimensionality che vedrai nella sezione apposita: si possono “mettere” enormi quantità di informazione lungo direzioni distinte senza interferenza. Ma è anche la curse, perché il segnale di “questi due sono simili” deve essere più forte di un baseline che, a parità di rumore, è quasi nullo — e su encoder anisotropi questo baseline si sposta in alto, comprimendo la banda utile.
La meccanica
Sezione intitolata “La meccanica”Volume della palla unitaria
Sezione intitolata “Volume della palla unitaria”Il volume della palla unitaria in R^d ha una formula chiusa che usa la funzione gamma:
Non serve sapere cosa fa Γ in dettaglio: serve guardare i numeri.
| d | V_d (approssimato) |
|---|---|
| 1 | 2.000 |
| 2 | 3.142 |
| 3 | 4.189 |
| 5 | 5.264 |
| 10 | 2.550 |
| 20 | 0.0258 |
| 50 | 1.7 × 10^-13 |
| 100 | 2.4 × 10^-40 |
| 1000 | praticamente zero |
Il volume cresce fino a d ≈ 5, poi decresce, e tende a zero rapidamente. Nel frattempo il cubo unitario [-1, 1]^d ha volume 2^d, che esplode. Il rapporto palla/cubo va a zero come 10^-40 in d=100. La palla unitaria, che riempiva quasi tutto il cubo in d=2 (78 per cento) e meno della metà in d=3 (52 per cento), occupa una frazione infinitesima del cubo che la contiene in alta dimensione.
Per renderlo concreto: se prendi a caso un punto dentro la palla unitaria di R^100 e calcoli la sua distanza dall’origine, la quasi totalità della probabilità (oltre il 99 per cento) è concentrata in un sottile guscio fra raggio 0.95 e raggio 1. Non c’è praticamente nessuna probabilità di trovarlo “al centro”. Il centro, in senso volumico, non esiste in alta dimensione.
Volume del guscio
Sezione intitolata “Volume del guscio”Considera due palle concentriche, di raggio r e R con r < R. Il volume del guscio fra le due è proporzionale a R^d − r^d. Il rapporto guscio/totale è:
Per R = 1 e r = 1 − ε (guscio di spessore ε):
Tabella per ε = 0.01 (guscio dell’1 per cento):
| d | guscio/totale |
|---|---|
| 2 | 1.99% |
| 10 | 9.6% |
| 50 | 39.5% |
| 100 | 63.4% |
| 500 | 99.3% |
| 1000 | 99.996% |
Per ε = 0.1:
| d | guscio/totale |
|---|---|
| 2 | 19% |
| 10 | 65% |
| 50 | 99.5% |
| 100 | 99.997% |
Conseguenza: in alta dimensione tutto il volume di una distribuzione uniforme su una palla è concentrato in un guscio sottile vicino al bordo. È un TEOREMA, non un’analogia.
Concentration delle distanze
Sezione intitolata “Concentration delle distanze”Sia X = (X_1, …, X_d) un vettore con componenti i.i.d. di media 0 e varianza 1. La norma euclidea ||X|| è circa sqrt(d), con fluttuazioni di ordine costante (non scalano con d). Quindi:
(in probabilità) al crescere di d
In termini relativi, la deviazione di ||X|| rispetto alla sua media va come 1/sqrt(d) — sempre più piccola al crescere di d.
Per due vettori indipendenti X, Y i.i.d. con stessa distribuzione, ||X − Y||² ≈ 2d, quindi ||X − Y|| ≈ sqrt(2d) ± O(1). Tutte le distanze pairwise si concentrano sulla stessa media sqrt(2d) con fluttuazioni di ordine 1, quindi il loro spread relativo tende a zero. È il risultato di Beyer et al.: (max − min) / min → 0 per d → ∞ a n fissato.
Angoli e cosine in alta dimensione
Sezione intitolata “Angoli e cosine in alta dimensione”Per due vettori i.i.d. gaussiani standard X, Y in R^d, il cosine si scrive:
Il numeratore è una somma di d termini i.i.d. di media 0 e varianza 1, quindi ha media 0 e varianza d. Il denominatore è circa d. Quindi il cosine ha media 0 e varianza ≈ 1/d, deviazione standard ≈ 1/sqrt(d).
In d=100, due vettori random hanno cosine attorno a 0 con deviazione 0.1. In d=1000, deviazione 0.03. TEOREMA: vettori random in alta dimensione sono quasi ortogonali con altissima probabilità.
Questo ha due facce. Faccia positiva: si possono “imballare” un numero esponenziale (in d) di vettori quasi ortogonali in R^d, base teorica del superposition principle in mechanistic interpretability e dell’efficacia di rappresentazioni distribuite. Faccia negativa: lo spettro dei cosine si comprime. Cosine 0.5 in d=10 è “tipico”; cosine 0.5 in d=1000 è straordinariamente alto, ma il tuo intuito di praticante non lo distingue.
Johnson-Lindenstrauss lemma
Sezione intitolata “Johnson-Lindenstrauss lemma”TEOREMA (Johnson, Lindenstrauss, 1984). Per ogni ε ∈ (0, 1) e ogni insieme di n punti in R^d, esiste una mappa lineare f: R^d → R^k con
tale che per ogni coppia u, v dell’insieme:
Il numero di dimensioni k necessarie dipende solo logaritmicamente da n e non dipende affatto da d. La mappa f può essere una semplice matrice random gaussiana — non serve addestrare nulla.
Esempio numerico. Per n = 10^6 punti e ε = 0.1 (distanze preservate al 10 per cento), k ≈ 1380 dimensioni. Per n = 10^9 e ε = 0.2, k ≈ 540. Indipendente da d originale. Se i tuoi vettori sono in R^4096, puoi proiettarli random in R^1000 senza perdere significativamente la struttura delle distanze, e questo è il fondamento teorico di parte degli algoritmi ANN, di LSH (locality-sensitive hashing), e di tecniche di compressione.
Pseudocodice: vedere la concentration
Sezione intitolata “Pseudocodice: vedere la concentration”import numpy as np
def concentration_demo(d_list, n=1000, trials=50): """Per ogni d, genera n punti random in R^d e un query point; calcola (max_dist - min_dist) / min_dist per `trials` ripetizioni.""" for d in d_list: ratios = [] for _ in range(trials): X = np.random.randn(n, d) # n punti i.i.d. gaussiani q = np.random.randn(d) # query point random dists = np.linalg.norm(X - q, axis=1) ratios.append((dists.max() - dists.min()) / dists.min()) print(f"d={d:4d}: mean (max-min)/min = {np.mean(ratios):.4f}")
concentration_demo([2, 5, 10, 50, 100, 500, 1000])Riga per riga: np.random.randn(n, d) genera una matrice n×d di campioni gaussiani standard indipendenti. q è un altro punto random. np.linalg.norm(X - q, axis=1) calcola le n distanze euclidee da q ai punti. Il rapporto (max - min) / min misura quanto vario è lo spread delle distanze. Output qualitativo:
- d=2: ~3.0
- d=10: ~1.0
- d=100: ~0.2
- d=1000: ~0.07
La curse si vede a colpo d’occhio: in d=1000 il punto più lontano è solo il 7 per cento più lontano del più vicino. Il “vicino” non è più informativo.
Conviene notare un dettaglio operativo. La concentration sulle distanze i.i.d. è un teorema asintotico in d, ma con n fissato. Cosa succede se anche n cresce? Se n cresce esponenzialmente in d, allora il numero atteso di punti vicini al query in un guscio fissato non va a zero, e la nearest neighbor torna informativa. Ma “n esponenziale in d” è impossibile in pratica per d > 30 circa: nessun dataset mondiale ha 10^30 elementi. Quindi nella pratica si è sempre nel regime “n piccolo rispetto a d”, dove la concentration morde.
Esempio 1: numerico, il guscio in azione
Sezione intitolata “Esempio 1: numerico, il guscio in azione”Quanto volume di una palla unitaria in R^100 sta nel guscio fra raggio 0.9 e raggio 1?
Il 99.997 per cento. Un punto uniforme nella palla unitaria di R^100 è, con probabilità 99.997 per cento, a distanza dall’origine compresa fra 0.9 e 1. La nozione di “punto vicino al centro” sparisce.
Per contrasto in R^3, il guscio fra 0.9 e 1 contiene 1 − 0.729 = 27 per cento del volume. Coerente con l’intuizione 3D in cui interno ed esterno sono entrambi ben rappresentati.
Esempio 2: codice, distanze pairwise concentrano
Sezione intitolata “Esempio 2: codice, distanze pairwise concentrano”Un esperimento end-to-end:
import numpy as npimport matplotlib.pyplot as plt
n = 1000ds = [2, 10, 50, 200, 1000]
fig, axes = plt.subplots(1, len(ds), figsize=(4*len(ds), 3))for ax, d in zip(axes, ds): X = np.random.randn(n, d) # distanze pairwise, sample 5000 coppie idx = np.random.choice(n, (5000, 2)) dists = np.linalg.norm(X[idx[:,0]] - X[idx[:,1]], axis=1) ax.hist(dists, bins=40) ax.set_title(f"d={d}, mean={dists.mean():.1f}, std={dists.std():.2f}")Output qualitativo: gli istogrammi delle distanze diventano sempre più stretti al crescere di d. Per d=2, distanze sparse fra 0 e 4. Per d=1000, un picco affilato attorno a sqrt(2·1000) ≈ 44.7 con deviazione minima.
flowchart LR Q[Query utente] --> E[Encoder] E --> V[(Vector store)] V -->|top-50| R[Reranker cross-encoder] R -->|top-3| C[Context window] C --> G[Generator LLM] G --> A[Risposta]
Figura 4 — pairwise distance histograms for d in {2,10,50,200,1000}, showing concentration
Esempio 3: numerico, dimensioni richieste da Johnson-Lindenstrauss
Sezione intitolata “Esempio 3: numerico, dimensioni richieste da Johnson-Lindenstrauss”Supponiamo di avere un milione di vettori in R^4096 (dimensione tipica di embedding moderni di grossa taglia). Vogliamo proiettarli in dimensione inferiore preservando le distanze pairwise a meno di un fattore (1 ± 0.1). Quante dimensioni servono secondo JL?
con C costante (in pratica ~8 per le costruzioni standard). Per n = 10^6 e ε = 0.1:
Più di 4096. Cattiva notizia: per ε così stringente, JL non aiuta. Allenta a ε = 0.2 (distanze al 20 per cento):
Ora sì: si può proiettare 10^6 vettori da R^4096 a R^440 preservando le distanze a meno di un fattore 50 per cento. Il punto è che JL dà un worst case: in pratica, su dati reali con manifold strutturato, si può ridurre molto di più. È quello che fanno PCA e gli ANN moderni: sfruttano struttura, non si appoggiano solo a JL universale.
La lezione: JL è un risultato di sicurezza (“almeno k dimensioni sono sufficienti per qualsiasi insieme di n punti”). Non è la dimensione minima per i tuoi dati specifici. Misurare empiricamente il recall@k al variare della dimensione di proiezione è sempre più informativo del bound teorico.
Esempio 4: scenario reale, RAG e top-k che collassano
Sezione intitolata “Esempio 4: scenario reale, RAG e top-k che collassano”Una pipeline RAG su documentazione tecnica usa text-embedding-3-large di OpenAI, dimensione 3072. La pipeline indicizza 200 mila chunk di documentazione e per ogni query ritorna i top 5 per cosine similarity, che vengono passati in context al modello generatore.
Il team osserva due fenomeni preoccupanti.
Primo: i cosine similarity dei top 5 sono spesso indistinguibili al terzo decimale. Top-1 ha cosine 0.847, top-2 cosine 0.844, top-5 cosine 0.838. Differenze di pochi millesimi. Eppure il top-1 a volte è perfettamente pertinente, il top-5 totalmente fuori tema. Il cosine non distingue.
Secondo: cambiando soglia di accettazione da 0.80 a 0.85, l’80 per cento delle query non ritorna nulla; abbassandola a 0.75, il 90 per cento delle query ritorna risultati di cui metà sono spazzatura. Il cosine è “sgonfiato”: la banda utile è strettissima.
Cosa sta succedendo. Gli embedding dell’encoder sono anisotropi (Ethayarajh, 2019): vivono in un cono stretto, non in tutta la sfera. Questo gonfia i cosine fra coppie casuali (la baseline non è 0 ma 0.4-0.6, dipende dal modello), e schiaccia tutto lo spettro utile in una banda di pochi centesimi. Insieme alla concentration of measure, l’effetto è che cosine cessa di essere un indicatore affidabile della rilevanza.
Soluzioni. (1) Aggiungere un re-ranker basato su cross-encoder che riassegna gli score sui top 50 — il cross-encoder concatena query e candidato in un’unica sequence, attiva attention crossata, e produce uno score molto più discriminante. (2) Combinare con BM25 (sparse retrieval) via reciprocal rank fusion — BM25 è robusto in alta dimensione perché vive su feature sparsi, non su un denso continuo. (3) Calibrare la soglia per encoder specifico, su un dataset etichettato, invece di copiare 0.8 da un blog post. (4) Considerare encoder isotropi addestrati con contrastive learning (SimCSE-style) o whitening post-hoc.
L’errore concettuale alla base: trattare la cosine similarity come una grandezza assoluta interpretabile (più alto = più simile), quando è una grandezza relativa la cui scala dipende da modello, anisotropia, distribuzione del corpus.
flowchart LR Q[Query utente] --> E[Encoder] E --> V[(Vector store)] V -->|top-50| R[Reranker cross-encoder] R -->|top-3| C[Context window] C --> G[Generator LLM] G --> A[Risposta]
Figura 4 — RAG retrieval pipeline with dense retrieval + cross-encoder reranker, showing how reranker rescues collapsed top-k
Una nota empirica utile: per misurare l’anisotropia di un encoder basta una manciata di righe. Campiona 10000 frasi random dal tuo corpus, calcola gli embedding, normalizza, calcola le coppie pairwise di cosine, prendi la media. Se la media è > 0.3 hai un encoder fortemente anisotropo e devi trattare le soglie con cautela. Se è < 0.1 stai lavorando su un encoder più isotropo, dove i cosine vicini al baseline globale (≈0) sono effettivamente “non correlati” e cosine 0.7-0.8 sono interpretabili come “molto simili” più affidabilmente.
Esempio 5: pratico, scegliere fra encoder con dimensione diversa
Sezione intitolata “Esempio 5: pratico, scegliere fra encoder con dimensione diversa”Un team di prodotto deve scegliere fra due encoder per il proprio motore di retrieval su 5 milioni di documenti. Encoder A produce embedding 768-dimensionali, encoder B produce embedding 3072-dimensionali. Costo storage: 4x in più per B. Costo per query: ~4x in più per dot-product. Latenza ANN: comparabile (HNSW scala bene), ma costo di indicizzazione maggiore.
L’intuizione “più dimensioni = meglio” porta il team a sceglierre B. La realtà, dopo eval su un set etichettato di 1000 query/documento pertinenti:
- Encoder A: recall@10 = 78 per cento. Cosine baseline (su coppie random) = 0.08. Spread utile = 0.08-0.65.
- Encoder B: recall@10 = 81 per cento. Cosine baseline = 0.42. Spread utile = 0.42-0.78.
Differenza in recall: 3 punti percentuali. Differenza in costo: 4x. Il team sceglie A. Ulteriore osservazione: encoder B ha cosine baseline molto più alta (anisotropia maggiore), e le soglie scopiazzate da blog posts (“usa 0.8 come cutoff”) sono semplicemente sbagliate per B perché il 0.8 è già nella banda utile.
Lezione: la scelta dell’encoder non è “più grande, meglio è”. Misurare. Considerare anisotropia, costo storage, costo latenza, recall@k reale sul corpus.
Applicazioni pratiche
Sezione intitolata “Applicazioni pratiche”PCA, UMAP, t-SNE. Quando i dati vivono su un manifold a dimensione intrinseca bassa, ridurre la dimensione li rende più trattabili. PCA (lineare) preserva varianza e distanze globali ma distrugge struttura locale non-lineare. UMAP e t-SNE preservano struttura locale ma distorcono distanze globali — utili per visualizzazione, pericolosi per retrieval. Vedi PCA (in preparazione) e t-SNE/UMAP (in preparazione).
ANN: HNSW, IVF-PQ, ScaNN, DiskANN. Tutti sfruttano struttura del manifold per evitare la complessità O(nd) di kNN brute force. HNSW (Yury Malkov, Dmitri Yashunin, Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs, 2018) costruisce un grafo navigable e fa search greedy in tempo logaritmico. IVF-PQ partiziona lo spazio e quantizza i vettori per ridurre memoria. La curse rende kNN naive impraticabile a 10^9 vettori; ANN è la risposta industriale. Vedi ann-intro (in preparazione), ann-hnsw (in preparazione), ann-ivf-pq (in preparazione).
LSH (locality-sensitive hashing). Indyk e Motwani, Approximate nearest neighbors: towards removing the curse of dimensionality (STOC 1998), introducono famiglie di hash function in cui collisioni sono più probabili per punti vicini. Ridurre la query a lookup in hash bucket aggira la concentration. Vedi lsh (in preparazione).
Re-ranker su top-k in RAG. Pattern dominante in pipeline RAG di produzione: retrieve top 50 con dense embedding, re-rank top 10 con cross-encoder, passare top 3 al generatore. Il dense capta segnale grezzo, il cross-encoder esegue una similarity più ricca su una short list. Vedi reranker (in preparazione) e rag-avanzato (in preparazione).
Hybrid search. Combinare BM25 (sparse, robusto in alta dimensione) con dense embedding via reciprocal rank fusion. Il sparse cattura match esatti di termine, il dense la semantica. Vedi rag-avanzato (in preparazione).
Manifold learning ed embedding addestrati. Invece di feature grezze in alta dimensione, addestrare encoder che mappino input su un manifold informativo. È quello che fa ogni LLM: il primo strato di embedding e gli strati successivi imparano una rappresentazione su cui le distanze diventano significative. La curse non sparisce, ma viene ridotta a una dimensione intrinseca utilizzabile.
Calibrazione di soglie per modello specifico. Mai copiare una soglia di cosine fra encoder diversi. Misurare empiricamente la baseline del modello (cosine medio fra coppie casuali nel tuo corpus) e regolare le soglie su un set etichettato.
Eval geometrica degli embedding. Prima di scegliere un encoder per produzione: misurare anisotropia (cosine medio fra coppie random), spread (deviazione dei cosine), recall@k su un set di query reali. Modelli con cosine baseline 0.5 e modelli con baseline 0.05 richiedono pipeline e soglie diverse.
Dove si rompe
Sezione intitolata “Dove si rompe”La curse stessa va circoscritta: il manifold ipotesi
Sezione intitolata “La curse stessa va circoscritta: il manifold ipotesi”La discussione finora assume distribuzioni i.i.d. su R^d ambiente. Con questa assunzione la curse è un teorema. Ma i dati reali — immagini, audio, testo, embedding LLM — non sono i.i.d. su R^d. Vivono su sotto-varietà a dimensione intrinseca molto inferiore alla dimensione ambiente: la manifold hypothesis (Bengio, Courville, Vincent, Representation Learning, IEEE TPAMI 2013).
Stime di dimensione intrinseca: MNIST è stimato fra 8 e 14 contro 784 ambient. ImageNet è stimato fra 30 e 50 contro centinaia di migliaia di pixel. Embedding di token su LLM moderni hanno dimensione intrinseca a una/due cifre nei primi strati, decine in quelli profondi.
Conseguenza importante: la curse “morde” rispetto a d ambiente, ma le proprietà statistiche utili dipendono da d intrinseco. Il deep learning funziona perché lavora de facto su d intrinseco anche quando opera in d ambiente. Quando i.i.d. assumption regge — feature grezze, dimensioni indipendenti, niente struttura — la curse domina e i metodi classici falliscono. Quando l’i.i.d. assumption non regge — dati naturali con struttura — i metodi che imparano rappresentazioni vincono.
Questa è una distinzione operativa, non una filiazione: il manifold hypothesis non discende dalla curse, è un’ipotesi indipendente che spiega perché il deep learning evade la maledizione classica. Tenere distinte le due osservazioni evita l’errore comune di sostenere “la curse è morta” o “la curse è onnipresente”: entrambe sono sbagliate.
Numerica float in alta dimensione
Sezione intitolata “Numerica float in alta dimensione”Calcolare distanze euclidee in R^d per d grande con float32 introduce errori di cancellazione catastrofica. Per d = 4096 e vettori normalizzati, la differenza fra due cosine può essere dominata dal rumore numerico più che dal segnale. Soluzioni: usare formulazioni numericamente stabili (||a - b||² = ||a||² + ||b||² − 2 a·b solo se gli a, b sono pre-normalizzati), float64 dove serve precisione, accumulators con compensated summation. La concentration aumenta la sensibilità a questi errori, perché lo spread del segnale è già stretto.
Cosine vs euclidea sotto concentration
Sezione intitolata “Cosine vs euclidea sotto concentration”Una scelta tipica: usare cosine perché “è invariante alla magnitudo”. In alta dimensione i vettori i.i.d. hanno magnitudo quasi costante (concentration su sqrt(d)), quindi cosine ed euclidea diventano essenzialmente lo stesso ordinamento. La distinzione “cosine è meglio per significato” non vale automaticamente; e con anisotropia il cosine può essere addirittura peggiore perché l’offset comune fra tutti i vettori entra nel numeratore.
Trappola del “più dimensioni = sempre meglio”
Sezione intitolata “Trappola del “più dimensioni = sempre meglio””L’intuizione popolare è che un encoder con embedding 3072d sia “più potente” di un encoder con embedding 1024d. Non è automaticamente vero. Più dimensioni significa più parametri, potenzialmente più anisotropia, più costo storage e più costo di calcolo per query. L’utilità marginale di dimensioni aggiuntive si satura, e dopo la saturazione si paga solo costo. È il Hughes phenomenon rivisitato: a campione di addestramento finito, la dimensione ottimale dipende dal task e dal corpus.
Pratica buona: misurare retrieval recall@k al variare della dimensione (text-embedding-3-large supporta troncatura a dimensioni inferiori via Matryoshka representation). Spesso 1024 dimensioni sono indistinguibili da 3072, e la riduzione 3x del costo storage e di calcolo è gratis.
Anisotropia degli embedding LLM
Sezione intitolata “Anisotropia degli embedding LLM”Il fenomeno documentato da Ethayarajh (2019): embedding contextual da BERT, GPT-2, ELMo occupano un cono stretto invece di R^d intero. Cosine medio fra coppie random può essere 0.3-0.7 invece di 0. Implicazione: la “scala utile” dei cosine è compressa, e soglie naive non funzionano. Mitigazioni: whitening post-hoc, all-but-the-top (Mu, Viswanath, All-but-the-top: simple and effective postprocessing for word representations, ICLR 2018), training contrastivo (SimCSE).
Marca importante: l’anisotropia amplifica la concentration of measure ma è un fenomeno indipendente. Trattarli come la stessa cosa è un errore. La concentration è teorema sui i.i.d. random; l’anisotropia è proprietà empirica degli encoder addestrati. Mitigare uno non mitiga automaticamente l’altro.
Density estimation e griglie
Sezione intitolata “Density estimation e griglie”Per stimare una densità su R^d via griglia con risoluzione r, servono r^d celle. Per d = 20, r = 10, sono 10^20 celle. Ogni cella richiede dati per non essere vuota, e nessun dataset reale può popolare una griglia in alta dimensione. È la curse alla Bellman, e si applica direttamente a:
- Density estimation non parametrica.
- Q-learning tabellare con stato discretizzato (l’osservazione originale di Bellman).
- Programmazione dinamica su MDP con stato continuo.
- Lookup table grandi.
La via d’uscita, in deep learning, è non discretizzare: usare funzioni parametriche differenziabili che generalizzano fra punti vicini. Reti neurali, kernel methods, splines.
Hughes phenomenon
Sezione intitolata “Hughes phenomenon”A campione fisso, l’accuracy di un classificatore in funzione del numero di feature ha un picco e poi degrada. Più feature = più parametri da stimare = più overfitting con dati insufficienti. Il punto di picco dipende dalla dimensione del campione e dalla complessità del classificatore. Implicazione operativa: feature engineering ed eliminazione di feature rumorose hanno valore concreto, anche in epoca di deep learning. Vedi bias-varianza.
Quando la riduzione di dimensione distrugge il segnale
Sezione intitolata “Quando la riduzione di dimensione distrugge il segnale”PCA proietta sui primi k autovettori della matrice di covarianza. Preserva varianza globale ma assume struttura lineare. Se i tuoi dati vivono su un manifold non-lineare (cosa tipica per immagini, audio, embedding contestuali), PCA appiattisce la curva sul piano migliore in senso quadratico medio, distruggendo struttura locale. Esempio classico: PCA su rappresentazioni di volti restituisce eigenfaces utili per ricostruzione, ma una mappa non-lineare addestrata (autoencoder) preserva meglio identità individuale.
UMAP e t-SNE preservano struttura locale (vicini restano vicini), ma distorcono distanze globali in modo arbitrario. Sono utili per visualizzazione 2D/3D di cluster, pericolosi se usati come feature per retrieval o classificazione downstream — la geometria non è metrica nello spazio ridotto.
Regola operativa: PCA per riduzione lineare conservativa quando varianza è proxy ragionevole di significato. UMAP/t-SNE solo per visualizzazione esplorativa. Per retrieval su scala, fidarsi degli embedding addestrati direttamente sulla giusta dimensione (Matryoshka representation learning, troncatura controllata).
Quando la curse è “buona”: il blessing of dimensionality
Sezione intitolata “Quando la curse è “buona”: il blessing of dimensionality”Donoho (2000) e Gorban-Tyukin (Phil. Trans. Royal Society A, 2018) argomentano che alta dimensione abilita argomenti probabilistici semplici. Tre esempi.
Linear separability (Cover, 1965): n punti generici in R^d con n < 2d sono linearmente separabili con altissima probabilità. Da cui SVM con kernel ad alta dimensione (kernel trick), ed efficacia di feature ad alta dimensione anche senza training.
Concentration aiuta: la stessa concentration che rende le distanze inutili rende molte funzioni “quasi deterministiche” in alta dimensione. Argomenti del tipo “con altissima probabilità il risultato è vicino al valore atteso” diventano facili.
Random projections: il JL lemma. Si possono ridurre dimensioni preservando distanze con O(log n / ε²) componenti, indipendentemente da d. Potente per ANN approssimato, per LSH, per compressione.
Marca: questa non è equivalenza con la curse, è dualità. Lo stesso fenomeno (concentration) è curse per kNN e blessing per separabilità. Tenerli distinti ma riconoscere la radice comune è l’atteggiamento maturo verso la dimensionalità.
La curse non è omogenea fra tipi di norma
Sezione intitolata “La curse non è omogenea fra tipi di norma”Il fenomeno di concentration discusso finora vale principalmente per la norma euclidea L2. Per norme L_p con p diverso, il comportamento è diverso. La norma L1 (Manhattan) concentra più lentamente. La norma L_∞ (Chebyshev) si comporta in modo molto diverso: in alta dimensione due vettori i.i.d. hanno una L_∞ dominata da poche componenti estreme, e il rapporto max-min si comprime molto meno. Aggarwal, Hinneburg, Keim, On the Surprising Behavior of Distance Metrics in High Dimensional Space (ICDT 2001) suggeriscono che norme L_p frazionarie (p < 1, non più una metrica vera ma una pseudo-metrica) sono spesso più discriminanti in alta dimensione. È una indicazione tecnica più che una soluzione: la maggior parte degli encoder è addestrata su L2/cosine, e cambiare metrica downstream non ripara training fatto con un’altra geometria.
Bias di selezione: il “primo vicino” e la curse
Sezione intitolata “Bias di selezione: il “primo vicino” e la curse”Anche quando la curse rende le distanze concentrate, il first nearest neighbor è ancora il più vicino. In assoluto è informativo se hai dati con segnale forte. Il problema sorge quando il tuo retrieval ritorna una short list (top 10, top 50) e tratta tutti gli elementi come ugualmente rilevanti. Il top-1 è il più vicino, ma il “vicino del vicino del vicino” può essere indistinguibile dal vicino. Da cui la pratica: usare il rank, non lo score. I cosine assoluti in alta dimensione sono inaffidabili; il rank relativo è sopravvissuto un po’ meglio. Un cross-encoder che riassegna i ranks su una short list aggira il problema.
Collegamenti
Sezione intitolata “Collegamenti”- vettori e spazi vettoriali: la base geometrica su cui poggia tutto. La curse è un fenomeno geometrico in R^d.
- norme e distanze: la concentration of measure è un fenomeno sulle norme. Capire L1, L2, cosine è prerequisito per capire come si comportano in alta dimensione.
- prodotto scalare: i cosine quasi ortogonali in alta dimensione sono il prodotto scalare normalizzato che concentra a 0.
- autovalori e autovettori: PCA e tecniche di riduzione dimensionalità si basano su decomposizione spettrale.
- probabilità di base: concentration è un teorema probabilistico; intuizione su media, varianza, deviazione standard è prerequisito.
- embedding come concetto: gli embedding addestrati operano in R^d e sono soggetti a curse, anisotropia, concentration. Questo capitolo dà le lenti per leggere quel mondo.
- pca (in preparazione): il primo strumento classico per ridurre dimensionalità. PCA non è il rimedio universale; capire i limiti richiede questa pagina.
- tsne-umap (in preparazione): metodi non-lineari che preservano struttura locale ma distorcono distanze globali.
- ann-intro (in preparazione), ann-hnsw (in preparazione), ann-ivf-pq (in preparazione), lsh (in preparazione): industria della ricerca approssimata, tutta nata per aggirare la curse.
- rag-base (in preparazione), rag-avanzato (in preparazione), reranker (in preparazione): pratica RAG in cui la curse si manifesta concretamente.
- bias-varianza: il Hughes phenomenon e la trade-off bias-varianza in alta dimensione.
La maledizione e l’illusione del “sembra che funzioni”
Sezione intitolata “La maledizione e l’illusione del “sembra che funzioni””Un anti-pattern frequente in produzione: una pipeline RAG basata su dense retrieval funziona bene su query semplici ed esplicite, e il team conclude che è solida. Poi entra in produzione, le query reali sono più ambigue, contengono entità nuove, sinonimi inattesi, errori di spelling. Le performance crollano. La diagnosi a posteriori è quasi sempre “il modello non capisce il dominio”. La diagnosi reale, spesso, è geometrica: la concentration of measure più l’anisotropia rendono il sistema fragile a qualsiasi piccola perturbazione del query, perché il margine fra top-1 e top-50 era già minimo. La cura non è cambiare modello, ma aggiungere strati di robustezza: hybrid search, re-ranker, query expansion, calibrazione delle soglie. Vedere la curse rende ovvi questi rimedi; non vederla costringe a scoprirli per tentativi.
Per andare oltre
Sezione intitolata “Per andare oltre”- Donoho, D. L., High-Dimensional Data Analysis: The Curses and Blessings of Dimensionality, AMS 2000. Il riferimento concettuale per la dualità.
- Beyer, K.; Goldstein, J.; Ramakrishnan, R.; Shaft, U., When Is “Nearest Neighbor” Meaningful?, ICDT 1999. Il teorema operativo per kNN in alta dimensione.
- Hastie, T.; Tibshirani, R.; Friedman, J., The Elements of Statistical Learning, 2nd ed., Springer 2009. Sezione 2.5 “Local methods in high dimensions”: trattazione classica con esempi numerici.
- Goodfellow, I.; Bengio, Y.; Courville, A., Deep Learning, MIT Press 2016. Sezione 5.11: la curse come motivazione per representation learning.
- Gorban, A.; Tyukin, I., Blessing of dimensionality: mathematical foundations of the statistical physics of data, Phil. Trans. R. Soc. A, 2018. Per andare oltre Donoho sul versante “blessing”.