GELU (Gaussian Error Linear Unit)
A unidade linear de erro gaussiano (GELU) multiplica cada entrada pela função de distribuição acumulada normal; é uma ativação suave usada em BERT, GPT-2 e Transformers de visão. Inclui código.
A unidade linear de erro gaussiana (GELU) é uma função de ativação definida como GELU(x) = x · Φ(x), em que Φ é a função de distribuição acumulada da distribuição normal padrão. Ela pondera cada entrada conforme a probabilidade de uma variável normal padrão assumir um valor abaixo dela: entradas positivas grandes passam quase sem alteração, entradas negativas grandes se aproximam de zero e entradas próximas de zero são reduzidas a cerca da metade. Dan Hendrycks e Kevin Gimpel a apresentaram no artigo de 2016 Unidades lineares de erro gaussianas (GELUs). A GELU se tornou a ativação padrão em modelos Transformer, como BERT, GPT-2, GPT-3 e o Transformer de visão (ViT), nos quais fica entre as duas camadas lineares de cada bloco feed-forward.
Como a GELU funciona#
Hendrycks e Gimpel derivaram a GELU da regularização estocástica. Imagine multiplicar cada entrada x por uma máscara aleatória que a mantém com probabilidade Φ(x) e a zera caso contrário, como o dropout, mas com uma probabilidade de manter que aumenta com a entrada. A GELU é o valor esperado dessa operação, Φ(x) · x, então ela controla suavemente as entradas conforme seus valores, enquanto a ReLU as controla bruscamente conforme seus sinais.
A curva resultante tem três propriedades importantes para o treinamento:
- Suave em todos os pontos: A GELU e sua derivada são contínuas, sem ângulo agudo em zero; assim, pequenas mudanças nos pesos produzem pequenas mudanças na saída durante a retropropagação.
- Não monotônica: Para entradas negativas, a saída primeiro diminui e depois volta a subir em direção a zero, atingindo um mínimo de cerca de −0,17 em x ≈ −0,75.
- Gradiente para entradas negativas: Unidades com entradas moderadamente negativas ainda recebem um gradiente e, por isso, continuam aprendendo, ao contrário das unidades ReLU, que parariam.
Como Φ envolve a função erro, são comuns duas aproximações. A forma tanh, 0.5x(1 + tanh(√(2/π)(x + 0.044715x³))), fica a cerca de 0,0005 da GELU exata e foi usada no GPT-2. A forma sigmoide, x · σ(1.702x), fica a cerca de 0,02 e corresponde à QuickGELU usada no CLIP da OpenAI. A nn.GELU do PyTorch calcula a forma exata por padrão e a forma tanh com approximate="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()}")A GELU exata exibe [-0.004, -0.1587, -0.17, 0.0, 0.8413, 2.996], a forma tanh exibe [-0.0036, -0.1588, -0.17, 0.0, 0.8412, 2.9964] e a ReLU exibe [0.0, 0.0, 0.0, 0.0, 1.0, 3.0]. A GELU produz −0,17 em seu mínimo próximo de −0,75, mapeia 1 para 0,8413 porque Φ(1) = 0,8413 e quase coincide com a ReLU em ±3. As duas formas da GELU diferem apenas na quarta casa decimal.
Onde a GELU é usada#
- Modelos GPT: O primeiro GPT da OpenAI usou GELU em 2018, e o GPT-2 e o GPT-3 também a mantiveram.
- BERT: O BERT do Google escolheu GELU em vez de ReLU seguindo o GPT, e a maioria dos codificadores no estilo BERT ainda a usa.
- Transformers de visão: O ViT aplica GELU no MLP de cada bloco codificador, e muitos backbones de visão seguiram o exemplo, incluindo o ConvNeXt, que substituiu ReLU por GELU ao modernizar o ResNet.
- Transformers de detecção: No pacote Ultralytics, o codificador Transformer AIFI do RT-DETR, o Transformer de detecção em tempo real da Baidu, aplica GELU entre suas duas camadas feed-forward.
Muitos grandes modelos de linguagem (LLMs) recentes passaram da GELU simples para camadas feed-forward com gates. O Gemma do Google usa GEGLU, que multiplica uma projeção ativada por GELU por uma segunda projeção linear, e Llama, PaLM e Qwen usam a SwiGLU, baseada em SiLU.
GELU e ativações relacionadas#
- ReLU: max(0, x) tem menor custo, produz zeros exatos e apresenta um ângulo agudo em zero. O artigo da GELU relatou ganhos sobre ReLU e ELU em todas as tarefas de visão computacional, processamento de linguagem natural e fala que avaliou.
- SiLU (Swish): x · σ(x) tem um formato geral semelhante, com um mínimo mais profundo de cerca de −0,28. A GELU é a escolha habitual em Transformers, enquanto a SiLU é mais comum em detectores convolucionais.
- ReLU com fuga: Mantém uma inclinação linear fixa para entradas negativas, enquanto o lado negativo da GELU é uma curva que retorna a zero.
- GEGLU: A variante com gate adiciona uma segunda projeção aprendida. Na comparação de Noam Shazeer em 2020 com o T5, as camadas feed-forward GEGLU alcançaram uma log-perplexidade de 1,633 em dados reservados, contra 1,679 para GELU e 1,677 para ReLU com a mesma quantidade de parâmetros.










