当前位置: 首页 > 知识库问答 >
问题:

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

呼延运恒
2023-03-14

球门

我对机器学习相当陌生,经过一些在线教育后,这是我的第一个真正的项目。这是一个叫做Ouril的游戏,在这个游戏中,你和你的对手各有六个“房子”,里面有四块起始石头。你轮流玩一个房子和分配它的石头,这可能会让你获得对手的石头。你赢得了25块石头。

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

安装程序

我构建了一些非AI机器人(random-bot,max-bot,min-max-bot),并让它们互相玩许多游戏。游戏日志每个玩的移动到一个json文件中。我使用记录的移动来训练带有 Tensorflow 后端的 Keras 模型。该模型由一些具有 sigmoid 激活函数的密集层组成,因为我希望预测值介于 -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'])

培训用数据

游戏中的每一步棋都是这样记录的:< code>[4,4,4,4,4,4,4,4,4,4,4,5,0,0,0]前12个字段是每家的石头数,然后是这步棋中正在玩的那家,然后是我和对手的当前得分,最后是这步棋的得分。

起初,我将一次移动的得分简单地定义为这次移动所捕获的石头数量。我根据这些数据对模型进行了训练,得到了大约0.7的准确度。我确信这一点可以得到改善,但有了这种数据,模型的预测结果将与我已经拥有的最大机器人一样好。

所以我让分数取决于玩家的下一步行动。如果玩家在一次移动中拿下 4 个房子,他之前的三个分数增加 2、1 和 0.5,而对手最后的分数以同样的方式下降。

问题

有了这个新的训练数据,我只能得到0.1的准确率。

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

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

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

谢谢

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

共有1个答案

邢嘉祯
2023-03-14

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

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

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

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

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

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

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

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

你还提到了每一次移动都会分配石头,但我不知道你是如何对石头的分配进行编码的。

我会考虑以下编码:

[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机器人。你可以只根据游戏规则(很少或不需要战略知识)来构建它,它应该比你现有的更强大,应该为你的价值网络项目提供更好的训练数据。

 类似资料:
  • 监督学习的目标是建立一个学习过程,将预测结果与“训练数据”(即输入数据)的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率,包括分类、回归等问题。而常用算法包括线性回归、决策树、贝叶斯分类、最小二乘回归、逻辑回归、支持向量机、神经网络等。 监督学习的整个训练流程如下图所示

  • 本文向大家介绍监督学习和无监督学习的区别相关面试题,主要包含被问及监督学习和无监督学习的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 输入的数据有标签则为监督学习,输入数据无标签为非监督学习。

  • 我的程序应该要求用户猜测 0 到 100 之间的数字,但我似乎无法正确输出。目前,如果用户数大于随机数,它会打印出无限数量的“您的数字太高”。此外,如果第一个 UserGuess 很低,那么以下所有数字都将具有相同的提示:(“您的数字太低”),尽管它们实际上大于随机数。我不知道我做错了什么。任何帮助将不胜感激。谢谢!

  • 概率图模型 规则学习 聚类 集成学习

  • 1.1. 广义线性模型 1.1.1. 普通最小二乘法 1.1.1.1. 普通最小二乘法复杂度 1.1.2. 岭回归 1.1.2.1. 岭回归的复杂度 1.1.2.2. 设置正则化参数:广义交叉验证 1.1.3. Lasso 1.1.3.1. 设置正则化参数 1.1.3.1.1. 使用交叉验证 1.1.3.1.2. 基于信息标准的模型选择 1.1.3.1.3. 与 SVM 的正则化参数的比较 1.1

  • 监督学习的两大任务:回归和分类。线性回归,损失函数和梯度下降。 通过在数字广告上花费更多的钱,我们能挣多少钱?这个贷款的申请人是否能偿还贷款?股市明天会发生什么? 在监督学习的问题中,我们以一个数据集开始,它包含训练样本,每个样本带有关联的正确标签。例如,学习分类手写数字的时候,监督学习算法接受数千张手写体数字的图片,以及标签,它们包含每个图片表示的正确数字。算法会学习图像和关联的数值的关系。之后