Module 4 — Word2Vec, GloVe et la géométrie du sens
TF-IDF ignore le fait que « chambre » et « pièce » désignent souvent la même chose. Les plongements de mots (word embeddings) réparent cela : chaque mot devient un vecteur d'environ trois cents composantes, et deux mots proches en sens sont proches dans l'espace. Le corpus d'avis reste le fil rouge — on apprend un plongement sur nos avis, on l'inspecte, on mesure ses biais, on l'utilise.
L'idée de Mikolov : un mot est ce que ses voisins en disent
L'hypothèse distributionnelle, formulée par le linguiste John Firth en 1957, se résume en une phrase : « You shall know a word by the company it keeps. » Deux mots qui apparaissent dans les mêmes contextes ont des sens proches. « Chambre » et « pièce » suivent tous deux « la », précèdent « spacieuse », « impeccable », « bruyante » : ce sont des synonymes fonctionnels.
Word2Vec, publié par Tomas Mikolov chez Google en 2013, transforme cette intuition en une tâche d'apprentissage :
- CBOW (Continuous Bag Of Words) prédit un mot à partir de ses voisins.
- Skip-gram fait l'inverse : il prédit les voisins à partir d'un mot cible.
Dans les deux cas, le modèle est un réseau à une couche cachée. Ses poids d'entrée sont exactement les vecteurs de mots qu'on veut apprendre : chaque ligne de la matrice de plongement est la représentation d'un mot du vocabulaire.
Pour un mot cible et un mot de contexte , la probabilité modélisée est :
C'est le classique softmax sur tout le vocabulaire. Deux mots aux vecteurs proches (produit scalaire élevé) sont co-prédits avec une forte probabilité.
L'échantillonnage négatif, l'astuce qui rend le calcul faisable
Le softmax ci-dessus fait passer chaque exemple d'entraînement par une somme sur les trente mille mots du vocabulaire. Sur un milliard de paires d'entraînement, c'est intenable.
L'échantillonnage négatif remplace le softmax par une tâche binaire : pour chaque vraie paire (mot, contexte), on tire cinq à vingt paires (mot, contexte négatif) où le contexte négatif est un mot pris au hasard. Le modèle apprend à distinguer les vraies paires des paires bruitées, avec une régression logistique.
Le coût passe de trente mille à cinq ou vingt opérations par paire. C'est ce qui a rendu Word2Vec calculable en quelques heures sur un corpus de Wikipédia.
from gensim.models import Word2Vec
# corpus est une liste de listes de mots, déjà nettoyée et tokenisée
modele = Word2Vec(
sentences=corpus,
vector_size=300,
window=5,
min_count=5,
sg=1, # 1 = skip-gram, 0 = CBOW
negative=10, # 10 paires négatives par positive
workers=4,
epochs=5,
)
modele.wv.save("plongements_avis.kv")
print(modele.wv.most_similar("chambre", topn=5))
# [('pièce', 0.78), ('salle', 0.72), ('suite', 0.69), ('chambrette', 0.66), ('room', 0.61)]
GloVe : une autre porte d'entrée par la matrice de cooccurrence
Word2Vec apprend en parcourant le corpus phrase par phrase. GloVe (Global Vectors, Stanford 2014) prend le problème par l'autre bout : il construit d'abord la matrice de cooccurrence , où compte le nombre de fois que le mot apparaît dans une fenêtre autour du mot , puis factorise cette matrice.
L'objectif s'écrit :
Le produit scalaire des vecteurs doit se rapprocher du logarithme du compte de cooccurrence. La fonction atténue les paires trop rares (pour éviter que le bruit domine) et trop fréquentes (pour éviter que « le, la » écrasent tout).
En pratique, Word2Vec et GloVe donnent des résultats très proches sur des corpus de taille moyenne. GloVe s'entraîne un peu plus vite mais demande de tenir la matrice de cooccurrence en mémoire ; Word2Vec la parcourt en flux et passe mieux à l'échelle.
Analogies vectorielles : la magie et sa vérité
L'exemple canonique de 2013 : le vecteur « roi » moins « homme » plus « femme » est très proche du vecteur « reine ». Les plongements ont appris, sans supervision, la dimension du genre. On en tire des analogies :
resultat = modele.wv.most_similar(
positive=["reine", "homme"],
negative=["femme"],
topn=3,
)
# [('roi', 0.68), ('empereur', 0.61), ('monarque', 0.59)]
C'est spectaculaire, et cela mérite deux nuances importantes.
D'abord, l'analogie n'est exacte que sur un vocabulaire restreint et courant. Sortir du domaine, et le vecteur cible n'existe pas. Ensuite, le test standard des analogies filtre les mots d'entrée : « roi », « homme » et « femme » sont explicitement exclus des candidats de sortie. Sans ce filtre, la réponse serait souvent « roi » lui-même, car les vecteurs très proches attirent naturellement.
Le biais que le plongement hérite du corpus
Ce point est le plus important du module. Un plongement encode les régularités du corpus, y compris les régularités indésirables.
L'article de 2016 de Bolukbasi et coll., Man is to Computer Programmer as Woman is to Homemaker, a montré que sur des plongements Word2Vec appris sur Google News, l'analogie « homme est à programmeur ce que femme est à … » donnait « femme au foyer ». Sur nos avis clients français, on retrouve les mêmes régularités du vocabulaire hôtelier : « réceptionniste » incliné vers le féminin, « directeur » vers le masculin.
def biais(mot, cote_a, cote_b):
v = modele.wv[mot] / np.linalg.norm(modele.wv[mot])
a = modele.wv[cote_a] / np.linalg.norm(modele.wv[cote_a])
b = modele.wv[cote_b] / np.linalg.norm(modele.wv[cote_b])
return v @ a - v @ b
print(biais("réceptionniste", "femme", "homme")) # > 0 : penché féminin
print(biais("directeur", "femme", "homme")) # < 0 : penché masculin
Les biais du corpus deviennent les biais du modèle en aval. Un système de recommandation d'offres d'emploi entraîné sur ces vecteurs proposera moins de postes de direction aux profils lus comme féminins, sans qu'aucune ligne de code ne le dise explicitement. Auditer les plongements avant de les mettre en production est une exigence, pas une option.
Les méthodes de « débiaisage » (projection sur le complémentaire d'une direction de biais) réduisent le symptôme mais l'article de Gonen et Goldberg (2019) a montré que les vecteurs regroupent toujours les mots par genre après traitement : le biais est enfoui, pas supprimé. La seule solution robuste passe par le corpus d'entraînement lui-même.
Ce que le plongement fixe ne résout toujours pas
Chaque mot a un seul vecteur. « Avocat » a le même plongement dans « salade d'avocat » et dans « rendez-vous chez l'avocat ». La polysémie n'est pas gérée, l'ordre des mots non plus. Le module suivant présente les plongements contextuels, où chaque occurrence du mot a son propre vecteur, calculé à partir de la phrase entière.
En résumé
- Word2Vec apprend un vecteur par mot en prédisant les voisins (skip-gram) ou le mot central (CBOW), avec échantillonnage négatif qui remplace un softmax coûteux par une régression binaire.
- GloVe factorise la matrice de cooccurrence ; en pratique, les deux méthodes donnent des résultats comparables sur un corpus de taille moyenne.
- Les analogies vectorielles rendent visible la géométrie du sens, mais elles filtrent les mots d'entrée et n'ont de sens que sur un vocabulaire courant.
- Un plongement encode les biais du corpus : les auditer avant mise en production est une exigence de méthode, et le débiaisage géométrique ne les supprime pas vraiment.
Module suivant : les plongements contextuels, où le vecteur d'un mot dépend de la phrase, et où la recherche sémantique devient enfin fiable.