Embeddings et géométrie de la similarité
Le sens comme position dans l'espace, et trois façons de mesurer que deux sens sont proches.
L’avant-propos a fait une promesse : chercher par le sens, et non par les caractères. Mais une promesse n’est pas une méthode. Si le sens doit devenir une position dans l’espace, alors deux questions très concrètes se posent. Qu’est-ce qu’une position, ici, exactement ? Et comment mesure-t-on que deux positions sont proches, sachant qu’un mot parfaitement aligné mais lointain pourrait bien perdre face à un mot approximatif mais tout proche ?
Ce chapitre répond aux deux. Il pose la brique sur laquelle tout le cours repose : représenter un texte par un vecteur, et choisir la bonne règle pour mesurer leur proximité.
Le sens comme une position
Voici l’idée fondatrice, et elle est plus ancienne que l’informatique moderne. Le linguiste John Firth la résume en 1957 par une formule restée célèbre : on connaît un mot par la compagnie qu’il tient (Firth, 1957). « Chat » et « félin » apparaissent dans les mêmes contextes, entourés des mêmes voisins (« ronronne », « pattes », « moustaches »), donc ils ont un sens proche. Cette idée porte un nom, l’ hypothèse distributionnelle Hypothèse distributionnelle Idée fondatrice de la sémantique vectorielle : un mot se caractérise par les contextes dans lesquels il apparaît, donc des mots qui partagent des contextes ont des sens voisins. Résumée par la formule de Firth, on connaît un mot par la compagnie qu'il tient. C'est ce principe qui justifie d'apprendre des embeddings où la proximité géométrique encode la proximité de sens. Source : Firth, 1957 , et c’est elle qui rend la recherche sémantique possible.
Comment la transformer en nombres ? On confie ce travail à un réseau de neurones, exactement la brique du cours « Réseaux de neurones : fondations et mathématiques ». À force de voir des textes, le réseau apprend à attribuer à chaque mot, chaque phrase, un embedding Embedding (plongement) Représentation d'un objet (mot, phrase, image) par un vecteur de nombres réels, apprise par un réseau de neurones de sorte que la proximité géométrique reflète la proximité de sens. Deux textes au sens voisin reçoivent des vecteurs voisins. Les dimensions usuelles vont de quelques centaines à quelques milliers (par exemple 768 ou 1536). Source : Mikolov et al., 2013 : une liste ordonnée de nombres, c’est-à-dire un vecteur Vecteur Objet mathématique représenté comme une liste ordonnée de nombres. Un vecteur de dimension n encode n valeurs. En machine learning, les entrées d'un neurone et ses poids sont chacun un vecteur de même dimension. , choisi de sorte que les sens proches reçoivent des vecteurs proches. On ne refait pas ici cet apprentissage, qui appartient au cours fondations. On part du résultat : un texte entre, un vecteur sort.
Trois façons de mesurer la proximité
On a deux vecteurs. On veut un nombre qui dit à quel point ils sont proches. Il existe trois mesures classiques, et le choix entre elles n’est pas un détail : il change qui gagne.
Le produit scalaire
La première brique est le produit scalaire Produit scalaire Opération qui prend deux vecteurs de même dimension et retourne un seul nombre, calculé comme la somme des produits coordonnée par coordonnée. C'est exactement le calcul effectué par un neurone entre ses entrées et ses poids. . On multiplie les deux vecteurs coordonnée par coordonnée, puis on additionne tout.
Cette équation se lit : le produit scalaire de x et y est la somme, pour chaque dimension i, du produit de la i-ème coordonnée de x par la i-ème coordonnée de y. C’est un seul nombre. Il est grand quand les deux vecteurs sont à la fois longs et orientés dans la même direction, et il vaut zéro quand ils sont perpendiculaires.
La norme et la distance euclidienne
La longueur d’un vecteur, sa norme, se déduit du produit scalaire du vecteur avec lui-même.
C’est le théorème de Pythagore en n dimensions : la longueur est la racine de la somme des carrés des coordonnées. De là vient la mesure la plus intuitive de proximité, la distance euclidienne Distance euclidienne Distance entre deux vecteurs u et v dans Rⁿ, définie comme la norme de leur différence : d(u, v) = ‖u - v‖. C'est la généralisation à n dimensions de la distance entre deux points du plan. Sert à mesurer la similarité entre deux représentations vectorielles. : la longueur du segment qui sépare les deux points.
Elle se lit : la distance entre x et y est la racine de la somme des carrés des écarts coordonnée par coordonnée. Plus elle est petite, plus les points sont proches. Attention au sens : ici, petit veut dire proche, l’inverse du produit scalaire.
La similarité cosinus
La distance euclidienne a un défaut pour comparer des sens : elle mêle deux informations, la direction et la longueur. Or pour un texte, c’est souvent la direction qui porte le sens, pas la longueur du vecteur. On veut donc une mesure d’angle pur. C’est la similarité cosinus Similarité cosinus Mesure de proximité entre deux vecteurs, définie comme cos(θ) = (x · w) / (‖x‖ ‖w‖), valeur dans [-1, 1]. Égale à 1 quand les vecteurs sont alignés, 0 quand orthogonaux, -1 opposés. Outil standard pour comparer des embeddings (mots, phrases, images). : le cosinus de l’angle entre les deux vecteurs.
Elle se lit : le cosinus de l’angle est le produit scalaire divisé par le produit des deux longueurs. On reconnaît le produit scalaire, mais débarrassé de l’effet des longueurs par la division. Le résultat vit dans l’intervalle de moins un à un : il vaut un quand les vecteurs pointent dans la même direction, zéro quand ils sont perpendiculaires, moins un quand ils sont opposés.
Joue avec les deux flèches ci-dessous. Observe le produit scalaire, les normes et l’angle changer ensemble. Remarque qu’en allongeant une flèche sans tourner, le produit scalaire grimpe mais l’angle ne bouge pas : c’est exactement la différence que le cosinus efface.
Joue avec les coordonnées. Quand les flèches pointent dans la même direction, le produit scalaire est maximal. Quand elles sont perpendiculaires, il vaut zéro.
Quand la mesure change le gagnant
Voici le moment qui compte. Tant qu’on compare deux vecteurs, le choix de la mesure semble académique. Mais dès qu’on classe plusieurs candidats face à une requête, la mesure décide du classement, et deux mesures peuvent désigner deux gagnants différents.
Dans le composant ci-dessous, une requête (en couleur) fait face à plusieurs candidats. Tu peux déplacer la requête, choisir la mesure, et activer ou non la normalisation. Le classement se recalcule en direct.
Classement des candidats
- 1automobilescore 1.00
- 2bagnolescore 1.00
- 3moteurscore 0.79
- 4bananescore -0.26
Bascule entre cosinus et distance euclidienne sans normalisation : « automobile » (alignée mais longue) et « bagnole » (proche mais courte) échangent leur place. Active ensuite la normalisation et regarde les deux mesures se réconcilier.
Trois questions à te poser en jouant :
- Sans normalisation, qui gagne au cosinus, « automobile » ou « bagnole » ? Et en distance euclidienne ? Pourquoi le désaccord ?
- Que devient ce désaccord quand tu actives la normalisation ?
- Le candidat « banane » remonte-t-il jamais dans le classement, quelle que soit la mesure ? Que t’apprend sa position sur le sens qu’on lui a donné ?
Sous le capot : pourquoi normaliser réconcilie tout
Le composant montre un fait troublant : une fois les vecteurs normalisés, le classement par cosinus et le classement par distance euclidienne deviennent identiques. Ce n’est pas un hasard, et la raison tient en deux lignes de calcul.
Normaliser Normalisation Opération qui ramène un vecteur à une longueur de 1 en le divisant par sa norme, sans changer sa direction. Sur des vecteurs ainsi normalisés, la similarité cosinus se réduit au produit scalaire, et le classement par cosinus coïncide avec le classement par distance euclidienne. C'est pourquoi beaucoup de bases vectorielles normalisent les embeddings à l'entrée. un vecteur, c’est le ramener à une longueur de un en le divisant par sa norme, sans changer sa direction. Plaçons-nous donc sur la sphère unité, où tous les vecteurs ont une longueur de un. La distance au carré entre deux tels vecteurs se développe ainsi :
Comme les deux normes valent un, il ne reste que deux moins deux fois le cosinus. Autrement dit :
Cette relation dit tout : sur la sphère unité, plus l’angle est petit (cosinus proche de un), plus la distance est petite. Les deux mesures varient dans des sens opposés mais de façon strictement monotone, donc elles produisent exactement le même classement. C’est la raison profonde pour laquelle beaucoup de bases vectorielles normalisent les embeddings à l’entrée : elles peuvent alors utiliser la distance euclidienne, souvent plus simple à indexer, tout en raisonnant en réalité sur des angles.
Une surprise qui attend en grande dimension
Toute notre intuition vient du plan, où l’on dessine des flèches. Elle nous trahira au chapitre suivant. En grande dimension, un phénomène contre-intuitif s’installe : si l’on tire deux vecteurs au hasard dans un espace à mille dimensions, ils sont presque toujours quasi perpendiculaires, donc de cosinus proche de zéro. Les distances, elles, se ressemblent toutes. L’espace devient étrangement vide et uniforme. Ce phénomène a un nom, la malédiction de la dimension, et il décide à lui seul de la difficulté de toute recherche vectorielle. On le regardera en face au chapitre 2.
Exercices
En une phrase
Un embedding place le sens dans un espace géométrique, et la mesure qu’on choisit pour comparer ces positions, produit scalaire, distance ou cosinus, décide du classement : pour le sens d’un texte, c’est l’angle qui compte, ce que la normalisation rend explicite.
1. Pourquoi préfère-t-on souvent la similarité cosinus à la distance euclidienne pour comparer des embeddings de texte ?
2. Que vaut la similarité cosinus de deux vecteurs perpendiculaires ?
3. Après avoir normalisé tous les vecteurs, que peut-on dire du classement par cosinus et du classement par distance euclidienne ?
Vers le chapitre 2
On sait maintenant représenter un sens par un vecteur et mesurer la proximité entre deux vecteurs. Mais un vrai moteur ne compare pas deux vecteurs : il en a des millions, et pour chaque requête il faudrait, en théorie, les parcourir tous. Cette recherche exhaustive est exacte, mais son coût grandit avec le nombre de vecteurs. Pire, l’intuition géométrique du plan se brise en grande dimension, là où vivent les vrais embeddings. Le chapitre 2 regarde ces deux murs en face : le coût de la recherche exacte, et la malédiction de la dimension qui rend le problème si particulier.
Sources
- Firth, J. R. (1957). « A synopsis of linguistic theory 1930-1955. » In Studies in Linguistic Analysis, 1-32. Blackwell.
- Mikolov, T., Chen, K., Corrado, G. & Dean, J. (2013). « Efficient Estimation of Word Representations in Vector Space. » arXiv:1301.3781
- Reimers, N. & Gurevych, I. (2019). « Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. » EMNLP. arXiv:1908.10084
Pour aller plus loin
- Jurafsky, D. & Martin, J. H. (2024). Speech and Language Processing (3e édition, brouillon), chap. 6 « Vector Semantics and Embeddings ». Manuel de référence, accessible et gratuit en ligne. web.stanford.edu/~jurafsky/slp3
- Manning, C. D., Raghavan, P. & Schütze, H. (2008). Introduction to Information Retrieval, chap. 6 (Scoring, term weighting and the vector space model). nlp.stanford.edu/IR-book