首页 > 解决方案 > GAE:为什么 GAE 的表现比归一化回报和优势差

问题描述

我正在以 GAE 为优势实施 PPO。以下代码是我根据 OpenAI 的基线实现计算 GAE 并返回的方式。

advantages = np.zeros_like(rewards)
last_adv = 0
for i in reversed(range(len(rewards))):
    delta = rewards[i] + nonterminals[i] * self._gamma * values[i+1] - values[i]
    advantages[i] = last_adv = delta + nonterminals[i] * gamma * lam * last_adv
returns = advantages + values[:-1]
advantages = normalize(advantages) # normalize advantages

值得一提的是,values它比其他数组多一个元素,rewards因此values[-1]可以用作额外的下一个状态。然而,这个实现比简单的归一化回报和下面给出的优势更差

returns = rewards
next_return = 0
for i in reversed(range(len(rewards))):
    returns[i] = rewards[i] + nonterminals[i] * gamma * next_return
    next_return = returns[i]

# normalize returns and advantages
values = normalize(values[:-1], np.mean(returns), np.std(returns))
advantages = normalize(returns - values)
returns = normalize(returns)

在不改变任何其他内容的情况下,上述实现不断达到大约270+in gymenvironment的平均分数LunarLanderContinuous-v2。另一方面,GAE 实现永远不会超过100分数。参见下图的示例,其中使用规范化实现运行更好的示例 在此处输入图像描述

我的实施有什么问题?

另外,这里的代码normalize

def normalize(x, mean=0., std=1., epsilon=1e-8):
    x = (x - np.mean(x)) / (np.std(x) + epsilon)
    x = x * std + mean

    return x

标签: pythonnumpyreinforcement-learning

解决方案


您计算优势的代码似乎是正确的。做什么normalize?通常你标准化你的数据,这意味着你减去它的平均值并除以它的标准差。我问是因为在您的代码的第二部分中,您将返回的均值和标准差传递给函数normalize,而在第一部分中您没有。

另外,为什么在代码的第二部分中values使用规范化?returns我觉得很奇怪。

最后,你如何训练你的 V 功能?(我假设它values包含 V 值)。我发现学习它如下

    for epoch in range(epochs_v):
        v_values = ... # compute your values using V
        a_values = ... # compute A as in your code
        target_values = v_values + a_values # generalized Bellman operator
        # optimize V on your dataset with minibatches and ADAM

比“一次性拟合”效果更好

    v_values = ... # compute your values using V
    a_values = ... # compute A as in your code
    target_values = v_values + a_values # generalized Bellman operator
    # fit V to target_values

推荐阅读