# 1. 先给最核心的框架

强化学习里要区分两件事：

设
$$
\mu(a\mid s)
$$
是**行为策略**（behavior policy），也就是**实际收集数据时**用的策略；

设
$$
\pi(a\mid s)
$$
是**目标策略**（target policy），也就是**你真正想优化/评估**的策略。

于是有三种情况：

### 第一种：on-policy

收集数据用的策略和训练目标策略是同一个，或者几乎同一个：
$$
\mu = \pi
$$

### 第二种：off-policy

收集数据用的策略和训练目标策略不同：
$$
\mu \neq \pi
$$

### 第三种：replay buffer

它不是一种学习范式，而是一个**数据存储机制**。
 它把过去收集到的经验存起来，供以后反复抽样训练。

所以更准确地说：

> replay buffer 本身不等于 off-policy，
>  但**只要你大量使用 replay buffer 里的旧数据，训练通常就会变成 off-policy 或近似 off-policy**。

------

# 2. replay buffer 到底是什么？

它通常存的是经验样本，例如
$$
(s_t, a_t, r_t, s_{t+1}, done_t)
$$
或者更完整一点，还会存：

- observation
- action
- reward
- next observation
- log-probability
- episode id
- hidden state 等

它的作用是：

> 把过去环境交互得到的数据保留下来，后面可以反复随机抽样使用。

这和“rollout buffer”不一样。

### rollout buffer

通常只存当前这轮新鲜数据，短期用完就丢。

### replay buffer

长期存历史数据，可以跨很多轮训练继续使用。

------

# 3. 为什么 replay buffer 天然更适合 off-policy？

因为 replay buffer 里的数据来自**过去很多时刻的旧策略**。
 假设你当前策略已经从 $\pi_{\theta_k}$ 更新到了 $\pi_{\theta_{k+20}}$，buffer 里可能还放着 $\pi_{\theta_{k-100}}$ 采来的数据。

如果你现在拿这些旧数据去训练当前策略，那么就是：

- 数据来自旧行为策略 $\mu$
- 训练目标是当前策略 $\pi$

这正是 off-policy。

所以 replay buffer 的本质作用是：

> **把“单次采样的数据”变成“可重复消费的数据”**。

而一旦你允许“旧数据反复用于当前策略”，就天然打破了 on-policy 的“数据必须由当前策略产生”的要求。

------

# 4. 为什么 off-policy 方法特别喜欢 replay buffer？

因为它们的核心优势就是：

> **旧数据仍然有用**。

这会显著提升样本效率。

比如你和环境交互 1 次得到 1 条 transition，
 如果不用 replay buffer，这条 transition 可能只训练 1 次或少数几次；
 如果用 replay buffer，它可能被抽出来训练几十次、几百次。

这就是 off-policy 方法经常样本效率更高的根本原因。

------

# 5. 为什么 on-policy 方法通常不喜欢 replay buffer？

因为 on-policy 方法要求训练目标和采样分布一致或接近一致。

以策略梯度为例，理论上我们优化的是：
$$
J(\pi)=\mathbb{E}_{\tau \sim p_\pi(\tau)}[R(\tau)]
$$
注意这个期望是对 **$\pi$ 自己诱导的轨迹分布** 取的。

如果你拿旧策略 $\mu$ 采出来的轨迹去近似这个期望，那么你实际上在用：
$$
\tau \sim p_\mu(\tau)
$$
来估计原本属于 $p_\pi(\tau)$ 的目标。
 这会产生**分布失配**（distribution mismatch）。

所以 on-policy 方法最怕的是：

> 当前要优化的策略已经变了，但你还在用很旧的数据估计它的梯度。

这会导致：

- 梯度偏差
- 更新方向失真
- 方差变大
- 训练不稳定

因此大多数 on-policy 方法不用长期 replay buffer，而是用“当前 rollout 数据”做短期训练。

------

# 6. 但 PPO 不是也会重复用同一批数据吗？这算不算 off-policy？

算**轻微 off-policy**，或者更准确地说，算“**用重要性采样做小范围偏移修正的近似 on-policy**”。

PPO 的做法是：

1. 先用旧策略 $\pi_{\text{old}}$ rollout 一批数据

2. 然后用这批数据训练当前策略 $\pi_\theta$ 若干个 epoch

3. 训练时通过 importance ratio 做修正：
	$$
	r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\text{old}}(a_t\mid s_t)}
	$$

所以 PPO 不是“绝对严格的只用一步新数据就更新一次”，
 但它也不是像 DQN/SAC 那样可以任意拿很久以前的数据训练。

PPO 允许的只是：

> **在当前策略和采样策略还比较接近时，对这批数据做有限次数的重复利用。**

这就是为什么 PPO 一般不用大 replay buffer，只用当前 rollout buffer。

------

# 7. importance sampling 到底是干什么的？

这是连接 on-policy、off-policy 和 replay buffer 的关键工具。

它解决的问题是：

> 我想计算关于目标分布 $p(x)$ 的期望，
>  但我手里的样本其实来自另一个分布 $q(x)$。
>  怎么办？

数学上有一个标准恒等式：
$$
\mathbb{E}_{x\sim p}[f(x)]
=
\mathbb{E}_{x\sim q}\left[\frac{p(x)}{q(x)}f(x)\right]
$$
前提是：只要 $p(x)>0$ 的地方，$q(x)$ 也得大于 0。
 这叫**支持集覆盖**（support coverage）。

这个比值
$$
\frac{p(x)}{q(x)}
$$
就是 importance weight。

------

# 8. 在强化学习里 importance sampling 对应什么？

在 RL 里，分布通常来自策略。
 如果某个状态 $s$ 下，行为策略是 $\mu$，目标策略是 $\pi$，那么单步动作选择的权重是：
$$
\rho_t=\frac{\pi(a_t\mid s_t)}{\mu(a_t\mid s_t)}
$$
意思是：

- 如果某个动作在目标策略下比在行为策略下更可能，那这条样本应该“加权更大”
- 如果某个动作在目标策略下更不可能，那这条样本应该“加权更小”

直觉上，这相当于把“来自错误分布的数据”重新校正成“看起来像来自目标分布的数据”。

------

# 9. importance sampling 为什么和 replay buffer 密切相关？

因为 replay buffer 里的样本几乎总来自旧行为策略。
 你若拿它们训练当前策略，就面临：
$$
\mu \neq \pi
$$
于是就需要想办法校正这个偏差。
 importance sampling 正是最基本的校正工具。

所以逻辑关系是：

### replay buffer

让你能反复使用旧数据

### 旧数据

意味着行为策略和当前目标策略不一致

### 策略不一致

意味着分布失配

### importance sampling

用于修正这种分布失配

------

# 10. 为什么不是所有 off-policy 方法都显式用 importance sampling？

这点非常重要。

很多人会误以为：

> off-policy = 一定显式乘 importance weight

其实不是。

要看你训练的对象是什么。

------

## 10.1 对策略梯度方法来说，importance sampling 很自然

因为策略梯度本来就在估计“目标策略的期望梯度”。
 如果样本来自别的策略，就很自然要写成：
$$
\nabla J(\pi)
=
\mathbb{E}_{\tau\sim p_\mu}\left[
\frac{p_\pi(\tau)}{p_\mu(\tau)}
\nabla \log \pi(a\mid s)\,R
\right]
$$
这类推导天然会冒出 importance ratio。

PPO、一些 off-policy actor-critic、离策略策略梯度方法，都会用到这种思想。

------

## 10.2 对 Q-learning 类方法来说，情况不同

像 Q-learning / DQN 的 Bellman 最优方程本身是 off-policy 的。
 它学习的是：
$$
Q^*(s,a)
$$
而不是“当前行为策略自己的 value”。

更新形式像：
$$
Q(s_t,a_t)\leftarrow r_t+\gamma \max_{a'}Q(s_{t+1},a')
$$
这里右边的 $\max_{a'}$ 不要求行为策略等于目标策略。
 所以 Q-learning 可以天然用别的策略采来的数据训练，而不一定显式乘 importance weight。

这就是为什么：

- DQN 大量使用 replay buffer
- 但训练时通常不写 importance ratio

并不是它没有 off-policy 问题，而是它的更新目标结构本来就允许 off-policy。

------

# 11. importance sampling 在轨迹级别和步级别有什么区别？

如果严格从整条轨迹推导，权重应该是整条轨迹概率比：
$$
\frac{p_\pi(\tau)}{p_\mu(\tau)}
$$
在环境动力学不变时，转移概率会约掉，剩下动作概率之比：
$$
\prod_{t=0}^{T}
\frac{\pi(a_t\mid s_t)}{\mu(a_t\mid s_t)}
$$
这叫**trajectory-wise importance sampling**。

但它有个严重问题：

> 连乘会让方差爆炸。

因为即使每一步比值只偏一点，很多步乘起来也会很大或很小。

所以实践中常用更温和的方法：

- per-decision importance sampling
- truncated importance sampling
- weighted / normalized importance sampling
- clipping

PPO 的 ratio clipping，本质上就是“别让 importance weight 太失控”。

------

# 12. PPO 里的 importance sampling 为什么看起来只有一步比值？

PPO 常写：
$$
r_t(\theta)=\frac{\pi_\theta(a_t\mid s_t)}{\pi_{\text{old}}(a_t\mid s_t)}
$$
然后目标是
$$
L^{CLIP}(\theta)=
\mathbb{E}\left[
\min\big(
r_t(\theta)\hat A_t,\;
\text{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\hat A_t
\big)
\right]
$$
这里看起来只是每一步的 action probability ratio，而不是整条轨迹比值。
 原因是：

1. PPO 不是在做严格无偏的全轨迹 IS 估计；
2. 它更像是一种**局部近似更新**；
3. 它假设当前策略和旧策略足够接近，所以单步修正已足够实用；
4. 再通过 clipping 限制比值过大，换取更低方差和更稳定训练。

所以 PPO 里的 importance sampling 不是为了做完全精确的 off-policy 校正，而是为了：

> **允许少量样本复用，同时不让偏差和方差失控。**

------

# 13. 为什么 importance sampling 常常“理论漂亮，实践痛苦”？

因为它有一个经典偏差-方差问题。

------

## 13.1 不做 IS

优点是方差小。
 缺点是偏差大，因为你在用错误分布的数据。

------

## 13.2 做完整 IS

优点是理论上可以无偏。
 缺点是方差可能极大，特别是在：

- 轨迹长
- 策略差异大
- 动作空间大
- 概率很尖锐

时更严重。

------

## 13.3 实践中常做折中

于是很多算法选择：

- 截断权重
- 归一化权重
- 用 clipping
- 只允许小范围 off-policy
- 让目标策略不要离行为策略太远

PPO 就是这条折中路线的典型代表。

------

# 14. replay buffer 与 importance sampling 的关系再总结一遍

可以压成一句话：

> **replay buffer 带来数据复用，数据复用带来策略分布失配，importance sampling 用来纠正这种失配。**

但要补一句：

> **是否显式使用 importance sampling，还取决于算法训练的对象和更新公式。**

- 对策略梯度类：很常见
- 对 Q-learning 类：不一定显式需要

------

# 15. on-policy / off-policy / replay buffer / importance sampling 四者的最简关系图

可以这样理解：

### on-policy

当前策略采样，当前策略训练。
 一般不用长期 replay buffer。
 若有样本复用，也通常是小范围、短期复用。

### off-policy

行为策略采样，目标策略训练。
 天然适合 replay buffer。
 常需要处理分布失配。

### replay buffer

是 off-policy 学习最常见的数据基础设施。
 它提高样本效率，但会让数据越来越“旧”。

### importance sampling

是修正“旧数据分布”和“当前目标分布”不一致的工具。
 在策略梯度中尤为重要。

------

# 16. 一个具体对比例子

## DQN

- 有 replay buffer
- 是 off-policy
- 通常不显式做策略概率 ratio 修正
- 因为 Q-learning 的 Bellman 更新天然允许 off-policy

## REINFORCE

- 纯 on-policy
- 基本不用 replay buffer
- 因为梯度要对当前策略诱导的轨迹分布取期望

## PPO

- 近似 on-policy
- 不用长期 replay buffer，只用当前 rollout buffer
- 用 importance ratio 允许小范围样本复用
- 再用 clipping 限制偏差/方差

## SAC / DDPG / TD3

- off-policy actor-critic
- 大量使用 replay buffer
- actor 训练有时不显式写传统 IS，但整体框架仍是 off-policy，因为 critic 提供了离策略学习支撑

------

# 17. 最后给一个严格但简洁的结论

**第一层：replay buffer 和 on/off-policy 的关系**
 replay buffer 本身只是存数据的机制，但它的长期复用会让训练数据来自旧策略，因此天然更适合 off-policy 学习；对严格 on-policy 方法来说，长期 replay buffer 会破坏“数据来自当前策略”的假设。

**第二层：importance sampling 的作用**
 importance sampling 用于把“由行为策略产生的数据”校正为“关于目标策略的期望”，核心权重是策略概率比：
$$
\frac{\pi(a\mid s)}{\mu(a\mid s)}
$$
它是 off-policy 校正的基本工具，尤其在策略梯度方法中重要。

**第三层：实践中的现实**
 完整 importance sampling 往往方差很大，所以现代算法通常不是机械地做无偏校正，而是在“偏差、方差、稳定性、样本复用”之间做折中。PPO 的 clipping 就是这种折中的经典例子。