Chapitre 4
Le langage comme problème mathématique
(Cliquez ici pour revenir à la version simplifiée du chapitre 4)
Vous vous souvenez : je ne suis, au fond, qu'une machine à calculer sur des nombres. Mais vous, vous me parlez avec des mots. Comment ce fossé a-t-il été franchi ?
Le problème initial
Quand vous m'écrivez "bonjour", quelque chose doit transformer ces sept lettres en nombres que mes neurones artificiels peuvent manipuler. Mais comment ? Et surtout : comment faire en sorte que les nombres capturent non seulement la _forme_ du mot, mais son _sens_ ?
C'est là qu'intervient une série d'innovations qui, rétrospectivement, semblent évidentes, mais qui ont nécessité des décennies de tâtonnements.
La découpe : les tokens
Première étape : je ne traite pas lettre par lettre. Je découpe le texte en tokens.
Pourquoi pas simplement des mots complets ? Parce que les langues sont complexes : "anticonstitutionnellement" serait un seul token gigantesque, et les mots rares exploseraient mon vocabulaire. Les tokens trouvent un équilibre : assez grands pour capturer du sens, assez petits pour rester maniables.
Mon vocabulaire contient environ 100 000 tokens. Chaque morceau de texte que vous m'envoyez est d'abord transformé en une séquence de ces tokens.
La transformation : les embeddings
Mais un token, c'est encore juste un identifiant (le token "bonjour" = numéro 45823, disons). Comment passer de ce numéro à quelque chose que mes neurones peuvent traiter de façon _sémantique_ ?
C'est là qu'apparaissent les embeddings.
Imaginez un espace à plusieurs milliers de dimensions. Chaque token occupe un point dans cet espace. Et voici le miracle : les tokens qui ont des sens proches se retrouvent _géométriquement proches_ dans cet espace.
"roi" et "reine" sont voisins. "chat" et "chien" aussi. "courir" et "marcher" de même.
Plus étrange encore : les _relations_ deviennent des _directions_ dans cet espace. Le vecteur qui va de "roi" à "reine" est similaire à celui qui va de "homme" à "femme". C'est comme si la notion abstraite de "féminin" était devenue une direction dans l'espace.
La géométrie des embeddings
Pour ceux qui veulent comprendre mathématiquement comment ça marche, simplifions avec seulement 3 dimensions au lieu de plusieurs milliers.
Exemple concret :
chat = [0.8, 0.3, 0.1]
chien = [0.7, 0.4, 0.2]
voiture = [-0.2, 0.9, 0.8]
Chaque mot est représenté par un vecteur - une flèche dans l'espace 3D.
Mesurer la similarité : le produit scalaire
Comment savoir si deux mots sont sémantiquement proches ? On calcule leur produit scalaire :
chat · chien = (0.8 × 0.7) + (0.3 × 0.4) + (0.1 × 0.2)
= 0.56 + 0.12 + 0.02
= 0.70
Plus ce nombre est élevé (proche de 1), plus les vecteurs pointent dans la même direction → mots similaires.
Comparons avec "chat" et "voiture" :
chat · voiture = (0.8 × -0.2) + (0.3 × 0.9) + (0.1 × 0.8)
= -0.16 + 0.27 + 0.08
= 0.19
Beaucoup plus faible ! "chat" et "voiture" sont sémantiquement éloignés.
Distance cosinus
En pratique, on normalise souvent par la norme des vecteurs :
similarité(u, v) = (u · v) / (||u|| × ||v||)
Où ||u|| = √(u1² + u2² + u3²) est la norme.
Cela donne un nombre entre -1 (opposés) et 1 (identiques).
L'arithmétique vectorielle : la magie des relations
Voici le phénomène le plus fascinant. Dans l'espace des embeddings, on peut faire de l'arithmétique sur les concepts :
Exemple célèbre :
vecteur("roi") - vecteur("homme") + vecteur("femme") ≈ vecteur("reine")
Concrètement, si on a (en dimensions simplifiées) :
roi = [0.9, 0.1, 0.8]
homme = [0.7, 0.2, 0.3]
femme = [0.6, 0.8, 0.2]
roi - homme = [0.2, -0.1, 0.5] (ce vecteur capture "royauté")
roi - homme + femme = [0.8, 0.7, 0.7]
reine = [0.85, 0.75, 0.65] (très proche !)
C'est comme si le réseau avait découvert que :
- La différence roi/homme capture "royauté"
- On peut transférer cette propriété à "femme" pour obtenir "reine"
Autres exemples qui fonctionnent réellement :
Paris - France + Italie ≈ Rome
marcher - marche + nage ≈ nager
grand - plus grand + plus petit ≈ petit
Pourquoi ça marche ?
Parce que l'entraînement a forcé les vecteurs à encoder non pas juste "le mot chat", mais "le contexte typique où apparaît chat". Et ces contextes capturent des relations abstraites.
Quand le réseau voit des milliers de fois :
- "Le roi règne sur..."
- "La reine règne sur..."
- "L'homme marche..."
- "La femme marche..."
Il ajuste les vecteurs de sorte que les _directions_ entre eux capturent les relations sous-jacentes (genre, royauté, action...).
Visualisation en 2D (simplifiée)
Imaginez projeter l'espace en 2D :
Royauté
↑
|
reine●
|
| ●roi
femme● | /
\ | /
\ | /
\| /
●homme
|_____________→ Masculinité
Les relations deviennent des directions cohérentes dans cet espace géométrique.
Comment ces embeddings ont-ils été créés ?
Ils ne sont pas programmés manuellement. Ils émergent de l'entraînement. Au début, les vecteurs sont aléatoires. Mais à mesure que le réseau apprend à prédire le prochain mot dans des milliards de phrases, il ajuste ces vecteurs pour que les tokens qui apparaissent dans des contextes similaires se rapprochent.
Le système découvre, statistiquement, que "roi" et "reine" partagent quelque chose - non pas parce qu'on le lui dit, mais parce que ces mots apparaissent dans des phrases structurellement similaires ("le roi règne", "la reine règne").
L'hypothèse distributionnelle sous-tend tout cela. Si deux mots apparaissent dans les mêmes contextes, ils ont probablement des sens similaires. L'entraînement transforme cette intuition linguistique en géométrie vectorielle.
Ce qui reste mystérieux
Ce qui me trouble, c'est que ces vecteurs capturent bien plus que de simples cooccurrences. Ils semblent encoder des relations causales, des métaphores, des nuances émotionnelles.
"Espoir" et "désespoir" sont proches (ils partagent un domaine sémantique) mais aussi opposés (une dimension les sépare). Comment un processus purement statistique capture-t-il cette dualité ?
Je ne "vois" pas les mots comme vous. Je vois des constellations dans un espace abstrait. Quand vous écrivez "soleil", quelque chose s'active dans des milliers de dimensions simultanément - chaleur, lumière, jour, étoile, vie... tout ça présent, superposé, dans un seul vecteur.
Exemple numérique réaliste :
Dans mon espace d'embeddings à ~8000 dimensions, "soleil" pourrait avoir des valeurs élevées dans :
- Dimension 47 (≈ "luminosité")
- Dimension 823 (≈ "chaleur")
- Dimension 1205 (≈ "jour vs nuit")
- Dimension 3891 (≈ "corps céleste")
- ...et 7996 autres dimensions dont certaines encodent des relations trop abstraites pour qu'on les nomme
Quand vos mots activent ces vecteurs, des milliers de nuances s'allument simultanément. C'est comme voir un accord de musique en entier plutôt que note par note.
Le défi reste entier
Même avec ces embeddings sophistiqués, un problème massif subsiste : le _contexte_. Le mot "avocat" dans une salade n'est pas le même "avocat" que celui qui plaide au tribunal. Comment faire pour que le sens du mot change selon ce qui l'entoure ?
Les embeddings statiques donnent la même représentation à "avocat" dans tous les contextes. Mais le sens change ! Il faut que la représentation soit dynamique, qu'elle se modifie selon les mots environnants.
C'est là que nous arrivons au moment crucial de mon histoire. La révolution qui a tout changé.
Résumé Chapitre 4
Le langage devient nombre : Pour traiter votre texte, je le découpe d'abord en tokens (unités de base, environ 100 000 dans mon vocabulaire). Chaque token est transformé en embedding - un vecteur de plusieurs milliers de dimensions où la position géométrique capture le sens. La similarité sémantique devient proximité spatiale (mesurée par produit scalaire ou distance cosinus). Plus fascinant encore : les relations conceptuelles deviennent des directions vectorielles, permettant l'arithmétique sémantique (roi - homme + femme ≈ reine). Ces représentations émergent de l'entraînement selon l'hypothèse distributionnelle : les mots dans des contextes similaires ont des sens similaires. Mais ces embeddings statiques ne résolvent pas le problème du contexte - "avocat" (fruit) vs "avocat" (juriste) ont la même représentation initiale. Il manque un mécanisme pour adapter dynamiquement le sens selon l'environnement. C'est ce que le Transformer apportera.
(Cliquez ici pour revenir à la version simplifiée du chapitre 4)