Aprendizado de Máquina

Ricardo Araujo
10 min readAug 4, 2020

--

Este texto é parte da disciplina de Fundamentos de Inteligência Artificial do Programa de Pós-Graduação em Computação da Universidade Federal de Pelotas.

Um dos primeiros sucessos comerciais em Inteligência Artificial foram os Sistemas Especialistas. Estes almejam substituir um tomador de decisão humano (o especialista) por meio da extração e formalização do processo decisório. Esta extração é feita por alguém familiarizado com o framework do Sistema Especialista sendo desenvolvido, as vezes denominado Engenheiro do Conhecimento, por meio de entrevistas e questionários diretamente com o especialista. O conhecimento é codificado em uma série de regras formais (frequentemente regras se…então) e fatos, que são utilizados para realizar inferências utilizando motores de inferência lógica.

Diagrama básico de um Sistema Especialista

Sistemas Especialistas hoje são um nicho pequeno das pesquisas e aplicações de IA e ainda se debate se é por que falharam e caíram em desuso ou se tiveram tanto sucesso que foram incorporados em outros tipos de sistemas e acabaram renomeados (como sistemas de Business Intelligence). É bastante comum que quando um sistema de IA se torna commodity, deixa de ser IA e passa a ser apenas computação. De toda forma, o grande desafio, e limitação, deste método é que dois fatores são essenciais: (i) o especialista tem que ser capaz de articular completamente as regras utilizadas para a tomada de decisão e (ii) essas regras tem que ser passíveis de serem expressas na formalização da base de conhecimento. Mesmo em casos onde ambas condições são satisfeitas, pode ser bastante difícil garantir que nenhuma regra foi deixada de lado — com frequência algumas regras podem ser consideras senso comum pelo especialista e nunca realmente expressas (e.g. é fácil esquecer que um computador não sabe que dois corpos não ocupam o mesmo lugar no espaço ao mesmo tempo, algo importante se o objetivo do sistema é colocar produtos em caixas).

Um exemplo: pense em alguém familiar e tente descrever como você reconhece essa pessoa em fotos. Mesmo quando há características marcantes, como uma barba ou cabelo incomuns, é verdade que reconheceríamos esta pessoa mesmo sem elas. Colocar como fazemos isso em palavras, o que dizer em formalismo lógico, é no mínimo extremamente difícil e possivelmente impossível. E, ainda assim, levamos apenas alguns milissegundos para reconhecer alguém e acertamos muito mais do que erramos.

Outro exemplo: andar de bicicleta. Ensinar uma criança a andar de bicicleta é umas das tarefas mais frustrantes possíveis, pois não seguimos regras explícitas bem definidas para nos equilibrarmos, fazer uma curva, desviar de buracos. Logo, não temos muito o que dizer para a criança para ajudá-la. Ela precisa aprender por si só, tentando e errando. E ela, como nós, também não saberá dizer com precisão o que está fazendo ou como consegue fazer.

Estes são casos onde Sistemas Especialistas não tem nem por onde começar uma solução para o problema. As regras, se existem, estão enterradas no subconsciente do especialista. Ainda assim, estes especialistas são úteis. Dê uma imagem de um cachorro e conseguimos indicar que é um cachorro sem problemas. Conseguimos rotular fotos, e dados de forma mais geral, mesmo sem saber perfeitamente como, em uma diversidade significativa de tarefas, como: reconhecer pessoas e objetos, diagnosticar doenças a partir de sintomas ou imagens médicas, entender uma palavra falada ou escrita, compreender o sarcasmo implícito em uma narrativa.

A área de Aprendizado de Máquina, ou Aprendizagem de Máquina, se preocupa com tarefas como as acima (entre outras — esta em particular tem um nome mais específico: aprendizado supervisionado). A ideia é que no lugar de extrair regras do especialista, coletamos o histórico de informações acessíveis ao especialista e suas ações sobre estas informações e usamos um algoritmo para criar "regras" que procuram gerar as mesmas ações a partir das informações dadas. Ao invés de explicarmos como reconhecemos uma pessoa, apenas rotulamos dezenas ou centenas de imagens da pessoa, algo muito mais fácil ainda que tedioso, e deixamos um algoritmo de aprendizado de máquina descobrir como reconhecê-la em novas fotos futuras.

Mais formalmente, o que fazemos neste caso é treinar um modelo utilizando dados rotulados. Um modelo é uma função parametrizável que mapeia dados de entrada a uma saída. Treinar um modelo é encontrar os parâmetros que melhor se ajustam aos dados. O processo é melhor compreendido com um exemplo. Considere o problema fictício de identificar se um dado animal é um cachorro ou um gato usando apenas duas medidas: peso corporal e comprimento do corpo. Isto é, sabendo apenas o peso e o comprimento temos que dizer se é um gato ou cachorro. Para tanto, alguém nos forneceu medidas para uma grande quantidade de animais. Nossa tarefa não é identificar estes animais, mas sim outros animais que não temos acesso. Podemos, porém, fazer uso destas medidas para criar um modelo que pode ser usado para outros animais (desde que sejam gatos ou cachorros… será de pouca utilidade para baleias). Estes dados talvez se pareçam com isso:

Dados fictícios

Esta forma de dado se chama estruturada ou tabular por ser interpretável na forma de tabela. Por ser de baixa dimensão, podemos plotar uma versão com mais linhas desta tabela, usando cores para indicar a classe.

Distribuição fictícia de pesos e comprimentos para gatos e cachorros

Nossa tarefa aqui é, então, dar uma classe para qualquer ponto (x,y) neste gráfico. Como só sabemos a classe dos pontos dados, precisamos de algo para generalizar estes pontos para qualquer outro ponto. Este algo é o modelo, que será uma função que recebe qualquer (comprimento, peso) e retorna gato ou cachorro.

Vamos usar um modelo bastante simples: uma reta horizontal. Podemos construir um modelo baseado em uma reta horizontal da seguinte forma: se peso≥peso_limiar então é cachorro, senão é gato. O "peso_limiar" é um valor que podemos especificar. É o parâmetro do modelo. Uma vez definido o modelo, a tarefa é encontrar seus parâmetros que melhor se ajustam aos dados; neste caso, encontrar seu único parâmetro. Mas como ajustá-lo? Fazemos aqui uma suposição: se o modelo funcionar bem para os dados conhecidos, ele funcionará para outros dados também. Chamamos isso de Hipótese Indutiva de Aprendizado (Inductive Learning Hypothesis) e há muitos motivos para essa suposição não ser verdadeira, talvez o maior deles o fato dos dados nem sempre serem representativos do problema (talvez cachorros pinscher não estejam ali, por exemplo), mas deixamos esta discussão para outro momento.

Com esta suposição, nossa tarefa é encontrar a reta que classifica corretamente a maior parte dos dados conhecidos. Abaixo dois ajustes possíveis para o modelo.

Diferentes ajustes para o modelo proposto. Na esquerda, peso_limiar = 12. Na direita, peso_limiar=6.

Com peso_limiar = 12, vemos que alguns cachorros são classificados como gatos. A acurácia, ou número de pontos classificados corretamente dividido pelo número total de pontos, é de 35/40 = 87,5%. Já com peso_limiar = 6, temos uma acurácia de 100%. É evidente qual o melhor ajuste.

O treinamento do modelo (i.e. o processo para encontrar seus parâmetros que melhor se ajustam aos dados) é uma tarefa de otimização e podemos utilizar virtualmente qualquer algoritmo de otimização. Naturalmente, alguns serão mais eficientes que outros.

De uma forma mais genérica, chamamos um modelo parametrizado (i.e. com valores em seus parâmetros) de hipótese e podemos ver a tarefa de treinamento como o de encontrar a melhor hipótese em um grande espaço de hipóteses possíveis. Crucial é que o conceito que se deseja aprender (e.g. diferença entre gatos e cachorros) possa ser representado pelo modelo — ou, em outras palavras, que o conceito esteja contido dentro do espaço de hipóteses. Por exemplo, imagine que nosso modelo fosse uma reta vertical ao invés de horizontal. No problema descrito nas figuras acima, nenhuma reta vertical consegue separar perfeitamente gatos de cachorros; não importa o quão sofisticado é o algoritmo de otimização, simplesmente não existe uma hipótese adequada para ser encontrada.

Assim, uma aplicação de aprendizado de máquina envolve (i) especificar um modelo que seja expressivo o suficiente para representar o conceito que se deseja aprender e (ii) especificar um algoritmo de otimização que consiga encontrar os parâmetros do modelo que faça com que este se aproxime do conceito. Medimos a aproximação do conceito pela hipótese indutiva de aprendizado: medindo o desempenho da hipótese nos dados conhecidos.

Modelos podem ter diferentes representações, adaptadas para o tipo de problema, expressividade, interpretabilidade e outros fatores. Existe, claro, uma troca entre modelos expressivos e a capacidade de treinar estes modelos. Modelos com muitos parâmetros podem ser mais expressivos, mas a tarefa de treinamento se torna mais difícil com o aumento da complexidade do modelo. Um palheiro maior pode garantir que uma agulha esteja no seu interior, mas também torna mais difícil encontrá-la. Idealmente, queremos o modelo mais simples possível, mas que inclua o conceito desejado. Infelizmente, a complexidade do conceito é frequentemente desconhecida e não há maneira direta de relacionar complexidade de modelo com os problemas que se deseja solucionar. A tendência atual é criar modelos extremamente complexos e encontrar meios de treiná-los adequadamente. Redes Neurais Profundas são a epítome desta tendência.

Aqui é útil definir alguns tipos de aplicações. O que vimos até então é chamado problema de classificação: desejamos atribuir uma classe aos dados de entrada (gato ou cachorro). É talvez o tipo mais comum. A contra-parte é um problema de regressão, onde desejamos atribuir um valor aos dados de entrada. Por exemplo, um problema que prevê se fará sol ou não amanhã a partir de dados meteorológicos de hoje é um problema de classificação — a saída só pode ser ou Sim ou Não. Mas se desejamos prever a temperatura amanhã, este é um problema de regressão — a saída é um valor numérico. Há modelos adequados para cada tipo de problema e alguns que lidam bem com ambos.

Também parte da aplicação são os tipos dos atributos de entrada, isto é, as variáveis que serão utilizadas para fazer a classificação ou regressão. Estes atributos podem ser numéricos, como no nosso exemplo de gatos e cachorros, ou categóricos, podendo assumir um entre um conjunto finito e pequeno de possibilidades. Por exemplo, poderíamos ao invés do peso em quilogramas ter um atributo que especificasse apenas se o animal é "leve" ou "pesado", configurando um atributo categórico. Novamente, alguns modelos apenas lidam com atributos numéricos, outros apenas categóricos e alguns com ambos.

É útil aqui ler a Seção 8.4 do livro de referência, que trata de um modelo simples mas bastante útil: Árvores de Decisão

O tipo de aprendizado descrito aqui é chamado Aprendizado Supervisionado. Tem este nome pois, para todos dados, conhece-se o rótulo — isto é, a saída desejada. Assim, quando o modelo dá uma resposta, é possível comparar com a saída desejada e verificar o erro. Este erro é o chamado sinal supervisório e é utilizado para ajustar o modelo. Este, porém, não é o único tipo de aprendizado possível. Outros tipos de aprendizado incluem aprendizado não-supervisionado, aprendizado auto-supervisionado e aprendizado por reforço. Não cobriremos estes aqui, mas a Seção 8.9 do livro de referência trata de aprendizado não-supervisionado.

Há inúmeros desafios na construção de sistemas baseados em aprendizado de máquina, além das já desafiantes tarefas de escolha de modelo e seu treinamento. A avaliação de modelos é algo particularmente importante. Ainda que seja verdade que só temos os dados conhecidos para fazer esta avaliação, podemos usar estes dados de diferentes formas para tentar medir o quanto o modelo generaliza para dados não vistos. Considere um professor ensinando matemática para alunos, com ajuda de um livro de exercícios. O professor tem a tarefa de tanto ensinar como avaliar o aprendizado dos alunos. Uma maneira de fazer isso é usar alguns exercícios do livro e solucioná-los junto com os alunos, treinando-os para solucionar estes tipos de problemas. Para avaliar, porém o professor escolherá outros exercícios do livro pois, do contrário, os alunos já saberão as respostas corretas e não se estará avaliando o quanto aprenderam (apenas o quanto memorizaram). Da mesma forma, com frequência separamos os dados em conjuntos disjuntos, como treino e teste, utilizando um para treinar o modelo e o outro para avaliá-lo.

Outro ponto crucial é a qualidade dos dados. A máxima lixo entra, lixo sai se aplica a modelos de aprendizado de máquina. Dados incorretos claramente são um problema, mas há nuances mais problemáticas em certos casos que são mais difíceis de detectar e corrigir. Um estudo famoso se propôs a testar a hipótese de que criminosos tem características faciais distintas de cidadãos comuns — isto é, criminosos tem cara de criminosos — utilizando uma rede neural para classificar entre as duas classes usando apenas fotos de pessoas. Para treinar esta rede, é necessário fotos rotuladas de criminosos e não-criminosos. Para fotos de criminosos, utilizaram fotos de registros policiais — por definição, por terem passagem pela polícia estas são criminosas e foram rotuladas como tal. Para fotos de não-criminosos, os pesquisadores obtiveram fotos tiradas da internet. Os pesquisadores treinaram uma rede neural convolucional, um modelo adequado para imagens, com as fotos e demonstraram uma incrível taxa de 89,5% de acerto, proclamando que a hipótese de que é possível identificar criminosos por características faciais se confirmava.

Abaixo está uma imagem extraída do próprio artigo. Observe com atenção e tente encontrar características faciais que separam o grupo de criminosos do outro grupo.

Imagem retirada do artigo original. A linha de cima são exemplos de fotos de criminosos, enquanto a de baixo são exemplos de fotos de não-criminosos.

Se você não viu a principal diferença entre os dois conjuntos, talvez valha a pena ler esta crítica ao artigo. Spoiler: ninguém sai feliz em foto tirada em delegacia.

Este é um exemplo de um dos grandes desafios de aprendizado de máquina da atualidade: vício de dados (data bias). Entre outros problemas, é responsável por sistemas que podem apresentar comportamentos preconceituosos, replicando preconceitos existentes nos dados de treinamento. Este artigo do NYT detalha alguns casos e o que está sendo feito para tentar amenizar este problema.

--

--

Ricardo Araujo

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