使用随机游戏数据进行监督学习

时间:2018-02-18 15:01:48

标签: python tensorflow machine-learning keras

目标

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

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

设置

我制作了一些非ai机器人(随机机器人,max-bot,min-max-bot)并让它们互相玩许多游戏。每个播放的游戏记录移动到json文件中。我使用记录的移动来训练带有Tensorflow后端的Keras模型。该模型由一些具有sigmoid激活函数的Dense Layer组成,因为我希望预测值介于-1和1之间。

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, 5, 0, 0, 0]前12个字段是每个房子里的石头数,然后就是这个动作中正在玩的房子,然后是我和对手的当前得分和最后是此举的得分。

起初,我将移动的得分定义为此移动捕获的石块的数量。我根据这些数据训练了模型,精度达到0.7左右。我相信这可以改进,但是对于这种数据,模型顶级预测将与我已经拥有的max-bot一样好。

所以我的分数取决于球员的下一步动作。如果玩家在移动中占用4个房屋,他之前的三个分数会增加2,1和0.5,而对手的最后分数会以同样的方式减少。

问题

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

我认为这是因为新数据更加同质(分数接近0),并且因为在这些数据中,同一行动可能会有许多不同的分数。

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

  • 有没有更好的方法来表示我的数据中的分数?
  • 我的模型中是否需要其他图层?其他参数呢?
  • mean_squared_error是否适用于此问题?
  • Keras是否是这个问题的错误工具(可能是线性回归?)

由于

来源:https://github.com/sra448/ouril-game/blob/master/learning/learn.py

1 个答案:

答案 0 :(得分:2)

  

这个项目的目标是拥有一个训练有素的预测功能   考虑到当前的游戏状态,移动是多么好,以便机器人可以   选择最佳预测动作并进行播放。

执行此操作的一种方法是将您在游戏数据库中播放的所有内容作为输入示例,并使用游戏结果(+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

如果特定编码不代表合法举措,请原谅我 - 我不完全理解这些规则。希望你能得到这个想法。

您可以将这四个数组用作1D卷积神经网络的单个输入中的通道。我相信CNN会在这里表现得更好,因为它更好地捕捉局部结构。

  

mean_squared_error是否适用于此问题?

最后一点:您获得的准确性并不是衡量您的价值功能有多好的重要指标。更重要的是它如何评估相对于彼此的潜在动作。真正的考验是当您插入价值网络以评估行动时,您的机器人的表现如何。

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