Diante da Eternidade Lourenço Nisticò Sanches Diante da Eternidade Lourenço Nisticò Sanches.
PowerLoom Anderson Carlos D. Sanches anderson [email protected].
-
Upload
nicholas-mendes-goncalves -
Category
Documents
-
view
249 -
download
1
Transcript of PowerLoom Anderson Carlos D. Sanches anderson [email protected].
PowerLoom
Anderson Carlos D. Sancheswww.ime.usp.br/~anderson
Introdução
• O que é o PowerLoom?• É o sucessor do sistema de representação
de conhecimento Loom. Ele é uma linguagem e um ambiente para a construção de aplicações inteligentes.
• http://www.isi.edu/isd/LOOM/PowerLoom/• Foi escrito em STELLA (Strongly Typed,
Lisp-like Language)
Programação
• Visão geral• Vocabulário• Conceitos básicos• Uma pequena aplicação
Visão Geral
• Comandos básicos do PowerLoom• Classes primitivas e definidas• Aprendendo a responder questões
probabilísticas por meio de redes neurais
• Um Exemplo Simples
Vocabulário
• Class• Tipos de dados• Slot• Cada slot é uma função polimórfica
(deffunction) ou relação binária (defrelation) que podem ser definidas
• Assert (afirmação)• Cria instâncias das classes
Os Fundamentos: definição simples, afirmação, recuperação, e retração• (in-package “STELLA”)
• Opcional e ignorada pelo PowerLoom. Apenas para dizer a interface do Emacs que pacote usar para este arquivo
Módulos
• (defmodule “/PL-KERNEL/PL-USER/BASICS”)• |MDL|/PL-KERNEL-KB/PL-USER/BASICS• Módulos são usados para separar espaços de
nomes (classes, funções)• PL-USER é o módulo padrão do PowerLoom.• Cada módulo pode ver todos os nomes e
objetos associados de todos os seus ancestrais.
• Um módulo pode herdar nomes e prover suas próprias definições para eles.
Herança Múltipla nos Módulos
• (defmodule "BASICS“ :includes ("PL-USER"))• |MDL|/PL-KERNEL-KB/PL-USER/
BASICS
Começando• (in-module “BASICS”)• Para começarmos a preencher o módulo
BASICS• (clear-module “BASICS”)• Remove qualquer informação
acumulada de execuções anteriores• (reset-features)• |i|(:EMIT-THINKING-DOTS :JUST-IN-TIME-
INFERENCE)• Reajustar as características para o
comportamento padrão
Selecionando o Dialeto
• (in-dialect KIF)• :KIF• Declara o dialeto de lógica
assumido pelo interpretador. Podem haver vários dialetos num mesmo arquivo.
Ajuda
• (help)Lista todos os comandos disponíveis
• (help comando)Ajuda sobre determinado comando
• (demo)Alguns tutoriais
Definindo Novos Tipos (Conceitos ou Classes)• (defconcept PERSON (?p):documentation "The class of human
beings.")PERSON• Diferenças entre classes e conceitos
são mínimas.
Definindo Relações e Funções
• (defrelation happy ((?p PERSON)))• HAPPY• (deffunction age ((?p PERSON)) :->
(?a INTEGER))• AGE
Fazendo Afirmações
• (assert (Person Fred))• (PERSON FRED)• (assert (Person Joe))• (PERSON JOE)
Examinando a Base de Conhecimento
• Há duas formas:• Fazendo perguntas com respostas
verdadeiro ou falso com o comando ask
• Recuperando as instâncias que satisfazem um predicado particular com retrieve
Perguntando à Base de Conhecimento
• (ask (happy Fred))• Nada aparece. Por que?• Não dizer nada é a fórmula que o
PowerLoom diz “eu não sei”.
Vamos dizer que Fred é feliz
• (assert (happy Fred))• (HAPPY FRED)• Colocamos o slot happy da classe
Person na instância Fred como verdadeiro.
• (ask (happy Fred))• TRUE
Retrieve
• (retrieve all (?x PERSON) TRUE)• (FRED JOE)• (retrieve all (?x PERSON))• Não é necessário escrever o TRUE• (retrieve all ?x (Person ?x))• Um pouco mais lento, pois retorna
todas as instâncias e filtra as que são da classes Person
Pegando apenas uma instância
• (retrieve (?x PERSON)) ou (retrieve 1 (?x PERSON))
• (FRED)• (retrieve)• (FRED JOE)
Definindo uma idade para Fred
• (assert (= (age Fred) 35))• (= (AGE FRED) 35)• Vamos perguntar se ele tem 35 anos?• (ask (= (age Fred) 35))• TRUE• Quantos anos Fred tem?• (retrieve (?x INTEGER) (= ?x (age Fred)))• (35)
Fred fez aniversário, vamos retirar sua idade
• (retract (= (age Fred) 35))• (= (AGE FRED) (AGE FRED))• |= (retrieve (?x INTEGER) (= ?x
(age Fred)))• (= (AGE FRED) (AGE FRED))• Não sabemos mais quantos anos
Fred tem.
Vamos por 36
• |= (assert (= (age Fred) 36))• (= (AGE FRED) 36)• |= (retrieve (?x INTEGER) (= ?x
(age Fred)))• (36)
Modificando diretamente
• Para funções com apenas um valor, é possível modificar diretamente.
• |= (assert (= (age Fred) 42))• (= (AGE FRED) 42)• |= (retrieve (?x INTEGER) (= ?x (age
Fred)))• (42)
Conhecendo tudo sobre Fred
• |= (all-facts-of Fred)• |i|((PERSON FRED) (HAPPY FRED)
(= (AGE FRED) 42))
Apagando todas as informações sobre Fred
• |= (retract-facts-of Fred)• |= (all-facts-of Fred)• |i|()
Argumentando com classes primitivas e definidas• Antes de trabalhar• |= (in-package "STELLA")• |= (defmodule "/PL-KERNEL/PL-USER/CLASSES")• |MDL|/PL-KERNEL-KB/PL-USER/CLASSES• |= (in-module "CLASSES")• |= (clear-module "CLASSES")• |= (reset-features)• |i|(:EMIT-THINKING-DOTS :JUST-IN-TIME-INFERENCE)• |= (in-dialect :KIF)• :KIF
Começando• |= (defconcept PERSON (?p) :documentation "The class of human beings.")• PERSON• |= (defrelation happy ((?p PERSON)))• HAPPY• |= (deffunction age ((?p PERSON)) :-> (?age
INTEGER))• AGE• |= (deffunction friends ((?p PERSON)) :-> (?ps
SET))• FRIENDS
Instâncias dos serviços armados
• |= (defconcept ARMED-SERVICE (?s) :documentation "The class of armed
services, for example, the US Navy.")• ARMED-SERVICE• |= (assert (Armed-Service US-Army))• (ARMED-SERVICE US-ARMY)• |= (assert (Armed-Service US-Navy))• (ARMED-SERVICE US-NAVY)• |= (assert (Armed-Service US-Airforce))• (ARMED-SERVICE US-AIRFORCE)
Criando uma subclasse• Uma subclasse de “Person”• Podemos também documentar slots
individuais.• |= (defconcept WARFIGHTER (?p PERSON)• :documentation "People involved in
military operations.")• WARFIGHTER• |= (deffunction service ((?p
WARFIGHTER)) :-> (?s ARMED-SERVICE)• :documentation "The armed service to
which a warfighter belongs.")• SERVICE
Outra subclasse de Person• Só é possível ser civil se não for militar• |= (defconcept CIVILIAN (?p PERSON) :documentation "People who are not warfighters." :<<=>> (and (PERSON ?p) (not (Warfighter ?p))))• CIVILIAN• |= (defconcept ARMY-PERSON (?p WARFIGHTER) :<<=>> (and (WARFIGHTER ?p) (= (service ?p) US-Army)))• ARMY-PERSON
Definindo NAVY-PERSON e Criando Algumas Instâncias• |= (defconcept NAVY-PERSON (?p WARFIGHTER) :<<=>> (and (WARFIGHTER ?p) (= (service ?p) US-Navy)))• NAVY-PERSON• |= (assert (Warfighter Buck))• (WARFIGHTER BUCK)• |= (assert (= (service Buck) US-Army))• (= (SERVICE BUCK) US-ARMY)• |= (assert (Person John))• (PERSON JOHN)
Podemos Usar um member-of para Compor a Lista de amigos
• |= (assert (member-of Buck (friends John)))
• (MEMBER-OF BUCK (FRIENDS JOHN))• |= (assert (member-of John (friends
Buck)))• (MEMBER-OF JOHN (FRIENDS BUCK))• |= (assert (Person Judy))• (PERSON JUDY)
Perguntando sobre Judy
• Como até agora nós só informamos que Judy é uma pessoa, as consultas seguintes não tem resposta.
• |= (ask (Warfighter Judy))• |= (ask (Civilian Judy))
Informando sobre Judy
• |= (assert (Warfighter Judy))• (WARFIGHTER JUDY)• |= (assert (= (service Judy) US-Navy))• (= (SERVICE JUDY) US-NAVY)• Mas NAVY-PERSON não era um
Warfighter com service = US-NAVY? Vamos perguntar se Judy é NAVY-PERSON?
• |= (ask (NAVY-PERSON Judy))• TRUE
Questões sobre Judy
• E se perguntarmos se ela é CIVILIAN?
• |= (ask (Civilian Judy))• Nada é respondido. Mas e se
perguntarmos a negativa?• |= (ask (not (Civilian Judy)))• TRUE
E Se Fizermos o Oposto?
• |= (assert (Civilian Blimpy))• (CIVILIAN BLIMPY)• |= (ask (Civilian Blimpy))• TRUE• |= (ask (Warfighter Blimpy))• Nada é respondido• |= (ask (not (Warfighter Blimpy)))• TRUE
Vamos Declarar Outro Warfighter
• |= (assert (Warfighter Fred))• (WARFIGHTER FRED)• |= (assert (= (service Fred) US-
Airforce))• (= (SERVICE FRED) US-AIRFORCE)
Vamos Consultar as Instâncias• |= (retrieve all (?p PERSON))• (BUCK JUDY FRED BLIMPY JOHN)• |= (retrieve all (?w WARFIGHTER))• (BUCK JUDY FRED)• |= (retrieve all (?p PERSON) (not (Civilian ?p)))• (BUCK JUDY FRED)• |= (retrieve all (?p PERSON) (not (Warfighter ?p)))• (BLIMPY)• |= (retrieve all (?p CIVILIAN))• (BLIMPY)• |= (retrieve all (?w ARMY-PERSON))• (BUCK)• |= (retrieve all (?w NAVY-PERSON))• (JUDY)
Consultando as Instâncias de Duas Classes na Mesma Consulta
• |= (retrieve all (?w WARFIGHTER) (or (= (service ?w) US-Navy) (= (service ?w) US-Airforce)))• (JUDY FRED)• Ou assim:• |= (retrieve all (?w WARFIGHTER) (member-of (service ?w) (setof US-
Navy US-Airforce)))• (FRED JUDY)
Consultando Todas as Pessoas e seus amigos• |= (retrieve all ((?p PERSON) (?f
PERSON)) (member-of ?f (friends ?p)))
• ((BUCK JOHN) (JOHN BUCK))
Recuperando Todas as Forças Armadas em que Algum Membro Tenha Amigos• |= (retrieve all (?s ARMED-SERVICE)
(exists ((?p PERSON) (?w WARFIGHTER)) (and (member-of ?p (friends ?w)) (= (service ?w) ?s))))• (US-ARMY)
Aprendendo a Responder Questões Probabilísticas• |= (in-package "STELLA")• |= (defmodule
"/PL-KERNEL/PL-USER/LEARNING")• |MDL|/PL-KERNEL-KB/PL-USER/LEARNING• |= (in-module "/PL-KERNEL/PL-USER/LEARNING")• |= (reset-features)• |i|(:EMIT-THINKING-DOTS :JUST-IN-TIME-
INFERENCE)• |= (in-dialect KIF)• :KIF• |= (set-partial-match-mode :basic)
Alguns Conceitos Básicos e Relações• |= (defconcept person (?p thing))• PERSON• |= (defconcept gene (?g thing))• GENE• Relação de parentesco• |= (defrelation parent ((?x person) (?y person)))• PARENT• Relação de genótipo• |= (defrelation genotype ((?x person) (?y gene)))• GENOTYPE
Instanciando Algumas Pessoas
• |= (assert (person mary))• (PERSON MARY)• |= (assert (person joe))• (PERSON JOE)• |= (assert (person fred))• (PERSON FRED)• |= (assert (person martha))• (PERSON MARTHA)
Criando o Gene Ruivo e Alguns Parentes
• |= (assert (gene red-hair))• (GENE RED-HAIR)• Mary é parente de Joe, Fred e Martha• |= (assert (parent mary joe))• (PARENT MARY JOE)• |= (assert (parent mary fred))• (PARENT MARY FRED)• |= (assert (parent mary martha))• (PARENT MARY MARTHA)• Mary é ruiva• |= (assert (genotype mary red-hair))• (GENOTYPE MARY RED-HAIR)
Definindo uma regra
• Definindo uma regra que infere que uma criança tem um gene se algum dos pais tem o gene
• |= (assert (forall ((?x person) (?y person) (?g gene))
(=> (and (parent ?x ?y) (genotype ?x ?g)) (genotype ?y ?g))))• (forall (?x ?y ?g) (<= (GENOTYPE ?y ?g) (and (PARENT ?x ?y) (GENOTYPE ?x ?g))))
Perguntamos Agora se Joe e Fred São Ruivos
• |= (ask-partial (genotype joe red-hair))
• 1.0• Usando esta regra, nos
emparelhamos completamente e o resultado é 100%.
Agora Vamos Interpretar Como Probabilidade de Alguém ser ruivo• Mas nem sempre uma pessoa herda
um determinado gene. Suponhamos que isto aconteça 33% das vezes.
• Nós podemos dizer isto ao PowerLoom especificando exemplos de treinamento.
• |= (add-training-example (genotype joe red-hair) 0.33)
Trocando para Neural Network Mode
• O próximo passo é trocar o modo básico (:basic) para o neural network mode (:nn)
• No modelo de redes neurais, uma rede neural (neuronal) é criada para combinar as evidências com as regras.
• |= (set-partial-match-mode :nn)
Vamos Treinar Nossa Rede Neural• Os parâmetros abaixo são o número de
“epoch” para treinar e o número de exemplos de treino para usar.
• |= (train-neural-network 100 1)• Training Networks• Saving networks• Cycle 0 Error: 0.006835935230004309• Cycle 25 Error: 0.0015492401193553107• Cycle 50 Error: 2.1865990830721715E-4• Cycle 75 Error: 1.4931175184018652E-4• Note como o índice de erros cai a medida
que a rede aprende.
Vamos Perguntar Novamente se Joe é Ruivo
• |= (ask-partial (genotype joe red-hair))• 0.3299897041647006• Esta propriedade foi aprendida na forma
de uma regra geral, não apenas para Joe.
• Perguntando se Fred é ruivo, teremos a mesma resposta
• |= (ask-partial (genotype fred red-hair))• 0.3299897041647006
Vamos Tentar um Outro Jeito de Inferir Esta Probabilidade
• Primeiro, precisamos limpar os exemplos de teste e a rede neural que construímos
• |= (clear-training-examples)• |= (clear-all-neural-networks)• Agora, perguntando de Joe é ruivo
obteremos um valor aleatório, porque os pesos da rede são distribuídos aleatoriamente.
• |= (ask-partial (genotype joe red-hair))• 0.507659840996802
Vamos Ensinar Nossa Rede Através de Exemplos
• No caso anterior, nos demos ao PowerLoom um exemplo que especificava exatamente qual a probabilidade de uma pessoa ter um gene se algum de seus pais o tivesse.
• Um cenário mais comum, é o de querermos aprender esta probabilidade a partir de exemplos reais de pessoas. Podemos fazer isto, adicionando vários exemplos de teste, e dizendo quem é e quem não é ruivo.
Treinando a Rede
• Vamos assumir que Fred é ruivo, mas Joe e Martha não. Eles são todos filhos de Mary.
• |= (add-training-example (genotype joe red-hair) 0.0)
• |= (add-training-example (genotype fred red-hair) 1.0)
• |= (add-training-example (genotype martha red-hair) 0.0)
Chamando o Algoritmo de Aprendizado
• |= (train-neural-network 100 3)• Training Networks• Saving networks• Cycle 0 Error: 0.5039719708021958• Cycle 25 Error: 0.44175095571983003• Cycle 50 Error: 0.4447590165225422• Cycle 75 Error: 0.4450567667836845• Veja agora que o erro não chega perto de 0. A
causa disto é que a rede não pode analisar todos os exemplos corretamente. O melhor que ela pode fazer é escolher que o ponto com o menor número de erros para ser nossa desejada probabilidade.
Suponhamos que Mary Tenha Outra Filha
• |= (assert (person sue))• (PERSON SUE)• |= (assert (parent mary sue))• (PARENT MARY SUE)• Qual a probabilidade de ela ser Ruiva?• |= (ask-partial (genotype sue red-
hair))• 0.3367224041792676
Um Exemplo Simples
• (defconcept PROTEINA (?p):documentation "Classe das proteínas.")• (defconcept NUCLEOTIDEO (?n):documentation "Classe dos nucleotídeos.")• (defconcept CARBOHIDRATO (?c):documentation "Classe dos carboidratos
(acucar).")• (defconcept ENZIMA (?p PROTEINA)• :documentation "Enzimas sao proteínas que
facilitam reações.")
Criando Instâncias
• (defrelation cataliza ((?w ENZIMA) (?x CARBOHIDRATO) (?y NUCLEOTIDEO)))
• (defrelation sintetizada ((?p ENZIMA)))• (assert (CARBOHIDRATO ALFA-D-GLICOSE))• (assert (PROTEINA GLUT1))• (assert (NUCLEOTIDEO ATP))• (assert (ENZIMA HEXOQUINASE1))• (assert (ENZIMA HEXOQUINASE2))• (assert (ENZIMA HEXOQUINASE3))• (assert (ENZIMA GLUCOQUINASE))
Outras Instâncias
• (assert (SINTETIZADA HEXOQUINASE1))• (assert (SINTETIZADA HEXOQUINASE2))• (assert (SINTETIZADA GLUCOQUINASE))• (assert (CARBOHIDRATO ALFA-D-GLICOSE-6-
FOSFATO))• (assert (CARBOHIDRATO D-HEXOSE))• (assert (cataliza HEXOQUINASE1 ALFA-D-
GLICOSE ATP))• (assert (cataliza HEXOQUINASE2 ALFA-D-
GLICOSE ATP))• (assert (cataliza GLUCOQUINASE ALFA-D-
GLICOSE ATP))
Relações
• (defrelation produzida? ((?p ENZIMA)))• (assert (closed produzida?))• (assert (produzida? HEXOQUINASE1))• (assert (produzida? HEXOQUINASE2))• (assert (produzida? GLUCOQUINASE))
• (induce-inference-rules produzida? ENZIMA)
Processando• Processing check-types agenda...• Building classification rule with 7 clauses and 4
variables• Generating Training Examples• Generating Decision Rules• Starting rule induction with 3 positive and 1
negative examples• 3 positive examples left to be covered• Learning rule top down from signatures over 3
positives• Returning with 3 positives and 0 negatives
covered• No Positives Covered by((CATALIZA ?Y ?X2 ?X1))• 3 examples uncovered, switching to full query-
based induction
Resultado
• 3 positive examples left to be covered• Specializing• Covers 1 negs, and 3 pos• Current: (SINTETIZADA ?Y):
1.2451124629160195• Adding clause (SINTETIZADA ?Y)• Adding rule to cover 3 examples
• PowerLoom has induced the following rules
• (=> (AND (SINTETIZADA ?Y)) (PRODUZIDA? ?Y))
Resumo
• O que é o PowerLoom.• Vocabulário• Comandos básicos do PowerLoom• Classes primitivas e definidas• Aprendendo a responder questões
probabilísticas por meio de redes neurais
• Uma pequena aplicação
Onde Obter Mais Informações
• Site PowerLoom: www.isi.edu/isd/LOOM/PoweLoom/
• Onde baixar esta apresentação: www.ime.usp.br/~anderson/renata/
Obrigado
Anderson Carlos D. Sanches