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

cor*_*zza 35 python simulation artificial-intelligence machine-learning neural-network

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

因此,网络可以这样想象: 在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

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

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

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

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

编辑: 谢谢你的答案!其中每一个都非常有用,有些只是更相关.我决定使用以下方法:

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

kwa*_*ord 10

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

这听起来有点像你正在尝试重塑强化学习.我建议阅读通过强化学习:简介,该网站在该网站上以HTML格式免费提供,或以死树格式购买.该页面还提供了示例代码和解决方案.

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


tom*_*m10 10

这类似于尝试查找全局最小值的问题,很容易陷入局部最小值.考虑尝试找到下面的配置文件的全局最小值:您将球放在不同的位置并按照它向下滚动到最小值,但根据您放置它的位置,您可能会陷入局部倾斜.在此输入图像描述

也就是说,在复杂的情况下,您无法始终使用小的优化增量从所有起点获得最佳解决方案. 对此的一般解决方案是更频繁地波动参数(,在这种情况下的权重)(并且通常在进行模拟时减小波动的大小 - 如在模拟退火中),或者仅仅意识到一堆起点不会有意思.


cco*_*ley 6

你想怎么学习?你不喜欢随机种子生物死亡或繁荣的事实,但你唯一一次向你的生物体提供反馈就是随机获取食物.

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

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