如何使虚拟生物学习neural network?
我正在做一个简单的学习模拟,屏幕上有多个有机体。 他们应该学习如何吃,使用他们简单的neural network。 他们有4个神经元,每个神经元激活一个方向的运动(从鸟的angular度来看,这是一个2D平面,所以只有四个方向,因此需要四个输出)。 他们唯一的投入是四个“眼睛”。 当时只有一只眼睛是活跃的,它基本上是指向最近物体(绿色食物块或另一个生物体)的指针。
因此,networking可以这样想像:
而一个有机体看起来是这样的(理论上和实际的模拟,他们真的是他们周围的红色块):
这就是这一切的样子(这是一个旧版本,眼睛仍然没有工作,但它是相似的):
现在我已经描述了我的一般想法,让我来谈谈问题的核心。
-
初始化 | 首先,我创造了一些生物和食物。 然后,他们的neural network中的所有16个权重被设置为随机值,如下所示:weight = random.random()* threshold * 2。 阈值是描述每个神经元为了激活(“火”)需要多lessinput的全局值。 通常设置为1。
-
学习 | 默认情况下,neural network中的权重每步降低1%。 但是,如果某些有机体真的设法吃东西,最后积极的投入和产出之间的联系就会加强。
但是,有一个很大的问题。 我认为这不是一个好的方法,因为他们实际上并没有学到任何东西! 只有那些初始权重随机设定为有益的人才有机会吃东西,只有他们的权重才会加强! 那些关系不好的人呢? 他们会死的,而不是学习。
我如何避免这种情况? 想到的唯一的解决办法是随机增加/减less权重,以便最终有人会得到正确的configuration,并偶尔吃东西。 但是我觉得这个解决scheme非常简单和丑陋。 你有什么想法?
编辑:谢谢你的答案! 他们中的每一个都非常有用,有些则更加相关。 我决定使用以下方法:
- 将所有权重设置为随机数。
- 减less重量随着时间的推移。
- 有时随机增加或减less一个重量。 单位越成功,权重就会变得越less。 新
- 当生物体吃东西时,增加相应input和输出之间的权重。
这与试图find全局最小值的问题类似,在这个问题中,它很容易陷入局部最小值。 考虑试图find下面这个轮廓的全局最小值:你把球放在不同的地方,然后沿着它向下滚动到最小值,但是根据你放置的位置,你可能会陷入局部下陷。
也就是说,在复杂的情况下,您不可能始终使用小的优化增量从所有的起点获得最佳解决scheme。 对此的一般解决scheme是在参数( 即权重,在这种情况下)更加剧烈地波动(并且通常在进行模拟时减less波动的大小 – 就像模拟退火一样),或者只是意识到一堆起点不会变得有趣。
正如米卡·菲舍尔(Mika Fischer)所提到的,这听起来很像人为的生活问题,所以这是你可以看的一个途径。
这听起来有点像你正试图重塑钢筋学习 。 我build议阅读通过强化学习:介绍 ,在网站上免费提供的HTML格式,或以死树格式购买。 示例代码和解决scheme也在该页面上提供。
本书稍后会讨论使用neural network(和其他函数逼近器)和计划技术,所以如果最初的东西看起来过于基本或不适用于您的问题,请不要气馁。
你想如何学习? 你不喜欢这样的事实:随机种植的有机体要么灭绝,要么繁荣,但是只有当你向机体提供反馈的时候,他们才会随机获取食物。
让我们来模拟这个热和冷。 目前,除了有机体在食物之上,所有的东西都会反过来“冷”。 所以唯一的学习机会是意外地跑过食物。 如果您愿意的话,您可以收紧这个循环以提供更多连续的反馈。 如果有食物移动,则反馈会变暖,如果移走则会变冷。
现在,这个缺点是没有其他的input。 你只有一个寻求食物的学习技巧。 如果你想让自己的生物体在饥饿和别的东西之间find平衡点(比如过度拥挤避免,交配等),整个机制可能需要重新思考。
有几种algorithm可以用来优化neural network中的权重,其中最常见的是反向algorithm 。
从阅读你的问题,我收集你正在试图build立neural network机器人,将search食物。 通过反向推广实现这一目标的方法是有一个初始的学习阶段,权重最初是随机设置的(如你所做的那样),然后使用反向algorithm逐步完善,直到达到你满意的性能水平。 在这一点上,你可以阻止他们学习,让他们在平地上自由地嬉闹。
不过,我认为您的networkingdevise可能存在一些问题。 首先,如果在任何时候只有一只眼睛活动,那么只有一个input节点并且以其他方式跟踪定位(如果我正确地理解的话)会更有意义。 简单地说,如果只有一个活动眼睛和四个可能的动作(前进,后退,左,右),那么来自非活动眼睛的input(大概为零)将不会影响输出决定,实际上我怀疑每个所有输出的input将会收敛,基本上重复相同的function。 而且,不必要地增加了networking的复杂度,增加了学习时间。 其次,你不需要那么多的输出神经元来表示所有可能的动作。 正如你在那里描述的那样,你的输出将是{1,0,0,0} = right,{0,1,0,0} = left,依此类推。 根据神经元build模的types,这可以用2或甚至1个输出神经元来完成。 如果使用二元神经元(每个输出为1或0),则执行{0,0} = back,{1,1} = forward,{1,0} = left,{0,1} = right 。 使用S形函数神经元(输出可以是从0到1的实数),您可以{0} =返回,{0.33} =左,{0.66} =右,{1} =正向。
我可以看到一堆潜在的问题。
首先,我不清楚更新权重的algorithm。 我喜欢把1%的下降看作是一个概念 – 看起来你试图打折遥远的回忆,这在原则上是好的 – 但其余的可能是不够的。 您需要查看一些标准的更新algorithm,如反向传播,但这只是一个开始,因为…
…你只是把你的networking信誉的最后阶段吃的食物。 似乎没有任何直接的机制让你的networking逐渐接近食物或食物块。 即使以面值来衡量眼睛的方向性,你的眼睛非常简单,没有太多的长期记忆。
另外,如果你的networking图是准确的,这可能是不够的。 如果您使用与反向传播相关的内容,您确实希望在传感器和执行器之间有一个隐藏层(至less一层)。 这个陈述背后有详细的math,但归结起来就是:“隐藏的层可以解决更多的问题。”
现在请注意,我的很多评论都在谈论networking的架构,但只是笼统地说,没有具体地说:“这会起作用”,或者“这会起作用”。 那是因为我也不知道(虽然我认为Kwatford的强化学习的build议是非常好的)。有时,你可以演化networking参数以及networking实例。 一种这样的技术是Augmenting Topologies的Neuroevolution或“NEAT”。 也许值得一瞧。
我认为Polyworld提供了一个更复杂的例子。
您还可以查看2007年的Google技术会议演示文稿: http : //www.youtube.com/watch?v=_m97_kL4ox0
然而,基本的想法是在你的系统中采取一种渐进的方法:使用小的随机突变结合基因交叉(作为多样化的主要forms),并select“更好”适合环境生存的个体。