- Les data scientists transforment tout en vecteurs. C’est le langage de l’IA
- Mais appliquer aveuglément la similarité cosinus peut orienter dans la mauvaise direction
- Cet article explique comment utiliser la similarité de manière plus intentionnelle pour obtenir de meilleurs résultats.
Embeddings
- Les embeddings sont des représentations vectorisées des données, très utiles pour représenter les relations entre entités ou trouver des éléments similaires
- Par exemple, "brother" et "sister" n’ont aucune relation en tant qu’ID bruts, mais une fois vectorisés, leur relation sémantique peut être représentée
- Les vecteurs servent de structure d’entrée pour les modèles de machine learning ou sont utilisés directement pour la recherche de similarité
- Les embeddings de phrases basés sur les grands modèles de langage (LLM) sont aujourd’hui l’un des usages les plus populaires des embeddings
- Une telle puissance impose des responsabilités en matière de sécurité des données et d’usage intentionnel
Exemple : comparer des phrases avec la similarité cosinus
- Comparaison de trois phrases
- A: "Python can make you rich."
- B: "Python can make you itch."
- C: "Mastering Python can fill your pockets."
- Comparaison basée sur les caractères
- Si l’on compare les chaînes brutes, A et B diffèrent de 2 caractères, tandis que A et C diffèrent de 21 caractères
- Pourtant, sémantiquement, A et C sont plus proches (contenu lié à l’argent)
- Comparaison basée sur des vecteurs
- En utilisant OpenAI text-embedding-3-large, on obtient des vecteurs d’embedding comme suit :
- A:
[-0.003738, -0.033263, -0.017596, 0.029024, -0.015251, ...]
- B:
[-0.066795, -0.052274, -0.015973, 0.077706, 0.044226, ...]
- C:
[-0.011167, 0.017812, -0.018655, 0.006625, 0.018506, ...]
- Nombre de dimensions du vecteur : 3072 (long, mais réductible sans perte notable de qualité)
- Calcul de la similarité cosinus
- A et C : 0.750 (similaires sur le plan sémantique)
- A et B : 0.576 (similaires sur le plan littéral)
- Résultat : le sens est un facteur de similarité plus important que l’orthographe
Qu’est-ce que la similarité cosinus ?
- La similarité cosinus (cosine similarity) mesure la similarité en calculant le cosinus de l’angle entre deux vecteurs
- Comme les vecteurs existent dans un espace de grande dimension, l’intuition géométrique échoue souvent
- Mathématiquement, c’est le produit scalaire (dot product) de vecteurs normalisés
- Propriétés principales :
- Deux vecteurs identiques donnent 1
- Des vecteurs aléatoires sont proches de 0 (effet de moyennisation en grande dimension)
- La valeur obtenue est comprise entre -1 et 1
- Cette simplicité peut être trompeuse
- Ce n’est pas parce qu’une valeur est entre 0 et 1 qu’il faut l’interpréter comme une probabilité ou une mesure intrinsèquement significative
- Ex. : une valeur de 0,6 ne signifie pas forcément une forte similarité
- Les valeurs négatives représentent rarement une opposition sémantique
- Le plus souvent, elles sont dénuées de sens ou proches du bruit
- Si l’on cherche des mots similaires à "dog" avec GloVe(
glove.6B.300d) :
- Les mots proches sont globalement plausibles
- Les mots les plus éloignés produisent souvent des résultats dépourvus de sens
- La similarité cosinus agit comme du "duct tape" : simple et rapide pour comparer toutes sortes de vecteurs
- Images, texte, audio, code, etc. peuvent être comparés
- Mais cela reste un bricolage provisoire, qui peut masquer des problèmes plus profonds
- Comme réparer une plomberie avec du ruban adhésif, ce n’est ni vraiment fiable ni durable
- Même quand la similarité cosinus semble efficace, il est difficile de comprendre pourquoi elle échoue
- On finit souvent par chercher des correctifs ad hoc, qui peuvent créer de nouveaux problèmes
Relation entre similarité cosinus et coefficient de corrélation
- Le coefficient de corrélation de Pearson se calcule en trois étapes :
- soustraire la moyenne pour centrer les données
- normaliser le vecteur en vecteur unitaire
- calculer le produit scalaire (dot product) des deux vecteurs
- Lorsque les vecteurs sont centrés et normalisés :
- coefficient de corrélation de Pearson = similarité cosinus = produit scalaire
- Usage pratique
- On ne recentre ni ne renormalise les vecteurs à chaque comparaison par paire
- À la place, on prétraite les données puis on ne calcule que le produit scalaire
- Si l’on peut utiliser la similarité cosinus, on peut utiliser de la même façon le coefficient de corrélation de Pearson
- Les deux mesures sont, en pratique, exploitables dans des contextes équivalents
Les problèmes lorsqu’on utilise la similarité cosinus comme mesure de similarité
- Utiliser la similarité cosinus comme objectif d’entraînement d’un modèle de machine learning est mathématiquement valide
- Les problèmes apparaissent au-delà de l’adéquation mathématique de la similarité cosinus :
- lorsque la fonction de perte utilisée pour entraîner le modèle n’est pas la similarité cosinus
- lorsque l’objectif d’entraînement diffère des besoins réels de l’application
- En général, les modèles sont entraînés sur des vecteurs non normalisés :
- Ex. : prédiction probabiliste fondée sur le produit scalaire (dot product) et fonction de perte logistique
- Certains modèles apprennent à rapprocher les éléments d’une même classe en minimisant la distance euclidienne
- La normalisation apporte des propriétés mathématiques (contraindre le résultat entre -1 et 1), mais c’est un "bricolage"
- Seuls les modèles entraînés sur la similarité cosinus ou une fonction qui en dérive directement sont sûrs à utiliser ainsi
- Même si un modèle a été explicitement entraîné avec la similarité cosinus, la définition de la similarité reste floue :
- pour un critique littéraire : partage de thèmes
- pour un bibliothécaire : classification par genre
- pour un lecteur : réaction émotionnelle
- pour un typographe : nombre de pages et format
- La similarité cosinus simplifie des définitions variées en un seul nombre, ce qui peut induire en erreur
- Exemple : "espresso" et "cappuccino"
- word2vec considère ces deux mots comme quasiment identiques (du point de vue américain)
- Mais en Italie, ils ne sont pas considérés comme identiques
Quand la similarité cosinus échoue
- Exemple simple : la question des clés perdues
- Question : "What did I do with my keys?"
- Phrases comparées :
- "I left them in my pocket"
- "They are on the table"
- "What did I put my wallet?"
- "What I did to my life?"
- Le problème
- Avec la similarité cosinus :
- la phrase la plus proche n’est pas une réponse pertinente, mais une autre question ("What I did to my life?")
- le résultat repose sur la similarité de structure de phrase plutôt que sur la pertinence sémantique
- Les phrases liées à Python ont une similarité proche de 0, ce qui reflète correctement leur absence de rapport
- Limites dans le monde réel
- Dans les applications réelles, on manipule des milliers de documents
- Sur de grands jeux de données dépassant la fenêtre de contexte, la sensibilité au bruit devient bien plus forte
- Plus le jeu de données grandit, plus les scores de similarité se comportent comme une roulette en grande dimension
Quelles alternatives utiliser à la place de la similarité cosinus ?
L’approche la plus puissante
- Utiliser des requêtes LLM :
- utiliser un modèle de langage puissant pour comparer deux éléments
- Ex. : "Is {sentence_a} a plausible answer to {sentence_b}?"
- Avec un LLM, on peut effectuer des comparaisons vraiment pertinentes :
- distinguer simplement une question d’une réponse
- fournir les résultats dans un format structuré comme du JSON
- Mais si le jeu de données est volumineux, cela devient inefficace et coûteux
Optimisation des embeddings
- Créer des embeddings adaptés à la tâche :
- fine-tuning pour ajuster les poids d’un modèle existant
- transfer learning pour exploiter les connaissances du modèle et produire de nouveaux embeddings plus ciblés
- Similarité symétrique :
- représenter dans l’espace vectoriel la question "A et B sont-ils similaires ?"
- réduire les dimensions inutiles et ne conserver que les caractéristiques pertinentes
- Similarité asymétrique :
- Ex. : représenter sous forme de probabilité "Le document B est-il la bonne réponse à la question A ?"
- transformer requête et clé dans des espaces spécialisés distincts
Prompt engineering
- Ajouter des prompts pour poser le contexte :
- Ex. : "Nationality of {person}" pour mettre en avant le contexte lié à la nationalité
- Préférer des phrases spécifiques à un prompt trop simple :
- "This is a country that has produced many influential historical figures, including {person}"
- La qualité des résultats s’améliore nettement, sans être parfaite pour autant
Réécriture du texte et extraction du contexte
- Prétraiter le texte avant embedding :
- avec un prompt simple comme "résumez le texte suivant en anglais standard en moins de 200 mots", on élimine les similarités de surface
- cela permet d’ignorer les éléments formels inutiles (fautes de frappe, mise en forme, etc.) et de se concentrer sur le contenu
- Générer un contexte structuré :
- résumer une conversation client pour en extraire clairement les besoins et les problèmes :
- "Summarize the conversation in up to 10 Markdown bullet points"
- transformer aussi les pages dans le même format permet un appariement plus précis
Conclusion
- Ces différentes approches alternatives compensent les limites de la similarité cosinus et fournissent des résultats plus fiables
- Il faut choisir et appliquer l’approche adaptée selon le contexte du projet
Résumé
- Limites de la similarité cosinus :
- La similarité cosinus fournit une valeur entre -1 et 1, mais il ne faut pas la considérer comme une probabilité
- La plupart des modèles ne sont pas entraînés avec la similarité cosinus comme objectif, et le résultat n’est souvent qu’une corrélation sans garantie
- Même si le modèle a appris la similarité cosinus, il faut vérifier que cette définition de la similarité correspond bien à nos besoins
- Comment utiliser efficacement la similarité vectorielle :
- entraîner des embeddings spécialisés pour les données
- concevoir des prompts centrés sur les aspects pertinents
- nettoyer et standardiser le texte avant l’embedding
2 commentaires
Excellente compilation de ressources.
Avis Hacker News
Dans les applications RAG qui utilisent la similarité cosinus, il est préférable de réordonner les résultats avec un « semantic re-ranker » ou un « modèle de re-ranking L2 »
Les vecteurs de mots résolvent le problème selon lequel deux mots peuvent être fortement liés même s’ils n’apparaissent pas dans le même contexte
Aux États-Unis, word2vec peut juger qu’espresso et cappuccino sont presque identiques, mais pas en Italie
La similarité cosinus est utilisée dans la plupart des recherches sémantiques basées sur le deep learning
Comparer directement deux éléments à l’aide d’une requête LLM est l’approche la plus puissante
HyDE est une méthode qui génère une réponse hypothétique à une question puis compare les similarités
La similarité cosinus et le RAG top-k donnent une impression de méthode dépassée
Après avoir essayé des approches RAG, certains ont ressenti de la déception et pensent qu’il faut structurer le modèle pour qu’il puisse effectuer le RAG pendant l’entraînement
En graphisme 3D et en physique, l’importance et la précision sont claires, mais en machine learning, l’espace vectoriel représente trop de choses, ce qui rend l’usage du produit scalaire ambigu