我正在制作一个简单的学习模拟,其中屏幕上有多个生物。它们应该使用简单的神经网络学习如何进食。它们有4个神经元,每个神经元激活一个方向的移动(这是一个从鸟瞰视角看的二维平面,因此只有四个方向,因此需要四个输出)。它们的唯一输入是四个“眼睛”。每次只能有一个眼睛处于活跃状态,它基本上是指向最近的物体(要么是绿色的食物块,要么是另一个生物)。
因此,可以这样想象这个网络:
一个生物看起来像这样(无论是在理论上还是在实际的模拟中,它们确实是带有周围眼睛的红色块):
这就是整体外观(这是旧版本,眼睛当时还不工作,但相似):
现在我已经描述了我的总体想法,让我们进入问题的核心…
-
初始化|
首先,我创建了一些生物和食物。然后,它们神经网络中的16个权重被设置为随机值,像这样:weight = random.random()threshold2。阈值是一个全局值,描述每个神经元需要获得多少输入才能激活(“触发”)。它通常设置为1。 -
学习|
默认情况下,神经网络中的权重每一步都会降低1%。但是,如果某个生物确实设法吃到了东西,最后一个活跃输入和输出之间的连接就会得到加强。
但是,这里有一个大问题。我认为这不是一个好的方法,因为它们实际上没有学到任何东西!只有那些初始权重随机设置为有利的生物才有机会吃到东西,然后只有它们的权重会被加强!那些连接设置得不好怎么办?它们只会死掉,而不是学习。
我如何避免这种情况?唯一想到的解决方案是随机增加/减少权重,这样最终会有人得到正确的配置,并通过偶然吃到东西。但我觉得这个解决方案非常粗糙和丑陋。你有什么想法吗?
回答:
这类似于试图找到全局最小值的问题,很容易陷入局部最小值。考虑尝试为下面的轮廓找到全局最小值:你将球放在不同的地方,然后跟随它滚下山到最小值,但根据你放置的位置,你可能会陷入局部凹陷。
也就是说,在复杂的情况下,你不能总是通过小的优化增量从所有起点到达最佳解决方案。 对此的一般解决方案是更剧烈地波动参数(在本例中,即权重)(通常在模拟进行时减小波动的大小——就像在模拟退火中一样),或者只是意识到很多起点不会去到任何有趣的地方。