我正在玩机器学习.特别是Q-Learning,你有一个状态和行动,并根据网络的运作情况给予奖励.
现在对于初学者来说,我为自己设定了一个简单的目标:训练一个网络,以便为井字游戏(与随机对手相比)发出有效的动作.我的问题是,网络根本不会学习,甚至会随着时间的推移而变得更糟.
我做的第一件事就是与火炬接触以及深入的q学习模块:https://github.com/blakeMilner/DeepQLearning.
然后我写了一个简单的井字游戏,随机玩家与神经网络竞争并将其插入到此样本https://github.com/blakeMilner/DeepQLearning/blob/master/test.lua的代码中.网络的输出由9个节点组成,用于设置相应的小区.
如果网络选择空单元格(其中没有X或O),则移动有效.根据这个,我给予积极的奖励(如果网络选择空单元格)和负面奖励(如果网络选择一个被占用的单元格).
问题是它似乎永远不会学习.我尝试了很多变化:
>将tic-tac-toe字段映射为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定义的简单网络结构是否对此问题过于简单?
>我是不是太急躁了,不得不训练更多的迭代?
谢谢,
-Matthias
最佳答案 马蒂亚斯,
看来你正在使用一个输出节点? “前向步骤中网络的输出是1到9之间的数字”.如果是这样,那么我相信这就是问题所在.我没有一个输出节点,而是将其视为分类问题,并且有九个输出节点对应于每个电路板位置.然后将这些节点的argmax作为预测的移动.这就是设置Go游戏的网络(有361个输出节点,每个节点代表棋盘上的交叉点).
希望这可以帮助!