- Remplacer Layer Norm/RMSNorm, utilisées comme des composants indispensables dans les Transformers, par Dynamic Tanh (DyT) peut offrir des performances comparables, voire supérieures, à celles des modèles classiques avec normalisation
- DyT est une opération élément par élément de la forme
DyT(x) = tanh(αx), née de l’observation que la Layer Normalization, dans les Transformers, produit souvent un mappage entrée-sortie en S similaire à tanh
- L’implémentation tient en quelques lignes de PyTorch, avec des paramètres apprenables
alpha, weight et bias qui appliquent une mise à l’échelle et un biais à la sortie de tanh(alpha * x)
- L’évaluation couvre un large éventail de modèles de vision, langage, parole et modélisation de séquences ADN : ViT, ConvNeXt, MAE, DINO, DiT, LLaMA, wav2vec 2.0, HyenaDNA, Caduceus
- Sans réglage d’hyperparamètres supplémentaire, les résultats sont comparables ou meilleurs que ceux des variantes fondées sur la normalisation dans plusieurs configurations, ce qui remet en question l’idée qu’une couche de normalisation soit indispensable
Ce que Dynamic Tanh change
- DyT est une couche simple qui remplace Layer Norm ou RMSNorm dans les blocs Transformer
- L’opération centrale est
DyT(x) = tanh(αx), appliquée élément par élément
- Cela montre qu’un Transformer sans couche de normalisation peut atteindre des performances comparables, voire supérieures, à celles d’un Transformer classique avec normalisation
- L’idée part de l’observation que la Layer Normalization dans les Transformers produit souvent une relation entrée-sortie proche d’une fonction tanh mise à l’échelle
Méthode d’implémentation
- Le module DyT peut être implémenté brièvement en PyTorch
class DyT(nn.Module):
def __init__(self, num_features, alpha_init_value=0.5):
super().__init__()
self.alpha = nn.Parameter(torch.ones(1) * alpha_init_value)
self.weight = nn.Parameter(torch.ones(num_features))
self.bias = nn.Parameter(torch.zeros(num_features))
def forward(self, x):
x = torch.tanh(self.alpha * x)
return x * self.weight + self.bias
alpha est un paramètre apprenable, avec une valeur initiale fixée à 0.5
weight et bias sont eux aussi des paramètres apprenables, appliqués à la sortie de tanh(alpha * x)
Observation issue de la Layer Normalization
- La Layer Normalization (LN) d’un Transformer génère un mappage entrée-sortie proche d’une fonction
tanh mise à l’échelle
- Dans les premières couches, ce mappage reste globalement proche d’un comportement linéaire
- Plus on va en profondeur, plus la courbe en S caractéristique de
tanh devient marquée
- Les observations incluent des couches LN sélectionnées de Vision Transformer (ViT), du modèle Transformer vocal wav2vec 2.0, et de Diffusion Transformer (DiT)
Portée de l’évaluation et résultats
- DyT a été évalué sur plusieurs architectures et tâches
- Vision supervisée : ViT, ConvNeXt
- Vision auto-supervisée : MAE, DINO
- Modèles de diffusion : DiT
- Grands modèles de langage : LLaMA
- Parole auto-supervisée : wav2vec 2.0
- Modélisation de séquences ADN : HyenaDNA, Caduceus
- Dans tous les cas, les Transformers utilisant DyT affichent des performances comparables ou supérieures à leurs équivalents fondés sur la normalisation
- Le champ d’évaluation est large : de la reconnaissance à la génération, du supervisé à l’auto-supervisé, de la vision par ordinateur aux modèles de langage
Références
- Download Paper: article contenant tous les détails de la recherche
- View on GitHub: dépôt pour consulter les détails de l’implémentation
- View Summary: bref résumé des résultats de la recherche
Transformers without Normalization est accepté comme article de CVPR 2025
1 commentaires
Avis sur Hacker News
Ajuster alpha n’a pas eu beaucoup d’effet, donc il faudra peut-être un réglage conséquent des hyperparamètres ou une initialisation plus sophistiquée. J’ai essayé à la fois l’initialisation par défaut de PyTorch et une initialisation orthogonale, sans différence.
Ou bien l’optimiseur scalaire que j’utilise n’est peut-être pas adapté. J’utilise un optimiseur scalaire custom qui converge plus vite qu’Adam, mais sur les couches DyT il semblait seulement au niveau d’Adam.
Ou alors c’est peut-être une approche qui ne rattrape son retard qu’après des dizaines de milliards de tokens, mais je n’ai pas le budget pour tester aussi longtemps.
Pouvoir remplacer ce type de couche aiderait à réduire assez fortement le coût de calcul.
tanh aura sûrement aussi d’autres effets. La normalisation résout parfois des problèmes de conditionnement. Malgré tout, avoir davantage d’alternatives est une bonne chose.
Je recommande l’article original sur ResNet de Kaiming He et al., ainsi que les articles qui ont suivi.
Pour une approche moderne des RNN, l’article de DeepMind https://arxiv.org/abs/2303.06349 vaut la peine d’être lu.
L’essentiel est que la plus grande valeur propre, c’est-à-dire le rayon spectral, soit proche de 1. Cela signifie que l’application répétée d’une transformation linéaire ne fait ni croître ni décroître les activations.
y = x + f(x).LNinputetLNoutputtout en ajoutant des poids et biais aprèstanh(a*x).Pour voir la similarité, il me semble qu’il faudrait comparer avec la sortie de LayerNorm une fois les poids et biais retirés.
Si le résultat final est bon, peu importe, mais en isolant uniquement la partie effectivement remplacée, on comprendrait mieux ce qui se passe.