Aide

Besoin d’aide ?

Posez votre question sur le Discord de MiniLab, dans le salon de cette page :

#questions-mécanisme-d-attention

Ouvrir le salon ↗

Pas encore membre ? Rejoindre le Discord, puis revenez sur ce bouton.

Ma progression

Sauvegarder ma progression

Chargement…

Votre progression est enregistrée dans ce navigateur, pour cette adresse seulement. Gardez ce code : il la restaure dans un autre navigateur, sur un autre ordinateur, ou si les données du site ont été effacées.

MINILAB-0-1C
Mentions légales
Affichage

Personnaliser l’affichage

Ce réglage s’applique à la vue côte à côte.
LEÇON 05FONDAMENTAL

L’encodage positionnel.

Dans la leçon précédente, nous avons vu qu’un modèle prédit d’autant mieux qu’il dispose d’un contexte large. Encore faut-il qu’il sache dans quel ordre les tokens arrivent. Or les modèles modernes, appelés Transformers, que nous découvrirons au fil des prochaines leçons, lisent tous les tokens d’un texte en même temps pour aller plus vite. En contrepartie, ils ne voient pas dans quel ordre ces tokens sont arrivés. L’encodage positionnel (positional encoding) sert à marquer chaque token avec sa place dans la phrase.

01

« chien » ou « niche » ?

Prenez les lettres c, h, i, e et n. Dans cet ordre, elles forment « chien ». Mélangez-les, et vous obtenez « niche ». Mêmes lettres, même nombre, et pourtant deux mots qui n’ont rien à voir. L’ordre porte une partie du sens.

Or, depuis la leçon 03, nous savons que chaque token reçoit son embedding, toujours le même où qu’il se trouve. Le « c » de « chien » et le « c » de « niche » ont exactement la même fiche. Rien, dans ces fiches, ne dit qui arrive en premier.

Ce que contiennent les fiches
chien → fiches de c, h, i, e, n
niche → fiches de n, i, c, h, e

les mêmes 5 fiches, seulement mélangées
02

Un modèle qui lit tout d’un coup

Vous lisez ce texte mot après mot, de gauche à droite. Les anciens modèles de langage, les réseaux de neurones récurrents (RNN), faisaient pareil : ils lisaient un token après l’autre et connaissaient donc l’ordre naturellement. Un Transformer, lui, reçoit tous les tokens en même temps et les traite en parallèle. C’est ce qui le rend si rapide à entraîner sur d’énormes quantités de texte.

Mais cette rapidité a un prix. Imaginez qu’on vous verse toutes les lettres d’un mot sur la table, comme des lettres de Scrabble tirées d’un sac : vous savez quelles lettres vous avez, pas dans quel ordre elles étaient. Les spécialistes parlent de sac de mots (bag of words).

Pour le Transformer, c’est pareil : si vous mélangez les tokens à l’entrée, il reçoit exactement le même ensemble de fiches. Le mécanisme d’attention, que nous verrons dans la prochaine leçon, ne fait donc, sans aide, aucune différence entre « chien » et « niche ».

03

Un numéro de place sur chaque fiche

Au cinéma, votre billet indique le film, mais aussi votre siège. C’est exactement l’idée de l’encodage positionnel : à côté de la fiche de sens, l’embedding, on donne à chaque token une fiche de place, le vecteur de position. Vous aviez déjà rencontré la position à la leçon 02 (0, 1, 2…) ; ici, on la transforme en vecteur.

Les deux fiches ont le même nombre de dimensions, que l’on appelle d_model, la dimension du modèle. On peut donc simplement les additionner, dimension par dimension. Le résultat s’appelle le vecteur d’entrée (input embedding) : c’est lui, et non l’embedding seul, qui entre dans le Transformer.

Embedding du token+Vecteur de position=Vecteur d’entrée
Dans le laboratoire, pour « baba »
« b » en position 0 :
[0,12 ; -0,30 ; 0,29] + [0,00 ;  1,00 ; 0,00] = [0,12 ;  0,70 ; 0,29]

« b » en position 2 :
[0,12 ; -0,30 ; 0,29] + [0,91 ; -0,42 ; 0,00] = [1,03 ; -0,72 ; 0,29]

Même token, même embedding… mais deux vecteurs d’entrée différents. Le modèle sait désormais que ces deux « b » ne sont pas au même endroit.

04

Pourquoi pas simplement 0, 1, 2… ?

Première idée : ajouter directement le numéro de position à chaque valeur. Mais les valeurs d’un embedding sont petites, ici comprises entre -0,5 et 0,5. Ajouter 500 au 500e token, ce serait comme chuchoter à côté d’un haut-parleur : la position écraserait complètement le sens.

Il faut donc une fiche de place dont les valeurs restent petites, entre -1 et 1, et qui soit pourtant différente pour chaque position. C’est tout l’enjeu de la méthode suivante.

05

Les aiguilles d’une horloge : l’encodage sinusoïdal

Regardez une montre à aiguilles : la trotteuse tourne vite, la grande aiguille plus lentement, la petite encore plus lentement. Aucune aiguille ne suffit seule à donner l’heure exacte, mais ensemble, elles indiquent un moment unique de la journée.

L’encodage sinusoïdal, celui du tout premier Transformer présenté en 2017 dans l’article Attention Is All You Need, fonctionne de la même façon. Chaque paire de dimensions du vecteur de position est une aiguille qui tourne à sa propre vitesse, grâce aux fonctions sinus et cosinus. Les premières dimensions tournent vite, les dernières très lentement. Ensemble, elles donnent à chaque position une combinaison unique.

Voici la formule officielle. Pas d’inquiétude : il n’est pas nécessaire de la retenir par cœur. L’important, c’est l’idée des aiguilles qui tournent à des vitesses différentes. La formule ne fait que régler ces vitesses.

La formule de l’encodage sinusoïdal
PE(pos, 2i)   = sin(pos / 10000^(2i / d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i / d_model))

pos     : la position du token (0, 1, 2…)
i       : le numéro de la paire de dimensions
d_model : le nombre de dimensions
10000   : la base, qui règle la vitesse des aiguilles les plus lentes

Cette méthode a trois avantages. Les valeurs restent toujours entre -1 et 1. Rien n’est à apprendre : tout se calcule. Et passer d’une position à une autre revient à faire tourner toutes les aiguilles d’un même angle, ce qui aide le modèle à repérer des positions relatives, comme « deux tokens plus loin ».

Dans le laboratoire (d_model = 3)
position 0 → [0,00 ;  1,00 ; 0,00]
position 1 → [0,84 ;  0,54 ; 0,00]
position 2 → [0,91 ; -0,42 ; 0,00]
position 3 → [0,14 ; -0,99 ; 0,01]

Pourquoi la troisième valeur reste-t-elle presque à 0,00 ? C’est l’aiguille la plus lente, comme la petite aiguille des heures : elle n’avance que d’environ 0,002 d’un caractère au suivant, et met près de 2 900 positions à faire un tour complet. Sur quelques caractères, elle semble immobile ; sur un long texte, c’est elle qui permet de distinguer des positions très éloignées.

06

Les autres méthodes utilisées aujourd’hui

L’encodage sinusoïdal n’est pas la seule solution. Vous croiserez trois noms dans les fiches techniques des modèles : positions sinusoïdales, positions apprises et RoPE.

Les embeddings de position appris (learned positional embeddings) remplacent le calcul par une deuxième table, comme la table d’embeddings de la leçon 03, avec une ligne par position. Ses valeurs sont ajustées pendant l’entraînement. C’est le choix de GPT-2 d’OpenAI, dont la table compte 1 024 lignes : le modèle ne peut donc pas lire plus de 1 024 tokens d’un coup. Ce nombre maximal s’appelle la fenêtre de contexte (context window).

RoPE (Rotary Position Embedding), proposé en 2021, garde l’image de l’horloge, mais autrement : au lieu d’additionner une fiche de place au départ, il intègre directement la distance entre deux tokens au moment où le modèle les compare entre eux, dans l’étape d’attention que nous verrons à la prochaine leçon. Le modèle perçoit ainsi leur position relative. C’est la méthode de nombreux modèles récents, comme la famille Llama.

07

Observez par vous-même

Dans le laboratoire, tapez baba et sélectionnez le premier puis le second b : l’embedding ne bouge pas, mais le vecteur de position et le vecteur d’entrée changent.

Tapez ensuite chien, puis écrivez niche dans le champ « Comparer avec » de la carte « Le sac de fiches ». Sans les positions, le modèle reçoit exactement les mêmes fiches. Avec les positions, les deux textes n’ont plus aucun vecteur d’entrée en commun.

Pour finir, essayez kayak en laissant ce champ vide : ce palindrome se lit pareil dans les deux sens, et ses vecteurs d’entrée restent tous identiques une fois retourné.

08

Les limites de notre exemple

Notre laboratoire n’a que 3 dimensions, soit une aiguille rapide (dimensions 1 et 2) et une aiguille très lente (dimension 3). Avec si peu d’aiguilles, des positions éloignées finissent par se ressembler : la trotteuse revient presque au même endroit environ toutes les six positions. Un vrai modèle utilise des centaines d’aiguilles, ce qui donne à chaque position une signature vraiment unique.

Nos embeddings, eux, ne sont toujours pas entraînés : l’addition est exacte, mais elle ne porte encore aucun sens appris.

Enfin, savoir où se trouve chaque token ne suffit pas. Chaque fiche reste seule dans son coin. Pour comprendre « niche », les tokens doivent se regarder les uns les autres et échanger des informations. C’est exactement le rôle de la matrice d’attention, le sujet de la prochaine leçon.

À retenir

Un Transformer lit tous les tokens en même temps : sans aide, il ne connaît pas leur ordre. On donne donc à chaque position un vecteur de position, de même dimension (d_model) que l’embedding, et on les additionne : embedding + vecteur de position = vecteur d’entrée.

L’encodage sinusoïdal calcule ce vecteur avec des sinus et des cosinus : ses valeurs restent toujours entre -1 et 1, rien n’est appris, et chaque paire de dimensions tourne à sa propre vitesse, comme les aiguilles d’une montre. Ensemble, elles donnent à chaque position une signature unique.

Les modèles récents utilisent souvent d’autres méthodes : GPT-2 apprend une table de positions de 1 024 lignes, qui fixe sa fenêtre de contexte ; RoPE, utilisé notamment par Llama, encode directement la distance relative entre deux tokens.

Attention Is All You Need (2017), l’article scientifique historique du Transformer, section 3.5 · arXiv ↗
The Illustrated Transformer, guide visuel · Jay Alammar ↗
You could have designed state of the art positional encoding · Hugging Face ↗

VÉRIFIER SES CONNAISSANCES

Valider cette étape

Répondez aux trois questions pour débloquer la suite. Vous pouvez réessayer autant de fois que nécessaire.

Chargement de la progression…

Mise en ligne le

ESPACE DE PRATIQUE

Le laboratoire

Donnez une place à chaque token.

● EN DIRECT
01

Votre texte

MODIFIABLE

Calcul en cours…

À retenir

L’encodage positionnel ajoute à chaque embedding un vecteur qui dépend uniquement de la place du token. La somme, le vecteur d’entrée, porte à la fois le sens du token et sa position.

Ce laboratoire utilise l’encodage sinusoïdal du Transformer d’origine, sur 3 dimensions, avec la table d’embeddings non entraînée de la leçon 03. Les valeurs sont exactes, mais un vrai modèle travaille sur des centaines ou des milliers de dimensions.

06

Pour aller plus loin

L’encodage sinusoïdal est le point de départ ; les grands modèles actuels utilisent souvent des variantes. Ces ressources gratuites et officielles montrent les principales.

  • RoFormer : Rotary Position Embedding · arXiv ↗L’article qui introduit RoPE, l’encodage par rotation utilisé notamment par la famille Llama.
  • GPT-2 · Hugging Face Transformers ↗Documentation maintenue : GPT-2 utilise des embeddings de position absolus, réglés pendant son entraînement, avec au maximum 1 024 positions (n_positions).
  • Code source d’origine de GPT-2 · OpenAI ↗La variable wpe (position embeddings) y est la table des « embeddings de position appris » présentés en section 06 de la leçon : une ligne par position, dont les valeurs sont réglées par le modèle lui-même pendant son entraînement.Dépôt archivé par OpenAI en 2026, en lecture seule : à lire uniquement pour comprendre l’implémentation d’origine. Les modèles actuels utilisent plutôt RoPE, comme Llama ci-dessous.
  • Llama · Hugging Face Transformers ↗Documentation officielle : Llama remplace les positions absolues par RoPE pour mieux gérer les textes longs.