好吧,所以我创建了一个神经网络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库
这个帖子是非常好的,只要它去。问题是(a)我的方法没有看到任何错误; (b)您没有提供代码来重现错误。 – Prune
我将项目添加到GitHub。请问你有什么不清楚的地方! https://github.com/Dopet/tic-tac-toe – Dope
[最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。 – Prune