歸納邏輯程序設計(Inductive Logic Programming,ILP)在一階規則學習中引入了函數和邏輯表達式嵌套。 這使得,一方面機器學習系統具備了更為強大的表達能力; 另一方面ILP可看作用機器學習技術來解決基於背景知識的邏輯程序(logic program)貴南,其學得的規則可被PROLOG等邏輯程序設計語言直接使用。
然而,函數和邏輯表達式嵌套的引入也帶來了計算上的巨大挑戰。例如,給給定一元謂詞P和一元函數f,能組成的文字有P(X),P(f(X)),P(f(f(X)))等無窮多個,這就是使得規則學習過程中可能的候選原子公式有無窮多個。若仍采用命題邏輯規則或FOIL學習那樣自頂向下的規則生成過程,則在增加規則長度時將因無法列舉所有候選文字而失敗。實際困難還包括,在計算FOIL增益時需對規則覆蓋的全部正反例計數,而在引入函數和邏輯表達式嵌套之后也變得不可行。
1)最小一般泛化
歸納邏輯程序設計采用自底向上的規則生成策略,直接將一個或多個正例所對應的具體事實(grounded fact)作為初始規則,再對規則逐步進行泛化以增加對樣例的覆蓋率。 泛化操作主要是兩個動作:將規則中的常量替換為邏輯變量,刪除規則體中的某個文字。
例子:
更好(1,10)<—根蒂更蜷(1,10)∩聲音更沉(1,10)∩臍部更凹(1,10)∩觸感更硬(1,10) 更好(1,15)<—根蒂更蜷(1, 15)∩臍部更凹(1, 15)∩觸感更硬(1, 15)
這兩條是事實,說明西瓜1比西瓜10、15的特征比較,是特殊的關系數據樣例,不具有泛化能力。需要將這樣的特殊規則轉變為更一般的規則,采用的最基礎技術就是最小一般泛化(Least General Generalization,LGG)。
給定一階公式r1和r2,LGG先找出設計相同謂詞的文字,然后對文字中每個位置的常量逐一進行考察,若常量在兩個文字中相同則保持不變,記LGG(t,t)=t;否則將它們替換為同一個新變量,並將該替換應用關於公式的所有其他位置:假定這兩個不同的常量分別為s、t,新變量為V,則記為LGG(s,t)=V,並在以后所有出現的LGG(s,t)的位置用V來代替。例如上面兩條規則 ”更好(1,10)” 和 “更好(1,15)”,由於文字常量“10” != “15”,因此將他們都替換為Y,並在r1,r2,中將其余位置上成對出現的“10”和“15”都替換為Y,得到
更好(1,Y)<—根蒂更蜷(1,Y)∧聲音更沉(1,10)∧臍部更凹(1,Y)∧觸感更硬(1,Y) 更好(1,Y)<—根蒂更蜷(1, Y)∧臍部更凹(1, Y)∧觸感更硬(1, Y)
然后,LGG忽略r1和r2中不含共同謂詞的文字。顯然上面這個例子中,聲音更沉謂詞就要忽略了。最終兩條規則經過LGG的兩個步驟,常量換變量和保留交集謂詞,就變成:
更好(1,Y)<—根蒂更蜷(1, Y)∧臍部更凹(1, Y)∧觸感更硬(1, Y)
這條規則就是可以判斷西瓜1是否比其他瓜更好。為提高泛化能力,結合西瓜2的初始規則:
更好(2,10)<—顏色更深(2,10)∧根蒂更蜷(2,10)∧敲聲更沉(2,10)∧ 臍部更凹(2,10)∧ 觸感更硬(2,10)
對這兩個規則進行LGG,還是常量換變量和保留交集謂詞,最后就變成:
更好(X,Y)<—根蒂更蜷(X, Y)∧臍部更凹(X, Y)∧觸感更硬(X, Y)
這條規則就可以用來比較任何兩個西瓜的優劣了。
如果在規則中引入"非"符號,LGG還能進行更復雜的泛化操作。上面還假定“更好(X, Y)”初始規則僅包含變量同為(X,Y)的關系,而背景知識應該包含更多的關系,因此ILP系統常采用不用的初始規則選擇方法。最常用的是RLGG(relative leastgeneral generalization,RLGG),在計算LGG時考慮所有的背景知識,將樣例e的初始規則定義為e<—K,其中K是背景知識中所有原子的合取。
容易證明,LGG能特化為r1和r2的所有一階公式中最特殊的一個:不存在既能特化為r1和r2,也能泛化為它們的LGG的一階公式r*。在歸納邏輯程序設計中,獲得LGG之后,可將其看作單條規則加入規則集,並可采用對規則集進行后剪枝來進一步優化。
2)逆歸結
在邏輯學中,演繹(deduction)與歸納(induction)是人類認識世界的兩種基本方式。演繹是從一般性規律出發來探討具體事物,而歸納則是從個別事物出發概括出一般性規律。一般數學定理證明是演繹實踐的代表,而機器學習顯然是屬於歸納的范疇。1965年邏輯學家J.A.Robinson提出,一階謂詞演算中的演繹推理能用一條十分簡潔的規則描述,這就是數理邏輯中著名的歸結原理(resolution principle);二十年后,計算機科學家S.Muggleton和W.Butine針對歸納推理提出了"逆歸結"(inverse resolution),這對歸納邏輯程序設計的發展起到了重要作用。
基於歸結原理,可將復雜的邏輯規則與背景知識聯系起來化繁為簡,從一般到特殊;基於逆歸結,可依托背景知識發明新概念和關系,從特殊到一般。以命題演算為例,來說明歸結和逆歸結。
假設兩個邏輯表達式C1和C2成立,其分別包含了互補項L1與L2;不是一般性,令L=L1=﹁L2,C1=A∨L,C2=B∨﹁L。
歸結原理是通過演繹消去L而得到歸結項C=A∨B。逆歸結的過程相反,是研究在已知C和某個Ci的情況下如何得到Cj(i≠j):C2=(C-( C1-{L}))∨{﹁L }。
在邏輯推理實踐中如何實現逆歸結呢?有四種完備的逆歸結操作。若以規則形式p←q等價地表達 p∨﹁q,並假定用小寫字母表示邏輯文字、大寫字母表示合取式組成的邏輯子句,則這四類操作是:
這里X/Y表示X蘊含Y,即X推出Y。上述規則中,X的子句或是Y的歸結項,或是Y的某個子句的等價項;而Y中出現的新邏輯文字則可看作通過歸納學到的新命題。
歸結、逆歸結都能容易地擴展為一階邏輯形式,與命題邏輯的主要不同之處在於,一階邏輯的歸結、逆歸結通常需進行合一置換操作。
“置換”(substitution)是用某些項來替換邏輯表達式中的變量。
如用⊙={1/X,2/Y}置換C=色澤更深(X,Y)∧敲聲更沉(X,Y)可得到C*=C⊙=色澤更深(1,2) ∧敲聲更沉(1,2),其中{X,Y}稱為⊙的作用域(domain)。與代數中的置換類似,一階邏輯中也有復合置換和逆置換。
“合一”(unification)是用一種變量置換令兩個或多個邏輯表達式相等。
如對A=色澤更深(1,X)和B=色澤更深(Y,2),可用⊙={2/X,1/Y}使A⊙=B⊙=色澤更深(1,2),此時稱A和B是可合一的(unifiable),稱⊙為A和B的合一化子(unifer)。若δ是一組一階邏輯表達式W的合一化子,且對W的任意合一化子Θ均存在相應的置換λ使Θ=δoλ,則稱δ為W的最一般合一置換或最一般合一化子(most general unifier,記為MGU),這是歸納邏輯程序中最重要的概念之一。如色澤更深(1,Y)和色澤更深(X,Y)能被Θ1={1/X},Θ2={1/X,2/Y},Θ3={1/Z,Z/X}合一,但僅有Θ1是它們的MGU。
一階邏輯進行歸結時,需利用合一操作來搜索互補項L1與L2。對兩個一階邏輯表達式C1=A∨L1和C2=B∨L2,若存在合一化子Θ使得L1Θ=﹁L2Θ,則可對其進行歸結:
C=( C1-{ L1})Θ∨( C2-{L2})Θ。
類似地,可利用合一化子將逆歸結項擴展到一階邏輯的逆歸結。定義C1=C/ C2和C2=C/C1為歸結商(resolution quotient),於是,逆歸結的目標就是在已知C和C1時求出歸結商C2。對某個L1∈C1,假設ϕ1是一個置換,可使( C1-{ L1}) ϕ1蘊含C,即推出C。這里ϕ1的作用域是C1中所有變量,記vars(C1),其作用是使C1-{L1}與C中的對應文字能合一。令ϕ2為作用域是vars(L1)-vars(C1-{L1})的置換,L1為歸結商C2中將被消去的文字,Θ2是以vars(L2)為作用域的置換,ϕ1和ϕ2共同作用域L1,使得﹁L1 ϕ1o ϕ2= L2Θ2,於是ϕ1o ϕ2oΘ2為﹁L1與L2的MGU。將前兩步的復合置換ϕ1o ϕ2記為Θ1,用Θ2-1表示Θ2的逆置換,則有(﹁L1Θ1) Θ2-1=L2,可得一階逆歸結:
C2=(C-( C1-{ L1})Θ1∨{﹁L1Θ1})Θ2-1。
在一階情形下L1、L2、Θ1和Θ2的選擇通常都不唯一,需通過其他判斷標准來取舍,如覆蓋率、准確率、信息熵等。
好了說了這么多,其實看個例子就知道它的原理了:
其中 q(1, S) <—紋理更清(1,S),q(1, T) <—敲聲更沉(1,T)
等於是結合了兩個規則,讓q指代兩個意思,紋理和敲聲。
逆歸結的一大特點就是能自動發明新謂詞,這些新謂詞可能對應於樣例屬性和背景知識中不存在的新知識,對知識發現和精化有重要意義。但自動發明的新謂詞究竟對應於什么語義,要在任務領域中進一步理解。在現實任務中,ILP系統通常先自底向上生成一組規則,然后再結合最小一般泛化與逆歸結進一步學習。