ReLU
Rectified Linear Unit
A ReLU é a função de ativação padrão em CNNs modernas, aplicada após cada camada convolucional para introduzir não linearidade — sem ela, o empilhamento de camadas do mask-r-cnn ou de qualquer rede profunda colapsaria matematicamente em uma única transformação linear.
Contexto Prático
A ideia é brutalmente simples: zera qualquer valor negativo e preserva os positivos sem alteração.
- Por que funciona: camadas convolucionais e totalmente conectadas são, isoladamente, transformações lineares (). Empilhar transformações lineares sem ativação não-linear entre elas ainda é uma única transformação linear equivalente — a rede jamais aprenderia fronteiras de decisão complexas (bordas curvas, texturas, formas biológicas irregulares).
- Por que ReLU e não Sigmoid/Tanh: as ativações saturantes (Sigmoid, Tanh) comprimem a saída em um intervalo fixo (0–1 ou -1–1), fazendo o gradiente tender a zero nas extremidades (vanishing gradient) e travando o aprendizado em redes profundas. A ReLU tem gradiente constante (1) para qualquer entrada positiva, o que mantém o fluxo de gradiente estável durante a retropropagação.
- ⚠️ Dying ReLU: se um neurônio recebe entrada negativa persistente (ex.: peso mal inicializado ou learning rate alto demais), seu gradiente passa a ser sempre zero e ele nunca mais atualiza — o neurônio “morre” e para de contribuir para a rede.
import numpy as np
def relu(x: np.ndarray) -> np.ndarray:
# zera negativos, preserva positivos — não-linearidade "de graça" computacionalmente
return np.maximum(0, x)
def relu_grad(x: np.ndarray) -> np.ndarray:
# gradiente 1 onde ativou, 0 onde zerou (indefinido em x=0, convenciona-se 0)
return (x > 0).astype(float)
Fundamentação Matemática
Eq. 1: Função de ativação ReLU.
Onde:
- : sinal de saída após a ativação.
- : valor escalar de entrada (soma ponderada de uma camada convolucional ou totalmente conectada).
A derivada, necessária para a retropropagação do gradiente, é uma função degrau:
Eq. 2: Derivada da ReLU.
Onde:
- : gradiente local propagado para a camada anterior durante a retropropagação.
Variantes que Corrigem o Dying ReLU
| Variante | Fórmula (região negativa) | Quando usar |
|---|---|---|
| Leaky ReLU | , com pequeno fixo (ex.: 0,01) | Correção mínima, custo computacional quase nulo |
| PReLU | , com aprendido por retropropagação | Quando o dataset é grande o suficiente para aprender sem overfitting |
| GELU | suavização probabilística (usa a CDF da normal) | Padrão em Transformers (BERT, GPT); mais custosa computacionalmente que ReLU |
Nenhuma variante é estritamente superior: a ReLU pura continua sendo a escolha padrão em CNNs de visão computacional (como no mask-r-cnn, que usa ReLU nas quatro camadas convolucionais da branch de máscara) justamente pelo custo computacional mínimo — um max(0, x) é ordens de grandeza mais barato que qualquer função com exponenciais.
Perguntas de entrevista
- Por que uma rede sem função de ativação não-linear, por mais camadas que tenha, ainda é equivalente a um único perceptron linear?
- O que causa o problema do “dying ReLU” e como Leaky ReLU o mitiga?
- Por que a ReLU tende a treinar mais rápido que Sigmoid em redes profundas?
Relacionadas: cnn · mask-r-cnn · faster-r-cnn