1

我正在使用基于 Open AI 健身房的 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)),而是其中的一个随机点。

当我用 (Version B) 将两个轴标准化为 [0,1]self.action_space = ((gym.spaces.Box(np.array([0,0]),np.array([1,1]))))并且重新缩放实际坐标(x 动作乘以 31,y- 乘以 25)时,代理现在确实探索了整个框(我尝试过 PPO 和 A2C)。然而,产生的最优策略通常对应于一个角点(最接近目标的角点),尽管在某些时候在训练期间获得了更好的奖励。只是偶尔其中一个坐标不是边界,永远不会同时出现。

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

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

最后,我的动作空间需要在两个连续分量(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)))应该是我正在寻找的,但不支持元组。有什么解决方法吗?当人们同时需要连续和离散组件时,他们会怎么做?我想将二进制组件变成浮点数,并将其转换为低于/高于某个截止值的 0/1,但这不太适合学习。

4

1 回答 1

2

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

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

于 2021-12-22T15:31:18.667 回答