上一节我们讲到了
今天为大家讲解
遗传拓扑神经网络
6.1 遗传拓扑神经网络
Kenneth O. Stanley等人[9]提出的遗传拓扑神经网络(NEAT算法)同样也是结合了神经网络和遗传算法产生的一种全新模型。它与6.1节介绍的遗传演化神经网络不同的地方在于加入了交叉操作。不过它的年代比较久远了,是来自2003年的一篇论文。因为近些年来计算机算力的提升与强化学习的兴起,遗传拓扑神经网络又走进了人们的视野。
6.2.1 遗传拓扑神经网络原理
正如之前的6.1节所说,遗传算法是个通用框架,因此我们需要根据具体的问题来定义遗传算法。不过,既然它是框架,那它就会有通用的几部分供我们选择,因此博主在此给大家先讲下整体的流程。
整体框架可分为三部分:交叉、变异与适应度。不过虽然整体的流程是一致的,但是因为问题不同,我们定义的基因也有所不同,那交叉与变异也会随之变化。
这篇论文将神经元及其连接定义成基因组,而遗传演化神经网络论文是将网络层及其学习率定义成基因组,大家可以对比着学习两者的异同,这样也能更好地感受为什么说遗传算法是解决一般性问题的通用框架,就是因为我们可以根据问题去定义基因组。
6.2.2 算法核心
1) 超参数设置
个体基因:(结点链接与结点类型)
种群规模:150
物种划分:基于权值相似度划分物种
2) 伪代码
1. while condition:
2. if random.random < 交叉率:
3. 选择操作(适应度越高,越容易被选中)
4. 物种内交叉
5. if random.random < 变异率:
6. 变异操作
7. 评估适应度
8. else: # 直接变异
9. if random.random < 变异率:
10. 变异操作
11. 评估适应度
12. # 淘汰操作
13. 每个物种保留一定数量的个体
14. if random.random < 灭绝率:
15. 灭绝最差的物种
16. 种群间的物种交叉生成亚种, 弥补新的物种
17.
18. conditon:迭代次数 or fittness达到设定的阈值
19. 评估适应度:fitness = 1/(训练集的误差)^2
20. 这里的适应度函数是自定义的,大家可以根据自己的想法去定义。
3) 交叉操作
论文通过一个链表定义基因的节点连接,选择两个个体进行交叉的时候,按照链表的顺序