我正在用基线实现一个增强算法,但我对折扣奖励函数有疑问。
我实现了这样的折扣奖励功能:
def disc_r(rewards):
r = np.zeros_like(rewards)
tsteps = range(len(rewards)) #timesteps
sum_reward = 0
for i in reversed(tsteps):
sum_reward = rewards[i] + gamma*sum_reward
r[i] = sum_reward
print(r[i])
return r - np.mean(r)因此,例如,对于折扣系数gamma = 0.1和奖励rewards = [1,2,3,4],它提供:
r = [1.234, 2.34, 3.4, 4.0]
根据返回G的表达式,它是正确的。
回报是贴现报酬之和:G= discount_因子*G+报酬
然而,在这里我的问题是,我发现了这篇来自“走向数据科学”的文章,其中他们定义了如下相同的函数:
def discount_rewards(rewards, gamma=0.99):
r = np.array([gamma**i * rewards[i] for i in range(len(rewards))])
# Reverse the array direction for cumsum and then revert back to the original order
r = r[::-1].cumsum()[::-1]
print(r)
return r — r.mean()为相同的gamma = 0.1和奖励rewards = [1,2,3,4]进行计算:
r = [1.234, 0.234, 0.034, 0.004]
但我看不出这个过程,它似乎不遵循G的规则.
有人知道第二个函数是怎么回事吗?为什么它也可能是正确的(或者在什么情况下可能.)?
发布于 2020-12-11 15:23:11
我可以确认第二个函数是不正确的。使用numpy并比第一个函数更有效的修正版本如下:
def discount_rewards(rewards, gamma):
t_steps = np.arange(rewards.size)
r = rewards * gamma**t_steps
r = r[::-1].cumsum()[::-1] / gamma**t_steps
return r而且,在我看来,你的第一个功能也是错误的。为什么要减去返回语句的平均值?并且要小心初始化r = np.zeros_like(rewards, dtype=float),否则numpy可能会将其视为整数向量,并给出结果。
https://stackoverflow.com/questions/65233426
复制相似问题