蛇游戏:蛇每次都收敛到同一个方向

人工智能 强化学习
2021-10-26 02:55:36

这是一条使用神经网络作为 aq 函数逼近器的 q-learning 蛇,我在这里失去了理智,目前的模型比最初的模型更糟糕。

当前模型使用来自 scikit-learn 的 32x32x32 MLPRegressor,使用 relu 作为激活函数和 adam 求解器。

奖励函数如下:

  • 死亡奖励 = -100.0
  • 活着的奖励 = -10.0
  • 苹果奖励 = 100.0

从每个状态中提取的特征如下:

  1. 蛇头前面是什么(苹果,空,蛇)
  2. 蛇头左边是什么
  3. 蛇头右边是什么
  4. 头到苹果的欧几里得距离
  5. 从头到苹果的方向以弧度测量
  6. 蛇的长度

一个情节包括蛇一直玩直到它死,我还在训练一个概率 epsilon,它表示如果不满足,蛇将采取随机行动的概率,蛇将采取神经网络所采取的行动给出最大的分数,这个 epsilon 概率在每次迭代后逐渐递减。

情节是由回归者以相反的顺序一次学习一个状态动作。

然而,神经网络无法过于接近 q 函数,无论蛇对任何状态采取相同的动作多少次迭代。

我尝试过的事情:

  • 改变神经网络的结构
  • 改变奖励函数
  • 更改提取的特征,我什至尝试将整个地图传递给网络

代码(python):https ://pastebin.com/57qLbjQZ

2个回答

这里有两个问题。

  1. 您发布的代码不会间接训练您的多层感知器。相反,它有效地重新随机化权重,然后每次在第 35 和 54 行调用 .fit() 时重新拟合模型。使用 SKLearn 的 _fit() 函数和 Incremental=true 可能会解决这个问题,或者你可以打包将数据分成更大的批次,然后在几集之后离线训练。

  2. 您的奖励功能使活着很痛苦,并且没有通过苹果提供足够的好处来弥补这一点。有 100 个方块可以包含苹果。平均而言,苹果会在每个方向上从蛇产生大约 5 个方格。由于蛇不能沿对角线移动,因此需要移动 10 次(左/右 5 次,上/下 5 次)。这意味着如果蛇完美地发挥,那么平均而言,它可能能够获得零奖励。在实践中,蛇不会完美地发挥作用。这意味着生活会产生负面的预期回报。

相反,如果蛇可以杀死自己,它将停止获得负奖励。您使用的奖励功能通过变得足够大以尽可能快地撞到自己的尾巴来最大化。我认为这条蛇在吃了 3 个苹果后应该能够做到这一点。寻找食物有一些动机,但与尽快击中自己的尾巴相比并不多。

如果你想让蛇学会寻找食物,把活着的惩罚降低到-1,甚至-0.1。蛇会对食物发出的信号反应更快。

假设你是蛇。

眼前是空的。你的左边是空的。你的权利是空的。到苹果的距离是4。苹果就在你面前。你的长度是20。

你能用这个输入做出一个好的决定吗?你会朝哪个方向去获得最高分?

根据给定的输入,您可以直接进入苹果。但这可能是失败并导致死亡。

恕我直言,输入状态根本不足以做出好的决定,因为

a) 蛇甚至不知道它当前向哪个方向移动。

b) 蛇不知道自己的身体在哪里

情况可能如下所示:

蛇的情况

蛇离开这个陷阱的唯一方法是如箭头所示,以便尾巴及时释放出路。您的神经网络没有做出该决定的必要输入。