Progol: uma extensão indutiva de Prolog Jacques Robin CIn-UFPE O que é Progol? Sistema de programação em lógica indutiva (ILP) Embute um interpretador Prolog Estende a programação em lógica dedutiva de Prolog com a programação em lógica indutiva e também abdutiva Permite aprendizagem parcial ou total de um programa Prolog a partir de exemplos positivos e/ou negativos de predicados do programa a aprender Aplicado com êxito para uma grande variedade de aplicações práticas Já fez descoberta científica publicada em revista especializada Implementação em C para Unix disponível de graça Representação do conhecimento Exemplos: • positivos: fatos Prolog instanciados, ex. aunt_of(jane,henry). • negativos: fatos Prolog instanciados, ex :- aunt_of(henry,sally) • porque :- antes dos fatos negados? h :- b. (b h) (b h) (F b h F) ((F b)) (h F)) ((T b)) (h F) (T b) (h F) F, h :- b, T quando b = Ø, h :- Ø h. (T h) (T h) (F h) h quando h = Ø, Ø :- b. :- b (b F) (b F) b Conhecimento prévio: • fatos Prolog, ex, father(sam,henry) • regras Prolog, ex, parent(P,C) :- father(P,C). Conhecimento aprendido (hipótese): • regras Prolog, ex, aunt(A,N) :- parent(P,N), sister(A,P). Representação de viés de aprendizagem Declarações de modo: • predefine o vocabulário de predicados • que podem aparecer nas conclusões das regras a aprender (i.e., predicados cuja definições Progol está tentando induzir) • que podem aparecer nas premissas das regras a aprender (i.e., predicados cuja definições foram fornecidas para Progol como conhecimento prévio ou estão sendo aprendidas) • impõem restrições de tipo, de instanciação e de numero de soluções possíveis para os argumentos desses predicados • por default Progol funciona sem invenção de predicados Parâmetros definindo: • número máximo de premissas nas regras a aprender • fator de compressão da aprendizagem: comprimento relativo dos exemplos fornecidos e das regras induzidas a partir deles Progol permite também: • Declarar restrições de integridade entre predicados • Excluir explicitamente de padrões sintáticos de regras Declarações de modo modeh(Recall,Pred(I1T1 ... InTn)) • inclui Pred no vocabulário das conclusões das regras a aprender modeb(Recall,Pred(I1T1 ... InTn)). • inclui Pred no vocabulário das premissas das regras a aprender Com a restrições seguintes: numero máximo de soluções para Pred = Recall i, instanciação de Argi restrita a Ii e tipo de Argi restrito a Ti tipo = predicado unário tipando constantes dos exemplos ex, person(jane). na base de conhecimento prévio define tipo de jane, aparecendo no exemplo aunt_of(jane,henry), como person • instanciação: • • • • + para argumento de entrada (variável instanciada) - para argumento de saída (variável não instanciada) # para argumento constante ex, modeh(1,aunt(+person,+person)). Exemplo de entrada % Base de exemplos dos predicados % aprender % 1/ Exemplos positivos aunt(jane,henry). aunt(sally,jim). ... % 2/ Exemplos negativos :- aunt(henry,sally). :- aunt(judy,sarah). ... % Base de conhecimento prévio % 1/ conhecimento em extensão % 1a: Tipos das constantes % aparecendo nos exemplos person(jane). person(henry). ... % 1b: Fatos relacionais father(sam,henry). ... mother(sarah,jim). ... sister(jane,sam). ... % 2/ conhecimento em intenção parent(P,C) :- father(P,C). parent(P,C) :- mother(P,C). % Viés de aprendizagem % 1/ Declarações de modos :- modeh(1,aunt(+person,+person))? :- modeb(*,parent(-person,+person))? :- modeb(*,parent(+person,-person))? :- modeb(*, sister(+person,-person))? % 2/ Instanciação dos parâmetros de viés % Excluir do espaço das hipóteses regras % com mais de 3 premissas c(3). Características de Progol como sistema de programação em lógica indutiva Aprendizagem: autônomo e não incremental com semântica monótona de regras definindo um ou vários predicados tanto a partir de exemplos positivos e negativos quanto apenas a partir de exemplos positivos tanto a partir de exemplos e conhecimento prévio quanto apenas a partir de exemplos por default sem invenção de predicados, porém permite programar tal invenção Busca: heurística incorporando ambos concisão e estimativa da generalidade das hipóteses em parte bottom-up usando rlgg a partir de um exemplo em parte top-down usando -especialização de complexidade polinomial devido às declarações de viés podando o espaço de hipótese Fundamentos lógicos para entender Progol: modelo de Herbrand de um programa lógico CH(B e1) B = programa family e1 = :- aunt(jane,henry). BH(B e1) = person(jane) ... person(judy). parent(jane,jane) ... parent(judy,judy). father(jane,jane) ... father(judy,judy). mother(jane,jane) ... mother(judy,judy). sister(jane,jane) ... sister(judy,judy). aunt(jane,jane) ... aunt(judy,judy) CH(B e1) = person(jane) ... person(judy) parent(sam,henry) parent(sarah,jim) father(sam,henry) mother(sarah,jim) sister(jane,sam) sister(sally,sarah) sister(judy,sarah) aunt(jane,henry) CH(B e1) = aunt(jane,henry) person(jane) ... person(judy) parent(sam,henry) parent(sarah,jim) father(sam,henry) mother(sarah,jim) sister(jane,sam) sister(sally,sarah) sister(judy,sarah) Princípio lógico da aprendizagem com Progol: derivação inversa dirigida por modos A partir de: • Uma base de exemplos E e uma base de conhecimento prévio B Progol busca: • as hipóteses mais concisas H tal que B H E • (B H) E (B H) E (B E) H • (B E) H (B E) H (B E H) Considerando: • • • • MH(P) o modelo de Herbrand mínimo de um programa lógico P. B E MH(B E) H, e então H MH(B E) já que G,S ((G -generaliza S) (G S)) (mas não vice-versa) um subconjunto H’ de H pode ser calculado por -generalização de MH (B E) Etapas da busca por hipóteses com Progol 1. Busca 1o exemplo e1 em E 2. Busca bottom-up da hipótese mais específica (e1) explicando e1 dado B e o viés V sobre as hipóteses • busca 1a declaração modeh do predicado p1 tal que e1 = p1(...) em V • constrói o sub-conjunto SH(e1,B,V) de MH(B e1) que satisfaz as restrições de viés (modeb e outras) • (e1) = SH(e1,B,V) = h1 :- b1, ..., bn. 3. Busca heurística top-down da melhor generalização T(e1) da hipótese mais específica (e1) • Gera todas as cláusulas Ci com conclusão h1 e tendo com premissas combinações de b1, ..., bn módulo substituições variável/variável compatíveis com as declarações de modo • T(e1) = cláusula gerada que maximiza uma heurística f(Ci) função da concisão de Ci e do seu poder de generalização sobre E 4. acrescenta T(e1) nas regras aprendidas 5. tira de E os exemplos E’ explicados por T(e1) (i.e., tal que BT(e1)E’) 6. Repetir 1-5 até E = Princípio da construção da hipótese mais específica B E MH(B E) H, e então H MH(B E) como em geral MH(P) pode ser infinito Progol não tenta construir MH (B E) mas apenas o sub-conjunto SH(e1,B,V) de MH(B e1) • para um exemplo particular e1 no lugar de todos os exemplos E • e sobre restrições de viés: tanto explicitamente declaradas (modeb e outras) quanto implícitas no algoritmo de construção de (e1) ex, que todas as variáveis de (e1) sejam ligadas Lembrete: variável V é ligada em C :- P1, …, Pn se V C ou V co-ocorre em mesma premissa com W ligada que é garantido ser finito (e1) = SH(e1,B,V) = h1 :- b1, ..., bn. Aprender gramática do inglês com Progol: arquivo de entrada % Parâmetros limitando a busca :- set(i,5)? % limite no nível das variáveis em :- set(c,5)? % limite do numero de premissas em % aprendizagem sem exemplos negativos :- set(posonly)? % Declarações de modos :- modeh(1,s(+wlist,-wlist1))? :- modeb(1,det(+wlist,-wlist))? :- modeb(1,prep(+wlist,-wlist))? :- modeb(1,noun(+wlist,-wlist))? :- modeb(1,tverb(+wlist,-wlist))? :- modeb(1,iverb(+wlist,-wlist))? :- modeb(*,np(+wlist,-wlist))? :- modeb(*,vp(+wlist,-wlist))? % Declarações de tipos wlist([]). wlist([W|Ws]) :- word(W), wlist(Ws). word(a). ... word(walks). % Conhecimento prévio: regras de formação dos % sub-constituintes da frase inglesa np(S1,S2) :- det(S1,S3), noun(S3,S2). np(S1,S2) :- det(S1,S3), adj(S3,S4), noun(S4,S2). det([a|S],S). det([the|S],S). det([every|S],S). vp(S1,S2) :- tverb(S1,S2). vp(S1,S2) :- tverb(S1,S3), prep(S3,S2). noun([man|S],S). ... noun([ball|S],S). tverb([hits|S],S). ... tverb([walks|S],S). iverb([barks|S],S). ... iverb([walks|S],S). prep([at|S],S). ... prep([from|S],S). adj([big|S],S). ... adj([happy|S],S). % Exemplos de frases s([the,man,walks,the,dog],[]). s([the,dog,walks,to,the,man],[]). s([a,dog,hits,a,ball],[]). ... s([a,ball,hits,the,dog],[]). s([the,man,walks],[]). s([a,ball,hits],[]). ... s([a,man,walks],[]). ... s([every,nice,dog,barks],[]). Algoritmo de construção de 1. busca 1o exemplo ainda não coberto e1 = p1(...). em E inicializa (e1) = e domínio da variáveis a ligar D = 2. busca 1a declaração modeh(R1, p1(...)) em V • unifica R1 vezes p1(...) com B • insere instanciações resultantes dos argumentos +tipo de p1(...) em D • insere p1(...) instanciado em (e1) 3. para cada declaração modeb(Ri pi(...)) em V: • • • • unifica pi(...) com B e D para instanciar argumentos +tipo unifica resultado Ri vezes com B para instanciar argumentos -tipo insere instanciações resultantes dos argumentos -tipo em D insere pi(...) instanciado em (e1) 4. complementa (e1) com lei de Morgan • • considerando os argumentos instanciados de (e1) como constantes de Skolem a substituir por variáveis E = exemplos, V = declarações de viés, B = conhecimento prévio Aprender gramática do inglês com Progol: construção de (e1) ... 1o exemplo: e1 = s([the,man,walks,the,dog],[]). 1o modeh sobre s: :- modeh(1,s(+wlist,-wlist))? 1 = {+wlist1/[the,man,walks,the,dog], -wlist1/[]}, D1 = {[the,man,walks,the,dog]}, s([the,man,walks,the,dog],[]) (e1) 1o modeb: :-modeb(1,det(+wlist,-wlist)). 2 = {+wlist2/[the,man,walks,the,dog], por unificação de D1 com sub-gramática de det em B -wlist2/[man,walks,the,dog]}, por unificação com S em det([the|S],S) D2 = {[the,man,walks,the,dog],[man,walks,the,dog]} det([the,man,walks,the,dog],[man,walks,the,dog]) (e1) 2o modeb: :-modeb(1,noun(+wlist,-wlist)). 3 = {+wlist3/[man,walks,the,dog], por unificação de D2 com sub-gramática de noun em B -wlist3/[walks,the,dog]}, por unificação com S em noun([man|S],S) D2 = {[the,man,walks,the,dog],[man,walks,the,dog],[walks,the,dog]} noun([man,walks,the,dog],[walks,the,dog]) (e1) No modeb: :- modeb(*,np(+wlist,-wlist)). N = {+wlistN/ [the,dog], por unificação de DN-1 com sub-gramática de np em B -wlistN/[]}, por unificação com S2 em np(S1,S2) :- det(S1,S3), noun(S3,S2) DN = {[the,man,walks,the,dog],[man,walks,the,dog],[walks,the,dog],[the dog],[]} np([the,dog],[]) (e1) Aprender gramática do inglês com Progol: construção de (e1) (cont.) (e1) = s([the,man,walks,the,dog],[]) det([the,man,walks,the,dog],[man,walks,the,dog]) noun([man,walks,the,dog],[walks,the,dog]) np([the,man,walks,the,dog],[walks,the,dog]) tverb([walks,the,dog],[the,dog]) iverb([walks,the,dog],[the,dog]) vp([walks,the,dog],[the,dog]) det([the,dog],[dog]) noun([dog],[]) np([the dog],[]) (e1) = s(A,B) (det(A,C) noun(A,D) np(C,D) tverb(D,E) iverb(D,E) vp(D,E) det(E,F) noun(F,B) np(E,B)) (e1) = s(A,B) :- det(A,C), np(A,D), noun(C,D), tverb(D,E), iverb(D,E), vp(D,E), det(E,F), noun(F,B), np(E,B). Princípio da generalização de em T Busca top-down em reticulado ordenado por -generalização Podada pela: • satisfação das restrições declaradas em V • restrições dos literais das hipóteses nos literais de (e1) = h1 :- b1, ..., bn Abordagem gerar e testar 1. gerar todas as cláusulas Ci com conclusão h1 e com premissas combinações de b1, ..., bn módulo substituições variável/variável compatíveis com as declarações de modo e as restrições de viés paramétricas em V 2. testar as Ci geradas pela função heurística: f(Ci) = ps(Ci) - ns(Ci) - hs(Ci) - cs(Ci) + 1 onde: ps(Ci) = número de verdadeiros positivos e+ E+ tal que B Ci e+ ns(Ci) = número de falso positivos e- E- tal que B Ci e- cs(Ci) = comprimento da Ci hs(Ci) = número de premissas faltando para ligar todas as variáveis ainda não ligadas em Ci 3. Escolher como T a hipótese ligada que maximiza f Aprender gramática do inglês com Progol: generalização de (e1) em T(e1) Formato do rastreamento: [C: f(Ci),ps(Ci),ns(Ci),hs(Ci), Ci] Exemplo de rastreamento: CProgol Version 4.4 |- consult(grammarTutorial)? yes |- generalise(s/2)? [Generalising s([the,man,walks,the,dog],[]).] [Most specific clause is] s(A,B) :- det(A,C), np(A,D), noun(C,D), tverb(D,E), iverb(D,E), vp(D,E), det(E,F), np(E,B). [Learning s/2 from positive examples] [C:-3,56,55,3 s(A,B).] [C:38,56,13,3 s(A,B) :- det(A,C).] [C:47,56,4,2 s(A,B) :- det(A,C), np(A,D).] ... [C:48,52,1,1 s(A,B) :- det(A,C), np(A,D), tverb(D,E), iverb(D,E).] ... [C:35,16,1,0 s(A,B) :- det(A,C), np(A,D), iverb(D,E), np(E,B).] ... [C:51,52,1,1 s(A,B) :- np(A,C), tverb(C,D).] ... [C:42,24,1,0 s(A,B) :- np(A,C), tverb(C,D), vp(C,E), np(E,B).] ... [C:44,24,1,0 s(A,B) :- np(A,C), vp(C,D) np(D,B).] [C:42,24,1,1 s(A,B) :- np(A,C), vp(C,D), np(D,E).] [106 explored search nodes] f=44,p=24,n=1,h=0 [Result of search is] s(A,B) :- np(A,C), vp(C,D), np(D,B). [6 redundant clauses retracted] Aplicações práticas de Progol Processamento de linguagem natural: indução de gramática a partir de corpus de texto Mineração da Web: aprendizagem de padrões de navegação por interface adaptativa Mineração de dados do Detran: previsão de engarrafamento Jogos: indução de estratégias para jogar xadrez Medicina: previsão de carcinogenesa Biologia molecular: • descoberta de estrutura de proteina • descoberta de função de enzima Indústria farmacêutica: invenção de novos remédios Indústria metalúrgica: invenção de novas compósitos