Aller au contenu

Vecteurs, embeddings, espaces de représentation

Du numéro de jeton au vecteur

À la sortie du tokeniseur, un texte est une liste d'entiers : [15, 4302, 91, 7]. Ces entiers n'ont aucune structure utilisable : le jeton n° 4302 n'est pas « plus grand » que le jeton n° 15.

La première couche du modèle, la table d'embeddings, remplace chaque entier par un vecteur de nombres réels appris :

\[ \mathbf{h}_1 = \mathbf{E}[x_t] \in \mathbb{R}^{d} \]
Symbole Signification Valeur chez Kimi K3
\(\mathbf{E}\) Table d'embeddings, matrice \(V \times d\) \(163\,840 \times 7\,168\)
\(V\) Taille du vocabulaire 163 840
\(d\) Dimension cachée du modèle 7 168
\(\mathbf{h}_1\) Vecteur du jeton, entrée de la première couche 7 168 nombres

C'est une simple consultation de table : pas de multiplication, juste une lecture de la ligne \(x_t\). Elle coûte \(V \times d = 1{,}17\) milliard de paramètres chez Kimi K3.

Intuition

Un embedding est une position dans un espace à 7 168 dimensions. Le modèle apprend à y placer les jetons de sorte que la géométrie soit utile : des jetons interchangeables se retrouvent proches, des relations sémantiques deviennent des directions.

Ce qu'on peut faire avec des vecteurs

Deux opérations dominent tout ce qui suit.

Le produit scalaire : mesurer la ressemblance

\[ \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{d} a_i b_i \]

Grand et positif si les deux vecteurs pointent dans la même direction, proche de zéro s'ils sont orthogonaux (« sans rapport »), négatif s'ils s'opposent.

C'est l'unique mécanisme de comparaison utilisé dans l'attention. Quand vous lirez « \(\mathbf{q}^\top \mathbf{k}\) » au chapitre 05, il s'agit exactement de cela : à quel point ce que je cherche ressemble à ce qui est disponible ici.

Le produit matrice–vecteur : transformer

\[ \mathbf{y} = \mathbf{W}\mathbf{x}, \qquad y_i = \sum_{j=1}^{n} W_{ij}\, x_j \]

Une matrice \(\mathbf{W}\) de taille \(m \times n\) transforme un vecteur de dimension \(n\) en un vecteur de dimension \(m\). La quasi-totalité des paramètres d'un LLM sont les coefficients de telles matrices, et la quasi-totalité du calcul est constituée de ces produits.

À retenir

Coût d'un produit matrice–vecteur : \(m \times n\) multiplications-additions. Pour un lot de \(B\) jetons traités ensemble, cela devient une multiplication matrice–matrice de coût \(B \times m \times n\) — précisément l'opération pour laquelle les GPU sont conçus (voir chapitre 11).

Les normes, et pourquoi on normalise

La norme L2 d'un vecteur mesure sa longueur :

\[ \|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^{d} x_i^2} \]

Normaliser, c'est diviser par cette longueur pour ne garder que la direction : \(\hat{\mathbf{x}} = \mathbf{x} / \|\mathbf{x}\|_2\).

Pourquoi c'est central : dans un réseau de 93 couches, les amplitudes des vecteurs peuvent exploser ou s'annuler en se propageant. Un vecteur dont les coordonnées atteignent \(10^5\) déborde de la précision numérique utilisée (voir plus bas) ; un vecteur proche de zéro ne transmet plus d'information.

Kimi K3 utilise massivement la normalisation, à cinq endroits au moins :

  • \(\operatorname{L_2Norm}\) sur les requêtes et clés de KDA ;
  • \(\operatorname{RMSNorm}\) sur la sortie récurrente de KDA ;
  • \(\operatorname{RMSNorm}\) dans les poids d'attention entre couches (AttnRes) ;
  • \(\operatorname{RMSNorm}\) avant la projection montante du LatentMoE ;
  • \(\operatorname{RMSNorm}\) partout dans l'encodeur visuel MoonViT-V2.

Le détail de RMSNorm est au chapitre 04.

La précision numérique : FP32, BF16, FP8, FP4

Un nombre réel est stocké sur un nombre fini de bits. Moins de bits = moins de mémoire et plus de vitesse, mais moins de précision et une plage dynamique plus étroite.

Format Bits Plage approximative Usage chez Kimi K3
FP32 32 \(\pm 10^{38}\) Accumulation, sortie d'attention pendant l'entraînement
BF16 16 \(\pm 10^{38}\), ~3 chiffres significatifs Format de travail par défaut
FP8 8 \(\pm 10^{4}\) environ Activations sauvegardées, blocs quantifiés
MXFP8 8 (+ échelle par bloc) — Activations en post-entraînement
MXFP4 4 (+ échelle par bloc) — Poids des experts MoE

Limite importante

La plage dynamique n'est pas un détail théorique. Le rapport Kimi K3 y consacre plusieurs décisions de conception :

  • le plancher de décroissance \(g_{\min} = -5\) de KDA existe uniquement pour garder un facteur de renormalisation sous \(e^{80}\), dans la plage BF16 ;
  • SiTU-GLU existe pour borner les activations à \(\pm 100\) et éviter les dépassements ;
  • la sortie de l'attention est gardée en FP32 pendant l'entraînement pour corriger une erreur d'arrondi biaisée.

Le « MX » de MXFP4/MXFP8 signifie Microscaling : au lieu d'un facteur d'échelle unique pour tout un tenseur, on en associe un à chaque bloc de 32 valeurs. Cela permet à un format de 4 bits de couvrir des amplitudes très différentes au sein d'une même matrice. La configuration publiée de Kimi K3 confirme group_size: 32, num_bits: 4, symmetric: true.

Ce qui n'est pas quantifié

Le fichier config.json liste explicitement les modules exclus de la quantification MXFP4 :

re:.*self_attn.*          → toutes les projections d'attention
re:.*shared_experts.*     → les experts partagés
re:.*mlp\.(gate|up|down)  → le FFN dense
re:.*lm_head.*            → la projection de sortie
re:.*vision_tower.*       → l'encodeur visuel
re:.*mm_projector.*       → le projecteur multimodal

À retenir

Seuls les poids des 896 experts routés sont en 4 bits. Ce sont eux qui dominent la mémoire (2,72 T des 2,78 T de paramètres). Tout le reste — la partie sensible à la précision — reste en précision supérieure. C'est un choix d'ingénierie, pas une quantification aveugle.

Vérification de compréhension

Pourquoi la dimension cachée de Kimi K3 est-elle restée à 7 168, identique à Kimi K2 ?

Parce que l'élargissement est allé ailleurs : plus de couches (61 → 93), plus d'experts (384 → 896), plus d'experts actifs (8 → 16). Le rapport parle de « scaler le flux d'information » selon trois axes — longueur de séquence, profondeur, largeur — et la largeur a été augmentée par le nombre d'experts plutôt que par \(d\). Voir Vue d'ensemble de l'architecture.

Un embedding de 7 168 dimensions, cela fait combien d'octets en BF16 ?

\(7\,168 \times 2 = 14\,336\) octets, soit 14 Kio par jeton. Pour 1 million de jetons, cela ferait 14 Gio rien que pour les vecteurs d'entrée d'une seule couche — d'où l'importance capitale des mécanismes de cache et de déchargement décrits en infrastructure.


Chapitre précédent : Jetons et tokenisation · Chapitre suivant : Les briques d'un réseau de neurones