SiLU (Sigmoid Linear Unit)
SiLU, également appelée Swish, multiplie une entrée par sa sigmoïde pour produire une fonction d’activation lisse à auto-contrôle. Au programme : ses mathématiques, ses origines et une comparaison avec ReLU.
L’unité linéaire sigmoïde (SiLU) est une fonction d’activation définie par SiLU(x) = x · σ(x), où σ est la fonction sigmoïde. Elle laisse presque inchangées les grandes entrées positives, ramène les grandes entrées négatives à une valeur proche de zéro et évolue progressivement entre les deux, avec un minimum d’environ −0,278 pour x ≈ −1,278. SiLU est la même fonction que Swish avec β = 1, et les deux noms sont utilisés indifféremment. C’est une fonction par défaut courante dans les modèles de vision convolutifs et, dans le bloc SwiGLU, elle active aussi les couches feed-forward de nombreux grands modèles de langage (LLM).
Définition et propriétés#
SiLU multiplie chaque entrée par une porte, σ(x), comprise entre 0 et 1 et calculée à partir de l’entrée elle-même, d’où le nom d’auto-gatée. Sa dérivée est σ(x) · (1 + x · (1 − σ(x))) et, ensemble, elles confèrent à SiLU quatre propriétés qui distinguent son comportement à l’entraînement de celui de ReLU :
- Lisse partout : la courbe et sa dérivée sont continues, sans angle en zéro. De petites variations des poids entraînent donc de petites variations de la sortie, ce qui convient à la descente de gradient.
- Gradient pour les entrées négatives : une unité dont l’entrée est négative reçoit tout de même un petit gradient et continue donc d’apprendre. Les unités ReLU dont les entrées restent négatives ne reçoivent aucun gradient et peuvent cesser d’apprendre définitivement ; ce phénomène est appelé « ReLU morte ».
- Non monotone : la sortie diminue légèrement à mesure que x augmente depuis de grandes valeurs négatives jusqu’à environ −1,28, puis augmente ; la fonction n’est donc pas monotone.
- Bornée inférieurement, non bornée supérieurement : les sorties ne descendent jamais sous environ −0,278 et les entrées positives sont transmises sans saturation, comme avec ReLU. Cela évite le problème du gradient évanescent associé à la sigmoïde et à tanh dans les réseaux profonds.
Le code PyTorch ci-dessous calcule SiLU et les gradients de SiLU et de ReLU en cinq points.
import torch
import torch.nn.functional as F
x = torch.tensor([-4.0, -1.28, 0.0, 1.0, 4.0], requires_grad=True)
# SiLU(x) = x * sigmoid(x), comparée à ReLU pour les mêmes entrées
silu = F.silu(x)
relu = F.relu(x)
# Gradient de chaque activation par rapport à son entrée
silu_grad = torch.autograd.grad(silu.sum(), x)[0]
relu_grad = torch.autograd.grad(relu.sum(), x)[0]
print("SiLU output: ", [round(v, 4) for v in silu.tolist()])
print("SiLU gradient:", [round(v, 4) for v in silu_grad.tolist()])
print("ReLU gradient:", relu_grad.tolist())La sortie affiche les résultats de SiLU [-0.0719, -0.2785, 0.0, 0.7311, 3.9281], les gradients de SiLU [-0.0527, -0.0003, 0.5, 0.9277, 1.0527] et les gradients de ReLU [0.0, 0.0, 0.0, 1.0, 1.0]. Pour −4, ReLU renvoie 0 et ne transmet aucun gradient, tandis que SiLU transmet encore −0.0527. Pour −1.28, SiLU atteint son minimum de −0.2785 avec un gradient presque exactement égal à 0, et pour 4, son gradient dépasse légèrement 1.
Origine du nom#
Hendrycks et Gimpel ont nommé x · σ(x) « unité linéaire sigmoïde » dans leur article de 2016 présentant GELU. La fonction y apparaissait comme une variante de GELU basée sur la sigmoïde, moins performante que GELU, mais généralement meilleure que ReLU et ELU. En 2017, Elfwing, Uchibe et Doya ont ensuite utilisé SiLU pour l’approximation de fonctions par des réseaux neuronaux en apprentissage par renforcement. Plus tard cette année-là, des chercheurs de Google ont redécouvert x · σ(βx) grâce à une recherche automatisée de fonctions d’activation, l’ont appelée Swish et ont signalé que remplacer ReLU par cette fonction améliorait de 0,9 % la précision top-1 sur ImageNet pour Mobile NASNet-A, et de 0,6 % pour Inception-ResNet-v2. PyTorch a ajouté nn.SiLU dans la version 1.7, en reprenant le nom antérieur.
SiLU et les autres fonctions d’activation#
- ReLU : max(0, x) est moins coûteuse à calculer, produit des zéros exacts et a un gradient constant de 1 pour les entrées positives. SiLU ajoute une sigmoïde par élément en échange d’une courbe lisse et de gradients du côté négatif.
- GELU : x · Φ(x), où Φ est la fonction de répartition de la loi normale standard. Les deux courbes ont la même forme, et la SiLU mise à l’échelle x · σ(1.702x approche GELU avec un écart inférieur à environ 0.02 partout. GELU est le choix habituel dans les Transformers comme BERT et ViT, tandis que SiLU est plus courante dans les détecteurs basés sur des CNN.
- Sigmoïde : σ(x) seule comprime les entrées dans l’intervalle de 0 à 1 et sature aux deux extrémités ; elle sert donc de couche de sortie pour les probabilités. SiLU l’utilise uniquement comme porte.
- Hard-Swish : x · ReLU6(x + 3) / 6, approximation de SiLU introduite avec MobileNetV3. Elle remplace la porte sigmoïde par une fonction linéaire par morceaux, évitant ainsi le calcul exponentiel sur les appareils mobiles.
- SwiGLU : unité linéaire à portes qui multiplie élément par élément SiLU(xW) par une deuxième projection xV. Elle forme le bloc feed-forward de LLaMA et de nombreux autres LLM.
Utilisations de SiLU#
SiLU, sous le nom Swish, est la fonction d’activation utilisée dans tout EfficientNet et elle est courante dans les détecteurs d’objets modernes en temps réel. Les modèles Ultralytics YOLO utilisent SiLU depuis que YOLOv5 v4.0 a remplacé LeakyReLU et Hardswish par SiLU en janvier 2021. Dans YOLO26, chaque bloc Conv comprend une convolution, une normalisation par lots et SiLU.










