歸納邏輯程式設計

2021-08-23 14:43:46 字數 4154 閱讀 6474

歸納邏輯程式設計(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,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)

然後,lgg忽略r1和r2中不含共同謂詞的文字。顯然上面這個例子中,聲音更沉謂詞就要忽略了。最終兩條規則經過lgg的兩個步驟,常量換變數和保留交集謂詞,就變成:

更好(1,y)
這條規則就是可以判斷西瓜1是否比其他瓜更好。為提高泛化能力,結合西瓜2的初始規則:

更好(2,10)
對這兩個規則進行lgg,還是常量換變數和保留交集謂詞,最後就變成:

更好(x,y)
這條規則就可以用來比較任何兩個西瓜的優劣了。

如果在規則中引入"非"符號,lgg還能進行更複雜的泛化操作。上面還假定「更好(x, y)」初始規則僅包含變數同為(x,y)的關係,而背景知識應該包含更多的關係,因此ilp系統常採用不用的初始規則選擇方法。最常用的是rlgg(relative leastgeneral generalization,rlgg),在計算lgg時考慮所有的背景知識,將樣例e的初始規則定義為e

容易證明,lgg能特化為r1和r2的所有一階公式中最特殊的乙個:不存在既能特化為r1和r2,也能泛化為它們的lgg的一階公式r*。在歸納邏輯程式設計中,獲得lgg之後,可將其看作單條規則加入規則集,並可採用對規則集進行後剪枝來進一步優化。

2)逆歸結

在邏輯學中,演繹(deduction)與歸納(induction)是人類認識世界的兩種基本方式。演繹是從一般性規律出發來**具體事物,而歸納則是從個別事物出發概括出一般性規律。一般數學定理證明是演繹實踐的代表,而機器學習顯然是屬於歸納的範疇。2023年邏輯學家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-))∨。

在邏輯推理實踐中如何實現逆歸結呢?有四種完備的逆歸結操作。若以規則形式p←q等價地表達 p∨﹁q,並假定用小寫字母表示邏輯文字、大寫字母表示合取式組成的邏輯子句,則這四類操作是:

這裡x/y表示x蘊含y,即x推出y。上述規則中,x的子句或是y的歸結項,或是y的某個子句的等價項;而y中出現的新邏輯文字則可看作通過歸納學到的新命題。

歸結、逆歸結都能容易地擴充套件為一階邏輯形式,與命題邏輯的主要不同之處在於,一階邏輯的歸結、逆歸結通常需進行合一置換操作。

「置換」(substitution)是用某些項來替換邏輯表示式中的變數。

如用⊙=置換c=色澤更深(x,y)∧敲聲更沉(x,y)可得到c*=c⊙=色澤更深(1,2) ∧敲聲更沉(1,2),其中稱為⊙的作用域(domain)。與代數中的置換類似,一階邏輯中也有復合置換和逆置換。

「合一」(unification)是用一種變數置換令兩個或多個邏輯表示式相等。

如對a=色澤更深(1,x)和b=色澤更深(y,2),可用⊙=使a⊙=b⊙=色澤更深(1,2),此時稱a和b是可合一的(unifiable),稱⊙為a和b的合一化子(unifer)。若δ是一組一階邏輯表示式w的合一化子,且對w的任意合一化子θ均存在相應的置換λ使θ=δoλ,則稱δ為w的最一般合一置換或最一般合一化子(most general unifier,記為mgu),這是歸納邏輯程式中最重要的概念之一。如色澤更深(1,y)和色澤更深(x,y)能被θ1=,θ2=,θ3=合一,但僅有θ1是它們的mgu。

一階邏輯進行歸結時,需利用合一操作來搜尋互補項l1與l2。對兩個一階邏輯表示式c1=a∨l1和c2=b∨l2,若存在合一化子θ使得l1θ=﹁l2θ,則可對其進行歸結:

c=( c1-)θ∨( c2-)θ。

類似地,可利用合一化子將逆歸結項擴充套件到一階邏輯的逆歸結。定義c1=c/ c2和c2=c/c1為歸結商(resolution quotient),於是,逆歸結的目標就是在已知c和c1時求出歸結商c2。對某個l1∈c1,假設ϕ1是乙個置換,可使( c1-) ϕ1蘊含c,即推出c。這裡ϕ1的作用域是c1中所有變數,記vars(c1),其作用是使c1-與c中的對應文字能合一。令ϕ2為作用域是vars(l1)-vars(c1-)的置換,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-)θ1∨)θ2-1。

在一階情形下l1、l2、θ1和θ2的選擇通常都不唯一,需通過其他判斷標準來取捨,如覆蓋率、準確率、資訊熵等。

好了說了這麼多,其實看個例子就知道它的原理了:

其中q(1, s)

等於是結合了兩個規則,讓q指代兩個意思,紋理和敲聲。

逆歸結的一大特點就是能自動發明新謂詞,這些新謂詞可能對應於樣例屬性和背景知識中不存在的新知識,對知識發現和精化有重要意義。但自動發明的新謂詞究竟對應於什麼語義,要在任務領域中進一步理解。在現實任務中,ilp系統通常先自底向上生成一組規則,然後再結合最小一般泛化與逆歸結進一步學習。

《c程式設計》的演算法歸納

文章由演算法原始碼吧 www.sfcode.cn 收集 遞迴法轉換整數為字元 void convert int n 判斷素數 int isprime int n 求閏年 if year 4 0 year 100 0 year 400 0 printf d is a leap year year el...

《c程式設計》的演算法歸納

文章由演算法原始碼吧 www.sfcode.cn 收集 遞迴法轉換整數為字元 void convert int n 判斷素數 int isprime int n 求閏年 if year 4 0 year 100 0 year 400 0 printf d is a leap year year el...

非形式邏輯(03)歸納推理

本系列文章主要講解 形式邏輯,系列文章總綱鏈結為 非形式邏輯總綱 本章節思維導圖如下所示 思維導圖 迭代了以前的章節 1 歸納推理基礎 1 歸納推理的定義 歸納推理是以個別或特殊性知識為前提,推出一般性知識的推理。它的結論所斷定的知識範圍超出了前提所斷定的知識範圍,因此,歸納推理的前提與結論之間的聯...