SiTU-GLU¶
Sigmoid Tanh Unit GLU — l'activation qui remplace SwiGLU dans tous les FFN de Kimi K3.
Le problème avec SwiGLU¶
SwiGLU est le standard des FFN de LLM depuis 2020 :
Le rapport note d'ailleurs, avec honnêteté, que « une explication complète de son efficacité empirique reste ouverte » — SwiGLU marche, sans qu'on sache vraiment pourquoi.
Le défaut
Les deux facteurs multiplicatifs sont non bornés.
- \(\operatorname{Swish}(z) = z\,\sigma(z) \to z\) quand \(z \to +\infty\) ;
- \(\mathbf{W}_u\mathbf{x}\) est une projection linéaire, donc sans borne.
Si deux grandes coordonnées coïncident, leur produit explose. À l'échelle de 2,8 T de paramètres, ces valeurs aberrantes deviennent statistiquement inévitables, et augmentent le risque de dépassement en arithmétique de basse précision — ce qui est exactement le régime de Kimi K3 (MXFP4/MXFP8).
La solution insuffisante¶
Le GLU original, avec une porte sigmoïde pure, évite l'explosion de la porte. Mais il perd la réponse quasi linéaire du côté positif qui fait la valeur de Swish.
Le cahier des charges
Il faut une activation qui contrôle la croissance des grandes valeurs tout en préservant la réponse locale et positive caractéristique de SwiGLU.
La construction de SiTU-GLU¶
L'outil : le plafond doux (soft cap)
| Régime | Comportement |
|---|---|
| $ | x |
| $ | x |
Développement local :
SiTU-GLU applique ce plafond au facteur linéaire de Swish et, indépendamment, à la branche montante :
Les valeurs chez Kimi K3¶
| Paramètre | Valeur | Confirmation |
|---|---|---|
| \(\beta_1\) (branche porte) | 4 | activation_situ_beta: 4.0 |
| \(\beta_2\) (branche montante) | 25 | activation_situ_linear_beta: 25.0 |
La borne de sortie
Puisque \(|\tanh(z)| < 1\) et \(0 < \operatorname{Sigmoid}(z) < 1\) :
Aucune sortie de FFN ne peut dépasser 100 en valeur absolue, quelle que soit l'entrée. C'est une garantie structurelle, pas statistique.
Les propriétés¶
| Propriété | Énoncé |
|---|---|
| Accord local | Coïncide avec SwiGLU au premier ordre autour de l'origine |
| Cas limite | Redonne SwiGLU exactement quand \(\beta_1, \beta_2 \to \infty\) |
| Borne | \(\|\cdot\|_\infty \le \beta_1\beta_2 = 100\) |
| Queue négative | Conservée : la sigmoïde écrase déjà les négatifs |
Pourquoi \(\beta_1 = 4\) et \(\beta_2 = 25\) — asymétriques ?
La branche porte (Swish) est déjà atténuée par sa sigmoïde du côté négatif et sert de sélecteur : ses valeurs utiles sont de faible amplitude, donc un plafond serré (\(\beta_1 = 4\)) ne gêne pas.
La branche montante porte l'information : la borner trop tôt écraserait du signal utile, d'où \(\beta_2 = 25\), six fois plus permissif.
Le rapport ne détaille pas cette justification ; c'est une lecture cohérente avec les rôles respectifs des deux branches.
Pourquoi un plafond doux plutôt qu'un écrêtage dur¶
On pourrait simplement écrire \(\operatorname{clamp}(x, -\beta, +\beta)\). C'est plus simple et moins cher.
Pourquoi c'est une mauvaise idée
Un écrêtage dur a un gradient exactement nul au-delà du seuil. Un neurone qui sature ne reçoit plus aucun signal d'apprentissage : il est mort, et ne peut plus revenir.
Le plafond \(\tanh\) préserve un gradient non nul partout — décroissant, mais jamais nul. Le rapport : the smooth cap preserves nonzero gradients away from saturation boundaries, which we find to give better training behavior.
C'est une comparaison que l'équipe a explicitement conduite ; le résultat est énoncé en annexe du papier.
Illustration comparative¶
sortie
│
100├─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ borne SiTU-GLU
│ ╱ SwiGLU (non borné, part à l'infini)
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱╱╱─────────────────────── SiTU-GLU (sature à 100)
│ ╱╱
│ ╱╱ ← les deux coïncident ici
└──┴───────────────────────────────────────────────► entrée x
0 100
Près de l'origine, les deux courbes sont indiscernables. C'est tout l'intérêt : changer le comportement uniquement là où il pose problème.
Où SiTU-GLU est utilisé¶
hidden_act: "situ" s'applique à tous les FFN du modèle de langage :
- le FFN dense de la couche 1 ;
- les 2 experts partagés de chacune des 92 couches MoE ;
- les 896 experts routés de chacune des 92 couches MoE.
Soit environ 82 500 instances de SiTU-GLU dans le modèle.
L'encodeur visuel fait exception
MoonViT-V2 utilise gelu_pytorch_tanh, une GELU classique. Il n'a ni la
même échelle ni les mêmes contraintes de précision (il n'est pas quantifié
en MXFP4).
Vérification de compréhension¶
SiTU-GLU coûte-t-il plus cher que SwiGLU ?
Deux tanh supplémentaires par élément. C'est une opération élémentaire
négligeable devant les multiplications matricielles qui l'entourent — le
FFN est massivement limité par le calcul matriciel, pas par les activations.
Le surcoût est de l'ordre du pour cent.
Si SiTU-GLU est meilleur, pourquoi personne ne l'utilisait avant ?
Parce que le problème qu'il résout n'apparaît qu'à la conjonction de trois conditions : très grande échelle, arithmétique de très basse précision (MXFP4), et chaîne de matrices mal conditionnée (LatentMoE). En BF16 sur un modèle de 70 G, SwiGLU ne pose pas de problème pratique.
C'est un rappel général : les innovations d'architecture sont souvent des réponses à des contraintes de régime, pas des améliorations absolues.
Quelle est la valeur de SiTU-GLU en \(x = 2\), avec \(\beta_1=4, \beta_2=25\) ?
Branche porte : \(4\tanh(0{,}5) \times \sigma(2) = 4 \times 0{,}462 \times 0{,}881 = 1{,}628\). SwiGLU donnerait \(2 \times 0{,}881 = 1{,}762\). Branche montante : \(25\tanh(0{,}08) = 1{,}996\), contre 2 pour la version linéaire. L'écart est de l'ordre de 8 % sur la porte et 0,2 % sur la branche montante — négligeable, comme attendu près de l'origine.
Chapitre précédent : Stable LatentMoE · Chapitre suivant : Quantile Balancing