Aller au contenu principal

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 ERV×dE\in\mathbb R^{|\mathcal V|\times d} fournit les lignes E0,E1,E2E_0,E_1,E_2, soit une matrice 3×d3\times d, 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 XRb×n×dX\in\mathbb{R}^{b\times n\times d}, des projections apprises produisent Q, K et V. Avec hqh_q têtes de requête et dh=d/hqd_h=d/h_q, 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]
Attention(Q,K,V)=softmax ⁣(QKdh+M)V.\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_h}}+M\right)V.

Pour MHA, hq=hkvh_q=h_{kv} ; MQA utilise hkv=1h_{kv}=1 ; le GQA intermédiaire emploie 1<hkv<hq1<h_{kv}<h_q. 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, hqh_q doit être divisible par hkvh_{kv} ; posons r=hq/hkvr=h_q/h_{kv}. La tête de requête ii, numérotée depuis zéro, partage la tête KV g(i)=i/rg(i)=\lfloor i/r\rfloor :

Oi=softmax ⁣(QiKg(i)Tdh+M)Vg(i).O_i=\operatorname{softmax}\!\left(\frac{Q_iK_{g(i)}^T}{\sqrt{d_h}}+M\right)V_{g(i)}.

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 dd. 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 :

FFN(x)=W2ϕ(W1x+b1)+b2.\operatorname{FFN}(x)=W_2\phi(W_1x+b_1)+b_2.

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 : y=LN(x+Sublayer(x))y=\operatorname{LN}(x+\operatorname{Sublayer}(x)) ;
  • Pre-Norm courant : y=x+Sublayer(Norm(x))y=x+\operatorname{Sublayer}(\operatorname{Norm}(x)).

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 dd caractéristiques de chaque token indépendamment, sans traverser le lot ni les positions. Pour un token xx, elle calcule γ(xμ)/v+ϵ+β\gamma\odot(x-\mu)/\sqrt{v+\epsilon}+\beta, avec μ=d1ixi\mu=d^{-1}\sum_i x_i et v=d1i(xiμ)2v=d^{-1}\sum_i(x_i-\mu)^2. RMSNorm calcule plutôt γx/d1ixi2+ϵ\gamma\odot x/\sqrt{d^{-1}\sum_i x_i^2+\epsilon} dans sa forme usuelle sans biais. Pour x=[1,3]x=[1,3], une échelle unitaire, un biais nul et en négligeant epsilon dans cet exemple arithmétique, LayerNorm donne [1,1][-1,1] et RMSNorm donne [1,3]/5[1,3]/\sqrt5. 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 dd, 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.

MéthodeOù elle agitLimite
vecteur de position absolueajouté à la représentation du tokenl’extrapolation et les limites varient
biais relatifmodifie le score d’attentiondépend de la forme ou de la fenêtre du biais
RoPEfait pivoter les paires Q/K pour encoder la position relative dans les produits scalairesla base, le scaling et l’extrapolation doivent être précisés
biais de type ALiBibiais du score dépendant de la distancebiais inductif particulier, pas une solution toujours supérieure

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

ComposantTransformer originalCertaines implémentations decoder-only modernes
topologieencoder–decoderpile de decoders causaux
normalisationPost-LayerNormPre-RMSNorm ou Pre-LayerNorm
positionabsolue sinusoïdaleRoPE ou biais relatif
FFNReLUGELU, SwiGLU/GEGLU, parfois MoE
têtesMHAMHA, MQA ou GQA
kernelmatrices conventionnellesSDPA fusionné, FlashAttention

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, n=128n=128, d=512d=512 et h=8h=8, on obtient dh=64d_h=64 :

Q/K/V: [2, 8, 128, 64]
attention scores: [2, 8, 128, 128]
concatenated output: [2, 128, 512]

Pour batch=1, n=4096n=4096 et huit têtes, les scores contiennent :

8×40962=134,217,7288\times4096^2=134{,}217{,}728

é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é htRdh_t\in\mathbb R^d à chaque position, pas un identifiant de token. Une projection de vocabulaire WvocabRd×VW_{\mathrm{vocab}}\in\mathbb R^{d\times|\mathcal V|} donne les logits zt=WvocabTht+bz_t=W_{\mathrm{vocab}}^Th_t+b. 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.

Explorer les liensOuvrir le réseau