Redes Neurais Convolucionais (CNN): O que é Normalização em lote (Batch normalization), e como podemos implementá-la.

Gean Matos
Share! por Ateliê de Software
5 min readJun 29, 2023

--

As redes neurais convolucionais (CNNs) são um tipo de modelo de aprendizado profundo, amplamente utilizado em tarefas de visão computacional como reconhecimento de imagens e detecção de objetos. Inspiradas pela organização do córtex visual do cérebro humano, as CNNs são projetadas para extrair características relevantes de imagens por meio de camadas de convolução e pooling, comumente seguidas por camadas totalmente conectadas quando o objetivo alvo é classificação.

A normalização em lote é uma etapa crucial no processo de convolução, pois ela visa melhorar a similaridade angular entre os vetores que representam os patches de imagens e os kernels convolucionais. A convolução computa essa similaridade por meio do produto interno entre os vetores, o que implica na necessidade de escalar essa similaridade pela magnitude de ambos vetores. No entanto, o produto interno pode acabar aumentando a similaridade mesmo para patches que estão em ângulos piores, mas distantes. A normalização, como a z-score, ajuda a distribuir os patches em torno da origem do sistema, tornando o espaço de características mais adequado para a operação de convolução. Ela consiste em subtrair a média e dividir pelo desvio-padrão, reduzindo as magnitudes e aumentando os ângulos. A normalização em lote não depende apenas do mini-batch, pois os kernels valem para todo o conjunto de dados, permitindo aprender características da distribuição do dado como um todo, o que não seria possível se a normalização fosse feita apenas no mini-batch.

O processo de normalização em lote segue os seguintes passos:

Cálculo das estatísticas do lote

Para cada mini-lote, são calculadas a média e o desvio padrão das ativações de entrada.

A média do lote (mean) é calculada para cada característica (ou dimensão) como:

mean = (1/m) * ∑(X)

Onde ∑(X) é a soma dos valores de X em todas as dimensões para todos os exemplos no mini-lote.

O desvio padrão do lote (std) é calculado para cada característica como:

std = sqrt((1/m) * ∑((X - mean)^2))

Onde ∑((X — mean)²) é a soma dos quadrados das diferenças entre os valores de X e a média do lote, em todas as dimensões, para todos os exemplos no mini-lote.

Normalização das entradas

As ativações de entrada do mini-lote são normalizadas subtraindo a média do lote e dividindo pelo desvio padrão do lote. Onde as entradas mini-lote X são normalizadas em cada dimensão:

X_norm = (X - mean) / std

Isso garante que as ativações de entrada tenham média zero e variância unitária.

Escalonamento e deslocamento

As entradas normalizadas são escalonadas por um parâmetro ajustável chamado gamma e deslocadas por outro parâmetro ajustável chamado beta. Esses parâmetros são aprendidos durante o treinamento e permitem que o modelo recupere a capacidade de representação da rede, fornecendo a flexibilidade para aprender padrões complexos.

As entradas normalizadas são escalonadas por um parâmetro ajustável gamma e deslocadas por outro parâmetro ajustável beta, em cada dimensão:

Z = gamma * X_norm + beta

Onde gamma e beta são parâmetros aprendidos durante o treinamento e permitem que o modelo restaure a capacidade de representação da rede, dando-lhe a flexibilidade para aprender padrões complexos.

Incorporação no processo de otimização

As entradas normalizadas e escalonadas são passadas pela função de ativação e usadas nas camadas subsequentes da rede neural. Durante a retropropagação, os gradientes são calculados em relação às entradas normalizadas, gamma e beta, e os parâmetros do modelo são atualizados de acordo.

Implementação

Dentro do escopo da linguagem Python, temos alguns frameworks como TensorFlow, PyTorch, Keras, Caffe e MXNet que oferecem suporte para a normalização em lote.

No TensorFlow, a camada tf.keras.layers.BatchNormalization é integrada aos modelos de CNN, melhorando a estabilidade e o desempenho da rede.

O PyTorch disponibiliza a camada torch.nn.BatchNorm2d, projetada especificamente para dados 2D, como imagens, facilitando sua incorporação em modelos de CNN. O Keras, construído sobre o TensorFlow, possui a camada keras.layers.BatchNormalization, permitindo a aplicação da normalização em lote em arquiteturas personalizadas.

O Caffe, focado em eficiência e simplicidade, suporta a normalização em lote por meio da camada BatchNorm, que pode ser facilmente integrada em arquiteturas de CNN.

Por fim, o MXNet oferece a camada mxnet.gluon.nn.BatchNorm para aplicação direta da normalização em lote em modelos de CNN, proporcionando benefícios sem complicações adicionais aos pesquisadores e profissionais.

A implementação com a utilização desses frameworks é bem simples, um exemplo seria uma implementação pequena utilizando TensorFlow, aplicando a camada de normalização, como podemos ver a seguir:

import tensorflow as tf
from tensorflow.keras import layers

# Create a simple CNN model with batch normalization
model = tf.keras.Sequential([
layers.Conv2D(32, (3, 3), activation='relu',input_shape=(32, 32, 3)),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.BatchNormalization(),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.BatchNormalization(),
layers.Dense(10, activation='softmax')
])

# Compile the model
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

# Load and preprocess the CIFAR-10 dataset
(x_train, y_train),(x_test, y_test) = tf.keras.datasets.cifar10.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0

# Train the model
model.fit(x_train, y_train, epochs=10, batch_size=64,
validation_data=(x_test, y_test))

# Evaluate the model
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test accuracy:', test_acc)

Conclusão

Em conclusão, a normalização em lote é uma técnica essencial no uso de redes neurais para melhorar o desempenho e estabilidade do modelo. Ao normalizar as entradas dentro de cada mini-lote durante o treinamento, a média zero e variância unitária são garantidas, o que ajuda a evitar problemas de convergência lenta ou divergência do modelo. Além disso, o escalonamento e deslocamento das entradas normalizadas por meio de parâmetros ajustáveis durante o processo de otimização permitem que o modelo recupere a capacidade de representação da rede, permitindo a aprendizagem de padrões complexos. Portanto, compreender e aplicar corretamente a normalização em lote é fundamental para maximizar o potencial do machine learning e obter resultados mais precisos e confiáveis em diversas áreas de aplicação.

→ Siga o nosso blog pelo Medium e fique por dentro de tudo o que acontece no Ateliê de Software.

Dê um alô pra gente! E nos acompanhe nas redes sociais:

E-mail: contato@atelie.software
Site
Facebook
Instagram
LinkedIn

--

--