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

35 投票
6 回答
4465 浏览
提问于 2025-04-17 11:04

我正在做一个简单的学习模拟,屏幕上有多个生物。它们的任务是通过简单的神经网络学习如何吃东西。每个生物有4个神经元,每个神经元负责让生物朝一个方向移动(这是一个从鸟的视角看的二维平面,所以只有四个方向,因此需要四个输出)。它们唯一的输入是四个“眼睛”。一次只能有一个眼睛处于活动状态,基本上是指向最近的物体(可以是绿色的食物块,或者是其他生物)。

因此,可以把这个网络想象成这样:

enter image description here

而一个生物看起来是这样的(无论是在理论上还是实际模拟中,它们实际上都是红色的方块,周围有眼睛):

enter image description here

这就是它们的整体样子(这是一个旧版本,眼睛还没有工作,但看起来差不多):

enter image description here

现在我已经描述了我的总体想法,让我来谈谈问题的核心...

  1. 初始化| 首先,我创建一些生物和食物。然后,它们神经网络中的16个权重被设置为随机值,像这样:weight = random.random()threshold2。阈值是一个全局值,描述每个神经元需要多少输入才能激活(“发射”)。通常设置为1。

  2. 学习| 默认情况下,神经网络中的权重每一步降低1%。但是,如果某个生物真的成功吃到了东西,最后一个活动输入和输出之间的连接会被加强。

但是,有一个大问题。我觉得这种方法不好,因为它们实际上并没有学到任何东西!只有那些初始权重随机设置得比较好的生物才有机会吃到东西,然后只有它们的权重会被加强!那些连接设置得不好的生物呢?它们只会死去,而不是学习。

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

6 个回答

6

你希望它怎么学习呢?你不喜欢随机生成的生物要么死掉要么繁荣的情况,但你只有在它们偶然找到食物的时候才给它们反馈。

我们可以把这个过程想象成“热”和“冷”。现在,除了生物正好在食物上面的时候,其他时候它们得到的反馈都是“冷”。所以,它们学习的机会只有在偶然碰到食物的时候。如果你想要更频繁的反馈,可以调整这个过程,比如当生物朝着食物移动时给它们“热”的反馈,而当它们远离食物时给“冷”的反馈。

不过,这样做的一个缺点是,生物没有其他方面的输入。你只有一种寻找食物的学习方式。如果你希望这些生物在饥饿和其他事情(比如避免过度拥挤、交配等)之间找到平衡,那么整个机制可能需要重新考虑。

10

正如Mika Fischer提到的,这听起来有点像人工生命的问题,所以你可以朝这个方向去探索一下。

这也有点像你在尝试重新发明强化学习。我建议你看看《强化学习:导论》,这个书在那个网站上可以免费在线阅读,或者你也可以买纸质版。那页上还有示例代码和解决方案。

书中后面会讨论神经网络(还有其他函数近似器)和规划技术,所以如果一开始的内容看起来太基础或者跟你的问题不太相关,也不要气馁。

10

这就像在寻找一个全局最小值时遇到的问题,容易被困在一个局部最小值里。想象一下,你要找到下面这个图形的全局最小值:你把一个球放在不同的位置,然后看着它沿着山坡滚下来找到最低点,但根据你放球的位置,可能会卡在一个小的低洼处。

也就是说,在复杂的情况下,你不能总是从所有起点通过小幅度的优化一步步到达最佳解决方案。 解决这个问题的一般方法是更大幅度地调整参数(在这个例子中就是权重),通常在模拟过程中逐渐减小这些调整的幅度——就像模拟退火那样,或者你也可以意识到,有些起点根本不会带你去有趣的地方。

撰写回答