目标
我是机器学习的新手,经过一些在线教育之后,这是我的第一个实际项目。这是一个名为Ouril的游戏,其中您和您的对手各有六个带有四个起始石的“房子”。您交替玩房子并分发其石头,这可能会导致您捕获对手的石头。您将获得25块石头,从而赢得胜利。
该项目的目标是要有一个受过训练的功能,在给定当前游戏状态的情况下,预测动作的好坏,以便机器人可以选择最佳的预测动作并进行操作。
设定
我建立了一些非人工智能的机器人(随机机器人,最大机器人,最小最大机器人),并使它们彼此玩很多游戏。游戏将每个播放的动作记录到json文件中。我使用记录下来的动作来训练带有Tensorflow后端的Keras模型。该模型由一些具有S型激活函数的密集层组成,因为我希望预测值在-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)用作每个示例的标签。
这种方法的优点是,您不必尝试和设计有关移动的功能,例如捕获的石头数量,这可能相关也可能无关。
缺点是每个动作都无法预测最终比赛的结果,因为它可能相关,也可能无关。为了平衡这一点,您需要大量的训练数据。
另一个弱点是您的机器人可能永远不会玩某些类型的动作,因此它们不会出现在您的训练集中。为了避免出现此问题,您可能需要为机器人所执行的移动添加一些随机性。这是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在这里的表现会更好,因为它在捕获本地结构方面更胜一筹。
mean_squared_error是否适合此问题?
是。
最后一点:您获得的准确度并不是衡量您的价值函数有多好的指标。更重要的是,它如何对彼此相对的潜在移动进行评分。真正的测试是当您插入价值网络来评估移动时,机器人的性能如何。
编辑:最后一个最后的注释:考虑构建MCTS机器人。您可以仅根据游戏规则(很少或不需要策略知识)来构建它,它应该比您拥有的要强大得多,并且应该为您的价值网络项目提供更好的培训数据。