LECTURE 21

期中复习(上):模仿学习 · 策略梯度 · Actor-Critic

把前半学期的三条主线——行为克隆的误差界、策略梯度的方差控制、actor-critic 的偏差/方差权衡——重新串成一条可以直接拿去考试的推导链。

讲师:Sergey Levine UC Berkeley 原始材料:lec-21.pdf(34 页)

0. 本讲导读

这一讲没有新算法。它是期中考试前的第一次复习课,Levine 把课程前半段的三大板块——模仿学习(imitation learning)、策略梯度(policy gradient)、actor-critic——各挑出最容易考、也最容易做错的那几页,重新推一遍。

复习课的 slides 有一个非常鲜明的特点:几乎每一页的角落里都埋着一个问句。「Question: how does the total number of mistakes scale with the horizon?」「but… are we allowed to do that??」「Why does this work?」「is it true? and when?」「Do we have to choose just one $n$?」这些问句就是考点本身。本文的组织方式因此与普通讲次不同:每遇到一个这样的问句,就把它还原成一道完整的复习题(题面 + 设定 + 备选答案),然后给出逐步解答、指出考点、说明每个错误选项错在哪里。

另外每一节末尾都会给一张公式速查卡,考前可以只翻这些卡片。

核心结论
  • 模仿学习:朴素行为克隆的期望错误数是 $O(\epsilon H^2)$,而不是监督学习直觉给出的 $O(\epsilon H)$。多出来的那个 $H$ 完全来自分布漂移——你在 $p_{\text{train}}$ 上训练,却在 $p_{\pi_\theta}$ 上测试。
  • 策略梯度:$\nabla_\theta J$ 的推导只用到一个技巧(log-derivative trick)和一个事实(转移概率与 $\theta$ 无关,求导后消失)。它是 on-policy 的,因为期望是对 $p_\theta(\tau)$ 取的。
  • baseline:任何与动作无关的 $b$ 减掉之后梯度仍然无偏,证明只有三行;平均回报不是方差最优的 baseline,但足够好。
  • PPO 不是凭空发明的:它 = 「策略梯度即策略迭代」的界 + 一阶重要性采样近似 + 用裁剪代替显式 TV/KL 约束。考试常考「为什么可以忽略状态分布不匹配」,答案是 $D_{\text{TV}}(p_\theta, p_{\theta'}) \le \epsilon t$。
  • Actor-critic:$\hat A_{\text{C}}$(自举)低方差高偏差,$\hat A_{\text{MC}}$(蒙特卡洛)无偏高方差,$n$-step 在两者之间插值,GAE 则是对所有 $n$ 做 $\lambda^{n-1}$ 指数加权,最后化简成一行 $\sum (\gamma\lambda)^{t'-t}\delta_{t'}$。

全局速查:三大板块的对应关系

板块核心量最关键的一行公式典型失败模式对应讲次
模仿学习期望错误数$\sum_t \mathbb{E}_{p_{\pi_\theta}}[c(s_t,a_t)] \le O(\epsilon H^2)$分布漂移;多模态动作分布Lecture 2
MDP 与目标$J(\theta)=\mathbb{E}_{\tau\sim p_\theta}[\sum_t \gamma^t r(s_t,a_t)]$$p_\theta(\tau)=p(s_1)\prod_t \pi_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)$混淆 $s$ 与 $o$、忘记 $\gamma$Lecture 4
策略梯度$\nabla_\theta J$$\mathbb{E}\left[\sum_t \nabla_\theta \log\pi_\theta(a_t|s_t)\,\hat A_t\right]$方差爆炸;IS 权重指数级Lecture 5
Actor-critic$\hat A^\pi(s,a)$$\hat A_{\text{GAE}}=\sum_{t'\ge t}(\gamma\lambda)^{t'-t}\delta_{t'}$critic 有偏;on-policy 样本效率低Lecture 6
PPO / TRPO$\bar A(\theta')$$\sum_t \mathbb{E}_{s\sim p_\theta}\mathbb{E}_{a\sim\pi_\theta}\left[\frac{\pi_{\theta'}(a|s)}{\pi_\theta(a|s)}A^{\pi_\theta}(s,a)\right]$忽略分布不匹配而不设约束Lecture 7

下面按 slides 的顺序展开:Part 1 模仿学习(第 1–3 节)、Part 2 策略梯度(第 4–8 节)、Part 3 actor-critic(第 9–10 节)。

1. 模仿学习:行为克隆和它为什么会崩

1.1 行为克隆的完整设定

行为克隆(behavioral cloning, BC)只有两步,Levine 在复习时把它压缩到了一页:

第一步,收集数据。让人类专家演示,得到 $N$ 条长度为 $H$ 的轨迹:

$$ \mathcal{D} = \left\{\left(o_1^{(i)}, a_1^{(i)}, \ldots, o_H^{(i)}, a_H^{(i)}\right)\right\}_{i=1}^{N} $$

第二步,跑监督学习,也就是最大似然估计(maximum likelihood estimation, MLE):

$$ \argmax_\theta \sum_{i=1}^{N}\sum_{t=1}^{H} \log \pi_\theta\!\left(a_t^{(i)} \mid o_t^{(i)}\right) $$
行为克隆两步流程:收集演示数据、最大似然拟合,网络结构为编码器输出动作分布参数再采样
行为克隆的完整数据流。左边是观测 $o_t$(一帧车载摄像头图像),经过一个视觉编码器(ViT / ResNet,参数 $\theta$)得到一组动作分布的参数——注意网络输出的不是动作本身,而是分布参数(例如高斯的均值与方差、或离散动作的 logits),然后从这个分布里采样得到 $a_t$(方向盘转角、油门)。这一点很重要:策略 $\pi_\theta(a|o)$ 是一个条件分布,不是一个确定性函数,这样 MLE 目标 $\log \pi_\theta(a|o)$ 才有意义。
注意:$s$ 和 $o$ 的区别

数据集里写的是观测 $o_t$(observation),而分析误差时写的是状态 $s_t$(state)。状态满足马尔可夫性:给定 $s_t$ 和 $a_t$,$s_{t+1}$ 与历史无关。观测通常只是状态的一个(可能有损的)函数,$o_t = g(s_t)$。BC 在观测上做 MLE 完全没问题;但下面的理论分析为了能写出 $p_{\pi_\theta}(s_t)$ 这样的量,会假设我们直接看到状态。考试里如果题目强调「部分可观测」,那么「专家行为看起来非马尔可夫」就是一个合法答案。

1.2 复习题 Q1:错误数如何随 horizon 增长?

这是复习课上第一个正式的问句,也是模仿学习部分几乎必考的一道题。

复习题 Q1

设定。定义 0/1 代价

$$ c(s_t, a_t) = \begin{cases} 0 & \text{if } a_t = \pi^\star(s_t) \\ 1 & \text{otherwise} \end{cases} $$

其中 $\pi^\star$ 是专家策略。我们关心的量是

$$ \sum_{t=1}^{H} \mathbb{E}_{s_t \sim p_{\pi_\theta}(s_t),\, a_t \sim \pi_\theta(a_t|s_t)}\left[c(s_t, a_t)\right], $$

它正是期望的总犯错次数。假设学到的策略在训练分布上犯错概率不超过 $\epsilon$。

问:这个总犯错次数如何随 horizon $H$ 增长?

(A) $O(\epsilon)$    (B) $O(\epsilon H)$    (C) $O(\epsilon H^2)$    (D) $O(\epsilon^2 H)$

量化行为克隆有多糟:0/1 代价的期望和,以及状态分布随时间偏离训练轨迹的三维示意图
右边这张三维图是理解整个分析的关键。横轴是时间,纵轴(斜着那条)是状态,黑色细线是训练轨迹(专家走过的路),红色椭圆是学到的策略 $\pi_\theta$ 在各时刻的状态分布 $p_{\pi_\theta}(s_t)$。$t=1$ 时红圈很小并且套住黑线——初始状态分布是给定的,两者一致;随着 $t$ 增大,红圈越来越扁、越来越长,而且中心逐渐偏离黑线。这就是分布漂移:期望里的状态是从 $p_{\pi_\theta}$ 采的,不是从 $p_{\text{train}}$ 采的,而且这个偏离本身依赖于过去所有动作(图中标注 "note that this depends on past actions")。

答案:(C) $O(\epsilon H^2)$。

直觉版推导(先看这个,考场上够用)。把策略想象成一个走钢丝的人。它在钢丝上(训练分布覆盖的状态)时,每一步犯错概率是 $\epsilon$;一旦掉下去,就进入了训练数据里从来没出现过的状态,网络在那里的输出完全没有保证,可以悲观地假设之后每一步都错。

于是:第一次犯错发生在时刻 $t$ 的概率大约是 $\epsilon$(准确说是 $(1-\epsilon)^{t-1}\epsilon$,但我们只要上界),此后剩下的 $H-t$ 步全部计入代价。总期望代价

$$ \mathbb{E}[\text{mistakes}] \;\lesssim\; \sum_{t=1}^{H} \epsilon \cdot (H - t) \;=\; \epsilon \cdot \frac{H(H-1)}{2} \;=\; O(\epsilon H^2). $$

数值感受一下:$\epsilon = 0.01$(每步只有 1% 概率犯错,听起来是个非常好的监督学习模型),$H = 1000$(一段几十秒的驾驶)。$O(\epsilon H) = 10$ 次错误,还能接受;$O(\epsilon H^2) = 0.01\times 1000^2/2 = 5000$ 次错误——比 horizon 本身还大,意味着策略基本上从中途开始就一直在犯错。这就是为什么朴素 BC 在长时序控制任务上会彻底失效。

常见误区:为什么 (B) $O(\epsilon H)$ 错?

选 (B) 的人是把 BC 当成了普通监督学习:每步错 $\epsilon$,走 $H$ 步,总错 $\epsilon H$。这个推理只有在测试分布等于训练分布时才成立。但 RL 里策略的动作会改变后续状态分布,一次犯错会把你推到一个训练集没覆盖的状态,在那里 $\epsilon$ 的保证失效了。多出来的那个 $H$ 就是「犯错之后剩余的时间步数」。
(A) 忽略了误差会累积;(D) 把 $\epsilon$ 平方,但错误只需要发生一次就够了,不需要两次独立事件同时发生,所以不会出现 $\epsilon^2$。

直觉:为什么 DAgger 能把它降回 $O(\epsilon H)$

提前剧透一下第 3 节:如果我们能保证训练分布就是策略自己的分布($p_{\text{train}} = p_{\pi_\theta}$),那么上面「掉下钢丝就没救了」的情形不存在——策略访问的每个状态都在训练分布里,每步错 $\epsilon$,总错 $\epsilon H$,二次项消失。DAgger 干的就是这件事。

2. 重点推导:$O(\epsilon H^2)$ 界的严格证明

上面的「走钢丝」论证假设了「一旦犯错就永远错下去」,这是一个很强的假设。Levine 在复习课上把更一般的版本完整推了一遍——这是本讲最长、也最值得逐行吃透的一段推导,考试里非常适合出「填空补步骤」。

2.1 假设与那个「有用的性质」

唯一的假设是:在训练分布上,犯错概率不超过 $\epsilon$:

$$ \mathbb{E}_{s_t \sim p_{\text{train}}(s_t)}\left[\pi_\theta\!\left(a_t \ne \pi^\star(s_t) \mid s_t\right)\right] \le \epsilon . $$

注意这里不再假设「一旦犯错就完蛋」。相反,我们只写下一个恒等式:把策略在时刻 $t$ 的状态分布拆成「一次都没错过」和「至少错过一次」两部分:

$$ p_{\pi_\theta}(s_t) = \underbrace{(1-\epsilon)^t}_{\text{一次都没犯错的概率}} p_{\text{train}}(s_t) \;+\; \underbrace{\left(1-(1-\epsilon)^t\right)}_{\text{至少犯过一次错}} p_{\text{mistake}}(s_t). $$
更一般的分析:训练分布上犯错概率不超过 epsilon 的假设,以及策略状态分布的混合分解
这一页只有两行,但每一行都要读懂。上面那行是假设:从训练分布采一个状态,策略给出与专家不同动作的概率不超过 $\epsilon$。下面那行是恒等式而非假设:如果前 $t$ 步一次都没犯错,那么策略走过的状态就和专家一模一样,因而服从 $p_{\text{train}}$;只要犯过一次错,它就落到某个我们完全不了解的分布 $p_{\text{mistake}}$ 上。关键在于我们对 $p_{\text{mistake}}$ 不做任何假设——它可以任意糟糕,后面用总变差散度的上界 $1$ 来兜底。
常见误区

很多人把 $(1-\epsilon)^t$ 当成「不等式」的一部分而纠结它是否精确。它其实是定义:我们先规定「没犯错的那一支」权重是 $(1-\epsilon)^t$,然后把剩下所有概率质量定义成 $p_{\text{mistake}}$。因为 $p_{\pi_\theta}$ 和 $(1-\epsilon)^t p_{\text{train}}$ 都是(次)概率测度,剩余部分归一化后必然是一个合法分布,所以这个分解总是成立。

2.2 第一步:用总变差散度界住分布差异

总变差散度(total variation divergence)定义为

$$ D_{\text{TV}}(p, q) = \frac{1}{2}\sum_x |p(x) - q(x)| \;\le\; 1 . $$

把上面的分解代进去,逐步化简(红色划掉的是相消的项):

$$ \begin{aligned} D_{\text{TV}}(p_{\text{train}}, p_{\pi_\theta}) &= \frac{1}{2}\sum_{s_t}\left|p_{\text{train}}(s_t) - p_{\pi_\theta}(s_t)\right| \\ &= \frac{1}{2}\sum_{s_t}\left|p_{\text{train}}(s_t) - (1-\epsilon)^t p_{\text{train}}(s_t) - \left(1-(1-\epsilon)^t\right)p_{\text{mistake}}(s_t)\right| . \end{aligned} $$

诀窍在于把第一个 $p_{\text{train}}(s_t)$ 拆成两块:

$$ p_{\text{train}}(s_t) = (1-\epsilon)^t p_{\text{train}}(s_t) + \left(1-(1-\epsilon)^t\right) p_{\text{train}}(s_t). $$

于是 $(1-\epsilon)^t p_{\text{train}}$ 那一项恰好被减掉,只剩下公因子 $\left(1-(1-\epsilon)^t\right)$:

$$ = \left(1-(1-\epsilon)^t\right)\cdot\frac{1}{2}\sum_{s_t}\left|p_{\text{train}}(s_t) - p_{\text{mistake}}(s_t)\right| \;\le\; 1-(1-\epsilon)^t \;\le\; \epsilon t . $$

最后两个不等号分别用到:

  1. $\frac{1}{2}\sum_{s_t}|p_{\text{train}} - p_{\text{mistake}}| = D_{\text{TV}} \le 1$——这就是对 $p_{\text{mistake}}$ 唯一的要求,它可以是任何分布;
  2. 有用的恒等式:对 $\epsilon \in [0,1]$ 有 $(1-\epsilon)^t \ge 1-\epsilon t$,因此 $1-(1-\epsilon)^t \le \epsilon t$。
推导:$(1-\epsilon)^t \ge 1-\epsilon t$ 从哪来

这是伯努利不等式。最快的证法是对 $t$ 做归纳:$t=0$ 时两边都是 1。设 $(1-\epsilon)^t \ge 1-\epsilon t$,两边乘以非负数 $(1-\epsilon)$:

$$ (1-\epsilon)^{t+1} \ge (1-\epsilon t)(1-\epsilon) = 1-\epsilon(t+1) + \epsilon^2 t \ge 1-\epsilon(t+1), $$

因为 $\epsilon^2 t \ge 0$。证毕。考试里如果要求「说明 $\epsilon t$ 这个上界从何而来」,答这三行即可。

用总变差散度界住训练分布与策略分布之间差异的完整代数推导
这一页就是上面那串代数的原始手写版。注意中间用红线划掉的两处:把 $p_{\text{train}}$ 拆成 $(1-\epsilon)^t p_{\text{train}} + (1-(1-\epsilon)^t)p_{\text{train}}$ 之后,第一块与减号后面的 $(1-\epsilon)^t p_{\text{train}}$ 精确抵消。左下角那行小字 "$(1-\epsilon)^t \ge 1-\epsilon t$ for $\epsilon \in [0,1]$" 就是把 $1-(1-\epsilon)^t$ 换成 $\epsilon t$ 的依据。结论:$D_{\text{TV}}(p_{\text{train}}, p_{\pi_\theta}) \le \epsilon t$——分布差异随时间线性增长。

2.3 第二步:把分布差异转成代价差异

现在回到我们真正关心的量。把期望展开成对状态求和,再加一项减一项:

$$ \begin{aligned} &\sum_{t=1}^{H} \mathbb{E}_{s_t\sim p_{\pi_\theta}(s_t),\,a_t\sim\pi_\theta}\left[c(s_t,a_t)\right] = \sum_{t=1}^{H}\sum_{s_t} p_{\pi_\theta}(s_t)\,\mathbb{E}_{a_t\sim\pi_\theta(a_t|s_t)}\left[c(s_t,a_t)\right] \\ &= \sum_{t=1}^{H}\sum_{s_t}\Big(p_{\text{train}}(s_t) + \big(p_{\pi_\theta}(s_t) - p_{\text{train}}(s_t)\big)\Big)\mathbb{E}_{a_t\sim\pi_\theta}\left[c(s_t,a_t)\right] \\ &\le \sum_{t=1}^{H}\sum_{s_t}\Big(p_{\text{train}}(s_t) + \big|p_{\pi_\theta}(s_t) - p_{\text{train}}(s_t)\big|\Big)\mathbb{E}_{a_t\sim\pi_\theta}\left[c(s_t,a_t)\right] \\ &= \sum_{t=1}^{H}\left[\underbrace{\sum_{s_t} p_{\text{train}}(s_t)\mathbb{E}_{\pi_\theta}[c]}_{\text{(I)}}\right] + \left[\underbrace{\sum_{s_t}\big|p_{\pi_\theta}(s_t)-p_{\text{train}}(s_t)\big|}_{\text{(II)}}\cdot\underbrace{\mathbb{E}_{\pi_\theta}[c]}_{\text{(III)}}\right]. \end{aligned} $$

「加一项减一项」这一步是整个推导的枢纽:它把「在错误分布下的期望」改写成「在正确分布下的期望」加「一个分布差异项」。第三行的不等号只是把差值换成绝对值(因为 $c \ge 0$,放大差值只会让上界更大)。

三块分别界住:

项含义上界依据
(I)训练分布下的期望犯错率$\epsilon$就是最初的假设
(II)$\sum_{s_t}|p_{\pi_\theta}-p_{\text{train}}| = 2D_{\text{TV}}$$2\epsilon t$2.2 节的结论(注意有个因子 2,因为 TV 定义里带 $\tfrac12$)
(III)0/1 代价的期望$1$$c \in \{0,1\}$,期望不超过 1

合起来:

$$ \sum_{t=1}^{H}\mathbb{E}_{p_{\pi_\theta}}\left[c(s_t,a_t)\right] \;\le\; \sum_{t=1}^{H}\left(\epsilon + 2\epsilon t\right) \;=\; \epsilon H + \epsilon H(H+1) \;=\; O(\epsilon H^2). $$
把三项分别界住,最终得到 O(epsilon H^2) 的结论
最终收官。左下角 $\le \sum_{t=1}^{H}\epsilon + 2\epsilon t$ 就是把三个大括号下面的界代回去的结果,右边黄色标注写着 "This is bad because error increases quadratically with horizon"。请特别注意中间那个 $\le 2D_{\text{TV}}(p_{\pi_\theta}, p_{\text{train}}) \le 2\epsilon t$——2.2 节推的那半页在这里才被用上;而最右边那个 $\le 1$ 是 0/1 代价的平凡上界,正是它让我们完全不需要知道 $p_{\text{mistake}}$ 长什么样。
速查卡:模仿学习误差界
量公式一句话
假设$\mathbb{E}_{p_{\text{train}}}[\pi_\theta(a\ne\pi^\star(s)|s)]\le\epsilon$只在训练分布上有保证
分解$p_{\pi_\theta}=(1-\epsilon)^t p_{\text{train}} + (1-(1-\epsilon)^t)p_{\text{mistake}}$恒等式,非假设
关键引理$(1-\epsilon)^t \ge 1-\epsilon t$伯努利不等式
分布界$D_{\text{TV}}(p_{\text{train}},p_{\pi_\theta}) \le \epsilon t$线性发散
代价界$\sum_t \mathbb{E}[c] \le O(\epsilon H^2)$二次发散
DAgger 后$O(\epsilon H)$训练分布 = 策略分布

更细致的分析(包括 DAgger 的 no-regret 保证)见 Ross 等人的论文 A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning (2011)。

3. 修复分布漂移:DAgger,以及为什么拟合不了专家

3.1 复习题 Q2:DAgger 到底改了哪一边?

复习题 Q2

我们希望 $p_{\text{data}}(o_t) = p_{\pi_\theta}(o_t)$。有两条路:(甲) 想办法让策略的状态分布 $p_{\pi_\theta}$ 贴近数据分布;(乙) 想办法让数据分布 $p_{\text{data}}$ 贴近策略的状态分布。DAgger 走的是哪条?它的四个步骤是什么?为什么第 3 步必须由人来做?

答案:走的是 (乙)。Levine 原话是「instead of being clever about $p_{\pi_\theta}(o_t)$, be clever about $p_{\text{data}}(o_t)$」。路线 (甲) 需要约束策略的行为(比如强行让它别偏离专家),这既难做也会损害性能;路线 (乙) 只需要换数据,而数据是我们能控制的东西。

DAgger(Dataset Aggregation)的四步循环:

步骤操作为什么必须这样
1用人类数据 $\mathcal{D}=\{o_1,a_1,\ldots,o_N,a_N\}$ 训练 $\pi_\theta(a_t|o_t)$先要有一个能跑的初始策略
2运行 $\pi_\theta$,收集只有观测的数据集 $\mathcal{D}_\pi=\{o_1,\ldots,o_M\}$这些 $o$ 正是从 $p_{\pi_\theta}$ 采出来的——恰恰是我们缺的分布
3请人对 $\mathcal{D}_\pi$ 中的每个 $o$ 标注动作 $a_t$这是瓶颈:只有专家知道「在这个策略自己走出来的怪状态下应该怎么办」,策略自己标就是自欺欺人
4聚合 $\mathcal{D} \leftarrow \mathcal{D}\cup\mathcal{D}_\pi$,回到第 1 步训练分布逐渐变成策略自己的分布,$O(\epsilon H^2)$ 退化为 $O(\epsilon H)$
DAgger 数据聚合算法的四个步骤与其动机
DAgger 的完整循环。绿色的箭头表示 4 → 1 的回环。最容易被忽略的是第 2 步收集的 $\mathcal{D}_\pi$ 只包含观测 $\{o_1,\ldots,o_M\}$ 而没有动作——策略当然产生了动作,但那些动作可能是错的,不能当标签。所以才有第 3 步的人工标注,这也是 DAgger 在实践中最难落地的地方:让人对着一堆离线的图像帧回答「这一帧你会怎么打方向盘」,既费力又容易标不准。
常见误区

「DAgger 让策略去模仿专家在专家自己访问的状态上的行为」——错。DAgger 的全部意义在于,让专家在学生访问的状态上给出标注。如果只在专家轨迹上加数据,那就还是原来的 BC,分布漂移一点没解决。

3.2 复习题 Q3:为什么即使没有分布漂移,也可能拟合不了专家?

DAgger 解决的是分布问题。但还有一类完全正交的问题:即使 $p_{\text{data}} = p_{\pi_\theta}$,模型也可能学不像专家。Levine 给了两个原因,这是一道标准的简答题。

复习题 Q3

列出「我们可能拟合不了专家」的两个原因,并各给一个例子和一个解法。

原因一:非马尔可夫行为(non-Markovian behavior)。人类的动作依赖于历史,而不只是当前这一帧。经典例子:你在演示开车时看到一个刹车灯亮了,你踩了刹车;但一秒后灯灭了,画面上看不出任何异常,你却仍然在减速。策略只看当前帧 $o_t$,会学到「这种画面下有时刹车有时不刹车」的矛盾标签。解法:把策略改成 $\pi_\theta(a_t \mid o_1,\ldots,o_t)$,用 RNN / Transformer 编码历史。

原因二:多模态行为(multimodal behavior)。面对同一棵树,人类可以选择从左绕、也可以从右绕,两者都是好动作。如果你用一个单峰高斯来拟合,MLE 会把两个模态平均掉,输出「直接撞树」。

拟合专家失败的两个原因:非马尔可夫行为与多模态行为,配绕树示意图与滑雪撞树漫画
左边那棵树是多模态问题的标准插图:两条黑色箭头分别从树的左侧和右侧绕过,都是合法演示。假如你用高斯策略 $\pi_\theta(a|s)=\mathcal{N}(\mu_\theta(s),\Sigma)$ 做 MLE,最优 $\mu_\theta$ 就是两条路径动作的加权平均——正对着树。右边 Charles Addams 的滑雪漫画(滑雪痕迹从树两边穿过)是同一个笑话的另一个版本。要点是:这不是数据不够或网络不够大的问题,而是模型类(单峰分布)根本表达不了目标分布。

3.3 解法之一:自回归离散化

复习题 Q4

把连续动作向量 $a_t = (a_{t,0}, a_{t,1}, a_{t,2}) = (0.1,\ 1.2,\ -0.3)$ 的每一维分别离散化成若干 bin,然后用一个自回归模型逐维预测。为什么这样做能表示任意多模态分布?

答案:因为链式法则。模型的三步分别输出

$$ p(a_{t,0} \mid s_t),\qquad p(a_{t,1} \mid s_t, a_{t,0}),\qquad p(a_{t,2}\mid s_t, a_{t,0}, a_{t,1}), $$

把它们乘起来:

$$ p(a_{t,2}\mid s_t,a_{t,0},a_{t,1})\,p(a_{t,1}\mid s_t,a_{t,0})\,p(a_{t,0}\mid s_t) = p(a_{t,0},a_{t,1},a_{t,2}\mid s_t) = p(a_t\mid s_t). $$

两点缺一不可:(1) 每一维用离散分布(softmax over bins),而离散分布可以是任意形状的,包括双峰;(2) 后面的维度以前面的维度为条件,所以维度之间的相关性也被保留了。如果去掉条件、让三维独立(即 $\prod_k p(a_{t,k}|s_t)$),你能表示「第 0 维双峰」,但表示不了「左绕时第 0 维取 $-1$ 且第 1 维取 $+1$,右绕时相反」这种联合模态,采样时会混搭出两个模态之间的无效动作。

自回归离散化:三个序列模型块依次输出每一维动作的离散分布,右侧是链式法则的分解
左边的实现:图像编码器把 $o_t$ 编成 token 喂给一个自回归 Transformer,第一个 block 输出 $a_{t,0}$ 上的直方图(注意画的是双峰——左右两根柱子高、中间凹下去,正是绕树的两个模态),采样得到 $a_{t,0}$ 后再喂回给第二个 block,如此类推。右边是数学解释:三个条件分布连乘 = 联合分布。这就是 RT-1、VQ-BeT 一类机器人策略的基本骨架。

3.4 解法之二:flow matching

离散化在动作维度高时会遇到 bin 数爆炸的问题。另一条路是直接学一个能表示复杂连续分布的生成模型,本课选的是 flow matching(与扩散模型同源,但训练目标更简单)。

采样过程:从噪声出发,沿着一个学到的速度场积分。

  1. 采 $x_0 \sim \mathcal{N}(0, I)$;
  2. 对 $t \in \{0, \Delta t, 2\Delta t, \ldots, 1-\Delta t\}$ 迭代 $x_{t+\Delta t} \leftarrow x_t + v(x_t, t)\Delta t$(欧拉积分);
  3. 返回 $x_1$。

训练过程:告诉网络,在噪声与数据的连线上,正确的速度是什么。

  1. 采 $x_0\sim\mathcal{N}(0,I)$;
  2. 从数据集 $\mathcal{D}=\{x^{(i)}\}_{i=1}^N$ 采一个真实样本 $x_1$;
  3. 采 $t\sim p(t)$,例如 $\mathcal{U}(0,1)$;
  4. 令 $x_t = t\,x_1 + (1-t)\,x_0$(噪声与数据之间的线性插值);
  5. 对 $\left\|v(x_t,t) - \underbrace{(x_1-x_0)}_{\text{target velocity}}\right\|^2$ 求梯度更新 $v$。
直觉:为什么回归一个「平均速度」却能生成多模态样本

看起来很矛盾:目标速度 $x_1-x_0$ 对同一个 $(x_t,t)$ 有很多可能取值,网络做最小二乘回归学到的是条件均值 $\mathbb{E}[x_1-x_0 \mid x_t, t]$,不是某一条具体路径。矛盾的化解在于:这个条件均值场的积分曲线恰好把 $\mathcal{N}(0,I)$ 输运成数据分布。在 $t$ 很小时不同模态的速度确实被平均了,所以粒子先往「中间」走;但随着 $t$ 增大、$x_t$ 逐渐靠近某一个模态,条件均值就被那个模态主导,粒子被推向它。多模态性是在积分过程中逐渐分化出来的,而不是靠单步预测的多峰性。做机器人策略时,把 $v$ 额外条件在 $s_t$ 上,就得到 $\pi_\theta(a|s)$。

flow matching 概览:预测速度场的欧拉积分热力图、训练时的线性插值路径与目标速度
上排:左端是噪声分布 $\pi_0$(单峰高斯),右端是目标分布 $\pi_1$(双峰),中间的热力图是学到的速度场 $v(x_t,t)$,红色表示「向上推」、蓝色表示「向下拉」。可以看到在 $t$ 接近 1 的右侧,场分裂成上下两条红/蓝带,把粒子分别送进两个峰——这正是多模态如何涌现出来的可视化。下排:训练时的单条路径,绿色直线连接 $x_0$(左)与 $x_1$(右),红色箭头标出在插值点 $x_t$ 处的目标速度 $v(x_t,t)=x_1-x_0$(一条直线上处处相同)。

3.5 目标条件行为克隆

最后一个模仿学习的话题:目标条件行为克隆(goal-conditioned BC)。动机是「失败的演示也是数据」——一条没到达目标 $g$ 的轨迹,对于它实际到达的那个终点来说是完美演示。

做法:对每条演示 $\{s_1^i, a_1^i, \ldots, s_{T-1}^i, a_{T-1}^i, s_T^i\}$,把它的最后一个状态 $s_T^i$ 当作目标,最大化

$$ \sum_i \sum_t \log \pi_\theta\!\left(a_t^i \mid s_t^i,\ g = s_T^i\right). $$

这样学到的是一个目标条件策略 $\pi_\theta(a\mid s, g)$,测试时给定任意目标 $g$ 都能用。

目标条件行为克隆:三条通向不同终点的演示轨迹,各自以自己的终点作为目标标签
图上一辆车分岔出三条轨迹通向三个不同终点。训练时每条 demo 都被视为「到达它自己终点 $s_T$ 的成功演示」(右侧标注 "successful demo for reaching $s_T$"),于是三条轨迹全部可用,没有一条被浪费。这个技巧和后面要学的 hindsight experience replay 是同一个思想:重新标注目标,让失败变成成功。注意它不解决分布漂移——如果测试时给的 $g$ 与训练分布差很远,$O(\epsilon H^2)$ 的问题依然存在。

4. 策略梯度:直接微分与 log-derivative trick

Part 2 开始。模仿学习需要专家;强化学习不需要,代价是我们必须自己对目标函数求导。全部推导只有六行,但每一行都可能被单独拿出来考。

4.1 六行推导,逐行解释

第 1 行:目标。我们要找的是

$$ \theta^\star = \argmax_\theta J(\theta), \qquad J(\theta) = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[r(\tau)\right], $$

其中 $r(\tau) = \sum_{t=1}^{H} r(s_t,a_t)$ 是整条轨迹的回报。参数 $\theta$ 出现在期望的分布里,而不是被期望的函数里——这正是 RL 与监督学习最本质的区别,也是为什么不能直接反向传播。

第 2 行:轨迹分布。

$$ p_\theta(s_1,a_1,\ldots,s_H,a_H) = p(s_1)\prod_{t=1}^{H}\pi_\theta(a_t\mid s_t)\,p(s_{t+1}\mid s_t,a_t). $$

第 3 行:log-derivative trick。核心恒等式是

$$ p_\theta(\tau)\,\nabla_\theta \log p_\theta(\tau) = p_\theta(\tau)\cdot\frac{\nabla_\theta p_\theta(\tau)}{p_\theta(\tau)} = \nabla_\theta p_\theta(\tau). $$

用它把 $\nabla_\theta J$ 变回一个期望:

$$ \nabla_\theta J(\theta) = \nabla_\theta\!\int p_\theta(\tau) r(\tau)\,d\tau = \int \nabla_\theta p_\theta(\tau)\,r(\tau)\,d\tau = \int p_\theta(\tau)\nabla_\theta\log p_\theta(\tau)\,r(\tau)\,d\tau = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[\nabla_\theta\log p_\theta(\tau)\,r(\tau)\right]. $$

为什么非要变成期望?因为期望可以用采样近似,而 $\int \nabla_\theta p_\theta(\tau)\,r(\tau)d\tau$ 不能——$\nabla_\theta p_\theta$ 不是概率分布,你没法从它「采样」。

第 4 行:取对数把连乘变连加。

$$ \log p_\theta(\tau) = \log p(s_1) + \sum_{t=1}^{H}\log\pi_\theta(a_t\mid s_t) + \sum_{t=1}^{H}\log p(s_{t+1}\mid s_t,a_t). $$

第 5 行:划掉两项。$\log p(s_1)$ 和 $\log p(s_{t+1}|s_t,a_t)$ 都不含 $\theta$,对 $\theta$ 求梯度后为零:

$$ \nabla_\theta \log p_\theta(\tau) = \sum_{t=1}^{H}\nabla_\theta \log\pi_\theta(a_t\mid s_t). $$

第 6 行:结论。

$$ \nabla_\theta J(\theta) = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[\left(\sum_{t=1}^{H}\nabla_\theta\log\pi_\theta(a_t\mid s_t)\right)\left(\sum_{t=1}^{H} r(s_t,a_t)\right)\right]. $$
直接策略微分的完整推导,红线划掉初始状态分布与转移概率两项
整页推导的原图。左上是目标与 log-derivative trick 的结果,右上把 $p_\theta(\tau)$ 取对数展开,绿色下划线标出「这一项对应那一项」。中间那个大方括号里,两条红线划掉的正是 $\log p(s_1)$ 与 $\log p(s_{t+1}|s_t,a_t)$。这是本课最有名的一张图:我们不需要知道转移概率(model-free),因为它在求导时消失了。
复习题 Q5

下面哪些说法正确?
(A) 策略梯度需要知道环境的转移概率 $p(s'|s,a)$。
(B) 策略梯度的估计是无偏的。
(C) 策略梯度可以用旧策略采的样本直接估计。
(D) 如果奖励全部加上一个常数 $c$,策略梯度的期望不变。

答案:只有 (B) 对。

  • (A) 错:第 5 行已经把转移项划掉了,这就是 model-free 的来源。我们仍然需要与环境交互来采轨迹,但不需要它的解析形式。「不需要模型」≠「不需要环境」,这是最常见的混淆。
  • (B) 对:整个推导只用了恒等变形,采样估计 $\frac1N\sum_i$ 是对期望的无偏估计。无偏但方差极大,这是后面所有改进(baseline、causality、critic、GAE)的出发点。
  • (C) 错:期望是对 $p_\theta(\tau)$ 取的,$\theta$ 一变样本就失效了,所以朴素策略梯度是 on-policy 的。想用旧样本必须做重要性采样(第 6 节)。
  • (D) 错——而且这是个有意思的陷阱。加常数 $c$ 会让 $r(\tau)$ 变成 $r(\tau)+Hc$,期望上确实不变(因为 $\mathbb{E}[\nabla\log p_\theta \cdot Hc]=0$,见第 5 节的 baseline 证明),但有限样本的方差会剧烈改变。如果原来回报有正有负、加了常数后全为正,那么所有采到的轨迹都会被「提升概率」,只是提升幅度不同,梯度估计的信噪比会显著恶化。严格说「期望不变」是对的、「策略梯度不变」是错的——考试里若给的是「梯度估计不变」,选它就错了。

4.2 最小实现

import torch

def reinforce_loss(logp, returns):
    """logp:    [N, H]  每步动作的 log pi_theta(a_t|s_t)
       returns: [N, H]  每步的 reward-to-go(已减 baseline)
       返回一个标量 loss,对它做 .backward() 即得 -grad J。"""
    # 注意 returns 必须 detach:它是「权重」,不是可微目标
    return -(logp * returns.detach()).sum(dim=1).mean()

# 朴素版(对应第 6 行公式,未用 causality):
# weight = returns.sum(dim=1, keepdim=True).expand_as(logp)
# loss = -(logp * weight.detach()).sum(dim=1).mean()

两个实现细节值得记住:(1) 权重必须 detach(),否则 PyTorch 会顺着 returns 反传,得到一个完全错误的梯度;(2) 对时间维求和、对 batch 维求平均——公式里 $\sum_t$ 是求和,$\mathbb{E}_\tau$ 是平均,写反了会让梯度尺度随 $H$ 变化。

5. Baseline:为什么可以减、减什么最好

5.1 复习题 Q6:我们「被允许」减 baseline 吗?

复习题 Q6

实践中我们把梯度估计写成

$$ \nabla_\theta J(\theta) \approx \frac1N\sum_{i=1}^{N}\nabla_\theta\log p_\theta(\tau_i)\left[r(\tau_i) - b\right], \qquad b = \frac1N\sum_{i=1}^{N} r(\tau_i). $$

但…… are we allowed to do that? 请证明减去 $b$ 之后估计仍然无偏,并说明对 $b$ 的要求是什么。

解答。只需证明多减的那一项期望为零。用第 4 节的恒等式 $p_\theta(\tau)\nabla_\theta\log p_\theta(\tau) = \nabla_\theta p_\theta(\tau)$:

$$ \mathbb{E}\left[\nabla_\theta \log p_\theta(\tau)\, b\right] = \int p_\theta(\tau)\nabla_\theta\log p_\theta(\tau)\, b\, d\tau = \int \nabla_\theta p_\theta(\tau)\, b\, d\tau = b\,\nabla_\theta \int p_\theta(\tau)\,d\tau = b\,\nabla_\theta 1 = 0 . $$

四个等号分别是:代入期望定义 → 用恒等式 → 把常数 $b$ 提出、梯度与积分交换 → 概率归一化,$1$ 的梯度是 $0$。

对 $b$ 的要求:$b$ 不能依赖于被求导的那个随机变量(动作)。倒数第二个等号要求 $b$ 能提到积分号外,也就是 $b$ 与 $\tau$ 无关(或者在逐时间步的版本里,$b(s_t)$ 与 $a_t$ 无关即可——因为那时对 $a_t$ 积分同样给出 $\nabla_\theta 1 = 0$)。

baseline 的无偏性证明,右上角是便利恒等式,右侧是回报曲面上三条轨迹的示意
右上角蓝框里就是那个「便利恒等式」$p_\theta(\tau)\nabla_\theta\log p_\theta(\tau)=\nabla_\theta p_\theta(\tau)$,整个证明就靠它。右侧的彩色曲面是回报景观,三条黑色轨迹代表三个采样,绿色 ✓ 和橙色 ✗ 标出「高于平均」与「低于平均」的样本:减掉 baseline 之后,比平均好的轨迹概率被提升,比平均差的被压低;不减 baseline 时,如果回报恒为正,所有轨迹的概率都被提升,只是幅度不同,梯度全靠幅度差异传递信息,信噪比差得多。页面下方两行结论:「subtracting a baseline is unbiased in expectation!」和「average reward is not the best baseline, but it's pretty good!」

5.2 复习题 Q7:什么才是方差最优的 baseline?

既然任意常数 $b$ 都无偏,我们可以挑一个让方差最小的。记 $g(\tau)=\nabla_\theta\log p_\theta(\tau)$,方差为

$$ \mathrm{Var} = \mathbb{E}\left[g(\tau)^2\left(r(\tau)-b\right)^2\right] - \left(\mathbb{E}\left[g(\tau)(r(\tau)-b)\right]\right)^2 . $$

第二项与 $b$ 无关(我们刚证了减 $b$ 不改变期望),所以只需对第一项求导置零:

$$ \frac{d}{db}\mathbb{E}\left[g^2(r-b)^2\right] = -2\,\mathbb{E}\left[g^2 r\right] + 2b\,\mathbb{E}\left[g^2\right] = 0 \quad\Longrightarrow\quad b^\star = \frac{\mathbb{E}\left[g(\tau)^2\, r(\tau)\right]}{\mathbb{E}\left[g(\tau)^2\right]} . $$

也就是被梯度幅值平方加权的平均回报。实践中几乎没人用它:它需要逐参数地估计($g$ 是向量,严格说每个分量有自己的最优 $b$),估计本身又引入噪声。Levine 的判断是「average reward is not the best baseline, but it's pretty good」——用简单平均回报,或者更好地,用一个学出来的 $\hat V^\pi_\phi(s_t)$ 作为状态相关 baseline,这就通向 actor-critic。

速查卡:策略梯度
名称公式性质
log-derivative trick$p\nabla\log p = \nabla p$把梯度变回期望
REINFORCE$\mathbb{E}\left[\left(\sum_t\nabla\log\pi_\theta\right)\left(\sum_t r\right)\right]$无偏、高方差、on-policy
causality(reward-to-go)$\mathbb{E}\left[\sum_t \nabla\log\pi_\theta(a_t|s_t)\sum_{t'\ge t} r_{t'}\right]$仍无偏,方差更小
baseline$\left(\hat Q_t - b\right)$,$b$ 与 $a_t$ 无关无偏
最优 baseline$b^\star = \mathbb{E}[g^2 r]/\mathbb{E}[g^2]$理论最优,实践少用
状态 baseline$b(s_t) = \hat V^\pi_\phi(s_t)$通向 actor-critic

6. Off-policy 策略梯度与重要性采样

6.1 为什么会走到这一步

策略梯度是 on-policy 的:每次更新完 $\theta$,之前采的所有样本都作废。跑一次真机器人、或者跑一次大模型的 rollout 都很贵,扔掉太浪费。问题是:如果我们只有从别的分布 $\bar p(\tau)$ 采的样本,还能估计 $J(\theta)$ 吗?

答案是重要性采样(importance sampling, IS),一行恒等式:

$$ \mathbb{E}_{x\sim p(x)}[f(x)] = \int p(x)f(x)dx = \int \frac{q(x)}{q(x)}p(x)f(x)dx = \int q(x)\frac{p(x)}{q(x)}f(x)dx = \mathbb{E}_{x\sim q(x)}\left[\frac{p(x)}{q(x)}f(x)\right]. $$

套到轨迹上:

$$ J(\theta) = \mathbb{E}_{\tau\sim\bar p(\tau)}\left[\frac{p_\theta(\tau)}{\bar p(\tau)}\,r(\tau)\right]. $$

6.2 复习题 Q8:轨迹的重要性权重能约掉什么?

复习题 Q8

写出 $\dfrac{p_\theta(\tau)}{\bar p(\tau)}$ 的显式表达式,并化到最简。它还依赖转移概率吗?

解答。把两个轨迹分布都展开:

$$ \frac{p_\theta(\tau)}{\bar p(\tau)} = \frac{\cancel{p(s_1)}\prod_{t=1}^{H}\pi_\theta(a_t|s_t)\cancel{p(s_{t+1}|s_t,a_t)}}{\cancel{p(s_1)}\prod_{t=1}^{H}\bar\pi(a_t|s_t)\cancel{p(s_{t+1}|s_t,a_t)}} = \prod_{t=1}^{H}\frac{\pi_\theta(a_t|s_t)}{\bar\pi(a_t|s_t)} . $$

初始状态分布和转移概率完全约掉——因为两个策略跑在同一个环境里。这和第 4 节「转移项求导后消失」是同一件事的两种表现:策略梯度方法之所以 model-free,就是因为环境动力学在两个地方都被消掉了。

off-policy 学习与重要性采样:右侧绿框是 IS 恒等式,左下是轨迹重要性权重的约分
右侧绿框是 IS 的四行恒等式,其中「乘以 $q(x)/q(x)$」这一步是全部技巧所在。左下角红线划掉的正是 $p(s_1)$ 和 $\prod_t p(s_{t+1}|s_t,a_t)$,分子分母完全相同。得到的结果是一个连乘——注意这个 $\prod_{t=1}^H$,它就是下一小节方差爆炸的根源。

6.3 复习题 Q9:为什么这个权重不能直接用?

把 IS 塞回策略梯度,并加上 causality($t$ 时刻的动作只影响 $t$ 之后的奖励,也只需要 $t$ 之前的 IS 权重),得到严格正确的 off-policy 策略梯度:

$$ \nabla_{\theta'} J(\theta') = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[\sum_{t=1}^{H}\nabla_{\theta'}\log\pi_{\theta'}(a_t|s_t)\left(\underbrace{\prod_{t'=1}^{t}\frac{\pi_{\theta'}(a_{t'}|s_{t'})}{\pi_\theta(a_{t'}|s_{t'})}}_{\text{exponential in } T\ldots}\right)\left(\sum_{t'=t}^{H} r(s_{t'},a_{t'})\right)\right]. $$

问题:那个连乘是 $T$ 的指数函数。做个数值估计:假设每一步的比值是 $1\pm 0.1$ 的独立随机量,均值为 1。$H=100$ 时,$\log$ 权重是 100 个方差约 $0.01$ 的量之和,方差约 $1$,于是权重本身是一个对数正态随机变量,跨越一到两个数量级;$H=1000$ 时 $\log$ 权重的标准差约 $3.2$,权重跨越 $e^{\pm 6}\approx$ 四百倍。实际中一小撮样本的权重会占据全部质量,有效样本量塌缩到个位数,估计彻底失效。

6.4 一阶近似:把连乘扔掉

Levine 的做法是先把目标改写成「逐个 $(s,a)$」的形式再动手。on-policy 版本是

$$ \nabla_\theta J(\theta) \approx \frac1N\sum_{i=1}^{N}\sum_{t=1}^{H}\nabla_\theta\log\pi_\theta\!\left(a_t^{(i)}|s_t^{(i)}\right)\hat A_t^{(i)},\qquad \left(s_t^{(i)}, a_t^{(i)}\right)\sim \pi_\theta(s_t,a_t), $$

其中 $\pi_\theta(s_t,a_t) = p_{\pi_\theta}(s_t)\pi_\theta(a_t|s_t)$ 是状态-动作的联合边缘分布。做 IS 时要对这个联合分布加权:

$$ \nabla_{\theta'}J(\theta') \approx \frac1N\sum_{i}\sum_{t}\frac{\pi_{\theta'}\!\left(s_t^{(i)},a_t^{(i)}\right)}{\pi_\theta\!\left(s_t^{(i)},a_t^{(i)}\right)}\nabla_{\theta'}\log\pi_{\theta'}\!\left(a_t^{(i)}|s_t^{(i)}\right)\hat A_t^{(i)} . $$

把联合比值按链式法则拆开:

$$ \frac{\pi_{\theta'}(s_t,a_t)}{\pi_\theta(s_t,a_t)} = \underbrace{\frac{p_{\pi_{\theta'}}(s_t)}{p_{\pi_\theta}(s_t)}}_{\text{扔掉它}}\cdot\frac{\pi_{\theta'}(a_t|s_t)}{\pi_\theta(a_t|s_t)} . $$

把状态边缘的比值直接扔掉,只保留动作比值。这就是「a first-order approximation for IS」。得到的估计量是

$$ \nabla_{\theta'}J(\theta') \approx \frac1N\sum_i\sum_t \frac{\pi_{\theta'}(a_t^{(i)}|s_t^{(i)})}{\pi_\theta(a_t^{(i)}|s_t^{(i)})}\nabla_{\theta'}\log\pi_{\theta'}\!\left(a_t^{(i)}|s_t^{(i)}\right)\hat A_t^{(i)}, $$

它不再有连乘,方差不随 $H$ 指数增长。

注意:这是「有点错」的

Levine 在 slide 上直白地写着 "this is a little bit wrong, we'll see next time why it's mostly ok to do this"。扔掉 $p_{\pi_{\theta'}}(s_t)/p_{\pi_\theta}(s_t)$ 意味着我们假装新策略访问的状态分布和旧策略一样。这个假设在 $\theta'$ 接近 $\theta$ 时近似成立——第 8 节会把「接近」量化成 $D_{\text{TV}} \le \epsilon$,并证明误差是 $O(\epsilon t)$ 级的。这正是 PPO 必须裁剪的根本理由:不是为了「训练稳定」这种含糊说法,而是因为一旦 $\theta'$ 跑远,被我们扔掉的那一项就不再可忽略,整个目标函数失去意义。

IS 的一阶近似:从指数级连乘的严格形式,到扔掉状态边缘比值的近似形式
上方是严格的 off-policy 策略梯度,箭头指着那个连乘写着 "exponential in $T$…"。下方对比 on-policy 与 off-policy 两个估计量:唯一的区别就是多了一个联合分布的比值。最后一行把联合比值拆成状态部分和动作部分,红线划掉状态部分,标注 "ignore this part"。左侧的红字提醒这一步「有点错」。考点:能说出被扔掉的是什么、以及在什么条件下可以扔。

7. 裁剪重要性权重:从代理目标到 PPO

7.1 代理目标与它的失控方向

回到轨迹层面看问题的本质。定义权重 $w(\tau) = \dfrac{p_{\theta'}(\tau)}{p_\theta(\tau)}$,代理目标(surrogate objective)是

$$ J(\theta') = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[w(\tau)\,r(\tau)\right],\qquad \nabla_{\theta'}J(\theta') = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[w(\tau)\nabla_{\theta'}\log p_{\theta'}(\tau)\,r(\tau)\right]. $$

这个目标的病理在于:优化器只看到 $w(\tau)$,而 $w$ 可以无限增大。对于一条回报为正的样本轨迹,把 $\pi_{\theta'}$ 的概率质量全部堆到它上面能让目标无限上升——但这条轨迹只是一个样本,它的高回报可能纯粹是运气。优化器会一路把策略推到离数据非常远的地方,那里我们的估计完全没有依据。

解法:裁剪。

$$ w(\tau) = \max\left\{1-\epsilon,\ \min\left\{1+\epsilon,\ \frac{p_{\theta'}(\tau)}{p_\theta(\tau)}\right\}\right\},\qquad \epsilon \approx 0.1 . $$
裁剪重要性权重:代理目标、权重在两个方向失控的示意、裁剪公式
右边的热力图是回报景观,深色虚线圈是旧策略 $\pi_\theta$ 的分布范围,蓝色虚线圈是被优化器推走后的新策略。两个箭头分别标出两种失控:往一个方向 $w(\tau)$ 一直减小(把某些样本的概率压到 0),往另一个方向 $w(\tau)$ 一直增大(把概率全堆到少数样本上)。下方黄框点明裁剪的作用:"puts a limit on how much probabilities can increase or decrease"。$\epsilon=0.1$ 意味着单次更新中任何动作的概率最多变化 $\pm10\%$。

7.2 复习题 Q10:为什么裁剪之后还要再套一个 min?

复习题 Q10

只用裁剪权重 $J(\theta')=\mathbb{E}\left[w_c(\tau)r(\tau)\right]$ 有一个漏洞。请画出 $J$ 关于比值 $\frac{p_{\theta'}}{p_\theta}$ 的函数图像,分别考虑 $r(\tau)\gt 0$ 和 $r(\tau)\lt 0$ 两种情况,指出漏洞在哪,并说明 PPO 用的 $\min\{w r,\ w_c r\}$ 如何补上它。

解答。设 $u = p_{\theta'}(\tau)/p_\theta(\tau)$,裁剪权重 $w_c = \mathrm{clip}(u, 1-\epsilon, 1+\epsilon)$。

情况一,$r(\tau) \gt 0$:$J = w_c r$ 随 $u$ 线性上升,直到 $u = 1+\epsilon$ 后变成平台。优化器把 $u$ 推到 $1+\epsilon$ 就没有梯度了,停下。正确行为。

情况二,$r(\tau) \lt 0$:$J = w_c r$ 随 $u$ 线性下降,在 $u \lt 1-\epsilon$ 时是平台。优化器想最大化 $J$,于是把 $u$ 往小推——推到 $1-\epsilon$ 以下进入平台后梯度为零,看起来也停了。漏洞在于:优化器在到达平台之前不受任何惩罚地一路下滑,而且一旦某次更新把 $u$ 甩到远小于 $1-\epsilon$ 的地方(例如 $u=0.01$),目标函数值反而是「好」的(平台值),策略却已经跑到数据分布之外。Slide 上写的是 "not paying any price for drifting away from data here!"——飘走却不付代价。

PPO 的修补是把裁剪和不裁剪两个版本取 $\min$:

$$ J(\theta') = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[\min\left\{w(\tau)r(\tau),\ w_c(\tau)r(\tau)\right\}\right],\quad w(\tau)=\frac{p_{\theta'}(\tau)}{p_\theta(\tau)},\ w_c = \mathrm{clip}(w,1-\epsilon,1+\epsilon). $$

取 $\min$ 意味着我们总是采用更悲观的那个估计。在 $r \lt 0$ 且 $u$ 很小时,未裁剪的 $w r = u\cdot r$ 趋近于 0,而裁剪版是 $(1-\epsilon)r$(一个负数),$\min$ 选中后者……更重要的是在 $u \gt 1$ 且 $r\lt 0$ 时:未裁剪版 $ur$ 持续下降(惩罚一直生效),裁剪版在 $u\gt1+\epsilon$ 后是常数,$\min$ 选中持续下降的未裁剪版,于是「把坏动作的概率提高」这件事永远要付代价。这就是那个 $\min$ 的全部意义。

裁剪的一个细节:r 为正与 r 为负时目标函数随比值的图像,以及 min 形式的修正
两张小图是理解 PPO 目标的钥匙。左图 $r(\tau)\gt 0$:$J$ 线性上升到 $1+\epsilon$ 后变平,黄色星星(样本)堆在拐点处——正是我们想要的「走到边界就停」。右图 $r(\tau)\lt 0$:$J$ 线性下降,在 $1-\epsilon$ 左侧变平,箭头指着最右下那颗星星写着 "not paying any price for drifting away from data here!"。左侧被红线划掉的是只用 $w_c$ 的朴素写法,替换成下面 $\min\{w r, w_c r\}$ 的正确写法。

7.3 PPO 算法全貌

把逐样本形式写出来,并把 $r(\tau)$ 换成优势估计 $\hat A_t$,就得到教科书上的 PPO 裁剪目标:

$$ \mathcal{L}_{\text{CLIP}}(\theta') = \sum_{i=1}^{N}\sum_{t=1}^{H}\min\left\{\frac{\pi_{\theta'}(a_t^{(i)}|s_t^{(i)})}{\pi_\theta(a_t^{(i)}|s_t^{(i)})}\hat A_t^{(i)},\ \ \mathrm{clip}\!\left(\frac{\pi_{\theta'}(a_t^{(i)}|s_t^{(i)})}{\pi_\theta(a_t^{(i)}|s_t^{(i)})},\,1-\epsilon,\,1+\epsilon\right)\hat A_t^{(i)}\right\} $$

完整算法:

  1. 用 $\pi_\theta$ 采一批轨迹 $\{\tau^{(i)}\}$;
  2. 计算价值回归目标 $y_t^{(i)} = r(s_t^{(i)},a_t^{(i)}) + \hat V_\phi^\pi(s_{t+1}^{(i)})$;
  3. 把 $\hat V_\phi^\pi(s)$ 拟合到 $\{y_t^{(i)}\}$;
  4. 用 GAE 算优势 $\hat A_{\text{GAE}}^\pi(s_t^{(i)},a_t^{(i)}) = \sum_{t'=t}^{\infty}(\gamma\lambda)^{t'-t}\delta_{t'}^{(i)}$;
  5. 令 $\theta' \leftarrow \theta$;
  6. 重复 $K$ 次:$\nabla_{\theta'}J(\theta')\approx\nabla_{\theta'}\mathcal{L}_{\text{CLIP}}(\theta')$,$\theta'\leftarrow\theta'+\alpha\nabla_{\theta'}J(\theta')$;
  7. $\theta\leftarrow\theta'$,回到第 1 步。

第 5–7 步的内层 $K$ 次循环是 PPO 之所以比朴素策略梯度样本效率高的原因:同一批数据被复用 $K$ 次(典型 $K=4\sim10$),而裁剪保证了 $\theta'$ 在这 $K$ 步中不会跑太远。

Slide 上还提到一个实用细节:熵正则化(entropy regularization),在目标里加上 $\sum_i\sum_t \mathcal{H}\left(\pi_{\theta'}(\cdot|s_t^{(i)})\right)$,鼓励策略保持随机性、延缓过早收敛到确定性策略。

PPO 完整算法七步,右侧是熵正则化说明,底部是 CLIP 目标函数
左侧绿色箭头标出两层循环:外层是「采样—拟合价值—算优势」,内层 $K\times$ 是「对同一批数据反复做梯度上升」。右侧那条钟形曲线示意熵 $\mathcal{H}(p(x))$——曲线越宽熵越大。底部就是 $\mathcal{L}_{\text{CLIP}}$ 的完整表达式。把这一页背下来,PPO 就写得出来了。

8. 策略梯度即策略迭代:分布不匹配的界

这一节是 Part 2 的理论核心,也是整讲最容易出证明题的地方。它回答两个问题:(1) 为什么最大化那个带重要性权重的目标就等于改进策略?(2) 第 6 节扔掉的状态分布比值,凭什么可以扔?

8.1 复习题 Q11:证明策略改进恒等式

复习题 Q11

设 $J(\theta) = \mathbb{E}_{\tau\sim p_\theta(\tau)}\left[\sum_t \gamma^t r(s_t,a_t)\right]$。证明

$$ J(\theta') - J(\theta) = \mathbb{E}_{\tau\sim p_{\theta'}(\tau)}\left[\sum_{t=0}^{\infty}\gamma^t A^{\pi_\theta}(s_t,a_t)\right]. $$

注意期望是对新策略 $\theta'$ 取的,而优势函数是旧策略的。

解答。分五步。

第 1 步:$J(\theta) = \mathbb{E}_{s_0\sim p(s_0)}\left[V^{\pi_\theta}(s_0)\right]$,这是价值函数的定义。

第 2 步(关键的小花招):初始状态分布 $p(s_0)$ 与策略无关,所以我们可以把它换成「从 $\theta'$ 采的轨迹的初始状态」:

$$ J(\theta) = \mathbb{E}_{\tau\sim p_{\theta'}(\tau)}\left[V^{\pi_\theta}(s_0)\right]. $$

这一步把两个不同策略的量放到了同一个期望下,是整个证明能走通的原因。

第 3 步(望远镜求和):把 $V^{\pi_\theta}(s_0)$ 写成一个 telescoping series:

$$ V^{\pi_\theta}(s_0) = \sum_{t=0}^{\infty}\gamma^t V^{\pi_\theta}(s_t) - \sum_{t=1}^{\infty}\gamma^t V^{\pi_\theta}(s_t) = -\sum_{t=0}^{\infty}\gamma^t\left(\gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_t)\right). $$

(第二个和式做变量替换 $t\to t+1$ 后变成 $\sum_{t=0}^\infty \gamma^{t+1}V^{\pi_\theta}(s_{t+1})$。)于是

$$ J(\theta') - J(\theta) = J(\theta') + \mathbb{E}_{\tau\sim p_{\theta'}}\left[\sum_{t=0}^{\infty}\gamma^t\left(\gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_t)\right)\right]. $$

第 4 步:把 $J(\theta') = \mathbb{E}_{\tau\sim p_{\theta'}}\left[\sum_t \gamma^t r(s_t,a_t)\right]$ 也写进同一个期望里(合法,因为两边都是对 $p_{\theta'}$ 取期望):

$$ = \mathbb{E}_{\tau\sim p_{\theta'}}\left[\sum_{t=0}^{\infty}\gamma^t\left(r(s_t,a_t) + \gamma V^{\pi_\theta}(s_{t+1}) - V^{\pi_\theta}(s_t)\right)\right]. $$

第 5 步:括号里正是旧策略优势函数的(单样本)定义,取期望后 $\mathbb{E}\left[r+\gamma V^{\pi_\theta}(s')\right] = Q^{\pi_\theta}(s,a)$,所以

$$ = \mathbb{E}_{\tau\sim p_{\theta'}}\left[\sum_{t=0}^{\infty}\gamma^t A^{\pi_\theta}(s_t,a_t)\right].\qquad\blacksquare $$
策略梯度即策略迭代的完整五步推导,从 J(theta')-J(theta) 到旧策略优势的期望
整页就是上面五步的逐行展开。右上角先写出「claim」,然后从 $J(\theta')-J(\theta)=J(\theta')-\mathbb{E}_{s_0\sim p(s_0)}[V^{\pi_\theta}(s_0)]$ 开始,第二行把 $s_0\sim p(s_0)$ 悄悄换成 $\tau\sim p_{\theta'}(\tau)$,第三行是望远镜求和的两个错位和式,第四行合并成 $\gamma V(s_{t+1})-V(s_t)$,第五行把 $J(\theta')$ 展开成奖励和,最后一行合成优势。这个恒等式的含义:想知道新策略比旧策略好多少,只要看新策略在自己访问的状态上,相对于旧策略的优势有多大。这正是策略迭代的思想。

8.2 复习题 Q12:为什么想要忽略分布不匹配?

把上面的恒等式用重要性采样改写(对动作做 IS,因为我们只有 $\pi_\theta$ 的样本):

$$ J(\theta')-J(\theta) = \sum_t \mathbb{E}_{s_t\sim p_{\theta'}(s_t)}\left[\mathbb{E}_{a_t\sim\pi_\theta(a_t|s_t)}\left[\frac{\pi_{\theta'}(a_t|s_t)}{\pi_\theta(a_t|s_t)}A^{\pi_\theta}(s_t,a_t)\right]\right]. $$

问题是外层期望还是对 $p_{\theta'}(s_t)$ 取的——而 $\theta'$ 正是我们要优化的量,我们不可能采它的样本。于是我们希望下面这个近似成立:

$$ \sum_t \mathbb{E}_{s_t\sim p_{\theta'}(s_t)}\left[\cdots\right] \;\approx\; \underbrace{\sum_t \mathbb{E}_{s_t\sim p_{\theta}(s_t)}\left[\mathbb{E}_{a_t\sim\pi_\theta}\left[\frac{\pi_{\theta'}(a_t|s_t)}{\pi_\theta(a_t|s_t)}A^{\pi_\theta}(s_t,a_t)\right]\right]}_{\bar A(\theta')} . $$

为什么想要它成立?因为如果 $J(\theta')-J(\theta)\approx\bar A(\theta')$,那么

$$ \theta' \leftarrow \argmax_{\theta'}\bar A(\theta') $$

就是一次策略改进——而 $\bar A(\theta')$ 里所有的采样都来自旧策略 $\theta$,完全可以用手上的数据算出来。这就是 6.4 节那个「一阶近似」在理论层面的正身。

忽略分布不匹配:把 s 的分布从新策略换成旧策略的近似,以及为什么想要它成立
红圈标出被偷偷替换的东西:$p_{\theta'}(s_t) \to p_\theta(s_t)$;绿圈标出没有被替换的东西:分子上的 $\pi_{\theta'}(a_t|s_t)$ 必须保留,否则整个目标就与 $\theta'$ 无关了。右下角写着 "Claim: $p_\theta(s_t)$ is close to $p_{\theta'}(s_t)$ when $\pi_\theta$ is close to $\pi_{\theta'}$"——接下来两页就是把这句话里的两个 "close" 变成不等式。

8.3 复习题 Q13:把「策略接近」翻译成「状态分布接近」

复习题 Q13

先看简单情形:设 $\pi_\theta$ 是确定性策略 $a_t = \pi_\theta(s_t)$,并定义「$\pi_{\theta'}$ 接近 $\pi_\theta$」为 $\pi_{\theta'}\left(a_t\ne\pi_\theta(s_t)\mid s_t\right)\le\epsilon$。证明 $D_{\text{TV}}\left(p_{\theta'}(s_t), p_\theta(s_t)\right)\le\epsilon t$。这个推导让你想起什么?

解答:它和第 2 节的模仿学习分析一模一样。Slide 上就写着 "seem familiar?"。只需把「专家」换成「旧策略 $\pi_\theta$」,「学生」换成「新策略 $\pi_{\theta'}$」:

$$ p_{\theta'}(s_t) = (1-\epsilon)^t p_\theta(s_t) + \left(1-(1-\epsilon)^t\right)p_{\text{mistake}}(s_t), $$ $$ \frac12\sum_{s_t}\left|p_{\theta'}(s_t)-p_\theta(s_t)\right| = \left(1-(1-\epsilon)^t\right)\frac12\sum_{s_t}\left|p_{\text{mistake}}(s_t)-p_\theta(s_t)\right| \le 1-(1-\epsilon)^t \le \epsilon t . $$

Levine 的评价是 "not a great bound, but a bound!"——$\epsilon t$ 在 $t$ 大时会超过 1(而 TV 本来就不超过 1),所以这个界在长 horizon 下是空的。但它足以说明当 $\epsilon$ 足够小时,分布差异可以任意小,这就够了。

复习题 Q13'(一般情形)

去掉确定性假设:$\pi_\theta$ 是任意分布,定义「接近」为 $D_{\text{TV}}\left(\pi_{\theta'}(a_t|s_t),\pi_\theta(a_t|s_t)\right)\le\epsilon$ 对所有 $s_t$ 成立。同样的结论还成立吗?

解答:成立,靠一条耦合引理(coupling lemma)。

有用引理

若 $D_{\text{TV}}(p_X, p_Y)\le\epsilon$,则存在一个联合分布 $p(x,y)$,其边缘分别是 $p_X$ 和 $p_Y$,并且 $p(x=y)= 1-\epsilon$。

直观地说:我们可以构造一种「配对采样」的方式,使得两个分布采出的样本至少有 $1-\epsilon$ 的概率完全相同。

把引理用到策略上:$\pi_{\theta'}(a_t|s_t)$ 与 $\pi_\theta(a_t|s_t)$ 可以耦合成「以至少 $1-\epsilon$ 的概率取相同动作」。于是「新策略与旧策略取不同动作」的概率不超过 $\epsilon$——这就把一般情形完全归约到了确定性情形,前面的推导原封不动照搬,得到同样的 $\frac12\sum_{s_t}\left|p_{\theta'}(s_t)-p_\theta(s_t)\right|\le \epsilon t$。

一般情形下界住状态分布变化:耦合引理与由它推出的 TV 界
中间那条 "Useful lemma" 就是耦合引理,下面两行箭头是它的两个推论:$p_X$ 与 $p_Y$ 以概率 $1-\epsilon$「一致」,因此 $\pi_{\theta'}$ 与 $\pi_\theta$ 取不同动作的概率至多为 $\epsilon$。底部的证明出处是 TRPO 论文。考点:能说清「为什么一般情形能归约到确定性情形」,答案就是耦合引理。

8.4 复习题 Q14:从分布界到目标值界

最后一步:分布接近 ⟹ 任何有界函数的期望也接近。对任意函数 $f$,

$$ \mathbb{E}_{p_{\theta'}(s_t)}\left[f(s_t)\right] = \sum_{s_t}p_{\theta'}(s_t)f(s_t) \;\ge\; \sum_{s_t}p_\theta(s_t)f(s_t) - \sum_{s_t}\left|p_\theta(s_t)-p_{\theta'}(s_t)\right|\max_{s_t}f(s_t) $$ $$ \ge\; \mathbb{E}_{p_\theta(s_t)}\left[f(s_t)\right] - 2\epsilon t \max_{s_t}f(s_t). $$

(第一个不等号是把逐点差值放大成绝对值乘上 $f$ 的最大值;第二个用 $\sum|p-p'| = 2D_{\text{TV}} \le 2\epsilon t$。)

把 $f(s_t)$ 取成内层那个期望,得到

$$ \sum_t \mathbb{E}_{s_t\sim p_{\theta'}}\left[\mathbb{E}_{a_t\sim\pi_\theta}\left[\tfrac{\pi_{\theta'}}{\pi_\theta}A^{\pi_\theta}\right]\right] \;\ge\; \bar A(\theta') - \sum_t 2\epsilon t\, C, $$

其中常数 $C = O(H r_{\max})$(有限 horizon)或 $O\!\left(\frac{r_{\max}}{1-\gamma}\right)$(折扣无限 horizon),因为优势函数的量级不超过回报的量级。

结论:最大化 $\bar A$ 就是最大化真实改进量的一个下界

Slide 原话:"maximizing this maximizes a bound on the thing we want!" 这是 TRPO/PPO 全部理论正当性的来源。于是最终的优化问题是

$$ \theta' \leftarrow \argmax_{\theta'}\ \sum_t \mathbb{E}_{s_t\sim p_\theta(s_t)}\left[\mathbb{E}_{a_t\sim\pi_\theta(a_t|s_t)}\left[\frac{\pi_{\theta'}(a_t|s_t)}{\pi_\theta(a_t|s_t)}A^{\pi_\theta}(s_t,a_t)\right]\right] $$ $$ \text{s.t.}\quad D_{\text{TV}}\left(\pi_{\theta'}(a_t|s_t),\pi_\theta(a_t|s_t)\right)\le\epsilon . $$

对足够小的 $\epsilon$,这保证 $J(\theta')-J(\theta)\ge 0$:因为 $\theta'=\theta$ 是可行解且目标值为 0,最优解的目标值只会更大,而误差项 $O(\epsilon)$ 在 $\epsilon\to0$ 时比目标项衰减得更慢……严格说是要求 $\epsilon$ 小到误差项不吃掉改进量,这也是「for small enough $\epsilon$」这句限定的含义。

从状态分布界推出目标值的下界,箭头指出常数 C 的量级
上半部分是任意有界函数 $f$ 的期望界,下半部分把它套到我们的目标上,得到「真实目标 $\ge$ 近似目标 $-\sum_t 2\epsilon t C$」。右侧箭头标注了常数 $C$ 的两种写法:有限 horizon 是 $O(H r_{\max})$,折扣情形是 $O\!\left(\frac{r_{\max}}{1-\gamma}\right)$——注意 $\frac{1}{1-\gamma}$ 扮演的正是「有效 horizon」的角色,$\gamma=0.99$ 时约为 100。

8.5 PPO 的另一半:KL 惩罚版

TV 散度在实现上不方便(要对动作空间求和/积分)。实践中用 KL 散度代替——它与 TV 有 Pinsker 不等式 $D_{\text{TV}}\le\sqrt{\tfrac12 D_{\text{KL}}}$ 的关系,而且对高斯策略有闭式表达。把约束用拉格朗日乘子 $\beta$ 变成惩罚项:

$$ \mathcal{L}_{\text{KL}}(\theta',\beta) = \sum_{i}\sum_{t}\frac{\pi_{\theta'}(a_t^{(i)}|s_t^{(i)})}{\pi_\theta(a_t^{(i)}|s_t^{(i)})}A^{\pi_\theta}(s_t^{(i)},a_t^{(i)}) + \beta\log\pi_{\theta'}(a_t^{(i)}|s_t^{(i)}) $$

算法与 7.3 节的裁剪版几乎一样,只在内层循环之后多一步对偶上升:

$$ \beta \leftarrow \beta + \alpha\left(D_{\text{KL}}\left(\pi_\theta(a_t|s_t)\,\|\,\pi_{\theta'}(a_t|s_t)\right) - \epsilon\right). $$

直觉很清楚:如果实测 KL 超过了预算 $\epsilon$,就调大 $\beta$ 加重惩罚;如果远小于预算,就调小 $\beta$ 放松限制。这是一个自动调参的负反馈回路,比手工设定固定的惩罚系数稳健得多。

PPO 的 KL 惩罚版本:七步算法,多出对偶变量 beta 的更新
与裁剪版 PPO 逐条对照,唯一新增的是第 6 步 $\beta\leftarrow\beta+\alpha(D_{\text{KL}}-\epsilon)$。右侧的热力图与前面一样:黑色虚线圈是旧策略、蓝色虚线圈是新策略,KL 约束把新策略限制在旧策略附近的一个「信赖域」里。裁剪版和 KL 版在原始 PPO 论文里都给出了,实践中裁剪版更常用(少一个超参数、实现更简单),但 KL 版在 RLHF 里非常常见,因为那里本来就要对参考模型加 KL 惩罚。
速查卡:PPO 系谱
层次内容本讲对应
恒等式$J(\theta')-J(\theta)=\mathbb{E}_{p_{\theta'}}\left[\sum_t\gamma^t A^{\pi_\theta}\right]$8.1
近似把 $p_{\theta'}(s_t)$ 换成 $p_\theta(s_t)$ 得到 $\bar A(\theta')$8.2 / 6.4
合法性$D_{\text{TV}}(p_\theta,p_{\theta'})\le\epsilon t$(耦合引理)8.3
下界真实改进 $\ge \bar A(\theta') - \sum_t 2\epsilon t C$8.4
约束实现 A裁剪 $\mathrm{clip}(w,1-\epsilon,1+\epsilon)$ + $\min$7.2 / 7.3
约束实现 BKL 惩罚 + 对偶上升调 $\beta$8.5
约束实现 C二阶近似 + 自然梯度 = TRPOLecture 7

9. Actor-Critic:偏差与方差的连续调节

9.1 在线 actor-critic 算法

Part 3 开始。actor-critic 把「用蒙特卡洛回报当权重」换成「用学出来的价值函数算优势」。最精简的在线版本只有六步:

  1. 用 $a\sim\pi_\theta(a|s)$ 走一步,得到转移 $(s_i, a_i, s_i')$;
  2. 算回归目标 $y_i = r(s_i,a_i) + \gamma\hat V_\phi^\pi(s_i')$;
  3. 用 $\nabla_\phi\mathcal{L}_i(\phi)$ 更新 critic,其中 $\mathcal{L}_i(\phi) = \left\|\hat V_\phi^\pi(s_i) - y_i\right\|^2$,$\phi\leftarrow\phi-\alpha\nabla_\phi\mathcal{L}_i(\phi)$;
  4. 算优势 $\hat A^\pi(s_i,a_i) = r(s_i,a_i)+\gamma\hat V_\phi^\pi(s_i') - \hat V_\phi^\pi(s_i)$;
  5. 算策略梯度 $\nabla_\theta J(\theta)\approx\nabla_\theta\log\pi_\theta(a_i|s_i)\hat A^\pi(s_i,a_i)$;
  6. $\theta\leftarrow\theta+\alpha\nabla_\theta J(\theta)$。
在线 actor-critic 算法六步,配单步转移示意与 critic 的平方损失
左下角的示意图很关键:两个绿点表示相邻的 $s_i$ 和 $s_i'$,只走一步就更新——这就是「online」的含义,不需要等一整条轨迹结束。右侧是 critic 的最小二乘目标和它的梯度下降更新。右上标注 "Example algorithm: A3C":A3C 就是这个算法的异步并行版本,用多个 worker 同时与环境交互来打散样本相关性(因为单条轨迹上相邻的样本高度相关,batch size 为 1 的在线更新方差极大)。
常见误区:目标 $y_i$ 要不要 detach?

要。第 2 步的 $y_i$ 里含有 $\hat V_\phi^\pi(s_i')$,如果不切断梯度,第 3 步的平方损失会同时把 $\hat V_\phi(s_i)$ 拉向 $y_i$ 并且 把 $y_i$ 拉向 $\hat V_\phi(s_i)$,退化成让两者都往中间跑,训练直接崩掉。这是实现 actor-critic 时最常见的 bug。第 4 步算优势时同样要对整个 $\hat A$ 做 detach,因为它只是策略梯度里的权重。

9.2 复习题 Q15:两种优势估计的偏差-方差谱

复习题 Q15

下面两个优势估计

$$ \hat A_{\text{C}}^\pi(s_t,a_t) = r(s_t,a_t)+\gamma\hat V_\phi^\pi(s_{t+1}) - \hat V_\phi^\pi(s_t), $$ $$ \hat A_{\text{MC}}^\pi(s_t,a_t) = \sum_{t'=t}^{\infty}\gamma^{t'-t}r(s_{t'},a_{t'}) - \hat V_\phi^\pi(s_t), $$

各自的偏差和方差如何?请分别指出它们的优缺点,并写出能在两者之间插值的估计量。

解答。

估计量偏差方差原因
$\hat A_{\text{C}}$(critic / 自举)高(critic 总是不准)低只用一步真实奖励,其余靠 $\hat V_\phi$ 概括;$\hat V_\phi$ 是一个被平滑过的函数逼近,随机性小但系统性地错
$\hat A_{\text{MC}}$(蒙特卡洛)无(只要 baseline 与动作无关)高整条未来轨迹的回报是单样本估计,$H$ 步的随机性全部累加进来

Slide 上 Levine 的标注是「+ lower variance / − higher bias if value is wrong (it always is)」和「+ no bias / − higher variance (because single-sample estimate)」。括号里那句 "it always is" 是重点:深度网络拟合的价值函数永远有误差,所以自举估计的偏差不是理论上的小项,而是实践中的主要误差源。

插值:$n$-step 回报。

$$ \hat A_n^\pi(s_t,a_t) = \sum_{t'=t}^{t+n}\gamma^{t'-t}r(s_{t'},a_{t'}) - \hat V_\phi^\pi(s_t) + \gamma^n \hat V_\phi^\pi(s_{t+n}). $$

前 $n$ 步用真实奖励(无偏但有方差),第 $n$ 步之后用 critic 接管(有偏但无方差)。$n=1$ 退化成 $\hat A_{\text{C}}$,$n\to\infty$ 退化成 $\hat A_{\text{MC}}$。Levine 的经验判断:"choosing $n\gt1$ often works better!"——典型取 $n = 5\sim 20$。

资格迹与 n-step 回报:两种优势估计的优缺点对照,右侧是轨迹树的方差示意
右侧那张「轨迹树」图把方差的来源画得很清楚:从绿点(当前状态)出发的一束黑色轨迹,越往后分叉越开——时间越远,可能的未来越多,方差越大(上方红圈标 "bigger variance",下方靠近起点的小红圈标 "smaller variance")。斜着的红色剪刀线标着 "cut here before variance gets too big!",也就是在方差爆炸之前用 critic 把尾巴截掉。左下的小图是折扣因子作用下奖励权重 $r_t$ 随时间的衰减曲线,绿色段(截断保留部分)与橙色段(被 critic 替代的尾巴)的分界就是 $n$。

9.3 复习题 Q16:GAE——必须只选一个 $n$ 吗?

复习题 Q16

「Do we have to choose just one $n$?」如果对所有 $n$ 做加权平均 $\hat A_{\text{GAE}}^\pi = \sum_{n=1}^{\infty}w_n\hat A_n^\pi$,权重 $w_n$ 应该怎么选?为什么最后能化简成一行?

权重的选择:$w_n \propto \lambda^{n-1}$,指数衰减。理由是「Mostly prefer cutting earlier (less variance)」——我们更偏好小的 $n$(方差小),但也不想完全放弃大 $n$ 带来的低偏差,所以用一个几何级数把权重平滑地压下去。$\lambda\in[0,1]$ 是超参数,$\lambda=0$ 时只剩 $n=1$(纯自举),$\lambda=1$ 时是均匀偏好(趋向蒙特卡洛)。

化简。把加权和展开,可以写成一个递归形式:

$$ \hat A_{\text{GAE}}^\pi(s_t,a_t) = r(s_t,a_t)+\gamma\Big((1-\lambda)\hat V_\phi^\pi(s_{t+1}) + \lambda\big(r(s_{t+1},a_{t+1})+\gamma\big((1-\lambda)\hat V^\pi_\phi(s_{t+2})+\lambda r(s_{t+2},a_{t+2})+\ldots\big)\big)\Big) $$

读法:在每一步,以概率 $1-\lambda$ 「用 critic 收尾」,以概率 $\lambda$ 「继续往下看一步」。整理之后得到那个著名的一行公式:

$$ \boxed{\ \hat A_{\text{GAE}}^\pi(s_t,a_t) = \sum_{t'=t}^{\infty}(\gamma\lambda)^{t'-t}\,\delta_{t'},\qquad \delta_{t'} = r(s_{t'},a_{t'}) + \gamma\hat V_\phi^\pi(s_{t'+1}) - \hat V_\phi^\pi(s_{t'})\ } $$

$\delta_{t'}$ 就是时序差分误差(TD error),也就是单步优势 $\hat A_{\text{C}}$。所以 GAE 的最终形态极其简洁:把未来所有的 TD 误差按 $(\gamma\lambda)$ 的幂加权求和。

直觉:$\lambda$ 和 $\gamma$ 是同一件事的两个入口

注意衰减因子是 $(\gamma\lambda)$ 这个乘积——slide 上标注 "similar effect as discount!"。$\gamma$ 通过「未来奖励不重要」来降方差,$\lambda$ 通过「未来的 TD 误差不重要」来降方差,两者在数学上以相同的方式进入公式。区别在于:$\gamma$ 改变的是问题定义(你真的在优化一个折扣目标),$\lambda$ 只改变估计量(问题没变,只是用了一个有偏但低方差的估计)。所以调 $\lambda$ 是安全的调参,改 $\gamma$ 是改题目。常用取值 $\lambda=0.95$、$\gamma=0.99$。

广义优势估计 GAE:n-step 回报的指数加权组合与最终的一行化简
右上角是加权组合的定义 $\hat A_{\text{GAE}}=\sum_n w_n\hat A_n$,下面标着 $w_n\propto\lambda^{n-1}$ 与 "exponential falloff"。中间那长长一行是递归展开式,注意 $(1-\lambda)$ 与 $\lambda$ 交替出现的模式。最下面是化简结果和 $\delta_{t'}$ 的定义,箭头指着 $(\gamma\lambda)^{t'-t}$ 写着 "similar effect as discount!"。左上角的小曲线图与上一页相同,但绿色段截断得更「柔和」——GAE 不是在某个固定的 $n$ 处一刀切,而是"Cut everywhere all at once!"。

9.4 用 GAE 的策略梯度:完整实现

把 GAE 装进策略梯度,就得到 PPO 的前半部分:

  1. 用 $\pi_\theta$ 采一批轨迹;
  2. 算 $y_t^{(i)} = r(s_t^{(i)},a_t^{(i)})+\gamma\hat V_\phi^\pi(s_{t+1}^{(i)})$(这里也可以用 GAE 估计量作为回归目标,即 $y_t = \hat A_{\text{GAE}} + \hat V_\phi(s_t)$);
  3. 把 $\hat V_\phi^\pi$ 拟合到 $\{y_t^{(i)}\}$;
  4. 算 $\hat A_{\text{GAE}}^\pi(s_t^{(i)},a_t^{(i)}) = \sum_{t'\ge t}(\gamma\lambda)^{t'-t}\delta_{t'}^{(i)}$;
  5. $\nabla_\theta J(\theta)\approx\sum_i\sum_t\nabla_\theta\log\pi_\theta(a_t^{(i)}|s_t^{(i)})\hat A^\pi(s_t^{(i)},a_t^{(i)})$;
  6. $\theta\leftarrow\theta+\alpha\nabla_\theta J(\theta)$。

实践中还要做优势中心化(advantage centering):

$$ \mu = \frac{1}{HN}\sum_{i,t}\hat A^\pi(s_t^{(i)},a_t^{(i)}),\qquad \sigma = \sqrt{\frac{1}{HN}\sum_{i,t}\left(\hat A^\pi(s_t^{(i)},a_t^{(i)})-\mu\right)^2}, $$ $$ \bar A^\pi(s_t^{(i)},a_t^{(i)}) = \frac{\hat A^\pi(s_t^{(i)},a_t^{(i)}) - \mu}{\sigma}. $$

减去 $\mu$ 是第 5 节讲的 baseline(无偏);除以 $\sigma$ 严格说会引入偏差(因为 $\sigma$ 依赖于样本、也依赖于动作),但它把梯度的尺度归一化了,使得同一套学习率能在不同奖励量级的任务上工作,实践中收益远大于那点偏差。

用 GAE 的策略梯度完整算法,右侧是优势中心化的公式
算法六步与右侧的中心化公式。两个黑色箭头分别指出:第 2 步的价值回归目标「也可以用 GAE 估计量」,第 5 步的优势「实践中通常做中心化」。左下角列出其他可选的优势估计:$n$-step 回报、或者纯蒙特卡洛加 $\hat V^\pi(s_t)$ 做 baseline。底部两个黄框把话说得很明白:这是实现 PPO 的第一部分,另一部分是第 7 节那个略有不同的梯度估计量(裁剪目标)。
import numpy as np

def compute_gae(rewards, values, next_value, gamma=0.99, lam=0.95):
    """rewards: [T]  单条轨迹的奖励
       values:  [T]  critic 在 s_0..s_{T-1} 上的估计
       next_value: 标量,critic 在 s_T 上的估计(终止则传 0)
       返回 [T] 的 GAE 优势。"""
    T = len(rewards)
    adv = np.zeros(T, dtype=np.float64)
    gae = 0.0
    v_next = next_value
    for t in reversed(range(T)):
        delta = rewards[t] + gamma * v_next - values[t]   # TD error
        gae = delta + gamma * lam * gae                   # 递归形式
        adv[t] = gae
        v_next = values[t]
    return adv

# 中心化(PPO 标配)
def normalize(adv, eps=1e-8):
    return (adv - adv.mean()) / (adv.std() + eps)

注意实现上的关键:倒序遍历。因为 $\hat A_t = \delta_t + \gamma\lambda \hat A_{t+1}$ 是一个从后往前的递归,$O(T)$ 就能算完整条轨迹,不需要 $O(T^2)$ 的双重求和。

10. Off-policy actor-critic 与重参数化

最后一页 slides 指向下半学期:如果我们学的是 $Q$ 而不是 $V$,就可以彻底摆脱 on-policy 的限制,用 replay buffer 反复利用旧数据。

算法:

  1. 用 $a\sim\pi_\theta(a|s)$ 走一步得到 $(s_i,a_i,s_i')$,存进 replay buffer;
  2. 从 buffer 里取一个 batch $\{(s_i,a_i,s_i')\}_{i=1}^{B}$,算目标 $y_i = r(s_i,a_i)+\gamma\,\mathbb{E}_{a'\sim\pi_\theta(a'|s_i')}\left[\hat Q_\phi^\pi(s_i',a')\right]$;
  3. 用 $\nabla_\phi\sum_{i=1}^{B}\left\|\hat Q_\phi^\pi(s_i,a_i)-y_i\right\|^2$ 更新 critic;
  4. $\nabla_\theta J(\theta)\approx\sum_i\nabla_\theta \hat Q_\phi^\pi\!\left(s,\ \mu_\theta(s)+\sigma_\theta(s)\epsilon_i\right)$;
  5. $\theta\leftarrow\theta+\alpha\nabla_\theta J(\theta)$。

10.1 复习题 Q17:第 4 步为什么不用 log-derivative?

复习题 Q17

第 4 步的梯度直接穿过了 $\hat Q_\phi$,没有出现 $\nabla_\theta\log\pi_\theta$。它凭什么合法?和策略梯度相比有什么优劣?

解答:重参数化技巧(reparameterization trick)。对高斯策略 $\pi_\theta(a|s) = \mathcal{N}\left(\mu_\theta(s),\ \sigma_\theta(s)^2\right)$,采样可以写成一个确定性函数加一个与 $\theta$ 无关的噪声:

$$ a = \mu_\theta(s) + \sigma_\theta(s)\,\epsilon,\qquad \epsilon\sim\mathcal{N}(0,1). $$

于是

$$ \mathbb{E}_{a\sim\pi_\theta(a|s)}\left[Q(s,a)\right] = \mathbb{E}_{\epsilon\sim\mathcal{N}(0,1)}\left[Q\!\left(s,\ \mu_\theta(s)+\sigma_\theta(s)\epsilon\right)\right] \approx Q\!\left(s,\ \mu_\theta(s)+\sigma_\theta(s)\epsilon\right),\ \ \epsilon\sim\mathcal{N}(0,1). $$

现在 $\theta$ 出现在被期望的函数里,而期望的分布 $\mathcal{N}(0,1)$ 与 $\theta$ 无关,可以直接对样本求导、反向传播穿过 critic 网络。

维度REINFORCE / log-derivative重参数化(pathwise)
适用动作空间离散、连续都行只能连续(需要 $a$ 对 $\theta$ 可微)
需要 $Q$ 可微吗不需要,$Q$ 可以是黑箱数值需要,梯度要穿过 $Q$
方差高(只用到 $Q$ 的值)低(用到 $Q$ 的梯度,信息量更大)
能否 off-policy需要 IS 修正天然可以:$s$ 从 buffer 采、$a$ 从当前 $\pi_\theta$ 重采
代表算法REINFORCE、A2C、PPODDPG、SAC
带重参数化的 off-policy actor-critic 算法,右侧是 replay buffer 的存取流程
右侧的 replay buffer 示意画出了两条箭头:交互产生的 $(s_i,a_i,s_i')$ 存入 buffer,训练时从 buffer 取出一个 batch。这就是 off-policy 的物理含义——同一条数据可以被用很多次。底部两行是重参数化恒等式,最后一行的「$\approx$」表示实践中只用单个 $\epsilon$ 样本来近似这个期望,因为梯度已经足够低方差了。注意第 2 步的目标里对 $a'$ 取的是当前策略的期望,而不是 buffer 里存的动作——这正是它区别于 Q-learning 的地方(Q-learning 取 $\max_{a'}$)。
注意:这里的 off-policy 是「部分」的

状态 $s_i$ 来自 buffer,因此服从旧策略混合分布而非当前 $p_{\pi_\theta}$,这个不匹配我们照样没有修正——理由和 6.4 节一样,只是这次连借口都不找了。真正被修正的只有动作:$a'$ 是从当前策略重新采的。这类算法(DDPG、SAC)在实践中样本效率远高于 PPO,代价是对超参数更敏感、更容易发散,因为它们同时承受了 off-policy 分布不匹配和 bootstrapping 的双重压力。

本讲小结:期中复习清单

考前把下面每一行都能默写出来,前半学期就没问题了。「讲次」一列给出该知识点第一次出现的地方,卡住了回去翻。

Part 1 · 模仿学习

知识点一句话 / 关键公式讲次
行为克隆$\argmax_\theta\sum_i\sum_t\log\pi_\theta(a_t^{(i)}|o_t^{(i)})$,就是 MLEL2
状态 vs 观测$s$ 满足马尔可夫性,$o$ 可能部分可观测;BC 用 $o$,理论分析用 $s$L2
分布漂移训练在 $p_{\text{train}}$、测试在 $p_{\pi_\theta}$,两者随 $t$ 线性发散L2
混合分解$p_{\pi_\theta}=(1-\epsilon)^tp_{\text{train}}+(1-(1-\epsilon)^t)p_{\text{mistake}}$(恒等式)L2
伯努利不等式$(1-\epsilon)^t\ge 1-\epsilon t$,故 $D_{\text{TV}}\le\epsilon t$L2
误差界$\sum_t\mathbb{E}[c]\le O(\epsilon H^2)$,二次而非线性L2
DAgger改数据分布而非策略分布;瓶颈是第 3 步人工标注;界降为 $O(\epsilon H)$L2
拟合失败的两因非马尔可夫行为(→ 用历史编码)、多模态行为(→ 用表达力更强的分布)L2
自回归离散化逐维离散 + 链式法则 $\prod_k p(a_{t,k}|s_t,a_{t,\lt k})=p(a_t|s_t)$L2
flow matching训练回归 $x_1-x_0$,采样靠欧拉积分速度场;多模态在积分中分化L2
目标条件 BC用 $s_T$ 当目标标签,失败演示也能用L2

Part 2 · MDP 与策略梯度

知识点一句话 / 关键公式讲次
轨迹分布$p_\theta(\tau)=p(s_1)\prod_t\pi_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)$L4
RL 目标$J(\theta)=\mathbb{E}_{\tau\sim p_\theta}\left[\sum_t\gamma^tr(s_t,a_t)\right]$L4
值函数三兄弟$V^\pi(s)=\mathbb{E}_{a\sim\pi}[Q^\pi(s,a)]$,$A^\pi=Q^\pi-V^\pi$L4
log-derivative trick$p\nabla\log p=\nabla p$,把梯度变回可采样的期望L5
策略梯度$\mathbb{E}\left[\left(\sum_t\nabla\log\pi_\theta\right)\left(\sum_tr\right)\right]$;转移项求导后消失 ⟹ model-freeL5
causality权重换成 reward-to-go $\sum_{t'\ge t}r_{t'}$,仍无偏、方差更小L5
baseline 无偏性$\mathbb{E}[\nabla\log p_\theta\cdot b]=b\nabla\!\int p_\theta=b\nabla 1=0$(要求 $b$ 与动作无关)L5
最优 baseline$b^\star=\mathbb{E}[g^2r]/\mathbb{E}[g^2]$;实践用平均回报或 $\hat V_\phi$L5
重要性采样$\mathbb{E}_p[f]=\mathbb{E}_q\left[\tfrac{p}{q}f\right]$;轨迹权重 $=\prod_t\tfrac{\pi_{\theta'}}{\pi_\theta}$,指数级方差L5
一阶近似扔掉 $p_{\pi_{\theta'}}(s_t)/p_{\pi_\theta}(s_t)$,只留动作比值L5
策略改进恒等式$J(\theta')-J(\theta)=\mathbb{E}_{p_{\theta'}}\left[\sum_t\gamma^tA^{\pi_\theta}\right]$(望远镜求和)L7
耦合引理$D_{\text{TV}}\le\epsilon$ ⟹ 可构造联合分布使两者以 $1-\epsilon$ 概率相同L7
分布变化界$D_{\text{TV}}(p_\theta,p_{\theta'})\le\epsilon t$,与模仿学习的推导同构L7
目标下界真实改进 $\ge\bar A(\theta')-\sum_t2\epsilon tC$,$C=O(Hr_{\max})$ 或 $O(\tfrac{r_{\max}}{1-\gamma})$L7
PPO-clip$\min\{w\hat A,\ \mathrm{clip}(w,1-\epsilon,1+\epsilon)\hat A\}$;$\min$ 是为了堵住 $\hat A\lt0$ 时的漏洞L7
PPO-KL惩罚项 $\beta$ 用对偶上升 $\beta\leftarrow\beta+\alpha(D_{\text{KL}}-\epsilon)$ 自动调节L7
TRPOKL 的二阶近似 + Fisher 信息矩阵 = 自然梯度L7

Part 3 · Actor-Critic

知识点一句话 / 关键公式讲次
在线 actor-critic单步转移即可更新;critic 目标 $y=r+\gamma\hat V_\phi(s')$ 必须 detachL6
A3C在线 AC 的异步并行版,多 worker 打散样本相关性L6
偏差-方差$\hat A_{\text{C}}$ 低方差高偏差;$\hat A_{\text{MC}}$ 无偏高方差L6
$n$-step 优势$\sum_{t'=t}^{t+n}\gamma^{t'-t}r_{t'}-\hat V_\phi(s_t)+\gamma^n\hat V_\phi(s_{t+n})$,$n\gt1$ 通常更好L6
GAE$w_n\propto\lambda^{n-1}$ ⟹ $\hat A_{\text{GAE}}=\sum_{t'\ge t}(\gamma\lambda)^{t'-t}\delta_{t'}$,$\delta=r+\gamma\hat V(s')-\hat V(s)$L6
GAE 实现倒序递归 $\hat A_t=\delta_t+\gamma\lambda\hat A_{t+1}$,$O(T)$L6
优势中心化减均值无偏、除标准差有偏但实用L6
重参数化$a=\mu_\theta(s)+\sigma_\theta(s)\epsilon$,梯度穿过 $Q$;只适用连续动作,方差低L6
replay buffer状态来自旧策略混合分布,这个不匹配同样没修正L6
三条贯穿全课的主线
  1. 分布不匹配是 RL 的原罪。模仿学习的 $O(\epsilon H^2)$、off-policy 策略梯度扔掉的状态比值、PPO 的裁剪、replay buffer 的偏差——从头到尾是同一个问题的四次露面,而且它们的界用的是同一套推导(混合分解 + 伯努利不等式 + TV 散度)。
  2. 偏差与方差是可以连续调节的。$\hat A_{\text{MC}}\to n\text{-step}\to\hat A_{\text{C}}$ 是一条谱线,GAE 用 $\lambda$ 在上面滑动;$\gamma$、$\lambda$、$n$、baseline、critic 全部是这条谱线上的旋钮。
  3. 「不能直接求导」的时候有两条路。log-derivative trick(通用、高方差)和重参数化(要求可微、低方差)。认清一个算法用的是哪条,就知道它的适用边界。

延伸阅读

模仿学习

策略梯度与 PPO 系谱

Actor-Critic