Transformers : architecture originale et blocs modernes
Un Transformer n’est pas synonyme d’attention. Il combine représentations des tokens, position, attention, sous-couches feed-forward, connexions résiduelles et normalisation. L’article de 2017 décrivait un encoder–decoder ; les blocs decoder-only courants ont depuis modifié de nombreux détails.
Du texte aux vecteurs d’entrée
Un tokenizer convertit le texte en éléments du vocabulaire et en identifiants entiers de tokens. Un token peut être un mot, un fragment de mot, un signe de ponctuation ou une unité au niveau des octets. Les frontières et les identifiants dépendent du tokenizer, pas seulement de la langue. Des tokens spéciaux peuvent marquer les limites de séquence ou les rôles des messages.
Prenons un vocabulaire purement illustratif : BOS=0, hello=1, world=2. La séquence [BOS, hello, world] devient [0,1,2]. Une table d’embeddings apprise fournit les lignes , soit une matrice , ou [1,3,d] avec un axe de lot. Les identifiants sont des indices de consultation, pas des mesures : l’identifiant 2 ne représente pas deux fois le sens de l’identifiant 1. Le Transformer original, §3.4, décrit ces embeddings d’entrée.
La position est intégrée selon l’architecture ci-dessous ; la pile rend ensuite les vecteurs dépendants du contexte. Un embedding de token d’entrée n’est pas automatiquement un vecteur de phrase ou de document adapté à la recherche. La projection de sortie sur le vocabulaire, décrite dans la section d’entraînement, ferme le parcours du texte aux vecteurs puis aux tokens.
Tenseurs principaux
Pour , des projections apprises produisent Q, K et V. Avec têtes de requête et , les formes courantes sont :
Q: [batch, h_q, sequence, d_h]
K: [batch, h_kv, sequence, d_h]
V: [batch, h_kv, sequence, d_h]
Pour MHA, ; MQA utilise ; le GQA intermédiaire emploie . L’article GQA inclut aussi MHA et MQA comme cas limites. MQA et GQA réduisent surtout le trafic du cache KV, pas le nombre de requêtes, et ne garantissent pas une qualité identique.
La formule d’attention exige des têtes correspondantes : on ne peut pas multiplier aveuglément les tenseurs Q et K affichés. Pour des groupes contigus de même taille, doit être divisible par ; posons . La tête de requête , numérotée depuis zéro, partage la tête KV :
Avec huit têtes de requête et deux têtes KV, les requêtes 0–3 utilisent la tête KV 0 et les requêtes 4–7 la tête KV 1. Chaque sortie a la forme [batch, sequence, d_h] ; concaténer les huit sorties restaure la largeur . Répéter explicitement K/V par groupe illustre le calcul, mais les kernels efficaces peuvent les partager sans matérialiser les copies.
Un bloc ne se réduit pas à l’attention
Un FFN simple s’écrit :
Les blocs modernes utilisent souvent SwiGLU ou GEGLU, avec des projections distinctes pour la porte et la valeur. Les FFN concentrent souvent une grande partie des paramètres et du calcul d’un bloc.
L’ordre des résidus et de la normalisation varie lui aussi :
- Post-Norm original : ;
- Pre-Norm courant : .
Pre-Norm facilite souvent l’optimisation des réseaux profonds, mais n’est pas équivalent à Post-Norm. LayerNorm centre les valeurs et remet leur variance à l’échelle ; RMSNorm les remet à l’échelle par leur moyenne quadratique. Il faut noter epsilon, l’emplacement et le biais, plutôt que d’indiquer seulement « norm ».
Sur quel axe normaliser ?
Dans un Transformer conventionnel, LayerNorm normalise les caractéristiques de chaque token indépendamment, sans traverser le lot ni les positions. Pour un token , elle calcule , avec et . RMSNorm calcule plutôt dans sa forme usuelle sans biais. Pour , une échelle unitaire, un biais nul et en négligeant epsilon dans cet exemple arithmétique, LayerNorm donne et RMSNorm donne . Ni l’une ni l’autre n’utilise les statistiques courantes de lot de BatchNorm ; ce calcul reste identique entre entraînement et inférence.
Le FFN applique les mêmes poids séparément à chaque position ; l’attention mélange les positions. Les sorties des têtes sont concaténées, puis une projection apprise les ramène à la largeur , nécessaire à l’addition résiduelle.
Position
Sans information de position ni masque dépendant de l’ordre, l’auto-attention est équivariante aux permutations : permuter les lignes d’entrée permute les lignes de sortie. Un masque causal fixe introduit déjà un ordre ; cette symétrie arbitraire ne s’y applique donc pas.
RoPE est courant dans les decoders modernes. Une longue fenêtre configurée ne prouve pas que le modèle retrouve efficacement l’information, et le scaling de position peut dégrader la qualité sur les contextes courts.
Architecture originale et implémentations modernes courantes
La colonne de droite ne décrit pas une norme unique. L’ensemble RMSNorm, RoPE, GQA et SwiGLU de Llama 3 constitue une combinaison documentée ; il ne définit pas tous les Transformers et n’isole pas la contribution de chaque composant.
Exemple de dimensions et de mémoire
Pour batch=2, , et , on obtient :
Q/K/V: [2, 8, 128, 64]
attention scores: [2, 8, 128, 128]
concatenated output: [2, 128, 512]
Pour batch=1, et huit têtes, les scores contiennent :
éléments — environ 256 Mio en fp16 avant de compter les gradients, le Softmax, Q/K/V, les FFN et les autres couches. FlashAttention évite de matérialiser tout cet intermédiaire grâce au tuilage, mais l’arithmétique exacte de l’attention complète reste quadratique.
Entraînement et génération sont deux systèmes différents
L’entraînement d’un modèle de langage causal calcule en parallèle les positions d’une séquence connue ; la génération dépend token par token des sorties précédentes. Le cache KV évite de recalculer les anciennes clés et valeurs, mais sa taille augmente avec le nombre de couches, le contexte, les têtes K/V, la dimension des têtes, le batch et le dtype.
Rapportez séparément les latences de prefill et de décodage, ainsi que le batch, les longueurs de prompt et de sortie, l’échantillonnage, la quantification, la fenêtre, le paging et l’offload du cache, la mémoire des activations d’entraînement par rapport à la mémoire résidente en inférence, les kernels, le compilateur, le matériel et la précision. « Contexte 1M » ou « utilise FlashAttention » ne suffit pas à établir l’utilité de bout en bout.
La pile produit un vecteur caché à chaque position, pas un identifiant de token. Une projection de vocabulaire donne les logits . Softmax et entropie croisée convertissent ces scores en distribution sur le vocabulaire et en perte d’entraînement pour la cible du token suivant. La génération sélectionne ou échantillonne un token dans cette distribution : l’axe normalisé est celui du vocabulaire, tandis que l’attention normalise sur les clés.
Pour prédire le token suivant, prenons les entrées [BOS, A, B] et les cibles [A, B, EOS]. Chaque position voit sa propre entrée et les précédentes ; fournir les cibles sans décalage révèle la réponse même avec un masque causal. L’encodeur–décodeur de 2017 ajoute une attention croisée entre l’auto-attention masquée du décodeur et le FFN : les états du décodeur fournissent les requêtes, les sorties de l’encodeur les clés et valeurs. Toutes les positions sources valides sont visibles ; le padding source reste masqué.
À la génération, traiter une fois le prompt (prefill), sélectionner le token suivant depuis la dernière sortie, puis faire passer ce token dans la pile (decode). Avec un cache exact et un préfixe causal inchangé, les anciens états ne dépendent pas du token ajouté, donc leurs K/V restent réutilisables. Désactiver le dropout pour comparer de façon déterministe les sorties avec et sans cache. Voir Variantes de l’attention et compression du cache KV pour la taille et les conditions de réutilisation.
Familles d’architecture
Les modèles encoder-only utilisent un contexte bidirectionnel ; les modèles decoder-only suivent un objectif causal ; les encoder–decoders séparent l’encodage de l’entrée et la génération conditionnelle. Les Transformers MoE dirigent les tokens vers un sous-ensemble d’experts, ce qui augmente la capacité totale tout en introduisant des risques d’équilibrage de charge, de communication et de routage.
Ces étiquettes ne suffisent pas à reproduire un système : le tokenizer, les données, l’objectif, le curriculum de contexte, l’optimiseur, le post-training et le protocole d’outils peuvent peser davantage qu’un détail du bloc.
Modes d’échec et contre-exemples
Un masque causal inversé révèle les tokens futurs. Le padding, le packing ou l’attention entre documents peuvent contaminer l’entraînement. Les longs contextes peuvent sous-utiliser les positions centrales. L’architecture ne corrige pas la contamination d’un benchmark ou du corpus. Le scaling de RoPE, GQA, la quantification et les kernels fusionnés peuvent interagir à certaines longueurs ou avec certains dtypes. Le streaming à mémoire fixe peut favoriser les RNN ou les SSM ; la vision locale peut favoriser la convolution.
architecture: encoder | decoder | encoder-decoder
layers: N
width: d_model
attention: heads, kv_heads, head_dim, window, kernel
position: method, base, scaling, trained_length
norm: type, pre_or_post, epsilon
ffn: activation_or_gate, intermediate_width, experts
training: objective, data boundary, precision, optimizer, seeds
inference: cache, quantization, batch, prompt/output lengths
Les produits et API du moment relèvent du Radar Frontier ; cette page conserve les limites architecturales réutilisables.