Comment entraîner des modèles de vecteurs sémantiques

Beaucoup de gens à qui j’ai parlé récemment pensent spontanément que les modèles de vecteurs sémantiques (embeddings) peuvent être entraînés avec du texte, comme les modèles génératifs. Mais la réalité est différente. SentenceTransformers est souvent le point de départ dans ce domaine; il fournit une liste de jeux de données publics disponibles pour entraîner des modèles de vectorisation, et vous pouvez y voir que les données sont structurées en paires ou triplets de texte. Cet article va expliquer pourquoi les données doivent être structurées ainsi, et comment adapter vos données pour ce format.

Objectif d’entraînement

Le processus d’entraînement d’un réseau de neurones dépend de l’objectif qu’on cherche à accomplir. Il faut trouver des exemples de ce qu’on veut que le réseau de neurones accomplisse, puis l’entraîner sur ces exemples. Pour les vecteurs sémantiques, le but est que le modèle transforme des phrases en vecteurs qui sont proches l’une de l’autre (dans l’espace vectoriel) si le sens des phrases est similaire. On a donc besoin de données qui montrent des exemples de phrases au sens proche.

La structure exacte des données dépend de la fonction de coût. SentenceTransformer a un paragraphe sur les fonctions de coût qui dit:

Toujours dans SentenceTransformers, voyons quel type de données d’entraînement est supporté par les fonctions de coût. En gardant uniquement les fonctions de coût pour l’entraînement normal, voici le genre d’entrées qui reste.

texteétiquette
singletonsclasse
paires (ancre, positive) aucune
paires (ancre, positive/négative) 1 (positive) or 0 (négative)
paires (texte_A, texte_B) score de similarité entre 0 et 1
triplets (ancre, positive, négative) aucune
(ancre, positive, négative_1, négative_2, …)aucune

Il y a des variations, mais toutes les entrées contiennent du texte, associé à une étiquette ou à un autre texte, et indiquent si (ou à quel degré) le texte-ancre est proche sémantiquement des autres textes.

Structurer les données

Maintenant que vous comprenez pourquoi on ne peut pas juste utiliser du texte brut, la question est comment obtenir ce type de données structurées ?

Les vecteurs entraînés sur des classes sont en général moins efficaces que ceux entraînés avec des approches contrastives, donc nous nous concentrerons sur ces dernières. Bien sûr, si vous avez juste besoin de données d’entraînement général, vous pouvez retourner à la liste des jeux de données mentionnés plus tôt. Mais le problème le plus intéressant est celui de transformer vos propres données en un jeu de données adapté à l’entraînement de vecteurs sémantiques. Cette section va lister quelques techniques.

  • OpenAI, quand ils publiaient encore de la recherche dans le bon vieux temps de 2022, a montré que des données de texte massives issues d’internet pouvaient être utilisées pour entraîner des modèles de vecteurs sémantiques, avec la supposition que les textes apparaissant côte-à-côte doivent avoir un sens proche. Ils ont donc utilisé des paires de textes apparaissant ensemble comme positifs (similaires) et d’autres textes aléatoirement tirés des données comme négatifs (différents).
  • Dans le même papier, ils ont aussi entraîné des vecteurs sémantiques pour du code informatique, en profitant de l’existence de docstrings (une courte explication de ce que fait une fonction). Ils ont utilisé des paires (docstring, code) comme positifs pour l’entraînement.
  • Une technique plus ancienne consiste à retirer une phrase du milieu d’un paragraphe, et de faire de cette phrase la requête et du paragraphe privé de cette phrase la réponse. On utilise alors la paire (requête, paragraphe) comme paire positive pour l’entraînement.
  • De nombreux jeux de données ont des titres associés à des articles, ou des résumés d’articles. Il existe des jeux de données publics utilisant des paires (titre, article) de wikipédia, des paires (résumé, texte) de Wikihow ou encore (titre, abstract) de publications académiques (voir ici, tables 10-11 pour plus d’exemples).
  • Si vous n’avez pas exactement ce type de données, vous pouvez éventuellement les créer depuis du texte structuré. Par exemple, si votre texte a des titres de section, vous pouvez les extraire et former une paire (titre de section, contenu de la section).
  • Les références croisées. Par exemple, utiliser les citations dans les publications académiques. Les paires (papier-ancre, papier cité) peuvent être utilisées comme positifs.
  • Associer des doubles connus. Il existe un jeu de données basé sur les questions de StackOverflow marquées comme dupliquées, disponibles publiquement (voir la liste mentionnée plus tôt).
  • Lorsque vous avez accès à des versions passées de documents (par exemple une documentation technique qui est mis à jour régulièrement), vous pouvez utiliser les versions passées/présentes du même texte comme positif.

Augmenter les données

Ajouter des négatifs

Notez que ces techniques aident à obtenir des positifs mais pas des négatifs. Pas d’inquiétude, ceux-ci sont faciles à obtenir. Pour chaque paire positive, vous pouvez juste utiliser une entrée choisie aléatoirement dans le jeu de données comme négatif. Ceux-ci sont des négatifs faibles. Des implémentations de la triplet loss sont optimisées pour réutiliser les données du même batch comme négatif, ce qui les rend très efficaces à l’entraînement.

Mais vous pouvez aussi créer des négatifs forts. Vous devez d’abord pré-sélectionner des entrées du même document, ou qui ont les mêmes mots-clés que votre ancre. Classez ces entrées en utilisant soit un modèle de vectorisation existant, soit une technique classique comme BM25. Choisissez alors les entrées les moins bien classées, c’est-à-dire les moins similaires à l’ancre, et utilisez-les comme négatifs forts. Comme elles ont des similarités avec l’ancre (même document ou mêmes mot-clés) mais ont un sens différent, cela force le modèle à être plus précis dans la distinction des entrées.

Augmentation des données par LLM

Les Large Language Models (LLMs) sont de bons outils pour augmenter les données de texte. Il y a diverses façons de les utiliser:

  • (ancre, reformulation par LLM), idéal pour la classification
  • (ancre, question à propos de l’ancre), idéal pour les tâches de recherche

… et la plupart des cas d’utilisation envisageables ont une façon évidente d’être traités.

Conclusion

L’astuce commune à la plupart de ces techniques est de trouver des structures sous-jacentes dans vos données, et de les utiliser pour former des paires de textes similaires.

Cela demande un peu plus de travail que de simplement utiliser du texte brut comme les modèles génératifs, mais j’espère vous avoir montré que c’est possible dans la plupart des cas.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut