Machine learning 为什么';我的神经网络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已经在玩

好的,我用与DeepMind的Atari算法相同的思想创建了一个神经网络Q-learner(除了我给出的是原始数据,而不是图片)

神经网络构建:

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

  • 1个具有9-50个神经元的隐藏层(尝试不同大小,激活功能为乙状结肠)

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

  • 均方误差损失函数
  • 亚当背柱
由于梯度检查和大量测试,我100%相信网络是正确构建的

Q参数:

  • -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]
问题

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

无效的解决方案

  • 我曾尝试将奖励更改为(0,0.5,1)和(0,1),但它仍然无法学习

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

  • 我曾试图在采取行动后立即宣布下一个州,但没有起到任何作用

  • 我试过亚当和香草背道具,但效果还是一样

  • 我已经尝试过从回放记忆和随机梯度下降批量,但仍然是一样的
  • 将sigmoid改为ReLU,但没有帮助
  • 所有我现在想不起来的事情
GitHub中的项目:(抱歉 难看的代码主要是由于所有这些代码的重构,而且这应该是很容易测试的,以查看算法是否有效)

要点:

  • 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奖励它时总是有错误,因为输出永远不能小于零。这导致值变为零,因为它试图修复错误,但无法修复错误后您又如何处理