我正在解决一个关于强化学习的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
必须颠倒过来,以使每个奖励都乘以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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。