Programação

  • A discussão sobre Inteligência Artificial

    Benvindos ao curso de Inteligência Artificial

    O objetivo principal da disciplina é introduzir os conceitos básicos da Inteligência Artificial e sua relação com a inovação, especialmente quando ligada a automação de processos, serviços e sistemas. Teremos uma abordagem conceitual da IA, combinando teoria e prática referentes à inteligência de máquina e ao desenvolvimento de sistemas baseados em conhecimento. Discutiremos as diversas formas de representação de conhecimento mas focaremos nas regras de produção e base de dados (na forma de fatos ou acoplado ao sistema inteligente).  A dinâmica destes sistemas é baseada em regras de inferência, técnicas de busca, e nos métodos computáveis de resolução de problemas, sintetizados nas técnicas planejamento inteligente e planejamento automático, e sistemas baseados em regras.  

     

    As aulas presenciais serão na sala A5.

  • Introdução



    Começaremos com uma discussão sobre inteligência e seus pressupostos, para delimitar expectativas e dimensionar corretamente o que se pode esperar dos sistemas inteligentes.  Estamos em uma época marcada por um "corte epistemológico" entre sistemas puramente funcionais e sistemas flexíveis e interativos (inteligentes) aplicados em diversas áreas. Portanto, é importante separar claramente o que se chama de "digital mind" ou inteligência computacional - que pode ser inserida em algoritmos eminentemente procedurais - dos métodos baseados em conhecimento e lógica. Faremos um breve histórico sobre o interesse acadêmico e global na inteligência, na sua reprodução por máquinas e sistemas, para introduzir o conceito de agente inteligente, fundamental para a inteligência de máquina, embarcada ou distribuída. 

    O curso está dividido em uma parte teórica e uma parte prática.  A parte prática envolve o desenvolvimento de pequenos programas em Programação Lógica, e será feita no ambiente SWISH Prolog. O sistema pode ser baixado do link https://www.swi-prolog.org ou usado online via browser.  O objetivo é entender as diferenças entre a programação procedural, feita por exemplo em Python e a programação lógica, e discutir como seria o desenvolvimento de sistemas baseados em conhecimento. O objetivo não é se aprofundar em programação lógica mas deixar clara a diferença entre o desenvolvimento de sistemas procedurais, com inteligência computacional e sistemas inteligentes, baseados em lógica.  


  • Agentes inteligentes



    Telemedicina: um novo desafio para a IA


    A abordagem moderna para os sistemas inteligentes é baseada no conceito de agentes (inteligentes). Este conceito significa um avanço na abordagem sistêmica para IA e na sua relação com os sistemas automatizados. O conceito de agentes, é essencial para ter uma referencia sobre o design de sistemas automatizados baseados em inteligência artificial. O ciclo de automação consiste na captura de conhecimento sobre o ambiente de entorno (environment),  sobre os estados que pode atingir, e sobre a ações que alteram os estados do sistema e do seu entorno.  A "inteligência" do sistema consiste na escolha adequada destas ações, de modo a responder a uma demanda do environment. A aplicações podem ser bastante diversificadas indo da manufatura inteligente aos serviços na web. 

    Nesta aula vamos tratar prioritariamente da identificação e classificação dos agentes.

    • slides da Aula2

    • Defina com os seus colegas um grupo de até quatro integrantes e poste nesse link a definição do grupo com os respectivos nome e número USP. Só um membro do grupo precisa fazer o upload do documento.

      Vocês podem rever a formação dos grupos até a próxima sexta, mas busquem otimizar o número de grupos, evitando ter menos de três alunos por grupo. Submetam a formação dos grupos em arquivo PDF.

  • Agentes Inteligentes e Resolução de Problemas


    A abordagem recente da IA (assim como para o software em geral) é baseada em agentes, abrindo a possibilidade para tratar sistemas distribuídos e unitários de forma única. Como discutimos na aula passada existem várias classes de agentes que se caracterizam por focar em um contexto bem definido e processar como atuar sobre este contexto, seja de forma reativa, direcionando a evolução de estados, buscando atingir objetivos, ou mantendo serviços (automatizados). Nesta aula vamos discutir a proposição de "problemas" e como estes agentes podem ser usados para resolvê-los.

    • slides da Aula3

  • Resolvento problemas com IA




    A primeira aplicação importante da IA está genericamente ligada à possibilidade de resolver problemas (mesmo com limitações). Isso implica em envolver racionalidade no processo de tratamento de demandas (que chamaremos genericamente de "problemas").  O recurso principal seria transformar o sistema de resolução em um programa, seja diretamente ou usando uma plataforma de programação lógica como o SWISH Prolog. E o método mais simples e direto seria mapear os estados do ambiente através dos perceptrons e fazer uma busca para encontrar possíveis estados que resolveriam as demandas. Um exemplo muito intuitivo são os jogos, que usaremos nesta aula. 

     

  • Algoritmos de Busca Informada





    Na aula passada discutimos conceitualmente as estratégias de resolução de problemas por humanos e máquinas, com o objetivo de fazer uma clara distinção entre os dois processos e deixar claro as limitações da máquina (no caso o computador no seu modelo von Neuman sequencial) para tratar de processos normalmente associados a humanos. A proposta de ter um método geral para resolução de qualquer problema (que discutiremos mais detalhadamente nas próximas aulas) está ligado a esta referência (humana) e é uma discussão antiga, como vimos no histórico das primeiras aulas. No momento, o nosso foco é com os métodos clássicos baseados em busca, saindo da busca cega (que pode ser implementada con inteligência computacional) para a introdução de heurísticas e conhecimento tácito. 

    Os algoritmos serão apresentados usando como exemplo jogos como o 8-puzzle e os sistemas de roteamento de veículos, tratados de uma forma muito simples e direta. 


  • Sistemas Baseados em Conhecimento




    Resumindo o que vimos até aqui sobre resolução de problemas usando Inteligência Artificial, podemos estabelecer uma linha evolutiva e histórica que talvez explique a sucessão de diferentes surtos de popularidade desde a criação o termo Inteligência Artificial em 1956.  Desde o inicio deste processo existiram 3 grandes booms da IA: o primeiro foi marcado pelos métodos e algoritmos de busca com um foco notadamente cognitivo. Embora o aprendizado de máquina estivesse presente, especialmente nos programas para jogar damas, dependia muito de capacidade de processamento, e parte da comunidade da época apostava na evolução do trabalho do Marvin Minsky sobre os neurônios artificiais. O segundo boom foi nos anos 80, basedo nos sistemas especialistas. Nessa época se propagou a demanda de aplicaçã de sistemas inteligantes em processos práticos, especialmente o roteamento de veículos, processos quimicos, sistemas de diagnóstico, etc.  Havia ainda um gargalo na capacidade de processamento, mas justamente nessa época surgiram as "workstations" para ampliar a capacidade dos PCs correntes provendo uma quantidade substancialmente maior de memória RAM.

    • Slides da Aula7

    • Artigo de revisão sobre aplicações modernas de sistemas especialistas. No caso específico na montagem de uma biblioteca digital, substituindo as bibliotecas convencionais. 

    • Demo de um sistema de triagem e diagnóstico médico feito com base em IA, estatística e interface com linguagem natural. 

    • O nosso primeiro exercício livre (não vale para avaliação) é fazer um programa interativo para o "jogo da velha". Portanto o sistema (inteligente) deve jogar com um usuário humano e se adaptar (saber o que fazer) quando este faz uma jogada (qualquer jogada), sem anotar explicitamente a resposta a cada jogada. Vamos aproveitar para exercitar a manipulação de listas, portanto um template do programa será fornecido já com a base matricial do "board" do jogo (uma lista de listas). Com isso vários dos procedimentos serão recursivos (outro exercício importante). 

      O nosso monitor Luis Fernando está preparando um notebook com o programa, que como foi descrito não usa diretamente "busca" (informada ou não informada), mas sim o conhecimento de um "jogador experiente" e como tal não perde o jogo. 

    • Poste a sua dúvida sobre o exercício livre do "jogo da velha".  Sua dúvida será respondida por mim ou pelo monitor Luiz Fernando.

  • Sistemas Especialistas e Engenharia de Conhecimento




    Na aula passada introduzimos conceitualmente os sistemas baseados em conhecimento, e em especial os sistemas especialistas, responsáveis pelo segundo "boom" da inteligência artificial. Lembrando que o "boom" diz respeito a como a IA atinge o mercado e se torna uma perspectiva de resolução de vários problemas de sistemas de produção, serviços, etc. especialmente aqueles automatizados. Vamos avançar um pouco mais nesta aula sobre os mecanismos de inferência e sua integração com as bases de conhecimento, e sobre o papel da Engenharia de Conhecimento nesse processo. Terminaremos com uma breve descrição do ciclo de vida de desenvolvimento de um sistema especialista. 

     

  • Design de Sistemas Especialistas


     

    Na aula passada falamos sobre um modelo genérico de design de um sistema baseado em conhecimento, em especial de um sistema especialista. Nesse caso temos dois desafios: construir a base de conhecimento e pelo menos a parte externa da máquina de inferência - contando que temos um ambiente de desenvolvimento que já traz uma parte desse sistema. Entretanto, não entramos em mais detalhes de como proceder, mesmo nesse modelo simples. Nesta aula vamos entrar nesses detalhes, e esse vai ser um guia para o próximo exercício-programa (agora valendo nota). Portanto, o limite para formação de equipes será a próxima aula (próxima quarta-feira ao meio dia). 

    ===========================================================================

    O exercício-programa será um sistema especialista de serviço e será peoposto na próxima aula. 

    • Esse artigo pertence a uma coletânea publicada como livro. É um artigo de 2011, mostrando que esse assunto não é novo, ou pelo menos, não surgiu recentemente, e a discussão tem mais de treze anos. Mas o tema é atual, e, com o desenvolvimento da Ciência de Serviços tomou um dimensão ainda maior.

  • Agentes Lógicos





    Desde a Aula 7 estamos discutindo os sistemas especialistas e como desenvolver - como um projeto de engenharia/computação - um sistema baseado em conhecimento (com algumas simplificações) que, quando há a predominância do conhecimento tácito, é chamado de sistema especialista. Antecipamos essa discussão com o exercício-livre para tratar o jogo da velha. Agora é preciso encarar um problema que está relacionado com o "segundo inverno" na Inteligência Artificial": os sistemas de interesse - acadêmico ou práticos, de mercado - tratam com uma quantidade cada vez maior de dados, além das regras de produção. Portanto, o fato destes sistemas de dados serem extra-lógicos pode causar um problema ao lidar com uma KBS interna e "externa". Existem tentativas de solução criando um sistema dinâmico com predicados especiais como assert, retract, record, etc. mas a integração com o sistema lógico não é direta, embora seja plenamente implementavel.  Mesmo resolvendo esse problema (o que está já um pouco fora do escopo da disciplina) a performance de sistemas especialistas que usem uma quantidade razoável de dados é baixa, comparado com a referência que temos dos bancos de dados (SGBD). 

    Assim, vamos ter em mente que a tendência atual é que os sistemas inteligentes sejam parte de agentes (de software ou físicos), mas que nesta disciplina não vamos aprofundar a discussão sobre como inserir novos fatos e regras no KBS (vindas dos perceptrons) ou como gerar sequências de ações para atuar no environment (vamos discutir esse tópico especificamente nas aulas que começam em novembro.


  • Representação de conhecimento



    Até aqui discutimos os sistemas baseados em conhecimento que contém apenas conhecimento tácito, os sistemas especialistas clássicos. Mesmo afirmando que os KBS's têm um escopo bem mais amplo, na prática (e no exercício-programa) tratamos somente os sistemas cuja base de conhecimento vem de eliciação direta de um especialista no domínio, sem nenhuma formalização. Hoje, vamos em primeiro lugar ampliar esse escopo mostrando aplicações prática onde a modelagem do KBS mistura conhecimento tácito e explícito, baseado na Engenharia. Mostraremos brevemente uma tendência atual para trabalhar com sistemas de conhecimento mais profundo, usando ontologias. Finalizaremos com os sistemas baseados em "grid", usados tanto em jogos com em sistemas de navegação de robôs. 

    Falaremos também sobre as opções de linguagem para programação lógica, inclusive das plataformas na nuvem.

    Uma breve redefinição no nosso cronograma: 





    • Uma possível implementação do jogo do tic-tac-toe em Prolog. A interface foi reduzida ao mínimo e não monitora a entrada de dados errados, por exemplo, uma posição (5, 1) para uma jogada do usuário "x". 

    • Sistema especialista para a busca de imóveis para estudantes. Novamente a interface foi reduzida ao mínimo, e a base de conhecimento também. Temos somente 15 imóveis cadastrados. Mas o foco é criar regras ("rules of thumb") para buscar os imóveis e fazer uma análise de qualidade da escolha para orientar o estudante. 

  • PLanejamento Automático

    Defining the problem is the important first step in planning - Cutting Edge  PR Insights


    Vamos retomar a discussão de como aplicar a IA para resolver problemas, seguindo o rumo histórico dos grandes invernos e verões. Até aqui tivemos uma primeira fase, marcada pelo esforço para aplicar IA para prova de teoremas, sistemas de diagnóstico e jogos, incluindo a criação das redes neurais. Esta fase foi seguida da aplicação dos métodos de busca informada que aproximaram os sistemas inteligentes das aplicações práticas de mercado. Em seguida, tivemos a ampliação da discussão sobre a resolução de problemas de forma independente do domínio, mas o que de fato aproximou a IA da aplicação prática foram os sistemas especialistas. Mostraremos nessa aula a diferença entre a parte mais teórica e os sistemas baseados exclusivamente em conhecimento tácito, que constituem também o nosso primeiro exercício-programa. Essa discussão será estendida na aula que vem para entrar em mais detalhes sobre os sistemas de planejamento inteligente (IA Planning). 

  • O Algoritmo STRIPS




     Nesta aula vamos voltar à discussão sobre resolução de problemas em IA e apresentar o algoritmo STRIPS, mencionado informalmente na aula passada. Um ponto importante é a generalidade de um algoritmo de resolução de problemas independente do domínio de aplicação e sua relação com a demanda por sistemas inteligentes aplicados (especialmente em automação) a domínios específicos. No entanto ter um modelo geral é um objetivo perseguido desde o final dos anos 50 e tornou-se a base para um processo geral de planejamento e resolução de problemas conhecido como STRIPS (Stanford Research Institute Problem Solver). 

    O SRI (Stanford Research Institute) se destacou durante os últimos 50 anos na pesquisa em Inteligência Artificial e foi o berço do chamado planejamento clássico. O interesse maior sempre  foi propor um planejador genérico, independente de domínio de aplicação, que pudesse ser embarcado em sistemas autônomos, como o robô Shakey mostrado na figura acima, criado na década de 70. Novos métodos de planejamento inteligente continuam a ser discutidos hoje em um evento internacional, o ICAPS, um evento anual que reune toda a comunidade de AI Planning e Secheduling.



  • O mundo de blocos

    Destaque



    Na aula passada discutimos de forma bem intuitiva o problema-modelo do mundo de blocos. Hoje vamos generalizar o problema de planning e os conceitos relacionados. O problema do mundo de blocos e sua conceituação simples devem então se encaixar nesse modelo geral pela introdução de reduções e simplificações. Podemos mostrar que estamos ainda no mesmo domínio de problema, mas em uma categoria bem mais simples e mais direta, o que nos permite evitar o tratamento mais formal. A ideia é enfatizar que temos uma classe de problemas que tem uma certa complexidade e alguns entraves, como a anomalia de Sussman, mas que pode ser minorada pela introdução de uma análise (formal) do espaço de estados. Portanto o nosso desafio é introduzir a análise do espaço de estados em um problema simples como o mundo de blocos e mostrar como podemos com isso contornar a Anomalia de Sussman.

    A anomalia de Sussman foi proposta por Gerald J. Sussman na durante a elaboração da sua tese de doutorado em 1973, orientada por Marvin Mynsky no MIT. Ao contrário da maioria dos grandes pesquisadores citados, Sussman está vivo e ainda atuante no CSAIL (Computer Science & Artificial Intelligence Lab) do MIT. O trabalho dele foi importante para mostrar que é preciso um certo cuidado ao implementar planejadores automatizados, especialmente se os estados são percorridos e analisados linearmente.

    Embora seja importante destacar as limitações do STRIPS isso não afeta a sua influência conceitual nos planejadores automáticos atuais. Propostas mais recentes ou são inspiradas no STRIPS, no relaxamento de algumas de suas propriedades, ou das restrições feitas sobre a definição geral dos  problemas de planning para chegar no STRIPS ou no mundo de blocos. Evidentemente, as aplicações práticas são bem mais sofisticadas que esse problema-modelo.



    2o. exercício programa

    O segundo exercício programa consiste em fazer um planejador para o mundo de blocos. 

    O Mundo de Blocos é  um sistema estado-transição (um T-system) composto por três blocos identificados pelas letras a, b, e c, que podem ser dispostos em diferentes arranjos, como mostrado na aula de hoje. O espaço de estados é finito e, evolui pela aplicação de uma ação provocada por um robô manipulador que, uma vez instanciada com os blocos (ou a mesa) torna-se um operardor responsável pela mudança de estados (o conjunto de eventos é vazio). 

    Faça um planejador (um programa em Prolog) que recebe como demanda o estado inicial e final do mundo de blocos, e, usando o operador move acha um caminho no grafo de estados entre um e outro. O programa deve seguir as seguintes restrições:

    1. estados são representados por uma lista de predicados sobre o posicionamento dos blocos (como visto em aula);
    2. o plano (feito offline) é uma string (uma lista) de operadores que leva do estado inicial ao estado final;
    3. É parte ESSENCIAL do exercício usar conhecimento adquirido pela análise do espaço de estados (mesmo nesse exemplo simples) de modo a aproximar a solução do ótimo e evitar problemas como a anomalia de Susseman. 

    Como sempre a entrega é um arquivo PDF com a descrição básica do algoritmo e o link para o SWISH Prolog onde está o programa.

    ENTREGAR ATË o dia 10 de dezembro à meia noite VIA e-disciplinas.