【问题标题】:Why discounted reward function is reversed?为什么打折奖励功能被颠倒了?
【发布时间】:2020-03-17 10:10:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案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(赢得比赛)。

    【讨论】:

    • 所以我了解循环如何给出输出,我想我无法理解使用 reversed 执行此操作的原因以及对输出的解释。
    • 我在帖子中解释了原因。反之则负责将奖励乘以与今天不同的时间步数。
    • 如果您也可以添加解释,我认为这会有所帮助。
    • @ZainKhaishagi 我对我的原始帖子进行了编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 2012-06-18
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2020-05-16
    相关资源
    最近更新 更多