PowerLoom Anderson Carlos D. Sanches anderson anderson@ime.usp.br

Preview:

Citation preview

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

Obrigado

Anderson Carlos D. Sanches

anderson@ime.usp.br