Polydesk-logotype
Polydesk.ai — Header

Sinusoidal Positional Encoding (Encodage Positionnel Sinusoïdal)

L’encodage positionnel sinusoïdal est le mécanisme original d’injection de position dans les Transformers, proposé dans « Attention Is All You Need » (Vaswani et al., 2017), qui utilise des ondes sinus et cosinus de fréquences géométriquement espacées pour générer un vecteur unique par position, ajouté à l’embedding du token, sans aucun paramètre apprenable.

Encodage Sinusoïdal en bref
Origine
« Attention Is All You Need » (Vaswani et al., NeurIPS 2017)
Formule
PE(pos, 2i) = sin(pos / 100002i/d), PE(pos, 2i+1) = cos(pos / 100002i/d)
Paramètres
Zéro (formule fermée déterministe)
Injection
Addition à l’embedding de token (bas du réseau)
Base
10 000 (progression géométrique de longueurs d’onde de 2π à ~63K)
Statut
Historique, supplanté par RoPE pour les LLM, mais héritage vivant dans RoPE
Modèles
Transformer original (traduction), premiers modèles seq2seq à attention

Le problème que résout l’encodage sinusoïdal

Le mécanisme d’attention du Transformer est fondamentalement une opération sur des ensembles : il calcule les relations entre éléments sans tenir compte de leur ordre. Sans information de position, « le chat mange la souris » et « la souris mange le chat » produiraient des scores d’attention identiques, car les mêmes tokens interagissent de la même manière.

Vaswani et al. avaient besoin d’un mécanisme simple, efficace, et potentiellement extensible pour injecter l’information d’ordre dans le modèle. Leur solution, les encodages sinusoïdaux, s’inspire d’un parallèle élégant avec la représentation binaire des nombres.

L’analogie avec la représentation binaire

Dans la représentation binaire, chaque position (bit) alterne entre 0 et 1 à une fréquence différente : le bit de poids faible alterne à chaque nombre (0, 1, 0, 1…), le suivant tous les 2 nombres, le suivant tous les 4, et ainsi de suite. Chaque nombre entier reçoit ainsi un « code binaire » unique.

L’encodage sinusoïdal reprend cette idée en remplaçant les bits discrets (0/1) par des ondes continues (sin/cos). Chaque dimension de l’encodage oscille à une fréquence différente, et la combinaison de toutes ces fréquences produit un « code » unique pour chaque position. L’avantage des fonctions continues sur les bits est qu’elles produisent des valeurs dans [-1, 1], plus compatibles avec les opérations en virgule flottante des réseaux de neurones.

La formule en détail

Pour une position pos dans la séquence et une dimension i dans le vecteur d’embedding de taille d_model :

PE(pos, 2i) = sin(pos / 100002i/d_model)

PE(pos, 2i+1) = cos(pos / 100002i/d_model)

Les dimensions paires (0, 2, 4…) utilisent le sinus, les dimensions impaires (1, 3, 5…) le cosinus. Chaque paire (2i, 2i+1) forme un couple sin/cos à la même fréquence, ce qui crée un encodage en phase et en quadrature pour chaque bande de fréquence.

Le spectre de fréquences

Le dénominateur 100002i/d_model contrôle la fréquence de chaque paire de dimensions. Pour la première paire (i = 0), le dénominateur est 1, et la longueur d’onde est 2π (environ 6,28 positions). Pour la dernière paire (i = d_model/2 – 1), le dénominateur est 10000, et la longueur d’onde est 10000 × 2π (environ 62 832 positions).

Ce spectre couvre donc des oscillations très rapides (la première dimension change significativement entre deux positions consécutives) aux oscillations très lentes (la dernière dimension change à peine sur des milliers de positions). Les premières dimensions capturent les relations locales (positions voisines), les dernières les relations à longue distance.

La progression géométrique des fréquences (chaque fréquence est un facteur constant plus basse que la précédente) est un choix délibéré. Elle répartit uniformément l’information positionnelle sur l’espace log-fréquence, garantissant que le modèle dispose d’une résolution adéquate à toutes les échelles de distance.

La base 10000 et son héritage La constante 10000 a été choisie empiriquement par Vaswani et al. et n’a jamais été remise en question. Elle est devenue un standard de facto. RoPE, introduit 4 ans plus tard, utilise exactement la même base 10000 et la même progression géométrique pour ses fréquences de rotation. Les techniques de scaling de contexte (NTK-aware, YaRN) modifient cette base pour étendre la portée des fréquences. Le choix de 10000 a donc eu un impact durable sur l’architecture de tous les LLM modernes.

Propriétés fondamentales

Unicité de chaque position

Chaque position pos produit un vecteur PE(pos) unique dans l’espace d-dimensionnel. Pour des dimensions suffisamment grandes (typiquement d_model ≥ 256), la probabilité de confusion entre deux positions est négligeable. La visualisation de la matrice d’encodage pour un d_model de 128 et des séquences de 50 tokens montre clairement des patterns de « bandes » distinctes pour chaque position, ressemblant à un spectrographe.

Transformation linéaire entre positions

Pour toute paire de dimensions (2i, 2i+1) et tout décalage fixe k, il existe une matrice de rotation 2×2 M (indépendante de pos) telle que :

[sin(ω_i × (pos + k)), cos(ω_i × (pos + k))]T = M × [sin(ω_i × pos), cos(ω_i × pos)]T

En appliquant cette relation à toutes les paires, le vecteur PE(pos + k) est une transformation linéaire de PE(pos). L’hypothèse de Vaswani et al. était que cette propriété permettrait au modèle d’apprendre facilement à s’attendre à des positions relatives, puisque le passage de « position pos » à « position pos + k » est une opération linéaire constante.

En pratique, cette propriété a été confirmée comme partiellement efficace. Le modèle peut effectivement capturer certaines relations relatives via les encodages sinusoïdaux, mais pas aussi efficacement que les encodages relatifs explicites, qui paramétrisent directement la distance sans nécessiter d’apprentissage implicite.

Décroissance de similarité avec la distance

Le produit scalaire entre deux vecteurs positionnels PE(pos) et PE(pos + k) décroît avec l’augmentation de k (la distance). Cela signifie que les positions proches ont des encodages plus similaires que les positions éloignées, créant un biais naturel vers la récence. Ce comportement est désirable pour le langage, où le contexte local est généralement le plus informatif.

Cependant, cette propriété de décroissance est moins marquée que dans les encodages relatifs explicites comme ALiBi (où la décroissance est linéaire et contrôlable par tête), et peut devenir irrégulière pour des dimensions d’embedding faibles (64 ou 128). Pour les dimensions élevées utilisées dans les LLM modernes (4096+), la décroissance est lisse et bien comportée.

Zéro paramètre apprenable

L’encodage sinusoïdal est entièrement déterministe. Il ne consomme aucun des paramètres du modèle et peut être pré-calculé pour toute longueur de séquence. C’est un avantage en termes d’efficacité mémoire et de simplicité d’implémentation, mais c’est aussi une limitation : le modèle ne peut pas adapter l’encodage aux spécificités de ses données d’entraînement.

L’injection par addition : mélange sémantique/positionnel

L’encodage sinusoïdal est ajouté (pas concaténé) à l’embedding sémantique du token : X = E(token) + PE(pos). Ce choix d’addition a été motivé par l’économie de paramètres (pas d’augmentation de la dimension du modèle). Mais il crée un mélange des signaux sémantique et positionnel dans le même vecteur.

En haute dimension, ce mélange est relativement bénin car l’espace est suffisamment grand pour que les deux signaux coexistent sans interférence majeure. Des analyses empiriques montrent que seules les premières dimensions de l’embedding sont fortement influencées par la position, le reste étant dominé par la sémantique. Le modèle apprend à « séparer » ces signaux dans les couches d’attention, mais cela coûte de la capacité.

Les approches modernes comme RoPE et ALiBi évitent ce mélange par construction. RoPE applique la rotation directement aux Q et K (pas aux embeddings d’entrée), et ALiBi ajoute le biais aux scores d’attention (pas aux embeddings). Les embeddings restent purement sémantiques. C’est l’une des raisons clés pour lesquelles ces méthodes surpassent les sinusoïdes.

Limites de l’encodage sinusoïdal

Extrapolation limitée

Bien que les sinusoïdes soient mathématiquement définies pour toute position, le modèle lui-même n’a été entraîné qu’à interpréter les patterns positionnels pour les longueurs vues pendant l’entraînement. Au-delà, les combinaisons de sin/cos à très grande position produisent des patterns jamais vus, ce qui dégrade les performances. Les expériences de Press et al. (2021) montrent une explosion de la perplexité dès que la séquence dépasse significativement la longueur d’entraînement, similaire à ce que l’on observe avec les encodages appris.

Non conditionné par le contenu

Les fréquences des sinusoïdes sont fixes, indépendantes du contenu de la séquence. La même position reçoit le même encodage, quel que soit le token qui s’y trouve. Des recherches récentes (CARoPE, 2025) montrent que des fréquences conditionnées par le contenu améliorent les performances, suggérant que la rigidité des sinusoïdes est une limitation réelle.

Dimensions potentiellement gaspillées

Pour les contextes longs, les dimensions à haute fréquence (qui oscillent rapidement) deviennent « brouillées » : les tokens éloignés ont des valeurs quasi-aléatoires dans ces dimensions. Des analyses (Chiang et al., 2025) montrent que l’élagage de ces dimensions n’affecte pas (voire améliore) la récupération d’information longue distance. Cela suggère que l’encodage sinusoïdal n’utilise pas optimalement toutes ses dimensions, un problème hérité par RoPE qui utilise le même spectre de fréquences.

L’héritage vivant : des sinusoïdes à RoPE

L’encodage sinusoïdal est rarement utilisé tel quel dans les modèles récents, mais son influence est omniprésente. RoPE, le standard actuel des LLM, est essentiellement une version améliorée de l’idée sinusoïdale.

Ce que RoPE conserve des sinusoïdes : la base 10000, la progression géométrique de fréquences, les couples sin/cos par paire de dimensions, le caractère déterministe sans paramètres. La « forme » de l’encodage est identique.

Ce que RoPE améliore : au lieu d’ajouter les sin/cos aux embeddings (mélange sémantique/position), RoPE les utilise comme matrice de rotation appliquée aux Q et K (séparation propre). Au lieu de traiter chaque dimension indépendamment, RoPE mélange les paires de dimensions par rotation 2D, créant un encodage plus expressif. Et le produit scalaire entre deux vecteurs rotés ne dépend que de la distance relative, transformant un encodage absolu en encodage relatif implicite.

Le Transformer-XL utilise également des sinusoïdes dans son mécanisme d’attention relative, mais comme embeddings relatifs R_{i-j} plutôt que comme additions aux embeddings d’entrée. Les sinusoïdes servent alors de base de représentation pour les distances plutôt que pour les positions.

On peut donc voir l’histoire des encodages positionnels comme une évolution continue de l’idée sinusoïdale : les mêmes fonctions mathématiques, appliquées différemment et plus efficacement à chaque génération.

Comparaison avec les autres encodages positionnels

Méthode Type Paramètres Injection Extrapolation Expressivité
Sinusoïdal Absolu Zéro Addition aux embeddings Limitée Modérée
Appris Absolu N_max × d Addition aux embeddings Nulle Haute (sur longueur entraînement)
RoPE Relatif implicite Zéro Rotation Q et K Bonne (avec scaling) Haute
ALiBi Relatif Zéro Biais sur scores attention Excellente Faible (biais linéaire fixe)
T5 Bias Relatif Table de buckets Biais sur scores attention Bonne Modérée

Le sinusoïdal occupe une position intermédiaire : plus extensible que les encodages appris (formule fermée vs matrice finie), mais moins expressif et moins performant en extrapolation que les encodages relatifs modernes. Son avantage principal, la simplicité, a été repris par RoPE et ALiBi qui sont tout aussi simples mais plus efficaces.

Variantes et adaptations

tAPE (time Absolute Position Encoding). Conçu pour les séries temporelles, tAPE ajuste les fréquences en fonction de la longueur de la séquence, résolvant un problème de perte de « distance awareness » que les sinusoïdes standard présentent à faible dimension d’embedding (64-128).

Fourier Features. Les sinusoïdes positionnelles sont un cas particulier 1D des Fourier Features (Tancik et al., 2020). Cette connexion théorique a été formalisée dans le contexte de RoPE et a inspiré des généralisations à des dimensions arbitraires (images, vidéo, séries temporelles irrégulières).

Encodages par ondelettes. Des travaux théoriques récents (2025) proposent de remplacer les sinusoïdes par des ondelettes multi-échelles, offrant une meilleure localisation temps-fréquence. Sur des tâches synthétiques, les encodages par ondelettes surpassent les sinusoïdes en extrapolation. Cette direction reste exploratoire mais illustre que l’idée fondamentale des sinusoïdes (décomposition en fréquences) peut être raffinée.

Implémentation

import torch import math def sinusoidal_encoding(max_len, d_model): """Encodage sinusoïdal standard (Vaswani et al., 2017).""" pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len).unsqueeze(1).float() div_term = torch.exp( torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model) ) pe[:, 0::2] = torch.sin(position * div_term) # dimensions paires pe[:, 1::2] = torch.cos(position * div_term) # dimensions impaires return pe # [max_len, d_model]

En pratique, cette matrice est pré-calculée une seule fois et stockée comme buffer non-apprenable (register_buffer). Elle est indexée par la position de chaque token dans la séquence et ajoutée aux embeddings de tokens avant la première couche d’attention.

Astuce d’implémentation Le calcul du dénominateur utilise l’exponentielle de log plutôt que la puissance directe (exp(-log(10000) * 2i/d) au lieu de 1/10000^(2i/d)) pour des raisons de stabilité numérique en FP32 et FP16. Cette convention est reprise dans toutes les implémentations de RoPE.

Questions fréquentes sur l’encodage sinusoïdal

Pourquoi utiliser des fonctions sin et cos plutôt que d’autres fonctions ?

Les sinusoïdes ont été choisies pour plusieurs raisons. Leurs valeurs sont normalisées dans [-1, 1], compatibles avec les embeddings. Chaque position produit un vecteur unique. La propriété mathématique clé est que PE(pos + k) est une transformation linéaire de PE(pos) pour tout décalage fixe k, ce qui facilite l’apprentissage des relations relatives. Elles sont aussi naturellement extensibles à toute longueur de séquence via leur formule fermée. Enfin, le parallèle avec la représentation binaire (bits alternants à différentes fréquences) offre une intuition simple de pourquoi chaque position est unique.

Les encodages sinusoïdaux sont-ils encore utilisés ?

Directement dans les LLM modernes, non. RoPE les a entièrement remplacés comme encodage positionnel standard. Cependant, les sinusoïdes sont encore utilisées indirectement : RoPE reprend la même base 10000, la même progression géométrique de fréquences, et les mêmes couples sin/cos. Les sinusoïdes sont aussi utilisées comme encodages relatifs dans Transformer-XL. Et certains modèles de vision (ViT originaux) et de séries temporelles utilisent encore des variantes sinusoïdales.

Pourquoi la constante 10000 et pas une autre valeur ?

La valeur 10000 détermine la longueur d’onde maximale du spectre de fréquences. Avec d_model = 512, la longueur d’onde la plus grande est environ 63 000 positions, ce qui était jugé suffisant pour les tâches de traduction de l’époque (séquences de quelques centaines de tokens). Le choix est empirique, pas théorique. RoPE a hérité de cette valeur, et les techniques de scaling de contexte (NTK-aware, YaRN) fonctionnent précisément en modifiant cette base pour supporter des contextes plus longs.

Pourquoi ajouter l’encodage plutôt que le concaténer ?

La concaténation doublerait la dimension du modèle (d_model + d_position), augmentant massivement le nombre de paramètres dans toutes les couches suivantes. L’addition conserve la dimension d_model, ce qui est plus efficace. En haute dimension (512+), le mélange sémantique/positionnel est tolérable car l’espace est assez grand pour les deux signaux. Cependant, ce mélange est reconnu comme sous-optimal par les recherches ultérieures, ce qui a conduit aux approches modernes (RoPE, ALiBi) qui injectent la position dans l’attention plutôt que dans les embeddings.

Quelle est la relation entre l’encodage sinusoïdal et RoPE ?

RoPE est le descendant direct de l’encodage sinusoïdal. Il utilise la même base 10000, les mêmes fréquences géométriques, et les mêmes couples sin/cos. La différence fondamentale : au lieu d’ajouter les sin/cos aux embeddings (mélange sémantique/position), RoPE les utilise comme matrice de rotation 2D appliquée aux Q et K. Cela transforme un encodage absolu additif en encodage relatif multiplicatif, offrant une séparation propre des signaux et un encodage relatif implicite dans le produit scalaire. On peut voir RoPE comme « l’encodage sinusoïdal bien fait ».

Polydesk.ai — Footer