python - 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 gym
environment的平均分数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
解决方案
您计算优势的代码似乎是正确的。做什么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
推荐阅读
- loops - 在循环中使用ggplot内的粘贴函数
- ruby-on-rails - Rails.Share 2 个模型之间的变量(验证)
- directx - HLSL:TextureCube.SampleGrad() 需要哪个 DDX DDY
- apache - 如何使用 htaccess 将斜杠附加到 URL?
- javascript - 动态更新 Mapbox GL 表达式以显示或隐藏几何图形
- postgresql - Apache guacamole 使用 postgres 创建用户
- linux - 无论输出 bash printf 都保持文本到位
- azure - 如何使用 Gremlin API 在 Azure Cosmos DB 中创建元图
- java - 将 Tomcat 从 8.0 迁移到 8.5,客户端证书身份验证不起作用
- r - 使用两个组变量计算 R 中的组平均值