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.
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 :
avec la taille du vocabulaire et la dimension de plongement. L’identifiant devient la ligne . 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 , 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 alors qu’un plongement ne croît que comme .
Interactif : où vivent les paramètres
Biais comptés, deux normalisations par bloc et une finale, sortie liée au plongement des jetons.
- 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 comme un vecteur ligne one-hot - que des zéros sauf un 1 en position . Alors
parce que toutes les autres lignes sont multipliées par zéro et écartées.
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 multiplications pour ne conserver que 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.
- 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.