SiLU (Sigmoid Linear Unit)
SiLU, también llamada Swish, multiplica una entrada por su sigmoide para obtener una activación suave con compuerta propia. Abarca sus matemáticas, origen y comparación con ReLU.
La unidad lineal sigmoide (SiLU) es una función de activación definida como SiLU(x) = x · σ(x), donde σ es la función sigmoide. Deja casi intactas las entradas positivas grandes, lleva las entradas negativas grandes casi a cero y presenta una transición suave entre ambas, con un mínimo de aproximadamente −0,278 en x ≈ −1,278. SiLU es la misma función que Swish con β = 1, y ambos nombres se utilizan indistintamente. Es habitual como opción predeterminada en modelos convolucionales de visión y, dentro del bloque SwiGLU, también activa las capas prealimentadas de muchos modelos de lenguaje grandes (LLM).
Definición y propiedades#
SiLU multiplica cada entrada por una compuerta, σ(x), cuyo valor está entre 0 y 1 y se calcula a partir de la propia entrada; por eso se denomina autoacotada. Su derivada es σ(x) · (1 + x · (1 − σ(x))), y ambas expresiones confieren a SiLU cuatro propiedades que distinguen su comportamiento durante el entrenamiento del de ReLU:
- Suave en todo el dominio: La curva y su derivada son continuas, sin quiebros en cero, por lo que pequeños cambios en los pesos producen pequeños cambios en la salida, algo adecuado para el descenso del gradiente.
- Gradiente para entradas negativas: Una unidad cuya entrada es negativa sigue recibiendo un gradiente pequeño, por lo que continúa aprendiendo. Las unidades ReLU cuyas entradas se mantienen negativas no reciben ningún gradiente y pueden dejar de aprender para siempre; este fallo se conoce como ReLU moribunda.
- No monótona: La salida disminuye ligeramente a medida que x aumenta desde valores muy negativos hasta aproximadamente −1,28, y después aumenta; por tanto, la función no es monótona.
- Acotada inferiormente y sin cota superior: Las salidas nunca bajan de aproximadamente −0,278 y las entradas positivas pasan sin saturarse, igual que con ReLU, lo que evita el comportamiento de desvanecimiento del gradiente de la sigmoide y la tanh en redes profundas.
El código de PyTorch de abajo calcula SiLU y los gradientes de SiLU y ReLU en cinco puntos.
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), comparada con ReLU para las mismas entradas
silu = F.silu(x)
relu = F.relu(x)
# Gradiente de cada activación con respecto a su entrada
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())Imprime las salidas de SiLU [-0.0719, -0.2785, 0.0, 0.7311, 3.9281], los gradientes de SiLU [-0.0527, -0.0003, 0.5, 0.9277, 1.0527] y los gradientes de ReLU [0.0, 0.0, 0.0, 1.0, 1.0]. En −4, ReLU da una salida de 0 y no transmite ningún gradiente, mientras que SiLU sigue transmitiendo −0,0527. En −1,28, SiLU alcanza su mínimo de −0,2785 con un gradiente prácticamente igual a 0, y en 4 su gradiente supera ligeramente 1.
Origen del nombre#
Hendrycks y Gimpel llamaron unidad lineal sigmoide a x · σ(x) en su artículo de 2016 en el que presentaron GELU. Allí aparecía como una variante de GELU basada en la sigmoide que rendía peor que GELU, pero normalmente mejor que ReLU y ELU. En 2017, Elfwing, Uchibe y Doya utilizaron SiLU para aproximar funciones con redes neuronales en aprendizaje por refuerzo. Ese mismo año, investigadores de Google redescubrieron x · σ(βx) mediante una búsqueda automatizada de funciones de activación, la llamaron Swish e informaron de que sustituir ReLU por ella aumentaba la precisión top-1 de ImageNet un 0,9 % en Mobile NASNet-A y un 0,6 % en Inception-ResNet-v2. PyTorch añadió nn.SiLU en la versión 1.7 con el nombre anterior.
SiLU frente a otras funciones de activación#
- ReLU: max(0, x) es más barata de calcular, produce ceros exactos y tiene un gradiente constante de 1 para entradas positivas. SiLU añade una sigmoide por elemento a cambio de suavidad y gradientes en el lado negativo.
- GELU: x · Φ(x), donde Φ es la función de distribución acumulada normal estándar. Ambas curvas tienen la misma forma, y la SiLU escalada x · σ(1,702x) aproxima GELU con un error inferior a aproximadamente 0,02 en todo el dominio. GELU es la opción habitual en Transformers como BERT y ViT, mientras que SiLU es más común en detectores basados en CNN.
- Sigmoide: σ(x) por sí sola comprime las entradas al intervalo de 0 a 1 y se satura en ambos extremos, por lo que sirve como capa de salida para obtener probabilidades. SiLU la utiliza únicamente como compuerta.
- Hard-Swish: x · ReLU6(x + 3) / 6, una aproximación de SiLU presentada con MobileNetV3 que sustituye la compuerta sigmoide por una función lineal a trozos y evita la exponencial en hardware móvil.
- SwiGLU: Unidad lineal con compuerta que multiplica SiLU(xW) elemento a elemento por una segunda proyección xV. Forma el bloque prealimentado de LLaMA y muchos otros LLM.
Dónde se utiliza SiLU#
SiLU, con el nombre de Swish, es la función de activación de EfficientNet y es habitual en los detectores de objetos modernos en tiempo real. Los modelos Ultralytics YOLO utilizan SiLU desde que YOLOv5 v4.0 sustituyó LeakyReLU y Hardswish por esta función en enero de 2021; en YOLO26, cada bloque Conv consta de una convolución, normalización por lotes y SiLU.










