Ir para o conteúdo

11. Convolutional

Introdução às Redes Neurais Convolucionais (CNNs)

Redes Neurais Convolucionais (CNNs) são uma classe de redes neurais profundas comumente usadas para reconhecimento de imagens, análise de vídeo e outras tarefas envolvendo dados em grade (ex: pixels em imagens). Ao contrário de redes totalmente conectadas, as CNNs exploram hierarquias espaciais por meio de convoluções, que aplicam filtros (kernels) aprendíveis a regiões locais da entrada. Isso reduz parâmetros, permite invariância à translação e captura features como bordas, texturas ou objetos.

Uma arquitetura típica de CNN inclui:

  • Camadas convolucionais: Extraem features via convolução.
  • Funções de ativação (ex: ReLU): Introduzem não-linearidade.
  • Camadas de pooling (ex: max pooling): Reduzem dimensões espaciais e a carga computacional.
  • Camadas totalmente conectadas: Para classificação ou regressão final.
  • Camada de saída: Frequentemente softmax para classificação.

O treinamento envolve a passagem direta (computando previsões) e a passagem reversa (retropropagação para atualizar pesos via gradientes). A seguir, focamos na matemática para a camada convolucional, que é o núcleo das CNNs. Assumimos convolução 2D para imagens (formato de entrada: batch_size × canais × altura × largura).

Passagem Direta em uma Camada Convolucional

A passagem direta computa o mapa de features de saída deslizando um kernel sobre a entrada.

Notações Principais:

  • Entrada: \( X \in \mathbb{R}^{B \times C_{in} \times H_{in} \times W_{in}} \) (tamanho do batch \( B \), canais de entrada \( C_{in} \), altura \( H_{in} \), largura \( W_{in} \)).
  • Kernel (pesos): \( W \in \mathbb{R}^{C_{out} \times C_{in} \times K_h \times K_w} \) (canais de saída \( C_{out} \), altura do kernel \( K_h \), largura \( K_w \)).
  • Bias: \( b \in \mathbb{R}^{C_{out}} \) (um por canal de saída).
  • Stride: \( s \) (tamanho do passo para deslizar o kernel).
  • Padding: \( p \) (zeros adicionados às bordas para controlar o tamanho da saída).
  • Saída: \( Y \in \mathbb{R}^{B \times C_{out} \times H_{out} \times W_{out}} \), onde \( H_{out} = \lfloor \frac{H_{in} + 2p - K_h}{s} \rfloor + 1 \).

Operação de Convolução:

Para cada posição \( (i, j) \) no mapa de features de saída, para o item de batch \( b \) e canal de saída \( c_{out} \):

\[ Y_{b, c_{out}, i, j} = \sum_{c_{in}=0}^{C_{in}-1} \sum_{m=0}^{K_h-1} \sum_{n=0}^{K_w-1} W_{c_{out}, c_{in}, m, n} \cdot X_{b, c_{in}, s \cdot i + m - p, s \cdot j + n - p} + b_{c_{out}} \]

Este é essencialmente um produto escalar entre o kernel e um patch local da entrada, somado sobre os canais de entrada, mais o bias.

Após a convolução, aplica-se ativação: \( Y' = f(Y) \), ex: ReLU: \( f(x) = \max(0, x) \).

O pooling (ex: max pooling) sobre uma janela (tamanho \( k \), stride \( s \)) retém o valor máximo em cada patch, reduzindo dimensões.

Passagem Reversa em uma Camada Convolucional

A passagem reversa computa gradientes para pesos, biases e entradas usando a regra da cadeia, para minimizar a perda \( L \) via gradiente descendente.

Gradiente do Bias:

Soma simples sobre dimensões espaciais e batch:

\[ \frac{\partial L}{\partial b_{c_{out}}} = \sum_{b=0}^{B-1} \sum_{i=0}^{H_{out}-1} \sum_{j=0}^{W_{out}-1} \frac{\partial L}{\partial Y_{b, c_{out}, i, j}} \]

Gradiente dos Pesos:

Correlaciona a entrada com o gradiente de saída:

\[ \frac{\partial L}{\partial W_{c_{out}, c_{in}, m, n}} = \sum_{b=0}^{B-1} \sum_{i=0}^{H_{out}-1} \sum_{j=0}^{W_{out}-1} \frac{\partial L}{\partial Y_{b, c_{out}, i, j}} \cdot X_{b, c_{in}, s \cdot i + m - p, s \cdot j + n - p} \]

Gradiente da Entrada:

Convolução "completa" do kernel rotacionado com o gradiente de saída (para propagar o erro de volta):

\[ \frac{\partial L}{\partial X_{b, c_{in}, k, l}} = \sum_{c_{out}=0}^{C_{out}-1} \sum_{m=0}^{K_h-1} \sum_{n=0}^{K_w-1} \frac{\partial L}{\partial Y_{b, c_{out}, i, j}} \cdot W_{c_{out}, c_{in}, m, n} \]

Para pooling, a passagem reversa realiza upsampling do gradiente (ex: para max pooling, coloca o gradiente apenas na posição máxima).

Adicional

Quando uma Rede Neural é Considerada "Profunda"?

O termo "profundo" no contexto de redes neurais refere-se à profundidade da arquitetura, especificamente o número de camadas (particularmente camadas ocultas) que permitem à rede aprender representações hierárquicas e abstratas dos dados. Não há um limiar mínimo universalmente acordado que divida estritamente redes "rasas" de "profundas", pois pode depender do contexto, da tarefa e do uso histórico na pesquisa. No entanto, com base em definições estabelecidas e consenso de especialistas em aprendizado de máquina, uma rede neural é geralmente considerada profunda se tiver pelo menos duas camadas ocultas (além das camadas de entrada e saída).

  • Redes Rasas vs. Profundas


    • Uma rede neural rasa tipicamente tem 0 ou 1 camada oculta. São suficientes para tarefas simples, mas têm dificuldades com padrões de dados complexos e hierárquicos.
    • Redes profundas, por contraste, empilham múltiplas camadas ocultas para capturar features progressivamente mais abstratas (ex: bordas nas camadas iniciais para reconhecimento de imagem, evoluindo para objetos nas camadas mais profundas).
  • Base Histórica e Teórica


    • Modelos iniciais de aprendizado profundo, como os do grupo de Geoffrey Hinton nos anos 2000, apresentavam três camadas ocultas.
    • O teorema da aproximação universal mostra que mesmo uma única camada oculta pode teoricamente aproximar qualquer função, mas na prática, redes mais profundas são mais eficientes para tarefas complexas.
  • Limiares Comuns


    • A maioria dos pesquisadores e livros didáticos concorda em pelo menos 2 camadas ocultas como mínimo para "profundo".
    • Na prática, redes profundas modernas (ex: CNNs ou transformers) têm dezenas ou centenas de camadas.

Interativo: Visualizador de Filtro Convolucional

Selecione um filtro e veja-o deslizar sobre uma imagem sintética, produzindo o mapa de features.