【发布时间】: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