É preciso sublinhar que os algoritmos sempre ocuparam um papel fundamental na infraestrutura informática da sociedade ao longo dos tempos: estão presentes nos sistemas de operação dos computadores, nos jogos, nos editores de texto, nas bases de dados, nos sistemas de telecomunicações e redes, nos sistemas de informação públicos e empresariais, no piloto automático de um A380, no controlo do James Webb Space Telescope, ou no monitor de uma central de energia nuclear. Os algoritmos são blocos básicos da computação, objetos informáticos perfeitos que representam conhecimento infinito de forma finita, e que são tão confiáveis como as leis da aritmética que todos aprendemos nos primeiros anos de escola.
Mas, no momento atual, hora de glória da inteligência artificial, será ainda assim? Poderão ser construídos algoritmos para substituir operadores em call-centers, condutores em automóveis, juízes nos tribunais, médicos nos hospitais, professores nas escolas? Serão os novos algoritmos de inteligência artificial confiáveis? Em que algoritmos podemos confiar, se é que tal é de todo possível? Para compreender esta questão e podermos formar uma opinião sólida sobre a mesma, é útil compreender o que é realmente um algoritmo, o que é uma heurística, o que é um algoritmo de aprendizagem automática, técnica dominante atualmente na inteligência artificial, e o que é um modelo preditivo baseado em redes neuronais, como usadas em sistemas como o ChatGPT.
O termo «algoritmo», inspirado no nome do matemático árabe Al-khwarizmi, foi usado durante séculos para designar certo método «mecânico» para processar informação e obter um resultado, tipicamente associado ao cálculo matemático. Como exemplo simples, podemos considerar o algoritmo para dividir números naturais ensinado às crianças. Um algoritmo opera através da aplicação de regras fixas e decisões automáticas, podendo ser potencialmente realizado por uma máquina (ou autómato) «sem precisar de pensar». No entanto, a noção moderna, rigorosa e formal, de algoritmo foi apenas introduzida no início do século xx, quando se começou a estudar e compreender que problemas podem ter soluções computáveis, ou seja, soluções que podem ser obtidas por processos mecânicos, requerendo uma quantidade finita de espaço e tempo, e que são sempre corretas.
A crise de fundamentos que motivou David Hilbert a propôr em 1920 o seu célebre e ambicioso programa de investigação para garantir a coerência (ausência de contradições) de toda a matemática oferece o contexto inicial para identificar o que é exatamente um procedimento de computação, conduzindo à descoberta de modelos de computação fundamentais, como a máquina proposta por Alan Turing em 1935. A tese de Church-Turing permite-nos hoje saber que todos os computadores, desde que dotados de uma quantidade arbitrária de memória, têm exatamente o mesmo poder de computação que a Máquina de Turing, diferindo entre si apenas na sua capacidade de memória e velocidade de operação, não no tipo de programas que são capazes de executar. Por exemplo, um computador ZX Spectrum de 1982, com a expansão de memória necessária, pode, em princípio, executar (mais lentamente, é certo) todo o software produzido atualmente pela Google, Microsoft ou OpenAI, incluindo o ChatGPT e qualquer outro software, incluindo software de inteligência artificial.
Todos os modelos de computação que têm sido imaginados desde 1935 até ao dia presente são Turing-completos, ou seja, são equivalentes à Máquina de Turing, conseguindo executar exatamente os mesmos processos de computação. Considera-se assim que uma operação é computável quando existe uma descrição finita de um processo executável numa máquina ou linguagem Turing-completa, capaz de construir, para qualquer informação de entrada, o resultado de saída correto. Neste contexto preciso, um algoritmo consiste numa operação computável que calcula, com base nos dados fornecidos, e em tempo finito, um resultado bem definido e garantidamente correto. Por exemplo, todos nós conhecemos um processo de ordenação com estas características, que usamos para ordenar a mão de cartas que nos calhe em sorte num jogo de king; tecnicamente, este algoritmo chama-se insertion sort e foi formalizado em 1946 por John Mauchly, coinventor do computador pioneiro ENIAC [Electronic Numerical Integrator and Computer ou, em português, computador integrador numérico eletrónico] e ordena corretamente qualquer lista de N elementos, num tempo proporcional a N2. Note-se que é possível definir programas que podem nunca terminar, ou que dão resultados difíceis de caracterizar, pelo que não se pode dizer que algoritmos e programas sejam a mesma coisa, como por vezes se poderia pensar.
Como são inventados os algoritmos? Conceber novos algoritmos exige criatividade e o domínio de técnicas específicas, para cada operação definida em termos de uma relação abstrata entrada/saída é em geral possível definir algoritmos diferentes para a computar, com características diferentes. Assim, para cada problema, existem algoritmos mais e menos rápidos, ou que usam mais ou menos memória. São conhecidos limites para a eficiência (complexidade computacional) da resolução algorítmica de muitos problemas, limites absolutos e que não podem ser superados. Por exemplo, nunca será possível definir um algoritmo sequencial de ordenação que demore tempo proporcional ao comprimento N da lista a ordenar. Os algoritmos mais eficientes usarão sempre um tempo pelo menos proporcional a N log N. Existe um corpo de conhecimento científico chamado Algoritmia, investigando novos algoritmos e suas características teóricas e práticas. Um dos mais complexos problemas de algoritmia ainda em aberto, e do qual depende a segurança de todos os esquemas criptográficos usados na internet, consta dos «Problemas do Milénio» do Clay Mathematics Institute, que concederá um prémio de um milhão de dólares americanos, a quem o resolver.
Por outro lado, os «algoritmos» de inteligência artificial de que tanto se fala hoje não são em rigor algoritmos, mas sim heurísticas, algo muito diferente. Uma heurística é uma abordagem à resolução de problemas baseada mais na experiência prática do que em qualquer teoria precisamente fundamentada, e que não garante um resultado correto em todos os casos, ou que funciona apenas em certas condições. Exemplos familiares de heurísticas são o uso de sondagens digitais – nem sempre consentidas – para prever preferências de consumidores na Internet, ou de modelos neuronais para reconhecer se fotografias representam gatos, ou certas pessoas. Obviamente, é possível programar heurísticas num computador, mas tais programas não podem em rigor considerar-se algoritmos, pois não garantem a correção ou completude da informação gerada.
Como são inventadas as heurísticas? As heurísticas resultam de análises de padrões, tendências ou correlações, nos dados de entrada, e na construção de modelos matemáticos que possam classificar ou prever tais tendências e correlações. Estas abordagens têm a sua origem na estatística, e podem recorrer a algoritmos de interpolação, agrupamento, classificação ou previsão. O uso de heurísticas é certamente muito importante em domínios para os quais é difícil encontrar algoritmos ou mesmo especificar o problema a resolver de forma precisa, e definir modelos heurísticos é uma tarefa complexa. O desenvolvimento de modelos baseados em redes neuronais, iniciado em 1943 por McCulloch e Pitts, veio simplificar bastante a tarefa, conduzindo à definição de sofisticados algoritmos de aprendizagem automática que permitem definir redes neuronais automaticamente a partir de conjuntos de dados. Atualmente, a aprendizagem automática permite construir redes neuronais gigantescas para suportar os grandes modelos de linguagem como o ChatGPT, para a classificação de imagens médicas, ou para a tradução automática, em particular com a emergência da aprendizagem profunda, que valeu a atribuição em 2018 do Turing Award a Bengio, Hinton e LeCun (este último VP da Meta/Facebook para a área da inteligência artificial).
Ao contrário do que acontece com um algoritmo, que calcula um resultado através de processo concebido por análise detalhada do problema a resolver, uma rede neuronal aprende a correlacionar o resultado associado a cada dado de entrada através de análise de tendências num conjunto de treino. O conjunto de treino consiste numa grande quantidade de exemplos, positivos e negativos, de pares entrada/saída para a operação que se pretende aproximar. Em geral, quanto mais exemplos tiver o conjunto de treino, mais exatas serão as respostas do modelo obtido. Por exemplo, uma rede neuronal pode definir um modelo para reconhecer os números pares, se treinada com uma grande quantidade de exemplos corretos, como (2,OK), (4,OK), (7,KO), (9,KO), (112,OK), etc. Espera-se que, após o treino convergir, a rede neuronal classifique 100 como número par, por generalização, mesmo que não tenha nunca «visto» o par (100,OK). É a esta generalização, a capacidade de «adivinhar» ou de «prever» por interpolação resultados não explicitamente treinados que se atribui uma capacidade de «inteligência artificial» a estes sistemas, e que, na realidade, é uma forma de inferência estatística. Teremos, então, um «algoritmo» para identificar números pares. Neste caso, é bem provável que o modelo heurístico não cometa erros, pois o conjunto de treino revela um padrão muito simples de reconhecer: são pares os números que terminam em 0,2,4,6 ou 8. Pelo contrário, se tentarmos criar uma rede neuronal para identificar números primos (para os quais não existe um padrão evidente), treinando-o de forma análoga com exemplos positivos e negativos do tipo (3;OK), (6; KO), (7;OK), etc., o modelo será muito erróneo na classificação de números fora do conjunto de treino.
A figura acima ilustra de forma simplificada a ideia de interpolação. O treino de uma rede neuronal permite determinar um conjunto finito de parâmetros (números reais), com base nos quais é definida uma função matemática que representa um modelo heurístico através de uma forma de interpolação. À esquerda, um modelo de elefante «inferido» a partir de 5 parâmetros. À direita, um modelo de elefante «inferido» a partir de 15 parâmetros. O modelo «adivinhado» com mais parâmetros é mais preciso.
O sistema ChatGPT baseia-se numa rede neuronal profunda com 100 camadas e mais de 175 mil milhões de parâmetros, treinado num corpus de textos com mais de 300 mil milhões de palavras. O modelo obtido permite prever, dado um texto incompleto (prompt) de entrada, a palavra que é mais provável ocorrer imediatamente a seguir a essa entrada num texto típico. Este processo, quando repetido, permite gerar respostas completas e redigidas de forma fluente a qualquer pergunta. No entanto, é muito difícil assegurar em geral a validade de tais respostas, pois como vimos a sua geração não se baseia em qualquer tipo de raciocínio ou compreensão, mas apenas em correlações estatísticas identificadas no conjunto de treino e interpolação durante a fase de treino, e cuja explicação está escondida de forma impenetrável em triliões de obscuros parâmetros numéricos.
Os modelos de inteligência artificial baseados na aprendizagem automática são instrumentos cada vez mais importantes de informação e suporte à decisão em todas as áreas. Mas é importante conhecermos as suas características e limitações, não os confundindo com verdadeiros algoritmos, que, são sempre confiáveis por definição. Assim, os resultados ou conteúdos gerados pelos «algoritmos» de inteligência artificial devem sempre ser sujeitos a validação e interpretação humana, de acordo com as informações (quando existem) do produtor de software que os concebeu, não deverão por isso ser usados de forma leviana na tomada de decisões críticas. É previsível que os progressos futuros na investigação científica e inovação tecnológica em algoritmos e modelos estatísticos de aprendizagem automática continuem a contribuir para que os sistemas informáticos do futuro sejam não só cada vez mais poderosos e inteligentes, mas também mais confiáveis, inclusivos, transparentes e com qualidade de serviço clara e regulada por legislação adequada. Para que tal se torne realidade, há muitos desafios técnicos, sociais e políticos a superar, o que torna todas estas questões e debates cada vez mais fascinantes.
- Sobre Luís Caires -
Luís Caires é professor catedrático no Instituto Superior Técnico, investigador no INESC-ID, e European Research Area Chair no âmbito do projecto BIG. A sua investigação desenvolve-se nas áreas dos sistemas, linguagens, modelos, segurança, e fundamentos da computação, nas quais contribuiu diversos resultados científicos seminais publicados em artigos científicos, interessando-se também pelos aspetos sociais das tecnologias. É membro do IFIP Working Group on Programming Concepts, presidente da Comissão Coordenadora do European Symposium on Programming Languages and Systems e vice-presidente da Sociedade Portuguesa de Lógica. Foi professor catedrático na Universidade NOVA de Lisboa, onde foi o diretor fundador do NOVA Laboratory for Computer Science and Informatics.