gat*_*tor 6 python machine-learning neural-network mutation genetic-algorithm
我已经实现了一个遗传算法训练的神经网络,其中包含一个变异算子,如下所示:
def mutation(chromosome, mutation_rate):
for gene in chromosome:
if random.uniform(0.00, 1.00) <= mutation_rate:
gene = random.uniform(-1.00, 1.00)
Run Code Online (Sandbox Code Playgroud)
并且染色体最初是随机初始化的:
def make_chromosome(chromosome_length):
chromosome = []
for _ in range(chromosome_length):
chromosome.append(random.uniform(-1.00, 1.00))
return chromosome
Run Code Online (Sandbox Code Playgroud)
在执行交叉时,后代染色体只能在该区间内有基因,[-1, 1]因为父染色体也只有在该区间内的基因。当后代发生突变时,它同样会将其基因保持在该区间内。
这似乎对某些问题有效,但对其他问题无效。如果神经元的最佳权重在 内[-1, 1],那么遗传算法有效,但是如果神经元的最佳权重在不同的区间内呢?
例如,如果我使用分类误差低于 5% 的终止条件使用反向传播训练网络,我可以查看网络权重并查看诸如-1.49、1.98、等值2.01。我的遗传算法永远无法生成这些基因,因为基因在[-1, 1]和交叉和突变也不能产生该范围之外的基因。
看来我需要更好地定义搜索空间,如下所示:
# search space boundaries
S_MIN = -1.00
S_MAX = 1.00
# in mutation()
gene = random.uniform(S_MIN, S_MAX)
# in make_chromosome()
chromosome.append(random.uniform(S_MIN, S_MAX))
Run Code Online (Sandbox Code Playgroud)
然后我可以根据问题设置搜索空间边界。但是我如何确定搜索空间呢?此信息不是先验已知的,而是通过训练网络找到的。但是如果训练需要知道搜索空间,那么我就处于停滞状态。
我可以将搜索空间设置为任意大(例如,肯定比必要的大),但是算法收敛得很慢。我需要至少知道遗传算法搜索空间的大致数字才能有效。
对于反向传播,搜索空间不是先验已知的,这无关紧要,但对于 GA 来说却是。
这似乎是对神经网络强化学习核心挑战的重申。您有一个损失函数,它以数字方式量化解决方案空间当前局部中可能采取的行动的好坏程度,这样,采取行动时将使您更接近/远离全局最优值(答案)。{即梯度与损失函数}
\n\n在开始之前,您无法知道答案到底在哪里,因此您需要将探索策略定义为算法的一部分。这推动了对可能的解决方案空间的探索,以某些行动在接近损失函数定义的答案方面有多大的改进为指导。
\n\n一开始的探索非常积极,采取大胆的举措,以便能够快速探索解决方案空间。然后,随着解决方案空间的区域变得更有希望,尝试收敛于解决方案的探索变得不那么大胆。
\n\n在你的情况下,探索策略会改变突变大小、突变率和染色体的交叉。突变大小和速率将代表局部内的移动大小,交叉将代表解空间中的维度转置。
\n\n因此,您将在解决方案空间中拥有一个起始位置,而不是具有最大/最小值,并假设统一缩放和归一化的解决方案空间具有最佳猜测将是单位空间中的任何随机点。
\n\n然后,探索策略将选择突变大小、速率和交叉,以便最初积极地进行广泛探索。后代的选择会更喜欢那些更接近答案且探索策略不那么激进的一代。因此,后几代往往更接近\xe2\x80\x98answer\xe2\x80\x99,并且采用不太激进的探索策略,因此倾向于收敛。
\n\n本文对这些概念进行了更正式的回顾。
\n\n\n