归纳逻辑程序设计

归纳逻辑程序设计(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系统通常先自底向上生成一组规则,然后再结合最小一般泛化与逆归结进一步学习。

原文地址:https://www.cnblogs.com/hozhangel/p/7866919.html