Python GAE:为什么GAE的表现不如标准化回报和优势
我正在以GAE为优势实施PPO。下面的代码是我根据OpenAI的基线实现计算GAE和返回的方法Python GAE:为什么GAE的表现不如标准化回报和优势,python,numpy,reinforcement-learning,Python,Numpy,Reinforcement Learning,我正在以GAE为优势实施PPO。下面的代码是我根据OpenAI的基线实现计算GAE和返回的方法 advantages=np.zero_like(奖励) 最后一个adv=0 对于反向(范围(len(奖励)))中的i: delta=奖励[i]+非终端[i]*自我。_gamma*值[i+1]-值[i] 优点[i]=last\u adv=delta+nonterminals[i]*gamma*lam*last\u adv 返回=优点+值[:-1] 优势=正常化(优势)#正常化优势 值得注意的是,val
advantages=np.zero_like(奖励)
最后一个adv=0
对于反向(范围(len(奖励)))中的i:
delta=奖励[i]+非终端[i]*自我。_gamma*值[i+1]-值[i]
优点[i]=last\u adv=delta+nonterminals[i]*gamma*lam*last\u adv
返回=优点+值[:-1]
优势=正常化(优势)#正常化优势
值得注意的是,values
比其他数组(如rewards
)多了一个元素,因此values[-1]
可以用作额外的下一个状态。然而,这种实现的性能比简单的标准化返回和下面给出的优点要差得多
返回=奖励
下一次返回=0
对于反向(范围(len(奖励)))中的i:
返回[i]=奖励[i]+非终端[i]*gamma*下一次返回
下一次返回=返回[i]
#使回报和优势正常化
值=标准化(值[:-1]、np.平均值(返回值)、np.标准值(返回值))
优点=标准化(返回值-值)
返回=标准化(返回)
在不改变任何其他内容的情况下,上述实现在gym
environmentLunarLanderContinuous-v2
中不断获得大约270+
的平均分数。另一方面,GAE实施的得分永远不会超过100
。请参见下图中的示例,其中使用规范化实现运行更好的示例
我的实现有什么问题
此外,下面是规范化的代码
def正常化(x,平均值=0,标准值=1,ε=1e-8):
x=(x-np.mean(x))/(np.std(x)+ε)
x=x*std+平均值
返回x
您计算优势的代码似乎是正确的。规范化
做什么?通常,您需要标准化数据,这意味着您要减去其平均值,然后除以其标准偏差。我这样问是因为在代码的第二部分中,您将返回的平均值和标准偏差传递给函数normalize
,而在第一部分中,您没有这样做
另外,为什么要在代码的第二部分中使用返回值来规范化值
?我觉得很奇怪
最后,你如何训练你的V型功能?(我假设值
包含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
比“一次性合身”效果更好
嗨,西蒙。我已经更新了normalize
的代码。我规范化值
,使值
与返回值
具有相同的均值和方差。我简单地使用返回
作为目标值,并使用均方误差作为值函数的损失函数。感谢您的解释。我要做的是规范化返回值
,然后将值
与之匹配。我从来没听说过你的方法,我要试试。
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