【发布时间】:2017-02-28 23:24:36
【问题描述】:
我用 C++ 制作了一个简单的 Tron 游戏和一个带有一个隐藏层的 MLP。我已经在这个神经网络中实现了 Q-learning,但是,它并没有导致代理随着时间的推移赢得更多的比赛(即使在 100 万场比赛之后)。我将尝试在文本中解释我所做的事情,希望有人能发现可能导致此问题的错误。
在每个州都有四种可能的移动方式(北、东、南、西),奖励在游戏结束时进行(-1 为输,0 为平局,1 为赢)。
我初始化了 4 个 MLP,一个用于每个可能的动作,有 100 个输入节点(整个游戏网格 10x10),如果玩家本身在那里,每个点为 1,如果该点为空,则为 0,如果对手为 -1已经到过这一点。然后有 50 个隐藏节点和 1 个输出节点(我也尝试过一个有 4 个输出节点的网络,但这也无济于事)。权重在 -0.5 和 0.5 之间随机选择
在每个 epoch,我都会使用随机放置在网格中的 2 个代理初始化游戏环境。然后我在while循环中运行游戏,直到游戏结束,然后重置游戏环境。在这个 while 循环中,我执行以下操作。
- 我向 MLP 提供当前状态并确定最高 Q 值并以 90% 的几率(10% 随机移动)去那里。 Q 值是使用 sigmoid 或 RELU 激活函数确定的(我都尝试过)。
- 然后我在新状态下计算 4 个 Q 值,并使用它来训练我的第一步的网络,目标如下:Target = reward + gamma*(maxQnextState)。那么误差 = Target - qValue 在之前的状态下计算。
- 我使用反向传播和 sigmoid 函数的导数以及高学习率和动量项来反向传播误差。
似乎我的 qValue 要么非常低(按 0.0001 的顺序),要么非常接近 1 (0.999)。如果我查看每 10.000 场比赛的误差项,它似乎并没有减少。
我从一个可以学习 XOR 函数的 MLP 开始,现在将其用于 Q-learning。也许 XOR 案例中的一些基本假设不同,导致 Q-learning 出现问题?
或者也许是稀疏的输入(0、1 或 -1 的 100 倍)导致无法学习?
非常感谢您的建议!
【问题讨论】:
-
解决方案是使用线性激活函数和低学习率 (0,01)。
标签: c++ neural-network reinforcement-learning