在强化学习中,通常我们会经历一系列的状态-动作对,并在每个时间步接收到一个奖励。这些奖励记录在 rew
数组中。returns
是一个与奖励数组 rew
形状相同的数组,用于存储每个时间步的回报(return)。这里的回报是指从当前时间步开始到序列结束时的所有奖励的总和,但未来的奖励会被打折(discounted)。
具体来说,returns
数组中的每个元素是由 rew
数组中相同位置元素及该位置之后的所有元素计算得到的。returns[t]
表示的是从时间步 t
开始累积的折扣奖励和,它考虑了从时间步 t
到序列结束时的所有奖励。折扣因子 gamma
是一个小于1的数值,通常接近1(例如0.99),它用于减少未来奖励的影响。
这种计算方式反映了强化学习中的一个核心概念:我们关心的不仅仅是即时的奖励,而是长期的累积奖励。通过计算 returns
,我们能够得到一个更全面的评价,了解在某个时间步采取的动作对未来的影响。
举个例子来说明这个过程:
假设我们有一个长度为4的奖励序列 rew = [r0, r1, r2, r3]
,折扣因子 gamma = 0.9
。我们要计算每个时间步的 returns
。
-
初始化
returns = [0, 0, 0, 0]
(与rew
形状相同) -
从最后一个时间步开始向前计算
returns
:-
在时间步
t = 3
(最后一个时间步),returns[3]
只包含当前的奖励r3
,因为没有未来的奖励了。所以returns[3] = r3
。 -
在时间步
t = 2
,returns[2]
包含当前的奖励r2
和打折后的下一个时间步的returns[3]
。计算为returns[2] = r2 + gamma * returns[3] = r2 + 0.9 * r3
。 -
在时间步
t = 1
,returns[1]
包含当前的奖励r1
和打折后的下一个时间步的returns[2]
。计算为returns[1] = r1 + gamma * returns[2] = r1 + 0.9 * (r2 + 0.9 * r3)
。 -
在时间步
t = 0
,returns[0]
包含当前的奖励r0
和打折后的下一个时间步的returns[1]
。计算为returns[0] = r0 + gamma * returns[1] = r0 + 0.9 * (r1 + 0.9 * (r2 + 0.9 * r3))
。
-
比如 rew = [1, 2, 3, 4]
,并且折扣因子 gamma = 0.9
,那么 returns
的计算过程如下:
rew = np.array([1, 2, 3, 4])
gamma = 0.9
returns = np.zeros_like(rew)
# 从后向前计算returns
for t in reversed(range(len(rew))):
if t == len(rew) - 1:
returns[t] = rew[t]
else:
returns[t] = rew[t] + gamma * returns[t+1]
print(returns)
输出:
[8.146, 7.94, 6.6, 4]
即从第一个时间步开始,考虑到未来的折扣奖励,总的累积奖励是8.146。从第二个时间步开始是7.94,以此类推。