4

我在玩机器学习。尤其是 Q-Learning,你有一个状态和动作,并根据网络的表现给予奖励。

现在对于初学者来说,我给自己设定了一个简单的目标:训练一个网络,使它发出有效的井字游戏(对抗随机对手)动作作为动作。我的问题是网络根本没有学习,甚至随着时间的推移变得更糟。

我做的第一件事是接触torch 和一个深度q 学习模块:https ://github.com/blakeMilner/DeepQLearning 。

然后我编写了一个简单的井字游戏,其中一个随机玩家与神经网络竞争,并将其插入此示例https://github.com/blakeMilner/DeepQLearning/blob/master/test.lua的代码中。网络的输出由 9 个节点组成,用于设置相应的单元格。

如果网络选择了一个空单元格(其中没有 X 或 O),则移动是有效的。据此,我给予正奖励(如果网络选择空单元)和负奖励(如果网络选择被占用的单元)。

问题是它似乎永远学不会。我尝试了很多变化:

  • 将井字游戏字段映射为 9 个输入(0 = 单元格为空,1 = 玩家 1,2 = 玩家 2)或 27 个输入(例如,对于空单元格 0 [empty = 1, player1 = 0, player2 = 0 ])
  • 在 10 到 60 之间改变隐藏节点数
  • 尝试了多达 60k 次迭代
  • 学习率在 0.001 和 0.1 之间变化
  • 对失败给予负奖励或只对成功给予奖励,不同的奖励值

没有任何效果:(

现在我有几个问题:

  1. 由于这是我第一次尝试 Q-Learning,我有什么根本上做错的吗?
  2. 哪些参数值得更改?“大脑”的东西有很多:https ://github.com/blakeMilner/DeepQLearning/blob/master/deepqlearn.lua#L57 。
  3. 隐藏节点的数量是多少?
  4. https://github.com/blakeMilner/DeepQLearning/blob/master/deepqlearn.lua#L116中定义的简单网络结构对于这个问题来说太简单了吗?
  5. 我是不是太不耐烦了,必须训练更多的迭代?

谢谢,

-马蒂亚斯

4

1 回答 1

2

马蒂亚斯,

看来您正在使用一个输出节点?“前向步骤中网络的输出是 1 到 9 之间的数字”。如果是这样,那么我相信这就是问题所在。我不会有一个输出节点,而是将其视为一个分类问题,并有九个输出节点对应于每个棋盘位置。然后将这些节点的 argmax 作为预测的移动。这就是设置玩围棋游戏的网络的方式(有 361 个输出节点,每个节点代表棋盘上的一个交叉点)。

希望这可以帮助!

于 2016-02-12T00:28:03.693 回答