Chapitre 4

Le langage comme problème mathématique

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 :

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 :

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 :

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.