好的,所以我创建了一个神经网络Q学习器,使用与DeepMind的Atari算法相同的想法(除了我给原始数据而不是图片(还))。
神经网络构建:
9个输入(0表示空白点,1表示“X”,-1表示“O”)
1个隐藏层,有9-50个神经元(尝试不同大小,激活函数sigmoid)
9个输出(每个动作1个,输出Q值,激活函数sigmoid)
由于渐变检查和大量测试,我100%确信网络是正确构建的。
问参数:
问题
如果我在已经占据的位置移动时给予-1奖励,我的所有Q值都会变为零。如果我不这样做,网络不知道它不应该移动到已经占用的地方,并且似乎学习任意的Q值。我的错误似乎也没有缩小。
无效的解决方案
我试图将奖励改为(0,0.5,1)和(0,1),但仍然没有学习。
我试图将状态显示为0表示空,0表示O,1表示X,但不起作用。
我试图在移动之后立即给出下一个状态,但它没有帮助。
我尝试过Adam和vanilla,但结果仍然相同。
GitHub项目:https://github.com/Dopet/tic-tac-toe(对不起 丑陋的代码主要是由于所有这些重构的代码,这应该是很容易测试,看看算法是否有效)
要点:
答案 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'以同样的方式消极地移动。如果比赛结果平局,你可以奖励两名球员获得较少的积极奖励。
你最终可能会积极奖励次优最佳动作,反之亦然,但在大量游戏中,事情对你有利。