我在实现一个深度神经网络用于Pong游戏时遇到了问题,因为无论我如何更改参数,我的网络总是发散。我采用了一个Pong游戏,并实现了一个基于Theano/Lasagne的深度Q学习算法,该算法基于Google Deepmind的著名自然论文。
我的需求:
我不想直接输入像素数据,而是希望输入球的x和y位置以及4个连续帧中 paddle的y位置。因此,我总共有12个输入。
我只想奖励击中球、输掉一局和赢得一局。
在这种配置下,网络并未收敛,我的代理也无法玩游戏。相反,paddle直接移动到顶部或底部,或者重复相同的模式。因此,我想尝试让代理更容易一些,增加一些信息。
我所做的:
状态:
- 球的x位置(-1到1)
- 球的y位置(-1到1)
- 球的归一化x速度
- 球的归一化y速度
- paddle的y位置(-1到1)
在4个连续帧下,我总共得到了20个输入。
奖励:
- 如果paddle击中球,奖励+10
- 如果代理赢得一局,奖励+100
- 如果代理输掉一局,奖励-100
- 根据球的预测最终位置(y位置)与paddle当前y位置之间的距离,奖励-5到0
- 如果球的预测最终位置在paddle的当前范围内(可以预见击中),奖励+20
- 如果球位于paddle后面(无法再击中),奖励-5
在这种配置下,网络仍然发散。我尝试调整学习率(0.1到0.00001)、隐藏层的节点数(5到500)、隐藏层的数量(1到4)、批量累加器(求和或平均)、更新规则(rmsprop或Deepmind的rmsprop)。
所有这些尝试都没有带来满意的解决方案。损失平均值的图表大多看起来像这样。您可以从这里下载我当前版本的实现
我将非常感激任何提示 🙂
Kaonashi
回答:
现在我将评论中的建议重复为答案,以便后来访问此页面的任何人都能更容易看到(最初作为评论发布,因为我不是100%确定这会是解决方案):
将奖励的幅度降低,使其位于(或至少接近)[0.0, 1.0]或[-1.0, 1.0]区间内,有助于网络更快地收敛。
以这种方式更改奖励值(简单地将所有奖励值除以一个数字,使其位于较小的区间内)理论上不会改变网络能够学习的内容。网络也可以通过在整个网络中找到更大的权重来学习相同的内容,但使用更大的奖励。
然而,学习这种大权重通常需要更多的时间。主要原因是权重通常被初始化为接近0的随机值,因此通过训练将这些值改为大值需要很多时间。因为权重通常被初始化为较小的值,并且它们离最优权重值还很远,这也意味着在达到最优权重值的过程中,存在陷入局部(不是全局)最小值的风险增加。
使用较低的奖励值,最优权重值的幅度也可能较低。这意味着初始化为小的随机值的权重已经更可能接近其最优值。这导致了更短的训练时间(非正式地说,减少了“距离”),以及在达到最优权重值的过程中陷入局部最小值的风险降低。