为什么折现奖励功能会被逆转?

时间:2020-03-17 10:10:05

标签: python python-3.x tensorflow tensorflow2.0 reinforcement-learning

我正在解决一个关于强化学习的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有什么帮助?

1 个答案:

答案 0 :(得分:0)

反转是必要的,以便每个奖励都乘以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(赢得游戏),您的折扣奖励将更高。