【发布时间】:2017-04-15 06:47:38
【问题描述】:
好的,所以我创建了一个神经网络 Q-learner,使用与 DeepMind 的 Atari 算法相同的想法(除了我提供原始数据而不是图片(还))。
神经网络构建:
9 个输入(0 表示空白点,1 表示“X”,-1 表示“O”)
1 个隐藏层,9-50 个神经元(尝试不同大小,激活函数 sigmoid)
9 个输出(每个动作 1 个,输出 Q 值,激活函数 sigmoid)
- MSE 损失函数
- 亚当反向传播
由于梯度检查和大量测试,我 100% 确信网络是正确构建的。
Q 参数:
- -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.5 表示 O,1 表示 X,但没有成功。
我试图在移动后立即给出下一个状态,但没有帮助。
我尝试过使用 Adam 和 vanilla back prop,但结果仍然相同。
- 我尝试过使用重放内存和随机梯度下降中的批次,但还是一样
- 将 sigmoid 更改为 ReLU,但没有帮助。
- 各种我现在想不起来了
GitHub 中的项目:https://github.com/Dopet/tic-tac-toe(对不起 丑陋的代码主要是由于所有这些代码重构,而且这应该很容易测试以查看算法是否有效)
要点:
- TicTac 类拥有游戏本身(使用抽象 Game 类的模板方法模式制作)
- NeuralNetwork 类将一些数据记录到当前目录中名为 MyLogFile.log 的文件中
- Block 和 Combo 类仅用于创建获胜情况
- jblas-1.2.4.jar 包含 DoubleMatrix 库
【问题讨论】:
-
这个帖子非常好。问题是(a)我认为您的方法没有任何问题; (b) 您没有提供重现错误的代码。
-
我将项目添加到 GitHub。请问有什么不清楚的地方! github.com/Dopet/tic-tac-toe
-
没有什么我可以从中删除的。它只包含井字游戏和我的 AI。两者都在单独的包装中。如果有人感兴趣,我还包括测试。可能出现问题的文件:包含游戏的 TicTac; NeuralNetwork,包含神经网络和 NeuralQLearner,它使用 NeuralNetwork 提供 Q-learning。
-
老鼠。不,我的直觉是问题更基本,在配置参数的某个地方。如果你真的进入了一个适当的前后模式,你应该会看到比直接拒绝学习更好的东西。
标签: machine-learning neural-network deep-learning reinforcement-learning q-learning