一句话理解
神经进化( Neuro Evolution ):将进化的思想使用到神经网络参数优化的更迭中
铺垫
人工神经网络与生物神经网络重要不同点
人工神经网络大多是计算机能够理解的数学模型,通过将输入值正向传播得到自己的判断,对比自己的判断与真实值将误差反传更新自身的网络参数
生物神经网络并没有反向传播的过程,而是通过刺激产生新的网络连接以更透彻地理解事物(NE的实现思路与生物神经网络更贴近)
与用传统梯度下降生成的网络对比
监督学习中,梯度下降法指明了最优的方向,不断朝此方向更迭即可。而进化理论下的神经网络使用的是用原始的点创造新点,通过挑选确定下一代的起始点,不断更迭。因此在监督学习中,使用梯度下降进行参数更新的网络更快,但进化理论下的神经网络能够更好地避免陷入局部最优的。比起梯度下降,进化理论中的算法能够并行可以大大减少训练时间。
进化策略+神经网络
固定神经网络A的结构,利用A生成多个结构相同但网络间连接强度稍有不同的子代。
通过适者生存规则进行打分后,给每个子代网络一个比例值,得分高的比例值高。将子代按照比例组合成一个神经网络,作为下一次迭代的父代。
核心:
固定神经网络形态 (Topology), 改变参数 (weight)
通过不断尝试变异, 修改网络中节点间的权重, 改变神经网络的预测结果, 保留预测结果更准确的, 淘汰准确率低的.
OpenAI 2017年发表的Evolution Strategies as a Scalable Alternative to Reinforcement Learning表明利用并行的特点,ES+Neuro Network在数量级较大的场景下能够优于传统的强化学习
此论文中整体思路最简单的诠释:
import numpy as np
solution = np.array([0.5, 0.1, -0.3]) #神经网络中的参数
def f(w): return -np.sum((w - solution)**2)
npop = 50 # 种群数
sigma = 0.1 # 噪点标准差(变异强度)
alpha = 0.001 # 学习率(步长)
w = np.random.randn(3) # 对 solution 的初始猜测
for i in range(300): #一共300代
N = np.random.randn(npop, 3) # 产生噪点
R = np.zeros(npop)
for j in range(npop):
w_try = w + sigma*N[j] #生成子代
R[j] = f(w_try) # 得到环境奖励
A = (R - np.mean(R)) / np.std(R) # 归一化奖励
w = w + alpha/(npop*sigma) * np.dot(N.T, A) # 更新参数(下一代的weight)
遗传算法+神经网络
取出来自父亲A和母亲B的神经网络,通过交叉和变异产生子代C,对生成的所有子代进行适者生存不适者淘汰的选择,迭代循环。
核心:
修改参数 (weight)和形态(Topology)
不仅可以修改权重和偏置还可以修改整个网络的结构,获得更多的自由度,探索大的可能性,更易于找到全局最优
NEAT是运用此思路的典型算法,将遗传算法与神经网络结合。原始paper Evolving Neural Networks through Augmenting Topologies, 浓缩版Efficient evolution of neural network topologies.
关于NEAT:(下图全部来自论文)
1.基因编码(有两条链A/B)
A:Node Genes,用于存储网络中节点的信息(是第几个节点,是input node还是hidden node等)
B:Connection Genes,用于存储节点间的信息(哪两个点,权重是多少,是不是直连,Innovation number在交叉过程中作为识别的ID)
2.变异(两种方式:加连接/加节点)
3.交叉
通过Innovatrion number“对齐”父母的基因序列:
若某连接父母都有,则随意选二选一传给子代
若某连接只有一方有,则将有的基因传给子代
(孩子的基因序列是父母的并集)
参考:莫烦进化理论系列视频