python - 稳定基线算法在简单的强化学习问题中探索糟糕的二维框

标签 python reinforcement-learning openai-gym stable-baselines

我正在使用基于 Open AIgym 的 stableBaselines3。在玩具问题版本中,代理尝试学习屏幕上给定的(固定)目标点(x 和 y 坐标分别在 [0,31] 和 [0,25] 内)。

因此,我的操作空间将是一个盒子(版本 A):self.action_space = ((gym.spaces.Box(np.array([0,0]),np.array([31,25])))) 。代理获得的奖励减去所选点和目标之间的曼哈顿距离(模拟立即终止)。但是当运行 PPO 算法时,代理似乎只尝试 Box [0,0]、[2,2] 内的坐标(即坐标永远不会大于 2)。这个盒子之外的任何东西似乎都没有被探索过。所选策略甚至不是该框中的最佳点(通常为 (2,2)),而是其中的随机点。

当我将两个轴归一化为 [0,1] 时,(版本 B)self.action_space = ((gym.spaces.Box(np.array([0,0]),np.array([1,1])))) ,并且实际坐标被重新调整(x Action 乘以 31,y 乘以 25),代理现在会探索整个盒子(我尝试了 PPO 和 A2C)。然而,产生的最优策略通常对应于一个角(最接近目标的角),尽管在训练过程中的某个时刻获得了更好的奖励。仅偶尔其中一个坐标不是边界,绝不会同时存在。

如果我尝试离散化我的问题: self.action_space = gym.spaces.MultiDiscrete([2,32,26]) ,代理正确地学习了最佳可能的 (x,y) Action (版本 A 的代码中除了 Action 空间之外没有任何变化)。显然我不想离散化。

整个行为的可能原因是什么(不探索、只考虑/主要考虑角落、放弃更好的奖励)?其余代码太笨重,无法粘贴到此处,但除了操作空间之外,这些场景之间不会发生变化,因此离散版本工作的事实与奖励计算的错误不相符。

最后,我的 Action 空间需要在两个连续组件(x 和 y)之上有一个离散组件(无论代理是否已找到目标或将继续寻找)。非决定性固定的奖励将是一个小的惩罚,最终决定的奖励如上所述(越接近实际目标越好)。 self.action_space = gym.spaces.Tuple((gym.spaces.Discrete(2),gym.spaces.Box(np.array([0,0]),np.array([31,25]),dtype=np.float32)))应该是我正在寻找的,但不支持 Tuple。有什么解决方法吗?当人们同时需要连续和离散组件时该怎么办?我想过将二进制分量转换为 float ,并将其转换为低于/高于某个截止值的 0/1,但这不太适合学习。

最佳答案

对于后代来说,stable_baselines 似乎正在以神秘的方式对操作进行采样。如果 Action 空间定义为 [0,1] 或 [-1,-1],stable_baselines 确实会对该空间进行采样。但在我的例子中,如果 Action 空间为 [0,31],则采样的 Action 大致在 [0,3] 或 [0,4] 内,大多数值在 [0,1] 内。

因此,解决方法似乎是使用使用 [0,1] 或 [-1,-1] 的 Boxes 作为 action_space,并重新调整您使用的任何 SB3 算法返回的操作。

关于python - 稳定基线算法在简单的强化学习问题中探索糟糕的二维框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70115351/

相关文章:

python - 在 Python 中实现 argmax

python - 如何解决 Open AI 健身房安装问题?

machine-learning - 具有重叠状态的 Q-Learning 优化

python - 为什么我的 DQN 代理无法在非确定性环境中找到最优策略?

Python 记录到 QTextEdit

python - 没有重复的依赖装饰器

python - 如何让 GridSearchCV 在我的管道中使用自定义转换器?

machine-learning - 具有可变 Action 的强化学习

deep-learning - 在健身房自定义环境中定义观察空间时出错

python - 如何在 google colab 中创建实时 matplotlib.pyplot 图?