02 / 06 Recherche exacte et malédiction de la dimension
  1. ← Chercher par le sens : bases vectorielles et retrieval
  2. 00 Avant-propos
  3. 01 Embeddings et géométrie de la similarité
  4. 02 Recherche exacte et malédiction de la dimension
  5. 03 HNSW : naviguer dans un graphe de proximité
  6. 04 Le paysage des index ANN
  7. 05 Tester l'approximatif : l'oracle différentiel
Chercher par le sens : bases vectorielles et retrieval · 02 / 06

Recherche exacte et malédiction de la dimension

Comparer tous les vecteurs donne la réponse parfaite. Voici son prix, et le piège que la grande dimension tend à notre intuition.

Au chapitre précédent, on a appris à représenter un sens par un vecteur et à mesurer la proximité entre deux vecteurs. Mais un vrai moteur n’en compare jamais deux : il en a des millions, et pour chaque requête il faudrait, en principe, tous les parcourir. Deux questions surgissent alors. Cette comparaison de tout le monde, est-ce vraiment un problème ? Et notre belle intuition du plan, faite de flèches qu’on dessine, tient-elle encore quand les vecteurs vivent en mille dimensions ?

Ce chapitre regarde ces deux murs en face. Le premier est un mur de coût : la recherche parfaite existe, mais elle se paie. Le second est plus sournois, car il défie l’intuition : en grande dimension, l’espace se comporte d’une façon qui va te surprendre.

La recherche exacte : comparer tous les vecteurs

Commençons par le plus simple, qui est aussi le plus sûr. On a une requête, sous la forme d’un vecteur, et une base de millions de vecteurs. On veut les plus proches. La méthode évidente : calculer la distance de la requête à chacun des vecteurs de la base, puis garder les meilleurs.

Trouver les kk éléments les plus proches d’une requête porte un nom, c’est le problème des plus proches voisins Plus proches voisins Problème consistant à trouver, parmi un ensemble de points, les k points les plus proches d'une requête selon une mesure de distance ou de similarité. En recherche vectorielle, k plus proches voisins (k-NN) désigne les k documents dont l'embedding est le plus proche de celui de la requête. . Et la méthode qu’on vient de décrire, comparer la requête à tout le monde, s’appelle la recherche exhaustive Recherche exhaustive Stratégie qui compare la requête à tous les vecteurs de la base, un par un, pour en extraire les plus proches. Aussi appelée balayage linéaire ou index Flat. Elle est exacte par construction (elle ne peut rien manquer) mais son coût croît linéairement avec le nombre de vecteurs et leur dimension, en O(n x d). Elle sert d'oracle de référence pour juger les méthodes approchées. , ou balayage linéaire, ou encore index Flat dans le jargon des bases vectorielles.

Elle a une qualité que rien d’autre ne possédera jamais aussi pleinement : elle est exacte. Puisqu’elle examine chaque vecteur, elle ne peut, par construction, rater aucun voisin. Le classement qu’elle renvoie est la vérité. Retiens ce mot, vérité, car il va devenir précieux : à partir du chapitre 3, on cherchera des méthodes plus rapides qui acceptent de se tromper un peu. Pour savoir si elles se trompent, il faudra une référence parfaite à laquelle les comparer. Cette référence, c’est exactement la recherche exhaustive. On dit qu’elle sert d’oracle.

Le mur du coût

Si la recherche exhaustive est parfaite, pourquoi tout le reste du cours ? Parce qu’elle est lente, et qu’on peut dire exactement à quel point.

Pour comparer la requête à un vecteur en dimension dd, il faut parcourir les dd coordonnées : de l’ordre de dd opérations. Pour la comparer à nn vecteurs, on répète nn fois. Le coût total d’une requête est donc proportionnel à n×dn \times d.

couˆt d’une requeˆten×d\text{coût d'une requête} \propto n \times d

Cette expression se lit : le coût grandit comme le produit du nombre de vecteurs par leur dimension. On note ce comportement O(n×d)O(n \times d). Tant que la base est petite, personne ne s’en plaint. Mais mets-y des chiffres réalistes. Une base de dix millions de documents, des embeddings de dimension 1536 : une seule requête demande de l’ordre de quinze milliards de multiplications. Si ton service reçoit mille requêtes par seconde, tu fais le calcul, le mur arrive vite.

La malédiction de la dimension

On pourrait croire que le seul problème est le coût, et qu’il suffirait d’être plus malin pour ne pas tout comparer. C’est l’idée des chapitres suivants. Mais avant de la poursuivre, il faut comprendre pourquoi être malin est si difficile. La raison ne tient pas à la vitesse des machines : elle tient à la géométrie elle-même.

En basse dimension, dans le plan ou l’espace, notre intuition fonctionne. Il y a des points proches et des points lointains, des régions denses et des régions vides. Trouver le plus proche voisin a un sens clair. En grande dimension, cette intuition se brise. L’ensemble des phénomènes qui surgissent alors porte un nom, la malédiction de la dimension Malédiction de la dimension Ensemble de phénomènes contre-intuitifs qui surgissent quand le nombre de dimensions devient grand. En recherche vectorielle, deux effets dominent : les distances entre points tirés au hasard se concentrent (le plus proche et le plus lointain deviennent presque indiscernables), et deux vecteurs aléatoires sont presque toujours quasi perpendiculaires. C'est ce qui rend la recherche du plus proche voisin difficile en grande dimension. , et deux d’entre eux décident à eux seuls de la difficulté de toute recherche vectorielle.

Le premier : la concentration des distances Concentration des distances Phénomène par lequel, en grande dimension, les distances entre points tirés au hasard se resserrent autour d'une valeur commune. Le contraste relatif (distance maximale moins minimale, rapporté à la minimale) tend vers zéro comme l'inverse de la racine de la dimension. Conséquence : la notion de plus proche voisin perd de son sens quand toutes les distances se ressemblent. . Si tu tires des points au hasard et que tu mesures leurs distances à un point de référence, ces distances, en grande dimension, se ressemblent toutes. Le plus proche n’est presque pas plus proche que le plus lointain. La notion même de plus proche voisin devient floue.

Le second : la quasi- orthogonalité Orthogonalité Deux vecteurs sont orthogonaux quand leur produit scalaire est nul. Géométriquement, cela correspond à un angle de 90 degrés entre eux. En machine learning, des entrées orthogonales contribuent indépendamment au calcul du neurone. . Deux vecteurs tirés au hasard en grande dimension sont presque toujours perpendiculaires, donc de similarité cosinus proche de zéro. L’espace est si vaste que deux directions prises au hasard n’ont quasiment jamais quelque chose en commun.

Ces deux affirmations sont surprenantes. Ne les crois pas sur parole : va les voir.

Voir la malédiction

Le composant ci-dessous tire un nuage de points dont chaque coordonnée est aléatoire, dans la dimension que tu choisis. L’onglet de gauche montre la distribution des distances à une requête ; l’onglet de droite montre la distribution des cosinus entre paires de points. Fais glisser la dimension de 1 vers 1000 et regarde les deux histogrammes se métamorphoser.

0173350Nombre de points0.040.931.812.703.59Distance à la requête
Contraste (max - min) / min 90.648Dispersion relative 0.524
Distance de chaque point à la requête. En montant la dimension, l'histogramme se resserre : le plus proche et le plus lointain se rapprochent l'un de l'autre, et le contraste s'effondre.

Trois questions à te poser en jouant :

  1. À mesure que la dimension grimpe, l’histogramme des distances se déplace-t-il vers la droite, et que devient sa largeur ? Que vaut le contraste à la dimension 2, puis à la dimension 500 ?
  2. Sur l’onglet des cosinus, autour de quelle valeur la cloche se centre-t-elle ? Que devient sa dispersion quand la dimension augmente ?
  3. À très grande dimension, si toutes les distances se valent et tous les angles sont droits, comment un algorithme pourrait-il encore deviner où chercher le plus proche voisin sans tout comparer ?

Sous le capot : pourquoi les distances se concentrent

Le composant montre un fait, il ne l’explique pas. L’explication est belle, et elle tient en quelques lignes. Elle repose sur une idée que tu connais peut-être déjà : quand on additionne beaucoup de petites contributions indépendantes, le total devient remarquablement stable.

Prenons deux points x\mathbf{x} et y\mathbf{y} dont chaque coordonnée est tirée au hasard, indépendamment, selon la même loi. Leur distance au carré, c’est-à-dire le carré de la norme Norme Longueur d'un vecteur, mesurée par la racine carrée de la somme de ses carrés. Pour un vecteur x = (x₁, ..., xₙ), la norme ‖x‖ = √(x₁² + ... + xₙ²). C'est la généralisation du théorème de Pythagore à n dimensions. de leur différence, est, comme on l’a vu au chapitre 1, une somme sur les dd dimensions.

d(x,y)2=i=1d(xiyi)2d(\mathbf{x}, \mathbf{y})^2 = \sum_{i=1}^{d} (x_i - y_i)^2

Cette équation se lit : la distance au carré est la somme, sur chacune des dd dimensions, du carré de l’écart entre les deux points dans cette dimension. Regarde bien ce qu’est chaque terme de la somme : (xiyi)2(x_i - y_i)^2. Comme les coordonnées sont tirées indépendamment et selon la même loi, ces dd termes sont eux-mêmes indépendants et de même loi. Appelons mm la moyenne d’un seul terme et vv sa variance. Ce sont des nombres fixes, qui ne dépendent pas de la dimension.

Une somme de dd termes indépendants de même loi a une espérance et une variance qui s’additionnent terme à terme.

E[d(x,y)2]=d×m\mathbb{E}\big[d(\mathbf{x}, \mathbf{y})^2\big] = d \times m

Cette ligne se lit : en moyenne, la distance au carré vaut dd fois la moyenne d’un terme. Elle grandit donc proportionnellement à la dimension. C’est pour cela que, dans le composant, l’histogramme se déplace vers la droite quand dd augmente : les points sont en moyenne plus loin.

Var[d(x,y)2]=d×v\mathrm{Var}\big[d(\mathbf{x}, \mathbf{y})^2\big] = d \times v

La variance, elle aussi, grandit comme dd. Mais la variance n’est pas la bonne grandeur pour juger l’étalement : il faut l’écart-type, qui est sa racine carrée.

σ[d(x,y)2]=d×v=vd\sigma\big[d(\mathbf{x}, \mathbf{y})^2\big] = \sqrt{d \times v} = \sqrt{v}\,\sqrt{d}

L’écart-type grandit donc comme d\sqrt{d}, pas comme dd. Voilà le point décisif. Comparons l’étalement à la valeur typique en formant leur rapport, ce qu’on appelle la dispersion relative.

σmoyenne=vdm×d=vm×1d\frac{\sigma}{\text{moyenne}} = \frac{\sqrt{v}\,\sqrt{d}}{m \times d} = \frac{\sqrt{v}}{m} \times \frac{1}{\sqrt{d}}

Cette dernière équation est tout le secret. Elle se lit : la dispersion relative des distances au carré est une constante fixe multipliée par un sur racine de dd. Quand la dimension explose, ce facteur 1/d1/\sqrt{d} écrase tout : la dispersion relative tend vers zéro.

dispersion relative ∝ 1 / √d, qui tend vers 0 quand d grandit
À lire à voix haute

Autrement dit, les distances grandissent toutes ensemble, mais leur écart les unes aux autres, rapporté à leur taille, disparaît. Le nuage de toutes les distances se réduit à une coquille fine autour d’une valeur commune. Le plus proche et le plus lointain deviennent presque indiscernables. Ce n’est pas un défaut des machines ni des données : c’est une propriété de la géométrie en grande dimension, démontrée ici en quelques lignes.

Mesurer une recherche imparfaite : le rappel@k

On a maintenant les deux raisons d’abandonner la recherche exhaustive en production : elle est trop lente, et la grande dimension rend le terrain hostile. Les chapitres suivants vont donc construire des méthodes plus rapides qui acceptent de rater, parfois, un voisin. Mais dès qu’on accepte de se tromper, une question devient incontournable : se tromper de combien ?

Il faut une mesure de la qualité. La plus courante est le rappel@k Rappel@k Mesure de la qualité d'une recherche approchée : la fraction des k vrais plus proches voisins (calculés par recherche exhaustive) que la méthode approchée retrouve dans ses k premiers résultats. Un rappel@k de 1 signifie qu'aucun voisin exact n'a été manqué ; un rappel@k de 0,8 signifie qu'un voisin exact sur cinq a échappé à la recherche. . Son principe est direct, et il s’appuie exactement sur l’oracle dont on a parlé. On demande à la recherche exhaustive les kk vrais plus proches voisins : c’est la vérité. On demande ensuite à la méthode rapide ses kk meilleurs résultats. Le rappel@k est la fraction de la vérité que la méthode rapide a retrouvée.

rappel@k=nombre de vrais voisins retrouveˊs dans le top kk\text{rappel@}k = \frac{\text{nombre de vrais voisins retrouvés dans le top } k}{k}

Cette formule se lit : le rappel@k est le nombre de vrais voisins que la méthode rapide a placés dans ses kk premiers, divisé par kk. Un rappel@k de un veut dire qu’elle n’a rien manqué. Un rappel@k de 0,9 veut dire qu’un voisin exact sur dix lui a échappé. C’est l’unité de compte qui nous suivra jusqu’à la fin du cours : chaque fois qu’on gagnera en vitesse, on se demandera ce que ça coûte en rappel.

Exercices

En une phrase

La recherche exhaustive donne toujours la réponse exacte et sert d’oracle, mais son coût en O(n×d)O(n \times d) et la malédiction de la dimension, qui concentre les distances et rend les vecteurs quasi perpendiculaires, imposent de bâtir des index plus rapides dont on mesurera l’erreur par le rappel@k.

Quiz
  1. 1. Pourquoi dit-on que la recherche exhaustive est exacte ?

  2. 2. Comment grandit le coût d'une requête en recherche exhaustive ?

  3. 3. Quand la dimension grandit, que devient la dispersion relative des distances entre points aléatoires ?

Vers le chapitre 3

On sait maintenant deux choses gênantes : comparer tous les vecteurs est exact mais trop lent, et la grande dimension brouille la notion même de proximité. Comment, dès lors, trouver les plus proches voisins sans tout parcourir ? L’idée du chapitre 3 est étonnamment simple à énoncer : et si les vecteurs étaient reliés entre eux par un réseau de raccourcis, de sorte qu’en partant d’un point quelconque et en se déplaçant toujours vers un voisin plus proche de la requête, on arrive en quelques sauts tout près du but ? Ce réseau navigable existe, il s’appelle HNSW, et il transforme une recherche en O(n)O(n) en une promenade de quelques étapes. On y entre au chapitre 3.

Sources

  • Bellman, R. (1961). Adaptive Control Processes: A Guided Tour. Princeton University Press. (Origine de l’expression « curse of dimensionality ».)
  • Beyer, K., Goldstein, J., Ramakrishnan, R. & Shaft, U. (1999). « When Is “Nearest Neighbor” Meaningful? » ICDT. DOI 10.1007/3-540-49257-7_15
  • Aggarwal, C. C., Hinneburg, A. & Keim, D. A. (2001). « On the Surprising Behavior of Distance Metrics in High Dimensional Space. » ICDT. DOI 10.1007/3-540-44503-X_27

Pour aller plus loin

  • Indyk, P. & Motwani, R. (1998). « Approximate Nearest Neighbors: Towards Removing the Curse of Dimensionality. » STOC. DOI 10.1145/276698.276876
  • Manning, C. D., Raghavan, P. & Schütze, H. (2008). Introduction to Information Retrieval, chap. 7. nlp.stanford.edu/IR-book
  • Bruch, S. (2024). Foundations of Vector Retrieval. Springer. Synthèse moderne et rigoureuse de la recherche vectorielle, du balayage exact aux index approchés. arXiv:2401.09350