Python 强化深度强化学习算法中的折扣奖励

Python 强化深度强化学习算法中的折扣奖励,python,reinforcement-learning,reward,Python,Reinforcement Learning,Reward,我正在实现一个增强基线算法,但我对折扣奖励函数有疑问 我实现了如下的折扣奖励功能: def disc_r(rewards): r = np.zeros_like(rewards) tsteps = range(len(rewards)) #timesteps sum_reward = 0 for i in reversed(tsteps): sum_reward = rewards[i] + gamma*

我正在实现一个增强基线算法,但我对折扣奖励函数有疑问

我实现了如下的折扣奖励功能:

  def disc_r(rewards):
        r = np.zeros_like(rewards)
        tsteps = range(len(rewards)) #timesteps
        sum_reward = 0
        for i in reversed(tsteps):
            sum_reward = rewards[i] + gamma*sum_reward
            r[i] = sum_reward
            print(r[i])
        return r - np.mean(r)
因此,例如,对于折扣系数
gamma=0.1
和奖励
奖励=[1,2,3,4]
,它给出:

r=[1.234,2.34,3.4,4.0]

根据返回G的表达式,这是正确的:

回报是折扣奖励的总和:G=折扣系数*G+奖励

然而,在这里我的问题是,我从《走向数据科学》中找到了这篇文章,他们将这一相同的功能定义如下:

def discount_rewards(rewards, gamma=0.99):
    r = np.array([gamma**i * rewards[i] for i in range(len(rewards))])
    # Reverse the array direction for cumsum and then revert back to the original order
    r = r[::-1].cumsum()[::-1]
    print(r)
    return r — r.mean()
计算相同的
gamma=0.1
和奖励
rawards=[1,2,3,4]
给出:

r=[1.234,0.234,0.034,0.004]

但我看不到这个过程,它似乎不符合G的规则


有人知道第二个函数是怎么回事吗?为什么它也可能是正确的(或者在哪种情况下可能是……?

我可以确认第二个函数是错误的。使用numpy并比第一个函数更高效的更正版本如下:

def discount_rewards(rewards, gamma):
    t_steps = np.arange(rewards.size)
    r = rewards * gamma**t_steps
    r = r[::-1].cumsum()[::-1] / gamma**t_steps
    return r

而且,在我看来,你的第一个函数也是不正确的。为什么要减去返回语句的平均值?并且要小心地初始化
r=np.zeros\u like(rewards,dtype=float)
否则numpy可能会将其视为整数向量,并对结果进行处理。

我可以确认第二个函数不正确。使用numpy并比第一个函数更高效的更正版本如下:

def discount_rewards(rewards, gamma):
    t_steps = np.arange(rewards.size)
    r = rewards * gamma**t_steps
    r = r[::-1].cumsum()[::-1] / gamma**t_steps
    return r
而且,在我看来,你的第一个函数也是不正确的。为什么要减去返回语句的平均值?并且要小心初始化
r=np.zeros_like(rewards,dtype=float)
,否则numpy可能会将其视为一个整数向量,并对结果进行处理