python - REINFORCE 深度强化学习算法中的折扣奖励
问题描述
我正在使用基线算法实施 REINFORCE,但我对折扣奖励功能有疑问。
我实现了这样的折扣奖励功能:
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]
根据 return G的表达式,这是正确的:
回报是折扣奖励的总和:G = discount_ factor * G + reward
但是,在这里我的问题是,我从 Towards Data Science https://towardsdatascience.com/learning-reinforcement-learning-reinforce-with-pytorch-5e8ad7fc7da0找到了这篇文章,他们在其中定义了相同的函数,如下所示:
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的规则……
有人知道第二个函数发生了什么以及为什么它也可能是正确的(或者在哪些情况下可能......)?
解决方案
我可以确认第二个功能不正确。一个更正的版本,它使用 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
另外,在我看来,您的第一个功能也不正确。为什么要在 return 语句中减去平均值?并且要小心初始化,r = np.zeros_like(rewards, dtype=float)
否则 numpy 可能会将其视为整数向量并计算结果。
推荐阅读
- android - 如何在 Flutter 中更新 Ui 传入应用程序
- c++ - 为任何 STL 容器创建别名模板
- r - 计算每个选定列的字符串出现次数
- python - 将季节性分解趋势应用于 dask DataFrame,Python 的每一列
- javascript - !解决了!如何使用 xmlHttpRequest 从 JavaScript 中的 .json 文件打印表格
- ssis - 使用 SSIS 将单个存储过程中的多个结果导出到 Excel 工作表的多个选项卡中
- python - Pymongo 将子文档嵌入到 Json
- flutter - 在 Flutter App 上收集感应传感器数据
- amazon-ec2 - 从 196.254.169.254 获取 EC2 元数据
- python - 如何在 Python 中替换全局变量