Return 与 Discount Factor
回报汇总未来奖励,γ 控制远期反馈的权重。
学习目标
- 定义Return 与 Discount Factor并复述输入输出。
- 从公式计算一个最小数值例子。
- 说明它与相邻算法的区别、失败模式和适用场景。
为什么重要
奖励评价一次转移,回报评价从某个时刻开始的一段未来。分清两者,才能解释“眼前少得一点,是否值得换取后面的收益”。
折扣因子不仅影响数值尺度,也可能改变更优的策略。选择 gamma 需要联系任务的时间尺度和目标,不能只把它当成训练脚本中的固定常数。
学习前需要掌握
背景与问题
有些动作立即获得小奖励,另一些动作先付出代价、随后才获得更大收益。如果只比较下一步奖励,系统可能永远不会选择需要等待的方案。
回报把未来奖励按约定汇总;折扣回报进一步按距离当前的步数降低未来奖励的权重。因此,何时得到奖励和一共得到多少奖励一样重要。
概念定义
从时刻 t 开始的折扣回报,是下一次奖励加上 gamma 乘再下一次奖励,再加 gamma 的平方乘第三次奖励,依次累加。最先收到的下一步奖励乘 1,而不是再乘一次 gamma。
gamma=0 时只保留下一步奖励。持续任务常取 gamma 小于 1,在奖励有界时可帮助保证无限和有限;有限步终止任务也可以使用 gamma=1,直接计算未折扣总和。具体约定需要与任务一致。
直观理解
折扣像对等待时间作出的权衡:两份同样的收益,如果一份很快得到,另一份要经过很多步骤才得到,折扣回报会区分它们。它不必被解释为现实中的利率,也不等同于环境本身的成功概率。
同一个动作序列,在不同 gamma 下可以有不同价值。比较两个实验时,如果折扣设置不同,就不能把回报数字当成同一把尺子直接比较。
核心原理
回报可以直接按幂次求和,也可以从轨迹末尾向前递推:当前回报等于当前这一步收到的奖励,加 gamma 乘后面的回报。后一种写法在代码中通常更容易避免指数下标错误。
gamma 越接近 1,越重视远期收益,但价值也更依赖较远未来的估计。在持续有正奖励的任务中,增加 gamma 会显著改变价值尺度,不能把数值更大直接解释成策略更好。
一次轨迹的回报是一个样本,价值函数通常对特定策略下未来轨迹的回报取期望。随机环境中,两次执行同一策略也可能得到不同回报。
奖励发生的时间要与时间步定义一致。把每一步从一秒改成一分钟,即使沿用同一个 gamma,也未必表达相同的时间偏好;环境终止和外部截断同样需要清楚区分。
数学表达
折扣回报
从 t 开始累积至 episode 结束。
变量含义
G_t从时刻 t 开始、按所选规则汇总的未来回报。R_(t+1)执行当前动作之后首先收到的奖励,其折扣指数为 0。γ折扣因子;持续折扣任务常取 0≤γ<1,有限步终止任务也可取 1。k距离下一次奖励的额外步数,对应 gamma 的幂次。
计算步骤
- 1A 的回报始终为 4,因为第一份奖励的折扣指数是 0。
- 2gamma=0.5 时,B 的回报为 0+0.5×0+0.5²×10=2.5,因此 A 更高。
- 3gamma=0.9 时,B 的回报为 0+0.9×0+0.9²×10=8.1,因此 B 更高。
- 4若 gamma=1,B 的未折扣回报为 10;这里能取 1,是因为轨迹有限且终止。
代码对应位置
示例 1同时用递推与直接求和核对折扣次数:复现立即奖励与延迟奖励的两种排序,不进行策略训练。
变量解释
| 变量 | 含义 |
|---|---|
G_t | 从时刻 t 开始、按所选规则汇总的未来回报。 |
R_(t+1) | 执行当前动作之后首先收到的奖励,其折扣指数为 0。 |
γ | 折扣因子;持续折扣任务常取 0≤γ<1,有限步终止任务也可取 1。 |
k | 距离下一次奖励的额外步数,对应 gamma 的幂次。 |
完整数值示例
立即拿 4 分,还是等两步后拿 10 分?
已知条件
- 方案 A 的奖励序列为 [4],拿到奖励后终止。
- 方案 B 的奖励序列为 [0, 0, 10],第三次收到奖励后终止。
- 分别使用 gamma=0.5 与 gamma=0.9,对同两条确定性序列作比较。
计算步骤
- A 的回报始终为 4,因为第一份奖励的折扣指数是 0。
- gamma=0.5 时,B 的回报为 0+0.5×0+0.5²×10=2.5,因此 A 更高。
- gamma=0.9 时,B 的回报为 0+0.9×0+0.9²×10=8.1,因此 B 更高。
- 若 gamma=1,B 的未折扣回报为 10;这里能取 1,是因为轨迹有限且终止。
计算结果
折扣设置改变了两条行动序列的优先次序:0.5 时倾向 A,0.9 时倾向 B。
处理前后对比
- 把 B 的第一项 0 漏掉一个,会错误地把 10 折扣一次而不是两次。
- A 和 B 都是确定性构造例子,没有环境噪声;在随机任务中还需要比较回报的期望与波动。
- 调大 gamma 不是一种对所有任务都有效的“提高分数”技巧,它可能改变正在优化的目标。
计算与实现步骤
- 明确一条轨迹中,每个奖励是在执行哪个动作后收到的。
- 写出终止边界与 gamma 的约定,确认是否使用有限或无限时间范围。
- 从末尾以 0 为终止后的剩余回报,逐步执行 G = reward + gamma × G。
- 用直接按幂次求和核对一个短例子,特别检查第一份奖励的指数。
- 比较策略时使用一致的回报定义,并在随机任务中检查多次评估的分布。
代码实现
示例 1
同时用递推与直接求和核对折扣次数
example_01.py用途:复现立即奖励与延迟奖励的两种排序,不进行策略训练。
def discounted_return(rewards, gamma):
total = 0.0
for reward in reversed(rewards):
total = reward + gamma * total
direct = sum((gamma ** k) * reward for k, reward in enumerate(rewards))
assert abs(total - direct) < 1e-12
return total
for gamma in [0.5, 0.9]:
a = discounted_return([4.0], gamma)
b = discounted_return([0.0, 0.0, 10.0], gamma)
print(f"gamma={gamma:.1f} A={a:.4f} B={b:.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
复现立即奖励与延迟奖励的两种排序,不进行策略训练。
b- 偏置项。
Step 1 · 1–7 行
reversed 从最后一个奖励回推,终止后的剩余回报从 0 开始。
def discounted_return(rewards, gamma):
total = 0.0
for reward in reversed(rewards):
total = reward + gamma * total
direct = sum((gamma ** k) * reward for k, reward in enumerate(rewards))
assert abs(total - direct) < 1e-12
return totalStep 2 · 9–12 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
for gamma in [0.5, 0.9]:
a = discounted_return([4.0], gamma)
b = discounted_return([0.0, 0.0, 10.0], gamma)
print(f"gamma={gamma:.1f} A={a:.4f} B={b:.4f}")预期输出或运行结果
gamma=0.5 A=4.0000 B=2.5000 gamma=0.9 A=4.0000 B=8.1000
常见错误 · 4 条
- 把奖励与回报混用,或把第一份下一步奖励也多乘一次 gamma。
- 漏掉零奖励的时间步,导致延迟奖励的折扣次数不正确。
- 使用不同 gamma 的回报直接比较,却没有说明目标已经变化。
- 对持续任务随意使用 gamma=1 而不检查回报是否有限,或把一次幸运轨迹当成价值期望。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 把奖励与回报混用,或把第一份下一步奖励也多乘一次 gamma。
- 漏掉零奖励的时间步,导致延迟奖励的折扣次数不正确。
- 使用不同 gamma 的回报直接比较,却没有说明目标已经变化。
- 对持续任务随意使用 gamma=1 而不检查回报是否有限,或把一次幸运轨迹当成价值期望。
扩展内容说明
未找到可直接映射的本地强化学习文档;中文直觉、数值例子、代码和交互演示属于扩展解释,算法定义与公式以所列教材或原论文为依据。
算法属性与数据边界
失败模式、风险与性能
失败模式
- 探索不足
- 目标漂移
- 函数近似不稳定
风险
- 奖励函数与真实目标不一致会诱发奖励黑客。
- 部署策略的行动权限必须由环境和应用层约束。
性能考虑
- 样本效率、墙钟时间和显存占用需要分别报告。
- 应使用多个随机种子、置信区间和固定评测策略。
常见问题
Return 与 Discount Factor是 on-policy 还是 off-policy?
这是基础或比较概念,具体归属取决于所讨论算法。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。