Python 随机博弈数据的监督学习

Python 随机博弈数据的监督学习,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,目标 我对机器学习相当陌生,经过一些在线教育,这是我第一个真正的项目。这是一场名为Ouril的游戏,你和你的对手各有六个“房子”,里面有四个起跑石。你交替地玩一个房子并分发它的石头,这可能会导致你捕获对手的石头。您可以通过捕获25块石头来获胜 这个项目的目标是有一个训练有素的功能,在当前游戏状态下预测一个动作有多好,这样机器人就可以选择预测最好的动作并进行游戏 设置 我构建了一些非人工智能机器人(随机机器人、最大机器人、最小-最大机器人),并让它们互相玩很多游戏。游戏会将每一个玩过的动作记录到一

目标

我对机器学习相当陌生,经过一些在线教育,这是我第一个真正的项目。这是一场名为Ouril的游戏,你和你的对手各有六个“房子”,里面有四个起跑石。你交替地玩一个房子并分发它的石头,这可能会导致你捕获对手的石头。您可以通过捕获25块石头来获胜

这个项目的目标是有一个训练有素的功能,在当前游戏状态下预测一个动作有多好,这样机器人就可以选择预测最好的动作并进行游戏

设置

我构建了一些非人工智能机器人(随机机器人、最大机器人、最小-最大机器人),并让它们互相玩很多游戏。游戏会将每一个玩过的动作记录到一个json文件中。我使用记录的移动来训练带有Tensorflow后端的Keras模型。由于我希望预测值介于-1和1之间,因此该模型由一些具有sigmoid激活函数的致密层组成

model = Sequential()
model.add(Dense(12, input_shape=(15,), init='uniform', activation='sigmoid'))
model.add(Dense(12, init='uniform', activation='sigmoid'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
培训数据

游戏中的每一步都是这样记录的:
[4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,0,0]
前12个字段是每家每户的石头数量,然后是这一步中玩的房子,然后是我和对手的当前分数,最后是这一步的分数

起初,我把一个招式的得分定义为这个招式捕获的石头数量。我根据这些数据对模型进行了训练,精度达到了0.7左右。我相信这是可以改进的,但有了这样的数据,模型的最高预测将与我已经拥有的最大机器人一样好

所以我让比分取决于球员的下一步动作。如果玩家在一次移动中获得4个房子,他之前的三个得分分别增加2、1和0.5,而对手最后的得分则以同样的方式减少

问题

有了这个新的训练数据,我的准确度可能只有0.1

我认为这是因为新数据更加同质(分数更接近于0),也因为在这些数据中,同一步可能有许多不同的分数

由于这是一个非常广泛的问题,以下是一些具体的问题:

  • 有没有更好的方法来表示我的数据中的分数
  • 我的模型中是否需要其他层?其他参数对它们有什么影响
  • 均方误差是这个问题的拟合损失函数吗
  • Keras是解决这个问题的错误工具吗(可能是线性回归?)
谢谢


资料来源:

这个项目的目标是要有一个训练有素的功能,预测 在当前游戏状态下,一个动作有多好,这样机器人就可以 选择预测最好的移动并播放它

一种方法是将游戏数据库中的每个移动作为输入示例,并使用游戏结果(+1或-1)作为每个示例的标签

这种方法的优点是,你不必尝试和设计有关移动的特征,例如它捕获了多少石头——这可能相关,也可能无关

缺点是,每一个单独的动作都是最终比赛结果的微弱预测,因为它可能相关也可能无关。为了平衡这一点,你需要大量的训练数据

另一个缺点是,你的机器人可能永远不会玩某些类型的动作,因此它们不会出现在你的训练集中。为了避免这个问题,你可能想给你的机器人玩的动作增加一些随机性。这是AlphaGo最新迭代中使用的方法

当然,您可以将这两种方法结合起来,并使用最终游戏结果作为您的训练标签,但也可以包括诸如捕获多少石头之类的功能。通过这种方式,模型可以自行决定这些特性的重要性

有没有更好的方法来表示我的数据中的分数

您当前的表示有一个大问题:您将移动的位置编码为房子的编号。你的神经网络将不知道如何正确解释这一点。您应该改为使用一个热编码

你还提到每一步都会分配石头,但我不知道你是如何编码石头的分布的

我会考虑下面的编码:

[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] # houses
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # move origin
[0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0] # move destinations / #of stones at each
[0, 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0] # capture locations / sizes
如果特定编码不代表合法移动,请原谅我-我不完全理解规则。希望你能明白这一点

您可以将这四个阵列用作一维卷积神经网络单输入中的通道。我相信CNN在这里的表现会更好,因为它更善于捕捉当地的结构

均方误差是这个问题的拟合损失函数吗

最后一点注意:你得到的准确度并不能很好地表明你的价值函数有多好。更重要的是,它如何对彼此的潜在移动进行评分。真正的测试是当你插入你的价值网络来评估移动时,你的机器人表现如何


<> > >编辑:最后一个注释:考虑建立一个机器人。你可以只根据游戏规则(很少或根本不需要战略知识)构建它,它应该比你拥有的强大得多,并且应该为你的价值网络项目提供更好的培训数据。

不清楚你想要预测什么。你说你想要[-1,1]中的输出,但后来听起来你好像在试图预测捕获的石头数量。你是对的,在我的第一次尝试中,我真的想预测捕获的石头数量,因此可能sigmoid没有用处。但最终目标是预测“我离获胜还有多远”,我想[-1,1]会是一个不错的选择。谢谢你快速而清晰的建议。我可以看出我甚至不需要自己尝试每一步得分,因为这是网络的工作。一个热的也只是r