1

好吧,所以我创建了一个神经网络Q-learner,使用与DeepMind的Atari算法相同的想法(除了我给出的原始数据不是图片(然而))。为什么我的神经网络Q-learning不学习井字游戏

神经网络的构建:

  • 9个输入(0代表空白点,1表示 “X”,-1 “O”)

  • 1隐藏层与9-50神经元(试图用不同的尺寸,激活函数乙状结肠)

  • 9输出(1每一个动作,输出Q值,激活函数乙状结肠)

  • MSE损失函数
  • 亚当backprop

我100%相信网络是正确建立,因为坡度的检查和大量的测试。

Q-参数:

  • -1奖励败局
  • -1的奖励,如果此举是试图已占点(例如,X已经在球员Ø试图把现场他的“O”)
  • 0奖励吸引
  • 0奖励移动,这不会导致终端状态
  • +1的奖励赢得比赛
  • 下一个状态(在s,a,r,s'中)是你自己和对手的移动之后的状态。例如。空板和选手X先转身并将“X”放在左上角。然后玩家O将“O”放在右上角。那么s,a,r,s'就是s = [0,0,0,0,0,0,0,0,0],a = 0,r = 0,s'= [1,0, - 1,0,0,0,0,0,0]

问题

我所有的Q值变为零,如果我给-1奖励时,由移动已经占据的位置。如果我不这样做,网络不知道它不应该移动到已经占用的地方,似乎学习任意的Q值。另外我的错误似乎并没有缩小。

解决方案没有奏效

  • 我曾试图改变奖励(0,0.5,1)和(0,1),但它仍然没有学会。

  • 我试图将空状态表示为0,对于O表示0.5,对于X表示1,但没有工作。

  • 我已经试图在移动完成后给出下一个状态,但它没有帮助。

  • 我已经尝试过与亚当和香草回道具,但仍然是相同的结果。

  • 我试过从重播内存和随机梯度下降的批次,但仍然相同
  • 将sigmoid更改为ReLU,但没有帮助。
  • 各种各样的事情我不记得在GitHub上现在

项目:https://github.com/Dopet/tic-tac-toe(对不起, 丑陋的代码主要是由于所有的这些代码的重构,这也应该是简单的测试看是否算法工作)

要点:

  • TicTac类有游戏本身(由û从歌唱比赛抽象类模板方法模式)
  • NeuralNetwork类记录一些数据文件被称为MyLogFile.log在当前目录
  • Block和组合类只是用来创造获奖情况
  • jblas-1.2.4。 jar包含DoubleMatrix库
+1

这个帖子是非常好的,只要它去。问题是(a)我的方法没有看到任何错误; (b)您没有提供代码来重现错误。 – Prune

+0

我将项目添加到GitHub。请问你有什么不清楚的地方! https://github.com/Dopet/tic-tac-toe – Dope

+0

[最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。 – Prune

回答

1

这是一个奖励/从输出层中删除激活功能的问题。大多数时候我有[-1,1]的奖励,我的输出层激活函数是sigmoid,它是从[0,1]开始的。这导致网络在用-1回报时总会有错误,因为输出永远不会小于零。这导致值为零,因为它试图修复错误,但它不能

0

我认为你的表述是错误的。您正在使用NN为下一个状态提供的最大值更新状态值。

expectedValue[i] = replay.getReward() + gamma *targetNetwork.forwardPropagate(replay.getNextState()).max();

这适用于单人游戏的设置。但是由于tic tac toe是双人游戏,“下一个状态”(对手)的较高值对当前状态的值不利。

您可以将最大值2个状态向前(使用NN预测2个状态向前),但是这也不能很好地工作,因为您假定您做出的第二个移动是最佳的并导致大量错误的更新。

我建议您使用policy gradients来进行传播值不太清晰的设置。在这种方法中,你玩随机游戏(两个玩家随机移动),并说如果玩家'O'赢得奖励你所有'O'移动积极(降低折扣因素,即最终行动获得更多的奖励,然后奖励减少一个因素)和奖励'X'以相同的方式消极地移动。如果游戏结果为平局,则可以用较低的积极回报奖励两个玩家。

你可能会最终奖励次优动作,反之亦然,但在大量的游戏中,事情对你有利。

+0

这应该不是问题,因为我的下一个状态是你自己和对手的移动之后的状态(参见上面的Q参数部分,例如我的意思)。但我确实得到了这个工作。这是从输出层奖励/去除激活功能的问题。大多数时候我有[-1,1]的奖励,我的输出层激活函数是sigmoid,它是从[0,1]开始的。 由于输出永远不会小于零,这导致网络在以-1回报时始终有错误。这导致值为零,因为它试图修复错误,但它不能 – Dope