Le NLP de ses débuts à maintenant : les Embeddings

Dans l’article précédent on a construit une approche naïve de modélisation du langage fondée sur les n-grams. Un des constats qui en est ressorti est que, pour construire une modélisation puissante du langage, on ne peut pas traiter tous les tokens de manière égale et indépendante. On va donc se concentrer ici sur la construction d’une représentation sémantique des tokens. Cette représentation nous permettra par la suite d’explorer des méthodes plus évoluées de modélisation du langage naturel.

Qu’est ce qu’un Embedding sémantique

Les embeddings, ou plongements sémantiques, jouent un rôle crucial dans le domaine du NLP (Natural Language Processing) en permettant aux machines de comprendre et traiter le langage humain de manière plus nuancée. Avant d’explorer les propriétés idéales d’un embedding sémantique, examinons pourquoi la représentation traditionnelle des tokens, comme le one-hot encoding, se révèle insuffisante.

One-Hot Encoding : les limitations

Dans le one-hot encoding, chaque mot du vocabulaire est représenté par un vecteur où un élément est marqué par un 1 et les autres par des 0. Cette approche souffre de plusieurs lacunes :

  • Dimensionnalité élevée : chaque mot nécessite un vecteur dont la taille équivaut au nombre total de mots dans le vocabulaire, ce qui est inefficace et gourmand en mémoire, surtout avec un grand corpus
  • Aucune information sémantique : Cette méthode ne capture aucune relation ou similarité sémantique entre les mots. Par exemple, « roi » et « reine » seraient aussi éloignés que « roi » et « pomme », ce qui est contre-intuitif. En termes plus mathématique, chaque vecteur de représentation est orthogonal à tous les autres.

Ces limitations mettent en évidence le besoin de représenter les mots d’une manière qui capture leur signification et les relations sémantiques. C’est là qu’interviennent les embeddings sémantiques.

Propriétés désirables d’un embedding sémantique

Pour qu’un embedding soit considéré comme sémantique, il doit manifester certaines propriétés essentielles :

  • Densité : contrairement au one-hot encoding, un bon embedding sémantique devrait être dense, c.-à-d., être représenté par des vecteurs de dimensions bien moindres, chacune portant une richesse d’information.
  • Information sémantique : le vecteur doit encapsuler le sens du mot, permettant ainsi de capturer des notions telles que la similarité sémantique. Les mots aux sens semblables devraient se retrouver proches dans l’espace vectoriel. Pour prendre un exemple concret on aimerait bien que les mots mots ‘voiture’ et ‘bus’ aient des représentations plus proches que les mots ‘voiture’ et ‘pomme’.
  • Contextualisation : un aspect avancé des embeddings sémantiques réside dans leur capacité à refléter le sens du mot en fonction de son contexte d’utilisation. Ceci est particulièrement crucial, car le sens d’un mot peut varier considérablement en fonction de son entourage contextuel.
  • Algèbre sémantique : un autre aspect avancé des embeddings sémantiques est de fournir une représentation qui permettent de faire de l’algèbre sémantique dans une certain mesure. Concrètement on s’attendrait à ce que ‘matin’ – ‘début’ + ‘fin’ = ‘soir’ soit presque vrai.

Au travers de ces quelques propriétés on définit l’objet dont on aimerait disposer. Maintenant une question se pose : comment construire un embedding sémantique ?

Comment implémenter un embedding ? Word2vec

Concept de Word2vec

Word2Vec repose sur un concept simple mais puissant : entraîner un réseau de neurones élémentaire pour réaliser l’une des deux tâches suivantes :

  • CBOW (Continuous Bag of Words) : cette méthode prédit un mot cible à partir d’un ensemble de mots de contexte qui l’entourent.
  • Skip-gram : à l’inverse, cette méthode vise à prédire les mots de contexte à partir d’un mot cible donné.

Le choix entre CBOW et Skip-gram dépend essentiellement de la taille du corpus d’entraînement et des priorités en termes de rapidité d’entraînement.

La clé de cette approche réside dans la récupération a posteriori de la couche intermédiaire du réseau

Vous vous demandez probablement comment l’exécution de ces tâches par un réseau de neurones conduit à une représentation sémantique du langage. La clé de cette approche réside dans l’utilisation de la couche intermédiaire du réseau (l’encoder), après l’entraînement, comme un embedding vectoriel des mots. Celle-ci capture les relations sémantiques entre mots grâce à l’apprentissage effectué.

Examinons brièvement l’architecture du réseau en question :

  1. Input : le réseau reçoit en entrée des vecteurs de mots sous forme de one-hot encoding.
  2. Encodeur : une première couche, fonctionnant comme une projection, compresse ces vecteurs dans un espace de dimension réduite, enrichissant ainsi les vecteurs de caractéristiques sémantiques.
  3. Décodeur : les vecteurs compressés sont ensuite projetés vers un espace de dimension plus grande, similaire à celle de l’entrée.
  4. Softmax : enfin, une fonction softmax est appliquée pour transformer ces vecteurs en probabilités, indiquant la chance de chaque mot d’être le mot cible ou de figurer dans le contexte du mot cible, selon le modèle utilisé.

C’est par ce processus que Word2Vec parvient non seulement à prédire des mots, mais demeure surtout un outil efficace pour capturer la riche sémantique du langage, en plongeant chaque mot dans un espace vectoriel où les relations entre les mots sont significativement reflétées.

Implémenter Skip-gram avec PyTorch : un Guide Pas à Pas

A présent, nous allons voir comment implémenter une version simplifiée de l’algorithme Skip-gram pour la modélisation de mots.

1. Importation des bibliothèques nécessaires

Nous commençons par importer toutes les bibliothèques nécessaires à notre projet. Nous utiliserons PyTorch et le langage Python pour créer et entraîner notre modèle, ainsi que diverses bibliothèques pour le traitement de texte et la visualisation.

2. Lecture et tokenisation du texte

Nous lisons un fichier texte et le tokenisons en mots individuels. Cela nous donne une liste de mots (tokens) qui seront utilisés pour créer notre modèle de Skip-gram.

3. Création des tables de correspondance des mots

Nous créons deux dictionnaires : word_to_index et index_to_word. Le premier mappe chaque mot à un indice unique, et le second fait l’inverse.

4. Conversion des tokens en indices

Nous convertissons notre liste de mots en une liste d’indices correspondants en utilisant notre table de correspondance word_to_index.

5. Génération des paires Skip-gram

Nous générons les paires de mots pour l’entraînement Skip-gram. Pour chaque mot, nous créons des paires avec les mots dans une fenêtre de taille définie autour de lui.

6. Encodage One-Hot

Pour chaque indice de mot, nous créons une représentation one-hot.

7. Définition du modèle Word2Vec

Nous définissons notre modèle Word2Vec avec deux couches linéaires. La première couche mappe les vecteurs one-hot à un espace d’embedding, et la seconde mappe les embeddings à l’espace de sortie.

Nous initialisons notre modèle avec la taille du vocabulaire et la dimension des embeddings.

8. Entraînement du modèle

Nous définissons une fonction pour entraîner notre modèle. Cette fonction utilise l’optimiseur Stochastic Gradient Descent (SGD) et la perte de cross-entropie. Nous entraînons le modèle pendant un certain nombre d’époques et suivons la perte pour chaque époque.

Ensuite, nous entraînons le modèle avec les paires générées.

Voici la courbe de loss en fonction du nombre d’epochs que l’on obtient après environ 300 epochs. On parvient de manière effective à améliorer le modèle mais très lentement.

9. Remarques et limites

Word2Vec est un algorithme clé qui a permis un bond en avant significatif en NLP. Plus particulièrement, ce qui rend cette démarche si puissante est son entraînement auto supervisé ; on entend par là qu’il suffit de disposer des données textuelles pour entraîner le réseau ce qui est nettement plus simple que dans de nombreuses autres approches en machine learning.

Notons aussi que l’implémentation présentée ici est à visée pédagogique ; l’objectif est de montrer que Word2Vec est un algorithme simple qui s’implémente en moins de 100 lignes de code python. Il faut néanmoins garder à l’esprit qu’une implémentation sérieuse demanderait d’accorder de l’importance à certains détails que j’ai décidé de ne pas mentionner ici pour ne pas complexifier l’explication. Les défauts les plus évidents dans l’implémentation présentée sont :

  • Le jeu d’entraînement est trop petit et trop spécifique, il y a donc un fort risque de sur apprentissage
  • La dimension de l’embedding est décidée de manière arbitraire, il faudrait établir une démarche plus scientifique de détermination de ce paramètre comme par exemple faire du tuning d’hyper paramètres sur un jeu de données réduit

Conclusion et limites

Pour conclure, il est essentiel de noter les différents biais inhérents aux données utilisées dans l’entraînement de modèles comme Word2Vec. Un exemple bien connu de ce biais est le biais de genre. Par exemple, l’opération ‘médecin’ – ‘homme’ + ‘femme’ aboutit à un vecteur très proche de ‘infirmière’, illustrant comment les stéréotypes de genre présents dans les données se manifestent dans les similarités calculées par Word2Vec. Ces biais ne sont pas limités au genre, mais peuvent également inclure des biais ethniques, culturels et socio-économiques, reflétant les préjugés et inégalités présents dans les données d’entraînement. Ces biais se répercutent inévitablement dans les résultats obtenus et peuvent avoir des conséquences significatives sur les applications utilisant ces modèles.

Une autre limite importante du modèle Word2Vec est le fait que les embeddings obtenus sont statiques. Cette caractéristique empêche le traitement correct des mots présentant des polysémies ; par exemple le mot ‘clarté’ peut être utilisé pour décrire une lumière mais il peut aussi être utilisé pour parler d’un son ou d’un argumentaire selon le contexte.

Aujourd’hui, on privilégie plutôt des modèles comme BERT et d’autres fondés sur les transformers, qui représentent un autre paradigme dans le traitement du langage naturel et plus particulièrement de la représentation des tokens. Ces modèles, grâce à leur architecture et leur méthode d’entraînement, permettent de mieux capturer les nuances contextuelles des mots. Cependant, ils ne sont pas totalement exempts de biais et soulèvent également des défis particuliers.

Dans un prochain article, nous explorerons en détail ces approches fondées sur les transformers, leurs avantages et leurs limitations.


Publié

dans

par

Étiquettes :

En savoir plus sur enioka

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture