Por que a não linearidade é indispensável
Em uma rede neural, cada camada costuma aplicar duas operações em sequência: (1) uma transformação linear (multiplicação por matriz e soma de viés) e (2) uma função de ativação. A parte linear sozinha não é suficiente para criar modelos expressivos quando empilhamos camadas.
Composição de camadas lineares “colapsa” em uma única camada
Considere duas camadas sem ativação: h = W1 x + b1 e y = W2 h + b2. Substituindo h em y:
y = W2 (W1 x + b1) + b2 = (W2 W1) x + (W2 b1 + b2)Ou seja, duas camadas lineares equivalem a uma única camada linear. Empilhar mais camadas lineares não aumenta a capacidade de representar relações complexas (curvas, fronteiras não lineares, interações). A ativação introduz “dobras” no espaço de representação, permitindo compor funções complexas em redes profundas.
Intuição geométrica: “dobrar e separar”
Uma transformação linear pode apenas rotacionar, escalar e transladar. Já uma ativação não linear pode “achatar” certas regiões, “recortar” outras e criar regiões com comportamentos diferentes. Em redes profundas, essas dobras sucessivas permitem separar classes ou aproximar funções altamente não lineares.
O que observar em uma função de ativação
- Não linearidade: se a função é não linear na maior parte do domínio.
- Saturação: regiões onde a derivada fica muito pequena (gradiente quase zero).
- Regiões lineares: trechos onde a função se comporta aproximadamente como
ax + c, o que ajuda no fluxo de gradiente. - Faixa de saída: limitada (ex.: 0 a 1) ou não limitada (ex.: 0 a infinito).
- Simetria em torno de zero: saídas centradas em zero tendem a facilitar otimização em camadas ocultas.
- Estabilidade numérica: risco de overflow/underflow ao calcular exponenciais e logaritmos.
Comparação prática: sigmoid, tanh, ReLU, Leaky ReLU e softmax
| Ativação | Definição | Saída | Derivada (ideia) | Pontos fortes | Riscos/limitações | Uso típico |
|---|---|---|---|---|---|---|
| Sigmoid | σ(x)=1/(1+e^{-x}) | (0,1) | σ(x)(1-σ(x)) | Interpretação probabilística para saída binária | Satura em |x| alto; gradiente pequeno; não é zero-centered | Saída em classificação binária (com BCE) |
| tanh | tanh(x) | (-1,1) | 1 - tanh^2(x) | Zero-centered; mais “forte” que sigmoid perto de 0 | Satura em |x| alto; gradiente pequeno nas caudas | Camadas ocultas em alguns cenários; RNNs clássicas |
| ReLU | max(0,x) | [0,∞) | 1 (x>0), 0 (x<0) | Região linear ampla; bom fluxo de gradiente no lado positivo; simples | “Neurônios mortos” (x<0 sempre); saída não centrada em zero | Camadas ocultas em MLP/CNN |
| Leaky ReLU | max(αx,x) | (-∞,∞) | 1 (x>0), α (x<0) | Reduz neurônios mortos; mantém gradiente no lado negativo | Escolha de α; pode introduzir pequena inclinação negativa | Camadas ocultas quando ReLU “morre” |
| Softmax | softmax(z_i)=e^{z_i}/∑_j e^{z_j} | Probabilidades que somam 1 | Acoplada entre classes | Distribuição de probabilidade multiclasse | Sensível a escala; precisa de truque numérico | Camada de saída multiclasse (com CE) |
Saturação, regiões lineares e fluxo de gradiente
O que é saturação e por que ela atrapalha
Uma ativação satura quando, para valores grandes (positivos ou negativos), sua saída muda muito pouco ao variar a entrada. Nessas regiões, a derivada fica próxima de zero. Em treinamento por gradiente, isso significa que o sinal de erro “não passa” por aquela unidade com força suficiente.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Em sigmoid e tanh, a saturação ocorre nas caudas: para x muito positivo ou muito negativo, a função fica quase constante. Como a derivada entra multiplicando o gradiente na retropropagação, camadas profundas podem sofrer vanishing gradients (gradiente que desaparece).
ReLU e o papel das regiões lineares
A ReLU tem uma região linear para x>0 com derivada 1, o que favorece o fluxo de gradiente. Porém, para x<0 a derivada é 0: se uma unidade cair consistentemente no lado negativo, ela pode parar de aprender (neurônio morto).
A Leaky ReLU mantém uma pequena inclinação no lado negativo (derivada α), preservando algum gradiente e reduzindo o risco de morte permanente.
Impacto prático no treinamento
- Sigmoid/tanh em camadas ocultas profundas: maior risco de gradiente desaparecer, especialmente se as ativações entrarem em saturação por escala inadequada dos pesos/entradas.
- ReLU/Leaky ReLU em camadas ocultas: geralmente facilitam otimização por manterem gradientes mais fortes em parte do domínio.
- Softmax na saída: não é escolhida por “fluxo de gradiente” em profundidade, mas por produzir probabilidades multiclasse; o cuidado principal é estabilidade numérica.
Estabilidade numérica: onde problemas aparecem e como evitar
Sigmoid: evitando overflow em exp
Para x muito negativo, e^{-x} pode estourar (overflow). Implementações robustas usam formas numericamente estáveis, por exemplo, computando sigmoid de modo diferente conforme o sinal de x.
# ideia (pseudocódigo estável para sigmoid escalar x): if x >= 0: return 1 / (1 + exp(-x)) else: ex = exp(x) return ex / (1 + ex)Softmax: truque do “max”
Softmax envolve exponenciais e pode sofrer overflow quando logits são grandes. A forma estável subtrai o maior logit antes de exponenciar:
# z é um vetor de logits z_shift = z - max(z) p = exp(z_shift) / sum(exp(z_shift))Essa transformação não altera as probabilidades finais, mas evita números enormes.
Gráficos didáticos: funções e derivadas (como construir)
Uma forma eficiente de entender ativação é visualizar a função e sua derivada no mesmo intervalo (por exemplo, de -6 a 6). Isso evidencia saturação (derivada ~0), regiões lineares (derivada constante) e pontos de não diferenciabilidade (ReLU em 0).
Passo a passo prático para gerar os gráficos
- Escolha o intervalo: use
xde -6 a 6 com passo pequeno (ex.: 0,01) para curvas suaves. - Implemente as ativações: sigmoid, tanh, ReLU, Leaky ReLU (com α=0,01 ou 0,1).
- Implemente as derivadas:
- Sigmoid:
σ(x)(1-σ(x)) - tanh:
1 - tanh(x)^2 - ReLU: 0 para x<0, 1 para x>0 (em x=0, escolha 0 ou 1 por convenção para o gráfico)
- Leaky ReLU: α para x<0, 1 para x>0
- Sigmoid:
- Plote em pares: para cada ativação, um gráfico da função e outro da derivada (ou dois eixos no mesmo gráfico).
- Marque regiões importantes: destaque visualmente onde a derivada é pequena (saturação) e onde é constante (região linear).
# pseudocódigo (independente de biblioteca) x = linspace(-6, 6, 1201) sigmoid = 1/(1+exp(-x)) dsigmoid = sigmoid*(1-sigmoid) t = tanh(x) dt = 1 - t*t relu = max(0, x) drelu = where(x>0, 1, 0) alpha = 0.01 lrelu = where(x>0, x, alpha*x) dlrelu = where(x>0, 1, alpha) plot(x, sigmoid); plot(x, dsigmoid) plot(x, t); plot(x, dt) plot(x, relu); plot(x, drelu) plot(x, lrelu); plot(x, dlrelu)Como ler os gráficos (o que procurar)
- Sigmoid: curva em “S”; derivada máxima perto de 0 e quase zero nas caudas → saturação.
- tanh: semelhante à sigmoid, mas centrada em 0; derivada também cai nas caudas.
- ReLU: função “quebra” em 0; derivada 0 no negativo e 1 no positivo → risco de neurônio morto.
- Leaky ReLU: semelhante à ReLU, mas com inclinação negativa pequena → derivada não zera no negativo.
Softmax: ativação de saída multiclasse e gradiente acoplado
Softmax transforma um vetor de logits em probabilidades que somam 1. Diferente das ativações ponto a ponto (sigmoid, tanh, ReLU), softmax é uma operação vetorial: a probabilidade de uma classe depende dos logits de todas as classes.
Quando usar softmax vs sigmoid na saída
- Multiclasse exclusiva (uma classe correta): use softmax na saída (uma distribuição).
- Multirrótulo (várias classes podem ser verdadeiras): use sigmoid por classe (probabilidades independentes por rótulo).
Na prática, a combinação softmax + entropia cruzada é comum porque fornece gradientes úteis para separar classes, mas exige o cuidado de estabilidade numérica (subtrair max(z)).
Checklist de seleção de ativação (por tarefa e arquitetura)
Camadas ocultas (MLP/CNN)
- Padrão inicial: ReLU.
- Se houver muitos neurônios “mortos” (ativação sempre 0): troque para Leaky ReLU (α=0,01 ou 0,1) e monitore.
- Se você precisa de saídas centradas em zero por design (ou em certos blocos): considere tanh, mas esteja atento à saturação.
- Evite sigmoid/tanh em redes muito profundas se não houver um motivo específico, pois saturação pode dificultar o treinamento.
Camada de saída
- Regressão (valor real): frequentemente sem ativação (linear). Se precisar restringir faixa: use ativação apropriada (ex.: sigmoid para (0,1), tanh para (-1,1)).
- Classificação binária: sigmoid (uma saída) para probabilidade.
- Classificação multiclasse exclusiva: softmax (k saídas).
- Classificação multirrótulo: sigmoid em cada classe (k saídas independentes).
Diagnóstico rápido quando o treinamento “empaca”
- Perda não diminui e gradientes muito pequenos: suspeite de saturação (sigmoid/tanh) ou logits muito grandes; revise escala das ativações e estabilidade numérica.
- Muitas ativações zero em ReLU: suspeite de neurônios mortos; teste Leaky ReLU.
- Probabilidades softmax viram 0/1 cedo demais: logits com escala alta; use softmax estável e verifique normalização/regularização.