Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GAE:为什么GAE的表现不如标准化回报和优势_Python_Numpy_Reinforcement Learning - Fatal编程技术网

Python GAE:为什么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

我正在以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]
优势=正常化(优势)#正常化优势
值得注意的是,
values
比其他数组(如
rewards
)多了一个元素,因此
values[-1]
可以用作额外的下一个状态。然而,这种实现的性能比简单的标准化返回和下面给出的优点要差得多

返回=奖励
下一次返回=0
对于反向(范围(len(奖励)))中的i:
返回[i]=奖励[i]+非终端[i]*gamma*下一次返回
下一次返回=返回[i]
#使回报和优势正常化
值=标准化(值[:-1]、np.平均值(返回值)、np.标准值(返回值))
优点=标准化(返回值-值)
返回=标准化(返回)
在不改变任何其他内容的情况下,上述实现在
gym
environment
LunarLanderContinuous-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