05 - 蒙特卡洛方法¶
学习时间: 4-5小时 重要性: ⭐⭐⭐⭐⭐ 无模型学习的理论基础 前置知识: 概率论、大数定律、条件期望
🎯 学习目标¶
完成本章后,你将能够: - 从统计推断角度理解蒙特卡洛估计 - 掌握首次访问和每次访问MC的统计性质(无偏性、一致性、方差) - 理解并应用多种方差缩减技术 - 深入理解重要性采样的方差问题与修正方法 - 掌握MC算法的收敛性理论和样本复杂度分析 - 能够实现高效稳定的MC算法
1. 蒙特卡洛方法的统计基础¶
1.1 从统计推断视角看MC¶
问题形式化: 给定策略 \(\pi\),估计状态值函数 \(V^\pi(s) = \mathbb{E}_\pi[G_t | S_t = s]\)。
蒙特卡洛估计量:
其中 \(G^{(i)}(s)\) 是第 \(i\) 次访问状态 \(s\) 后获得的回报。
1.2 估计量的统计性质¶
定理 5.1(MC估计量的无偏性)
首次访问MC估计量是无偏的: $\(\mathbb{E}[\hat{V}_n^{FV}(s)] = V^\pi(s)\)$
每次访问MC估计量是有偏的(但渐近无偏): $\(\mathbb{E}[\hat{V}_n^{EV}(s)] \neq V^\pi(s), \quad \lim_{n \to \infty} \mathbb{E}[\hat{V}_n^{EV}(s)] = V^\pi(s)\)$
证明(首次访问):
对于首次访问,每个 \(G^{(i)}(s)\) 是独立同分布的,且 \(\mathbb{E}[G^{(i)}(s)] = V^\pi(s)\)。
因此: $\(\mathbb{E}[\hat{V}_n^{FV}(s)] = \frac{1}{n} \sum_{i=1}^n \mathbb{E}[G^{(i)}(s)] = V^\pi(s)\)$
证明(每次访问):
在同一条轨迹中,多次访问同一状态的回报是相关的(共享后续奖励)。
设一条轨迹访问状态 \(s\) 两次,回报分别为: - \(G_1 = R_1 + \gamma R_2 + \gamma^2 R_3 + ...\) - \(G_2 = R_2 + \gamma R_3 + ...\)
则 \(G_1\) 和 \(G_2\) 共享 \(R_2, R_3, ...\),导致: $\(\text{Cov}(G_1, G_2) > 0\)$
因此样本不独立,估计量有偏。
定理 5.2(MC估计量的一致性)
首次访问和每次访问MC估计量都是一致的: $\(\hat{V}_n(s) \xrightarrow{a.s.} V^\pi(s) \quad \text{当} \quad n \to \infty\)$
证明:由强大数定律直接得到。
1.3 方差分析¶
回报方差的来源:
展开得: $\(\text{Var}(G_t) = \sum_{k=0}^{T-t-1} \gamma^{2k} \text{Var}(R_{t+k+1}) + 2\sum_{i<j} \gamma^{i+j} \text{Cov}(R_{t+i+1}, R_{t+j+1})\)$
方差上界:
假设奖励有界 \(|R_t| \leq R_{max}\),则:
MC估计量的方差:
要达到精度 \(\epsilon\)(即 \(\text{Var}(\hat{V}_n) \leq \epsilon^2\)),需要:
这表明样本复杂度随 \(1/(1-\gamma)^2\) 增长,对于接近1的折扣因子,需要大量样本。
2. 方差缩减技术¶
2.1 控制变量法(Control Variates)¶
核心思想:利用与估计量相关的已知量来减少方差。
设要估计 \(\mu = \mathbb{E}[X]\),已知 \(\mathbb{E}[Y] = \nu\),构造:
则 \(\mathbb{E}[Z] = \mu\),且:
最优系数: $\(\beta^* = \frac{\text{Cov}(X, Y)}{\text{Var}(Y)}\)$
最小方差: $\(\text{Var}(Z^*) = \text{Var}(X)(1 - \rho_{XY}^2)\)$
其中 \(\rho_{XY}\) 是相关系数。
2.2 基线控制(Baseline Control)¶
在策略梯度中常用,也可用于MC:
其中 \(b\) 是基线,通常取状态值函数的当前估计。
方差缩减效果:
当 \(b \approx \mathbb{E}[G]\) 且与 \(G\) 正相关时,方差显著降低。
2.3 对偶变量法(Antithetic Variates)¶
思想:成对采样负相关的样本,抵消波动。
对于每个随机数序列 \(\{U_i\}\),同时生成其对偶序列 \(\{1-U_i\}\)。
在MC中的应用:
对于动作选择,如果策略是确定性的或基于随机数,可以构造对偶轨迹。
方差缩减效果:
当 \(X_1\) 和 \(X_2\) 负相关时,方差减小。
2.4 分层采样(Stratified Sampling)¶
思想:将状态空间划分为互不相交的子集(层),在每层内分别采样。
分层MC估计量:
其中 \(w_k\) 是层 \(k\) 的权重,\(\hat{V}_k\) 是层 \(k\) 内的MC估计。
方差分解:
分层采样消除了层间方差。
2.5 重要性采样的方差问题与修正¶
普通重要性采样的方差问题:
其中重要性采样比率:
方差爆炸问题:
当行为策略 \(b\) 与目标策略 \(\pi\) 差异大时,某些轨迹的比率 \(\rho\) 可能极大,导致:
加权重要性采样(Weighted Importance Sampling):
性质: - 有偏但渐近无偏 - 方差显著低于普通IS - 比率之和归一化,防止极端值
增量式WIS更新:
2.6 代码实现:带方差缩减的MC¶
import numpy as np
from collections import defaultdict
from typing import Callable, List, Tuple
def generate_episode(env, policy):
"""
生成一个episode
参数:
env: 环境,需要有reset()和step(action)方法
policy: 策略函数,输入状态返回动作概率分布或动作
返回:
episode: [(state, action, reward), ...]
"""
episode = []
state, _ = env.reset()
done = False
while not done:
# 根据策略选择动作
if callable(policy):
if hasattr(policy, 'shape'): # 如果是数组形式的策略
action = np.random.choice(len(policy[state]), p=policy[state])
else:
action = policy(state)
else:
action = policy
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
episode.append((state, action, reward))
state = next_state
# 防止无限循环
if len(episode) > 10000:
break
return episode
class VarianceReducedMC:
"""带方差缩减技术的蒙特卡洛方法"""
def __init__(self, n_actions: int, gamma: float = 0.9):
self.n_actions = n_actions
self.gamma = gamma
self.V = defaultdict(float) # defaultdict访问不存在的键时返回默认值
self.N = defaultdict(int) # 访问计数
self.returns_sum = defaultdict(float)
self.returns_sq_sum = defaultdict(float) # 用于方差估计
def compute_return(self, rewards: List[float], start_idx: int = 0) -> float:
"""计算从start_idx开始的折扣回报"""
G = 0.0
for i in range(len(rewards) - 1, start_idx - 1, -1):
G = self.gamma * G + rewards[i]
return G
def update_with_baseline(self, state: int, G: float,
baseline: float = None) -> float:
"""使用基线控制的增量更新"""
if baseline is None:
baseline = self.V[state]
self.N[state] += 1
n = self.N[state]
# 增量均值更新(标准MC)
self.V[state] += (G - self.V[state]) / n
# 记录用于方差估计
self.returns_sum[state] += G
self.returns_sq_sum[state] += G * G
return self.V[state]
def get_variance_estimate(self, state: int) -> float:
"""估计回报的方差"""
n = self.N[state]
if n < 2:
return float('inf')
mean_sq = self.returns_sq_sum[state] / n
mean = self.returns_sum[state] / n
return mean_sq - mean ** 2
def sample_complexity_for_accuracy(self, state: int,
epsilon: float,
delta: float = 0.05) -> int:
"""
计算达到(epsilon, delta)精度所需的样本数
使用切比雪夫不等式:P(|V_hat - V| >= epsilon) <= Var/(n*epsilon^2)
参数:
epsilon: 精度要求
delta: 失败概率
返回:
所需样本数
"""
var_estimate = self.get_variance_estimate(state)
# 切比雪夫: n >= Var / (delta * epsilon^2)
return int(np.ceil(var_estimate / (delta * epsilon ** 2)))
def weighted_importance_sampling_update(Q: dict, C: dict,
state: int, action: int,
G: float, rho: float) -> float:
"""
加权重要性采样的增量更新
参数:
Q: 动作值函数
C: 累积权重
state, action: 状态动作对
G: 回报
rho: 重要性采样比率
返回:
更新后的Q值
"""
sa = (state, action)
C[sa] = C.get(sa, 0.0) + rho
if C[sa] > 0:
Q[sa] = Q.get(sa, 0.0) + (rho / C[sa]) * (G - Q.get(sa, 0.0))
return Q[sa]
def stratified_mc_prediction(env, policy, strata_fn: Callable,
gamma: float = 0.9,
samples_per_stratum: int = 1000) -> dict:
"""
分层蒙特卡洛预测
参数:
env: 环境
policy: 策略
strata_fn: 分层函数,将状态映射到层编号
gamma: 折扣因子
samples_per_stratum: 每层样本数
返回:
V: 状态值函数估计
"""
# 收集各层数据
stratum_data = defaultdict(lambda: {'returns': [], 'weights': []})
# 估计各层权重(通过采样)
exploration_episodes = 10000
state_counts = defaultdict(int)
for _ in range(exploration_episodes):
episode = generate_episode(env, policy)
visited_states = set()
for state, _, _ in episode:
if state not in visited_states:
visited_states.add(state)
stratum_id = strata_fn(state)
state_counts[stratum_id] += 1
total_states = sum(state_counts.values())
stratum_weights = {k: v / total_states for k, v in state_counts.items()}
# 分层采样
for stratum_id in stratum_weights.keys():
returns = []
for _ in range(samples_per_stratum):
episode = generate_episode(env, policy)
# 反向计算回报
G = 0
for t in range(len(episode) - 1, -1, -1):
state, action, reward = episode[t]
G = gamma * G + reward
if strata_fn(state) == stratum_id:
returns.append((state, G))
stratum_data[stratum_id]['returns'] = returns
# 合并各层估计
V = defaultdict(float)
for stratum_id, data in stratum_data.items():
weight = stratum_weights[stratum_id]
for state, G in data['returns']:
V[state] += weight * G / len(data['returns'])
return V
3. MC预测:算法与理论¶
3.1 首次访问MC的收敛速率¶
定理 5.3(MC预测的样本复杂度)
设回报有界 \(|G| \leq G_{max}\),要达到精度 \(\epsilon\) 以概率至少 \(1-\delta\):
所需样本数:
证明:使用Hoeffding不等式。
对于独立同分布样本 \(G_1, ..., G_n\),\(|G_i| \leq G_{max}\):
令右边等于 \(\delta\),解得:
3.2 每次访问MC的渐近性质¶
定理 5.4(每次访问MC的渐近正态性)
在适当条件下,每次访问MC估计量满足中心极限定理:
其中渐近方差:
\(G_1, G_{1+k}\) 是同一条轨迹中第1次和第1+k次访问的回报。
与首次访问的比较:
- 首次访问:方差 \(\sigma^2_{FV} = \text{Var}(G)\)
- 每次访问:方差 \(\sigma^2_{EV} = \text{Var}(G) + 2\sum_{k=1}^\infty \gamma^k \text{Var}(G)\)
由于相关性,每次访问的渐近方差通常更大。
3.3 增量更新与步长选择¶
增量均值更新:
广义步长:
收敛条件(Robbins-Monro条件):
常用选择: - \(\alpha_n = 1/n\):样本平均,收敛到真值 - \(\alpha_n = \alpha\)(常数):指数加权平均,跟踪非平稳环境 - \(\alpha_n = 1/n^p\),\(p \in (0.5, 1]\):折中方案
4. MC控制:策略改进理论¶
4.1 广义策略迭代框架¶
MC控制遵循广义策略迭代(GPI):
其中: - \(E\):策略评估(MC估计) - \(I\):策略改进(贪心化)
4.2 ε-贪婪策略的理论保证¶
定理 5.5(ε-贪婪的策略改进定理)
设 \(\pi\) 是任意ε-贪婪策略,\(\pi'\) 是基于 \(Q^\pi\) 的新ε-贪婪策略:
则:
证明:
对于任意状态-动作对 \((s, a)\):
由于 \(\pi'\) 在 \(Q^\pi\) 上是ε-贪婪的:
由策略改进定理,\(Q^{\pi'} \geq Q^\pi\)。
4.3 GLIE条件与收敛性¶
定义(GLIE):Greedy in the Limit with Infinite Exploration
一个探索策略序列 \(\{\pi_k\}\) 满足GLIE,如果: 1. 无限探索:每个状态-动作对被访问无限多次 2. 极限贪心:\(\lim_{k \to \infty} \pi_k(a|s) = \mathbb{1}[a = \arg\max_{a'} Q(s, a')]\)(几乎处处)
定理 5.6(GLIE MC控制的收敛性)
如果满足: 1. 策略序列满足GLIE 2. 步长满足Robbins-Monro条件 3. 首次访问MC用于估计
则:
ε-贪婪的GLIE实现:
满足: - \(\sum_k \epsilon_k = \infty\)(无限探索) - \(\epsilon_k \to 0\)(极限贪心)
4.4 探索与利用的权衡分析¶
遗憾(Regret)分析:
定义 \(T\) 步的累积遗憾:
ε-贪婪的遗憾界:
对于ε-贪婪策略,遗憾增长为 \(O(\epsilon T)\)。
如果选择 \(\epsilon_k = O(1/\sqrt{k})\),则累积遗憾为 \(O(\sqrt{T})\)。
最优探索:
理论上最优的遗憾界是 \(O(\sqrt{SAT})\)(S:状态数,A:动作数),由UCB等算法达到。
5. Off-Policy MC:重要性采样的深入分析¶
5.1 普通重要性采样 vs 加权重要性采样¶
普通IS(Ordinary IS):
性质: - 无偏:\(\mathbb{E}[\hat{V}_{OIS}] = V^\pi\) - 方差可能无界
加权IS(Weighted IS):
性质: - 有偏:\(\mathbb{E}[\hat{V}_{WIS}] \neq V^\pi\) - 渐近无偏:\(\lim_{n \to \infty} \mathbb{E}[\hat{V}_{WIS}] = V^\pi\) - 方差有界,通常远小于OIS
5.2 重要性采样的方差上界¶
定理 5.7(WIS的方差界)
设 \(\rho_{max} = \max_i \rho_i\),则:
证明:
由WIS的定义和比率的有界性可得。
5.3 每决策重要性采样(Per-Decision IS)¶
问题:完整轨迹的重要性采样比率:
当轨迹很长时,比率可能极不稳定。
每决策IS:
将回报分解为各步贡献:
则:
可以重写为:
这样每一步只需要部分比率 \(\rho_{0:t}\),减少方差累积。
5.4 增量Off-Policy MC算法¶
def off_policy_mc_control(env, behavior_policy, gamma=0.9, num_episodes=10000):
"""
Off-Policy MC控制(使用加权重要性采样)
参数:
env: 环境
behavior_policy: 行为策略(用于生成数据)
gamma: 折扣因子
num_episodes: episode数量
返回:
Q: 最优动作值函数估计
target_policy: 目标策略(确定性贪心)
"""
# 初始化
Q = defaultdict(lambda: np.zeros(env.n_actions))
C = defaultdict(lambda: np.zeros(env.n_actions)) # 累积权重
target_policy = {}
for i_episode in range(num_episodes):
# 使用行为策略生成episode
episode = generate_episode(env, behavior_policy)
G = 0.0
W = 1.0 # 重要性采样权重
# 反向遍历
for t in range(len(episode) - 1, -1, -1):
state, action, reward = episode[t]
G = gamma * G + reward
# 更新累积权重
C[state][action] += W
# 加权重要性采样更新
if C[state][action] > 0:
Q[state][action] += (W / C[state][action]) * (G - Q[state][action])
# 更新目标策略(确定性贪心)
target_policy[state] = np.argmax(Q[state])
# 如果行为策略选择的动作不是目标策略会选择的,终止
if action != target_policy[state]:
break
# 更新权重
# 注意:这里假设目标策略是确定性的
# 如果是随机策略,需要乘以 pi(action|state) / b(action|state)
W *= 1.0 / behavior_policy(state)[action]
# 防止权重爆炸
if W > 1e6:
break
if (i_episode + 1) % 1000 == 0:
print(f"Episode {i_episode + 1}/{num_episodes} 完成")
return Q, target_policy
6. MC方法的扩展与前沿¶
6.1 蒙特卡洛树搜索(MCTS)¶
MCTS结合了MC采样与树搜索,在围棋、象棋等游戏中取得巨大成功。
四个步骤: 1. 选择(Selection):使用UCB1从根节点选择子节点 2. 扩展(Expansion):添加新的子节点 3. 模拟(Simulation):从扩展节点进行MC rollout 4. 反向传播(Backpropagation):更新路径上的统计信息
UCB1公式:
其中: - \(\bar{Q}(s, a)\):平均回报估计 - \(N(s)\):状态 \(s\) 的访问次数 - \(N(s, a)\):动作 \(a\) 在状态 \(s\) 的选择次数 - \(c\):探索常数
6.2 蒙特卡洛梯度估计¶
在策略梯度方法中,需要估计:
REINFORCE算法:
方差缩减: - 基线:\(G_t - b(S_t)\) - 因果性:只使用未来回报(REINFORCE with baseline)
6.3 与其他方法的联系¶
MC与TD的关系:
| 方法 | 目标 | 偏差 | 方差 |
|---|---|---|---|
| MC | \(G_t\) | 0 | 高 |
| TD(0) | \(R_{t+1} + \gamma V(S_{t+1})\) | >0 | 中 |
| TD(\(\lambda\)) | \(G_t^\lambda\) | >0(小) | 中 |
\(\lambda\)-回报:
当 \(\lambda = 0\):TD(0) 当 \(\lambda = 1\):MC
7. 收敛性与复杂度理论¶
7.1 样本复杂度总结¶
| 算法 | 样本复杂度 | 备注 |
|---|---|---|
| 首次访问MC | \(O\left(\frac{G_{max}^2}{(1-\gamma)^2\epsilon^2}\ln\frac{1}{\delta}\right)\) | 无偏,高方差 |
| 每次访问MC | \(O\left(\frac{G_{max}^2}{(1-\gamma)^2\epsilon^2}\ln\frac{1}{\delta}\right)\) | 渐近无偏 |
| MC + WIS | \(O\left(\frac{\rho_{max}^2 G_{max}^2}{(1-\gamma)^2\epsilon^2}\ln\frac{1}{\delta}\right)\) | 有偏,低方差 |
7.2 计算复杂度¶
单次episode的计算: - 时间:\(O(T \cdot A)\),其中 \(T\) 是轨迹长度,\(A\) 是动作数 - 空间:\(O(S \cdot A)\),存储Q函数
达到收敛的总计算: - 时间:\(O\left(\frac{G_{max}^2 T A}{(1-\gamma)^2\epsilon^2}\ln\frac{1}{\delta}\right)\) - 空间:\(O(S \cdot A)\)
7.3 方差下界¶
定理 5.8(MC估计的方差下界)
对于任何无偏MC估计量,方差满足:
其中 \(\sigma^2_{min}\) 是回报的内在方差,由环境的随机性决定。
8. 本章总结¶
8.1 核心概念回顾¶
蒙特卡洛方法 = 基于采样的统计推断
统计基础:
├── 首次访问:无偏估计,独立样本
├── 每次访问:有偏但一致,相关样本
└── 收敛速率:O(1/√n),由中心极限定理决定
方差缩减:
├── 控制变量法:利用相关已知量
├── 基线控制:减去状态值估计
├── 对偶变量:负相关样本对
├── 分层采样:消除层间方差
└── 加权IS:解决普通IS的方差爆炸
算法理论:
├── GLIE条件:保证收敛的必要条件
├── ε-贪婪:简单有效的GLIE策略
└── 遗憾分析:O(√T) 累积遗憾
Off-Policy:
├── 普通IS:无但方差可能无界
├── 加权IS:有偏但方差有界
└── 每决策IS:减少长轨迹的方差累积
8.2 MC vs DP vs TD¶
| 特性 | 动态规划 | 蒙特卡洛 | 时序差分 |
|---|---|---|---|
| 需要模型 | 是 | 否 | 否 |
| 学习方式 | 自举 | 采样 | 自举+采样 |
| 更新时机 | 每步 | 每episode | 每步 |
| 偏差 | 0 | 0 | >0 |
| 方差 | 低 | 高 | 中 |
| 适用任务 | 小状态空间 | Episodic | 所有任务 |
8.3 学习路径¶
下一步学习:
├── 时序差分学习 - 结合DP和MC的优点
│ ├── TD(0):单步自举
│ ├── SARSA:On-Policy TD控制
│ └── Q-Learning:Off-Policy TD控制
└── n-step方法 - MC和TD的统一天桥
✅ 自测问题¶
-
从统计角度,首次访问和每次访问MC的主要区别是什么?各自的优缺点?
-
重要性采样的方差为什么会爆炸?加权IS如何解决这个问题?代价是什么?
-
GLIE条件的两个要求是什么?为什么它们对收敛是必要的?
-
证明:ε-贪婪策略满足策略改进定理。
-
设计一个分层采样方案用于MC预测,如何确定最优的样本分配?
-
计算复杂度分析:要达到ε精度,MC方法需要多少样本?这个复杂度与哪些因素有关?
📚 延伸阅读¶
理论基础¶
- Sutton & Barto《Reinforcement Learning: An Introduction》
- 第5章:Monte Carlo Methods
-
第7.3节:Off-Policy Monte Carlo Control
-
Kearns & Singh (2000)
- "Bias-Variance Error Bounds for Temporal Difference Updates"
-
分析MC和TD的偏差-方差权衡
-
Munos (2003)
- "Error Bounds for Approximate Policy Iteration"
- MC方法的误差分析
方差缩减¶
- Greensmith et al. (2004)
- "Variance Reduction Techniques for Gradient Estimates in Reinforcement Learning"
-
策略梯度中的方差缩减
-
Jie & Abbeel (2010)
- "On A Bias-Variance Tradeoff Analysis in Importance Sampling"
- 重要性采样的偏差-方差分析
前沿研究¶
- Silver et al. (2016)
- "Mastering the game of Go with deep neural networks and tree search"
-
MCTS与深度学习的结合
-
Nachum et al. (2019)
- "AlgaeDICE: Policy Gradient from Arbitrary Experience"
- 现代Off-Policy方法
准备好进入下一阶段了吗? 下一章我们将学习时序差分学习,结合DP的自举和MC的采样,实现更高效的学习。