• Nenhum resultado encontrado

Capítulo 2: Programação em Lógica Indutiva

2.4 Alguns Sistemas de Programação em Lógica Indutiva

2.4.2 Sistemas ILP

I. FOIL (First Order Inductive Learner)

O FOIL (QUINLAN, 1990) realiza sua busca por cláusulas utilizando a estratégia top- down e um algoritmo de cobertura. O sistema começa com a cláusula mais geral que

37

possui como cabeça o predicado alvo e corpo vazio. Todos os argumentos da cabeça são variáveis diferentes e, desta forma, a cláusula inicial prova todos os exemplos, ou seja, classifica todos os exemplos como positivos. A cláusula é então especializada pela adição de alguns literais ao seu corpo. Vários literais são considerados com este propósito, sendo o que leva a um melhor ganho (considerando a métrica ganho de informação - explicada abaixo) adicionado ao corpo da cláusula. Literais são adicionados até que a cláusula não prove nenhum exemplo negativo. Uma vez induzida uma cláusula consistente (que não prova nenhum exemplo negativo) ela é armazenada e, com um típico algoritmo de cobertura, o sistema remove os exemplos positivos que são provados por esta cláusula, e todo processo é repetido, até que todos os exemplos positivos sejam provados. O algoritmo 2.3 descreve o funcionamento geral do sistema FOIL.

No passo 4, o FOIL usa um algoritmo Hill Climbing (RUSSELL, NORVIG, 2003) em busca de um “bom” literal. A qualidade de um literal é mensurada pela métrica chamada de ganho de informação, e o literal que maximiza este ganho é o escolhido para ser adicionado à cláusula. Especificamente, considere C a cláusula à qual um novo literal L será adicionado, e C‟ a cláusula criada a partir de C pela adição de L (C‟ = C  L). A métrica ganho de informação é estipulada como mostra equação 2.1.

𝐺𝑎𝑛𝑕𝑜_𝐼𝑛𝑓𝑜𝑟𝑚𝑎çã𝑜 = 𝑠𝑐 × 𝑙𝑜𝑔 𝑝𝑐

𝑝𝑐′ + 𝑛𝑐′ − 𝑙𝑜𝑔 𝑝𝑐

𝑝𝑐 + 𝑛𝑐 (2.1)

onde pc, pc‟, nc, nc‟ são os exemplos positivos e negativos cobertos, respectivamente por C e C‟, e sc é o número de exemplos positivos que são cobertos por C e que continuam sendo cobertos por C após L ter-lhe sido adicionado.

38

Os literais adicionados a uma cláusula C podem ser da seguinte forma (QUINLAN, 1990):

 P(X1,..., Xk), e  P(X1,..., Xk), onde Xis são variáveis já presentes na cláusula, ou

novas variáveis.

 Xi = Xj, ou Xi  Xj, para variáveis presentes na cláusula.

 Xi = c, ou Xi  c, onde Xi é uma variável na cláusula e c é uma constante.

 Xi  Xj, Xi > Xj, Xi  v, Xi > v, onde Xi e Xj são variáveis da cláusula que

assumem valores numéricos e v é um limite escolhido pelo FOIL.

Existe uma restrição sobre os literais que podem ser colocados na cláusula. Tal restrição dita que ao menos uma variável aparecendo no literal a ser adicionado deve já fazer parte da cláusula. Outra restrição adotada pelo FOIL se relaciona ao tamanho da cláusula. Esta restrição dita que se uma cláusula fica muito extensa (com muitos literais)

Entrada:

(E+, E-): conjunto de exemplos de treinamento formado por exemplos positivos E+ e por exemplos negativos E-;

BK: Conhecimento preliminar;

Variáveis Locais:

cláusula, teoria (conjunto de cláusulas);

Saída:

teoria modificada;

Começo-FOIL: 01– teoria := ; 02– cláusula := ;

03– Enquanto (cláusula provar exemplos negativos) faça:

04- Encontre um “bom” literal para ser adicionado à cláusula; 06- fim-enquanto;

05– teoria := teoria  cláusula;

06– E+ := E+ - exemplos positivos provados por cláusula; 07– Se (|E+|  0) então

08– retorne ao passo 2; 09- fim-se;

10– retorne teoria; Fim-FOIL.

39

quando comparada ao número de exemplos positivos que esta cláusula prova, tal cláusula não é mais potencialmente considerada como parte da teoria.

Devido ao grande espaço de busca explorado pelo FOIL, tal sistema é geralmente superado pelos sistemas Progol e Aleph que usam a bottom clause como forma de limitar seus espaços de busca. Tais sistemas são brevemente explicados a seguir.

II. Progol

O sistema Progol (MUGGLETON, 1995), (MUGGLETON, 1996) usa o algoritmo de cobertura como forma de construir suas teorias juntamente com a construção da bottom clause que é usada para limitar inferiormente o látice que representa o espaço de busca de cláusulas isoladas. Dessa forma, o sistema Progol se restringe a buscar por cláusulas que são mais gerais que a bottom clause gerada, ou seja, este sistema busca por cláusulas cujo corpo é constituído por um subconjunto dos literais presentes no corpo da bottom clause. O algoritmo 2.4 ilustra o funcionamento geral do sistema Progol.

Entrada:

(E+, E-): conjunto de exemplos de treinamento formado por exemplos positivos E+ e por exemplos negativos E-;

BK: Conhecimento preliminar;

Variáveis Locais:

cláusula, bottom clause (), teoria (conjunto de cláusulas);

Saída:

teoria modificada;

Começo-Progol: 01- teoria := ;

02- Enquanto (|E+|  0) faça: 03- Selecione e  E+;

04- Construa  a partir de e;

05- Encontre uma “boa” cláusula entre  e  usando o A*; 06- teoria := teoria  cláusula;

07- E+ := E+ - exemplos positivos provados por cláusula; 08- fim-enquanto;

08- retorne teoria; Fim-Progol.

40

Primeiramente, é importante notar que para cada cláusula adicionada à teoria, uma bottom clause foi construída (passo 4) utilizando um dos exemplos positivos em E+ que ainda não foi provado. Na linha 5, o algoritmo A* é usado para encontrar uma boa cláusula tendo como ponto de partida a cláusula mais geral. De acordo com esta estratégia, um número fixo de cláusulas é construído a partir da cláusula inicial usando um operador de refinamento que especializa a cláusula. A cláusula considerada a melhor é então escolhida e este processo é repetido. O Progol usa a definição de - subsume (definição 2.16) para buscar por cláusulas que irão constituir sua teoria. O operador de refinamento utilizado pelo Progol mantém a relação   C   para qualquer cláusula C buscada, o que limita a busca por cláusulas C que tais que   C  .

De acordo com a definição 2.16, como C  , existe uma substituição  tal que C   e, dessa forma, para cada literal L em C existe um literal L‟ em  tal que L = L‟. Percebe-se que o operador de refinamento deve manter um controle sobre  e uma lista dos literais em L‟ em  que possuem um literal correspondente L em C. Toda cláusula C que subsume , possui em seu corpo um subconjunto dos literais de  com alguma substituição aplicada. O Progol escolhe o melhor entre todos os possíveis refinamentos utilizando uma função de avaliação que incide sobre a cláusula C e é dada por:

𝑓 𝐶 = 𝑝𝑐 − 𝑛𝑐 + 𝑡𝑐 + 𝑕𝑐 (2.2)

onde pc é o número de exemplos positivos provados pela cláusula C, nc é o número de exemplos negativos provados por C, tc é o tamanho da cláusula C (dado pelo número de literais - 1), e hc é o número esperado de literais a ser adicionado ao corpo da cláusula. Como afirmado, o Progol busca apenas por cláusulas C que satisfaçam a seguinte relação   C  ; este pode ser considerado um primeiro bias no espaço de busca. Outras restrições impostas ao espaço de busca de cláusulas são as declarações de modos e determinations, como apresentado na seção 2.4.1.

III. Aleph

De forma geral, pode-se dizer que o Aleph (SRINIVASAN, 2003) é uma implementação do Progol totalmente construída utilizando a linguagem Prolog (GOADRICH, 2009). Dessa forma, as declarações de modos, determinations, geração

41

da bottom clause e até mesmo a maneira sequencial de construção de teorias, que é realizada utilizando um algoritmo de cobertura e a bottom clause, são os mesmos do sistema Progol. O que torna o Aleph importante e até mesmo (de certa forma) mais popular que o Progol, é a sua potencial flexibilidade, uma vez que o Aleph possui dezenas de parâmetros que torna possível adaptá-lo a uma grande gama de problemas. Como um exemplo de sua notável flexibilidade10, o Aleph, enquanto busca por cláusulas que formarão uma teoria, pode utilizar-se da busca em largura, ou da busca em profundidade, ou da busca iterativa por feixe (iterative beam search), ou da busca de aprofundamento iterativo (iterative deepening) (RUSSEL, NORVIG, 2003) dentre outras, inclusive usar métodos heurísticos que requerem a definição de uma função de avaliação.