为什么我的神经网络Q-learner没有学习tic-tac-toe

时间:2016-11-30 19:50:31

标签: machine-learning neural-network deep-learning reinforcement-learning q-learning

好的,所以我创建了一个神经网络Q学习器,使用与DeepMind的Atari算法相同的想法(除了我给原始数据而不是图片(还))。

神经网络构建:

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

  • 1个隐藏层,有9-50个神经元(尝试不同大小,激活函数sigmoid)

  • 9个输出(每个动作1个,输出Q值,激活函数sigmoid)

  • MSE损失功能
  • Adam backprop

由于渐变检查和大量测试,我100%确信网络是正确构建的。

问参数:

  • -1丢失游戏的奖励
  • -1奖励,如果试图移动已占用点(例如X已经在玩家O试图放置他的“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]

问题

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

无效的解决方案

  • 我试图将奖励改为(0,0.5,1)和(0,1),但仍然没有学习。

  • 我试图将状态显示为0表示空,0表示O,1表示X,但不起作用。

  • 我试图在移动之后立即给出下一个状态,但它没有帮助。

  • 我尝试过Adam和vanilla,但结果仍然相同。

  • 我尝试过重放记忆和随机梯度下降的批次,但仍然是相同的
  • 将sigmoid改为ReLU但没有帮助。
  • 我现在不记得的各种事情
  

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

要点:

  • TicTac类具有游戏本身(使用抽象Game类中的模板方法模式制作)
  • NeuralNetwork类将一些数据记录到当前目录中名为MyLogFile.log的文件
  • Block和Combo类仅用于创建获胜情境
  • jblas-1.2.4.jar包含DoubleMatrix库

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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

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

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

相关问题