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 (Wx+bWx + b). Empilhar NN 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

f(x)=max(0,x)f(x) = \max(0, x)

Eq. 1: Função de ativação ReLU.

Onde:

  • f(x)f(x): sinal de saída após a ativação.
  • xx: 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:

f(x)={1,x>00,x0f'(x) = \begin{cases} 1, & x > 0 \\ 0, & x \leq 0 \end{cases}

Eq. 2: Derivada da ReLU.

Onde:

  • f(x)f'(x): 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 f(x)=αxf(x) = \alpha x, com α\alpha pequeno fixo (ex.: 0,01) Correção mínima, custo computacional quase nulo
PReLU f(x)=αxf(x) = \alpha x, com α\alpha aprendido por retropropagação Quando o dataset é grande o suficiente para aprender α\alpha 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

Construído com Eleventy · busca por Lunr.js