有一款非常魔性的小游戏叫《Boxcar 2D》,游戏主要内容是用几何图形和圆形的轮子组成小汽车,不断走过一条有上下波动的“路”,看什么形状的小车可以走的更远。
但和大部分游戏不一样的是,不用玩家自己手动拼装小车,整个过程完全由算法自动进行,每次随机生成小车,卡到路上了就重新来过。最后小车会越走越远,整个过程中小车的形状会越来越合适,一开始可能只是个“独轮车”,到后期则会很接近我们生活中摩托车的样子。
要问有什么案例能简单明晰的体现出“智能”、“自学习”的概念,这款游戏一定是我的首选。而这款游戏中,应用的就是遗传算法。
简单来说,遗传算法是一种随机搜索算法,主要目的是用来优化。和自然界的遗传一样,遗传算法秉持的是适者生存、优胜劣汰。通过选择、交叉和变异,不断迭代出更优秀的解法。
通过编码,将解空间变成编码空间,从中选择当前较为优秀的解当做“父母”,下一步则是将多种解的特征进行交叉,诞生下一代,最后再经过变异成为“子嗣”。如果“子嗣”还是不能符合要求,那就再进行一次上述步骤,直到满足要求。过程中,较差的基因就会一步步被淘汰。最后再进行解码,就能得到我们想要的结果。
总之,这是一个枚举的过程。就像长颈鹿的进化一样,树叶长在高处,每一只鹿都去尝试吃树叶,只有符合“标准”的长颈鹿能够吃到食物、生产下来并诞生后代。
但要注意的是,这种算法很多时候不会给出一个“最优解”,而是给出一些较为接近的次优解,从中矮子里面拔将军。
遗传算法经常被用来解决一些调度类的问题,比如确定车间工程流程、飞机航线等等。工程、航行中所需要的资源消耗、时间等等权值看做“染色体”,几种染色体排列组合,最终选择其中的较优方案。
此外,机器人中也会用到遗传算法,尤其是快速定位、路径规划等。就像Boxcar这个游戏一样,机器人在仿真环境中不断尝试接近目标,路线的优越度随着路线的长度减少,结合机器人对自身位置的感知,最后得出较优解。
同时,遗传算法也可以被应用于帮助神经网络调参数,只是这种方式需要的时间太长、运算量太大,属于性价比较低的参数调整方式。
在游戏中,也能见到遗传算法的影子。比如说很多游戏会有在同一场景面对多轮敌人的“生存模式”,在这一模式中,敌人的属性是会不断增强的,有了遗传算法,就可以根据你自身属性的变化不断改变敌人的属性,以增强游戏的难度。比如说你的法术强度高,敌人就会增加法术防御度,你的攻击穿透性高,敌人就会增加血量。这样一来相比直接的增加属性,可以有更好的游戏体验。
以上都是一些适用于实际场景的应用,由于遗传算法简单易用,我们可以看到很多娱乐化的、有趣的应用。
比如说,模仿图形。在一款程序中,我们可以看到遗传算法通过几何图形的不断组合,最终慢慢变成接近案例图形的样子。
同时你还可以亲自调整变异的倾向,最终成果虽然和原图相比还有很大差距,但也不乏自己的风格。不过尝试时就可以发现,整个过程时间很长,某种程度上也体现了遗传算法的低效。
基于上述的功能,遗传算法还有一个非常有趣的玩法,那就是“欺骗”深度学习模型。
2014年有一篇论文曾经写过,深度神经网络(DNN)在图片识别上有着很优异的表现。可当用遗传算法模拟图片时,两张图片在人眼看来一模一样,可深度神经网络却完全识别不出来。或者遗传算法可以模拟出一张人眼看起来是“乱码”的图片,却被深度神经网络识别成正常的图片。
这一点让人们注意到了机器视觉和人类视觉的区别,和人类不一样,机器还是会把图像转化为“数字”,再进行比对、识别。这也导致了,有时候深度神经网络会把一张噪声图识别成动物、建筑等等。
除了生成图片,遗传算法还可以生成音乐、宋词等等。将词语和音符输入,让机器随机组合,加入人类评分机制。整个过程几乎和“让猴子在打字前坐几十年可以写出莎翁作品”的假说差不多。基本上只能用于娱乐,不太适合实操。
其实,目前遗传算法已经慢慢淡出了主流算法舞台。虽然主旨是为了避开局部最优误区,为无限解集问题寻找答案,可在实际应用时相比梯度和蒙特卡罗算法都没有明显的差异和优势,常常被视作“玄学算法”。比如计算结果的稳定性差、求解过程没有可复制性等等都是遗传算法的缺点。很长一段时间里,遗传算法都被看做只能用来凑论文的算法。
不过理论也和技术一样,会随着实践和研究不断发展,曾经的神经网络也曾被打入冷宫。最近DeepMind还提出了把神经网络和遗传算法结合,应用到迁移学习中的案例。或许,有朝一日遗传算法还会重新进入我们的视野。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/112452.html