SiLU (Sigmoid Linear Unit)
SiLU, chiamata anche Swish, moltiplica un input per la sua sigmoide per ottenere un’attivazione regolare con auto-gating. Include la matematica, le origini e un confronto con ReLU.
La Sigmoid Linear Unit (SiLU) è una funzione di attivazione definita come SiLU(x) = x · σ(x), dove σ è la funzione sigmoide. Lascia quasi invariati gli input positivi grandi, porta gli input negativi grandi vicino a zero e varia dolcemente tra i due estremi, raggiungendo un minimo di circa −0.278 in x ≈ −1.278. SiLU è la stessa funzione di Swish con β = 1 e i due nomi sono usati in modo intercambiabile. È un'opzione predefinita comune nei modelli convoluzionali per la visione e, nel blocco SwiGLU, attiva anche i livelli feed-forward di molti modelli linguistici di grandi dimensioni (LLM).
Definizione e proprietà#
SiLU moltiplica ogni input per un gate, σ(x), compreso tra 0 e 1 e calcolato a partire dall'input stesso: per questo si chiama auto-gate. La sua derivata è σ(x) · (1 + x · (1 − σ(x))) e, insieme, queste formule conferiscono a SiLU quattro proprietà che distinguono il suo comportamento durante l'addestramento da quello di ReLU:
- Sempre liscia: la curva e la sua derivata sono continue, senza spigoli in corrispondenza dello zero; così piccole variazioni dei pesi producono piccole variazioni dell'output, una caratteristica adatta alla discesa del gradiente.
- Gradiente per gli input negativi: un'unità il cui input è negativo riceve comunque un piccolo gradiente e continua quindi ad apprendere. Le unità ReLU i cui input restano negativi non ricevono alcun gradiente e possono smettere di apprendere definitivamente: questo problema è noto come ReLU morente.
- Non monotona: l'output diminuisce leggermente mentre x cresce da valori molto negativi fino a circa −1.28, poi aumenta; la funzione non è quindi monotona.
- Limitata inferiormente, illimitata superiormente: gli output non scendono mai sotto circa −0.278 e gli input positivi passano senza saturarsi, come accade con ReLU; si evita così il problema del gradiente evanescente tipico di sigmoide e tanh nelle reti profonde.
Il codice PyTorch seguente calcola SiLU e i gradienti di SiLU e ReLU in cinque punti.
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), a confronto con ReLU sugli stessi input
silu = F.silu(x)
relu = F.relu(x)
# Gradiente di ogni funzione di attivazione rispetto al proprio input
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())Stampa gli output di SiLU [-0.0719, -0.2785, 0.0, 0.7311, 3.9281], i gradienti di SiLU [-0.0527, -0.0003, 0.5, 0.9277, 1.0527] e i gradienti di ReLU [0.0, 0.0, 0.0, 1.0, 1.0]. In −4, ReLU produce 0 e non trasmette alcun gradiente, mentre SiLU ne trasmette ancora −0.0527. In −1.28, SiLU raggiunge il suo minimo di −0.2785 con un gradiente quasi esattamente pari a 0; in 4, il suo gradiente supera leggermente 1.
Origine del nome#
Hendrycks e Gimpel hanno chiamato x · σ(x) Sigmoid Linear Unit nel loro articolo del 2016 che introduceva GELU: vi compariva come variante di GELU basata sulla sigmoide, meno efficace di GELU ma generalmente migliore di ReLU ed ELU. Nel 2017, Elfwing, Uchibe e Doya hanno poi usato SiLU per l'approssimazione di funzioni con reti neurali nell'apprendimento per rinforzo. Nello stesso anno, alcuni ricercatori di Google hanno riscoperto x · σ(βx) tramite una ricerca automatizzata di funzioni di attivazione, l'hanno chiamata Swish e hanno riferito che sostituire ReLU aumentava l'accuratezza top-1 su ImageNet dello 0,9% per Mobile NASNet-A e dello 0,6% per Inception-ResNet-v2. PyTorch ha aggiunto nn.SiLU nella versione 1.7, usando il nome precedente.
SiLU a confronto con altre funzioni di attivazione#
- ReLU: max(0, x) è meno costosa da calcolare, produce zeri esatti e ha un gradiente costante pari a 1 per gli input positivi. SiLU aggiunge una sigmoide per elemento, ottenendo in cambio una curva più regolare e gradienti anche sul lato negativo.
- GELU: x · Φ(x), dove Φ è la funzione di distribuzione cumulativa normale standard. Le due curve hanno la stessa forma e la SiLU scalata x · σ(1.702x approssima GELU con un errore massimo di circa 0.02. GELU è la scelta abituale nei Transformer come BERT e ViT, mentre SiLU è più comune nei rilevatori basati su CNN.
- Sigmoide: σ(x) da sola comprime gli input nell'intervallo da 0 a 1 e si satura a entrambe le estremità, quindi viene usata come livello di output per le probabilità. SiLU la usa soltanto come gate.
- Hard-Swish: x · ReLU6(x + 3) / 6 è un'approssimazione di SiLU introdotta con MobileNetV3. Sostituisce il gate sigmoide con uno lineare a tratti, evitando l'esponenziale sull'hardware mobile.
- SwiGLU: unità lineare con gate che moltiplica elemento per elemento SiLU(xW) per una seconda proiezione xV. Costituisce il blocco feed-forward di LLaMA e di molti altri LLM.
Dove si usa SiLU#
SiLU, con il nome Swish, è la funzione di attivazione usata in tutto EfficientNet ed è comune nei moderni rilevatori di oggetti in tempo reale. I modelli Ultralytics YOLO usano SiLU da quando YOLOv5 v4.0 ha sostituito LeakyReLU e Hardswish con SiLU, nel gennaio 2021; in YOLO26, ogni blocco Conv è composto da convoluzione, normalizzazione del batch e SiLU.










