Redes neurais convolucionais
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 de 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 de 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 (convolvido), normalmente usando um passo de tamanho de 1 (portanto, movendo-se 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; por isso, normalmente aplicamos 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 ReLU (Unidade Linear Retificada) 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 podem ser usados 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ê quisesse visualizar o mapa de feição como uma imagem, precisaria normalizar os valores de feição entre 0 e 255.
O processo de convolução é mostrado na animação abaixo.
- Uma imagem é passada para a camada convolucional. Neste caso, a imagem é uma forma geométrica simples.
- 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).
- 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.
- O filtro é convolvido na imagem, calculando os valores das características ao aplicar uma soma dos pesos multiplicados pelos valores dos pixels 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.
- 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, pool de camadas (ou redução de) 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 pooling é o max pooling , em que um filtro é aplicado à imagem e apenas o valor máximo de pixel dentro da área do filtro é mantido. Assim, por exemplo, aplicar um núcleo de agrupamento 2x2 ao seguinte fragmento de uma imagem produziria o resultado 155.
0 0
0 155
Observe que o efeito do filtro de subamostragem 2x2 é reduzir o número de valores de 4 para 1.
Assim como acontece com as camadas convolucionais, as camadas de pooling funcionam aplicando o filtro em todo o mapa de características. A animação abaixo mostra um exemplo de pool máximo para um mapa de imagem.
- O mapa de feição extraído por um filtro em uma camada convolucional contém uma matriz de valores de feição.
- Um kernel de agrupamento é usado para reduzir o número de valores de características. Neste caso, o tamanho do kernel é 2x2, então ele produzirá uma matriz com um quarto do número de valores de recursos.
- O kernel de pooling está envolvido em todo o mapa de recursos, mantendo apenas o maior valor de pixel em cada posição.
Remoção de camadas
Um dos desafios mais difíceis numa CNN é evitar o sobreajuste , onde o modelo resultante desempenha 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:
- As imagens são alimentadas numa camada convolucional. Neste caso, existem dois filtros, de modo que cada imagem produz dois mapas de recursos.
- Os mapas de características são passados para uma camada de pooling, onde um núcleo de pooling 2x2 reduz o tamanho dos mapas de características.
- Uma camada de descarte elimina aleatoriamente alguns dos mapas de características para ajudar a evitar o sobreajuste.
- A camada de achatamento pega os mapas de características restantes e achata-os em um vetor.
- 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 os pesos do kernel do filtro usados em camadas convolucionais, bem como os pesos usados em camadas totalmente conectadas.