我的雲端生活網 - Life+

Showing posts with label expert system. Show all posts
Showing posts with label expert system. Show all posts

Monday, April 6, 2009

規則式系統的系統描述

本篇來講一些規則系統(production system, rule-based sytem, or expert sytem)的系統描述(formulation)。規則系統是由工作空間(包含事實)、知識庫(包含規則)、以及推論引擎(包含推論及控制流程)等三樣東西構成。一般大學教科書中,很少明確說明規則系統的設計。而相關論文則都使用 Lisp 語言介紹系統架構,較近年代的程式人員根本看不懂。

1. 程序代數

所以,用一些形式語言說明規則系統的架構。推論引擎包含三個分開的程序,所以我們用到基本程序代數(Pi Calculus):令 p, q 是二個程序,二個程序的結構可能是下列其中一種樣子。

p, q ::=   a(c) . p                           (輸入)
           |   a! c . p                            (輸出)
           |     P  |  q                            (平行處理)
           |   if x = y then p else q   (條件控制)
           |   rec z . p                          (遞迴)
           |   stop                                (終止)

上述項目的意義是:
  1. a(c) . p 是程序 p 要從 a 通訊管道取得一些資料 c ;
  2. a! c . p 是程序 p 要對 a 通訊管道送出一些資料 p ;
  3. p | q 是二個程序 p, q 平行地執行;
  4. if x = y then p else q 是先比較二項資料 x 和 y ,如果 x = y 就執行程序 p ,否則執行程序 q ;
  5. rec z . p 是將程序 p 定義為一個遞迴程序,以 z 標示。在 p 中存在 z 符號,表示遞迴呼叫;
  6. stop 是一個終止程序。
我們說, P <= a(b) . p 是定義一個程序 P 的內容是, p 知道一 通訊管道 a 並 管道 a 取出資料
b 。為了方便,用 P(a) 表示此式,即程序 P 一開始就知道通訊管道 a ,並可以隨意使用。

2. 基本詞彙

另外,我們需要一些基本符號,列舉如下:

單元詞彙:要表示一個資料單位或一項物件,用小寫字母 a, b, ..., z 表示任何一個單元。

集合詞彙:用大寫字母 A, B, ..., Z 表示任何一個集合。每一個集合中包含了許多單元。所以,x < X 表示一個單元詞彙 x 屬於另一個集合 X 。

邏輯式敘述:用一些單元詞彙和一些邏輯運算符號 & , | , ~ ,  ->  等等,組合成另一些字串,這些字串稱為邏輯式、或稱為敘述:例如,有單元詞彙 x, y ,則 x & y 是一則敘述、 ~x 是一則敘述、並 (x & y -> x) | (x & y -> y) 也是一則敘述。在本篇文章,我們要用到許多  ->  運算符號。

隱含( -> ):是一種邏輯運算符號,用來表示符號的左項和右項之間有因果關係:例如,對單元詞彙 x, y 來說, x -> y 是一則敘述,其意義是

                  x           y                  x -> y
               true      true                true
               true      false               false
               false     true                true
               fase      false                true

只有當 x 有效但 y 無效時, x -> y 不能成立。這稱為「 x 隱含 y 」、「 x 代表 y 」。

例外詞彙:任何其他用途的詞彙,都用粗體大寫字母 A, B, ..., Z 表示:例如,用 M 表示一則程序。

Lambda函數:是一種匿名函數的表示法,以格式為「 入 a b c ...  .  p(a, b, c, ...) 」的字串表示一則函數。其中,「入」是希臘文字母,唸 lambda ;「入」之後是一些參數、之後是一點、之後是函數內容:例如, 入x y . x + y 是一則匿名函數,接受二項參數而計算總和。

3. 定義

事實:用一個單元詞彙表達一項事實:例如,用 x 表達「今天下雨」。

規則:用一則格式為「 a & b & ... -> a & b & ... 」的邏輯式,表示一條規則:例如 a & b -> c & d 。其中, ->  符號左邊稱為左手側,常用英文 LHS 表示;右邊稱為右手側,常用英文 RHS 表示。左手側就是規則條件,而右手側就是規則的結論。

規則系統:是一組結構 <F, R, M, C, A ,其中組成單元有:
  1. F :一些事實的集合。
  2. R :一些規則的集合。
  3. M :規則比對程序,負責將一些事實和一些規則彼此比對,然後選出符合比對的規則,當做結果。
  4. C :協調程序,負責將 M 的結果做衝突協議(Conflict Resolution)。衝突協議是在一些規則中,只挑選一些必須啟動的規則,當做結果;並排除彼此衝突或互相重覆的規則:例如,規則 A & B -> C 和規則 A -> C 重覆,因為前者的規則條件是後者的子集合。 Rete 演算法規定,對這二條規則,要選擇 A & B -> C ,因為規則條件比較嚴格。
  5. A :行動程序,負責將 C 的結果── 一些確定要啟動的規則 ──確實執行。 A 要將 C 結果的右手側取出並執行。
Rete 結構Rete 演算法是討論一些規則的集合應該如何組織、並組織一種有效的結構,使事實和規則彼此比對變的比較有效。令有一些規則為 R = { A & B -> C ,  B & C -> D } ,根據最初的 Rete 演算法論文, R 有一組對應的 rete 結構,令為 R(R) 。 R(R) 包含一些流程控制,定義為

        入 f  .   R(R)   ::=
                    入 f  .  if type(f) = A then assert(C(_^B)) ;
                               if type(f) = B then assert(C(A^_)); assert(D(_^C)) ;
                               if type(f) = C then assert(D(B^_)) ;
                               if assert(C(_^B)) and assert(C(A^_)) then match(A & B -> C) ;
                               if assert(D(_^C)) and assert(C(B^_)) then match(B & C -> D)

R(R) 中由三種節點構成,包括 type(f) = A 檢查輸入事實的 type 屬性、 assert(C(A^B)) 表示結果 C 是由 A & B 決定、以及 match(r) 指明條件 r 已經符合比對。而 C(_^B) 表示 C 的一則決定項已經接受、並等待另一則決定項 B 。

4. 推論引擎

推論引擎包含 M, C, A 三項程序,依序循環使用。我們用程序代數和上述符號標記法定義三項程序。

取比對程序 M

    M(a, b) <= rec z  .  a(f1, (f2, f*)) . ((入 f . R(R))  f1  |  a! f2, f*  .  z )

其中 (f1, (f2, f*)) = F = (f1, f2, ..., fn) ,並且 (入 f . R(R))  f1 是一則匿名函數代入參數而生效,計算方式是 R(R)[f1/f] 、即把函數主體 R(R) 中存在的 f 替換為 f1 。在 R(R) 中的 match 定義為

    match(b) <= b! r  .  stop

又取協調程序 C

    C(b, c) <= rec z . b(r1, (r2, r*))  .  ( if r1 = empty then stop
                                                                 else
                                                                     if forall r < R . r1 >= r then fire(r1)
                                                               | b! r2, r*  .  z )

其中, r1 > r 是一條規則對另一條規則的大於關係,定義為 LHS(r1) < LHS(r) 則 r1 > r ,並且 fire(LHS -> RHS) <= c! RHS  .  stop 。

又取行動程序 A

    A(c, d) <= rec z . c(rhs1, (rhs2, rhs*))  .  d! rhs1 . c! rhs2, rhs* .  z

於是,推論引擎取為

INF(a) <= rec z . a(F, R) . (M(a, b) | C(b, c) | A(c, d) | d(F') . a! (F+F'), R . z)

嗯?有點錯誤,管它的,只是個思考過程。

Tuesday, January 20, 2009

規則系統的發展

為了對規則系統陌生的人,必須有這項簡介。

規則系統, rule-based system ,以前稱為 production system ,是因為系統的構成有許多的 production rules 。後來稱為專家系統,特別叫做規則式專家系統。有名的案例是 MYCIN ,處理心理諮商及診斷。規則系統是運用規則表達知識並解決問題的系統。

左圖為專家系統的內外構成。外部結構基本有規則庫、推論引擎及工作空間,依序比照為人腦的長程記憶區、推論邏輯、以及短程記憶區。推論引擎內的運作方法大致是接受若干輸入事實,就將事實與規則庫中每項規則比對,其中,有些規則會符合事實、而有些不會符合。這些符合的規則構成 conflict set ,爭議集合。如果都沒有符合的規則, conflict set 是空的,沒有任何規則可以選擇,表示推論過程可以結束了。但如果至少有一條規則符合比對,就要從 conflict set 中選取若干應該觸發、啟動的規則,這個動作稱為 conflict resolution ,衝突決議。 Conflict resolution 選擇了一些規則,執行規則中所規定的動作,這個步驟稱為 act 。啟動一些規則,使推論的過程與狀態有一些改變,這些狀態儲存在 working memory 中。然後,回到 Pattern Match 步驟再進行下一次循環。以上,推論循環工作的過程,以三大步驟稱呼稱為 match-resolution-act ,比對、決議、行動。每一循環的 act 步驟可能送出一些解答。推論循環工作的終點,是在 match 之後、 resolution 之前,發現 conflict set 沒有任何規則存在,就結束推論流程。

規則系統的研究領域,站在中流砥柱的一位是 Charles L. Forgy ,他在 1979 年卡耐基美隆大學的電腦科學系博士學位論文中,提出有效處理 Pattern Match 與 conflict resolution 的幾項方法。他的指導老師是 Allen Newell ,在 1956 年與同事發表第一支人工智慧程式,稱為「邏輯解題者」。他們師徒的另外一位同事, Anoop Gupta ,他在 1989 年取得博士學位,則處理了在 message-passing computer 用平行架構實作規則系統。

Forgy 在 1974 到 1979 年的研究,發表了第一代 Rete 演算法,做有效處理 Pattern Match 。 Rete 演算法在這個領域從當時紅到現在。 1983 年,他開創稱為 Production System Technology 的公司,屬於研究及顧問性質的機構,同時也賣了許多 OPS 的產品 ( OPS2 、 OPS5 等等)。這時候 Forgy 也發表了第二代 Rete 演算法,聲稱它不只能夠表達知識,還能夠做資料處理。又後來,他在 RulesPower 公司的時代發表了第三代 Rete 演算法,這個技術在 2005 年被 Fair Issac 公司取得了。據 Rete III 的聲明,有 300% 的效能。 2006 年 11 月,據 JavaRule 部落格訊息指出, Forgy 在參加 Business Rule 論壇的時候發生心臟疾病,希望他身體健康。

目前我們知道的規則系統研究走向, Rete 演算法是公開的資訊, Rete II 與 III 是企業不公開的技術,而且 production system 及專家系統在 70 、 80 年代發展、 90 年代成熟之後,已經走向商業規則領域。所以,今後可以多參考 business rules 方面的資訊,幫助我們的系統開發。

Monday, December 29, 2008

推論引擎

最近在閱讀有關規則推論引擎 (rule-based inference engine) 的書和資料。這方面的研究知識早在九零年代結束之前就成熟了,但在國內技術應用看起來像是冷門技術項目。有人說專家系統是沒落的東西。然而,放眼看過去技術應用趨勢,八零年代時 LISP 的使用也相當熱門,九零年代初期 Prolog 已取得成功應用,而專家系統 (expert system) 的規則推論引擎和框架系統 (frame-based system) 是二項成功產物。資訊領域並不是只有命令式程式 (imperative programming) 計算模型,並不是要會寫 C 或 Java ,或者要會雕刻組合語言,才佔領全局。還有其他的聰明、高產能的選項可挑選!
推論引擎的產生,來自於解決問題的需要 --- 許多問題並不只是寫一則演算法就能解決。有些問題的思考空間太龐大,而且對於那些問題,經常只有一部分的解題規則,這些規則可能來自於專家的知識或經驗。於是生成系統 (Production System) 出現,後來此系統類型稱為專家系統。規則式生成系統的構成,有一組以具體表達的規則所組成的知識庫、知識輸入介面、推論引擎、以及工作空間。系統接受一些事實作為輸入,由推論引擎將輸入事實與知識庫中的解題規則互相比對,藉由邏輯的歸納推理產生解決方案。此系統的好處是,答案是由專家知識所導出,而且導出答案的那些規則可以直接作為解釋。缺點是,系統所容納的知識庫不能太大,若規則太多則耗費計算時間,以及知識規則的建置花費工夫。
推論引擎的效能問題,在於輸入的事實與知識庫的規則比對所消耗的時間。 Markov 演算法提出順序式的比對,帶來直接的毛病是:有多少規則,就要比對多少時間以上。而且,規則的比對經常花費 O(n2) 級的成本,因為推論引擎必須做到衝突決議 (conflict-resolution) 的處理程序,意即經過眾多層次不同且可能有彼此矛盾的規則,綜合評判之後,取得一致的正確結果。為了適應規則推論引擎的特殊計算環境, Rete 演算法提出以網狀資料結構 (rete 是拉丁文,意思是 net ) 處理衝突決議。推論引擎總是進行循環工作,進行步驟有:1. 接受輸入事實並啟動; 2. 比對規則; 3. 衝突決議:若沒有比對到任何規則,則關閉,否則由比對到的規則中挑選一條規則,認定為生效; 4. 將生效的規則啟動,改變工作空間的狀態; 5. 回到步驟 (2) 。
推論引擎雖然不好寫,卻也可以用組合語言或 C 撰寫。 2003 年, Lynwood Wilson 在 Dr. Dobb's 雜誌發表的文章 ”Rule-Based Programming in C” 示範了二項注意事項: 1. 要做衝突決議; 2. 將專家系統劃分為模組使計算時間減少。因為是簡單的示範,他使用 Markov 演算法比對規則。
參考文獻
1. Joseph C. Giarratano & Gary D. Riley. Expert Systems: Principles and Programming. (4 ed.) Course Technology, Thomson Learning, 2005.
2. Charles L. Forgy. Rete: a fast match algorithm. AI Expert, vol. 2, issue 1, 1987.
3. Lynwood Wilson. Rule-Based Programming in C. Dr. Dobb's Portal. Available online: http://www.ddj.com/184405245.

Blog Archive