Redes Neurais | Redes Neurais Convolucionais

As redes neurais especializadas em imagens.

Rodrigo Estevam
Turing Talks
10 min readNov 3, 2019

--

Escrito por Rodrigo Estevam e Rodrigo Fill Rangel.

Olá amável ser!

Que tal relaxar um pouco, pegar um café e aprender um novo algoritmo muito útil para aplicações de IA em reconhecimento de imagens?

Então se acomode e aproveite!

No Turing Talks #19 em diante nós falamos bastante sobre Redes Neurais, sua construção e seu poder de reconhecimento de padrões. Neste artigo, expandiremos essa noção apresentando uma importantíssima arquitetura de Redes Neurais: as Redes Neurais Convolucionais.

Introdução

Você já abriu o Facebook em uma foto aleatória de um amigo ou conhecido que apareceu no seu feed e viu que o próprio Facebook já sabia quais pessoas estavam na foto, e de quebra ainda perguntava se você quer marcá-las; bom este é um bom exemplo de Redes Neurais Convolucionais aplicadas ao cotidiano. O Instagram também já aplica muitas redes neurais convolucionais. Na realidade, quase todas as empresas que têm acesso à uma grande quantidade de imagens têm interesse em saber como obter mais informações delas. O Facebook e o Instagram são apenas alguns dos exemplos, ainda existem outros como o Google, que também usa CNNs — vamos carinhosamente apelidar as redes neurais convolucionais de CNNs — para sua ferramenta de pesquisa de imagens no site.

Aqui o Facebook está te usando para treinar as redes deles.

Mas se elas são assim tão maravilhosas, por que essa ferramenta está em alta só agora? E de onde vem tanto entusiasmo quanto às CNNs? Bom, para responder essas perguntas precisamos voltar alguns anos no tempo; mais especificamente, para 2012, no ILSVRC (ImageNet Large-Scale Visual Recognition Challenge), um dos maiores eventos de visão computacional do mundo. Neste ano Alex Krizhevsky, Ilya Sutskever, and Geoffrey Hinton apresentaram o que eles chamaram de uma “rede neural convolucional grande e profunda”, a AlexNet, que seria o primeiro algoritmo de Deep Learning aplicado à visão computacional a ter o melhor desempenho na competição, com a taxa de erro de 15.4%, enquanto, para efeito de comparação, o segundo melhor algoritmo da competição teve um desempenho de 26.2%. Neste momento as CNNs tomaram os holofotes da visão computacional.

No ano seguinte a ILSVRC estava cheia de CNNs, claro. A AlexNet abriu uma nova área para exploração, e ela foi explorada até chegar em marcas de erro inferiores a 4%, sendo que a expertise humana geralmente gera um desempenho entre 5% e 10%. Ou seja, estamos em uma época em que o computador já consegue reconhecer melhor o que ele vê do que você, caro leitor. Realmente parece que estamos descrevendo um livro do Asimov.

Inspiração biológica

Anteriormente, falamos que as NNs eram inspiradas nas ligações presentes em nosso cérebro. As CNNs têm sua ideia de um lugar parecido: o córtex visual. Em 1962 Hubel e Wiesel fizeram um experimento que mostrou que alguns neurônios reagiam somente na presença de bordas em certas orientações (bordas na vertical, horizontal, diagonal, etc), e que os neurônios se organizavam em uma estrutura colunar e , juntos, criavam a percepção visual. Essa ideia de neurônios especializados cumprindo tarefas diferentes no mesmo sistema serviu de base para a criação das CNNs.

Como explicado acima, essa arquitetura usa muita coisa do que já conhecemos de Redes Neurais, só que agora nossos neurônios tem uma especialização adicional para reconhecimento de padrões em imagens: as convoluções e o pooling.

A estrutura típica de uma Rede Neural Convolucional é:

Entrada → (Conv → ReLU) → (Conv → ReLU) → Pool → (Conv → ReLU) → ReLU) → Pool → Fully Conected.

Essa estrutura é a mais didática e simples, mas não a mais eficiente. Existem muitas outras estruturas que são muito mais usadas que essa, mas todas utilizam as mesmas camadas (Conv, Pool e Fully Connected), então cabe aqui explicar com a mais simples.

Passaremos por cada etapa estrutural para entendermos bem suas funções.

Convolução

As camadas de convolução presentes nas CNNs são, essencialmente, o que as tornam capazes de identificar padrões nos inputs, geralmente imagens, tornando-as a principal característica de uma rede neural convolucional. Mas como essas camadas conseguem fazer isso? Ou melhor, o que é uma convolução?

Intuitivamente, podemos entender convolução como uma operação que mede o grau de similaridade ou sobreposição entre duas funções. Vamos nos atentar a funções discretas, já que o computador, atualmente, só consegue lidar com esse tipo. Então, consideremos uma matriz que representa uma imagem. Ao convolvermos com uma outra matriz de dimensão menor, podemos detectar certos padrões, como bordas; e também, desfocar imagens , aumentar a sua nitidez e muito mais, é bem similar a um filtro não? Este é o nome mais comum dado a essa matriz, embora alguns se refiram como kernel. E são características como essas que desejamos captar pela CNN.

Imagine que você possua uma lanterna; que, por algum motivo, ela seja quadrada e que você aponte ela sobre a imagem de entrada, de tal distância que a lanterna cobre uma área 3 x 3 da imagem original. A lanterna é nosso filtro, a área sobre a qual ela aponta é chamada de campo receptivo. Nesse caso, a convolução consiste em mover o filtro ao longo de toda a imagem, lembrando que o filtro, geralmente, tem tamanho menor que o da imagem de entrada, de forma que faz sentido falar em movê-lo pela imagem. Isso ocorre como ilustrado no GIF abaixo:

Para cada uma das regiões 3x3 iluminadas pela lanterna, podemos identificar quão parecida essa região é ao filtro. O resultado da convolução (à esquerda) é, então, uma outra matriz que representa o grau de similaridade entre o filtro e cada região da imagem original.

Para identificar esse grau de similaridade, utilizamos os pesos do filtro, ou seja, os valores de seus elementos. A forma como estes pesos são distribuídos ditam quais features serão identificadas por aquele kernel. Considere um filtro com a seguinte disposição:

A imagem da direita mostra a forma que o filtro (na esquerda) identifica. Para identificar a semelhança entre o filtro e o seu campo receptivo, basta realizar a multiplicação ponto-a-ponto entre as duas matrizes e, em seguida, somar os valores obtidos. Este último valor se torna o elemento de uma nova matriz, que será enviada às camadas posteriores.

Vamos ilustrar os processos descritos acima:

Com o filtro anterior, trabalhando com a imagem original à esquerda, podemos identificar a região dentro do quadrado amarelo acima. Note como esta região da imagem é muito próxima em formato do formato do nosso filtro. Fica claro, portanto, que ao multiplicar o nosso filtro por esta região vamos obter um valor alto, por exemplo:

A primeira imagem corresponde ao nosso campo receptivo, ou seja, à qual região da imagem estamos apontando a lanterna. Ao lado temos as duas matrizes que serão multiplicadas. O resultado da soma será:

Soma = (50·30) + (50·30) + (50·30) + (20·30) + (50·30) = 6600,

que corresponde à um número alto. Este valor será passado às camadas posteriores, passando a informação que naquela região da imagem o filtro foi ativado, ou seja, nesta região a imagem apresenta uma forma muito próxima à do filtro.

Só para complementar essa explicação, vamos mostrar uma outra região do ratinho, e ver o quanto resulta a soma neste caso, utilizando o mesmo filtro:

Analisando a região das orelhas, pegando um pouco do olhinho, vemos que esta área não tem nenhuma similaridade com nosso filtro. O resultado, portanto, da multiplicação e soma das matrizes acima é:

Soma = 0,

pois em nenhum ponto há sobreposição de valores não nulos.

Podemos definir a matriz filtro de duas formas: manualmente, e assim ela identifica padrões que queremos identificar, como foi feito no caso do ratinho; ou automaticamente, e isso é feito durante o treinamento da rede como veremos mais adiante.

Agora que você leitor já está absolutamente familiarizado com a estrutura da camada de convolução, vamos apresentar outras camadas, também muito importantes, que geralmente são usadas intercaladas com as conv layers. Mas não se preocupe, essas são bem mais simples que a convolucional.

ReLU

Em uma rede neural os neurônios aplicam às entradas a função de ativação, cujo principal objetivo é adicionar não linearidades ao modelo de treino. É comum que até este ponto a rede neural realize apenas manipulações lineares aos dados, como soma e multiplicação por pesos. O problema é que na realidade a grande maioria dos problemas reais não são lineares, e as funções de ativação tentam garantir a adaptabilidade da rede à tais circunstâncias.

Existem as mais variadas funções de ativação, as mais comuns são: logística, tangente hiperbólica e a ReLU. Algo importante da função de ativação é que elas, idealmente, não devem ‘matar’ o gradiente, uma vez que este gradiente é muito importante no processo de backpropagation para garantir um bom treinamento e desempenho do modelo.

função ReLU

Como podemos ver no gráfico acima, a ReLU entra neste contexto como uma função que não satura em valores positivos, evitando que nestes casos o cálculo do gradiente seja inviabilizado. Ela ainda tem seus problemas, mas é mais vantajosa que as anteriores por ser simples e fácil de derivar, diminuindo o tempo de treino.

A área de funções de ativação ainda é muito pesquisada, não existe uma função ótima para qualquer modelo, já existem outras variantes da própria ReLU, por exemplo Leaky ReLU, que tentam corrigir alguns defeitos, mas ainda é uma área em progressão.

Pooling

A camada de Pooling é parecida com a camada de convolução no sentido de passar um filtro na imagem, mas tem um efeito diferente. No pooling, o passo do filtro, ou stride, é igual à dimensão do filtro. Isso significa que não há sobreposição entre os campos receptivos, como veremos mais abaixo.

O objetivo é pegar alguma informação que indique o comportamento geral de cada campo receptivo. Para isso, existem o max pooling (adquire o máximo da região), mean pooling (adquire a média da região) e o min pooling (adquirindo o mínimo da região), sendo o max pooling o mais famoso e que iremos abordar nesse texto.

Resumindo então, o max pooling é uma camada que pega o valor máximo de cada região da imagem, e os junta para formar uma nova imagem, agora com dimensão menor. Para entender melhor, observe a imagem a seguir:

Exemplo de Max Pooling com filtro 2x2 e stride 2.

Como vimos, as camadas de convolução identificam características em partes das imagens com valores altos em sua saída, então a camada de pooling iria abstrair tal resultado, já que a posição exata não é tão importante quanto a posição relativa para as features mais abrangentes (de mais alto nível). Então é normal utilizarmos a camada de pooling após as convoluções, servindo para redução de dimensionalidade da entrada, o que ajuda computacionalmente, e para prevenir overfitting, já que de certo modo o pooling generaliza a entrada.

Fully Connected

As outras camadas eram novas na CNN e muito diferentes da NN clássica, mas essa aqui é bem conhecida de você, que já leu os textos anteriores dessa série. Essa camada é basicamente uma camada de NN normal, sem nenhuma diferença. Sua presença é justificada pelo fato que essa estrutura é muito boa para aprender padrões de alto nível, os quais são gerados por todas as camadas anteriores.

Treinamento

Assim como as redes ‘vanillas’ (redes neurais convencionais), as CNNs precisam passar por um treinamento para aprender seus parâmetros, o que normalmente é feito com backpropagation em ambas as arquiteturas. Agora, não só os pesos da fully connected são parâmetros mas também cada elemento dos filtros aplicados nas convoluções. A ideia de definir uma função de erro e minimizá-la se mantém e é aplicada exatamente igual a antes, o que acontece é um aumento de complexidade da operação, por conta dos parâmetros das convoluções.

Aplicação

Fazer uma CNN “na mão” é um processo muito complexo (mais ainda do que as NN normais) e muito dificilmente os resultados obtidos são melhores que as bibliotecas já existentes. Então, utilizaremos o Tensorflow 2.0 para mostrar um pequeno exemplo de aplicação dessa arquitetura em imagens… só que não nesse texto, e sim em um próximo post.

  • Link de onde nos basemos e tiramos grande parte das imagens.

Para você que chegou até esse ponto, muito obrigado! E esperamos que tenha conseguido seguir a explicação e aprendido algo novo.

Caso esse post não tenha saciado sua sede por inteligência artificial, ou tenha ficado alguma dúvida sobre CNNs, nos procure nas redes sociais: Facebook, LinkedIn e Instagram, certamente poderemos ajudar; e aproveite o conteúdo que divulgamos por lá também.

Se hidrate, faça carinho nos cachorros e até um próximo texto!

--

--

Rodrigo Estevam
Turing Talks

Aluno de Engenharia Elétrica na Poli-USP Membro do Grupo Turing de IA da USP