Pular para o conteúdo principal

Normalização em lote: Teoria e implementação do TensorFlow

A normalização do lote padroniza as entradas do minilote para estabilizar e acelerar o treinamento da rede neural.
Actualizado 30 de jul. de 2024  · 15 min de leitura

O treinamento de redes neurais profundas pode ser desafiador devido ao desaparecimento ou explosão de gradientes e à mudança de covariável interna. Esses fatores podem retardar significativamente o processo de treinamento e prejudicar a capacidade de aprendizado eficaz da rede. Felizmente, podemos resolver esses problemas com técnicas de normalização.

Embora existam muitas técnicas de normalização, a normalização em lote é uma das mais populares e se tornou um componente padrão em muitas arquiteturas de aprendizagem profunda. Isso contribui para uma convergência mais rápida, maior estabilidade de treinamento e melhor desempenho de generalização.

Neste tutorial, explicaremos a normalização em lote, como ela funciona matematicamente e como implementá-la usando o TensorFlow e o Keras.

Se você quiser aprender os fundamentos das redes neurais usando o Keras, confira este curso Introdução à aprendizagem profunda em Python.

O que é normalização no machine learning?

A normalização é uma etapa crucial de pré-processamento no machine learning que visa padronizar os dados de entrada.

Várias técnicas de normalização, como escalonamento mínimo-máximo, normalização de pontuação z e transformação de log, são comumente usadas para redimensionar os recursos para um intervalo ou distribuição consistente. Essas técnicas ajudam a atenuar o impacto dos outliers, melhoram a convergência e garantem uma comparação justa entre os recursos.

A normalização dos dados de entrada é essencial para o treinamento eficaz do modelo, pois garante que todos os recursos contribuam igualmente para o processo de aprendizado. Sem a normalização, os recursos com escalas ou variações maiores podem dominar o processo de otimização, levando a um desempenho de modelo abaixo do ideal.

A normalização permite que o modelo aprenda padrões e relacionamentos significativos a partir dos dados, trazendo todos os recursos para uma escala semelhante.

Se você quiser saber mais sobre normalização em geral, confira este tutorial sobre o que é normalização em machine learning.

Desafios do treinamento de aprendizagem profunda

O treinamento de redes neurais profundas apresenta vários desafios que podem dificultar a convergência e a generalização:

  1. Mudança de covariável interna: Como os dados de entrada passam por várias camadas, a distribuição das ativações pode mudar, dificultando a adaptação e o aprendizado eficaz do modelo.
  2. Desaparecimento e explosão de gradientes: As redes profundas podem sofrer com gradientes que desaparecem ou explodem, nos quais os gradientes se tornam muito pequenos ou muito grandes durante a retropropagação, impedindo atualizações eficazes de peso.
  3. Sensibilidade à inicialização: Os pesos iniciais da rede podem afetar significativamente o processo de treinamento, e uma inicialização ruim pode levar a uma convergência lenta ou até mesmo a uma falha no treinamento.

A normalização de lotes aborda esses desafios normalizando as ativações dentro de cada mini-lote, ajudando a estabilizar o processo de treinamento e a melhorar o desempenho do modelo.

O que é a normalização em lote?

A normalização de lote é uma técnica que normaliza as ativações de uma camada em um mini-lote durante o treinamento de redes neurais profundas.

Ele funciona calculando a média e a variação das ativações de cada recurso no minilote e, em seguida, normalizando as ativações usando essas estatísticas.

Em seguida, as ativações normalizadas são dimensionadas e deslocadas usando parâmetros que podem ser aprendidos, permitindo que o modelo se adapte à distribuição de ativação ideal.

normalização de lotes
IA

Fonte: Yintai Ma e Diego Klabjan.

Normalmente, a normalização de lote é aplicada após a transformação linear de uma camada (por exemplo, após a multiplicação da matriz em uma camada totalmente conectada ou após a operação de convolução em uma camada convolucional) e antes da função de ativação não linear (por exemplo, ReLU).

Os principais componentes da normalização de lotes são:

  1. Estatísticas de mini-lotes: A média e a variação das ativações são calculadas para cada recurso dentro do minilote.
  2. Normalização: As ativações são normalizadas subtraindo-se a média do minilote e dividindo-se pelo desvio padrão do minilote.
  3. Dimensionamento e deslocamento: Parâmetros que podem ser aprendidos (γ e β) são introduzidos para dimensionar e deslocar as ativações normalizadas, permitindo que o modelo aprenda a distribuição ideal de ativação.

Por que usar a normalização em lote?

Um dos desafios que enfrentamos ao treinar redes neurais profundas é a mudança de covariável interna. Isso acontece quando a distribuição das ativações (saídas) de uma camada muda ao longo do processo de treinamento à medida que os pesos nas camadas anteriores são atualizados. Essa mudança pode tornar o treinamento difícil e lento.

A normalização de lotes reduz essa mudança normalizando as ativações dentro de cada mini-lote, tornando as entradas das camadas subsequentes mais estáveis e consistentes.

A normalização das ativações permite uma convergência mais rápida com taxas de aprendizado mais altas e torna o modelo menos sensível às escolhas de inicialização.

Além disso, ele introduz um efeito de regularização que ajuda a evitar o ajuste excessivo, reduzindo a dependência do modelo de padrões de ativação específicos.

Essa combinação de benefícios torna a normalização em lote uma ferramenta avançada para o treinamento de modelos de aprendizagem profunda mais robustos. Para saber mais sobre como criar modelos robustos, confira este curso sobre conceitos de monitoramento de machine learning.

A matemática por trás da normalização de lotes

Agora que entendemos o "porquê" da normalização de lotes, vamos nos aprofundar no "como".

A normalização em lote funciona de forma diferente durante os estágios de treinamento e inferência, portanto, vamos explicar a matemática por trás de cada estágio.

Normalização de lotes durante o treinamento

Vamos começar com a etapa de normalização. Primeiro, calculamos a média e a variação de cada recurso em um mini-lote. Essas são as fórmulas que podemos usar para a média e a variância.

Em seguida, usamos a média e a variação para normalizar as ativações. Essa é a fórmula que podemos usar, em que o ε (épsilon minúsculo) é uma pequena constante adicionada para estabilidade numérica:

Depois de concluirmos a etapa de normalização, passamos para a etapa de dimensionamento e deslocamento. Usando os parâmetros aprendíveis γ e β, deslocamos as ativações normalizadas usando esta fórmula:

Esses parâmetros permitem que o modelo aprenda a distribuição de ativação ideal.

Normalização de lotes durante a inferência

Durante a inferência, substituímos as estatísticas de lote (média e variância) pelas estatísticas em execução calculadas durante o treinamento. Normalmente, as estatísticas de execução são atualizadas usando uma média móvel com um fator de impulso.

Para calcular a média e a variância em execução, podemos usar essas duas fórmulas, em que α é o fator de momento que controla a taxa de atualização das estatísticas em execução:

A média e a variância em execução são armazenadas como parâmetros do modelo e usadas para normalização durante a inferência. Os parâmetros de escala e deslocamento (γ e β) aprendidos durante o treinamento também são usados durante a inferência.

A seguir, vamos aprender como implementar a normalização em lote usando o TensorFlow.

Normalização de lote no TensorFlow

Vamos começar importando as bibliotecas necessárias:

import tensorflow as tf 
from tensorflow import keras

Em seguida, vamos carregar o conjunto de dados MNIST, que consiste em 60.000 imagens de treinamento e 10.000 imagens de teste de dígitos manuscritos. Carregamos o conjunto de dados usando a função keras.datasets.mnist.load_data() e o dividimos em dados de treinamento (x_train, y_train) e dados de teste (x_test, y_test):

# Load the MNIST dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

Para pré-processar os dados, seguimos as seguintes etapas:

  • Reformulamos as imagens de treinamento e teste para que tenham a forma de (num_samples, 28, 28, 1), em que num_samples é o número de imagens, e cada imagem é uma imagem em escala de cinza de 28x28 com um único canal.
  • Normalizamos os valores de pixel das imagens dividindo-os por 255,0 para dimensioná-los entre 0 e 1.
  • Convertemos os rótulos de treinamento e teste em um formato categórico usando keras.utils.to_categorical(), que converte os rótulos inteiros em vetores codificados com um único disparo.
# Preprocess the data
x_train = x_train.reshape((60000, 28, 28, 1)) / 255.0  # Reshape and normalize training images
x_test = x_test.reshape((10000, 28, 28, 1)) / 255.0    # Reshape and normalize test images
y_train = keras.utils.to_categorical(y_train)         # Convert training labels to categorical format
y_test = keras.utils.to_categorical(y_test)           # Convert test labels to categorical format

Agora, passamos para a próxima etapa: definir a arquitetura do modelo. Para isso, tomamos as seguintes medidas:

  • Definimos a arquitetura do modelo usando a API keras.Sequential, que permite empilhar camadas sequencialmente.
  • O modelo consiste em camadas convolucionais (Conv2D) para extração de recursos, seguidas por camadas de normalização em lote (BatchNormalization) para normalizar as ativações.
  • Usamos o max pooling (MaxPooling2D) para reduzir a amostragem dos mapas de recursos.
  • Achatamos os mapas de recursos (Flatten) antes de passá-los para as camadas densas.
  • A camada densa final tem 10 unidades com ativação softmax, correspondentes às 10 classes de dígitos.
# Define the model architecture
model = keras.Sequential([
    keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation='softmax')
])

Em seguida, compilamos o modelo usando o método .compile(), especificando o otimizador, a função de perda e a métrica de avaliação. Nós usamos:

  • O otimizador Adam ('adam') para otimização.
  • A perda de entropia cruzada categórica ('categorical_crossentropy') como função de perda, pois o problema é uma tarefa de classificação multiclasse.
  • Precisão ('accuracy') como a métrica de avaliação para medir o desempenho do modelo.
# Compile the model
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

Em seguida, vamos treinar o modo usando o método .fit():

  • Especificamos os dados de treinamento (x_train, y_train), o tamanho do lote, o número de épocas e os dados de validação (x_test, y_test).
  • O endereço batch_size determina o número de amostras por atualização de gradiente.
  • O parâmetro epochs especifica o número de vezes que o modelo será iterado em todos os dados de treinamento.
  • Os dados de validação são usados para avaliar o desempenho do modelo em dados não vistos durante o treinamento.
# Train the model
model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test))

Seguindo essas etapas e incorporando camadas de normalização em lote à arquitetura do modelo, podemos treinar o modelo de forma eficiente no conjunto de dados MNIST, beneficiando-nos da normalização das ativações e da estabilidade aprimorada do treinamento.

Agora que já aprendemos sobre a normalização de lotes e como implementá-la, vamos examinar seus benefícios.

Considerações sobre a implementação

Vamos agora dar uma olhada mais profunda na implementação da normalização de lotes em arquiteturas de aprendizagem profunda.

Colocação em arquiteturas de redes neurais

As camadas de normalização de lotes são mais eficazes quando colocadas estrategicamente em nossa rede. Normalmente, elas são colocadas após a transformação linear (por exemplo, camadas convolucionais ou totalmente conectadas) e antes da função de ativação não linear.

Nas redes convolucionais, isso se traduz em colocar a normalização de lote após cada camada convolucional e antes da função de ativação.

Da mesma forma, em redes totalmente conectadas, é comum adicionar a normalização de lote após a transformação linear e antes da função de ativação de cada camada oculta.

O posicionamento das camadas de normalização em lote pode influenciar o desempenho do nosso modelo e a dinâmica do treinamento. Pode ser necessário fazer experimentos para encontrar a configuração ideal para cada arquitetura de rede específica.

Impacto do tamanho do lote

O tamanho do lote usado durante o treinamento pode afetar a eficácia da normalização do lote. Tamanhos de lote maiores fornecem estimativas mais precisas das estatísticas do lote (média e variância), levando a uma melhor normalização e a um treinamento mais estável.

No entanto, o aumento do tamanho do lote também aumenta o consumo de memória e os requisitos computacionais, o que pode ser uma restrição, dependendo dos recursos de hardware disponíveis.

É importante equilibrar o tamanho do lote e a viabilidade computacional e, ao mesmo tempo, garantir que as estatísticas do lote permaneçam confiáveis para a normalização.

Efeitos e implicações da regularização

A normalização de lotes introduz inerentemente um efeito de regularização devido ao ruído induzido pelas estatísticas de mini-lotes. A estocasticidade introduzida pelas estatísticas de lote atua como uma forma de regularização, reduzindo o excesso de ajuste e melhorando a generalização.

No entanto, esse efeito de regularização pode interagir com outras técnicas de regularização, como a regularização de desistência ou L2.

Ao usar a normalização em lote, é essencial considerar a interação entre os diferentes métodos de regularização e ajustá-los adequadamente para evitar o excesso de regularização ou a diminuição do desempenho.

A experimentação e o monitoramento do desempenho do modelo nos dados de validação podem ajudar a encontrar o equilíbrio certo das técnicas de regularização ao usar a normalização em lote.

Limitações e desafios da normalização em lote

Embora a normalização em lote seja uma técnica útil, há algumas limitações e desafios dos quais precisamos estar cientes.

Normalização de lotes em arquiteturas não evolutivas

A normalização em lote foi originalmente projetada para redes neurais convolucionais (CNNs) e tem sido particularmente bem-sucedida nesse domínio.

No entanto, sua eficácia em arquiteturas não evolutivas, como redes neurais recorrentes (RNNs) ou transformadores, pode ser limitada.

A natureza sequencial dos RNNs e os mecanismos de atenção nos transformadores podem tornar a aplicação da normalização em lote mais desafiadora.

Técnicas alternativas de normalização, como a normalização de camadas ou a normalização de instâncias, podem ser mais adequadas para essas arquiteturas.

Pequenos tamanhos de lote e desempenho em tempo de inferência

A normalização de lote se baseia nas estatísticas de lote computadas durante o treinamento para normalizar as ativações. Quando o tamanho do lote é pequeno, as estatísticas do lote podem se tornar menos confiáveis e introduzir ruído ou instabilidade no processo de normalização.

Isso pode levar a um desempenho abaixo do ideal ou até mesmo a dificuldades de treinamento, especialmente quando o tamanho do lote é reduzido para acomodar restrições de memória.

Durante a inferência, a normalização de lotes usa as estatísticas de execução calculadas durante o treinamento, que podem não representar com precisão as estatísticas de amostras individuais ou de pequenos lotes. Isso pode resultar em uma incompatibilidade entre as distribuições de treinamento e inferência, o que pode afetar o desempenho do modelo.

Desvantagens e desvantagens da normalização em lote

A normalização em lote introduz uma sobrecarga computacional adicional durante o treinamento devido ao cálculo das estatísticas do lote e à operação de normalização. Essa sobrecarga pode aumentar os requisitos de memória e o tempo de treinamento, especialmente para modelos ou conjuntos de dados grandes.

A normalização em lote pode não ser adequada para determinados tipos de dados ou tarefas em que o processo de normalização pode distorcer informações importantes ou remover variações significativas.

Por exemplo, a normalização em lote pode ter efeitos indesejáveis em tarefas que envolvem detalhes refinados ou informações espaciais precisas, como segmentação ou localização.

O efeito de regularização da Normalização em lote pode, às vezes, interagir com outras técnicas de regularização, como o dropout, de maneiras inesperadas, exigindo ajuste e consideração cuidadosos.

Como atenuar as limitações da normalização em lote

Apesar das limitações e dos desafios, a normalização em lote continua sendo uma técnica eficaz e amplamente usada na aprendizagem profunda. Pesquisadores e profissionais continuam explorando maneiras de resolver esses problemas e melhorar a formulação original.

Vamos considerar algumas abordagens para atenuar as limitações da normalização em lote:

  • Normalização adaptativa de lotes: Essa técnica ajusta as estatísticas do lote com base nas características específicas de cada amostra, ajudando a aliviar os problemas associados a lotes pequenos.
  • Normalização de lotes virtuais: Esse método calcula as estatísticas de normalização usando um lote virtual que inclui amostras de vários lotes, melhorando a estabilidade e a confiabilidade do processo de normalização.
  • Técnicas de normalização híbridas: A combinação da normalização em lote com outros métodos de normalização, como a normalização de camadas ou a normalização de instâncias, pode ajudar a lidar com as limitações específicas de determinadas arquiteturas ou tarefas.

Variantes e extensões da normalização em lote

Vamos ver agora diferentes variantes e extensões da normalização em lote que também podem ser usadas para atenuar os possíveis desafios apresentados pela normalização em lote.

Normalização de camadas

A normalização da camada opera nas ativações de todos os canais em uma camada, em vez de na dimensão do lote.

Ele normaliza as ativações com base na média e na variação calculadas para cada amostra individual no lote.

A normalização de camadas é particularmente útil para redes neurais recorrentes (RNNs) e cenários em que o tamanho do lote é pequeno ou variável.

Normalização de grupos

A normalização de grupo divide os canais em grupos e calcula as estatísticas de normalização em cada grupo.

Ele equilibra a normalização de camadas e a normalização de lotes, normalizando um subconjunto de canais juntos.

A normalização de grupos é eficaz em cenários em que o tamanho do lote é limitado, como em ambientes com restrição de memória ou no processamento de imagens de alta resolução.

Normalização de instâncias

A normalização de instância aplica a normalização a cada canal individual de cada amostra no lote.

Ele é comumente usado em tarefas de transferência de estilo e geração de imagens, em que o objetivo é normalizar o conteúdo e, ao mesmo tempo, preservar as informações de estilo.

Foi demonstrado que a normalização de instâncias melhora a qualidade e a estabilidade das imagens geradas em tais aplicativos.

Renormalização em lote

A renormalização em lote amplia a normalização em lote, introduzindo termos de correção adicionais no processo de normalização.

Seu objetivo é resolver a discrepância entre as estatísticas do lote e as estatísticas da população, especialmente quando o tamanho do lote é pequeno.

A renormalização do lote ajuda a estabilizar o treinamento e melhora a capacidade de generalização do modelo, principalmente em cenários com tamanhos de lote limitados.

Normalização de peso

A normalização de pesos é uma técnica que reparametriza os pesos de uma rede neural para desacoplar a magnitude e a direção dos pesos.

Ele normaliza os pesos dividindo-os por sua norma euclidiana e introduz um parâmetro de escala que pode ser aprendido.

A normalização de peso pode ser usada em conjunto com a normalização em lote ou como um método de normalização alternativo.

Foi demonstrado que ele melhora o condicionamento do problema de otimização e acelera a convergência em alguns casos.

Essas variantes e extensões da normalização em lote oferecem ferramentas e técnicas adicionais para enfrentar desafios específicos e melhorar o treinamento e o desempenho dos modelos de aprendizagem profunda. Cada variante tem seus pontos fortes e suas considerações, e a escolha de qual delas usar depende dos requisitos específicos da tarefa, da arquitetura do modelo e dos recursos computacionais disponíveis.

Conclusão

A normalização de lotes tornou-se uma técnica crucial na aprendizagem profunda, oferecendo benefícios significativos para o treinamento de redes neurais profundas.

Ao normalizar as ativações nos minilotes, podemos resolver a mudança de covariável interna, melhorar a convergência e aprimorar a generalização. Como um profissional de dados aspirante ou júnior, tenha em mente estes pontos-chave:

  • Incorpore camadas de normalização de lote em seus modelos de aprendizagem profunda para melhorar a estabilidade e o desempenho do treinamento.
  • Faça experiências com a colocação de camadas de normalização de lote e monitore o impacto no desempenho do seu modelo.
  • Mantenha-se atualizado com as pesquisas e os avanços mais recentes em técnicas de normalização para aproveitar os métodos mais eficazes para seus projetos.

Se você quiser se tornar um engenheiro de machine learning, considere este programa de carreira de 12 cursos sobre como se tornar um engenheiro de machine learning.

Temas

Saiba mais sobre IA e machine learning!

programa

AI Fundamentals

10hrs hr
Discover the fundamentals of AI, dive into models like ChatGPT, and decode generative AI secrets to navigate the dynamic AI landscape.
Ver DetalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

tutorial

Como treinar um LLM com o PyTorch

Domine o processo de treinamento de grandes modelos de linguagem usando o PyTorch, desde a configuração inicial até a implementação final.

Zoumana Keita

8 min

tutorial

Stemming e lematização em Python

Este tutorial aborda o stemming e a lematização de um ponto de vista prático usando o pacote Python Natural Language ToolKit (NLTK).
Kurtis Pykes 's photo

Kurtis Pykes

12 min

tutorial

Guia de Introdução ao Ajuste Fino de LLMs

O ajuste fino dos grandes modelos de linguagem (LLMs, Large Language Models) revolucionou o processamento de linguagem natural (PLN), oferecendo recursos sem precedentes em tarefas como tradução de idiomas, análise de sentimentos e geração de textos. Essa abordagem transformadora aproveita modelos pré-treinados como o GPT-2, aprimorando seu desempenho em domínios específicos pelo processo de ajuste fino.
Josep Ferrer's photo

Josep Ferrer

12 min

tutorial

Tutorial para entender a regressão logística em Python

Aprenda sobre a regressão logística, suas propriedades básicas e crie um modelo de aprendizado de máquina em um aplicativo do mundo real em Python.
Avinash Navlani's photo

Avinash Navlani

10 min

tutorial

Uma introdução ao Q-Learning: Um tutorial para iniciantes

Saiba mais sobre o algoritmo mais popular de aprendizado por reforço sem modelo com um tutorial em Python.
Abid Ali Awan's photo

Abid Ali Awan

16 min

tutorial

Dominando a retropropagação: Um guia abrangente para redes neurais

Mergulhe nos fundamentos da retropropagação em redes neurais com um guia prático para treinar e avaliar um modelo para um cenário de uso de classificação de imagens.
Zoumana Keita 's photo

Zoumana Keita

14 min

Ver maisVer mais