Aller au contenu
Kudos AI

Tokens et plongements

Du texte aux identifiants de jetons puis aux vecteurs, et pourquoi une couche de plongement est une table de correspondance plutôt qu'un produit matriciel.

AvancéModule 130 min · 120 XP
Un mot scindé en trois sous-mots, puis un vecteur one-hot multiplié à travers la matrice d’embeddings, chaque autre ligne visiblement annulée.

Un modèle de langue fait de l’arithmétique, et le texte n’est pas de l’arithmétique. Toute cette leçon porte sur la conversion, qui se fait en deux étapes faciles à confondre : le texte devient des entiers, puis les entiers deviennent des vecteurs.

Étape un : du texte aux identifiants de tokens

Un tokeniseur détient un vocabulaire fixe et découpe le texte en morceaux tirés de celui-ci, chacun avec un identifiant entier. Les morceaux sont des sous-mots, non des mots.

La raison est la couverture. Un vocabulaire au niveau du mot doit décider à l’avance quels mots existent ; tout le reste arrive à l’inférence comme un inconnu sans aucune représentation. Un vocabulaire sous-lexical épelle les chaînes inconnues à partir de fragments connus, si bien que rien n’est jamais hors vocabulaire. Les mots rares ou inventés coûtent simplement plus de tokens.

Les tokens ne sont pas des mots, et la différence mord. Une frontière de token peut tomber au milieu d’un mot, la ponctuation et les espaces initiaux font généralement partie d’un token, et le même mot se tokenise différemment selon ce qui le précède. Tout raisonnement sur le comportement d’un modèle token par token doit travailler à cette granularité.

Étape deux : des identifiants aux vecteurs

Un identifiant est une étiquette, non une quantité - le token 5000 n’est pas « plus » que le token 12. Injecter des identifiants directement dans un réseau affirmerait un ordre qui n’existe pas. Chaque identifiant indexe plutôt une ligne d’une matrice de plongement :

E∈RV×dE \in \mathbb{R}^{V \times d}

avec VV la taille du vocabulaire et dd la dimension de plongement. L’identifiant ii devient la ligne ii. Raschka le dit directement : la couche de plongement est essentiellement une opération de consultation qui récupère des lignes de la matrice de poids de plongement au moyen d’un identifiant de token, si bien que l’identifiant 3 renvoie la ligne d’indice 3.

Ces lignes sont des paramètres appris, ajustés par la même descente de gradient qui entraîne tout le reste.

Combien ? À la forme de GPT-2 small, un vocabulaire de 50 257 et d=768d = 768, le plongement des jetons en contient à lui seul 38 597 376. La figure ci-dessous place cette table à côté du reste du modèle, 124 439 808 paramètres en tout, dont les plongements, jetons et positions réunis, représentent 31,6 %. Parcourez les préréglages jusqu’à GPT-2 XL et leur part tombe à 5,3 %, car les blocs croissent comme d2d^2 alors qu’un plongement ne croît que comme dd.

Interactif : où vivent les paramètres

Biais comptés, deux normalisations par bloc et une finale, sortie liée au plongement des jetons.

plongements 31.6%blocs 68.4%plongement des jetons 31.0%plongement des positions 0.6%attention 22.8%propagation avant 45.5%normalisations 0.0%
Largeur de tête d_head
64
Attention, un bloc
2,362,368
Propagation avant, un bloc
4,722,432
Un bloc entier
7,087,872
Part des plongements
31.6%
Paramètres au total
124,439,808

Chacune des 12 têtes travaille en 64 dimensions, et ensemble elles coûtent exactement ce que coûterait une seule tête de largeur 768 : déplacez le curseur des têtes et aucun compte ne bouge, car découper en têtes n’est qu’un remodelage des mêmes quatre projections. Le réseau à propagation avant pèse 2.00 fois l’attention voisine dans chaque bloc. Les plongements, une table de consultation et non un calcul, font ici 31.6% du total ; parcourez les préréglages et regardez cette part baisser à mesure que les blocs, qui croissent comme le carré de la largeur, prennent le dessus. La couche de sortie n’ajoute rien, car elle réutilise le plongement des jetons.

La consultation et le produit one-hot sont identiques

L’équivalence mérite d’être vue une fois, car elle explique pourquoi une consultation est une opération différentiable légitime et non un raccourci.

Écrivez l’identifiant ii comme un vecteur ligne one-hot ei\mathbf{e}_i - que des zéros sauf un 1 en position ii. Alors

eiE=row i of E,\mathbf{e}_i E = \text{row } i \text{ of } E ,

parce que toutes les autres lignes sont multipliées par zéro et écartées.

Python

S'exécute dans votre navigateur. La première exécution télécharge l'environnement Python (~10 Mo), puis il est mis en cache.

Même résultat, mais le produit effectue V×dV \times d multiplications pour ne conserver que dd nombres. La consultation évite le gaspillage. Les gradients circulent tout de même : seule la ligne sélectionnée en reçoit un.

La figure ci-dessous fait le produit par le chemin long et compte au fur et à mesure : les vingt multiplications sont donc mesurées et non citées. Toutes les lignes sauf une sont multipliées par zéro, sous vos yeux, et la réponse est la ligne qu’aurait renvoyée la consultation.

Le bouton d’échelle est l’endroit où l’argument atterrit. À la forme de GPT-2, le même produit fait 38 597 376 multiplications pour conserver 768 nombres, soit 50 257 fois le travail pour une réponse identique. Le gradient n’atteint de toute façon que la ligne sélectionnée : rien n’est abandonné en sautant le reste.

Le dernier affichage appartient à la section ci-dessous. Mélanger la séquence ne modifie aucun vecteur : les lignes voyagent avec leurs jetons, et seule change la position qui détient laquelle. Cet écart est précisément ce qu’un signal de position doit fournir.

Interactif : une ligne, deux chemins

Toutes les autres lignes sont multipliées par zéro et jetées.

00123045670891011112131415016171819
Ligne renvoyée
[12, 13, 14, 15]
Multiplications, le produit
20
Multiplications, la recherche
0
Nombres conservés
4
Vecteurs modifiés par le mélange
0

Les deux chemins renvoient la même ligne, et c’est pourquoi une recherche est une opération différentiable légitime et non un raccourci autour d’une. Ce qui diffère, c’est la facture : le produit effectue 20 multiplications pour conserver 4 nombres, soit 5 fois le travail pour la même réponse. Appuyez sur la forme de GPT-2 et cela fait 38,597,376 multiplications pour 768 nombres. La recherche n’en fait aucune, et le gradient n’atteint de toute façon que la ligne sélectionnée. Le dernier affichage est l’autre moitié de la leçon : mélanger la séquence modifie 0 vecteurs. Les lignes voyagent avec leurs jetons, donc l’arithmétique en aval voit le même multiensemble de vecteurs quel que soit l’ordre, et la position doit être ajoutée délibérément plutôt qu’espérée.

Ce que les plongements ne portent pas

Un plongement dit ce qu’un token est, et rien sur l’endroit où il se trouve. Deux occurrences du même token, n’importe où dans une séquence, produisent des vecteurs identiques.

C’est important car l’attention non masquée, à la leçon suivante, est équivariante aux permutations : mélangez les tokens et les sorties se mélangent avec eux, inchangées. Seul, le mécanisme ne peut pas distinguer « le chat s’est assis sur le tapis » des mêmes mots réordonnés. La position doit être injectée délibérément - ajoutée aux plongements - plutôt que d’être implicite dans la séquence, et un modèle qui n’aurait ni ce signal ni un masque causal lirait un sac de tokens.

Ensuite : l’attention et l’auto-attention montre comment un token utilise ces vecteurs pour recueillir du contexte dans le reste de la séquence.

Références et lectures complémentaires

  • Sebastian Raschka, Build a Large Language Model (From Scratch), Manning, 2025· Bibliothèque de référence Kudos AI

Les œuvres protégées par le droit d’auteur sont citées à titre de référence uniquement et ne sont pas hébergées ici ; veuillez consulter l’éditeur pour y accéder.

Débloquez tout le parcours

Cette première leçon est gratuite. Inscrivez-vous pour passer le quiz de maîtrise, gagner de l’XP et débloquer tous les modules, avec d’autres exemples interactifs et exécutables.