GELU (Gaussian Error Linear Unit)
GELU (unidad lineal de error gaussiano) escala cada entrada mediante la función de distribución acumulada normal; es una función de activación suave que se usa en BERT, GPT-2 y los Transformers de visión. Incluye código.
La unidad lineal de error gaussiana (GELU) es una función de activación definida como GELU(x) = x · Φ(x), donde Φ es la función de distribución acumulada de la distribución normal estándar. Pondera cada entrada según la probabilidad de que una variable normal estándar sea menor que ella, de modo que las entradas positivas grandes pasan casi sin cambios, las negativas grandes se aproximan a cero y las entradas cercanas a cero se reducen aproximadamente a la mitad. Dan Hendrycks y Kevin Gimpel la presentaron en el artículo de 2016 Unidades lineales de error gaussianas (GELU). GELU se convirtió en la activación estándar de modelos Transformer como BERT, GPT-2, GPT-3 y el Transformer de visión (ViT), donde se sitúa entre las dos capas lineales de cada bloque feed-forward.
Cómo funciona GELU#
Hendrycks y Gimpel derivaron GELU a partir de la regularización estocástica. Imagina multiplicar cada entrada x por una máscara aleatoria que la conserva con probabilidad Φ(x) y la convierte en cero en caso contrario, como dropout con una probabilidad de conservación que aumenta con la entrada. GELU es el valor esperado de esa operación, Φ(x) · x, por lo que regula suavemente las entradas según su valor, mientras que ReLU las regula bruscamente según su signo.
La curva resultante tiene tres propiedades importantes para el entrenamiento:
- Suavidad en todo el dominio: GELU y su derivada son continuas, sin ningún ángulo en cero, así que pequeños cambios en los pesos producen pequeños cambios en la salida durante la retropropagación.
- No monótona: Para las entradas negativas, la salida primero disminuye y después vuelve a subir hacia cero, hasta alcanzar un mínimo de aproximadamente −0,17 en x ≈ −0,75.
- Gradiente para entradas negativas: Las unidades con entradas moderadamente negativas siguen recibiendo un gradiente, por lo que continúan aprendiendo, a diferencia de las unidades ReLU, que dejarían de hacerlo.
Como Φ incluye la función de error, se utilizan dos aproximaciones habituales. La forma tanh, 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))), se mantiene a menos de 0.0005 de la GELU exacta y se utilizó en GPT-2. La forma sigmoide, x · σ(1.702x), se mantiene a menos de 0.02 y es QuickGELU, la versión utilizada en el CLIP de OpenAI. La función nn.GELU de PyTorch calcula de forma predeterminada la forma exacta y, con approximate="tanh", la forma tanh:
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, -0.75, 0.0, 1.0, 3.0])
# Exact GELU: x * Phi(x), where Phi is the standard normal CDF
exact = nn.GELU()(x)
# Tanh approximation, as used in GPT-2
approx = nn.GELU(approximate="tanh")(x)
print(f"GELU exact: {[round(v, 4) for v in exact.tolist()]}")
print(f"GELU tanh: {[round(v, 4) for v in approx.tolist()]}")
print(f"ReLU: {nn.ReLU()(x).tolist()}")La GELU exacta imprime [-0.004, -0.1587, -0.17, 0.0, 0.8413, 2.996], la forma tanh imprime [-0.0036, -0.1588, -0.17, 0.0, 0.8412, 2.9964] y ReLU imprime [0.0, 0.0, 0.0, 0.0, 1.0, 3.0]. GELU devuelve −0,17 en su mínimo, cerca de −0,75, transforma 1 en 0,8413 porque Φ(1) = 0,8413 y casi coincide con ReLU en ±3. Las dos formas de GELU solo difieren en la cuarta cifra decimal.
Dónde se utiliza GELU#
- Modelos GPT: El primer GPT de OpenAI utilizó GELU en 2018, y GPT-2 y GPT-3 la mantuvieron.
- BERT: BERT, de Google, eligió GELU en lugar de ReLU después de GPT, y la mayoría de los codificadores de estilo BERT todavía la utilizan.
- Transformers de visión: ViT aplica GELU en el MLP de cada bloque codificador, y muchos backbones de visión siguieron su ejemplo, entre ellos ConvNeXt, que sustituyó ReLU por GELU al modernizar ResNet.
- Transformers de detección: En el paquete Ultralytics, el codificador Transformer AIFI de RT-DETR, el Transformer de detección en tiempo real de Baidu, aplica GELU entre sus dos capas feed-forward.
Muchos modelos de lenguaje grandes (LLM) recientes han pasado de GELU simple a capas feed-forward con compuertas. Gemma, de Google, utiliza GEGLU, que multiplica una proyección activada con GELU por una segunda proyección lineal, y Llama, PaLM y Qwen utilizan SwiGLU, basada en SiLU.
GELU y activaciones relacionadas#
- ReLU: max(0, x) es más barata, genera ceros exactos y tiene un ángulo en cero. El artículo sobre GELU informó de mejoras respecto a ReLU y ELU en todas las tareas de visión artificial, procesamiento del lenguaje natural y habla que evaluó.
- SiLU (Swish): x · σ(x) tiene una forma general similar, con un mínimo más profundo de aproximadamente −0,28. GELU es la opción habitual en los Transformers, mientras que SiLU es más común en detectores convolucionales.
- ReLU con fuga: Mantiene una pendiente rectilínea fija para las entradas negativas, mientras que la parte negativa de GELU es una curva que vuelve a cero.
- GEGLU: Esta variante con compuerta añade una segunda proyección aprendida. En la comparación de Noam Shazeer de 2020 sobre T5, las capas feed-forward GEGLU alcanzaron una perplejidad logarítmica de 1,633 en el conjunto de validación, frente a 1,679 para GELU y 1,677 para ReLU con el mismo número de parámetros.










