IA 101
O que é um Autoencoder?

Se você leu sobre técnicas de aprendizado não supervisionado antes, pode ter encontrado o termo “autoencoder”. Autoencoders são uma das principais maneiras pelas quais os modelos de aprendizado não supervisionado são desenvolvidos. No entanto, o que é exatamente um autoencoder?
Resumidamente, os autoencoders operam pegando os dados, comprimindo e codificando os dados e, em seguida, reconstruindo os dados a partir da representação de codificação. O modelo é treinado até que a perda seja minimizada e os dados sejam reproduzidos o mais próximo possível. Por meio desse processo, um autoencoder pode aprender os recursos importantes dos dados. Embora essa seja uma definição rápida de um autoencoder, seria benéfico dar uma olhada mais próxima nos autoencoders e obter uma melhor compreensão de como eles funcionam. Este artigo tentará desmistificar os autoencoders, explicando a arquitetura dos autoencoders e suas aplicações.
O que é um Autoencoder?
Autoencoders são redes neurais. Redes neurais são compostas por múltiplas camadas, e o aspecto definidor de um autoencoder é que as camadas de entrada contêm exatamente a mesma quantidade de informações que a camada de saída. O motivo pelo qual a camada de entrada e a camada de saída têm exatamente o mesmo número de unidades é que um autoencoder visa replicar os dados de entrada. Ele produz uma cópia dos dados após analisá-los e reconstruí-los de forma não supervisionada.
Os dados que passam por um autoencoder não são apenas mapeados diretamente da entrada para a saída, significando que a rede não copia apenas os dados de entrada. Há três componentes de um autoencoder: uma parte de codificação (entrada) que comprime os dados, um componente que lida com os dados comprimidos (ou gargalo) e uma parte decodificadora (saída). Quando os dados são alimentados em um autoencoder, eles são codificados e, em seguida, comprimidos para um tamanho menor. A rede é então treinada nos dados codificados/comprimidos e produz uma recriação desses dados.
Então, por que você gostaria de treinar uma rede para simplesmente reconstruir os dados que lhe são dados? O motivo é que a rede aprende a “essência” ou os recursos mais importantes dos dados de entrada. Depois de treinar a rede, um modelo pode ser criado que pode sintetizar dados semelhantes, com a adição ou subtração de certos recursos-alvo. Por exemplo, você poderia treinar um autoencoder em imagens granuladas e, em seguida, usar o modelo treinado para remover o grão/ruído da imagem.
Arquitetura do Autoencoder
Vamos dar uma olhada na arquitetura de um autoencoder. Discutiremos a arquitetura principal de um autoencoder aqui. Existem variações nessa arquitetura geral que discutiremos na seção abaixo.

Foto: Michela Massi via Wikimedia Commons, (https://commons.wikimedia.org/wiki/File:Autoencoder_schema.png)
Como mencionado anteriormente, um autoencoder pode ser essencialmente dividido em três componentes diferentes: o codificador, um gargalo e o decodificador.
A parte codificadora do autoencoder é normalmente uma rede feedforward, densamente conectada. O propósito das camadas de codificação é pegar os dados de entrada e comprimi-los em uma representação de espaço latente, gerando uma nova representação dos dados que tem dimensionalidade reduzida.
As camadas de código, ou o gargalo, lidam com a representação comprimida dos dados. O código do gargalo é cuidadosamente projetado para determinar as porções mais relevantes dos dados observados, ou para colocar de outra forma, os recursos dos dados que são mais importantes para a reconstrução dos dados. O objetivo aqui é determinar quais aspectos dos dados precisam ser preservados e quais podem ser descartados. O código do gargalo precisa equilibrar duas considerações diferentes: tamanho da representação (quão compacta é a representação) e relevância da variável/recurso. O gargalo realiza ativação elementar nos pesos e vieses da rede. A camada do gargalo também é às vezes chamada de representação latente ou variáveis latentes.
A camada decodificadora é responsável por pegar os dados comprimidos e convertê-los de volta em uma representação com as mesmas dimensões que os dados originais, inalterados. A conversão é feita com a representação de espaço latente que foi criada pelo codificador.
A arquitetura mais básica de um autoencoder é uma arquitetura feed-forward, com uma estrutura semelhante a um perceptron de camada única usado em redes neurais multilayer. Assim como as redes neurais feed-forward regulares, o autoencoder é treinado por meio do uso da propagação reversa.
Atributos de um Autoencoder
Existem vários tipos de autoencoders, mas todos têm certas propriedades que os unem.
Os autoencoders aprendem automaticamente. Eles não requerem rótulos, e se forem dados suficientes, é fácil obter um autoencoder para atingir um alto desempenho em um tipo específico de dados de entrada.
Os autoencoders são específicos de dados. Isso significa que eles só podem comprimir dados que sejam muito semelhantes aos dados que o autoencoder já foi treinado. Os autoencoders também são perdedores, o que significa que as saídas do modelo serão degradadas em comparação com os dados de entrada.
Ao projetar um autoencoder, os engenheiros de aprendizado de máquina precisam prestar atenção a quatro hiperparâmetros de modelo diferentes: tamanho do código, número de camadas, nós por camada e função de perda.
O tamanho do código decide quantos nós começam a parte do meio da rede, e menos nós comprimem os dados mais. Em um autoencoder profundo, enquanto o número de camadas pode ser qualquer número que o engenheiro considere apropriado, o número de nós em uma camada deve diminuir à medida que o codificador avança. Enquanto isso, o oposto é verdadeiro no decodificador, significando que o número de nós por camada deve aumentar à medida que as camadas do decodificador se aproximam da camada final. Finalmente, a função de perda de um autoencoder é normalmente a entropia cruzada binária ou o erro médio quadrado. A entropia cruzada binária é apropriada para instâncias em que os valores de entrada dos dados estão em uma faixa de 0 a 1.
Tipos de Autoencoders
Como mencionado acima, existem variações na arquitetura clássica do autoencoder. Vamos examinar as diferentes arquiteturas de autoencoders.
Espaço

Foto: Michela Massi via Wikimedia Commons, CC BY SA 4.0 (https://commons.wikimedia.org/wiki/File:Autoencoder_sparso.png)
Enquanto os autoencoders normalmente têm um gargalo que comprime os dados por meio da redução de nós, autoencoders esparsos são uma alternativa a esse formato operacional típico. Em uma rede esparsa, as camadas ocultas mantêm o mesmo tamanho que as camadas de codificação e decodificação. Em vez disso, as ativações dentro de uma camada dada são penalizadas, configurando-a para que a função de perda capture melhor as características estatísticas dos dados de entrada. Para colocar de outra forma, enquanto as camadas ocultas de um autoencoder esparsos têm mais unidades do que um autoencoder tradicional, apenas uma certa porcentagem delas está ativa a qualquer momento. As funções de ativação mais impactantes são preservadas e as outras são ignoradas, e essa restrição ajuda a rede a determinar apenas os recursos mais salientes dos dados de entrada.
Contrativo
Autoencoders contrativos são projetados para ser resistentes a pequenas variações nos dados, mantendo uma representação consistente dos dados. Isso é alcançado aplicando uma penalidade à função de perda. Essa técnica de regularização é baseada na norma de Frobenius da matriz jacobiana para as ativações do codificador de entrada. O efeito dessa técnica de regularização é que o modelo é forçado a construir uma codificação onde entradas semelhantes terão codificações semelhantes.
Convolucional
Autoencoders convolucionais codificam os dados de entrada dividindo os dados em subseções e, em seguida, convertendo essas subseções em sinais simples que são somados para criar uma nova representação dos dados. Semelhante às redes neurais convolucionais, um autoencoder convolucional se especializa no aprendizado de dados de imagem e usa um filtro que é movido por toda a seção da imagem, seção por seção. As codificações geradas pela camada de codificação podem ser usadas para reconstruir a imagem, refletir a imagem ou modificar a geometria da imagem. Uma vez que os filtros sejam aprendidos pela rede, eles podem ser usados em qualquer entrada suficientemente semelhante para extrair os recursos da imagem.
Desruído

Foto: MAL via Wikimedia Commons, CC BY SA 3.0 (https://en.wikipedia.org/wiki/File:ROF_Denoising_Example.png)
Autoencoders desruídos introduzem ruído na codificação, resultando em uma codificação que é uma versão corrompida dos dados de entrada originais. Essa versão corrompida dos dados é usada para treinar o modelo, mas a função de perda compara os valores de saída com os dados de entrada originais e não com os dados de entrada corrompidos. O objetivo é que a rede seja capaz de reproduzir a versão original, não corrompida, da imagem. Ao comparar os dados corrompidos com os dados originais, a rede aprende quais recursos dos dados são mais importantes e quais recursos são não importantes/ruídos. Em outras palavras, para que um modelo desruído os dados corrompidos, ele precisa ter extraído os recursos importantes dos dados de imagem.
Variacional
Autoencoders variacionais operam fazendo suposições sobre como as variáveis latentes dos dados são distribuídas. Um autoencoder variacional produz uma distribuição de probabilidade para os diferentes recursos das imagens de treinamento/atributos latentes. Ao treinar, o codificador cria distribuições latentes para os diferentes recursos das imagens de entrada.

Quando se treina a rede, os dados codificados são analisados e o modelo de reconhecimento produz dois vetores, desenhando a média e o desvio padrão das imagens. Uma distribuição é criada com base nesses valores. Isso é feito para os diferentes estados latentes. A camada decodificadora, então, pega amostras aleatórias da distribuição correspondente e as usa para reconstruir as entradas iniciais da rede.
Aplicações de Autoencoders
Os autoencoders podem ser usados para uma ampla variedade de aplicações, mas normalmente são usados para tarefas como redução de dimensionalidade, desruído de dados, extração de recursos, geração de imagens, previsão de sequência para sequência e sistemas de recomendação.
O desruído de dados é o uso de autoencoders para remover o grão/ruído de imagens. Da mesma forma, os autoencoders podem ser usados para reparar outros tipos de danos de imagem, como imagens borradas ou imagens com seções faltantes. A redução de dimensionalidade pode ajudar redes de alta capacidade a aprender recursos úteis de imagens, significando que os autoencoders podem ser usados para complementar o treinamento de outros tipos de redes neurais. Isso também é verdadeiro para o uso de autoencoders para extração de recursos, pois os autoencoders podem ser usados para identificar recursos de outros conjuntos de dados de treinamento para treinar outros modelos.
Em termos de geração de imagens, os autoencoders podem ser usados para gerar imagens falsas de humanos ou personagens animados, o que tem aplicações no design de sistemas de reconhecimento facial ou na automação de certos aspectos da animação.
Modelos de previsão de sequência para sequência podem ser usados para determinar a estrutura temporal dos dados, significando que um autoencoder pode ser usado para gerar o próximo evento em uma sequência. Por esse motivo, um autoencoder pode ser usado para gerar vídeos. Finalmente, autoencoders profundos podem ser usados para criar sistemas de recomendação, identificando padrões relacionados ao interesse do usuário, com o codificador analisando os dados de engajamento do usuário e o decodificador criando recomendações que se encaixam nos padrões estabelecidos.












