我在玩机器学习。尤其是 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 之间变化
- 对失败给予负奖励或只对成功给予奖励,不同的奖励值
没有任何效果:(
现在我有几个问题:
- 由于这是我第一次尝试 Q-Learning,我有什么根本上做错的吗?
- 哪些参数值得更改?“大脑”的东西有很多:https ://github.com/blakeMilner/DeepQLearning/blob/master/deepqlearn.lua#L57 。
- 隐藏节点的数量是多少?
- https://github.com/blakeMilner/DeepQLearning/blob/master/deepqlearn.lua#L116中定义的简单网络结构对于这个问题来说太简单了吗?
- 我是不是太不耐烦了,必须训练更多的迭代?
谢谢,
-马蒂亚斯