Machine learning 为什么';我的神经网络Q-learner不';我学不了抽搐
好的,我用与DeepMind的Atari算法相同的思想创建了一个神经网络Q-learner(除了我给出的是原始数据,而不是图片) 神经网络构建:Machine learning 为什么';我的神经网络Q-learner不';我学不了抽搐,machine-learning,neural-network,deep-learning,reinforcement-learning,q-learning,Machine Learning,Neural Network,Deep Learning,Reinforcement Learning,Q Learning,好的,我用与DeepMind的Atari算法相同的思想创建了一个神经网络Q-learner(除了我给出的是原始数据,而不是图片) 神经网络构建: 9个输入(0表示空白点,1表示“X”,1表示“O”) 1个具有9-50个神经元的隐藏层(尝试不同大小,激活功能为乙状结肠) 9个输出(每个动作1个,输出Q值,激活功能sigmoid) 均方误差损失函数 亚当背柱 由于梯度检查和大量测试,我100%相信网络是正确构建的 Q参数: -1.输掉比赛的奖励 -如果试图移动到已经占据的位置(例如,X已经在玩
- 9个输入(0表示空白点,1表示“X”,1表示“O”)
- 1个具有9-50个神经元的隐藏层(尝试不同大小,激活功能为乙状结肠)
- 9个输出(每个动作1个,输出Q值,激活功能sigmoid)
- 均方误差损失函数
- 亚当背柱
- -1.输掉比赛的奖励
- -如果试图移动到已经占据的位置(例如,X已经在玩家O试图放置“O”的位置),则奖励1
- 抽奖0元
- 0移动奖励,不会导致终端状态
- +赢得比赛的1份奖励
- 下一个状态(在s、a、r、s中)是你自己和你的对手移动后的状态。例如,空板,玩家X第一次转弯,并将“X”放在左上角。然后玩家O将“O”放在右上角。那么s,a,r,s'将是s=[0,0,0,0,0,0,0],a=0,r=0,s'=[1,0,-1,0,0,0,0,0]
- 我曾尝试将奖励更改为(0,0.5,1)和(0,1),但它仍然无法学习
- 我试图将状态表示为0表示为空,0.5表示为O,1表示为X,但不起作用
- 我曾试图在采取行动后立即宣布下一个州,但没有起到任何作用
- 我试过亚当和香草背道具,但效果还是一样
- 我已经尝试过从回放记忆和随机梯度下降批量,但仍然是一样的
- 将sigmoid改为ReLU,但没有帮助
- 所有我现在想不起来的事情
- TicTac类拥有游戏本身(使用抽象游戏类中的模板方法模式制作)
- NeuralNetwork类将一些数据记录到当前目录中名为MyLogFile.log的文件中
- Block和Combo类仅用于创建获胜情况
- jblas-1.2.4.jar包含DoubleMatrix库
- 我认为你的公式是错误的。您正在使用NN为下一个状态提供的最大值更新状态的值
expectedValue[i]=replay.getReward()+gamma*targetNetwork.forwardPropagate(replay.getNextState()).max();
这适用于单人游戏设置。但由于tic tac toe是一个2人游戏,“下一个状态”(对手)的值越高,对当前状态的值就越不利
您可以将最大值向前移动2个状态(使用NN预测向前移动2个状态),但这也不起作用,因为您假设您所做的第二步是最佳的,并且会导致大量错误的更新
我建议您在传播值不太清楚的情况下使用这种设置。在这种方法中,你玩随机游戏(两个玩家都随机移动),并说如果玩家“O”赢了,你将积极奖励所有“O”移动(通过折扣因子减少,即最后一步获得更多奖励,然后奖励减少一个因子),并以同样的方式消极奖励“X”移动。如果游戏结果是平局,你可以用较少的正面奖励奖励两名玩家
你可能会积极地奖励次优的动作,反之亦然,但在很多游戏中,事情都对你有利 这是一个奖励/从输出层移除激活功能的问题。大多数时候我的奖励是[-1,1],我的输出层激活函数是从[0,1]开始的sigmoid。这导致网络在用-1奖励它时总是有错误,因为输出永远不能小于零。这导致值变为零,因为它试图修复错误,但无法就目前而言,这篇文章非常出色。问题是(a)我认为你的方法没有任何错误;(b) 您没有提供代码来重现错误。我已将项目添加到GitHub。请询问您是否有任何不清楚的地方!在这里适用。我没有什么可以从中删除的。它只包含tic-tac-toe和我的AI。两个都是分开包装的。如果有人感兴趣,我还包括测试。问题所在的文件:TicTac,其中包含游戏;NeuralNetwork,包含神经网络和NeuralQLearner,NeuralQLearner使用神经网络提供Q学习。不,我的直觉是问题更基本,在配置参数的某个地方。如果你真的进入了一个正确的向前-向后模式,你应该看到一些比完全拒绝学习更好的东西。这不应该是一个问题,因为我的下一个状态是你自己和你的对手移动后的状态(我的意思见上面的Q参数部分)。但我真的让它起作用了。这是一个奖励/从输出层移除激活功能的问题。大多数时候我的奖励是[-1,1],我的输出层激活函数是从[0,1]开始的sigmoid。这导致网络在用-1奖励它时总是有错误,因为输出永远不能小于零。这导致值变为零,因为它试图修复错误,但无法修复错误后您又如何处理