我正在尝试通过使用 Q-Learning + 前馈神经网络作为 q 函数逼近器来导航* n gridworld 域中的代理。基本上,代理应该找到到达某个终端目标位置的最佳/最短方式(+10 奖励)。代理采取的每一步都会获得 -1 奖励。在网格世界中,代理也应该避免一些位置(-10 奖励,终端状态)。
到目前为止,我实现了一个 Q 学习算法,它将所有 Q 值保存在 Q 表中,并且代理表现良好。在下一步中,我想用神经网络替换 Q 表,在代理的每一步之后在线训练。我尝试了一个带有一个隐藏层和四个输出的前馈神经网络,代表网格世界(北、南、东、西)中可能动作的 Q 值。作为输入,我使用了一个 nxn 零矩阵,它在代理的当前位置有一个“1”。
为了达到我的目标,我试图从头开始解决问题:
使用标准 Q-Learning 探索网格世界,并在 Q-Learning 完成后使用 Q-map 作为网络的训练数据 --> 工作正常
使用 Q-Learning 并提供 Q-map 的更新作为 NN (batchSize = 1) 的训练数据 --> 效果很好
用 NN 完全替换 Q-Map。(这就是重点,当它变得有趣时!)
-> FIRST MAP:4 x 4 如上所述,我有 16 个“离散”输入,4 个输出,并且它在隐藏层中与 8 个神经元(relu)一起工作得很好(学习率:0.05)。我使用了一个带有 epsilon 的贪婪策略,在 60 集内从 1 减少到 0.1。 此处显示了测试场景。将标准 qlearning 与 q-map 和“神经”qlearning 之间的性能进行比较(在这种情况下,我使用了 8 个神经元和不同的 dropOut 率)。
总结一下:神经 Q-learning 对小网格效果很好,性能还可以而且可靠。
-> 更大的地图:10 x 10
现在我尝试将神经网络用于更大的地图。起初我尝试了这个简单的案例。
在我的例子中,神经网络如下所示:100 个输入;4个输出;一个隐藏层中大约有 30 个神经元(relu);我再次对贪婪策略使用了递减的探索因子;超过 200 集学习率从 0.1 降低到 0.015 以增加稳定性。
首先,我遇到了由离散输入向量引起的单个位置之间的收敛和插值问题。为了解决这个问题,我在向量中添加了一些相邻位置,其值取决于到当前位置的距离。这极大地改善了学习,政策也变得更好。上图显示了 24 个神经元的性能。
总结:简单的情况是由网络解决的,但只是需要大量的参数调整(神经元数量、探索因子、学习率)和特殊的输入变换。
现在这是我仍未解决的问题/问题:
(1) 我的网络能够在 10 x 10 的地图中解决非常简单的案例和示例,但由于问题变得有点复杂,它失败了。在很可能失败的情况下,网络没有任何变化来找到正确的策略。在这种情况下,我对任何可以提高性能的想法持开放态度。
(2) 有没有更聪明的方法来转换网络的输入向量?我敢肯定,一方面将相邻位置添加到输入向量可以改善 q 值在地图上的插值,但另一方面会使训练网络的特殊/重要位置变得更加困难。我已经在早期尝试了标准笛卡尔二维输入(x/y),但失败了。
(3) 除了具有反向传播的前馈网络之外,是否还有另一种网络类型,通常使用 q 函数近似产生更好的结果?您是否看过项目,其中 FF-nn 在更大的地图上表现良好?