La función SELU (Scaled Exponential Linear Unit) es la activación que permite que una red profunda se normalice a sí misma, sin necesidad de batch normalization. Es una ELU multiplicada por un factor de escala mayor que 1, y ese detalle aparentemente pequeño tiene una consecuencia enorme: si eliges bien las constantes, las activaciones mantienen media cero y varianza uno a medida que atraviesan las capas. A eso se le llama autonormalización. La misma explicación está disponible en inglés.

Fórmula clave $\operatorname{SELU}(x) = \lambda\,\operatorname{ELU}(x)$

Puntos clave

  • La función SELU se define como SELU(x) = λ · ELU(x), es decir, una ELU escalada por un factor λ mayor que 1.
  • Sus dos constantes tienen valores fijos y muy precisos: λ ≈ 1,0507 y α ≈ 1,6733, calculados para que las activaciones converjan hacia media cero y varianza uno.
  • Fue presentada por Klambauer, Unterthiner, Mayr y Hochreiter en 2017, con un apéndice de más de 90 páginas de demostraciones matemáticas.
  • Para que la autonormalización funcione hace falta la inicialización LeCun (varianza 1/n) y, si usas dropout, la variante alpha-dropout.
  • Su valor de saturación negativa es −λα ≈ −1,7581, un límite inferior que estabiliza la varianza de la señal.

¿Qué es SELU?

SELU es una función de activación, la operación no lineal que se aplica al resultado z = Wx + b de cada neurona antes de pasarlo a la capa siguiente. Sin esa no linealidad, apilar capas no serviría de nada: una pila de transformaciones lineales sigue siendo lineal. Si quieres situar esta pieza dentro del conjunto, el mapa de las matemáticas de las redes neuronales explica dónde encaja cada función.

Lo que distingue a SELU no es su forma, casi idéntica a la de una ELU, sino su propósito. La mayoría de las activaciones se limitan a introducir no linealidad. SELU va un paso más allá: está diseñada para controlar la media y la varianza de las activaciones capa tras capa. Ese control es lo que da nombre a las redes autonormalizadas (Self-Normalizing Networks, o SNN).

Fórmula y las constantes lambda y alfa

La definición reutiliza la ELU y le añade un factor de escala:

$$\operatorname{SELU}(x) = \lambda \begin{cases} x & \text{si } x > 0 \ \alpha\,(e^x-1) & \text{si } x \le 0 \end{cases}$$

La parte entre paréntesis es exactamente una ELU con parámetro $\alpha$. La novedad es el factor $\lambda$ que multiplica todo. Sus valores no son libres: se obtienen resolviendo las ecuaciones de punto fijo que garantizan la autonormalización, y valen $\lambda \approx 1{,}0507009873554805$ y $\alpha \approx 1{,}6732632423543772$.

Con números concretos: $\operatorname{SELU}(1) \approx 1{,}0507$, $\operatorname{SELU}(0) = 0$ y $\operatorname{SELU}(-2) \approx -1{,}5202$. Fíjate en dos cosas. Para entradas positivas, la pendiente es $\lambda \approx 1{,}0507$, ligeramente mayor que 1, así que la señal se amplifica un poco. Para entradas muy negativas, la salida tiende a $-\lambda\alpha \approx -1{,}7581$, un suelo que impide que la varianza se dispare. Ese equilibrio entre amplificar y saturar es el corazón del mecanismo.

El valor $-\lambda\alpha \approx -1{,}7581$ actúa como suelo de saturación: por muy negativa que sea la entrada, la salida de SELU nunca baja de ahí. Ese límite inferior acotado es justo lo que impide que la varianza de las activaciones crezca sin control.

SELU hereda la derivada de la ELU, escalada por $\lambda$: vale $\lambda$ en la zona positiva y $\lambda\alpha\,e^x$ en la negativa, así que nunca se anula y el gradiente siempre fluye.

Ver la derivación de la derivada

Como $\operatorname{SELU}(x) = \lambda\,\operatorname{ELU}(x)$, basta derivar la ELU y multiplicar por $\lambda$. Para $x > 0$ la ELU es $x$, cuya derivada es $1$; para $x \le 0$ es $\alpha(e^x-1)$, cuya derivada es $\alpha\,e^x$. Multiplicando por $\lambda$: $\dfrac{d}{dx}\,\operatorname{SELU}(x) = \lambda$ si $x > 0$, y $\lambda\alpha\,e^x$ si $x \le 0$. En $x = 0$ ambas ramas valen $\lambda\alpha$, así que la derivada es continua.

Autonormalización

La idea que hace especial a SELU es la del punto fijo. Klambauer y sus coautores demuestran que, si la entrada de una capa tiene media 0 y varianza 1, la salida tras aplicar SELU también tiende a media 0 y varianza 1. En otras palabras, (0, 1) es un punto fijo estable del mapa que transforma media y varianza de una capa a la siguiente. Como escriben los autores, «las activaciones cercanas a media cero y varianza uno que se propagan a través de muchas capas convergen hacia media cero y varianza uno, incluso en presencia de ruido y perturbaciones».

Esto sustituye a la batch normalization. En una red normal, las activaciones tienden a explotar o a desvanecerse a medida que se acumulan las capas, y para evitarlo insertamos capas de normalización que recentran la señal en cada paso. SELU consigue ese mismo efecto por construcción: la normalización está codificada en la propia función. Por eso permite entrenar redes densas de decenas de capas que, con activaciones clásicas, serían inestables.

Requisitos: inicialización LeCun y alpha-dropout

La autonormalización no es magia: solo se cumple si respetas dos condiciones. Es aquí donde muchos experimentos fallan.

La primera es la inicialización LeCun normal: los pesos deben partir de una distribución normal con media 0 y varianza 1/n, donde n es el número de entradas de la neurona. Esa varianza concreta es la que hace que la señal entre en cada capa con la estadística que el punto fijo espera. Si usas la inicialización de He o de Glorot, la garantía se rompe.

La segunda afecta al dropout. El dropout clásico pone a 0 una fracción de las activaciones, lo que altera la media y la varianza y arruina la autonormalización. La solución es el alpha-dropout, que en lugar de fijar a 0 las unidades descartadas las lleva hacia el valor de saturación −λα ≈ −1,7581 y reescala el resto, de modo que la media y la varianza se conservan. En PyTorch tienes ambas piezas listas para usar.

import torch
import torch.nn as nn

selu = nn.SELU()
x = torch.tensor([-2.0, 0.0, 1.0])
print(selu(x))              # tensor([-1.5202,  0.0000,  1.0507])

bloque = nn.Sequential(    # Linear + SELU + AlphaDropout autonormalizado
    nn.Linear(128, 128),
    nn.SELU(),
    nn.AlphaDropout(p=0.1),
)

La salida coincide con los valores que calculamos a mano, una buena forma de comprobar que has entendido la fórmula.

SELU frente a ELU

SELU y ELU comparten la misma curva, pero no el mismo objetivo. La diferencia se resume en el factor λ:

  • ELU (x si x > 0, α(eˣ − 1) si x ≤ 0) tiene pendiente 1 en la zona positiva y satura en −α. Su meta es evitar las neuronas muertas de la ReLU dejando pasar algo de señal negativa.
  • SELU es esa misma ELU multiplicada por λ ≈ 1,0507, con un α fijado en ≈ 1,6733. Su meta añadida es mantener la varianza estable, no solo suavizar la respuesta.

La pendiente positiva mayor que 1 no es un capricho: amplifica ligeramente las activaciones para compensar la contracción que introduce la parte negativa, de forma que la varianza total ni crece ni encoge. En ELU esas constantes son libres; en SELU están calculadas al milímetro para cerrar el ciclo de autonormalización.

Preguntas frecuentes

¿En qué se diferencia SELU de ELU?

SELU es una ELU multiplicada por un factor de escala λ ≈ 1,0507, con el parámetro α fijado en ≈ 1,6733. Ese escalado hace que la pendiente positiva sea mayor que 1 y que las activaciones mantengan media cero y varianza uno a través de las capas, algo que la ELU normal no garantiza.

¿Por qué SELU necesita la inicialización LeCun?

Porque la demostración de la autonormalización supone que la señal llega a cada capa con varianza 1, y eso solo ocurre si los pesos parten de una normal con varianza 1/n. La inicialización LeCun proporciona exactamente esa condición inicial; con He o Glorot, el punto fijo (0, 1) deja de cumplirse.

¿SELU sustituye a la batch normalization?

Esa es su promesa: al normalizar por construcción, una red SELU puede prescindir de las capas de batch normalization. En redes densas profundas funciona muy bien, pero en arquitecturas convolucionales o transformers modernos otras técnicas suelen rendir mejor, así que SELU no ha desplazado del todo a la normalización explícita.

Conclusión

SELU convierte una ELU en un mecanismo de normalización gratuito: basta multiplicarla por λ ≈ 1,0507 y fijar α ≈ 1,6733 para que las activaciones se mantengan en media cero y varianza uno capa tras capa. Entender su fórmula SELU(x) = λ · ELU(x) y sus dos requisitos, la inicialización LeCun y el alpha-dropout, te permite construir redes densas profundas y estables. El siguiente paso natural es comparar esta idea con la función GELU, la activación que dominó en los transformers.

Fuentes

  1. Self-Normalizing Neural Networks, Klambauer et al. (arXiv, 2017)
  2. Rectifier (neural networks) (Wikipedia)
  3. torch.nn.SELU (documentación de PyTorch)
  4. tf.keras.activations.selu (documentación de TensorFlow)

Ruta: La neurona y las funciones de activación