Polydesk-logotype
Polydesk.ai — Header

Learned Positional Embedding (Encodage Positionnel Appris)

Un encodage positionnel appris (learned positional embedding) est une matrice de vecteurs d’embedding entraînée pendant le pré-entraînement du modèle, où chaque position dans la séquence (de 0 à N_max – 1) reçoit un vecteur appris unique, ajouté à l’embedding du token pour donner au Transformer la capacité de distinguer l’ordre des éléments.

Encodage Positionnel Appris en bref
Principe
Matrice entraînable P ∈ RN_max × d_model, un vecteur par position
Paramètres
N_max × d_model (ex. : 1024 × 768 = 786 432 pour GPT-2)
Injection
Addition à l’embedding de token (bas du réseau)
Extrapolation
Nulle (pas de vecteur pour les positions > N_max)
Modèles historiques
GPT-2 (N_max = 1024), GPT-3 (N_max = 2048), BERT (N_max = 512)
Statut
Obsolète pour les LLM, supplanté par RoPE

Pourquoi des encodages appris

Le papier original du Transformer (« Attention Is All You Need », 2017) proposait les encodages sinusoïdaux comme mécanisme positionnel, et mentionnait en note que des encodages appris produisaient des résultats « nearly identical ». Les deux approches résolvaient le même problème fondamental : le mécanisme d’attention est invariant par permutation et ne distingue pas l’ordre des tokens sans information positionnelle explicite.

Les chercheurs qui ont développé GPT-2, GPT-3 et BERT ont choisi les encodages appris pour une raison simple : la flexibilité. Au lieu de fixer les encodages par une formule mathématique, on laisse le modèle apprendre la meilleure représentation positionnelle pour ses données et sa tâche. En haute dimension (768 pour GPT-2, 12288 pour GPT-3), le modèle dispose d’un espace suffisant pour apprendre des patterns positionnels riches et nuancés.

Ce choix pragmatique a dominé l’ère 2018-2022 des LLM, avant que les limites d’extrapolation ne deviennent un problème bloquant avec l’allongement des fenêtres de contexte.

Fonctionnement technique

La matrice d’embeddings positionnels

L’implémentation est directe : une couche nn.Embedding(N_max, d_model) en PyTorch. C’est une table de lookup de N_max vecteurs de dimension d_model. Pour le token à la position i, le vecteur positionnel p_i est récupéré par indexation dans cette table, puis ajouté à l’embedding sémantique du token :

input_i = embedding(token_i) + position_embedding(i)

La matrice est initialisée aléatoirement (typiquement par initialisation normale ou Xavier) et entraînée conjointement avec le reste du modèle via la backpropagation. Chaque vecteur positionnel est mis à jour à chaque batch d’entraînement pour minimiser la loss du modèle, ce qui lui permet de s’adapter aux spécificités statistiques des données.

Tailles dans les modèles historiques

Modèle N_max (positions) d_model Paramètres positionnels % du modèle total
GPT-2 Small 1 024 768 786 432 ~0,6%
GPT-2 Large 1 024 1 280 1 310 720 ~0,2%
GPT-3 (175B) 2 048 12 288 25 165 824 ~0,01%
BERT Base 512 768 393 216 ~0,4%
BERT Large 512 1 024 524 288 ~0,2%

Le nombre de paramètres positionnels est négligeable par rapport à la taille totale du modèle (moins de 1% dans tous les cas). Le coût mémoire n’est donc pas un argument significatif pour ou contre les encodages appris. Le vrai problème est ailleurs.

Ce que le modèle apprend

Des analyses de visualisation des embeddings positionnels appris révèlent plusieurs patterns intéressants. Les vecteurs de positions proches sont similaires entre eux (haute cosine similarity), formant un gradient lisse dans l’espace d’embedding. Les premières positions (0 à ~10) ont des vecteurs particulièrement distinctifs, ce qui correspond au rôle spécial des premiers tokens dans les modèles autorégressifs (le token BOS, les instructions système, etc.).

Les vecteurs appris montrent aussi une structure en « bandes de fréquence » similaire aux encodages sinusoïdaux quand on les visualise par composante, ce qui suggère que le modèle redécouvre spontanément une représentation de type spectral. Cela renforce l’argument que les sinusoïdes (et par extension RoPE) capturent une structure naturelle de l’information positionnelle.

Avantages des encodages appris

Flexibilité maximale. Le modèle peut apprendre n’importe quelle représentation positionnelle qui minimise sa loss. Il peut s’adapter aux spécificités des données : langues avec des structures syntaxiques différentes, code avec des indentations et des structures de blocs, ou données structurées avec des patterns positionnels réguliers.

Simplicité d’implémentation. Une seule ligne de code (nn.Embedding) suffit. Pas de formule mathématique à dériver ni de constantes à choisir. L’initialisation standard fonctionne bien. C’est cette simplicité qui a contribué à l’adoption massive dans les premiers LLM.

Performance empirique solide. Sur les longueurs de séquence d’entraînement, les encodages appris performent au même niveau (voire légèrement mieux) que les sinusoïdes. Le papier original du Transformer rapporte des résultats « nearly identical », et les succès de GPT-2, GPT-3 et BERT confirment leur efficacité pratique.

Pas de biais structurel imposé. Contrairement aux sinusoïdes (qui imposent une décroissance de similarité avec la distance) ou à ALiBi (qui impose un biais de récence linéaire), les encodages appris laissent le modèle découvrir librement la structure positionnelle optimale. Cela peut être un avantage pour des tâches où le biais de récence n’est pas souhaitable.

La limitation fatale : l’absence d’extrapolation

Le mur N_max

C’est le problème qui a rendu les encodages appris obsolètes pour les LLM modernes. La matrice d’embeddings contient exactement N_max vecteurs, pour les positions 0 à N_max – 1. Pour la position N_max (et au-delà), aucun vecteur n’existe. Le modèle ne peut tout simplement pas traiter de séquence plus longue que N_max tokens.

GPT-2 était limité à 1024 tokens. BERT à 512. GPT-3 à 2048. Ces limites étaient inscrites dans l’architecture elle-même, pas dans un hyperparamètre modifiable. Augmenter N_max après l’entraînement nécessitait de ré-entraîner le modèle, ce qui était prohibitivement coûteux pour des modèles de la taille de GPT-3.

Tentatives de contournement

Plusieurs heuristiques ont été tentées pour dépasser N_max sans ré-entraînement, toutes avec des résultats médiocres :

Réutilisation du dernier vecteur. Assigner p_{N_max-1} à toutes les positions ≥ N_max. Le modèle ne peut alors plus distinguer aucune position au-delà de la limite, ce qui détruit l’information d’ordre.

Interpolation linéaire. Pour une séquence de longueur 2 × N_max, interpoler les positions en utilisant les vecteurs existants à mi-chemin. Cela compresse l’espace positionnel et dégrade la résolution locale, similaire à la Position Interpolation pour RoPE mais sans la structure mathématique qui rend PI efficace.

Extension avec fine-tuning. Ajouter de nouveaux vecteurs aléatoires pour les positions supplémentaires et fine-tuner. Cela fonctionne modestement pour de petites extensions (1,5x à 2x) mais nécessite des données et du compute supplémentaires, et ne résout pas fondamentalement le problème.

Aucune de ces heuristiques n’atteint la qualité d’un modèle directement entraîné sur la longueur cible, et toutes sont inférieures aux techniques de scaling de RoPE (YaRN, LongRoPE2) qui étendent le contexte de 16x à 64x avec un fine-tuning minimal.

Le contraste avec les besoins actuels

Les LLM modernes opèrent avec des fenêtres de contexte de 128K à 1M+ tokens. Claude Opus 4.6 supporte 1M tokens. GPT-5.4 environ 1M tokens via l’API. Gemini 3.x offre jusqu’à 1M tokens. Ces longueurs auraient nécessité des matrices d’embeddings de 1M × d_model vecteurs, soit des centaines de millions de paramètres supplémentaires rien que pour la position, avec un entraînement sur des séquences de 1M tokens pour chaque vecteur. C’est simplement irréalisable avec des encodages appris.

RoPE, avec ses rotations calculées par formule fermée et ses techniques de scaling (YaRN), résout ce problème élégamment : zéro paramètre positionnel, extensible à 1M+ tokens avec un fine-tuning de 0,1% des données originales.

Position dans l’évolution des encodages

Critère Appris Sinusoïdal RoPE
Paramètres N_max × d_model Zéro Zéro
Flexibilité Maximale (apprenable) Aucune (formule fixe) Aucune (formule fixe)
Extrapolation Nulle Limitée Bonne (avec scaling)
Injection Addition aux embeddings Addition aux embeddings Rotation Q et K
Encodage relatif Implicite seulement Implicite seulement Explicite dans le produit scalaire
Longueur max typique 512 à 2048 Illimitée (formule) 1M+ (avec YaRN)

Verdict : Les encodages appris ont été un choix pragmatique et efficace pour l’ère des modèles à contexte court (512 à 2048 tokens). Ils ont démontré que la flexibilité d’apprentissage est un atout réel pour les longueurs d’entraînement. Mais leur incapacité fondamentale à extrapoler les a rendus incompatibles avec la course aux fenêtres de contexte longues qui définit les LLM modernes. L’industrie a convergé vers RoPE qui combine les avantages des sinusoïdes (formule fermée, extensible) avec une expressivité riche (rotation multi-fréquence, encodage relatif implicite).

Cas d’usage encore pertinents

Vision Transformers (ViT). Les séquences d’images découpées en patches sont courtes (196 à 576 patches) et de longueur fixe. L’extrapolation n’est pas un enjeu, et les encodages appris 2D (ou 1D raster) fonctionnent très bien. Les études d’ablation de ViT (Dosovitskiy et al., 2020) montrent peu de différence entre les encodages appris et sinusoïdaux sur les images, mais un écart important avec l’absence d’encodage. Pour les résolutions variables, une interpolation bilinéaire des embeddings avec fine-tuning léger suffit.

Modèles encodeurs de classification. BERT et ses dérivés pour la classification de texte, le NER, ou l’extraction d’information travaillent généralement sur des séquences courtes (128 à 512 tokens). Les encodages appris restent compétitifs dans ce contexte. DeBERTa a cependant montré que combiner un encodage relatif (dans les couches d’attention) avec un encodage absolu appris (dans les dernières couches) surpasse les encodages appris seuls.

Prototypage rapide. Pour des expériences à petite échelle où la simplicité prime, nn.Embedding est le moyen le plus rapide d’ajouter un encodage positionnel. Si l’extrapolation n’est pas un besoin, c’est un choix parfaitement valide.

Pour tout nouveau LLM autorégressif visant des fenêtres de contexte de 8K tokens ou plus, les encodages appris ne sont plus un choix viable. RoPE est le standard sans exception.

Implémentation pratique

Code de base

import torch import torch.nn as nn class LearnedPositionalEncoding(nn.Module): def __init__(self, max_len, d_model): super().__init__() # Table de lookup : un vecteur appris par position self.position_embedding = nn.Embedding(max_len, d_model) def forward(self, x): # x: [batch_size, seq_len, d_model] seq_len = x.size(1) positions = torch.arange(seq_len, device=x.device) pos_emb = self.position_embedding(positions) # [seq_len, d_model] return x + pos_emb # Addition à l'embedding sémantique

Bonnes pratiques d’implémentation

Initialisation. L’initialisation standard de PyTorch (normale avec écart-type 1) fonctionne, mais une initialisation normale avec un écart-type réduit (0,02, comme dans GPT-2) produit de meilleurs résultats. Certains praticiens initialisent avec les vecteurs sinusoïdaux puis laissent le modèle les affiner, combinant le biais inductif des sinusoïdes avec la flexibilité de l’apprentissage.

Choix de N_max. Fixez N_max avec une marge de 10-20% au-delà de la longueur de séquence d’entraînement prévue. Pour un entraînement sur des séquences de 512 tokens, utilisez N_max = 640 ou 1024. Le surcoût en paramètres est négligeable et vous évite de reconstruire le modèle en cas de besoin d’extension mineure.

Dropout sur les embeddings. GPT-2 et BERT appliquent un dropout sur la somme embedding + position avant la première couche d’attention. Ce dropout (typiquement 0,1) agit comme régulariseur sur les deux types d’information et aide le modèle à ne pas surappendre les patterns positionnels spécifiques aux données d’entraînement.

Analyse des embeddings appris

Patterns de similarité

L’analyse par cosine similarity des embeddings positionnels appris de GPT-2 révèle une structure riche. Les positions voisines ont une forte similarité (> 0,9), qui décroît progressivement avec la distance. La matrice de similarité forme un gradient diagonal caractéristique. Les premières positions (0 à ~5) sont distinctement séparées du reste, reflétant le rôle spécial des premiers tokens dans les modèles autorégressifs (début de séquence, tokens spéciaux).

Les dernières positions (proches de N_max) montrent parfois des patterns moins structurés, car elles sont moins fréquemment atteintes pendant l’entraînement si les séquences sont de longueur variable. C’est un problème pratique : si la plupart de vos séquences d’entraînement font 256 tokens, les vecteurs pour les positions 256 à 1024 seront sous-entraînés et moins fiables.

Structure fréquentielle émergente

Fait remarquable : quand on visualise les embeddings appris par composante (une courbe par dimension de l’embedding, en fonction de la position), on observe spontanément des patterns oscillatoires ressemblant aux sinusoïdes. Certaines dimensions développent des oscillations à haute fréquence (variant rapidement avec la position), d’autres à basse fréquence (variant lentement).

Cette émergence spontanée d’une structure spectrale suggère que la décomposition en fréquences est une propriété naturelle de l’information positionnelle, pas un artefact du choix des sinusoïdes. Le modèle redécouvre indépendamment que des oscillations à différentes fréquences sont une bonne manière de représenter les positions. C’est un argument fort en faveur de RoPE, qui formalise cette structure spectrale de manière explicite et déterministe.

La transition historique vers RoPE

La transition des encodages appris vers RoPE s’est faite en deux vagues. La première, en 2022-2023, a vu les modèles open-source pionniers (GPT-NeoX d’EleutherAI, LLaMA de Meta) adopter RoPE, démontrant sa supériorité pour les contextes de 2K à 4K tokens. La seconde, en 2023-2024, a vu l’adoption universelle avec les techniques de scaling (YaRN) qui ont résolu le problème d’extrapolation de RoPE, éliminant le dernier argument en faveur des encodages appris (qui, au moins, ne dégradaient pas les performances sur leur longueur d’entraînement).

GPT-3 (2020) utilisait des encodages appris avec N_max = 2048. GPT-4 (2023) est passé à un système de contexte étendu (détails architecturaux non publics mais probablement basé sur des encodages relatifs). Les modèles Llama de Meta, qui ont défini le standard open-source, ont utilisé RoPE dès la première version (février 2023). Mistral 7B (septembre 2023) a confirmé RoPE comme le choix par défaut. Aucun LLM open-weight majeur lancé après 2023 n’utilise d’encodage appris.


Questions fréquentes sur les encodages positionnels appris

Quelle est la différence entre un encodage positionnel appris et sinusoïdal ?

L’encodage sinusoïdal utilise une formule fixe (sin/cos de fréquences géométriques) sans paramètres apprenables. L’encodage appris utilise une matrice de vecteurs entraînés, un par position, optimisés pendant le pré-entraînement. Les sinusoïdes sont définies pour toute position (formule fermée) ; les appris n’existent que pour les positions 0 à N_max – 1. En performance sur la longueur d’entraînement, les deux sont quasi identiques. La différence clé est l’extrapolation : faible pour les sinusoïdes, nulle pour les appris.

Pourquoi GPT-2 et BERT ont-ils choisi des encodages appris plutôt que sinusoïdaux ?

Pour la flexibilité et la simplicité. Les encodages appris s’adaptent aux données sans hypothèse structurelle, et l’implémentation est triviale (une seule ligne de code). À l’époque (2018-2019), les fenêtres de contexte étaient courtes (512 à 1024 tokens) et l’extrapolation n’était pas un besoin prioritaire. Les performances empiriques étaient équivalentes aux sinusoïdes, et la communauté n’avait pas encore identifié les limites d’extrapolation comme un problème majeur.

Peut-on étendre un modèle GPT-2 ou BERT au-delà de sa longueur maximale ?

Très difficilement. Les positions au-delà de N_max n’ont pas de vecteur d’embedding. Les heuristiques (interpolation, réutilisation du dernier vecteur, extension avec fine-tuning) fonctionnent mal. La solution réaliste pour les modèles à encodage appris est de les migrer vers RoPE via un uptraining, ou de passer à un modèle moderne nativement RoPE. En 2026, les modèles à encodage appris sont considérés comme des architectures d’anciennes générations.

Combien de paramètres les encodages appris ajoutent-ils ?

N_max × d_model paramètres. Pour GPT-2 (1024 × 768), c’est environ 786K paramètres, soit moins de 0,6% du modèle total. Pour GPT-3 (2048 × 12288), c’est 25M paramètres, soit environ 0,01% des 175B totaux. Le coût en paramètres est donc négligeable. Le problème n’est pas le coût mais la limite dure de longueur imposée par N_max.

Les encodages appris sont-ils meilleurs ou pires que RoPE ?

Sur la longueur d’entraînement, les performances sont comparables. La flexibilité des encodages appris leur permet même de capturer des patterns positionnels spécifiques aux données que RoPE (déterministe) ne peut pas. Mais RoPE est très supérieur sur tous les autres critères : extrapolation (1M+ tokens avec scaling vs 0 pour les appris), séparation sémantique/position (rotation sur Q/K vs addition aux embeddings), encodage relatif explicite (via le produit scalaire vs implicite seulement), et compatibilité avec le KV cache moderne. C’est pourquoi RoPE a entièrement remplacé les encodages appris dans les LLM.

Polydesk.ai — Footer