您的当前位置: 神经痛 > 预防治疗

遗传神经网络

今天我们开始一段新的旅途——算法融合。

说白点,就是将两种算法以某种方式结合在一起。

我们就拿神经网络与遗传算法玩玩吧。

引言

——我们为什么要想到将神经网络与遗传算法结合?

——肯定是神经网络或者遗传算法有缺点,而结合起来可以弥补或者改善这个缺点,是吧。

那么,这两种算法的优缺点是什么呢?

优点缺点神经网络适合任何复杂非线性收敛慢,局部搜索遗传算法并行快,可扩展,全局搜索复杂,依赖性

这里我只大概说一下,具体的是什么意思还需要大家自己去搜索,去查找。

这里可以看出来,遗传算法在一定的程度上可以弥补神经网络的缺点,因此,如果将这两种算法有效地结合起来,效果会好很多。

准备工作

1.神经网络

之前,我们已经说过了神经网络,这里呢,我们就从整体的角度,去回顾一下关于神经网络的几个要点。

神经网络是一个框架,它不管你的问题是线性的,还是非线性的,它以一定的层(多层)方式,去逼近你这个问题。类似于拟合,框架已知,就是方程的类型已知,未知的是方程的系数,而神经网络未知的是网络的权值。现在回想看,还真有惊人的相似性。所以可以说,神经网络学习的过程就是权值不断调整的过程。权值的调整依据一定的法则,目标是误差,因为我们调整权值就是希望误差减小。调整法则:delta法则。

权值依据误差调整,根据的是反向传播算法。算法的本质是梯度下降法。而梯度下降法从数学角度看,是一种局部搜索的优化方法,但它要解决的问题为求解复杂非线性函数的全局极值,因此,算法很有可能陷入局部极值,使训练失败;因此,在这里,我们可以使用其他全局搜索算法来替代之。这里呢,我们用的是遗传算法。

遗传算法的过程:首先随机生成权值,这样肯定不是最好的权值(除非你的运气特棒),然后根据网络的结构,算出结果,由于这个结果不是理想的结果,就必定存在误差。然后我们就根据反向传播算法,根据这个误差,去更新这个权值。每次更新一点点,更新一次后,再看看效果怎么样,还有误差就继续更新。。。就这样,直至得到我们理想的结果。

2.遗传算法

遗传算法是什么呢?

在自然界中,淘汰的都是劣者,都是不适应环境的,剩下的都是强者。还是说这个最经典的例子吧。

现在的长颈鹿的脖子之所以长,达尔文认为:古代的长颈鹿存在着颈长和颈短、四肢长和四肢短的变异,这些变异是可以遗传的,四肢和颈长的能够吃到高处的树叶,就容易生存下去,并且繁殖后代;四肢和颈短的个体,吃不到高处的树叶,当环境改变食物缺少时,就会因吃不到足够的树叶而导致营养不良,体质虚弱,本身活下来的可能性很小,留下后代的就会就更小,经过许多代以后,四肢和颈短的长颈鹿就被淘汰了,这样,长颈鹿一代代的进化下去,就成了今天我们看到的长颈鹿.可见长颈变异的产生和逐代积累是长颈形成的原因。

我们如果将上面的过程用数学的方法来表示,就可以解数学中的问题了。

例如求函数极值的问题,不就是求长颈鹿脖子最长的大自然问题嘛。大自然既然可以选择出脖子最长的长颈鹿,那我们依据这个方法就可以解函数最值问题。

遗传算法的过程

遗传算法的特点:

遗传算法具有良好的全局搜索能力,可以快速地将解空间中的全体解搜索出,而不会陷入局部最优解;

分布式计算,求解速度快。

由于局部搜索能力不好,导致后期效率低。

如何结合

结合思路:

根据文献,结合分为两种基本类型:

依次性结合

同时性结合

咳咳,我是这么叫的,比较容易理解,其他人怎么叫我就不管咯。

什么是依次性结合呢?

就是先使用这个算法,之后再使用那个算法。

什么是同时性结合呢?

就是你中有我,这个算法在那个算法框架之中。

依次性结合:

神经网络与遗传算法是怎么以此种方式结合的呢?

首先,这两种算法是在两个阶段先后使用的。最普遍的是,先使用遗传算法去预处理数据。处理之后,再输入到神经网络进行学习。因为,数据如果有很大的维度,可以使用遗传算法找出主要的,去除一些次要的特征,这样能降低维度,减小计算量。

同时性结合:在同时性结合中,普遍的是,将权值看成一个基因,用遗传算法去寻优。其次,也可以使用遗传算法去找出神经网络的最优结构。前面说过神经网络是一个“艺术性”的工作,网络有几层,每层上有多少神经元,很大程度上都是依据经验尝试的。

其实吧,遗传算法不仅可以优化权值,优化结构,甚至还可以优化激活函数哦。

这次呢,我们就使用遗传算法优化神经网络的权值,实现同时性结合。

后续继续。。。

前面说过,我们要使用遗传算法优化神经网络的权值,实现同时性结合。

首先,说一下思路。

明确融合方式——同时性结合。明确对象——神经网络的权值。

确定好程序流程

写代码

现在,我们看看这两种算法如何结合,在哪里结合?

我们先看下神经网络的流程图。

上图是标准的BP流程图。

现在我们应该可以理解这幅图吧。这里就不细说了。

其中,重点在于更新权值和阀值的部分,这也是BP神经网络的核心。

如果我们要想与遗传算法结合,应该也是在此结合。

恩,现在我们的思路是保持神经网络的大框架,在更新权值和阀值的部分替换成遗传算法,这个思路。

现在,我们看下神经网络的框架。

下面我们来看下遗传算法的流程图。

前面说了我们想使用遗传算法替换掉神经网络中更新权值部分。我们都清楚了两种算法的流程,现在我们试试整合它们吧。

总是用语言说不清楚,下面用代码说话。

由于代码过长,这里只分析主要部分和难点。

1、多变量的染色体怎么定义?

对于多变量,我想了很久,决定采用这种数组的方式。一能保证读取数据方便,二染色体的长度不会过长。当然也有其他的方法,例如,将各个变量转成二进制合成一条染色体,但这种方法我觉得不方便,染色体的长度也会过长。

2、神经网络中的权值阀值,如何定义染色体?

这样做的前提是有的,我保存的数据格式是按着权值+阀值特定的顺序保存的,因此这里依次会取出相应的权值和阀值。

3、如何读取txt的某一行?

恩,for循环体中,会把一行的数据读完,然后,for循环就会保证读取确定的一行。

4、对于求最小值,如何使用轮盘赌法?

这里需要注意的是,一是概率不能为负,其次,抽到-1的概率要比-2的大。

5、交叉操作中,如何保证只有对应的变量发生交叉?

我们看下遗传算法与神经网络结合后的效果是不是比单独的BP神经网络要好。

先看这张图吧。

黑色线是单独的BP神经网络的结果;

红线是遗传神经网络的结果;

横轴是迭代的代数;

纵轴是每代的MSE误差;

从图中可以看出GANN(遗传神经网络,也就是算法的结合)比BP收敛的要快。

其次,我们从这里也可以看出遗传算法为什么说是全局寻优呢?

在大约6代的时候,网络已经找到了最优解,但它不认为这是全局最优解,于是,它就变异,跳出当前的范围,在更大的范围继续寻找,就这样,基本上能在全局的范围内寻找解。

所以说,遗传算法具有神经网络不具备的全局寻优能力。

这次的迭代效果就好的不要再好了。

这里说一下,为什么会出现不同的结果呢?

这是因为遗传算法是随机生成的种群。如果第一次生成的种群就很好,那么就会早些收敛,如果运气坏点,那么时间就会长些。

我们也可以看到,当迭代到第30代的时候,网络的准确率也达到了94.5%。

总体来说,遗传神经网络要比BP神经网络要好。

赞赏

人赞赏









































白癜风秘方
治白癜风用什么药



转载请注明:http://www.fdghi.com/yfzl/9832.html



  • 上一篇文章:
  • 下一篇文章: 没有了
  •