强化学习中的奖励规范化

时间:2018-11-21 00:44:32

标签: deep-learning reinforcement-learning

我有20份environment,当达到目标时会得到0.1的奖励,否则得到0。

我想做的是弄清如何规范奖励。假设我在环境中运行了300个时间步。因此,奖励矩阵的大小为300x20。

我通常会这样做:

discounted_rewards = torch.zeros_like(rewards, dtype=torch.float32, device=device)
for t in reversed(range(len(rewards))):
    running_add = rewards[t] + discount * running_add
    discounted_rewards[t] = running_add

mean = discounted_rewards.mean(0, keepdim=True)
std = discounted_rewards.std(0, keepdim=True) + 1e-10
discounted_rewards = (discounted_rewards - mean) / std

但是,当我做作业时,我将整个环境的均值归一化,而不是时间步长。即

mean = discounted_rewards.mean(1, keepdim=True)
std = discounted_rewards.std(1, keepdim=True) + 1e-10
discounted_rewards = (discounted_rewards - mean) / std

这似乎训练得更快。如果有帮助,请使用PPO。

所以我的问题是:

  1. 您应该以哪种方式进行标准化?
  2. 我读了这篇SO post,其中提到归一化“不会弄乱渐变的符号”。但是,如果奖励小于均值,它确实会改变渐变的符号吗?
  3. (可选)为什么规范化仍然有效?

0 个答案:

没有答案