Cursus
Imaginez lire un roman où chaque mot de la page a été mélangé dans un ordre aléatoire. Même si vous comprenez chaque mot, l’intrigue se perd totalement, car c’est l’ordre des mots qui porte le sens. Lorsque les ingénieurs ont commencé à conçevoir des grands modèles de langage (LLM), ils ont fait face à un obstacle similaire. Comment apprendre à un modèle à comprendre la séquence des mots alors que son mécanisme central traite tout en parallèle ?
C’est là que l’encodage positionnel entre en jeu. Dans cet article, nous allons explorer le fonctionnement interne de l’encodage positionnel et comment il confère aux transformers leur sens de l’ordre. Nous retracerons son évolution, des formules sinusoïdales d’origine aux embeddings rotationnels modernes, et verrons comment l’implémenter dans votre prochain projet de machine learning. Si vous découvrez l’architecture sous-jacente, nous vous recommandons de commencer par notre guide sur le fonctionnement des transformers.
Maîtriser l'apprentissage profond en Python
Qu’est-ce que l’encodage positionnel ?
L’encodage positionnel est une technique permettant aux réseaux de neurones de comprendre l’ordre séquentiel des données en entrée. Il agit comme un système de coordonnées représentant la position relative ou absolue d’un jeton, fusionnée avec sa représentation standard.
Avant d’être introduits dans un réseau de neurones, les mots sont convertis en représentations numériques continues appelées embeddings. Cependant, les embeddings standards ne capturent que le sens sémantique : ils n’indiquent rien sur la position d’un mot dans un texte donné. Vous pouvez apprendre précisément comment ce processus fonctionne dans notre cours Introduction to Embeddings with the OpenAI API.
Un encodage positionnel est une couche mathématique supplémentaire ajoutée directement à ces embeddings de jetons. En combinant la représentation sémantique avec un « tampon » positionnel, le modèle transformer peut distinguer des mots identiques apparaissant à des endroits différents d’une phrase.
Le problème d’invariance par permutation
Les données séquentielles reposent fortement sur l’ordre. En langage naturel, la phrase « the dog bit the man » n’a pas du tout le même sens que « the man bit the dog ».

Historiquement, les réseaux de neurones récurrents (RNN) et les réseaux à mémoire à long court terme (LSTM) géraient cela intrinsèquement. Ils traitaient les jetons de façon séquentielle : le réseau ingérait mathématiquement le deuxième mot seulement après avoir fini le premier. De même, les réseaux de neurones convolutionnels (CNN) traitent les données via des fenêtres glissantes locales qui capturent l’agencement spatial des pixels ou des mots voisins.
Les transformers abandonnent complètement le traitement séquentiel. Ils traitent tous les jetons en parallèle. Le moteur central d’un transformer est le mécanisme d’auto-attention, qui calcule en une seule fois des scores de relation par paires entre chaque jeton de la séquence. Mathématiquement, l’auto-attention est invariante par permutation. Si vous mélangez la séquence d’entrée, le mécanisme produira exactement les mêmes scores d’attention pour les paires de mots.
Sans mécanisme pour préserver l’ordre, le modèle perd toute information séquentielle. Le sens sémantique s’écroule en un sac de mots désordonné. L’encodage positionnel résout ce problème en modifiant de force les vecteurs d’entrée afin que le mécanisme d’attention enregistre différemment les jetons en position 1 et en position 10.
Comment fonctionne l’encodage positionnel ?
L’encodage positionnel modifie mathématiquement les vecteurs de jetons en entrée avant qu’ils n’atteignent les couches d’auto-attention. Cela garantit que le modèle calcule les relations à la fois sur le sens et sur la position.
Pour se faire une intuition, imaginez les embeddings de jetons classiques comme des badges nominétifs lors d’une conférence. Le badge vous dit qui est la personne, mais l’endroit où elle se trouve dans la conférence ne change ni son identité ni ses relations. L’encodage positionnel, c’est comme ajouter un numéro de siège sur ce badge. En les combinant, vous savez à la fois qui est la personne et où elle est assise. Cela contextualise les interactions potentielles.
Dans un transformer, cette combinaison se fait généralement par une addition élément par élément. Le modèle additionne le vecteur d’embedding sémantique d’un mot et un vecteur d’encodage positionnel de même dimension. Le vecteur résultant contient une modulation subtile que les couches suivantes apprennent à interpréter comme des coordonnées spatiales.
Exemple de calcul
Prenons un exemple simplifié. Imaginons un espace d’embedding minuscule de dimension 4. Nous voulons traiter le mot « DataCamp » situé en position 0 dans notre séquence.
- Embedding sémantique : le réseau récupère l’embedding de « DataCamp », par exemple [0.51, -0.22, 0.88, 0.14].
- Encodage positionnel : la formule positionnelle génère un vecteur de coordonnées pour la position 0. Supposons qu’elle calcule [0.00, 1.00, 0.00, 1.00].
- Combinaison : on additionne les deux vecteurs élément par élément.
- Entrée finale : la passe avant reçoit [0.51, 0.78, 0.88, 1.14].
Même si le même jeton « DataCamp » apparaît plus tard en position 5, le vecteur d’encodage positionnel sera différent. Par conséquent, le vecteur d’entrée final paraîtra totalement différent pour le mécanisme d’auto-attention.

Encodage positionnel sinusoïdal
L’article fondateur Attention Is All You Need a présenté une méthode ingénieuse pour générer des vecteurs positionnels à l’aide de trigonométrie de base. Cette approche ne requiert aucun poids appris et repose entièrement sur des fonctions mathématiques fixes.
Fondements mathématiques
L’encodage sinusoïdal utilise des fonctions sinus et cosinus à différentes fréquences pour coder l’information de position. La formule d’origine indique que pour une position donnée (pos) et un indice de dimension spécifique (i) dans le vecteur d’embedding, l’encodage se calcule comme suit :
-
Pour les dimensions paires (
2i) :PE(pos, 2i) = sin(pos / 10000^(2i/dmodel)) -
Pour les dimensions impaires (
2i+1) :PE(pos, 2i+1) = cos(pos / 10000^(2i/dmodel))
Dans cette formule, dmodel est la taille totale du vecteur d’embedding. Au fil des dimensions, de l’indice 0 jusqu’à dmodel, la longueur d’onde des fonctions sinusoïdales augmente géométriquement.
Avantages et propriétés
Cette progression géométrique des fréquences présente plusieurs avantages clairs.
- Les sorties sinus et cosinus sont strictement bornées entre -1 et 1. Cette borne empêche les encodages positionnels d’éclipser numériquement les embeddings sémantiques.
- Les fonctions sont périodiques. Grâce aux formules d’addition trigonométriques, une transformation linéaire peut facilement représenter l’encodage positionnel d’une position future (
pos + k) en fonction de la position actuelle (pos). Cette propriété permet naturellement au modèle d’apprendre des positions relatives. - L’encodage sinusoïdal utilise des paramètres fixes. Il ne nécessite aucun poids apprenable, réduisant fortement l’empreinte mémoire. Étant fondé sur une fonction mathématique continue, le modèle possède une capacité théorique d’extrapolation, c’est-à-dire de mapper des coordonnées positionnelles pour des séquences plus longues que celles vues à l’entraînement.
Visualisation
Pour mieux comprendre l’encodage sinusoïdal, une représentation en carte thermique peut aider.

L’axe des x représente la dimension de l’embedding, tandis que l’axe des y indique la position du jeton.
Les dimensions basses à gauche oscillent rapidement entre valeurs négatives et positives, ce qui leur permet de distinguer des positions proches. Au fur et à mesure que l’indice de dimension augmente, la longueur d’onde s’allonge et l’encodage varie plus progressivement. Ces dimensions capturent des différences positionnelles sur de plus grandes distances.
Pour les 50 positions illustrées ici, de nombreuses dimensions supérieures apparaissent comme des bandes verticales presque uniformes. Cela tient au fait que leurs longueurs d’onde sont si grandes que, sur cette courte séquence, les valeurs de sinus restent proches de 0 et celles de cosinus proches de 1 — pas 0 et 1 à strictement parler. Les bandes alternées reflètent donc des dimensions sinus–cosinus adjacentes, et non un codage binaire simple. Sur une séquence plus longue, ces dimensions varieraient elles aussi sensiblement.
La leçon à retenir : les différentes fréquences fournissent au modèle des informations positionnelles à plusieurs échelles : les dimensions à variation rapide capturent des différences fines entre jetons proches, tandis que les dimensions à variation lente suivent la position globale dans de longues séquences.
Encodage positionnel appris
Si les formules fixes sont élégantes, les architectures modernes d’apprentissage profond s’appuient souvent sur les données pour apprendre des représentations optimales. Les embeddings positionnels appris transfèrent entièrement la gestion de la disposition à la phase d’entraiînement.
Concept et implémentation
Plutôt que de coder en dur les valeurs positionnelles via sinus et cosinus, les embeddings positionnels appris traitent les coordonnées de position comme des paramètres apprenables.
Le modèle initialise une matrice d’embedding totalement vierge, chaque ligne correspondant à une position de séquence. Lors de la rétropropagation classique, le réseau met à jour ces poids positionnels aux côtés des embeddings sémantiques pour minimiser la fonction de perte globale.
Atouts comparatifs
Le principal avantage des embeddings positionnels appris est leur extrême flexibilité. Le modèle est libre d’apprendre exactement les représentations positionnelles les plus efficaces pour un jeu de données donné. Des architectures comme BERT et GPT-2 ont popularisé cette approche en raison de sa très grande adaptabilité et de ses fortes performances sur les tâches aval.
Limites et défis
La limite majeure des embeddings positionnels appris est la longueur maximale de séquence. Si un modèle est entraîné avec un maximum de 2 48 vecteurs de position appris, il ne peut tout simplement pas traiter un document de 2 49 jetons.
Cette contrainte limite fortement l’extrapolation en longueur et impose souvent un coûteux réentraiînement pour étendre la fenêtre de contexte.
Encodage positionnel relatif
Au fur et à mesure que les modèles ont été amenés à gérer des documents plus longs, les ingénieurs ont constaté que la position absolue d’un mot importe souvent moins que sa distance relative aux autres mots.
Virage conceptuel vers les positions relatives
Considérez l’expression « the rapid advancement of AI ». La relation grammaticale entre « advancement » et « AI » reste identique que la phrase apparaisse au tout début d’un document ou à sa toute fin. L’encodage relatif abandonne les coordonnées absolues et se concentre entièrement sur les décalages de distance entre jetons en interaction.
Implémentation dans les mécanismes d’attention
Pour implémenter les encodages relatifs, on modifie directement le calcul des scores d’attention plutôt que d’altérer les embeddings d’entrée au tout début du réseau.
Lors du calcul du score d’attention entre une matrice « query » et une matrice « key », l’opération inclut un terme de biais appris supplémentaire représentant la distance relative. Cette modification garantit l’invariance par décalage dans le texte. Pour approfondir le fonctionnement de ces matrices, consultez notre guide sur le mécanisme d’attention dans les LLM.
Compromis pratiques
Cette approche offre une compréhension contextuelle très précise, mais introduit une surcharge de calcul importante. Calculer des matrices de distances relatives uniques pour chaque tête d’attention augmente drastiquement la consommation mémoire et complique les mécanismes de cache internes utilisés pour accélérer la génération de texte.
Information positionnelle absolue vs relative
Le choix entre encodage absolu et relatif dépend de la tâche visée.
- L’encodage absolu excelle lorsque l’agencement spatial exact est rigide et que l’exécution rapide est prioritaire.
- L’encodage relatif est bien supérieur pour le traitement de textes longs, où la structure grammaticale dépend entièrement des distances locales plutôt que des coordonnées absolues dans le document.
Rotary Position Embedding (RoPE)
Dans la quête permanente d’améliorer les architectures transformer, les chercheurs ont introduit le Rotary Position Embedding (RoPE). Il combine les meilleurs atouts des encodages positionnels absolus et relatifs et s’est rapidement imposé comme un standard du secteur.
Approche innovante
RoPE unifie position absolue et distances relatives via des transformations rotationnelles. Plutôt que d’ajouter un vecteur aux embeddings ou des biais lourds aux scores d’attention, RoPE projette le vecteur d’embedding dans le plan complexe et le fait tourner d’un angle spécifique. La valeur de cet angle est strictement déterminée par la position absolue du jeton dans la séquence.

Regards mathématiques
En 2D, la rotation s’applique avec une matrice de rotation standard. En dimension supérieure, RoPE regroupe simplement les dimensions d’embedding par paires et applique des rotations 2D uniques à chaque bloc en fonction de l’indice de position absolue.
En raison des propriétés géométriques des matrices de rotation, le produit scalaire d’un vecteur « query » tourné et d’un vecteur « key » tourné ne dépend que de l’angle relatif entre eux. Ainsi, RoPE exploite un mappage de position absolue pour coder naturellement la distance relative entre jetons.
RoPE vs encodage sinusoïdal
Comme le montre le schéma ci-dessus, l’encodage sinusoïdal modifie la norme et la direction du vecteur d’origine. RoPE, lui, préserve l’information de norme et n’a besoin que de l’angle entre deux positions pour apprécier leur distance relative.
Attention with Linear Biases (ALiBi)
Alors que RoPE s’appuie sur une géométrie rotationnelle, une autre technique appelée Attention with Linear Biases (ALiBi) adopte une approche radicalement différente.
Simplicité et efficacité
ALiBi abandonne complètement l’idée d’ajouter des informations positionnelles aux embeddings initiaux. Les embeddings de mots pénètrent le transformer tels quels.
ALiBi intervient à la toute fin du calcul d’attention. Juste avant que les logits d’attention ne passent par la fonction softmax, ALiBi soustrait une pénalité statique proportionnelle à la distance entre deux jetons. Plus deux mots sont éloignés, plus la pénalité retranchée de leur score d’attention est grande.
Performances
Cette méthode est très simple à implémenter et très efficace. Son plus grand bénéfice : une excellente capacité d’extrapolation en longueur. Un modèle entraîné avec ALiBi sur des séquences de 1 24 jetons peut générer sans peine un texte cohérent sur des séquences deux fois plus longues sans planter.
Pour les praticiens souhaitant explorer d’autres techniques avancées pour une génération et une inférence rapides, consultez notre guide sur le speculative decoding.
Quand utiliser quel encodage positionnel
Partez de votre cas d’usage, puis choisissez la méthode adéquate — parfois une, parfois plusieurs.
- Vous cherchez une base simple sans paramètres : sinusoïdal (formules fixes, rien à entraîner).
- Votre longueur de séquence est fixe et vous visez la performance maximale sur un jeu de données spécifique : appris.
- Vous devez gérer des séquences plus longues que celles vues à l’entraiînement : RoPE est le meilleur choix parmi les techniques extrapolables.
- La grammaire dépend de la distance entre jetons, pas de leur position absolue : relatif ou RoPE.
- Vous construisez un LLM généraliste moderne : RoPE.
- L’extrapolation en longueur est votre priorité absolue et vous voulez l’implémentation la plus simple : ALiBi.
- Vous voulez les bénéfices des positions relatives sans la charge mémoire et de cache : RoPE (les encodages relatifs offrent l’avantage mais coûtent plus cher).
Mise en pratique et choix d’architecture
Passer de la théorie à la pratique suppose de comprendre comment intégrer les encodages positionnels dans du code réel et de gérer les limites architecturales.
Implémenter l’encodage positionnel dans des transformers
Pour ajouter des encodages positionnels à un transformer dans des frameworks comme PyTorch, on crée généralement un module dédié. Ce module génère une fois la matrice d’encodage et l’enregistre comme buffer afin qu’elle ne soit pas mise à jour par erreur pendant la rétropropagation.
Ci-dessous, une implémentation pratique standard d’une passe avant intégrant des encodages sinusoïdaux. Les encodages sont calculés une fois à partir des formules sinus/cosinus et ne changent jamais durant l’apprentissage, raison pour laquelle ils sont stockés dans un buffer plutôt qu’en paramètres apprenables (et n’ajoutent donc aucun coût d’entraiînement).
import torch
import torch.nn as nn
import math
class PositionalEncoding(nn.Module):
def __init__(self, d_model: int, max_len: int = 5000):
super().__init__()
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
# Calculate the division term for frequencies
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
# Apply sine to even indices and cosine to odd indices
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0)
# Register as a buffer
self.register_buffer('pe', pe)
def forward(self, x: torch.Tensor) -> torch.Tensor:
# Add positional encoding directly to the input embeddings
seq_len = x.size(1)
x = x + self.pe[:, :seq_len, :]
return x
Dans __init__, le module précalcule la table d’encodage jusqu’à max_len positions : position est une colonne d’indices (0, 1, 2, …) et div_term correspond aux fréquences, équivalant à 1 / 10000^(2i/d_model), de sorte que les dimensions basses ont des ondes rapides et les hautes des ondes lentes.
Appliquer sin aux dimensions paires (0::2) et cos aux impaires (1::2) remplit la table. Ensuite, forward effectue l’unique travail à l’exécution : il découpe la table à la longueur de séquence d’entrée et l’ajoute élément par élément aux embeddings. Notez que le module suppose un format batch-first [batch, seq_len, d_model], d’où la coupe sur la dimension 1.
Biais de position et phénomène « lost-in-the-middle »
Un effet secondaire inattendu des très longues séquences est le biais de position, qui se manifeste fréquemment par le phénomène « lost-in-the-middle ». Sur de grands documents, les modèles de langage retiennent bien mieux les faits du tout début et de la toute fin du prompt que ceux situés au milieu. Cela vous paraîtra familier : la mémoire humaine fonctionne souvent ainsi (au moins pour moi ; ne me dites pas que je suis le seul à mieux me souvenir des débuts et fins de livres que du reste !).
La théorie veut que cela survienne parce que le mécanisme d’attention est submergé par du contexte non pertinent et s’ancre naturellement sur les premiers jetons (qui posent l’instruction) et les derniers (les plus récents en mémoire). Pour atténuer ce biais, les développeurs recourent à des stratégies de segmentation avancées et à des systèmes de recherche sémantique.
Encodage positionnel pour des domaines spécialisés
Les transformers ne se limitent plus au texte. Le concept d’encodage positionnel s’adapte rapidement à différents types de données et domaines.
Pour les vision transformers, les images sont découpées en grilles de patches. Un encodage séquentiel 1D ne capture pas la proximité spatiale en 2D. Les modèles de vision utilisent donc fréquemment des encodages positionnels appris 2D qui tiennent compte des coordonnées X et Y du patch d’image.
Des adaptations similaires existent pour les séries temporelles continues, où des encodages spécialisés suivent les distances temporelles, la saisonnalité et les horodatages.
Pistes de recherche sur l’encodage positionnel
Alors que la course à l’agrandissement des fenêtres de contexte s’accélère, affiner la compréhension de la position par les modèles reste un champ de recherche en IA aussi actif que crucial.
Extrapolation de longueur et extension du contexte
Les utilisateurs exigent aujourd’hui d’immenses fenêtres de contexte pour traiter d’un coup des bases de code entières ou des sagas complètes. Comme entraîner des modèles dès le départ sur des séquences géantes coûte trop cher, les chercheurs s’appuient sur des techniques d’extension du contexte.
Des méthodes comme l’interpolation positionnelle compressent mathématiquement les coordonnées d’une séquence bien plus longue dans les bornes de la longueur d’entraînement initiale. Des approches adaptatives comme YaRN ajustent dynamiquement la fréquence de rotation des paramètres RoPE pour étendre sans couture la perception des distances par le modèle.
Transformers sans encodage positionnel explicite
Fait surprenant, certaines études suggèrent qu’un encodage positionnel explicite n’est pas toujours indispensable. Dans les modèles de langage causaux à décodeur seul, le masquage causal standard (qui force les jetons à ne regarder que vers le passé) divulgue intrinsèquement des informations d’ordre temporel.
Il serait donc possible d’apprendre implicitement des règles positionnelles à partir du seul masque causal en ajustant finement la température et certains éléments d’architecture.
Défis et perspectives
La frontière ultime met en lumière un compromis persistant entre adaptation stricte (optimiser la performance pour une longueur de séquence donnée) et extrapolation parfaite (permettre au modèle de généraliser indéfiniment).
Les recherches émergentes se concentrent fortement sur l’encodage multimodal. Créer des représentations positionnelles universelles fusionnant des coordonnées vidéo 3D avec des flux texte et audio constitue l’un des objectifs de la prochaine génération de modèles d’intelligence artificielle.
Conclusion
L’encodage positionnel comble le fossé entre traitement parallèle et compréhension séquentielle, et nous permet de créer des modèles capables de traiter de grands volumes de données dans l’ordre. Nous avons vu comment les embeddings appris et relatifs offrent une flexibilité extrême, et comment des innovations récentes comme RoPE et ALiBi optimisent à la fois l’élégance mathématique et l’efficacité computationnelle.
Alors que les fenêtres de contexte passent de quelques milliers à des millions de jetons, l’acte mathématique simple qui consiste à indiquer à un réseau de neurones où se trouvent les éléments restera au cœur de la conception des modèles.
Pour aller plus loin et pratiquer, nous vous recommandons de vous inscrire à notre parcours de compétences Developing Large Language Models.
FAQ sur l’encodage positionnel
Qu’est-ce que l’encodage positionnel en machine learning ?
L’encodage positionnel est une technique mathématique qui fournit aux réseaux de neurones des informations sur l’ordre des données dans une séquence.
Pourquoi les modèles transformers ont-ils besoin d’encodage positionnel ?
Contrairement aux anciens réseaux récurrents, qui traitent les données étape par étape, les transformers traitent tout en parallèle via un mécanisme d’auto-attention. Comme l’auto-attention est naturellement invariante par permutation, elle traite l’entrée comme un sac de mots non ordonné. L’encodage positionnel résout ce point en injectant des coordonnées séquentielles directement dans les données avant leur traitement par le modèle.
Quelle est la différence entre encodage positionnel absolu et relatif ?
L’encodage positionnel absolu attribue une coordonnée fixe à un jeton selon son indice exact dans la séquence. L’encodage positionnel relatif ignore la position exacte sur la grille et calcule plutôt la distance entre deux jetons en interaction, en se concentrant sur leur décalage contextuel.
Qu’est-ce que le Rotary Position Embedding (RoPE) ?
RoPE est une méthode d’encodage largement utilisée qui projette les embeddings de jetons sur un plan complexe et les fait tourner d’un angle déterminé par leur position absolue. Lors du calcul des scores d’attention, la relation entre deux vecteurs tournés ne dépend alors que de leur distance relative.
Que sont les embeddings positionnels appris ?
Plutôt que d’utiliser des formules fixes comme sinus et cosinus, les embeddings positionnels appris traitent les coordonnées spatiales comme des poids entraînables. Le modèle initialise une matrice de positions vierge et met à jour ces coordonnées pendant l’entraiînement pour apprendre des représentations spatiales optimales pour un jeu de données donné.
Je suis un data scientist avec de l'expérience dans l'analyse spatiale, l'apprentissage automatique et les pipelines de données. J'ai travaillé avec GCP, Hadoop, Hive, Snowflake, Airflow et d'autres processus d'ingénierie et de science des données.


