繁体   English   中英

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

[英]Discount reward in REINFORCE deep reinforcement learning algorithm

我正在使用基线算法实施强化,但我对折扣奖励 function有疑问。

我像这样实现了折扣奖励 function:

  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和奖励rewards = [1,2,3,4] ,它给出:

r = [1.234, 2.34, 3.4, 4.0]

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

回报是折扣奖励的总和:G = discount_ factor * G + reward

但是,在这里我的问题是,我从 Towards Data Science https://towardsdatascience.com/learning-reinforcement-learning-reinforce-with-pytorch-5e8ad7fc7da0找到了这篇文章,他们在其中定义了相同的 ZC1C425268E68385D1AB5074C17A94F14,如下所示:

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和奖励rewards = [1,2,3,4]它给出:

r = [1.234, 0.234, 0.034, 0.004]

但是这里看不到流程,好像不符合G的规则……

有人知道第二个 function 发生了什么以及为什么它也可能是正确的(或者在哪种情况下可能......)?

我可以确认第二个 function 不正确。 使用 numpy 并且比您的第一个 function 更有效的更正版本是:

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

另外,在我看来,您的第一个 function 也不正确。 为什么要在 return 语句中减去平均值? 并注意初始化r = np.zeros_like(rewards, dtype=float)否则 numpy 可能会将其视为 Z157DB7ZDF530023575515D366C9B672E8 向量和地板结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM