Oficina de IA: Como ensinar a máquina a reconhecer imagens

Nossos carros podem ter que esperar no parque por alguns momentos enquanto analisamos como uma Inteligência Artificial pode reconhecer imagens. Nosso carro também depende dessa capacidade. Também veremos como as redes neurais são estruturadas.

Foto: Frida Aguilar Estrada

Nosso carro precisa de uma câmera para avançar. Uma opção seria um radar Lidar (Detecção e Variação da Luz) que usa raios laser para mapear seus arredores. Mas se Elon Musk acha que uma solução óptica é suficiente para Tesla, é suficiente para nós. Neste post, tento descrever a base tecnológica do reconhecimento de imagens de IA.

Existem três categorias principais para a aprendizagem artificial: aprendizagem reforçada, aprendizagem supervisionada e aprendizagem não supervisionada. O aprendizado supervisionado é uma maneira muito comum de ensinar uma IA e focaremos nisso hoje. A idéia é fornecer dados de uma máquina que já foram classificados. No nosso caso, mostramos ao computador muitas imagens e dizemos o que elas representam. Poderíamos tentar treiná-lo para diferenciar lasanha, falafel e pão de canela. Então, mostramos imagens rotuladas das três, muitas imagens. Quando a IA estiver pronta, podemos mostrar uma nova imagem e calculará as probabilidades de ser uma das três opções.

Imagine que tínhamos um caminhão de sorvete estacionado em um porto e gostaríamos de poder prever suas vendas para que possamos ter estoque suficiente. O que poderia ser um fator na venda de sorvetes? A temperatura do dia pode ser boa. Então, vamos examinar as temperaturas dos dias e as vendas de sorvetes. Podemos colocá-los em um gráfico e usar regressão linear para analisar os dados. Isso nos dará uma linha de melhor ajuste que podemos usar para fazer previsões. A posição da linha é definida otimizando a distância de todos os pontos até a linha e diminuindo o máximo possível. Com a linha de melhor ajuste, podemos fazer algumas previsões aproximadas.

Mas a temperatura média diária provavelmente não é o único fator de vendas. Se adicionarmos uma quantidade de chuva à imagem, obteremos um gráfico tridimensional. A linha de melhor ajuste se tornaria um plano de melhor ajuste. E se adicionarmos o dia da semana à análise, acabaremos com um modelo que não podemos visualizar. Em situações complexas como essas redes neurais funcionam muito bem.

Como inicialmente a pesquisa em tecnologia artificial tentou imitar a inteligência humana, alguns dos termos são familiares da biologia. Temos neurônios, sinapses e estímulos. Mas também temos muita terminologia da ciência de dados, como uma função de perda e ajuste excessivo. Atualmente, recriar o cérebro humano não é mais o objetivo, mas a terminologia permanece.

As redes neurais consistem em neurônios ligados entre si usando sinapses. As conexões têm pesos diferentes. Os neurônios recebem funções de ativação que definem quando o neurônio é acionado e passa informações. (Você pode ler mais sobre os diferentes tipos de funções de ativação e quando usá-las aqui)

Queremos fazer um classificador que reconheça imagens de letras. Temos os seguintes padrões, cada quadrado representa uma imagem. Decidimos usar uma função step como a função de ativação, que só fornecerá resultados 0 ou 1. Quando o pixel é branco, ele gera 0. Quando o pixel tem cores, ele gera 1. Qual cor ele não faz diferença, mas para ilustrar as diferenças, usei cores diferentes. Portanto, quando o pixel não for branco, o neurônio será ativado. E para manter as informações em ordem e comparáveis, imprimiremos a saída da esquerda para a direita, de cima para baixo. A saída dos neurônios para a figura S seria 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1 e para a figura E seria 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1.

Agora precisamos descobrir como aplicar pesos à saída neural para diferenciar as figuras. Existem inúmeras soluções para isso. Claramente, devemos nos concentrar nos pixels em que a saída é diferente. Isso significa que podemos usar o peso 0 para todos os pixels que foram ativados pelas duas figuras (roxas). Como todos os pixels brancos não ativam os neurônios, não precisamos pensar em seus pesos.

Podemos decidir, por exemplo, que quando o resultado é negativo, a figura é E e os resultados positivos representam a figura S. Para conseguir isso, vamos dar ao neurônio que somente ativa na figura E o peso de -1 e o neurônio que dispara apenas com a figura. S o peso 1. Quando as outras saídas são multiplicadas por 0, obteremos os resultados 1 ou -1.

Portanto, a soma de todas as saídas da figura S seria 0 x 1+ 0 x 1+ 0 x1 +0 x 1+ 0 x 1+ 0 + 0 + 0 + 0 x 1 + 0 x 1 + 0 x 1 + 0 x 1 + 0 + 0 + 0 + 1 x 1 + 0 x 1 + 0 x 1 + 0 x 1+ 0 x 1 = 1. E a soma de todas as saídas da figura E seria 0 x 1 + 0 x 1 + 0 x 1 + 0 x 1 + 0 x 1 + 0 + 0 + 0 + 0 x 1 + 0 x 1 + 0 x 1 + 0 x 1 + (-1 x 1) + 0 + 0 + 0 + 0 x 1 + 0 x 1 + 0 x 1 + 0 x 1 = -1.

Isso foi bastante fácil de resolver. Mas se adicionarmos a letra F à mistura, as coisas ficam um pouco mais complicadas.

A diferenciação entre as letras E e F pode ser alcançada sem problemas, por exemplo, com estes pesos:

Esses pesos resultariam em 11 x 0,1 = 1,1 ou 3 x (-1) = -3 com os resultados positivos para a figura F e negativos para a figura E. Mas, quando incluímos a figura S, as diferenças são menos pronunciadas e mais difícil diferenciar com pesos. E adicionar letras só piora as coisas.

Precisávamos de uma solução mais complexa do que apenas resultados negativos x positivos. Provavelmente atribuiríamos resultados entre 0 e 2 para a figura S, entre 2 e 4 para a figura E etc. Quando adicionamos camadas de neurônios a uma rede neural, podemos realizar alterações mais elaboradas nos pesos e ter pixels importantes apenas se outro pixel foi ativado. E é assim que as redes neurais são capazes de executar as tarefas complicadas para as quais queremos usá-las. Adicionar mais camadas ocultas aprofundará a capacidade de aprendizado da IA.

Aguarde! Quais camadas ocultas? Os neurônios em uma rede neural geralmente são estruturados de tal maneira que cada neurônio está conectado a todos os outros neurônios nas camadas próximas a ele. Uma rede neural geralmente possui três partes: uma camada de entrada, uma ou mais camadas ocultas e a camada de saída.

A camada de entrada consiste nas informações que fornecemos à rede. Conforme as informações são passadas pelas camadas ocultas, os pesos ajustam os números e, quando todos são somados, temos a camada de saída e o resultado da estimativa. Camadas mais ocultas podem lidar com dados mais obscuros, mas requerem mais poder computacional. Eles também dificultam a compreensão do que acontece nas camadas ocultas.

Como os pesos entre os neurônios evoluem? No começo, eles são todos iguais ou gerados com um gerador de números aleatórios. Mas quando a rede neural recebe dados classificados, ela afeta os pesos. A rede neural descobre quais posições são mais importantes que outras e quais são conectadas umas às outras. Uma tecnologia muito útil para isso é o algoritmo de retropropagação, que alimenta os dados da rede para trás, da camada de resultados para as camadas ocultas e assim por diante. Adapta a rede neural aos dados. No final, os pesos ajustados permitem que a rede faça boas previsões.

Exemplo de uma rede neural para prever vendas de sorvete:

Nossos dados sobre vendas, dias e clima ajustaram os pesos entre os neurônios. Para avaliar a precisão das previsões, precisamos de um conjunto de dados de teste além do conjunto de dados de treinamento que já usamos. O conjunto de dados de teste consiste em casos que a rede neural ainda não viu. Seus resultados nos dirão quão precisas são nossas previsões.

Ao treinar, ajustar e avaliar a rede neural, precisamos ter o cuidado de ajustá-la ao conjunto de dados. O conjunto de dados de treinamento pode parecer ter alguns aspectos relacionados que, na realidade, não estão relacionados. Correlação não é o mesmo que causalidade. Você pode encontrar exemplos divertidos disso aqui, como como o consumo de mussarela e a quantidade de doutorados em engenharia de construção andam de mãos dadas estatisticamente, mas na realidade não têm nada a ver um com o outro. É por isso que é recomendável incluir apenas informações relevantes no conjunto de dados. E é claro que a qualidade e a quantidade do conjunto de dados de treinamento são importantes para a precisão.

Em nosso exemplo de classificação, nossa função de atividade estava observando se um pixel era branco ou não. Geralmente, as informações das imagens são convertidas nos números que os computadores exigem de uma maneira diferente. Se a imagem estiver em preto e branco, cada pixel receberá o valor do brilho entre 0 (preto) e 255 (branco). Os pixels de uma imagem colorida terão três valores RGB no intervalo de 0 a 255. Todas as cores na tela são compostas pela mistura de luz vermelha, verde e azul. (Que é um fato que conheço há anos e ainda parece muito contra-intuitivo.)

Em nosso próprio exemplo muito simples, os números estavam sempre nas mesmas posições, o que também não é normalmente o caso. Mesmo no banco de dados de imagens de passaporte, todos os olhos não se alinham. Uma tecnologia que torna o reconhecimento de imagem muito mais rápido e eficiente é adicionar uma camada de convolução à rede neural. Isso procurará recursos de imagem reconhecíveis, como bordas em direções específicas, padrões ou manchas coloridas diferentes. O nariz de um cão pode ser um, dedos humanos podem ser um, a forma e a textura de uma casquinha de sorvete podem ser uma. Então não importa se o sorvete está no lado esquerdo ou direito da imagem, se ele está na vertical ou na diagonal e qual o tamanho do cone. E você pode imaginar o quão mais fácil isso facilita o reconhecimento de imagens. Redes neurais com uma camada de convolução são chamadas redes neurais convolucionais.

Para obter resultados confiáveis, precisaremos de grandes quantidades de imagens como o conjunto de treinamento. Mas, como em muitas coisas relacionadas à programação, não precisamos começar do nada e reinventar a roda. Podemos usar as bibliotecas e bancos de dados existentes.

Um conjunto de dados importante é o banco de dados padronizado de manuscrito MNIST. A cada dez anos, os EUA tomam o centro de todas as pessoas que vivem dentro de suas fronteiras. Isso é feito com todos preenchendo um questionário em papel. Além de coletar informações importantes sobre o tamanho e a estrutura da população, também produz uma ampla variedade de amostras de caligrafia. A partir dessas amostras, foi criado um banco de dados padronizado para letras e números e você pode usá-lo para ensinar ou testar sua IA. Infelizmente, ele contém apenas as 26 letras do alfabeto inglês. Qual é o tipo de problema frequentemente encontrado usando recursos prontos. Mas se você estiver interessado em testar redes de inteligência artificial e redes neurais, é pelo menos um ponto de partida e você não está limitado aos dados que pode coletar e produzir por conta própria.

O que você deve se lembrar sobre o aprendizado de máquina é que as máquinas não aprendem conceitos, apenas aprendem como esses conceitos se manifestam. Falta a um computador a rica rede de experiências que as pessoas têm. Por causa disso, ainda é difícil para as máquinas distinguir entre algumas imagens que são claras como dia para nós. E uma máquina só pode saber sobre coisas sobre as quais foi instruída a aprender. Embora um carro autônomo não precise saber se é uma maçã ou uma coruja na frente dele. Um obstáculo é um obstáculo e deve ser evitado. Só isso é importante para o carro.

Mas uma IA pode ser treinada para ser especialista na detecção de diferenças sutis e diminutas. Como analisar exames de câncer ou diagnosticar diabetes pelas alterações nos vasos sanguíneos dos olhos, com resultados muito mais precisos e rápidos. Uma máquina também nunca fica entediada ou cansada da tarefa repetitiva para a qual foi projetada.

Portanto, se me pedissem para pesar qual é, em última análise, melhor - reconhecimento de imagem humana ou artificial - eu não conseguiria. Ambos são muito, muito diferentes.