Monte Carlo Method
等 episode 结束后用完整真实回报更新价值。
学习目标
- 从完整采样回报估计策略价值,辨别首次访问和每次访问的计数规则。
- 独立复核“同一 episode 重访状态时的两种统计”的输入、计算和解释。
- 首次访问是每个 episode 内的规则。
为什么重要
从完整采样回报估计策略价值,辨别首次访问和每次访问的计数规则。
学习前需要掌握
背景与问题
打完一局牌后,可以回看每个决策点到结束实际拿到了多少分,不需要知道所有转移概率。不同对局结果很随机,因此不能把一次好结果直接当成这个状态的价值。
概念定义
Monte Carlo 策略评价用实际采样到的完整回报作为目标,不用价值估计补足未来。首次访问方法在每个 episode 仅使用某状态首次出现的回报;每次访问方法使用该状态各次出现的回报。两者计数不同,有限样本估计也可能不同。
直观理解
用多次完整旅程的实际总费用评价一个出发点,而不是走一步就借助另一个估计猜剩余费用。旅程越长、路况越随机,总费用样本的波动可能越大。
核心原理
对固定策略,可累加回报再除以访问次数,也可用增量平均更新。固定步长会更重视近来的样本,适应变化较快,但不等价于所有历史回报的算术平均。
完整回报避免了 bootstrap 引入的估计误差,却仍受奖励噪声、轨迹方差和策略分布影响。off-policy MC 还需满足支持条件并处理重要性采样的高方差,不能仅说“不自举所以无任何偏差”。
标准 episodic MC 需要获得终止回报。把未完成的片段剩余回报直接设零,会低估持续任务价值;使用后继估计补足后,目标已变为 n-step 或其他 bootstrap 方法。
数学表达
折扣回报
当前回报由下一奖励与折扣后的未来回报组成。
变量含义
G_t从时刻 t 开始的折扣累计回报。R_{t+1}执行动作后收到的下一步奖励。γ折扣因子,通常位于 [0,1)。
计算步骤
- 1首次访问仅收集第一局的 4 和第二局的 6,均值为 5。
- 2每次访问收集 4、2、6,均值为 4。
- 3这只是两局的有限样本差异,不说明哪种估计总是更好。
代码对应位置
示例 1同一 episode 重访状态时的两种统计:首次访问估计为 5.000,每次访问估计为 4.000。
变量解释
| 变量 | 含义 |
|---|---|
G_t | 从时刻 t 开始的折扣累计回报。 |
R_{t+1} | 执行动作后收到的下一步奖励。 |
γ | 折扣因子,通常位于 [0,1)。 |
完整数值示例
同一 episode 重访状态时的两种统计
已知条件
- 一局中状态 s 出现在时刻 0 与 2,对应完整回报为 4 与 2。
- 另一局只出现一次,对应回报为 6。
计算步骤
- 首次访问仅收集第一局的 4 和第二局的 6,均值为 5。
- 每次访问收集 4、2、6,均值为 4。
- 这只是两局的有限样本差异,不说明哪种估计总是更好。
计算结果
首次访问估计为 5.000,每次访问估计为 4.000。
处理前后对比
- 首次访问是每个 episode 内的规则。
- 回报目标直接来自完整轨迹,不是 TD 后继估计。
计算与实现步骤
- 采样完整轨迹
- 计算每步 G
- 按访问更新均值
代码实现
示例 1
同一 episode 重访状态时的两种统计
example_01.py用途:首次访问估计为 5.000,每次访问估计为 4.000。
episode_returns = [[4.0, 2.0], [6.0]]
first_visit = [values[0] for values in episode_returns]
every_visit = [value for values in episode_returns for value in values]
print(f"first_visit={sum(first_visit)/len(first_visit):.3f}")
print(f"every_visit={sum(every_visit)/len(every_visit):.3f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
首次访问估计为 5.000,每次访问估计为 4.000。
Step 1 · 1–5 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
episode_returns = [[4.0, 2.0], [6.0]]
first_visit = [values[0] for values in episode_returns]
every_visit = [value for values in episode_returns for value in values]
print(f"first_visit={sum(first_visit)/len(first_visit):.3f}")
print(f"every_visit={sum(every_visit)/len(every_visit):.3f}")预期输出或运行结果
first_visit=5.000 every_visit=4.000
常见错误 · 3 条
- 把首次访问解释成整个训练过程只更新一次。
- 时间截断后把未见未来全部当作真实零回报。
- 把固定步长更新称为精确历史平均。
实际应用
- 序贯决策
- 控制与资源分配
常见错误
- 把首次访问解释成整个训练过程只更新一次。
- 时间截断后把未见未来全部当作真实零回报。
- 把固定步长更新称为精确历史平均。
扩展内容说明
本页数值均为解释机制的构造案例,不能解读为真实训练或基准性能。定义和适用条件参见 Sutton 与 Barto《Reinforcement Learning: An Introduction》(第 5 章)。
算法属性与数据边界
失败模式、风险与性能
失败模式
- 把首次访问解释成整个训练过程只更新一次。
- 时间截断后把未见未来全部当作真实零回报。
- 把固定步长更新称为精确历史平均。
风险
- 奖励函数与真实目标不一致会诱发奖励黑客。
- 部署策略的行动权限必须由环境和应用层约束。
性能考虑
- 样本效率、墙钟时间和显存占用需要分别报告。
- 应使用多个随机种子、置信区间和固定评测策略。
常见问题
MC 的目标无 bootstrap,估计就一定无偏吗?
完整同策略回报有对应的期望解释,但有限样本、访问选择、重要性比率归一化与函数逼近仍需要分别分析,不能笼统保证所有实现无偏。
网页是否会训练模型?
不会。所有图表使用固定种子或解析公式在浏览器本地计算,不执行页面中的示例代码。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。