在Open AI 的 actor-critic和Open AI 的 REINFORCE中,奖励正像这样标准化
rewards = (rewards - rewards.mean()) / (rewards.std() + eps)
在每一集单独。
这可能是基线减少,但我不完全确定为什么它们除以奖励的标准差?
假设这是基线减少,为什么每集都这样做?
如果一集产生的奖励在(绝对的,非标准化的)范围内怎么办?,并且下一集产生的奖励范围为?
这种方法似乎忽略了剧集奖励之间的绝对差异。
在Open AI 的 actor-critic和Open AI 的 REINFORCE中,奖励正像这样标准化
rewards = (rewards - rewards.mean()) / (rewards.std() + eps)
在每一集单独。
这可能是基线减少,但我不完全确定为什么它们除以奖励的标准差?
假设这是基线减少,为什么每集都这样做?
如果一集产生的奖励在(绝对的,非标准化的)范围内怎么办?,并且下一集产生的奖励范围为?
这种方法似乎忽略了剧集奖励之间的绝对差异。
从减少变体的策略梯度中的术语(这是您的“基线减少”链接中描述的内容)是与您所询问的对奖励的修改不同的技巧。您链接到的代码中似乎不存在用于减少方差的基线减法技巧。
您的问题似乎是奖励的标准化,如Brale_ 的回答中所述,将所有观察到的奖励置于相似的值范围内。这样的标准化程序本质上需要除以标准偏差,所以......这回答了你问题的那一部分。
至于他们为什么要按每集这样做……我认为您是对的,在一般情况下,这似乎是个坏主意。如果有只在某些情节中出现的具有极高奖励的罕见事件,而大多数情节只经历具有较低奖励的常见事件......是的,这个技巧很可能会搞砸训练。
在 CartPole 环境的特定情况下(这是这两个示例中使用的唯一环境),这不是问题。在 CartPole 环境的这个实现中,代理只收到一个奖励,其值正好为对于它设法“生存”的每一个时间步骤。在我看来,示例代码中的rewards
列表名称不佳,因为它实际上包含不同时间步长的折扣回报,如下所示:, 其中所有个体值等于 在这个特殊的环境中。
这些类型的值往往在一个相当一致的范围内(特别是如果用于生成它们的策略也只是移动缓慢),因此它们所做的标准化可能相对安全,并且可以提高学习稳定性和/或速度(通过使确保概率增加的动作与概率降低的动作大致相同,并且可能通过使超参数更容易调整)。
在我看来,这个技巧似乎不能很好地推广到许多其他环境,而且我个人认为它不应该包含在这样的教程/示例中。
注意:我很确定,平均收益的每集减法将是一个有效的,尽管可能不寻常的减少方差的基线。在推广到许多不同的环境方面,这对我来说似乎特别成问题。
这个问题在 David Silver 的以下 NeurIPS 2016 论文中进行了详细讨论:Learning values across many orderings 。他们还给出了 Atari 域的实验结果。
我们从值中减去平均值,然后除以标准差,得到平均值为零,方差为 1 的数据。每集的值范围无关紧要,它总是使其在所有情况下均值为零,方差为 1。如果范围更大([100, 200]),那么偏差也会比更小的范围([0, 1])更大,所以我们最终将除以更大的数字。