本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
遗传算法是一种常用于优化BP神经网络的智能算法,但实际中往往效果并不好
本文通过两个例子分析为什么遗传算法优化BP没有取得较好的效果,而为什么有的人会说效果好
通过本文,可以加深理解遗传算法优化BP的原理,以及没有取得较好效果的原因
本节先为“分析遗传算法优化BP神经网络无效”列举相关准备内容
遗传算法优化BP神经网络-问题分析前的准备
不只一次被问到“为什么我用遗传算法去优化BP神经网络没有什么效果”这个问题
这是一个较常见的困惑,为此笔者准备了本文,希望能帮助大家打开思路,而非完全的黑箱困惑
基础知识准备
要理解"为什么遗传算法对BP优化没效果",需要对两个算法本身有比较本质的认识
可参考以下文章
《遗传算法-入门讲解》
《BP神经网络的本质》
案例准备
由于“用遗传算法去优化BP神经网络”是抽象的,
因为优化的具体实现思路是多种多样的,下面我们不妨举两个常见的思路来分析
案例一、用遗传算法优化BP神经网络的初始化权重阈值
先用遗传算法求解一下BP神经网络,
然后再用这个权重阈值作为BP神经网络的初始值,进行求解
案例二、用遗传算法优化BP神经网络的最终解
在BP神经网络完成求解后,再用遗传算法优化解
本节通过两个案例,剖析为什么会没有效果,使我们知道效果不好的原因和本质
案例一分析:为什么遗传算法优化BP的初始权重阈值没效果
✍️案例1. 用遗传算法优化BP神经网络的初始化权重阈值
说明:如下说辞并非100%严谨,仅作为分享与启发发
如果只是简单的先用遗传算法求解一下BP神经网络,
然后再用这个权重阈值作为BP神经网络的初始值进行求解,那是很难有效果的,为什么呢?
因为BP用类似梯度下降这样的算法求解,而不管遗传算法最终优化的初始解是什么,对它影响都不大
如图所示,由于只要迭代步数足够大,梯度下降法总能收敛到局部最优
所以BP的初始解是否优秀,并不在于初始解的误差是多少,而是离初始解最近的局部最优解的误差是多少
用"遗传算法优化BP的初始解"没有效果就是因为如此
遗传算法只是找了一个“误差“相对小一些的解来初始化BP,但它并不是“BP认为的优秀初始解”
✍️补充:为什么用遗传算法初始化后反而会更差?
如果用遗传算法优化初始解后,效果还会更差,那不必惊讶,下面我们分析一下这是为什么
不妨看下matlab的BP是如何初始化的,matlab使用的是nguyen_Widrow法对BP进行初始化
以单输入网络为例,nguyen_Widrow将BP神经网络的隐节点初始化为以下形式
可以看到,它的目的就是让各个隐节点均匀分布在输入数据的范围
使每个隐神经元各自负责一小块,这样做的好处是,一开始使每个神经元处于“有用”的状态
并且它在输入域的每一块,都有相对应的神经元来负责,因此易于将BP调整为目标曲线形态
具体的我们不再分析
这里主要说明,matlab本身就使用了一套相对有效的初始化方法,
而如果使用遗传算法(上面的分析我们已经看到遗传算法没有什么帮助)来替代,自然效果反而可能会更差
案例二分析:为什么遗传算法优化BP的最终解没效果
✍️案例2.用遗传算法优化BP神经网络的最终解
说明:如下说辞并非100%严谨,仅作为分享与启发
为什么在BP神经网络完成求解后再用遗传算法优化却没有效果呢
首先,我们先梳理一下这么做的本质目的
当使用梯度下降时,已经取得了局部最优解,那么,再用遗传算法,图的是什么呢?
那就只能图它“跳出局部最优”的机制了,也就是遗传算法中变异的部分
同时,遗传算法产生新解的方法,在数值上也不是真正的“邻域”,所以也有跳出局部最优的作用
但这些机制本身的出发点就类似“瞎猫碰死耗子地在附近瞎抓,看看能不能抓到一个更优的解”
这也就是为什么效果不大了,一是靠瞎抓去抓到一个优秀解本来概率就很小,
二来是在一个局部最优的点附近去瞎抓一个比它更优的解,明显概率更小
即使真的“抓到了一个更好的解”,那也是运气好,这样跟直接多训练几次BP神经网络有什么区别呢?
本节分析为什么别人用遗传算法优化BP神经网络取得好效果的原因
为什么别人的优化效果不错
好了,为什么听说别人用遗传算法优化BP神经网络的效果不错?
不妨列举一些可能的原因作为参考
1.优化思路不同
由于遗传算法只是一种思想,与BP的结合是多种多样的,
不同的优化思路差别就非常大,而且遗传算法自身的设计影响也非常大
别人用的可能是其他的、有效的结合方法
2.优化基础不同
对于遗传算法优化BP,我们最直接的理解,是希望能让BP进一步取得更好的训练结果
但往往“别人的优化”并不是这个意思
笔者看了一些案例,标题都是《遗传算法优化BP》,它们的内容如下:
1. 用遗传算法优化隐节点个数
2. 直接采用遗传算法求解BP的权重、阈值
3. 采用遗传算法优化初始值,并与随机初始化的结果进行比较
也就是说,遗传算法优化BP往往指的并不是在BP的常用方案下进一步优化
而是指用遗传算法替代BP常用方案中的某一部分,例如求解、试参和初始化等等
如果希望是实打实地提高模型的效果,以上GA优化BP的方案明显不适用,因为常用方案效果更佳
这里常用的方案指的是:隐节点用试凑法,求解用LM法,初始化用nguyen_Widrow法等等
笔者语
相信很多人都是“听说遗传算法可以优化BP”而入的坑 ,费劲捣鼓几天之后,最终发现没什么用
笔者也曾捣鼓过类似的问题,用来优化最终的值,在努力尝试后完全没有提升效果,然后开始反思
最后按以上的思路仔细想想,最后的想法是“凭什么这么干能有用?!”
所以不能过分认真百分百相信别人的说法,有时基于基本知识,相信自己的推断也挺好的
笔者个人的猜想是,以前BP刚提出来时,训练算法、初始化算法还没这么成熟
所以用遗传算法在当时的确是有效果的,但对于现在的BP配套算法,就很难优化了
有时也看到有些读者,使用遗传算法的确能提升精度,但真实原因是因为BP没有训练好
例如参数设置不对等等,导致BP没有发挥应有的效果,所以才给了遗传算法提升的空间
虽然现在遗传算法很难真正意义上的优化BP
但"遗传算法优化BP"这一噱头在论文界却停不下来,毕竟,光是BP发论文有点不太好看
因此,在没有找到更好的噱头之前,这股风还会继续流传下去,支撑大家发论文的需求
现在遗传算法"能"优化BP神经网络,更大可能是靠"造"论文的小技巧,而非技术
备注:以上纯属笔者个人的随意猜想,仅作分享
好了,以上就是笔者对遗传算法优化BP神经网络的一些分析和猜想了~
End