Python 强化深度强化学习算法中的折扣奖励
我正在实现一个增强基线算法,但我对折扣奖励函数有疑问 我实现了如下的折扣奖励功能:Python 强化深度强化学习算法中的折扣奖励,python,reinforcement-learning,reward,Python,Reinforcement Learning,Reward,我正在实现一个增强基线算法,但我对折扣奖励函数有疑问 我实现了如下的折扣奖励功能: 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*
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
和奖励奖励=[1,2,3,4]
,它给出:
r=[1.234,2.34,3.4,4.0]
根据返回G的表达式,这是正确的:
回报是折扣奖励的总和:G=折扣系数*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
和奖励rawards=[1,2,3,4]
给出:
r=[1.234,0.234,0.034,0.004]
但我看不到这个过程,它似乎不符合G的规则
有人知道第二个函数是怎么回事吗?为什么它也可能是正确的(或者在哪种情况下可能是……?我可以确认第二个函数是错误的。使用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\u like(rewards,dtype=float)
否则numpy可能会将其视为整数向量,并对结果进行处理。我可以确认第二个函数不正确。使用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可能会将其视为一个整数向量,并对结果进行处理