Normalização em Grupo

Visão geral

Normalização em Grupo (Group Normalization; GroupNorm) é uma técnica de normalização para redes neurais profundas (deep neural networks) — especialmente redes neurais convolucionais (convolutional neural networks, CNNs) — que estabiliza e acelera o treinamento ao normalizar as ativações (activations) dentro de cada exemplo, ao longo de grupos de canais (e, tipicamente, também ao longo das dimensões espaciais). Diferentemente da Normalização por Lote (Batch Normalization), a Normalização em Grupo não depende de estatísticas do lote (batch statistics), o que a torna uma ótima escolha padrão quando é necessário treinar com tamanhos de lote pequenos (small batch sizes) (por exemplo, detecção (detection), segmentação (segmentation), modelos de difusão (diffusion models), treinamento em alta resolução (high-resolution training)).

Intuitivamente:

  • Normalização por Lote: “Normalize cada canal usando estatísticas ao longo do lote.”
  • Normalização por Camada (Layer Normalization; LayerNorm): “Normalize um exemplo inteiro ao longo de todas as características.”
  • Normalização por Instância (InstanceNorm): “Normalize cada canal por exemplo (frequentemente ao longo das dimensões espaciais).”
  • Normalização em Grupo: “Normalize por exemplo, mas apenas dentro de grupos de canais.”

A Normalização em Grupo faz a ponte entre a Normalização por Camada e a Normalização por Instância: ela é menos sensível do que a Normalização por Instância (que pode ser agressiva demais) e mais amigável para CNNs do que a Normalização por Camada (que pode misturar canais demais que não têm relação entre si).

Por que a normalização ajuda

Treinar redes profundas envolve aplicar repetidamente transformações afins (affine transforms) e não linearidades (nonlinearities). À medida que as ativações passam por muitas camadas, sua distribuição pode derivar, levando a:

  • gradientes instáveis (explosão/desvanecimento),
  • sensibilidade a taxas de aprendizado (learning rates) e à inicialização,
  • convergência mais lenta.

Camadas de normalização (normalization layers) combatem isso forçando as ativações a uma distribuição mais controlada, melhorando a otimização (optimization) e, com frequência, a generalização (generalization). Isso funciona em conjunto com uma boa Inicialização de Pesos (Weight Initialization) e com otimizadores como os baseados em Descida do Gradiente (Gradient Descent). (Historicamente, a Normalização por Lote foi motivada pela “mudança interna de covariáveis (internal covariate shift)”, mas o entendimento moderno enfatiza melhor condicionamento (conditioning) e uma otimização mais suave.)

Formulação

Considere um tensor de ativações de uma CNN:

[ \mathbf{x} \in \mathbb{R}^{N \times C \times H \times W} ]

  • (N): tamanho do lote
  • (C): número de canais
  • (H, W): dimensões espaciais

A Normalização em Grupo divide os canais em (G) grupos (onde (G) divide (C)). Cada grupo contém:

[ C_g = \frac{C}{G} ]

Para cada amostra (n) e cada grupo (g), a Normalização em Grupo computa a média e a variância sobre o conjunto:

[ S = {(c, h, w) \mid c \in \text{canais no grupo } g,; 1 \le h \le H,; 1 \le w \le W} ]

Assim, o número de elementos sendo normalizados por grupo é (m = C_g \cdot H \cdot W).

Calcular média e variância (por amostra, por grupo)

[ \mu_{n,g} = \frac{1}{m} \sum_{(c,h,w)\in S} x_{n,c,h,w} ]

[ \sigma^2_{n,g} = \frac{1}{m} \sum_{(c,h,w)\in S} (x_{n,c,h,w} - \mu_{n,g})^2 ]

Normalizar e aplicar transformação afim

[ \hat{x}{n,c,h,w} = \frac{x{n,c,h,w} - \mu_{n,g(c)}}{\sqrt{\sigma^2_{n,g(c)} + \epsilon}} ]

Então (assim como na Normalização por Lote), a Normalização em Grupo geralmente possui escala e viés aprendíveis por canal:

[ y_{n,c,h,w} = \gamma_c \hat{x}_{n,c,h,w} + \beta_c ]

  • (\gamma, \beta \in \mathbb{R}^C) (um par por canal)
  • (\epsilon) é uma constante pequena para estabilidade numérica

Propriedade-chave: independente do tamanho do lote

Observe que (\mu_{n,g}) e (\sigma^2_{n,g}) são computados sem usar outros elementos do lote. Isso torna o comportamento da Normalização em Grupo consistente quando:

  • o tamanho do lote muda entre passos de treinamento,
  • o tamanho do lote é muito pequeno (até 1),
  • o treinamento é distribuído com micro-lotes (microbatches) por dispositivo.

Relação com outros métodos de normalização

Uma forma útil de comparar normalizações é quais eixos elas reduzem ao computar média/variância.

Vamos manter ((N, C, H, W)) em mente.

Normalização por Lote

  • Normaliza por canal usando estatísticas sobre (N, H, W).
  • Depende do tamanho do lote e da composição do lote.
  • Usa média/variância móveis (running mean/variance) para inferência (inference).

Veja: Normalização por Lote

Implicação: Ótima com lotes razoavelmente grandes; pode ser instável ou ineficaz com lotes pequenos.

Normalização por Camada

  • Normaliza por exemplo usando estatísticas sobre (C, H, W) (para CNNs) ou sobre dimensões de características (para modelos Transformer (Transformers) / perceptrons multicamadas (multi-layer perceptrons, MLPs)).
  • Sem estatísticas móveis; mesmo comportamento em treino e teste.

Veja: Normalização por Camada

Implicação: Funciona bem em modelos Transformer; em CNNs pode ser menos ideal porque mistura todos os canais, o que pode reduzir a flexibilidade representacional.

Normalização por Instância

  • Normaliza por exemplo, por canal usando estatísticas sobre (H, W).
  • Equivalente à Normalização em Grupo com (G = C) (cada canal é seu próprio grupo).

Implicação: Comum em transferência de estilo (style transfer) e em alguns cenários generativos; pode remover informação de contraste específica de instâncias e prejudicar tarefas discriminativas.

Normalização em Grupo

  • Normaliza por exemplo, dentro de grupos de canais, geralmente sobre (C/G, H, W).
  • Sem estatísticas móveis; igual em treino e teste.
  • Fica entre a Normalização por Camada e a Normalização por Instância:

Casos especiais:

  • (G = 1) → a Normalização em Grupo se torna um estilo de Normalização por Camada para tensores de CNN (normaliza ao longo de todos os canais e posições espaciais por exemplo).
  • (G = C) → a Normalização em Grupo se torna Normalização por Instância (normaliza cada canal independentemente ao longo das dimensões espaciais).

Uso prático em CNNs e modelos de visão

Quando a Normalização em Grupo brilha

A Normalização em Grupo é comumente escolhida quando a Normalização por Lote é inconveniente:

  • Lotes pequenos devido a restrições de memória
    Exemplos: detecção de objetos, segmentação por instância, treinamento em alta resolução, visão 3D/imagens médicas.
  • Tamanho do lote = 1 ou 2 por GPU (comum em tarefas de predição densa).
  • Modelos generativos (generative models) como redes U-Net (U-Nets) usadas em difusão, onde configurações de treinamento frequentemente usam micro-lotes pequenos.
  • Composição do lote altamente variável em que as estatísticas por lote são ruidosas.

Como a Normalização em Grupo não usa estatísticas do lote, ela evita problemas como:

  • estimativas ruidosas de média/variância,
  • incompatibilidade treino–inferência devido a estatísticas móveis ruins,
  • requisitos complicados de normalização por lote sincronizada (sync batch norm) entre dispositivos.

Escolhas típicas de configuração

Um padrão comum é:

  • (G = 32) grupos (se (C) for divisível por 32)

Se o número de canais for pequeno, você frequentemente reduz o número de grupos:

  • Se (C < 32), defina (G) como um divisor de (C) (por exemplo, 8, 4, 2, 1).
  • Garanta (C % G == 0).

Heurísticas:

  • Mais grupos (em direção à Normalização por Instância) = normalização mais localizada, potencialmente regularização mais forte, mas pode remover sinal útil.
  • Menos grupos (em direção à Normalização por Camada) = normalização mais global, frequentemente mais suave, mas pode acoplar canais demais.

Onde posicioná-la em um bloco

Em blocos modernos de CNN (do tipo ResNet (ResNet-like)), um padrão comum é:

  • Conv → Normalização em Grupo → Ativação

Opcionalmente:

  • Conv → Normalização em Grupo → Ativação → Conv → Normalização em Grupo → (adição residual (residual add)) → Ativação

A Normalização em Grupo é tipicamente usada como uma substituição direta (drop-in replacement) da Normalização por Lote quando existem restrições de tamanho de lote.

Comportamento em treinamento e inferência

Um dos benefícios mais práticos da Normalização em Grupo é a simplicidade na inferência:

  • Não há médias móveis de média/variância mantidas.
  • A camada computa as estatísticas de normalização a partir do exemplo de entrada atual tanto em treinamento quanto em avaliação.

Isso elimina uma fonte comum de bugs com a Normalização por Lote (por exemplo, esquecer de trocar para modo de avaliação, ou ter estatísticas móveis incompatíveis devido a lotes minúsculos).

Tradeoffs e limitações

A Normalização em Grupo não é “estritamente melhor” do que a Normalização por Lote; ela tem tradeoffs.

Prós

  • Funciona bem com lotes muito pequenos, até mesmo tamanho de lote 1.
  • Comportamento consistente entre treinamento e inferência (sem estatísticas móveis).
  • Evita ruído dependente do lote e a necessidade de estatísticas de lote sincronizadas em configurações distribuídas.
  • Frequentemente melhora a estabilidade em treinamento de visão com restrição de memória.

Contras

  • Com lotes grandes, a Normalização por Lote pode superar a Normalização em Grupo em alguns benchmarks (as estatísticas do lote podem atuar como um regularizador útil).
  • Perfil de computação ligeiramente diferente; dependendo do hardware e da implementação, pode ser um pouco mais lenta do que a Normalização por Lote.
  • A escolha do número de grupos (G) é um hiperparâmetro; escolhas ruins podem reduzir a acurácia.

Considerações de acurácia

Empiricamente, um padrão comum é:

  • Classificação com lotes grandes (large-batch classification) (por exemplo, ImageNet com lotes grandes): a Normalização por Lote costuma ser a mais forte.
  • Predição densa (dense prediction) com lotes pequenos (detecção/segmentação): a Normalização em Grupo frequentemente vence ou é muito mais fácil de treinar de forma confiável.

Se você consegue usar lotes maiores (ou usar Normalização por Lote sincronizada), a Normalização por Lote ainda pode ser preferível.

Exemplos práticos

PyTorch: substituindo Normalização por Lote por Normalização em Grupo

O PyTorch fornece Normalização em Grupo diretamente.

import torch
import torch.nn as nn

class ConvGNReLU(nn.Module):
    def __init__(self, in_ch, out_ch, k=3, groups=32):
        super().__init__()
        padding = k // 2
        self.conv = nn.Conv2d(in_ch, out_ch, kernel_size=k, padding=padding, bias=False)

        # groups must divide out_ch; clamp to a valid divisor for small channel counts
        g = min(groups, out_ch)
        while out_ch % g != 0:
            g -= 1

        self.gn = nn.GroupNorm(num_groups=g, num_channels=out_ch, eps=1e-5, affine=True)
        self.act = nn.ReLU(inplace=True)

    def forward(self, x):
        return self.act(self.gn(self.conv(x)))

x = torch.randn(2, 64, 128, 128)  # small batch
block = ConvGNReLU(64, 128, groups=32)
y = block(x)
print(y.shape)  # (2, 128, 128, 128)

Notas:

  • O viés da convolução frequentemente é desabilitado (bias=False) porque a normalização seguinte tem um viés aprendível (beta).
  • O pequeno laço garante que num_groups divida out_ch, evitando erros em tempo de execução quando o número de canais não é divisível por 32.

TensorFlow / Keras

O Keras central historicamente focou em Normalização por Lote e Normalização por Camada. A Normalização em Grupo é comumente usada via add-ons ou camadas personalizadas. Se você a implementar por conta própria, o ponto-chave é remodelar (N, C, H, W) em (N, G, C/G, H, W) (ou o equivalente para canais por último) e reduzir ao longo das dimensões internas do grupo.

Em muitos codebases de produção, a Normalização em Grupo é usada em arquiteturas como:

  • cabeças no estilo Mask R-CNN,
  • variantes de U-Net (especialmente U-Nets de difusão),
  • backbones ResNet para detecção treinadas com lotes pequenos por GPU.

Escolhendo o número de grupos (orientação prática)

Não existe um (G) universalmente ótimo, mas estas regras funcionam bem:

  • Comece com 32 grupos quando o número de canais for grande o suficiente (por exemplo, 256, 512).
  • Para contagens menores de canais:
    • (C=64): tente (G=8) ou (G=16)
    • (C=32): tente (G=8) ou (G=4)
  • Se você observar instabilidade ou queda de acurácia, tente menos grupos (aproximando-se de um comportamento semelhante ao da Normalização por Camada).

Um modelo mental útil:

  • Semelhante à Normalização por Instância (muitos grupos) pode normalizar demais e remover pistas de contraste/estilo.
  • Semelhante à Normalização por Camada (poucos grupos) pode acoplar canais demais e reduzir especialização.

Intuição conceitual: por que agrupar ajuda CNNs

Canais em CNNs frequentemente aprendem tipos diferentes de características (bordas, texturas, partes). Normalizar todos os canais juntos (comportamento de Normalização por Camada) pode “misturar” essas estatísticas de forma agressiva demais. Normalizar cada canal de forma independente (Normalização por Instância) pode ser restritivo demais, removendo diferenças de amplitude significativas por canal.

A Normalização em Grupo mantém a normalização local o suficiente para respeitar a especialização de canais, enquanto ainda fornece amostras suficientes por grupo ((C_g \cdot H \cdot W)) para estimar estatísticas estáveis — especialmente importante quando (H \times W) fica pequeno nas etapas finais de uma CNN.

Detalhes de implementação e armadilhas

  • Formato de dados: Frameworks variam entre NCHW (canais primeiro) e NHWC (canais por último). A Normalização em Grupo deve agrupar ao longo dos canais.
  • Epsilon (eps): Se você treinar em precisão mista (mixed precision), eps pode ser importante para estabilidade.
  • Parâmetros afins: Normalmente habilitados (affine=True). Desabilitá-los pode reduzir desempenho porque a rede perde flexibilidade.
  • Viés em camadas de convolução anteriores: Frequentemente desnecessário quando seguido por normalização.

Resumo

A Normalização em Grupo é um método de normalização robusto e independente do tamanho do lote para CNNs e modelos de visão:

  • Ela normaliza dentro de grupos de canais por exemplo, tipicamente sobre (C/G, H, W).
  • Ela evita a dependência da Normalização por Lote em estatísticas do lote e médias móveis, tornando-a ideal para treinamento com lotes pequenos.
  • Ela interpola entre Normalização por Camada e Normalização por Instância dependendo do número de grupos.
  • Na prática, ela é amplamente usada em predição densa e em modelos generativos de visão onde restrições de memória tornam lotes grandes impraticáveis.

Para uma comparação mais profunda com normalização dependente de lote, veja Normalização por Lote. Para normalização padrão em modelos Transformer e muitos modelos de sequência, veja Normalização por Camada.