Abstract 摘要

问题:

传统的遗传程序设计 (Genetic Programming,GP) 通过使用操纵语法表示的搜索算子来搜索函数/程序的空间,而不考虑它们的实际语义/行为。最近,语义感知的搜索算子被证明优于纯句法算子。

我们的方法:

在这项工作中,我们使用一种关于搜索算子和表示的形式几何学观点,将语义方法引入其中的极端结果,并引入一种新的 GP 形式, 几何语义 GP ( GSGP ) - -直接搜索程序底层语义的空间。

我们大概是怎么做的:

该视角为程序语法与语义、搜索算子与适应度景观之间的关系提供了新的见解,并允许针对不同类型的问题对语义搜索算子进行原则性的形式化设计。

我们做的还不错:

我们针对一些经典的GP域推导了GSGP的具体形式,并通过实验证明了它们相对于传统算子的优越性。

Abstract Geometric Semantic Search

在这一部分,我们报告了几何语义算子的非操作定义及其性质。它们在第 3 节中进行了算法刻画。

一个搜索算子 C X : S × S → S CX:S × S \to S CX:S×S→S 是 geometric crossover. 度量 d d d 如果对于任意的父代 p 1 p_1 p1​ 和 p 2 p_2 p2​,它们的任何一个子代 o = C X ( p 1 、 p 2 ) o = CX( p_1、p_2) o=CX(p1​、p2​) 都在父代之间的度量区间内

一个搜索算子 M : S → S M:S \to S M:S→S 是一个 geometric ε-mutation ,度量 d d d 如果对父代 p p p 的任意选择,它的任何一个子代 o = M ( p ) o = M (p) o=M(p) 都在以父代为中心的半径为 ε ε ε 的度量球中。给定一个适应度函数 f : S → R f:S \to \Bbb{R} f:S→R, 几何搜索算子诱导或看到适应度 landscape ( f , S , d ) ( f , S , d) (f,S,d)。许多著名的跨表示重组算子都是几何交叉 [8],如二进制串上所有基于掩码的交叉都是几何交叉 w . r . t。汉明距离。二元弦上的 Point mutation 是 geometric 1-mutation w . r . t .汉明距离. 几何算子也可以通过在其定义中使用基于目标表示(例如,编辑距离)的距离来推导新的空间和表示。如果距离不直接与一个表示联系起来,几何算子是定义良好的,但对它们的算法描述是很难得到的。

遗传规划本质上是一种监督学习方法:给定一组固定的输入-输出对 T = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } T = \{(x_1, y_1), ..., (x_N, y_N)\} T={(x1​,y1​),...,(xN​,yN​)} (例如:训练集 或 fitness cases),函数 h : X → Y h:X \to Y h:X→Y 寻找(演化)属于由所选终端和函数集指定的某个固定个体 H H H ,来插值已知的输入输出对,即 ∀ ( x i , y i ) ∈ T : h ( x i ) = y i \forall(x_i, y_i) \in T:h(x_i) = y_i ∀(xi​,yi​)∈T:h(xi​)=yi​. 适应度函数 F T : H → R F_T:H \to \Bbb{R} FT​:H→R 度量函数 h h h 在训练集 T T T 上的误差,与其他学习方法相比,GP的两个显著特点是:( i )它可以用于学习几乎任何类型的函数;( ii )它是一种黑箱方法,因为它不需要训练集的明确知识,而只需要训练集上的 error 。

令 I = ( x 1 , . . . , x N ) I = ( x_1 , ... , x_N) I=(x1​,...,xN​) 和 O = ( y 1 , . . . , y N ) O = ( y_1 , ... , y_N) O=(y1​,...,yN​) 分别为与训练集 T T T 相关的输入和输出向量。令 O ( h ) O ( h ) O(h) 为函数 h h h 在输入 I I I 下的输出向量,即 O ( h ) = ( h ( x 1 ) , . . , h ( x N ) ) O ( h ) = ( h ( x_1 ),..,h ( x_N ) ) O(h)=(h(x1​),..,h(xN​))。函数 O : H → Y N O:H \to Y^N O:H→YN 可以解释为 genotypephenotype mapping ,因为它将函数 h h h (即基因型)的一个表示映射到其输出向量表示的输入向量 I I I (即表型)上应用函数 h h h 的实际结果。

传统的函数 h h h 在训练集 T T T 上的误差度量可以理解为目标输出向量 O O O 与使用某种合适的度量 D D D 测量的输出向量 O ( h ) O ( h ) O(h) 之间的距离,即 F T ( h ) = D ( O , O ( h ) ) F_T ( h ) = D( O , O ( h)) FT​(h)=D(O,O(h)) (最小化)。例如,当考虑的函数空间 H H H 为布尔函数类时,输入输出空间为 X = { 0 , 1 } n X = \{0, 1\}^n X={0,1}n和 Y = { 0 , 1 } Y = \{0, 1\} Y={0,1},输出向量为大小为 N N N (即 Y N Y^N YN )的二进制向量。作为二进制向量之间的距离来衡量误差的合适度量 D D D 是汉明距离。当考虑返回真实值(例如,回归)的函数时,输出向量为真实向量,合适的度量误差的指标为欧氏距离和曼哈顿距离,每一种距离都会产生不同类型的适应度函数。

我们定义两个函数 h 1 , h 2 ∈ H h_1,h_2 \in H h1​,h2​∈H之间的语义距离 SD 为它们对应的输出向量之间的距离。所有可能输入(即 I = ( x i ) for all   x i ∈ X ) I = (x_i) ~~ \text{for all}~~ x_i \in X) I=(xi​)  for all  xi​∈X) 的输入向量用适应度函数 F T F_T FT​ 定义中使用的度量指标 D D D 度量,即 S D ( h 1 , h 2 ) = D ( O ( h 1 ) , O ( h 2 ) ) SD( h_1 , h_2) = D ( O ( h_1 ),O ( h_2 ) ) SD(h1​,h2​)=D(O(h1​),O(h2​))。语义距离 SD 是由表型度量 D 通过基因型-表型映射 O O O 导出的基因型距离,由于 O O O 一般是非内射的(即不同基因型可能具有相同的表型),因此 SD 仅为伪[准]度量的(即不同的函数可以有距离为零)。这自然就产生了基因型的等价关系:基因型属于同一个语义类 h ‾ \overline{h} h 当且仅当它们的语义距离为零。那么,SD 可以解释为基因型 H ‾ \overline{H} H 的语义类集合上的一个度量。

我们将 semantic geometric operators 定义为给定距离 SD 的(类)函数空间上的几何交叉和变异。例如,布尔函数上的语义几何交叉返回子代布尔函数使得子代的输出向量位于父代( w.r.t. all x i ∈ X x_i \in X xi​∈X) 的输出向量之间的汉明部分。SD 定义在函数类 H ‾ \overline{H} H 的空间上而不是函数类 H H H 的空间上的作用是,几何交叉点只是父类 h 1 ‾ , h 2 ‾ \overline{h_1},\overline{h_2} h1​​,h2​​ 的语义类的函数,而不是父类 h 1 , h 2 h_1,h_2 h1​,h2​ 的语义类(即它们的具体表征)的函数,并且返回的子代可以是属于子代类 h 3 ‾ \overline{h_3} h3​​ (即任何具有指定输出向量/语义的函数)的任意函数 h 3 h_3 h3​。

具有语义几何算子的进化算法所看到的语义适应度景观是由构造 [4] 所示的锥景观,从语义距离的定义来看,解的适应度是其在搜索空间中到最优解的距离。这种观察非常具有一般性,因为它适用于GP (例如,布尔、算术、程序等)的任何应用领域、(例如,布尔域的奇偶性和多工器问题)领域内的任何具体问题以及误差函数的任何度量选择。此外,有一些正式的证据[ 9 ]表明,对于几乎任何度量,具有几何算子的EA都可以非常有效地优化锥景观。

以函数类 H ‾ \overline{H} H 空间上的语义距离 SD 为几何算子w . r . t的 GP 搜索与以输出向量空间上的距离 D 为几何算子的EA搜索在形式上等价。这是因为:( i )函数的语义类与输出向量是一一对应的,因为"具有相同输出向量的函数"是函数语义类的定义性质;( ii )函数上的语义几何算子与输出向量上的几何算子同构,因为 SD 由 D 通过基因型-表型映射(见图( 1 ))导出),对于布尔函数,语义 GP 搜索等价于对维度为 N 的 OneMax 上的二进制串进行 GA 搜索。

Construction of Geometric Semantic Operators

下面的交换图说明了位于顶部的基因型 (例如,trees) 上的语义几何交叉点 G X S D GX_{SD} GXSD​ 与位于底部的基因型-表型映射 O O O 诱导的表型(即输出向量)上的几何交叉点 (GX_{D}) 之间的关系。对于任意的 T 1 , T 2 , T 3 = G X S D ( T 1 、 T 2 ) T1,T2,T3 = GX_{SD}( T1、T2) T1,T2,T3=GXSD​(T1、T2),则 O ( T 3 ) = G X D ( O ( T 1 ) , O ( T 2 ) ) O ( T3 ) = GX_{D} ( O ( T1 ),O ( T2 ) ) O(T3)=GXD​(O(T1),O(T2))。

寻找语义几何交叉的算法表征问题可以表述为:给定一族函数 H H H,找到一个作用于 H H H 中元素的重组算子 G X S D GX_{SD} GXSD​ (未知),该重组算子通过基因型表型映射 O 在输出向量上诱导一个几何交叉 G X D GX_D GXD​ (已知)。例如,对于基于汉明距离的适应度函数为布尔函数的情况,输出向量为二进制串, G X D GX_D GXD​ 为基于掩码的交叉。我们希望得到一个作用在布尔函数上的重组算子,它对应于它们的输出向量上的一个基于掩码的交叉。注意,对于空间 H H H 和距离 D D D 的每个选择都有不同类型的语义几何交叉。因此,对于不同的 GP 域有不同的语义交叉。我们将给出一个公式来推导新领域的特定语义交叉。

定义1 给定两个父函数 T 1 , T 2 : { 0 , 1 } n → { 0 , 1 } T1,T2:\{0, 1\}^n \to \{0, 1\} T1,T2:{0,1}n→{0,1},重组 SGXB 返回子代布尔函数 T 3 = ( T 1 ∧ T R ) ∨ ( T R ‾ ∧ T 2 ) T3 = ( T1 \wedge TR) \vee ( \overline{T R} \wedge T 2) T3=(T1∧TR)∨(TR∧T2),其中 T R TR TR 是随机生成的布尔函数(见图1)。


定理1 SGXB是一种基于汉明距离的布尔函数空间与适应度函数的语义几何交叉,适用于任意训练集和任意布尔问题。

现在考虑实函数域(例如,对于符号回归)。

定义2。给定两个父代函数 T 1 , T 2 : R n → R T1,T2:\Bbb{R}^n \to \Bbb{R} T1,T2:Rn→R,重组 SGXE 和 SGXM 返回实函数 T 3 = ( T 1 ⋅ T R ) + ( ( 1 − T R ) ⋅ T 2 ) T3 = ( T1 · TR) + ( ( 1 - T R) · T2 ) T3=(T1⋅TR)+((1−TR)⋅T2),其中 T R TR TR 是 [ 0 , 1] ( SGXE )中的随机实常数,或者是陪域( SGMX )中的随机实函数。

定理2 SGXE和SGXM分别是基于欧氏距离和曼哈顿距离的适应度函数对任意训练集和任意实际问题的实函数空间的语义几何交叉。

现在我们考虑计算机程序域,它是以符号作为输入( IS )和输出( OS )的函数。下面可以很容易地推广到其他类型的输入和输出。

定义3 给定两个父程序 T 1 , T 2 : I S n → O S T1,T2:IS^n \to OS T1,T2:ISn→OS 在操作系统上,重组后的 SGXP 返回子程序 T 3 = I F C O N D R T H E N T 1 E L S E T 2 T3 = IF CONDR THEN T1 ELSE T2 T3=IFCONDRTHENT1ELSET2,其中 CONDR 为随机程序,其输出被解释为逻辑值。

定理3 SGXP是基于汉明距离的适应度函数的程序空间的语义几何交叉,适用于任何训练集和任何问题。

定义4 语义突变 Boolean:给定父函数 T : { 0 , 1 } n → { 0 , 1 } T:\{0, 1\}^n \to \{0, 1\} T:{0,1}n→{0,1},变异 SGMB 以概率 0.5 返回子布尔函数 T M = T ∨ M TM = T \vee M TM=T∨M,以概率 0.5 返回 T M = T ∨ M ‾ T M = T \vee \overline{M} TM=T∨M,其中 M 为所有输入变量的随机最小项。算术:给定一个母函数 T : R n → R T:\Bbb{R}^n \to \Bbb{R} T:Rn→R,变异步长为 ms 的变异 SGMR 返回实函数 T M = T + m s ( T R 1 − T R 2 ) T M = T + ms ( T R1 - T R2) TM=T+ms(TR1−TR2),其中 T R 1 TR1 TR1 和 T R 2 TR2 TR2 为随机实函数。

定理4 SGMB 和 SGMP 分别是布尔函数和程序的语义1 -几何变异,适应度函数基于汉明距离。SGMR 是基于欧氏距离和曼哈顿距离的适应度函数对实函数进行语义ε -几何变异。其概率分布的均值为母,ε 与步长 ms 成正比。

一般构造方法:通过颠倒上述证明中的公共论点可以得到:( i )对与适应度函数中使用的距离相关的输出向量取几何交叉;( ii )考虑重组算子对输出向量的单个入口的作用;( iii )使用特定函数类的领域特定语言来描述单个条目上的重组行为;( iv )说明是产生子代的方案.需要注意的是,子代不仅是交叉的效果,也是对父代如何交叉的描述。目标域特定语言必须具有足够的表达能力来描述重组。这似乎是大多数GP问题的情况。简化:作为句法后代的语义交叉

Reference

Moraglio A, Krawiec K, Johnson C G. Geometric semantic genetic programming[C]//International Conference on Parallel Problem Solving from Nature. Springer, Berlin, Heidelberg, 2012: 21-31. 383

算法原理

5.1 核心算法

5.1.1 什么是基于几何语义的遗传编程?

基于语义的遗传编程算法是最近遗传编程领域的研究热点,而基于几何语义的遗传编程算法则是考虑了遗传编程算法个体在语义空间的位置信息,从而实现高效地交叉和变异。

比如,假设数据标签的坐标是黑色的圆心点,而当前种群的预测值是红色的点。那么我们希望演化算法可以通过搜索,最终找到一个模型,可以使得其针对训练数据可以产生黑色圆心点的预测值。

但是,强行通过演化算法搜索这样一个模型可能是低效的。因此,GSGP算法通过一些特殊设计的遗传编程算子,尝试通过以更高效的方式逼近预测值

5.1.2 语义交叉(欧氏距离)

假设有两个个体 P 1 , P 2 P_1, P_2 P1​,P2​,画一条线段在语义空间上连接这两个个体。可以发现,这条线段上的所有点都比中较差的那个个体具有更高的适应度值。(距离圆心黑色的点更近)

从直观来理解,比如有两个模型 A, B。如下图所示,按照上面的方式,进行加权平均以后,模型的预测结果可能会更加接近数据标签。

因此,可以设计下面这样一个交叉算子。这个交叉算子使用一个随机产生的权重 k ∈ [ 0 , 1 ] k∈[0,1] k∈[0,1],合并两个个体的预测值。从语义空间上来看,我们就达到了在线段上取一个点的效果,从而保证新生成的个体适应度值不会比两个父代个体中较差的个体更差。

5.1.3 语义交叉(曼哈顿距离)

当然,上面的 k k k 也可以通过一个随机产生的 GP 树 r f r_f rf​ 来确定。特别需要注意的是,这棵 GP 树会在最顶层使用一个 Sigmoid 函数,使其的输出值在 [0,1] 区间内。这种交叉方式被称为基于曼哈顿距离的语义交叉。

之所以这种方式被称为曼哈顿距离的语义交叉,是因为这种方式所能产生的语义空间更为灵活。如下图所示,包裹在立方体空间内的所有点,都有可能通过这种方式交叉得到。在极端情况下,有可能产生的语义树会针对每个数据样本只保留一个语义值,这种情况下的语义交叉结果在图中使用红色点进行了标注。

曼哈顿距离的一个优势是语义向量中的值可以采用不同的权重进行组合。例如下面这个例子,两个数据样本需要通过不同的权重进行加权,这样才能得到最优的预测。而上面的欧氏距离的加权方式没有办法实现这个效果。因此,GSGP 的作者考虑随机生成一个 GP 树,这样的话对于每个数据样本都会有不同的预测,从而可以实现完美加权。

5.1.4 语义变异

而对于语义变异来说,想法则是类似的。我们可以随机产生两个子树 r m , r n r_m, r_n rm​,rn​,这两棵 GP 树也会在最顶层使用一个 Sigmoid 函数,使其的输出值在 [0,1] 区间内。两颗子树相减可以形成一个向量。这个向量可以添加到父代个体 p p p 之上,从而实现语义变异。语义变异算子不能保证其生成的个体一定比父代个体更好,但是可以保证相差不会大于 δ \delta δ。

5.2 基于 DEAP 框架的算法实现

上面一节介绍了 GSGP 的核心思想与基本原理。在掌握了基本原理之后,实现 GSGP 算法其实是非常容易的。下面我们以 DEAP 这个算法框架为例,来看一下其中是如何实现 GSGP 算法的。下面这段代码是 DEAP 中对 GSGP 的实现实现方式,DEAP 中实现的是曼哈顿距离的 GSGP 交叉算子,即我们需要产生一棵新的 GP 树用于语义交叉。首先可以看到,我们会使用在随机个体的顶端插入一个 Logistics Function,用以将随机个体的值框定在 [0,1] 这个区间内。然后我们可以将新生成的个体与原来的父代个体通过乘法的形式进行合并,以及将父代个体之间通过加法进行合并。最后,将合并的个体返回,就实现了基于语义的交叉操作。

from deap import gp
def cxSemantic(ind1, ind2, gen_func=genGrow, pset=None, min=2, max=6):"""Implementation of the Semantic Crossover operator [Geometric semantic genetic programming, Moraglio et al., 2012]offspring1 = random_tree1 * ind1 + (1 - random_tree1) * ind2offspring2 = random_tree1 * ind2 + (1 - random_tree1) * ind1:param ind1: first parent:param ind2: second parent:param gen_func: function responsible for the generation of the random tree that will be used during the mutation:param pset: Primitive Set, which contains terminal and operands to be used during the evolution:param min: min depth of the random tree:param max: max depth of the random tree:return: offspringsThe mutated offspring contains parents>>> import operator>>> def lf(x): return 1 / (1 + math.exp(-x));>>> pset = PrimitiveSet("main", 2)>>> pset.addPrimitive(operator.sub, 2)>>> pset.addTerminal(3)>>> pset.addPrimitive(lf, 1, name="lf")>>> pset.addPrimitive(operator.add, 2)>>> pset.addPrimitive(operator.mul, 2)>>> ind1 = genGrow(pset, 1, 3)>>> ind2 = genGrow(pset, 1, 3)>>> new_ind1, new_ind2 = cxSemantic(ind1, ind2, pset=pset, max=2)>>> ctr = sum([n.name == ind1[i].name for i, n in enumerate(new_ind1)])>>> ctr == len(ind1)True>>> ctr = sum([n.name == ind2[i].name for i, n in enumerate(new_ind2)])>>> ctr == len(ind2)True"""for p in ['lf', 'mul', 'add', 'sub']:assert p in pset.mapping, "A '" + p + "' function is required in order to perform semantic crossover"tr = gen_func(pset, min, max)tr.insert(0, pset.mapping['lf'])new_ind1 = ind1new_ind1.insert(0, pset.mapping["mul"])new_ind1.insert(0, pset.mapping["add"])new_ind1.extend(tr)new_ind1.append(pset.mapping["mul"])new_ind1.append(pset.mapping["sub"])new_ind1.append(Terminal(1.0, False, object))new_ind1.extend(tr)new_ind1.extend(ind2)new_ind2 = ind2new_ind2.insert(0, pset.mapping["mul"])new_ind2.insert(0, pset.mapping["add"])new_ind2.extend(tr)new_ind2.append(pset.mapping["mul"])new_ind2.append(pset.mapping["sub"])new_ind2.append(Terminal(1.0, False, object))new_ind2.extend(tr)new_ind2.extend(ind1)return new_ind1, new_ind2

下面这段代码展示了 DEAP 中实现 GSGP 语义变异算子的过程,其实跟语义交叉差不多。只不过这次是随机产生两个 GP 树,然后将相减的结果加到原来的父代个体上。值得一提的是,这里的两个随机生成的 GP 个体都需要使用一个 Logistics 函数将个体输出的预测值归一化到 [0,1] 这个区间之内,否则我们不能保证变异之后的语义向量与原来个体的语义向量相差不大于 m s ms ms。

def mutSemantic(individual, gen_func=genGrow, pset=None, ms=None, min=2, max=6):"""Implementation of the Semantic Mutation operator. [Geometric semantic genetic programming, Moraglio et al., 2012]mutated_individual = individual + logistic * (random_tree1 - random_tree2):param individual: individual to mutate:param gen_func: function responsible for the generation of the random tree that will be used during the mutation:param pset: Primitive Set, which contains terminal and operands to be used during the evolution:param ms: Mutation Step:param min: min depth of the random tree:param max: max depth of the random tree:return: mutated individualThe mutated contains the original individual>>> import operator>>> def lf(x): return 1 / (1 + math.exp(-x));>>> pset = PrimitiveSet("main", 2)>>> pset.addPrimitive(operator.sub, 2)>>> pset.addTerminal(3)>>> pset.addPrimitive(lf, 1, name="lf")>>> pset.addPrimitive(operator.add, 2)>>> pset.addPrimitive(operator.mul, 2)>>> individual = genGrow(pset, 1, 3)>>> mutated = mutSemantic(individual, pset=pset, max=2)>>> ctr = sum([m.name == individual[i].name for i, m in enumerate(mutated[0])])>>> ctr == len(individual)True"""for p in ['lf', 'mul', 'add', 'sub']:assert p in pset.mapping, "A '" + p + "' function is required in order to perform semantic mutation"tr1 = gen_func(pset, min, max)tr2 = gen_func(pset, min, max)# Wrap mutation with a logistic functiontr1.insert(0, pset.mapping['lf'])tr2.insert(0, pset.mapping['lf'])if ms is None:ms = random.uniform(0, 2)mutation_step = Terminal(ms, False, object)# Create the rootnew_ind = individualnew_ind.insert(0, pset.mapping["add"])# Append the left branchnew_ind.append(pset.mapping["mul"])new_ind.append(mutation_step)new_ind.append(pset.mapping["sub"])# Append the right branchnew_ind.extend(tr1)new_ind.extend(tr2)return new_ind,

5.2.1 测试代码

import operator
from deap import gp
import math
import randomimport operator# 自定义 sigmoid 函数
def lf(x): return 1 / (1 + math.exp(-x));# 初始化函数集合终点集
pset = gp.PrimitiveSet("main", 2)
pset.addPrimitive(operator.sub, 2)
pset.addTerminal(3)
pset.addPrimitive(lf, 1, name="lf")
pset.addPrimitive(operator.add, 2)
pset.addPrimitive(operator.mul, 2)# 通过 genGrow 的方式初始化个体:在函数集和终点集进行随机选择
ind1 = gp.genGrow(pset, 1, 3)
ind2 = gp.genGrow(pset, 1, 3)# GSGP 语义交叉
new_ind1, new_ind2 = gp.cxSemantic(ind1, ind2, pset=pset, max=2)# GSGP 语义变异操作
mutated = gp.mutSemantic(new_ind1, pset=pset, max=2)ctr = sum([n.name == ind1[i].name for i, n in enumerate(new_ind1)])
ctr == len(ind1)ctr = sum([n.name == ind2[i].name for i, n in enumerate(new_ind2)])
ctr == len(ind2)

交叉操作图解

5.2.1 测试代码说明

1. 对于固定的一个随机数如何通过公式交叉两个个体的?

如图中 k 为 [0,1] 的随机数,父代 p 1 p_1 p1​ 与 p 2 p_2 p2​ 为树形结构,语义交叉的方式即 k × p 1 ( 1 ) k × p_1(1) k×p1​(1) 直接对树中的每个节点乘以这个随机数,也就是对树的表达式的最外层乘以一个系数 k,在代码实现上,直接在根节点插入一个随机数 k 即可。

2. 对于由一个树整体组成的随机数,然后结合实现语义交叉如何实现的?

首先 r f r_f rf​ 通过预定的函数集和终点集随机产生,产生完成后,在树的根节点插入 sigmoid 函数,即在表达式的最外层再执行 sigmoid 函数,整棵树最终就变为了 [0,1] 的随机数,然后再与 p 1 , p 2 p_1, p_2 p1​,p2​ 执行相应的乘法操作。

5.3 实验结果

作者在实验环节对比了三种GP算法,即传统GP,Semantic GP(SGP)和仅仅使用语义变异算子的语义爬山算法SSHC。

下图展示了不同算法进行公式拟合的成功率。值得一提的是,GSGP不能保证发现真实的数学公式,因此这里的成功率实际上是预测值的准确率。从实验结果可以看出,GSGP在成功率方面远高于传统的GP算法。而值得注意的是,仅仅使用语义变异算子的语义爬山算法SSHC也具有良好的性能。作者也没有对此做过多说明,其实关于演化计算中的交叉算子是否有价值一直是一个长久的话题。从主流观点来看,交叉算子可以组合有效个体之间的有效模块,从而实现更高效的搜索。不过,在特定场景中是否有用,可能还是要根据具体问题具体分析。

下图展示了GSGP算法在多项式拟合问题上的效果。作者将0.01以内的预测偏差视为成功的预测。从成功率来看,GSGP算法与SSHC算法均可以取得相比传统GP算法更好的效果,从而证明了基于语义的遗传编程算子的有效性。

2012, PPSN,Geometric Semantic Genetic Programming,GSGP相关推荐

  1. 2017,EuroGP,Geometric Semantic Crossover with an Angle-Aware Mating Scheme in GP for SR

    Abstract 最近的研究表明,将语义知识融入遗传编程 (Genetic Programming,GP) 进化过程可以提高其性能.本工作提出了一种角度感知的匹配方案,用于符号回归的 GP 中的几何语 ...

  2. 2022, GECCO,Taylor Genetic Programming for Symbolic Regression

    ABSTRACT 问题: 遗传规划(GP)是求解符号回归(SR)问题的常用方法.与求解 SR 问题依赖于预定义模型和训练数据集的机器学习或深度学习方法相比,GP 更专注于在搜索空间中寻找解.虽然 GP ...

  3. 2014,TEVC,Semantic backpropagation for designing search operators in genetic programming

    Abstract 在遗传规划中,搜索算法(交叉,变异)期望产生最终计算状态的程序(期望输出).为了达到该状态,执行程序需要遍历某些中间计算状态.一个进化搜索过程被期望能够自主发现这样的状态.这对于需要 ...

  4. 【遗传编程/基因规划】Genetic Programming

    文章目录 背景介绍 程序表示 初始化 (Initialization) Depth定义 Grow方法 Full方法 Ramped half-and-half方法 适应度(Fitness)与选择(Sel ...

  5. 无需额外数据,首次实现ImageNet 87.1% 精度,颜水成团队开源VOLO

    机器之心发布 Sea AI Lab (SAIL) 团队 VOLO 是第一个在 ImageNet 上无需额外数据达到 87.1% top-1 准确率的模型,进一步拉近了视觉 Transformer 与最 ...

  6. 2019,GECCO,Linear scaling with and within semantic backpropagation-based genetic programming for SR

    ABSTRACT 语义反向误差传播网络 (SB) 是最近在基于树的遗传编程中促进有效变异的技术.SB 的基本思想是通过使用沿途遇到的函数的倒数将期望的根节点输出传播回指定的节点,从而提供关于指定树节点 ...

  7. 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践...

    1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...

  8. 2015,GECCO,Comparison of Semantic-aware Selection Methods in Genetic Programming

    ABSTRACT 本文研究了遗传编程 (GP) 中几种语义感知选择方法的性能.特别地,我们考虑不依赖于完全 GP 语义(也就是说, 一个程序为 fitness cases 产生的输出元组)),而是依赖 ...

  9. MSSQL 2012 拒绝了对对象 'extended_properties' (数据库 'mssqlsystemresource',架构 'sys')的 SELECT 权限...

    查看数据库的表的时候报如下错误: MSSQL 2012 拒绝了对对象 'extended_properties' (数据库 'mssqlsystemresource',架构 'sys')的 SELEC ...

最新文章

  1. 【视频课】图像分割最新内容来了(言有三新录制4部分实例分割算法详解)
  2. Node.js~ioredis处理耗时请求时连接数瀑增
  3. Spring Boot 批量上传: The field files exceeds its maximum permitted size of 1048576 bytes.
  4. wcf http 返回图片
  5. shell中的常用通配符,字符类
  6. python 按钮控件_python实现360皮肤按钮控件示例
  7. java jpanel隐藏_java – 绘制JPanel隐藏菜单
  8. python469教程_从入门到精通真不难:Python最佳学习路线(视频学习教程)分享
  9. 关于ArrayList转json
  10. 第二篇:从 GPU 的角度理解并行计算
  11. python安装request方法mac_Mac下python3使用requests库出现No module named 'requests'解决方法...
  12. eclipse spring boot_Spring源码(一)-Spring整体架构和环境搭建
  13. html pc页面连接到微信,PC上对限制在微信客户端访问的html页面进行调试
  14. 微信 vue html缓存,解决微信浏览器缓存站点入口文件(IIS部署Vue项目)_唇印_前端开发者...
  15. 毁三观:妻妹把我压身下
  16. oracle提高delete的效率,提高Oracle DELETE性能的策略
  17. 图片拉伸和保持长宽比的问题
  18. 【OpenCV 例程300篇】208. Photoshop 对比度自动调整算法
  19. pes2017服务器维护时间,PES2017授权详情与球场数据包发布时间
  20. iOS KeyChain使用

热门文章

  1. hashmap扩容线程安全问题_HashMap是非线程安全,为什么ConcurrentHashMap能做到线程安全?...
  2. kodbox(可道云)Windows部署教程
  3. https协议谷歌浏览器使用Jmeter脚本录制
  4. 国内有免费“免费虚拟主机““免费云服务器”吗?
  5. 海尔智家半年报营收净利双增,卡萨帝、三翼鸟贡献几何?
  6. 用Python实现手机抓包,获取当当图书差评数据!
  7. 深度思考故事1:贴发票和贴海报
  8. 基带混用导致信号弱?iPhone网络差的原因及修复,望周知
  9. NYOJ 71 独木舟上的旅行
  10. Win10家庭版中文用户名改英文用户名方法(亲测管用)