本篇博文提供了關於GP過程的總結型概覽與討論,旨在幫助初學者建立一個對GP的基礎印象。主要參考文獻 A Field Guide to Genetic Programming,后文中簡寫為"Field Guide1"。
文章轉載自 博文
背景介紹
“物競天擇,優勝劣汰”, 達爾文提出了著名的生物進化理論,即所有的動植物都是由較早期、較原始的形式演變而來的。而遺傳編程(遺傳規划)則在數學和計算機科學領域應用了這一演化過程:從基數較為龐大的原始、粗糙的程序種群中通過評估適應性選擇父系、進行遺傳操作生成新一代種群,再判斷終止條件決定是否再次迭代、生成下一代種群。類比如下:
對照上面的流程圖,我們可以來簡單理清GP系統做了什么、想要做什么。
- 初始化:在給定初始條件(包括terminal sets, function sets和參數)后生成隨機種群
- 通過(多種方法)比較,評估適應性(fitness evaluation)
- 依據fitness進行概率性選擇——“probabilistically selected based on fitness”
- 被選擇的程序作為父系,通過交叉(Crossover) ,變異(Mutation), 復制(Reproduction)等遺傳算子(genetic operators)生成下一代(next generation)
- 判斷是否符合終止標准(Termination Criterion),沒符合的話繼續迭代
程序表示
遺傳編程,Genetic Programming (GP), 屬於進化算法(Evolutionary Algorithms)的一種。GP繼承了遺傳算法(Genetic Algorithms)的基本思想, 即從父輩中擇優繁育子輩;不同於遺傳算法(GA)的傳統編碼(固定長度基因)模式,GP的個體是計算機程序,具備多樣的表現形式。最常見的是基於樹狀(Tree-based)的遺傳編程,可用樹形結構來清晰地表達。GP在發展過程中自然也拓展了多種種類與表現形式,如線性(Linear GP),基於圖的遺傳編程(Cartesian GP)等。
"Field Guide"一書提到在GP中,程序多用以syntax tree(如上)的方式來表現。關於syntax tree的結構定義如下:
- “樹葉”部分被稱為 終止符(Terminals) , 是程序中的變量、常量和無參函數等。
- 樹形內部節點被稱為函數(Functions), 有時也被稱為primitives,涵蓋程序中的函數與操作。
- GP系統的Primitive set為允許、可行的Functions和Terminals的集合。
在上面的max(x+x, x+3y)樹狀表示圖中,終止符為x,y,3,函數為,+,,max。則他們分別的集合為:函數集(function set) F = {+, *, max},終止集(terminal set) T = {x, y, 3}
注意:“函數”未必一定包含在函數集(function set)中,無參函數可能在終止集(terminal set)中
在一些GP中程序可能由多個部分組成,如下圖,用一組由特殊根節點(root)連接結合的樹形分支(sub-trees branches)來表示。
初始化 (Initialization)
在上文流程圖部分,已提到GP的初始種群(initial population)一般是給定函數集,終止集和參數隨機生成的。參數包括種群數量(population size),決策樹深度(depth)等。拋開參數、限制、種類不談,我們可以將隨機生成個體的事件視作從函數集和終止集隨機取得元素,創建節點(根節點root或子節點)並為其指定連接的隨機子節點的隨機過程。
Depth定義
但如果拋開限制,樹形結構種群會變得過於冗長笨拙、雜亂不堪,所以我們引入一個重要概念:深度。Field Guide 給出如下定義:
還是以上文中的 max(x+x, x+3*y) 樹形表示為例:根節點 函數max的深度(depth)為0,觀察右側的子節點 函數 * , 這個子節點的深度為2。從max到最底層“樹葉” 3 和 y 走過了3條edges,故整個樹的深度為3。
通過指定樹的深度,我們可以控制樹的大小以及復雜性、種群系統的復雜程度。注:並不是depth越大越好。depth越大,整體系統就越復雜、越難以理解,有可能產生過擬合。
回到初始化過程中來,隨機生成個體的兩種最早期、最簡單的方法分別為grow method 和 full method。在兩種方法中,初始個體深度都不能超過(用戶)所指定的深度。
Grow方法
grow方法從函數集中隨機選擇函數作為根節點,從整個primitive set(函數集+終止集) 中隨機選擇作為子節點,直到達到限制的深度(或因可連接節點全部隨機選擇到terminals或無參函數而自動停止),達到限制的深度時只能從終止集(terminal set)中隨機取用終止符作為leaves。
設函數集F={+, -, *, /},終止集T={x, y, 0, 1, 2, 3},給定深度depth=2,t=time,使用grow方法隨機生成一個個體(例),如下圖:
與full方法相比,grow生成的個體有着更為多樣化的大小和形狀
Full方法
full方法從函數集中隨機取出函數作為根節點,從函數集中隨機取出函數作為子節點,直到達到深度限制,達到指定深度時只能從終止集中隨機取用終止符作為leaves。
仍設定函數集F={+, -, *, /},終止集T={x, y, 0, 1, 2, 3},給定深度depth=2,t=time,使用full方法隨機生成一個個體(例),如下圖:
- full方法生成的初始個體中,所有的終止符都處於同一深度。
- 初始個體的節點數量不一定相同(函數集當中的函數參數數量可能不同,故連接到下一層的子節點數量可能有所不同)
Ramped half-and-half方法
由於grow和full方法都有着形狀和大小上的局限性(初始個體深度需等於所指定的深度),1992年在Stanford任教的Koza教授提出了一種新的組合方法 Ramped half-and-half2。這種方法通過指定一個深度的范圍(而不是單一深度限制),讓一半種群總數量的個體實行grow方法生成、另一半則實行full方法生成。這樣的方法移除了單一深度的限制,並且有着full和grow的混合使用,在樹的形狀和大小方面增強了多樣性(而且依舊簡單容易實現)。
注意事項:
以上的三種初始化方法相對都很原始,仍有較多的局限性,難以控制如形狀和大小的統計分布。Field Guide 中給出了grow方法對函數集基數和終止集基數敏感、易受到影響而改變形狀的例子:
適應度(Fitness)與選擇(Selection)
Fitness & Fitness Function
適應度(fitness):衡量個體優劣的一個數值,是評價個體解決問題質量的標准。類比自然界物種,對環境適應度高的生物種群將優良基因遺傳下來,適應度差的被自然淘汰而滅絕。
適應度函數(fitness function): 計算種群中個體的適應度的函數。
基於不同的問題,適應度可以用多樣、不同的方式來衡量。如實際輸出與期望輸出之間的差值,系統演化到目標程度所花費的資源等等。
適應度評估過程所需時間占了一大部分GP系統運行所需時間,故fitness function的設計一般不建議過於復雜。本篇主講概念,來對其產生一個初步印象。針對一個實際問題的適應度函數的構成和評估過程在之后幾篇中會進行。
選擇 Selection
選擇,指的是基於適應度(fitness)選擇個體的過程,被選擇的個體在之后會作為父系通過遺傳算子繁育下一代程序個體。常用選擇方法有兩種:
錦標賽選擇法 (Tournament Selection):
tournament selection從群體中隨機取一定數量的個體,比較它們的適應度,適應度最高的被選為parent (作為父系)進行下一個步驟的遺傳操作 (genetic operations)。由於每次進行選擇時都是隨機取一定數量的個體 (而不是整體) 進行比較,即使是平均質量、fitness在整個群體中來看並不突出的個體也有機會被選中,故此實現了多樣性。
輪盤賭選擇法 (Roulette Wheel Selection):
個體被選中的概率與其適應度成正比。設群體中存在個體1,個體2 … 到個體N(群體基數為N),\(f_i\)表示個體i的適應度,則輪盤賭法選中個體i作為parent的概率為:
圖示:設群體中共有五個個體,序號1~5的個體適應度分別為1.0,2.0,3.0,4.0,5.0,則隨機選中個體5的概率為 5.0/(1.0+2.0+3.0+4.0+5.0) = 33.33%
遺傳算子Genetic Operators
經過一輪選擇得到適應性較好的父體后,遺傳算子對父體(parent)進行遺傳操作,生成子代(child)。遺傳算子包括以下三種:
交叉 Crossover
兩個父體基因的混合/交換。
常用的一種subtree crossover過程:在每一個父體中隨機選擇一個雜交點(crossover point),復制其中一個父體的樹為Acopy,復制第二個父體中以雜交點為根節點的子樹(subtree) 為Bsubtree_copy,將Acopy雜交點下的子樹替換為Bsubtree_copy,生成子體。圖示如下:
subtree crossover由兩個父體隨機生成了一個子體。其他多種交叉/雜交方法中,也存在由兩個父體生成兩個子體的種類,如one-point crossover。
變異 Mutation
一個父體的隨即部分改變(變異)。
常用的一種subtree mutation:在一個父體中隨機選擇一個突變點(mutation point),隨機生成一個子樹,將父體中以突變點為根節點的子樹替換為這個隨機生成的子樹。
復制 Reproduction (Copy)
個體被直接復制到下一代個體中。
復制的 實行率 = (100% - crossover rate - mutation rate)
備注:選擇哪種遺傳算子對父體進行操作是完全隨機的。一般來說,交叉的實行幾率約90%或更高,變異的實行幾率約1%左右。
參考資料 (reference)
- Poli, Riccardo, et al. A Field Guide to Genetic Programming. Lulu Press, 2008.
- Genetic Programming, Wikipedia, https://en.wikipedia.org/wiki/Genetic_programming
- 人工智能(4)遺傳規划,簡書, https://www.jianshu.com/p/cf33f7158295
- Amorim, Elisa P. Dos Santos, et al. “Comparison between Genetic Algorithms and Differential Evolution for Solving the History Matching Problem.” Computational Science and Its Applications – ICCSA 2012 Lecture Notes in Computer Science, 2012, pp. 635–648., doi:10.1007/978-3-642-31125-3_48.
- https://deap.readthedocs.io/en/master/tutorials/advanced/gp.html