为乒乓球游戏的神经网络寻找合适的参数
Finding the right parameters for neural network for pong-game
我在为 Pong 游戏实施深度神经网络时遇到了一些问题,因为无论我更改哪个参数,我的网络总是发散。
我拿了一个 Pong-Game 并实现了一个基于 theano/lasagne 的深度学习算法,该算法基于 Google 的 Deepmind 著名的自然论文。
我要的是:
我不想向网络提供像素数据,而是想连续 4 帧输入球的 x 和 y 位置以及球拍的 y 位置。所以我总共得到了12个输入。
我只想奖励一个回合的命中、失败和胜利。
使用此配置,网络不会收敛,我的代理无法玩游戏。相反,桨直接驱动到顶部或底部或重复相同的模式。所以我想我试着让代理更容易一点并添加一些信息。
我做了什么:
状态:
- 球的 x 位置(-1 到 1)
- 球的 y 位置(-1 到 1)
- 球的归一化 x 速度
- 球的归一化 y 速度
- 桨的 y 位置(-1 到 1)
对于 4 个连续帧,我得到的总输入为 20。
奖励:
- +10 如果球拍击中球
- +100 如果特工赢了回合
- -100 如果特工输了回合
- -5 到 0 为球的预测结束位置(y 位置)和桨的当前 y 位置之间的距离
- +20 如果球的预测结束位置在球拍的当前范围内(命中是可预见的)
- -5 如果球位于球拍后面(不再可能击中)
使用此配置,网络仍然存在分歧。我试着研究学习率(0.1 到 0.00001)、隐藏层的节点(5 到 500)、隐藏层的数量(1 到 4)、批量累加器(总和或平均值)、更新规则(rmsprop 或 Deepminds rmsprop)。
所有这些都没有导致令人满意的解决方案。损失平均值的图表大部分看起来像 this。
您可以下载我当前版本的实现here
如果有任何提示,我将不胜感激:)
小梨
现在重复我在评论中的建议作为答案,以便以后访问此页面的其他人更容易看到(首先作为评论发布,因为我不是 100% 确定它是解决方案):
减少位于(或至少接近)[0.0, 1.0] 或 [-1.0, 1.0] 区间内的奖励幅度有助于网络更快地收敛。
以这种方式改变奖励值(简单地将它们全部除以一个数字,使它们位于更小的区间内)不会改变网络在理论上能够学习的内容。该网络还可以通过在整个网络中找到更大的权重来简单地学习具有更大奖励的相同概念。
但是,学习如此大的权重通常需要更多时间。这样做的主要原因是权重通常被初始化为接近于 0 的随机值,因此通过训练将这些值更改为较大的值需要花费大量时间。由于权重被初始化为较小的值(通常),并且它们与最佳权重值相差甚远,这也意味着存在局部(not 的风险增加一个全局的)最小值到最佳权重值的过程中,它可能会陷入其中。
对于较低的奖励值,最佳权重值的幅度也可能较低。这意味着初始化为小随机值的权重已经更有可能接近其最佳值。这会导致更短的训练时间(非正式地说,减少 "distance" 的旅行),并降低沿途遇到局部最小值而陷入困境的风险。
我在为 Pong 游戏实施深度神经网络时遇到了一些问题,因为无论我更改哪个参数,我的网络总是发散。 我拿了一个 Pong-Game 并实现了一个基于 theano/lasagne 的深度学习算法,该算法基于 Google 的 Deepmind 著名的自然论文。
我要的是:
我不想向网络提供像素数据,而是想连续 4 帧输入球的 x 和 y 位置以及球拍的 y 位置。所以我总共得到了12个输入。
我只想奖励一个回合的命中、失败和胜利。
使用此配置,网络不会收敛,我的代理无法玩游戏。相反,桨直接驱动到顶部或底部或重复相同的模式。所以我想我试着让代理更容易一点并添加一些信息。
我做了什么:
状态:
- 球的 x 位置(-1 到 1)
- 球的 y 位置(-1 到 1)
- 球的归一化 x 速度
- 球的归一化 y 速度
- 桨的 y 位置(-1 到 1)
对于 4 个连续帧,我得到的总输入为 20。
奖励:
- +10 如果球拍击中球
- +100 如果特工赢了回合
- -100 如果特工输了回合
- -5 到 0 为球的预测结束位置(y 位置)和桨的当前 y 位置之间的距离
- +20 如果球的预测结束位置在球拍的当前范围内(命中是可预见的)
- -5 如果球位于球拍后面(不再可能击中)
使用此配置,网络仍然存在分歧。我试着研究学习率(0.1 到 0.00001)、隐藏层的节点(5 到 500)、隐藏层的数量(1 到 4)、批量累加器(总和或平均值)、更新规则(rmsprop 或 Deepminds rmsprop)。
所有这些都没有导致令人满意的解决方案。损失平均值的图表大部分看起来像 this。
您可以下载我当前版本的实现here
如果有任何提示,我将不胜感激:)
小梨
现在重复我在评论中的建议作为答案,以便以后访问此页面的其他人更容易看到(首先作为评论发布,因为我不是 100% 确定它是解决方案):
减少位于(或至少接近)[0.0, 1.0] 或 [-1.0, 1.0] 区间内的奖励幅度有助于网络更快地收敛。
以这种方式改变奖励值(简单地将它们全部除以一个数字,使它们位于更小的区间内)不会改变网络在理论上能够学习的内容。该网络还可以通过在整个网络中找到更大的权重来简单地学习具有更大奖励的相同概念。
但是,学习如此大的权重通常需要更多时间。这样做的主要原因是权重通常被初始化为接近于 0 的随机值,因此通过训练将这些值更改为较大的值需要花费大量时间。由于权重被初始化为较小的值(通常),并且它们与最佳权重值相差甚远,这也意味着存在局部(not 的风险增加一个全局的)最小值到最佳权重值的过程中,它可能会陷入其中。
对于较低的奖励值,最佳权重值的幅度也可能较低。这意味着初始化为小随机值的权重已经更有可能接近其最佳值。这会导致更短的训练时间(非正式地说,减少 "distance" 的旅行),并降低沿途遇到局部最小值而陷入困境的风险。