Autoencoders – Vanilla

1.2.5 – Geracao de Dados
1.2.5.1 – Redes Neurais
1.2.5.1.1 – Autoencoders – Vanilla
LEGENDA
Principal
Ramo
Metodo
Problemas
Modelo
Arquitetura

O que é geração de dados com autoencoders

Geração de dados é uma tarefa não supervisionada fascinante. Ela cria novos exemplos similares aos dados originais. Primeiramente, o modelo aprende a estrutura escondida nos dados. Em seguida, ele gera amostras sintéticas realistas. Por exemplo, podemos criar novas imagens de dígitos manuscritos. Autoencoders são redes neurais ideais para essa finalidade. Eles comprimem dados em uma representação menor (codificação). Depois, reconstroem os dados a partir dessa codificação. O autoencoder vanilla é a versão mais simples dessa arquitetura. Ele tem apenas uma camada oculta no codificador e decodificador. Diferentemente de modelos complexos, ele é fácil de entender. Além disso, seu treinamento é estável e rápido.

Essa técnica tem várias aplicações práticas importantes. Primeiramente, ela pode aumentar conjuntos de dados pequenos. Outra aplicação é a remoção de ruído de imagens. Além disso, autoencoders detectam anomalias por erro de reconstrução. Por conseguinte, eles são usados em segurança e medicina. A geração de dados também ajuda em privacidade diferencial. Portanto, autoencoders são ferramentas versáteis e poderosas. Este guia foca no autoencoder vanilla para iniciantes. Vamos explorar sua arquitetura, hiperparâmetros e fórmulas. No final, um exemplo prático com o dataset MNIST será apresentado.

Arquitetura do autoencoder vanilla

O autoencoder vanilla tem duas partes principais simétricas. Primeiramente, o codificador comprime a entrada em um código. Ele é uma rede feedforward com uma camada oculta. A função de ativação ReLU é comumente usada no codificador. A camada de gargalo (bottleneck) tem menos neurônios que a entrada. Essa compressão força o modelo a aprender características essenciais. A fórmula da codificação é: \(h = f(W_e x + b_e)\). Aqui, \(f\) é a função de ativação escolhida. Em seguida, o decodificador reconstrói os dados a partir de \(h\). Ele também tem uma camada oculta com ativação ReLU. A saída final usa ativação sigmoide para dados normalizados. A reconstrução é calculada como: \(\hat{x} = g(W_d h + b_d)\). O objetivo é minimizar a diferença entre \(x\) e \(\hat{x}\). Essa arquitetura é treinada com retropropagação normal. Portanto, é um ótimo ponto de partida para iniciantes.

O autoencoder vanilla é chamado de “vanilla” por ser básico. Ele não possui regularizações como dropout ou esparsidade. Contudo, sua simplicidade facilita o entendimento do conceito. A camada de gargalo é o coração do autoencoder. Quanto menor o gargalo, maior a compressão forçada. Isso pode levar a perda de informações relevantes. Por outro lado, um gargalo muito grande não comprime bem. O equilíbrio é encontrado experimentalmente para cada problema. A simetria entre codificador e decodificador é comum. Porém, não é obrigatória para o funcionamento do modelo. Autoencoders mais avançados usam camadas convolucionais. Para imagens, eles capturam melhor padrões espaciais. O vanilla, entretanto, trata cada pixel como uma característica. Isso funciona bem para dados tabulares e imagens pequenas. O MNIST (28×28) é um exemplo clássico de aplicação.

Hiperparâmetros e fórmulas matemáticas

Vários hiperparâmetros controlam o autoencoder vanilla. Primeiramente, o tamanho do gargalo é o mais crítico. Ele define quantas características latentes serão aprendidas. A taxa de aprendizado afeta a convergência do treinamento. Além disso, o número de épocas determina o tempo de treino. O tamanho do lote (batch) influencia a estabilidade do gradiente. A escolha da função de ativação também é importante. ReLU é comum nas camadas ocultas do codificador e decodificador. A saída do decodificador usa sigmoide para dados entre 0 e 1. A regularização L2 pode ser aplicada para evitar overfitting. Outro hiperparâmetro é o otimizador (Adam, SGD, etc.). Adam é geralmente a melhor escolha para autoencoders. A inicialização dos pesos afeta a qualidade final. Portanto, todos esses parâmetros precisam ser ajustados. A validação cruzada ajuda a encontrar os melhores valores.

A função de perda mais comum é o erro quadrático médio: \(MSE = \frac{1}{N}\sum_{i=1}^{N} ||x_i – \hat{x}_i||^2\). Para dados binários, a entropia cruzada binária é preferida: \(L = -\frac{1}{N}\sum_{i=1}^{N} [x_i \log(\hat{x}_i) + (1-x_i)\log(1-\hat{x}_i)]\). A retropropagação calcula os gradientes dessa perda. A atualização dos pesos segue a regra do gradiente descendente: \(w_{novo} = w_{velho} – \eta \frac{\partial L}{\partial w}\). O treinamento continua até a perda estabilizar. Após o treinamento, o decodificador pode gerar novos dados. Basta amostrar pontos aleatórios no espaço latente. Contudo, o autoencoder vanilla não garante um espaço contínuo. Para geração mais controlada, Variational Autoencoders são melhores. Ainda assim, o vanilla é um excelente primeiro passo. Ele ensina os conceitos fundamentais de compressão e reconstrução.

Enunciado do exemplo clássico (dígitos MNIST)

Você recebeu imagens de dígitos manuscritos do MNIST. Cada imagem tem 28×28 pixels em escala de cinza. Seu objetivo é treinar um autoencoder vanilla para gerar novos dígitos. Primeiramente, use 10 neurônios no gargalo (espaço latente). Em seguida, treine o modelo para reconstruir as imagens originais. Depois, visualize 10 imagens originais e suas reconstruções. Por fim, gere novos dígitos amostrando do espaço latente. Use duas amostras aleatórias para interpolação linear. Exiba os resultados em dois gráficos organizados. O código abaixo resolve este enunciado completamente. Ele roda no Google Colab sem necessidade de ajustes. Portanto, boa prática! Autoencoders geram dados sintéticos realistas.

Esse código treina um autoencoder vanilla no dataset MNIST. Primeiramente, as imagens são normalizadas entre 0 e 1. O gargalo tem apenas 10 neurônios para forçar compressão. As reconstruções mostram que o modelo aprendeu bem. A interpolação entre dois dígitos gera transições suaves. Além disso, a geração aleatória produz novos dígitos plausíveis. A curva de perda confirma que não houve overfitting severo. Contudo, as imagens geradas são um pouco borradas. Para melhor qualidade, Variational Autoencoders são recomendados. Portanto, o autoencoder vanilla é um excelente ponto de partida. Parabéns por gerar novos dados sintéticos com sucesso!

Deixe um comentário