开发者社区> 问答> 正文

为什么discounted reward 函数是相反的?

我正在解决一个关于强化学习的MIT实验室,并且停留在奖励功能上。特定的代码块是这样的:https : //colab.research.google.com/github/aamini/introtodeeplearning/blob/master/lab3/solutions/RL_Solution.ipynb#scrollTo=5_Q2OFYtQ32X&line=19&uniqifier=1

相关代码的简单版本是:

import numpy as np

rewards=[0.,0,0,0,0,1]
discounted_rewards = np.zeros_like(rewards)
R = 0
for t in reversed(range(0, len(rewards))):
    # update the total discounted reward
    R = R * .95 + rewards[t]
    discounted_rewards[t] = R
discounted_rewards

输出为:

array([0.77378094, 0.81450625, 0.857375, 0.9025, 0.95 ,1.])

提供的解释是,我们希望鼓励早日而不是晚日获得奖励。在for循环中使用reversed有什么帮助?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 12:21:12 826 0
1 条回答
写回答
取消 提交回答
  • 必须颠倒过来,以使每个奖励都乘以x乘以折扣系数,其中x是奖励远离当前的时间步数。此外,由于它是累积奖励,因此会将下一个奖励添加到先前的奖励中。没有反向,这将是不可能的。

    反之,最后的奖励是将添加到R的第一个奖励,然后在每次迭代中,随着循环的继续,将奖励事件发生之前的时间步长乘以0.95。

    循环的作用是这样的:

    R = 0
    R += 0.95 \* 5 * 1
    R += 0.95 \* 4 * 0
    R += 0.95 \* 3 * 0
    R += 0.95 \* 2 * 0
    R += 0.95 \* 1 * 0
    R += 0
    

    编辑:

    您获得的输出是累积的折扣奖励。输出列表中的第一个索引意味着您的代理在该时间步中为以下动作状态元组累积折现的奖励为0.7737。然后,您进一步进入未来(增加列表索引),由于您接近1的净奖励(赢得游戏),您的折扣奖励将更高。

    回答来源:stackoverflow

    2020-03-24 12:21:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
函数对象 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载