Nessas áreas de aplicação, a convolução é frequentemente realizada como um filtro que transforma sinais e pixels em valores mais desejáveis.
Na computação de alto desempenho, o padrão de convolução é frequentemente denominado cálculo de estêncil. A convolução tipicamente envolve um número significativo de operações aritméticas em cada elemento dos dados. Cada elemento de dados pode ser calculado independentemente dos outros, uma característica desejável para a computação paralela. Por outro lado, há um nível substancial de compartilhamento de dados de entrada entre elementos de dados de saída com condições de fronteira desafiadoras. Isso torna a convolução um caso de uso importante de métodos sofisticados de particionamento e de organização dos dados de entrada.
A convolução é uma operação em matriz na qual cada elemento de saída é uma soma ponderada de um conjunto de elementos vizinhos da entrada. Os pesos utilizados no cálculo da soma ponderada são definidos por um array de máscara, comumente chamado de kernel de convolução. Referir-nos-emos a estes arrays de máscaras como máscaras de convolução. A mesma máscara de convolução é tipicamente usada para todos os elementos do array
Abaixo é apresentado um exemplo de convolução para dados unidimensionais, onde uma matriz de máscara de convolução M com 5 elementos é aplicada a um array de entrada N com 7 elementos.
Para processamento de imagens e visão computacional, os dados de entrada são tipicamente matrizes bidimensionais, com pixels em um espaço x-y. As convoluções de imagem são, portanto, convoluções 2D. A máscara não precisa ser uma matriz quadrada.
1. De convolução 1D para convolução 2D
Você conhece a convolução 1D:
- Array 1D (por exemplo,
[x0, x1, x2, ...]) - Kernel: pequeno array 1D (por exemplo,
[w0, w1, w2]) - Operação: deslize o núcleo e calcule as somas ponderadas.
Para imagens, a entrada é 2D (altura × largura), então:
- matriz de pixels, forma
H × W - Kernel: matriz pequena, por exemplo
3 × 3ou5 × 5 - Operação: coloque o kernel sobre cada
3 × 3patch da imagem, multiplique elemento por elemento, some → um pixel de saída.
Esta é apenas a mesma ideia que você já conhece, mas:
- Matriz → Matriz 2D.
- Elementos vizinhos → pixels vizinhos em 2D.
2. Múltiplos canais (por exemplo, RGB)
As imagens reais não são apenas 2D, elas frequentemente têm canais:
- Formato:
H × W × C(por exemplo,C = 3para R, G, B). - Então, um kernel também tem profundidade
C:- Formato:
kH × kW × C.
- Formato:
Passo de convolução:
- Para uma posição, você pega um pequeno cubo:
kH × kW × C. - Multiplicar elemento a elemento com o núcleo
kH × kW × C. - Some todos
Então, conceitualmente: convolução 3D sobre espaço + canais, mas ainda apenas “soma ponderada de vizinhos”.
3. Filtros (kernels) e mapas de características
Em CNNs, você não usa apenas um kernel; você usa muitos:
- Suponha que você use
Fnúcleos diferentes. - Cada kernel tem forma
kH × kW × C_in. - Cada núcleo produz um canal de saída, chamado de mapa de características.
Então, se a forma de entrada for:
H × W × C_in,
e você usa kernels F, a forma de saída se torna:
H_out × W_out × F.
Cada um desses F canais de saída captura um tipo diferente de padrão:
- Um núcleo pode aprender a detectar bordas, outro cantos, outro texturas, etc.
Pense: “Uma camada CNN = aplicar muitas convoluções (filtros) diferentes sobre a entrada.”
4. Passo e amortecimento
Dois detalhes mais sobre arrays:
- Passo: a distância que você move o kernel em cada etapa.
- Passo 1: mover 1 pixel de cada vez → saída densa.
- Passo 2: pular cada segundo pixel → saída menor.
- Preenchimento: adicionar zeros ao redor da borda da imagem.
- Sem preenchimento, a saída fica menor.
- Com preenchimento, você pode manter a mesma altura/largura.
Matematicamente, ainda são apenas janelas deslizantes e produtos escalares, mas com controle sobre:
- Quão longe você desliza (avança).
- Se você perder as informações de borda (padding).
5. Não linearidade: adicionando funções de ativação
Até agora, tudo é linear: somas ponderadas. Uma camada CNN adiciona não linearidade:
- Após a convolução, aplique uma função de ativação elemento por elemento (ReLU(x) = max(0, x)).
Então uma única camada convolucional é:
- Convolução (somas ponderadas lineares).
- Ativação (não linear).
Esta combinação permite que as CNNs aprendam mapeamentos complexos e não lineares.
6. Empilhamento de camadas → hierarquias profundas de características
Um CNN completo é apenas muitas camadas de:
- Convolução → ativação (→ às vezes, pooling).
Intuição:
- Camadas iniciais: detectam coisas simples (bordas, manchas).
- Camadas intermediárias: combinam-nos em texturas, formas.
- Camadas posteriores: combinam formas em partes de objetos e objetos.
Tudo isso ainda está construído a partir do mesmo princípio que você compreende: "pegar bairros locais e calcular somas ponderadas."
7. Conexão com camadas totalmente conectadas (densas)
Uma camada totalmente conectada também é apenas somas ponderadas:
- Vetor 1D.
- Saída da unidade = soma de (peso × entrada) + viés.
Diferença:
- Camada densa: cada unidade de saída usa todos os elementos de entrada.
- Camada de convolução: cada unidade de saída usa apenas uma vizinhança local (conectividade esparsa) e compartilha pesos entre as posições.
Então você pode ver as CNNs como:
- Uma maneira inteligente de usar sua operação de convolução para obter:
- Localidade (os pixels próximos têm mais importância).
- Compartilhamento de pesos (mesmo kernel em todas as posições).
- Menos parâmetros do que uma camada densa em imagens completas.
Conclusão: Da Operação Simples às Redes Poderosas
"At each position, take neighbors and compute a weighted sum with a kernel,"
Então você já está de pé sobre a ideia central dos CNNs.
As redes neurais convolucionais (CNNs) pegam esse bloco de construção simples e:
- Estenda de arrays 1D para tensores 2D/3D.
- Aplique muitos kernels diferentes em paralelo para produzir mapas de características ricos.
- Adicione não-linearidades para escapar da linearidade pura.
- Empilhe muitas dessas camadas de modo que cada estágio "veja" uma estrutura mais abstrata.
A magia das CNNs não é um novo tipo de matemática, mas sim a composição de muitas operações locais e pequenas de convolução em uma arquitetura profunda capaz de aprender representações visuais poderosas.