通用资料收集
- DEAP:A novel evolutionary computation framework,有基于前缀树的遗传规划的工具;
- A FIELD GUIDE TO GENETIC PROGRAMMING:介绍GP的入门书籍(主要讲解tree-based);
- Cartesian genetic programming:基于图的GP的PowerPoint讲解;
Genetic Programming初步了解
GP与遗传算法(GA)的主要不同:GP的个体是完整的数学表达式或者计算机程序,而经典的GA的个体限定为参数组合、字符串。
两大类:基于树的(Tree-based GP / Koza-style GP)、基于图的(Cartesian GP)
Tree-based GP
基于树的GP中,个体可以用一个抽象语法树(AST)表示:
- 叶节点(终结符、零参数函数,terminal set):表示输入变量或常量,如{x, y, 3}
内部节点(函数,function set):表示简单的算子,如{+,-,x,/,min,max}
- 上面列举的都是二元算子,由他们的线性组合我们可以推断出表达式的解空间一定是连续的;通过引入IF这样一个三元算子:
IF ProgOut > 0 THEN CLASS1 ELSE CLASS2
(即第一个儿子的结果大于0,整棵树返回CLASS1,否则返回CLASS2),可以引入间断的解空间。
- 上面列举的都是二元算子,由他们的线性组合我们可以推断出表达式的解空间一定是连续的;通过引入IF这样一个三元算子:
- 一个GP系统的primitive set = function set + terminal set
基于树的GP在进化时会限制深度,深度的定义与数据结构中树的深度定义一致。
种群初始化方法(Population Initialization)
最简单的两种:grow/full以及它们的混合形式:ramped half-and-half
grow方法(成长方法,算法简记为长到不能长为止):
- 从function set随机取一个作为root;
- 对随后的所有候选位置,从primitive set中随机取一个占位;如果已经到达限制深度只能从terminal set中随机取;
- 停止条件:没有新的可选位置;
full方法(相比grow方法,多样性有所下降):
- 从function set随机取一个作为root;
- 在到达深度限制前,从function set中随机取;到达深度限制时从primitive set中取;
- 停止条件:到达深度限制;
ramped half-and-half方法:
- 一个population中一半的个体grow,一半的个体full,深度限制由单一值扩展为限制范围。
适应度评估(Fitness Evaluation)
与遗传算法一致
环境选择(Environmental Selection)
与遗传算法一致,主要有tournament selection和轮盘赌选择法;
遗传算子(Genetic Operator)
可以与遗传算法类比,但相较遗传算法在线性的染色体上进行Genetic Operation不同,对Tree-based的个体而言遗传算子的设计要略微复杂一些:
Crossover:
- subtree-crossover(两个父体得到一个子体):对两个待交叉个体A、B,对每一个父体选择一个crossover point,复制A为$A_{copy}$,将B的以crossover point为root的子树记为$ B_{subtree\_copy}$,并用$ B_{subtree\_copy}$替换$A_{copy}$中以杂交点为root的子树。
- one-point crossover(两个父体得到两个子体):
同样也要对两个待交叉个体各自选择crossover point,并相互交换以各自crossover point为root的子树,与遗传算法中的crossover类似。
- Mutation:替换以随机选择的mutation point为root的子树为一个随机生成的子树。
- Copy(Reproduction):父体不做变化,直接复制到下一代。
思考如何直接使用Genetic Programming解决图像分类?
由于基于图的GP很容易让人联想到神经网络的data flow,因此已经有很多工作例如A Genetic Programming Approach to Designing Convolutional Neural Network Architectures在使用GP探索NN的结构了,与使用遗传算法探索NN有相似之处。
那么,如何将图像的像素级数据直接运用到Genetic Programming上并实现图像分类的效果呢?基本思路大致如下:在不能使用NN的情况下,利用原始的手工提取特征的方法提取到的特征作为terminal set中的输入变量,对GP的输出按照分类标签划分范围(如正数代表Class 1,负数代表Class 2),以分类accuracy作为个体适应度。
手工提取特征的方法多种多样,简单的可以直接取固定区域的像素的统计数据作为特征,如均值方差;复杂的可以运用在深度学习广泛运用前CV领域常用的手工算子:HOG、SVM、Haar;
经典工作(按发表时间排序)
Classification Strategies for Image Classification in Genetic Programming(2003):分类策略上的创新:针对GP的返回值运用了动态的映射选择方法,而非固定边界值的选择,即$return\_value <->predict\_label$之间的映射不再固定。
- SRS:为N个classification生成N-1个边界值,在进化全过程保持不变;
- Centred Dynamic Range Selection (CDRS):首先按SRS生成固定边界并完成评估,对种群中每个个体得到了相应的适应度,定义class center为:$ \text { Center }_{c}=\frac{\sum_{p=1}^{M} \sum_{\mu_{c}=1}^{L}\left(W_{p} \times \text { Result }_{p \mu_{c}}\right)}{\sum_{p=1}^{M} \sum_{\mu_{c}=1}^{L} W_{p}} $,其中M是种群个体数,L是对类别c的训练样本数,$W_p$是反映个体在种群中重要程度的指标,可以由$W_p = \text{fitness}_p + 50\%$计算得到。最后重新确定类别的范围为相邻class center所包括的数值,并按新计算的范围重新评估每个个体。
- Genetic Programming for Image Classification with Unbalanced Data(2009):适应度评估函数上的创新:使用accuracy评估图像分类不能很好处理标签不平衡数据;同时特征选择也更加多样,以PEDESTRIAN数据集为例,文章在36x19的图像上手动划分区域并计算对应区域的统计特征。
- An Effective Feature Learning Approach Using Genetic Programming with Image Descriptors for Image Classification(2020):function set上的创新,不再局限于{+,-,x,/,if},引入了CV领域常见手工特征算子。其他工作包括使用min-max正则化处理特征;
当然,如果拓宽视野,让分类任务不局限在只通过GP完成,那还有这些工作:
- Evolutionary Deep Learning: A Genetic Programming Approach to Image Classification
- An Evolutionary Deep Learning Approach Using Genetic Programming with Convolution Operators for Image Classification
使用DEAP框架解决GP图像分类问题
Demo: Genetic-Programming-MNIST
特征、标签划分都用的很暴力的方法,效果自然也很差,暂且当做一个玩具吧!