Aller au contenu

Les briques d'un réseau de neurones

Ce chapitre décrit les cinq composants élémentaires qu'on retrouve dans chaque couche de Kimi K3. Aucun n'est propre aux LLM ; tous sont indispensables pour lire les formules de l'architecture.

1. La couche linéaire

\[ \mathbf{y} = \mathbf{W}\mathbf{x} + \mathbf{b} \]

\(\mathbf{W}\) est une matrice de poids appris, \(\mathbf{b}\) un vecteur de biais.

Intuition

Une couche linéaire recombine les coordonnées de l'entrée. Chaque coordonnée de sortie est une moyenne pondérée de toutes les coordonnées d'entrée. Le modèle apprend les pondérations.

Deux points de vocabulaire utilisés dans le rapport :

  • Projection montante / descendante (up / down projection) : une matrice qui augmente ou réduit la dimension. Kimi K3 utilise \(\mathbf{W}^{\downarrow} : \mathbb{R}^{7168} \to \mathbb{R}^{3584}\) pour entrer dans l'espace latent des experts, et \(\mathbf{W}^{\uparrow}\) pour en ressortir.
  • Rang faible (low-rank) : au lieu d'une matrice \(m \times n\), on utilise le produit de deux matrices \(m \times r\) et \(r \times n\) avec \(r \ll m,n\). Coût : \(r(m+n)\) au lieu de \(mn\). Kimi K3 l'utilise pour les projections de requête MLA (q_lora_rank: 1536) et de clé-valeur (kv_lora_rank: 512).

Erreur fréquente

Confondre « rang faible » et « approximation grossière ». Un rang faible est une contrainte de conception délibérée qui réduit paramètres et mémoire. Kimi K3 fait d'ailleurs le mouvement inverse pour ses portes de sortie : il remplace la porte de rang faible de Kimi Linear par une projection de rang plein, jugée plus expressive (voir KDA).

2. Les fonctions d'activation

Une pile de couches linéaires reste linéaire : \(\mathbf{W}_2(\mathbf{W}_1\mathbf{x}) = (\mathbf{W}_2\mathbf{W}_1)\mathbf{x}\). Sans non-linéarité, un réseau de 93 couches équivaudrait à une seule matrice. Les activations brisent cette linéarité.

Fonction Formule Comportement
Sigmoïde \(\sigma(x) = \dfrac{1}{1+e^{-x}}\) Écrase dans \((0,1)\) — sert de « vanne »
Tanh \(\tanh(x)\) Écrase dans \((-1,1)\), symétrique
Swish (SiLU) \(x\,\sigma(x)\) Quasi linéaire pour \(x\) grand positif, tend vers 0 en négatif
Softplus \(\log(1+e^x)\) Version lisse et positive de ReLU

La sigmoïde est omniprésente chez Kimi K3, non pas comme activation mais comme porte (gate) : un nombre entre 0 et 1 qui décide quelle fraction d'un signal laisser passer. On la retrouve dans \(\beta_t\) (force d'écriture de KDA), dans les portes de sortie de KDA et de MLA, et dans le routeur MoE.

3. Les unités à porte (GLU) — et pourquoi SiTU-GLU existe

Le bloc de traitement par position d'un Transformer moderne n'est pas un simple \(\mathbf{W}_2\,\phi(\mathbf{W}_1\mathbf{x})\) mais une unité linéaire à porte :

\[ \operatorname{GLU}(\mathbf{x}) = \underbrace{\sigma(\mathbf{W}_g\mathbf{x})}_{\text{porte}} \odot \underbrace{\mathbf{W}_u\mathbf{x}}_{\text{valeur}} \]

où \(\odot\) est le produit coordonnée par coordonnée (produit de Hadamard). La branche « porte » décide, coordonnée par coordonnée, quelle part de la branche « valeur » passe.

SwiGLU, le standard depuis 2020, remplace la sigmoïde par Swish :

\[ \operatorname{SwiGLU}(\mathbf{x}) = \left[\mathbf{W}_g\mathbf{x} \odot \sigma(\mathbf{W}_g\mathbf{x})\right] \odot \mathbf{W}_u\mathbf{x} \]

Le problème que Kimi K3 corrige

Dans SwiGLU, les deux facteurs sont non bornés. Si une coordonnée de \(\mathbf{W}_g\mathbf{x}\) vaut 50 et la coordonnée correspondante de \(\mathbf{W}_u\mathbf{x}\) vaut 40, le produit vaut 2 000. À l'échelle de 2 800 milliards de paramètres, ces valeurs aberrantes deviennent fréquentes et débordent en basse précision.

SiTU-GLU (Sigmoid Tanh Unit GLU), l'innovation de Kimi K3, borne les deux branches avec un plafond doux \(\operatorname{softcap}(x,\beta) = \beta\tanh(x/\beta)\). Détail complet en SiTU-GLU.

4. Les normalisations

LayerNorm et RMSNorm

RMSNorm (Root Mean Square Normalization), utilisé partout chez Kimi K3 :

\[ \operatorname{RMSNorm}(\mathbf{x}) = \frac{\mathbf{x}}{\sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2 + \epsilon}} \odot \mathbf{g} \]
Symbole Rôle
\(d\) Dimension du vecteur
\(\epsilon\) Petite constante pour éviter la division par zéro — rms_norm_eps: 1e-05 chez Kimi K3
\(\mathbf{g}\) Vecteur de gain appris, une valeur par coordonnée

Intuition

RMSNorm ramène l'amplitude du vecteur à une échelle standard, sans toucher à sa direction, puis laisse le modèle réajuster chaque coordonnée via \(\mathbf{g}\). C'est un régulateur d'échelle, pas une transformation de contenu.

RMSNorm est plus simple que LayerNorm (qui soustrait aussi la moyenne) et quasi aussi efficace, pour environ 30 % de calcul en moins.

5. Les connexions résiduelles

Empiler 93 couches pose un problème : le gradient (le signal d'apprentissage) doit remonter de la sortie jusqu'à la couche 1, et il s'atténue à chaque étape. La connexion résiduelle résout cela :

\[ \mathbf{h}_{l+1} = \mathbf{h}_l + f_l(\mathbf{h}_l) \]

Chaque couche calcule une correction \(f_l\) qu'elle ajoute à ce qui existe déjà, au lieu de remplacer. Le gradient dispose alors d'un chemin direct de la sortie à l'entrée (l'identité), et la profondeur devient entraînable.

Le problème que Kimi K3 corrige

L'addition uniforme est un goulot d'étranglement : toute l'information des couches 1 à \(l\) est compressée dans un unique vecteur \(\mathbf{h}_l\). Le rapport fait explicitement l'analogie : c'est le même défaut qu'un RNN dans le temps, et le Transformer avait résolu ce défaut par l'attention.

Attention Residuals (AttnRes) applique le même remède à la profondeur : chaque couche choisit dans quelles couches précédentes puiser, avec des poids dépendant des données. Détail complet en Attention Residuals.

Assemblage : à quoi ressemble une couche de Kimi K3

En combinant ces cinq briques, une couche de Kimi K3 a la forme suivante (version simplifiée, le détail exact est en Vue d'ensemble) :

entrée h
  │
  ├─► [AttnRes] choisit une combinaison des sorties de blocs précédents
  │
  ├─► RMSNorm ─► mélange de jetons (KDA ou Gated MLA) ─► porte sigmoïde ─┐
  │                                                                      │
  ├──────────────────────────────────── addition résiduelle ◄────────────┘
  │
  ├─► RMSNorm ─► Stable LatentMoE (SiTU-GLU dans chaque expert) ─────────┐
  │                                                                      │
  └──────────────────────────────────── addition résiduelle ◄────────────┘

Deux sous-couches, comme dans tout Transformer depuis 2017 : mélange entre jetons (l'attention) puis mélange entre canaux (le FFN, ici remplacé par un MoE).

Vérification de compréhension

Pourquoi une porte sigmoïde plutôt qu'une simple multiplication par un scalaire appris ?

Parce que la porte dépend de l'entrée courante : \(\sigma(\mathbf{W}_g\mathbf{x})\) change à chaque jeton. Un scalaire appris serait fixe. Le rapport emploie l'expression input-dependent précisément pour souligner cette différence.

Que se passerait-il si on retirait toutes les RMSNorm de Kimi K3 ?

L'entraînement divergerait presque certainement. Le rapport documente plusieurs cas : sans la RMSNorm ajoutée avant \(\mathbf{W}^{\uparrow}\) du LatentMoE, la branche routée subit des explosions d'activation dues à la chaîne de quatre multiplications matricielles quasi consécutives.


Chapitre précédent : Vecteurs et embeddings · Chapitre suivant : Le Transformer et l'attention