【问题标题】:Supervised learning with random-ish game data使用随机游戏数据进行监督学习
【发布时间】:2018-07-28 21:57:24
【问题描述】:

目标

我对机器学习还很陌生,经过一些在线教育,这是我第一个真正的项目。这是一个名为 Ouril 的游戏,你和你的对手各有六个“房子”,里面有四个起始石。您交替玩房子并分配其棋子,这可能会导致您捕获对手的棋子。你赢了 25 颗石头。

该项目的目标是在给定当前游戏状态的情况下,拥有一个经过训练的函数来预测移动的好坏,以便机器人能够选择预测的最佳移动并进行游戏。

设置

我构建了一些非 AI 机器人(random-bot、max-bot、min-max-bot)并让它们互相玩很多游戏。游戏将每个游戏的移动记录到一个 json 文件中。我使用记录的动作来训练带有 Tensorflow 后端的 Keras 模型。该模型由一些具有 sigmoid 激活函数的 Dense Layers 组成,因为我希望预测值介于 -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,1] 中的输出,但后来听起来你正在尝试预测捕获的石头数量。
  • 你是对的,在我第一次尝试时,我真的想预测捕获的石头的数量,因此可能 sigmoid 没有用。但最终目标是预测移动的“我离胜利还有多远”,我猜 [-1,1] 将是一个不错的范围

标签: python tensorflow machine-learning keras


【解决方案1】:

这个项目的目标是拥有一个训练有素的函数来预测 考虑到当前的游戏状态,一个动作有多好,这样机器人就可以 选择预测的最佳动作并播放它。

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

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

缺点是每个单独的动作对最终游戏结果的预测很弱,因为它可能相关,也可能不相关。为了平衡这一点,您需要大量的训练数据。

另一个弱点是您的机器人可能永远不会执行某些类型的动作,因此它们不会出现在您的训练集中。为避免此问题,您可能需要为机器人所玩的动作添加一些随机性。这是 AlphaGo 最新迭代中使用的方法。

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

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

您当前的表示存在一个大问题:您将移动的位置编码为房屋的编号。您的神经网络将不知道如何正确解释这一点。您应该改用 one-hot 编码。

你还提到每一步都会分配棋子,但我不明白你是如何编码棋子的分布的。

我会考虑以下编码:

[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 在这里会表现得更好,因为它更擅长捕捉局部结构。

mean_squared_error 是适合这个问题的损失函数吗?

是的。

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

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

【讨论】:

  • 感谢您快速明确的建议。我可以看到我什至不需要自己尝试得分,因为这是网络的工作。 One-hot 也是让我走上正轨的正确关键字,以及您对移动目的地和捕获位置进行编码的建议。我会尝试你的建议并报告:)
  • 不客气!这听起来像是一个大项目,祝你好运!
  • PS:也可以考虑使用蒙特卡洛树搜索。 MCTS 机器人可能会更强大,并且应该为您的价值网络项目提供更好的训练数据。
  • 因此,我按照您的建议对游戏室进行了一次热编码并扩展了数据,根据赢/输,分数仅为 -1 或 1。使用我的密集网络运行这些数据会产生大约 0.5 的准确度(这仍然是衡量网络“拟合”数据的程度,对吧?)。接下来我尝试使用 CNN。 MCTS 看起来也很有前途(而且很复杂:D)
  • 是的,准确度是衡量您是否适合的标准。由于只有两个结果,我假设它们具有相似的频率 0.5 准确度意味着你没有比随机猜测做得更好,不幸的是。
猜你喜欢
  • 2012-07-01
  • 2017-08-22
  • 2019-04-16
  • 2015-06-01
  • 2014-04-20
  • 2018-09-07
  • 2016-05-28
  • 2013-03-24
  • 2017-12-29
相关资源
最近更新 更多