强化学习:易于学习的状态表示

数据挖掘 强化学习
2022-02-10 22:40:22

我创建了一个简单的 OpenAI Gym 环境,其中包括:

  • x 和 y 在 [0.0, 1.0] 范围内的连续 2D 世界
  • 一只在世界上以恒定速度缓慢随机移动的兔子
  • 由代理人控制的“狼”。狼以恒定的速度移动
  • 动作是[左转一定角度,右转一定角度,什么都不做(继续直行)]
  • 状态是 [agent_x, agent_y, agent_bearing, rabbit_x, rabbit_y, rabbit_bearning]。轴承以弧度 [0.0, 2*pi] 为单位。所有值都是浮点数。
  • 捕捉兔子的奖励是 30(捕捉意味着智能体足够接近兔子)。-0.1 每个时间步没有抓到兔子。
  • 最大时间步长 260

我在解决这个环境时遇到了麻烦。即使经过长时间的训练,受过训练的智能体的分数也只比随机智能体略好一点。我已经尝试过深度 Q 学习(有经验回放,目标网络)强化(有和没有基线)和 PPO。

从概念上讲,问题很简单。代理只需要学会转向兔子。然而,在我看来,状态表示可能会使问题变得更加困难,因为六个变量中只有一个直接在智能体的控制之下,其中三个(兔子状态)是完全随机的。

状态代表通常会影响问题的难度吗?这是一个糟糕的州代表吗?是否有关于如何设计状态的经验法则?是否有助于重新制定国家,例如。到 [distance_from_agent_to_rabbit, angle_between_agent_and_rabbit]?

环境源代码在这里

1个回答

状态代表通常会影响问题的难度吗?

是的,因为神经网络更容易或更难学习输入特征与目标策略或价值函数之间的关系。

这是一个糟糕的州代表吗?

不,应该没问题,如果你有兴趣看到 RL 学习从笛卡尔坐标空间转换来解决这个问题,你应该能够直接将状态用作 ML 特征。

可以通过两种方式成为 NN 的更好特征:

  • 缩放以适应具有零均值和有限最大绝对值的范围。

  • 可以对其进行设计,使其特征包括要解决的问题的领域知识。

第一部分对您来说是可选的,但我认为方位值从缩放和居中受益一点。在更一般的情况下,即使状态描述已完成,您可能仍需要一个重新缩放它的步骤。

第二部分很棘手 - 是的,您可以找到更好的功能,但部分挑战是创建一个学习自己做这件事的代理。在这种情况下,您可能希望在不太容易设计“黄金”特征的情况下获得训练代理的经验,并专注于 RL 方法。

是否有关于如何设计状态的经验法则?

从概念上讲,状态表示问题可以分解为三个部分:

  • 观察原始观察并不总是状态表示的直接候选者。在一个玩具问题中,这通常被忽略,您从模拟中提供数据,这些数据看起来对状态很有用。在现实世界中,您可能会受到可检测的限制。

  • 状态描述除非您想探索 POMDP,否则您通常希望状态描述拥有Markov 属性这可能已经意味着将观察结果处理成其他东西 - 例如使用最近 3 个观察结果的历史记录、保持运行总计或计算差异。

  • 特征向量一旦您决定使用函数逼近来计算动作值或策略函数,那么您的输入需要符合函数逼近的工作方式。对于大多数函数逼近器,这意味着数值。对于神经网络,这意味着缩放输入以适应相对较小的范围。还有一个问题是使用该问题的领域知识进行特征工程。

这些设计步骤之间有一些重叠,区别有些人为。当您设计像您这样的测试问题时,您可能会发现将所有三个步骤组合成一个观察 = 状态 = 特征很简单。然而,在现实世界的问题中,每个步骤都可能需要一些考虑。

您还应该考虑要近似的函数的可能性质/形状。像 Q learning 这样的动作值方法需要逼近它们的值函数,而像 REINFORCE 和 PPO 这样的策略梯度方法需要逼近策略。有时输入特征和目标函数之间的映射很简单,如果幸运的话,一些直觉可以引导你弄清楚这一点。例如,在 DQN 或 PPO 之间进行选择时,这也是一个重要驱动因素 - 什么似乎更容易弄清楚,正确的操作,或状态/操作对的价值?

是否有助于重新制定国家,例如。到 [distance_from_agent_to_rabbit, angle_between_agent_and_rabbit]?

也许。似乎最有帮助的角度特征是狼的方位与狼和兔子之间的矢量之间的角度差异。然后正确的动作会非常清楚地映射出将狼引向兔子的动作——在大多数情况下,负值意味着向右转向,正值意味着向左转向。

但是,如果你这样做了,你会在某些方面改变要解决的问题的性质。您必须问,您是否有兴趣应用您对问题的领域知识来帮助代理,或者您是否有兴趣查看代理是否可以找出发现这种关系的内部表示?对于一个玩具问题,你可能想故意让一些东西更难学。

我在解决这个环境时遇到了麻烦。即使经过长时间的训练,受过训练的智能体的分数也只比随机智能体略好一点。我已经尝试过深度 Q 学习(有经验回放,目标网络)强化(有和没有基线)和 PPO。

正如评论中所讨论的,导致此问题的最大因素实际上是您的环境代码中的一个错误,代理最终可能会导致轴承值超出范围。环境仍然有效,因为您正在使用三角函数来计算运动,但这会导致更大的方位值范围,并且会使相同的状态看起来与代理不同,从而使事情变得更难学习。

一个实验

我设法使用一个简单的基于 DQN 的单步代理解决了这个环境,并有时间尝试使用 NN 的一些不同输入功能来证明我的上述观点。在每种情况下,我对 RL 和 NN 使用完全相同的超参数(预计在最后一种情况下我必须更改 NN 输入层的大小)。

我计算了 100 次已完成的训练运行所需的训练集数(包括约 80 集纯随机行为开始体验重放),并尝试了一些不同的状态特征表示。当使用贪婪行事的代理进行 100 次测试运行时,我将环境视为“已解决”,平均回报为 20 或更多。我没有将测试运行计入训练集的数量。

我得到了这些结果:

  • 未改变状态629.99 +-23.66 集,但在 100 集中有 28 集失败

  • 缩放状态577.78 +-19.41 集,没有失败

  • 工程状态153.84 +-3.26 集,没有失败

在 100 次试验中,未缩放状态和缩放状态的集数之间没有显着差异。然而,未缩放特征的大量失败(在 1500 次训练后放弃)一个显着差异。

对于缩放状态变化,笛卡尔坐标的缩放为fi=2(si0.5)轴承的缩放比例是fi=0.5(siπ)

工程状态使用[狼和兔子之间的距离,向量到兔子和狼的方位之间的角度,兔子的方位] 缩放如上,性能要好得多。

另一个考虑

顺便说一句,值得一提的是剧集超时和“完成”标志。

您需要仔细考虑剧集超时意味着什么。这是挑战的一部分(在限定时间内取得成功)和训练方便(避免浪费时间从过长或卡住的情节中学习)之间是有区别的。有时这是一个很大的区别:

  • 为了训练方便“完成”标志在这里很烦人,你要避免声称情节真的结束了代理,因为它会错误地得知某些状态,有时,结束情节 - 这些状态甚至可能是代理所希望的他们似乎停止了负面奖励的流动。您不想将那个善意的谎言存储在体验重播表中 - 一个简单的解决方法是让您的代理在环境超时之前至少提前 1 步提前停止。

  • 挑战的一部分如果环境真的可以超时,并且不会在任何时候随机停止,那么为了保留马尔可夫属性,您必须在状态中包含时间的表示 - 它可以是到目前为止的时间或剩余时间。否则,您将问题变成了 POMDP,并增加了计算价值函数的复杂性。