Uma visão conceitual de Redes Neurais — Parte 2: Redes Neurais Profundas

Ricardo Araujo
7 min readDec 3, 2020

--

Vimos na primeira parte que um Perceptron de Múltiplas Camadas (MLP — Multilayer Perceptron) é uma rede neural organizada de forma hierárquica, onde camadas de perceptrons alimentam sucessivas camadas e cada perceptron é conectado a todos perceptrons na camada seguinte e apenas a estes.

Esta organização pode ser compreendida como sucessivas transformações no espaço de representação e o processo de aprendizado, com backpropagation, procura por representações que facilitam a solução do problema de forma linear na saída da rede.

A adição de mais camadas permite representações mais complexas e, para problemas difíceis, ter uma rede profunda pode ser interessante. Infelizmente, treinar uma MLP tradicional com muitas camadas não é viável. O motivo é um fenômeno denominado vanishing gradient, ou gradiente “dissipante”.

O algoritmo backpropagation soluciona o problema de atribuição de crédito no erro da rede a perceptrons que estão distantes da saída e para os quais não sabemos qual seria a saída desejada. Para tanto, o erro conhecido na saída da rede é retropropagado pela rede — mais especificamente, o gradiente do erro é retropropagado.

Um caminho de retropropagação do erro

O gradiente é calculado sobre a derivada da função de ativação. Utilizando uma função sigmóide nos perceptrons, temos que a derivada desta função é próxima de zero para uma grande faixa de valores. A cada camada o gradiente é multiplicado por um valor próximo de zero, se tornando incrementalmente menor.

A função sigmóide (logística) e sua derivada

O resultado é uma convergência lenta, ou nula, nas camadas iniciais. Este é o vanishing gradient e durante muito tempo foi um dos maiores impeditivos para treinar redes mais profundas e, portanto, também para solucionar problemas mais complexos com estes modelos. A solução deste problema foi parte fundamental para a emergência das redes neurais profundas e a consequente renovação no interesse em redes neurais, aprendizado de máquina e inteligência artificial em geral na última década.

Acurácia em um dataset aumentando o número de camadas para funções de ativação logística e ReLU. Notebook.

Diversas estratégias foram propostas para tentar solucionar o problema de apenas ser possível treinar redes rasas. Estas abordagens podem ser combinadas, e com frequência o são.

Uma das primeiras estratégias foi a utilização de pré-treinamento. Redes neurais são tipicamente inicializadas com pesos aleatórios e, portanto, distantes dos pesos ideais que precisam ser encontrados durante o treinamento. Com um gradiente fraco devido a dissipação, o ajuste se torna muito custoso. A ideia por trás do pré-treinamento é pré-inicializar os pesos com valores mais próximos de valores úteis.

Na proposta de Jürgen Schmidhuber, uma rede neural recorrente (RNN) é utilizada. Uma RNN é uma rede neural que recebe na sua entrada a sua própria saída em um tempo anterior, permitindo modelar de forma natural dados sequenciais como séries temporais e linguagem. Schmidhuber propôs treinar cada camada de uma RNN de forma não-supervisionada (ou auto-supervisionada, nos termos mais atuais): cada camada é treinada para prever a próxima entrada na sequência. O efeito é permitir que cada camada aprenda uma representação e, ao final, toda a rede é treinada com backpropagation. Mesmo que as camadas iniciais sejam pouco, ou nada, ajustadas, elas já estão potencialmente com pesos adequados para a tarefa.

Deep Belief Networks, propostas por Geoffrey Hinton, são semelhantes na concepção, mas utilizam redes feedforward convencionais (tecnicamente utiliza Máquinas de Boltzmann Restritas, mas isso é menos importante). Cada camada é tratada como um autoencoder e treinada de forma não-supervisionada para reproduzir a sua própria entrada na saída. As camadas são pré-treinadas em sequência, começando pela camada mais próxima da entrada. A etapa de decodificação do autoencoder é então removida e a representação aprendida é utilizada como entrada para a próxima camada e o processo se repete.

Uma outra alternativa popular são as Redes Residuais (ResNets). Estas redes introduzem conexões adicionais que pulam camadas, criando redes mais rasas paralelas à rede profunda original, amenizando o problema do gradiente dissipante.

Uma Rede Residual cria uma “via expressa” na rede para retropropagar o gradiente

Funções de ativação alternativas que amenizam o gradiente dissipante também foram propostas e hoje a mais popular é a Rectified Linear Unit (ReLU): para valores positivos, a saída é igual a entrada; para valores negativo, a saída é zero.

A função ReLU

Apesar da função não ser derivável em zero, isso é usualmente resolvido simplesmente definindo uma exceção para este caso. O gradiente para x>0 é sempre 1 e, portanto, não há dissipação.

Redes neurais bastante profundas podem ser treinadas com os métodos adequados para evitar a dissipação do gradiente. No entanto, para certos tipos de problemas a utilização de uma MLP ainda é inadequada.

Considere o problema de classificação de imagens. Aqui temos duas possibilidades. Em uma, utilizamos engenharia de atributos para extrair das imagens um número relativamente pequeno de atributos antes de passá-la para o modelo. Idealmente, os atributos se aproveitam de conhecimento do domínio, mas muitas técnicas genéricas de extração de atributos de imagens foram propostas, como HOG. A vasta maioria das aplicações de aprendizado de máquina em imagens até o início dos anos 2000 se utilizava desta abordagem. Por exemplo, um sistema de reconhecimento de faces popular é o Viola-Jones e utiliza filtros extratores de atributos especificados para se ajustarem a características faciais.

Alternativamente, podemos alimentar o modelo com os pixels brutos da imagem. Esta abordagem é desejável pois permitira que o modelo aprenda atributos relevantes, independente do conteúdo das imagens — afinal, um atributo relevante para faces não seria o mesmo para artes abstratas, por exemplo. Se o modelo for uma MLP e a imagem em tons de cinza, teríamos cada pixel ligado a todos neurônios da primeira camada oculta. Supondo uma imagem de 128x128 pixels e 50 neurônios, teríamos no total 810.200 pesos na primeira camada. Esse número cresce rapidamente com o tamanho da imagem e número de neurônios e imagens coloridas precisariam de pelo menos três vezes mais pesos.

Mesmo que podendo treinar uma MLP profunda, o problema de termos um espaço de hipóteses enorme devido a quantidade de pesos permanece, tornando o treinamento difícil. Para solucionar este problema, descarta-se a estrutura genérica da MLP e favorece-se arquiteturas especializadas. Uma destas arquiteturas é a Rede Neural Convolucional (CNN — Convolutional Neural Network).

A ideia por trás da CNN é reduzir drasticamente o número de pesos necessários para introduzir a imagem na rede. Isto é possível devido ao fato de que pixels em imagens possuem relações espaciais — atributos relevantes tendem a ser definidos por pixels próximos espacialmente. Uma MLP não faz esta distinção ao conectar todos pixels a todos neurônios. Assim, por exemplo, se desejamos reconhecer um olho em uma face, os pixels relevantes que formam o olho estarão agrupados em uma região específica e não espalhados em locais arbitrários da imagem.

A CNN resolve isso pelo uso de filtros ou kernels. Um filtro nada mais é que um neurônio que se conecta a uma região da imagem de tamanho específico. Um filtro 3x3, por exemplo, especifica 9 pesos ligados à imagem, como abaixo:

Um neurônio conectado a uma janela 3x3 na imagem

A saída do neurônio pode ser calculada como em um perceptron convencional (usando ReLU tipicamente). Esta saída compõe um novo pixel em uma nova imagem, chamada de mapa de características (feature map). O truque da CNN é reutilizar os pesos do perceptron por toda a imagem. Isso é feito movendo a janela pela imagem; cada janela amostrada gerará um pixel novo no mapa de características. Este mapa depende dos pesos específicos do neurônio e da imagem de entrada e pesos diferentes extraem características diferentes. Isso é equivalente a aplicação de um filtro de processamento digital de imagens, como os que podemos aplicar no Photoshop para borrar ou evidenciar bordas em uma foto. Porém, estes filtros são aprendidos durante o processo de treinamento da rede.

Resultado (direita) da aplicação de um filtro 3x3 (centro) sobre uma imagem (esquerda)

Arquiteturas de CNN tipicamente empregam algumas dezenas a centenas de filtros, cada um podendo se especializar na extração de alguma característica da imagem original. Se tomarmos 128 filtros, cada um 5x5, ambos números típicos, teremos um total de 3.200 pesos, um número muito inferior a se empregássemos uma MLP.

Uma CNN aplica múltiplas camadas de convolução como a descrita acima, por vezes com camadas adicionais para redução de dimensionalidade (denominadas pooling). Cada camada extrai novas características a partir das características extraídas na camada anterior, como uma MLP. Para mais detalhes, recomenda-se esta leitura.

Ainda que CNNs datem de um artigo de Yan LeCun de 1989, e sejam amplamente baseadas no conceito anterior de Neocognitron do final da década de 70, a arquitetura se popularizou devido ao ImageNet Challenge, um grande desafio anual onde competidores submetem algoritmos para reconhecer imagens entre 1000 classes possíveis. A imagem abaixo mostra o erro das submissões em cada ano. A submissão por Alex Krizhevsky e colaboradores (incluindo Geoffrey Hinton), denominada AlexNet, reduziu drasticamente o erro em relação a competição e em anos subsequentes todas melhores submissões passaram a ser baseadas em CNNs.

Cada ponto representa as melhores submissões para a ImageNet Challenge a cada ano. Adaptado daqui.

--

--

Ricardo Araujo

Computer Science professor at UFPel. Machine Learning and Artificial Intelligence practitioner and researcher.