33 points par GN⁺ 2025-01-16 | 2 commentaires | Partager sur WhatsApp
  • 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

 
mhj5730 2025-01-20

Excellente compilation de ressources.

 
GN⁺ 2025-01-16
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 »

    • Dans les exemples de pgvector-python, le réordonnancement est effectué avec un modèle cross-encoder
    • Il est aussi possible d’utiliser un modèle de langage pour le réordonnancement, mais ses performances peuvent être inférieures à celles d’un modèle spécialisé dans cette tâche
    • L’approche RAG d’Azure utilise l’AI Search semantic ranker dont Bing se sert pour réordonner les résultats de recherche
  • 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

    • « Python » et « Ruby » peuvent ne pas apparaître dans le même contexte, mais « scripting » peut être présent dans le contexte des deux
    • Toutefois, cela fonctionne souvent mal à cause de la malédiction de la dimensionnalité
    • Proposition d’une idée : représenter les word embeddings comme des sommets plutôt que comme des vecteurs
  • Aux États-Unis, word2vec peut juger qu’espresso et cappuccino sont presque identiques, mais pas en Italie

    • La meilleure approche consiste à comparer directement deux éléments à l’aide d’une requête LLM
    • Un LLM peut juger que « Où ai-je mis mon portefeuille ? » et « Où ai-je mis mes clés ? » sont très similaires
  • La similarité cosinus est utilisée dans la plupart des recherches sémantiques basées sur le deep learning

    • Des modèles comme SentenceTransformers sont entraînés pour utiliser la similarité cosinus
    • Des modèles comme CLIP utilisent aussi la similarité cosinus pour les représentations vectorielles d’images
  • Comparer directement deux éléments à l’aide d’une requête LLM est l’approche la plus puissante

    • Les cross-encoders offrent une solution performante et rapide
  • HyDE est une méthode qui génère une réponse hypothétique à une question puis compare les similarités

    • Une meilleure approche consiste à standardiser le format des chunks et à générer la réponse hypothétique dans ce même format
  • La similarité cosinus et le RAG top-k donnent une impression de méthode dépassée

    • La similarité cosinus n’est qu’une propriété accidentelle des données
    • Les nouveaux modèles d’embedding sont entraînés pour utiliser la similarité cosinus comme mesure de similarité
  • 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

    • On pourrait améliorer la modélisation des données d’entraînement en laissant le modèle définir les embeddings, les formats et le processus de recherche
  • 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