为什么贴现奖励函数是反转的?

Why discounted reward function is reversed?

我正在解决一个关于强化学习的麻省理工学院实验室问题,但我被奖励函数困住了。 具体的代码块是这样的: 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 有何帮助?

反转是必要的,这样每个奖励都会乘以折扣因子 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(赢得比赛)。