Curso
As funções de ativação decidem quais sinais passam por uma rede neural e quais não passam. Se você escolhe a errada, seu modelo aprende devagar ou não generaliza. Por anos, ReLU foi a escolha padrão porque era rápida e "boa o suficiente" para a maioria das tarefas.
GELU (Gaussian Error Linear Unit) mudou esse jogo. Hoje, é a função de ativação por trás de alguns dos modelos mais avançados já construídos, incluindo BERT e GPT.
Neste artigo, vou explicar a intuição por trás da GELU, sua fórmula, como ela se compara a outras funções de ativação e onde usá-la na prática.
Se você está começando agora com funções de ativação em machine learning, leia nosso post guia para iniciantes sobre a Rectified Linear Unit (ReLU).
O que é a função de ativação GELU?
GELU, de Gaussian Error Linear Unit, é uma função de ativação que pondera as entradas pela sua magnitude de forma suave e probabilística.
A maioria das funções de ativação decide entre deixar o sinal passar ou bloqueá-lo. ReLU, por exemplo, zera tudo que é negativo e deixa o restante inalterado. A GELU funciona diferente. Em vez de um corte seco, ela escala as entradas de forma contínua conforme são maiores ou menores, o que permite que até pequenos valores negativos ainda contribuam para a saída.
A diferença em relação à ReLU é que a GELU é suave e contínua em toda a faixa. Não há quina em zero nem transições bruscas. Essa suavidade faz diferença no treinamento porque oferece ao otimizador gradientes mais limpos para trabalhar.
Intuição por trás da GELU
Pense na GELU como um filtro que não trata todas as entradas do mesmo jeito.
ReLU é direta: qualquer valor negativo é zerado, sempre. Já a GELU pergunta: “qual é a probabilidade desta entrada ser útil?” Valores claramente grandes e positivos passam quase inalterados. Valores pequenos ou negativos são atenuados, não cortados totalmente.
O resultado é uma curva suave que suprime sinais menos relevantes sem descartá-los por completo.
Imagine que você esteja analisando uma pilha de currículos. Um filtro rígido eliminaria qualquer pessoa sem diploma, sem exceção. Um filtro mais inteligente consideraria candidatos que chegam perto, porque talvez tenham experiência relevante que compense. A GELU funciona como esse filtro mais inteligente. Em vez de cortes rígidos, ela pondera cada entrada pela sua magnitude e decide quanto deixar passar.
Essa escala gradual e probabilística é o que diferencia a GELU. Não há transições bruscas nem neurônios “mortos” — apenas uma decisão contínua de passar ou suprimir feita para cada valor de entrada.
Fórmula da GELU
A fórmula exata da GELU é baseada na função de distribuição acumulada (CDF) Gaussiana, escrita como:

Função de distribuição acumulada Gaussiana
onde x é o valor de entrada e Φ(x) é a probabilidade de uma variável aleatória vinda de uma distribuição normal padrão ser menor ou igual a x. Em outras palavras, Φ(x) indica o quão “normal” ou esperado é o valor de entrada — e essa probabilidade é o que a GELU usa para escalonar a entrada.
Quanto maior a entrada, mais perto de 1 fica Φ(x), o que significa que a entrada passa quase inalterada. Quanto menor a entrada, mais perto de 0 fica Φ(x), e a entrada é suprimida.
A aproximação usada na prática
O problema da fórmula exata é que calcular Φ(x) é caro. Ela envolve a função erro, que não tem forma fechada simples e é lenta para computar em escala.
Frameworks de deep learning usam esta aproximação:

Fórmula de aproximação da GELU
Essa aproximação usa tanh, que é rápida e bem suportada no hardware atual. O resultado é praticamente idêntico à fórmula exata na faixa de entradas que mais importa na prática, por isso frameworks como PyTorch e TensorFlow a usam por padrão.
Claro, você não precisa memorizar nenhuma das duas. Mas saber que a aproximação existe — e por quê — ajuda a entender o que acontece quando você chama GELU no seu código.
GELU vs. outras funções de ativação
Cada função de ativação lida com as entradas de um jeito diferente, e essas diferenças impactam diretamente a qualidade do treinamento do seu modelo.
Veja primeiro a diferença visual antes de explicarmos em texto:

Gráfico: GELU versus outras funções de ativação
Sigmoid
Sigmoid comprime todas as entradas para o intervalo entre 0 e 1. É suave, mas tem um problema famoso: gradientes que desaparecem. Para entradas muito grandes ou muito pequenas, o gradiente se aproxima de zero, e camadas mais profundas param de aprender. A GELU não sofre tanto com isso porque mantém gradientes relevantes em uma faixa mais ampla de entradas.
Tanh
Tanh é parecida com a Sigmoid, mas centralizada em zero, com saídas entre -1 e 1. Lida melhor com valores negativos do que a Sigmoid, mas ainda sofre com gradientes que desaparecem nos extremos. A GELU produz uma curva de saída mais suave, com melhor fluxo de gradiente em redes profundas.
ReLU
ReLU é rápida e simples: valores positivos passam inalterados, valores negativos são zerados. O corte abrupto em zero causa o problema do neurônio “morto” — neurônios que recebem valores negativos por muito tempo deixam de atualizar. A GELU evita isso ao atenuar entradas negativas em vez de cortá-las.
Leaky ReLU
A Leaky ReLU corrige o neurônio “morto” deixando uma fração pequena dos valores negativos passar. É um avanço em relação à ReLU, mas a transição em zero ainda é abrupta. A GELU gera uma curva mais contínua, o que tende a funcionar melhor em arquiteturas profundas, onde a qualidade do gradiente importa mais.
Resumindo, aqui estão as diferenças entre essas cinco funções de ativação:

Tabela: GELU versus outras funções de ativação
Por que a GELU é usada em transformers
Transformers são redes neurais profundas. E quanto mais profunda a rede, mais a qualidade do gradiente importa.
Modelos como BERT e GPT empilham dezenas de camadas. Nessa profundidade, pequenos problemas de fluxo de gradiente se acumulam. Se sua função de ativação gera gradientes instáveis ou próximos de zero em certas regiões, as primeiras camadas mal atualizam durante o treinamento — e não aprendem quase nada.
A GELU evita isso mantendo gradientes suaves e não nulos em uma faixa mais ampla de entradas. Não há um corte como o zero da ReLU, então o otimizador recebe sinais mais limpos em todas as camadas, não só nas próximas da saída.
Há ainda outro motivo pelo qual a GELU encaixa bem em arquiteturas de transformer.
Transformers processam entradas por mecanismos de atenção que produzem uma ampla faixa de valores de ativação — positivos e negativos. Uma função de ativação suave lida melhor com essa variação do que uma com transições bruscas.
Quando o artigo original do BERT foi publicado, os autores escolheram GELU em vez de ReLU e relataram melhores resultados nos benchmarks. O GPT seguiu a mesma escolha. Desde então, a GELU virou padrão na maioria das arquiteturas baseadas em transformer — não por ser “nova”, mas porque funciona melhor na escala em que esses modelos operam.
GELU na prática
Usar GELU nos seus modelos é tão fácil quanto qualquer outra função de ativação. Tanto PyTorch quanto TensorFlow têm suporte nativo.
PyTorch
No PyTorch, você pode aplicar GELU como módulo independente ou inline na definição do modelo. Aqui vai um bloco feedforward simples usando GELU:
import torch
import torch.nn as nn
class FeedForwardBlock(nn.Module):
def __init__(self, input_dim, hidden_dim):
super().__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.act = nn.GELU()
self.fc2 = nn.Linear(hidden_dim, input_dim)
def forward(self, x):
return self.fc2(self.act(self.fc1(x)))
block = FeedForwardBlock(input_dim=512, hidden_dim=2048)
x = torch.randn(8, 512)
output = block(x)
nn.GELU() fica entre as duas camadas lineares — exatamente onde você a encontra no sublayer feedforward de um transformer. A ativação roda após a primeira projeção e antes da segunda.
TensorFlow
No TensorFlow, a GELU está disponível via API do Keras:
import tensorflow as tf
from tensorflow import keras
model = keras.Sequential([
keras.layers.Dense(2048, input_shape=(512,)),
keras.layers.Activation("gelu"),
keras.layers.Dense(512)
])
x = tf.random.normal((8, 512))
output = model(x)
Você também pode passá-la diretamente como string para a camada Dense:
keras.layers.Dense(2048, activation="gelu")
As duas abordagens produzem o mesmo resultado.
Onde a GELU entra na rede
A GELU fica no mesmo lugar de qualquer função de ativação — logo após uma transformação linear e antes da próxima camada. Em transformers, isso significa dentro do sublayer feedforward, entre as duas projeções densas. Em outras redes profundas, coloque-a após a camada linear ou convolucional para escalonar a saída antes de avançar.
Vantagens da GELU
Se você chegou até aqui, já sabe os principais diferenciais da GELU em relação a outras funções de ativação. Aqui vai um resumo:
- Ativação suave: a GELU gera uma curva contínua e diferenciável, sem transições bruscas, o que fornece informações mais limpas ao otimizador em cada passo.
- Melhor fluxo de gradiente: a GELU não zera entradas negativas, então os gradientes ainda se propagam por neurônios que recebem valores negativos. Isso reduz o risco de neurônios “morrerem” durante o treinamento.
- Melhor desempenho em modelos profundos: em arquiteturas profundas como transformers, o efeito cumulativo de gradientes mais suaves tende a se traduzir em melhores resultados de treinamento quando comparado a funções mais simples.
Limitações da GELU
A GELU não é a melhor escolha para todo cenário. Veja algumas limitações que você precisa considerar:
-
Mais cara de computar do que a ReLU: a GELU envolve a função erro ou uma aproximação baseada em
tanh, ambas mais custosas do que o limiar simples da ReLU. Em modelos grandes, isso pode pesar. -
Menos intuitiva: funções como a ReLU são fáceis de entender — valores positivos passam, negativos não. A escala probabilística da GELU é menos direta de interpretar.
-
Nem sempre necessária: para redes rasas ou tarefas simples, a GELU raramente traz vantagens significativas. ReLU ou Leaky ReLU costumam ter desempenho semelhante com menor custo computacional.
Concluindo: se você está construindo um transformer ou outra arquitetura profunda, a GELU é uma ótima padrão. Para o restante, faça benchmarks antes de adotar.
Conclusão
A GELU não é um upgrade universal, nem uma solução única que substitui a ReLU. É uma escolha de design deliberada que vale a pena em contextos específicos — pense em redes profundas e modelos do tipo transformer.
Se você trabalha com BERT, GPT ou qualquer modelo baseado em transformer, provavelmente já está usando GELU — agora você sabe o porquê.
Para tudo mais, a escolha da função de ativação envolve trade-offs. Nenhuma vence sempre, e entender o que cada uma faz é o que permite decidir com confiança — e não por hábito.
Se ainda está em dúvida sobre as diferenças entre funções de ativação, inscreva-se na nossa Machine Learning Engineer Track para ficar pronto para a carreira em machine learning e MLOps.
Torne-se um cientista de ML
FAQs
O que é a função de ativação GELU?
GELU, ou Gaussian Error Linear Unit, é uma função de ativação usada em redes neurais. Diferente da ReLU, a GELU escala suavemente as entradas com base na sua magnitude usando uma abordagem probabilística. Isso a torna mais adequada para arquiteturas profundas, onde a qualidade do gradiente é crítica.
Como a GELU é diferente da ReLU?
A ReLU zera todas as entradas negativas com um corte seco em zero, o que pode fazer neurônios pararem de aprender — o problema dos neurônios “mortos”. A GELU evita isso ao reduzir gradualmente as entradas negativas em vez de cortá-las. O resultado é um fluxo de gradiente mais suave e melhor desempenho em redes profundas.
Quando devo usar GELU em vez de outras funções de ativação?
A GELU funciona melhor em arquiteturas profundas, especialmente em modelos baseados em transformer como BERT e GPT. Para redes rasas ou tarefas simples, o custo computacional raramente compensa a troca da ReLU. Comece com a ReLU como baseline e, se necessário, teste alternativas.
Qual é a diferença entre a fórmula exata da GELU e a aproximação?
A fórmula exata da GELU usa a função de distribuição acumulada Gaussiana, que requer calcular a função erro — uma operação lenta em escala. A aproximação a substitui por uma expressão baseada em tanh, mais rápida e bem suportada no hardware atual. Na prática, as duas produzem resultados quase idênticos, por isso a maioria dos frameworks usa a aproximação por padrão.
A GELU funciona tanto no PyTorch quanto no TensorFlow?
Sim, ambos os frameworks suportam GELU. No PyTorch, você pode usar nn.GELU() como um módulo na definição do modelo. No TensorFlow, você pode passar "gelu" como string no argumento activation de qualquer camada ou usar keras.layers.Activation("gelu").



