如何使用神经网络学习虚拟生物?

时间:2012-01-25 17:15:44

标签: python artificial-intelligence machine-learning neural-network simulation

我正在做一个简单的学习模拟,屏幕上有多个生物。他们应该学习如何吃,使用他们简单的神经网络。它们有4个神经元,每个神经元激活一个方向的运动(从鸟的视角看是一个2D平面,因此只有四个方向,因此需要四个输出)。他们唯一的输入是四只“眼睛”。当时只有一只眼睛可以活动,它基本上用作指向最近物体(绿色食物块或其他生物体)的指针。

因此,网络可以这样想象: enter image description here

有机体看起来像这样(在理论和实际模拟中,它们真的是红色的块,眼睛周围都是):

enter image description here

这就是这一切的样子(这是一个老版本,眼睛仍然不起作用,但它是相似的):

enter image description here

现在我已经描述了我的一般想法,让我了解问题的核心......

  1. 初始化 | 首先,我创造了一些生物和食物。然后,将其神经网络中的所有16个权重设置为随机值,如下所示:weight = random.random()* threshold * 2。阈值是一个全局值,描述每个神经元需要获得多少输入才能激活(“激活”)。通常设置为1.

  2. 学习 | 默认情况下,神经网络中的权重每步降低1%。但是,如果某些有机体真的设法吃东西,那么最后一个有效输入和输出之间的联系就会得到加强。

  3. 但是,有一个很大的问题。我认为这不是一个好方法,因为他们实际上并没有学到任何东西!只有那些随机设定为有益的初始体重的人才会有机会吃东西,然后只有他们的体重会增强!那些与他们的关系设置得很糟糕的人呢?他们只会死,而不是学习。

    我该如何避免这种情况?想到的唯一解决方案是随机增加/减少权重,这样最终有人会得到正确的配置,并偶然吃掉一些东西。但我觉得这个解决方案非常粗糙和丑陋。你有什么想法吗?

    修改 谢谢您的回答!其中每一个都非常有用,有些只是更相关。我决定使用以下方法:

    1. 将所有权重设置为随机数。
    2. 随着时间的推移减轻重量。
    3. 有时会随机增加或减少重量。单位越成功,其权重就越小。 NEW
    4. 当有机体吃东西时,增加相应输入和输出之间的重量。

6 个答案:

答案 0 :(得分:10)

正如Mika Fischer所说,这听起来与人工生活问题相似,所以这是你可以看到的一条途径。

这听起来有点像你试图重新发明Reinforcement Learning。我建议阅读Reinforcement Learning: An Introduction,该网站在该网站上以HTML格式免费提供,或以死树格式购买。该页面还提供了示例代码和解决方案。

本书后面将讨论使用神经网络(以及其他函数逼近器)和规划技术,因此如果最初的东西看起来太基本或不适用于您的问题,请不要气馁。

答案 1 :(得分:10)

这类似于尝试查找全局最小值的问题,因为它很容易陷入局部最小值。考虑尝试找到下面的配置文件的全局最小值:您将球放在不同的位置并沿着它向下滚动到最小值,但是根据您放置它的位置,您可能会陷入局部倾斜。{ {0}}

也就是说,在复杂的情况下,您无法始终使用小优化增量从所有起点获得最佳解决方案。一般的解决方案是使参数波动(,权重,在这种情况下)更有力(并且通常在进行模拟时减小波动的大小 - 就像模拟退火一样),或者只是意识到一堆起点不会发生去任何有趣的地方。

答案 2 :(得分:6)

您希望如何学习?你不喜欢随机种子生物死亡或繁荣的事实,但你唯一一次向你的生物体提供反馈就是随机获取食物。

让我们把它塑造成热和冷。目前,一切都反馈“冷”,除非有机体正好在食物之上。因此,学习的唯一机会就是不小心跑过食物。如果需要,您可以收紧此循环以提供更持续的反馈。如果有食物运动则反馈温暖,如果离开则感冒。

现在,这方面的缺点是没有其他任何输入。你只有食物寻求者的学习技巧。如果你希望你的生物在饥饿和其他东西之间找到平衡(比如过度拥挤避免,交配等),整个机制可能需要重新思考。

答案 3 :(得分:4)

有几种算法可用于优化神经网络中的权重,其中最常见的是backpropogation algorithm

从阅读你的问题我收集到你正在尝试建立神经网络机器人来寻找食物。使用backpropogation实现这一目标的方法是建立一个初始学习期,其中权重最初是随机设置的(正如您所做的那样),并使用backpropogation算法逐步细化,直到达到您满意的性能水平。那时你可以阻止他们学习并让他们在平地上自由地嬉戏。

但我认为您的网络设计可能存在一些问题。首先,如果在任何时候只有一只眼睛处于活动状态,那么只有一个输入节点并以其他方式跟踪方向更有意义(如果我正确理解的话)。简单地说,如果只有一个活动眼睛和四个可能的动作(前进,后退,左,右),那么来自非活动眼睛的输入(可能是零)将对输出决定没有影响,实际上我怀疑每个的权重输入到所有输出会收敛,基本上复制相同的功能。而且,它不必要地增加了网络的复杂性并增加了学习时间。其次,您不需要那么多输出神经元来代表所有可能的动作。正如您在那里描述的那样,您的输出将是{1,0,0,0} =右,{0,1,0,0} =左,依此类推。根据建模的神经元的类型,可以使用2个甚至1个输出神经元来完成。如果使用二元神经元(每个输出为1或0),那么执行{0,0} = back,{1,1} = forward,{1,0} = left,{0,1} = right 。使用sigmoidal函数神经元(输出可以是0..1的实数),你可以{0} =后退,{0.33} =左,{0.66} =右,{1} =前进。

答案 4 :(得分:3)

我可以看到一堆潜在的问题。

首先,我不清楚更新权重的算法。我喜欢1%的减少作为一个概念 - 看起来你正在试图打破远方记忆,这在原则上是好的 - 但其余可能还不够。您需要查看一些标准更新算法,例如反向传播,但这只是一个开始,因为....

...你只是在吃食物的最后阶段给你的网络信用。似乎没有任何直接机制可以使您的网络逐渐接近食物或食物块。即使将眼睛的方向性视为面值,你的眼睛也很简单,并且没有太多的长期记忆。

此外,如果您的网络图是准确的,那可能还不够。如果你使用与反向传播相关的东西,你真的想在传感器和执行器之间有一个隐藏层(至少一个)。该陈述背后有详细的数学,但它归结为“隐藏的层将允许更多问题的良好解决方案。”

现在,请注意我的很多评论都在谈论网络的架构,但只是笼统地说,具体而言,“这将起作用”或“将起作用”。那是因为我也不知道(虽然我认为Kwatford建议强化学习是非常好的。)有时候,你可以改进网络参数以及网络实例。一种这样的技术是增强拓扑的神经进化,或“NEAT”。也许值得一瞧。

答案 5 :(得分:2)

我认为Polyworld提供了一个更复杂的例子。

您还可以查看2007年的Google Tech Talks演示文稿:http://www.youtube.com/watch?v=_m97_kL4ox0

然而,基本思想是在您的系统中采用进化方法:使用小的随机突变结合遗传交叉(作为多样化的主要形式)和选择“更好”适合环境生存的个体。