Redes neurais convolucionais

Concluído

Embora você possa usar modelos de aprendizado profundo para qualquer tipo de aprendizado de máquina, eles são particularmente úteis para lidar com dados que consistem em grandes matrizes de valores numéricos - como imagens. Os modelos de aprendizagem automática que trabalham com imagens são a base para uma área de inteligência artificial chamada visão computacional, e as técnicas de aprendizagem profunda têm sido responsáveis por impulsionar avanços surpreendentes nesta área nos últimos anos.

No centro do sucesso da aprendizagem profunda nesta área está um tipo de modelo chamado rede neural convolucional, ou CNN. Uma CNN normalmente funciona extraindo recursos de imagens e, em seguida, alimentando esses recursos em uma rede neural totalmente conectada para gerar uma previsão. As camadas de extração de recursos na rede têm o efeito de reduzir o número de recursos da matriz potencialmente enorme de valores de pixel individuais para um conjunto de recursos menor que suporta a previsão de rótulos.

Camadas em uma CNN

As CNNs consistem em várias camadas, cada uma executando uma tarefa específica na extração de recursos ou previsão de rótulos.

Camadas de convolução

Um dos principais tipos de camada é uma camada convolucional que extrai características importantes em imagens. Uma camada convolucional funciona aplicando um filtro às imagens. O filtro é definido por um kernel que consiste em uma matriz de valores de peso.

Por exemplo, um filtro 3x3 pode ser definido assim:

 1  -1   1
-1   0  -1
 1  -1   1

Uma imagem também é apenas uma matriz de valores de pixel. Para aplicar o filtro, você o "sobrepõe" em uma imagem e calcula uma soma ponderada dos valores de pixel da imagem correspondentes sob o kernel do filtro. O resultado é então atribuído à célula central de um patch 3x3 equivalente em uma nova matriz de valores que é do mesmo tamanho da imagem. Por exemplo, suponha que uma imagem 6 x 6 tenha os seguintes valores de pixel:

255 255 255 255 255 255 
255 255 100 255 255 255
255 100 100 100 255 255
100 100 100 100 100 255
255 255 255 255 255 255
255 255 255 255 255 255

Aplicar o filtro ao patch 3x3 superior esquerdo da imagem funcionaria assim:

255 255 255      1  -1   1    (255 x 1)+(255 x -1)+(255 x 1) +
255 255 100  x  -1   0  -1  = (255 x -1)+(255 x 0)+(100 x -1) +   = 155
255 100 100      1  -1   1    (255 x1 )+(100 x -1)+(100 x 1)

O resultado é atribuído ao valor de pixel correspondente na nova matriz da seguinte forma:

 ?   ?   ?   ?   ?   ?  
 ?  155  ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?

Agora o filtro é movido ao longo (envolvido), normalmente usando um tamanho de etapa de 1 (movendo-se assim ao longo de um pixel para a direita), e o valor para o próximo pixel é calculado

255 255 255      1  -1   1    (255 x 1)+(255 x -1)+(255 x 1) +
255 100 255  x  -1   0  -1  = (255 x -1)+(100 x 0)+(255 x -1) +   = -155
100 100 100      1  -1   1    (100 x1 )+(100 x -1)+(100 x 1)

Então, agora podemos preencher o próximo valor da nova matriz.

 ?   ?   ?   ?   ?   ?  
 ?  155 -155 ?   ?   ?
 ?   ?   ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?
 ?   ?   ?   ?   ?   ?

O processo se repete até que tenhamos aplicado o filtro em todos os patches 3x3 da imagem para produzir uma nova matriz de valores como esta:

?   ?   ?    ?    ?   ?
?  155 -155 155 -155  ?
? -155 310 -155  155  ?
?  310 155  310   0   ?
? -155 -155 -155  0   ?
?   ?   ?    ?    ?   ?

Devido ao tamanho do kernel do filtro, não podemos calcular valores para os pixels na borda; Então, normalmente aplicamos apenas um valor de preenchimento (geralmente 0):

0   0   0    0    0   0
0  155 -155 155 -155  0
0 -155 310 -155  155  0
0  310 155  310   0   0
0 -155 -155 -155  0   0
0   0   0    0    0   0

A saída da convolução é normalmente passada para uma função de ativação, que geralmente é uma função de Unidade Linear Retificada (ReLU) que garante que os valores negativos sejam definidos como 0:

0   0   0    0    0   0
0  155  0   155   0   0
0   0  310   0   155  0
0  310 155  310   0   0
0   0   0    0    0   0
0   0   0    0    0   0

A matriz resultante é um mapa de recursos de valores de feição que pode ser usado para treinar um modelo de aprendizado de máquina.

Nota: Os valores no mapa de feição podem ser maiores do que o valor máximo para um pixel (255), portanto, se você quiser visualizar o mapa de feição como uma imagem, precisará normalizar os valores de feição entre 0 e 255.

O processo de convolução é mostrado na animação abaixo.

A filter kernel is convolved across an image of a triangle, extracting features that emphasize the three edges and corners

  1. Uma imagem é passada para a camada convolucional. Neste caso, a imagem é uma forma geométrica simples.
  2. A imagem é composta por uma matriz de pixels com valores entre 0 e 255 (para imagens coloridas, geralmente é uma matriz tridimensional com valores para canais vermelhos, verdes e azuis).
  3. Um kernel de filtro é geralmente inicializado com pesos aleatórios (neste exemplo, escolhemos valores para destacar o efeito que um filtro pode ter nos valores de pixel; mas em uma CNN real, os pesos iniciais normalmente seriam gerados a partir de uma distribuição Gaussiana aleatória). Este filtro será usado para extrair um mapa de feição dos dados da imagem.
  4. O filtro é envolvido na imagem, calculando os valores dos feições aplicando uma soma dos pesos multiplicados pelos valores de pixel correspondentes em cada posição. Uma função de ativação de Unidade Linear Retificada (ReLU) é aplicada para garantir que os valores negativos sejam definidos como 0.
  5. Após a convolução, o mapa de feição contém os valores de feição extraídos, que geralmente enfatizam os principais atributos visuais da imagem. Neste caso, o mapa de feição destaca as bordas e cantos do triângulo na imagem.

Normalmente, uma camada convolucional aplica vários kernels de filtro. Cada filtro produz um mapa de feição diferente, e todos os mapas de feição são passados para a próxima camada da rede.

Camadas de agrupamento

Depois de extrair valores de feição de imagens, as camadas de pool (ou redução da amostragem) são usadas para reduzir o número de valores de feição, mantendo os principais recursos diferenciadores que foram extraídos.

Um dos tipos mais comuns de pool é o pool máximo, no qual um filtro é aplicado à imagem e apenas o valor máximo de pixel dentro da área de filtro é mantido. Assim, por exemplo, aplicar um kernel de pool 2x2 ao seguinte patch de uma imagem produziria o resultado 155.

0   0
0  155

Observe que o efeito do filtro de pool 2x2 é reduzir o número de valores de 4 para 1.

Assim como acontece com as camadas convolucionais, as camadas de pool funcionam aplicando o filtro em todo o mapa de recursos. A animação abaixo mostra um exemplo de pool máximo para um mapa de imagem.

A filter kernel is convolved across an image of a triangle, extracting features that emphasize the three edges and corners, max pooling for an image map.

  1. O mapa de feição extraído por um filtro em uma camada convolucional contém uma matriz de valores de feição.
  2. Um kernel de pool é usado para reduzir o número de valores de recursos. Neste caso, o tamanho do kernel é 2x2, então ele produzirá uma matriz com um quarto do número de valores de recursos.
  3. O kernel de pooling está envolvido em todo o mapa de recursos, mantendo apenas o maior valor de pixel em cada posição.

Queda de camadas

Um dos desafios mais difíceis em uma CNN é evitar o overfitting, onde o modelo resultante funciona bem com os dados de treinamento, mas não generaliza bem para novos dados nos quais não foi treinado. Uma técnica que você pode usar para mitigar o sobreajuste é incluir camadas nas quais o processo de treinamento elimina aleatoriamente (ou "solta") mapas de recursos. Isso pode parecer contraintuitivo, mas é uma maneira eficaz de garantir que o modelo não aprenda a ser excessivamente dependente das imagens de treinamento.

Outras técnicas que você pode usar para mitigar o sobreajuste incluem inverter aleatoriamente, espelhar ou distorcer as imagens de treinamento para gerar dados que variam entre as épocas de treinamento.

Achatamento de camadas

Depois de usar camadas convolucionais e de agrupamento para extrair os recursos salientes nas imagens, os mapas de feição resultantes são matrizes multidimensionais de valores de pixel. Uma camada de nivelamento é usada para nivelar os mapas de feição em um vetor de valores que pode ser usado como entrada para uma camada totalmente conectada.

Camadas totalmente conectadas

Normalmente, uma CNN termina com uma rede totalmente conectada na qual os valores do recurso são passados para uma camada de entrada, através de uma ou mais camadas ocultas, e geram valores previstos em uma camada de saída.

Uma arquitetura CNN básica pode ser semelhante a esta:

A CNN consisting of a convolutional layer, a pooling layer, a dropping layer, a flattening layer, and a fully connected layer

  1. As imagens são alimentadas em uma camada convolucional. Neste caso, existem dois filtros, de modo que cada imagem produz dois mapas de recursos.
  2. Os mapas de recursos são passados para uma camada de pooling, onde um kernel de pool 2x2 reduz o tamanho dos mapas de recursos.
  3. Uma camada solta aleatoriamente alguns dos mapas de recursos para ajudar a evitar o sobreajuste.
  4. Uma camada de nivelamento pega as matrizes de mapa de recursos restantes e as nivela em um vetor.
  5. Os elementos vetoriais são alimentados em uma rede totalmente conectada, que gera as previsões. Neste caso, a rede é um modelo de classificação que prevê probabilidades para três classes de imagem possíveis (triângulo, quadrado e círculo).

Treinando um modelo da CNN

Como em qualquer rede neural profunda, uma CNN é treinada passando lotes de dados de treinamento através dela ao longo de várias épocas, ajustando os pesos e valores de viés com base na perda calculada para cada época. No caso de uma CNN, a retropropagação de pesos ajustados inclui pesos de kernel de filtro usados em camadas convolucionais, bem como os pesos usados em camadas totalmente conectadas.