gpt4 book ai didi

machine-learning - 为什么我的神经网络 Q-learner 不学习井字棋

转载 作者:行者123 更新时间:2023-11-30 09:10:18 24 4
gpt4 key购买 nike

好的,所以我使用与 DeepMind 的 Atari 算法相同的想法创建了一个神经网络 Q-learner(除了我提供原始数据而不是图片(还))。

神经网络构建:

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

  • 1 个隐藏层,包含 9-50 个神经元(尝试使用不同大小,激活函数 sigmoid)

  • 9 个输出(每个 Action 1 个,输出 Q 值,激活函数 sigmoid)

  • MSE 损失函数
  • Adam 反向传播

由于梯度检查和大量测试,我 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,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,但没有帮助。
  • 各种现在想不起来的事情

Project in GitHub: https://github.com/Dopet/tic-tac-toe (Sorry for ugly code mostly due to all of these refactorings of code, also this was supposed to be easy test to see if the algorithm works)

要点:

  • TicTac 类拥有游戏本身(使用抽象 Game 类的模板方法模式制作)
  • NeuralNetwork 类将一些数据记录到当前目录中名为 MyLogFile.log 的文件
  • Block 和 Combo 类仅用于创造获胜情况
  • jblas-1.2.4.jar 包含 DoubleMatrix 库

最佳答案

这是一个奖励/从输出层删除激活函数的问题。大多数时候我的奖励是 [-1, 1],而我的输出层激活函数是从 [0, 1] 开始的 sigmoid 函数。这导致网络在用 -1 奖励时总是出错,因为输出永远不会小于零。这导致值变为零,因为它尝试修复错误但无法修复

关于machine-learning - 为什么我的神经网络 Q-learner 不学习井字棋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40896951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com