首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于折扣奖励的深度强化学习算法

基于折扣奖励的深度强化学习算法
EN

Stack Overflow用户
提问于 2020-12-10 11:12:33
回答 1查看 699关注 0票数 2

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

我实现了这样的折扣奖励功能:

代码语言:javascript
复制
  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]

根据返回G的表达式,它是正确的。

回报是贴现报酬之和:G= discount_因子*G+报酬

然而,在这里我的问题是,我发现了这篇来自“走向数据科学”的文章,其中他们定义了如下相同的函数:

代码语言:javascript
复制
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的规则.

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

EN

回答 1

Stack Overflow用户

发布于 2020-12-11 15:23:11

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

代码语言:javascript
复制
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可能会将其视为整数向量,并给出结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65233426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档