← Blog

Les dimensions d'un LLM : embedding, couches, attention

Le mot « dimension » revient partout quand on parle de LLM, et il désigne au moins quatre choses différentes. « 3840 dimensions », « 48 couches », « 12 milliards de paramètres » : ce sont trois mesures distinctes qu'on mélange facilement. Cet article démêle ces chiffres sur Gemma 4 12B (gemma-4-12b-it, le modèle en production chez Sover.tech), puis regarde ce qui se passe concrètement à l'intérieur d'une couche. Il fait suite à l'anatomie du fichier de poids.

Une dimension, c'est un axe

Partons de l'image la plus simple. Pour situer un point sur une ligne, un seul nombre suffit : [3.7]. Sur une carte, il en faut deux : [3.7, 1.2]. Dans l'espace, trois : [3.7, 1.2, 8.0]. À chaque axe ajouté, on rajoute un nombre dans la liste de coordonnées.

Au-delà de trois axes, on ne sait plus dessiner, mais mathématiquement rien ne change : ajouter une dimension, c'est juste rajouter un nombre dans la liste. On peut continuer aussi loin qu'on veut. Gemma 4 12B travaille dans un espace à 3840 axes. C'est la valeur de hidden_size, aussi appelée dimension d'embedding.

Un mot est un point dans cet espace

C'est là que ça devient concret. Dans le modèle, chaque token est un point dans cet espace à 3840 axes. Le situer demande donc 3840 nombres. Le vrai point du mot « bonjour », extrait du modèle :

bonjour = [ 0.02759  -0.02759  0.00054  0.02441  -0.02185  ...  encore 3835 nombres  ...  -0.0019 ]

3840 coordonnées, ni plus ni moins. Ce sont ces nombres qui, ensemble, forment le mot pour le modèle.

Le piège à éviter : ces 3840 nombres ne sont pas 3840 sens ni 3840 contextes du mot. Ce sont les 3840 coordonnées d'un seul point. Comme [latitude, longitude, altitude] ne sont pas trois lieux différents, mais un seul lieu situé finement.

L'analogie géographique a une limite qu'il faut garder en tête. Avec [latitude, longitude, altitude], chaque axe a un sens nommable. Dans un embedding, non : les 3840 axes ne correspondent pas à 3840 propriétés identifiables (un « axe du genre », un « axe du temps »). Une propriété est répartie sur de nombreux axes, et chaque axe participe à de nombreuses propriétés à la fois. C'est une représentation distribuée : le sens émerge de la combinaison des 3840 nombres, jamais de la lecture d'un axe isolé.

Quatre « tailles » à ne pas confondre

Quand on dit « les dimensions d'un modèle », on peut parler de choses très différentes. Les quatre chiffres ci-dessous mesurent des grandeurs distinctes. Ce sont les vrais chiffres de Gemma 4 12B.

Terme Ce que ça mesure Gemma 4 12B
Vocabulaire (vocab_size)Combien de tokens différents existent, soit le nombre de points distincts dans l'espace262 144
Dimension d'embedding (hidden_size)Le nombre d'axes, soit la finesse de description de chaque point3 840
Couches (num_hidden_layers)La profondeur de traitement, combien de fois le vecteur est retravaillé48
ParamètresLe total de tous les nombres appris (embeddings + couches), le « 12B »≈ 12 milliards

La nuance à retenir : le vocabulaire dit combien de mots, la dimension d'embedding dit la richesse de description de chaque mot, les couches disent la profondeur du traitement, et les paramètres sont le grand total appris. Le « 12B » d'un modèle, c'est ce dernier chiffre, pas les 3840 ni les 48.

Un point important : ces chiffres décrivent la forme du modèle, pas sa qualité. Un hidden_size plus grand ne fait pas automatiquement un meilleur modèle. À taille comparable, la qualité dépend surtout des données d'entraînement, de l'architecture, de la méthode d'entraînement, de la longueur de contexte et du fine-tuning. Un modèle bien conçu à 1024 dimensions peut battre un modèle médiocre à 3072, selon la tâche.

Comment ça s'empile

Le mot entre sous forme de son point à 3840 nombres, puis traverse les 48 couches. Chaque couche prend le vecteur, le transforme en tenant compte des mots voisins, et passe le résultat à la couche suivante. La forme ne change pas (toujours 3840 nombres en entrée comme en sortie), mais le contenu s'enrichit à chaque étage.

entrée      [3840]   le point brut du token
  couche 0  [3840]   affiné selon le contexte
  couche 1  [3840]
  ...
  couche 47 [3840]
sortie      [3840]   même forme, valeurs teintées par la phrase

C'est ici que le contexte agit. Deux phrases où apparaît le même mot le font ressortir des 48 couches avec des vecteurs différents. Le point de départ est identique (l'embedding est figé dans les poids), le point d'arrivée non. « La souris a mangé le fromage » et « la souris est sans fil » partent du même vecteur pour « souris » et arrivent à deux points éloignés dans l'espace du sens.

Ce qui se passe dans une couche

Une couche fait son travail en deux temps. Prenons la phrase « retirer de l'argent à la banque » et suivons le mot « banque ».

Temps 1, l'attention. Chaque mot regarde les autres et récupère du contexte auprès d'eux. « banque » prête surtout attention à « retirer » et « argent », très peu à « à » et « la ». C'est le mécanisme d'attention : pour chaque token, le modèle calcule un score de pertinence vis-à-vis de tous les autres tokens du contexte, puis en fait une moyenne pondérée. Techniquement, ce sont les projections q_proj, k_proj, v_proj vues dans les tenseurs de l'article précédent qui produisent les requêtes, clés et valeurs de ce calcul.

Temps 2, le recalcul. Chaque fiche se recalcule ensuite dans le bloc feed-forward (gate_proj, up_proj, down_proj), qui applique les connaissances stockées dans les poids. Les 3840 nombres du mot « banque » changent, et son point glisse dans l'espace du sens : d'une position neutre vers la zone « finance, argent, compte », en s'éloignant de la zone « plage, sable ». Le contexte vient de désambiguïser le mot.

Le résultat de ces deux temps devient l'entrée de la couche suivante, qui répète l'opération. Après 48 couches, « banque » n'est plus le mot générique du dictionnaire : c'est la banque de cette phrase précise.

Un détail réel : la grouped-query attention

En regardant le config.json de Gemma 4 12B, on voit num_attention_heads: 16 mais num_key_value_heads: 8. L'attention n'est pas monolithique : elle est découpée en 16 têtes, et chacune a sa propre projection apprise (ses matrices q_proj, k_proj, v_proj). Ce n'est pas un découpage passif du vecteur : chaque tête projette l'espace à sa façon avant de calculer l'attention, ce qui lui permet de capturer un type de relation différent. La grouped-query attention ajoute une économie : les 16 têtes de requête ont chacune leur projection, mais les clés et valeurs ne sont regroupées qu'en 8 (au lieu de 16), partagées entre têtes voisines.

Ce n'est pas un détail cosmétique. Les clés et valeurs sont exactement ce qu'on garde en mémoire pour ne pas les recalculer à chaque token (le KV cache). Diviser leur nombre par deux, c'est diviser d'autant l'empreinte mémoire des conversations en cours. On voit ici comment un choix d'architecture se paye directement en VRAM à l'inférence, ce qui est le sujet du prochain article sur le caractère memory-bound de l'inférence.

À retenir

Un modèle, c'est un immense espace à 3840 axes, peuplé de 262 144 points (les tokens), que l'on fait traverser 48 étages de traitement. « Dimension d'embedding », « vocabulaire », « couches » et « paramètres » mesurent quatre choses différentes qu'il ne faut pas confondre. Et dans chaque couche, deux temps : l'attention qui va chercher le contexte, puis le recalcul qui déplace le mot dans l'espace du sens. Le tout, 48 fois de suite.