第 8 讲:模仿学习——行为克隆、DAgger 与逆强化学习

Reinforcement Learning · Lecture 08。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS234 Lecture 8(Imitation Learning) 配套代码:code/lecture08/(只需 numpy) 预计阅读时间:4 小时


0. 本讲导航

0.1 本讲要回答的问题

如果写不出一个好的奖励函数,但有专家可以示范,能不能直接从示范中学会怎么做?

前七讲的所有算法都依赖一个奖励函数,智能体通过试错来最大化它。但在很多真实问题中:

  • 奖励很难写。怎么用一个数字描述”开车开得好”?安全、舒适、守规矩、不妨碍他人……写漏一项,智能体就会钻空子(第 1 讲 3.3 节、第 2 讲第 10 节的奖励投机)。
  • 试错很危险、很昂贵。自动驾驶不能靠撞车来学,手术机器人不能靠失误来学。
  • 但示范很容易获得。人类司机每天开几亿公里;医生的操作可以录下来;人写的文字无穷无尽。

模仿学习(imitation learning):从专家的示范中学习策略。

本讲也是后面几讲的引子:第 9 讲的 RLHF 从人类的偏好中学习,第 10 讲的离线 RL 从历史数据中学习——它们和模仿学习一样,都要面对同一个核心难题:分布偏移。

0.2 学完本讲,你应该能够

  1. 写出行为克隆的形式化定义,说明它为什么”在训练数据上几乎完美,一上路就出问题”。
  2. 解释复合误差和分布偏移,理解 O(εT2)O(\varepsilon T^2) 误差界的直觉。
  3. 写出 DAgger 算法,解释它为什么能把误差降到 O(εT)O(\varepsilon T),以及它在实践中的困难。
  4. 说出**噪声注入(DART)**等不需要交互式专家的替代方法。
  5. 解释逆强化学习的动机(奖励比策略更容易迁移)和根本困难(奖励的不可辨识性)。
  6. 理解特征期望匹配,推导最大熵 IRL 的目标与梯度,知道软价值迭代是如何计算它的。
  7. 大致了解 GAIL 等对抗式模仿学习的思想。

0.3 先修知识

知识点用在哪里最低要求
监督学习(分类)的基本概念第 2 节知道”在训练集上拟合、在测试集上评估”
第 2 讲:价值迭代、有限视界第 5 节必须
第 5 讲:线性函数逼近、特征第 4、5 节知道 R(s)=w⋅ϕ(s)R(s) = w \cdot \phi(s)
第 6 讲:softmax、对数似然与梯度第 5 节必须
概率:独立事件、并集界 P(A∪B)≤P(A)+P(B)P(A \cup B) \le P(A) + P(B)第 2.3 节会用即可

0.4 本讲地图

第1节 问题设定:专家示范,没有奖励
   │
   ├──► 学策略 ────► 第2节 行为克隆:简单,但有复合误差
   │                    │
   │                 第3节 DAgger:在学习者自己的分布上收集标签;DART 噪声注入
   │
   └──► 学奖励 ────► 第4节 逆强化学习:动机与不可辨识性;特征期望匹配
                        │
                     第5节 最大熵 IRL
                        │
                     第6节 对抗式模仿学习(GAIL)
   │
第7节 模仿学习与强化学习的结合;分布偏移——贯穿后面几讲的主题

1. 问题设定

1.1 我们有什么?

  • 环境(状态、动作、转移),但没有奖励函数(或者奖励函数存在,但我们不知道);
  • 一个专家的策略 π∗\pi^*,我们看不到它的内部,只能看到它的示范;
  • 一批示范数据 D={τ1,τ2,… }\mathcal{D} = \{\tau_1, \tau_2, \dots\},每条轨迹 τi=(s0,a0,s1,a1,… )\tau_i = (s_0, a_0, s_1, a_1, \dots) 由专家产生。

目标:学一个策略 π\pi,在(未知的)真实目标下表现得和专家一样好。

1.2 两条路线

路线学什么代表方法
直接学策略π(a∣s)\pi(a \mid s):在每个状态做专家会做的事行为克隆、DAgger
先学奖励,再求策略R(s)R(s) 或 R(s,a)R(s, a):专家在最大化什么逆强化学习(IRL)、GAIL

1.3 本讲的实验环境

车道保持(代码 lane_env.py):

    撞车 | . . . . . . . . [中心] . . . . . . . . | 撞车
        -8          -3 -2 -1  0  1  2  3          +8
                       └──── 车道 ────┘
  • 状态 xx 是车相对车道中心的横向偏移(−7 到 +7),∣x∣≥8|x| \ge 8 冲出路面;
  • 动作:向左打方向(−1)、不动(0)、向右打方向(+1);
  • 每一步有侧风,以 0.1 / 0.2 / 0.4 / 0.2 / 0.1 的概率把车吹动 −2 / −1 / 0 / +1 / +2 格——风有时比方向盘的修正能力更强;
  • 代价:每一步不在车道内(∣x∣>2|x| > 2)代价 +1;冲出路面后剩下的每一步都算代价 +1。
  • 专家:永远往中心打方向。

专家开车时车在哪里(代码 01_behavior_cloning.py 演示 1):

xx−4−3−2−10+1+2+3+4∣x∣≥5\lvert x \rvert \ge 5
概率0.0020.0130.1030.2040.3580.2040.1000.0130.002≈ 0

专家几乎只出现在 ∣x∣≤3|x| \le 3 的地方。它的示范里,“车被吹到 x=±5x = \pm 5 该怎么办”的数据几乎为零——这就是后面一切问题的根源。


2. 行为克隆

2.1 把模仿当作监督学习

最直接的想法:把示范中的每一个 (st,at)(s_t, a_t) 当作监督学习的 (输入, 标签),训练一个分类器(或回归器):

π^=arg⁡min⁡π  Es∼dπ∗[ℓ(π(s),π∗(s))]\hat\pi = \arg\min_\pi \; \mathbb{E}_{s \sim d^{\pi^*}}\left[ \ell\big(\pi(s), \pi^*(s)\big) \right]

其中 dπ∗d^{\pi^*} 是专家的状态分布,ℓ\ell 是分类损失(如交叉熵)。这叫行为克隆(Behavior Cloning, BC)。

它简单、稳定,只需要标准的监督学习工具,而且在数据充足时效果可以很好。历史上著名的例子:1989 年卡内基梅隆大学的 ALVINN 用一个小神经网络从摄像头画面学开车;2016 年 NVIDIA 的端到端自动驾驶也是行为克隆。今天大语言模型的”监督微调(SFT)“阶段,本质上也是行为克隆。

2.2 看起来几乎完美

用 5 个专家回合(每个 50 步,共 250 个样本)训练一个表格型学习者(每个状态记住专家最常做的动作,没见过的状态默认”不打方向”):

    -7:? -6:? -5:? -4:? -3:→ -2:→ -1:→ +0:· +1:← +2:← +3:← +4:? +5:? +6:? +7:?

在专家的状态分布上衡量,它的错误率 ε\varepsilon 只有 0.38%。按监督学习的标准,这是一个近乎完美的分类器。

2.3 复合误差

但让它自己开车(代码 01 演示 3,每个 TT 跑 3000 个回合):

回合长度 TT专家代价BC 代价BC / 专家专家撞车率BC 撞车率
250.781.001.290.00%0.87%
501.572.431.540.03%2.40%
1003.156.492.060.03%5.70%
2006.3718.422.890.03%11.33%
40012.8357.874.510.03%21.20%

专家的代价与 TT 成正比,BC 的代价增长得比 TT 快得多:两者之比随 TT 从 1.3 增长到 4.5。

发生了什么? 在 ∣x∣≤3|x| \le 3 的地方,BC 和专家的行为完全相同。但每一步都有一点点概率被风吹到 ∣x∣≥4|x| \ge 4——这是 BC 从没见过的状态。专家在这里会把车拉回来;BC 不知道该怎么办,于是不再修正方向,车随风漂移,接下来的每一步都在付出代价,最后常常冲出路面。

最直接的对比(演示 4):3000 个 T=400T = 400 的回合中,有 1872 个回合曾经被吹到 ∣x∣≥4|x| \ge 4(专家和 BC 在这之前的行为完全一样,所以这个数字相同)。这些回合中,专家 0% 冲出路面,BC 33.7% 冲出路面。 同一次”失误”之后,专家能恢复,BC 不能。

2.4 分布偏移与 O(εT2)O(\varepsilon T^2) 误差界

问题的根源:训练时的状态分布(专家的 dπ∗d^{\pi^*})与测试时的状态分布(学习者自己的 dπ^d^{\hat\pi})不同。这叫分布偏移(distribution shift),也叫协变量偏移(covariate shift)。

  • 监督学习的基本假设是训练数据和测试数据同分布。行为克隆违反了这个假设:学习者自己的决策决定了它会到达哪些状态(第 1 讲 2.3 节:“数据由自己的决策产生”)。
  • 在 BC 自己的状态分布上衡量,它的错误率从 0.38% 升到 1.24%(演示 4)——而且这个数字还被低估了,因为冲出路面后回合就结束了,那之后的”时间”没有被计入分布。

误差界(Ross & Bagnell, 2010):设每步代价在 [0,1][0, 1] 之间,学习者在专家状态分布上的错误率为 ε\varepsilon。那么在最坏情况下

J(π^)≤J(π∗)+T2εJ(\hat\pi) \le J(\pi^*) + T^2 \varepsilon

直觉:

  • 在专家的分布上,每一步犯错的概率是 ε\varepsilon。TT 步中至少犯一次错的概率最多是 TεT\varepsilon(并集界)。
  • 一旦犯了错,学习者进入陌生的状态,最坏情况下之后每一步都付出代价——最多 TT 步。
  • 两者相乘:Tε×T=εT2T\varepsilon \times T = \varepsilon T^2。

这个界是紧的:存在一些问题,BC 真的会差这么多。对比一下,普通监督学习的误差是 O(ε)O(\varepsilon)(每个样本独立),序贯决策让它放大了 T2T^2 倍——“做决策”和”做预测”的本质区别,就在于决策会影响未来的输入。

2.5 多收集数据有用吗?

(代码 01 演示 5,T=400T = 400 时的代价,每种设置 5 次独立收集;专家代价 12.73)

专家回合数数据量覆盖范围BC 代价
150[−4,+4][-4, +4]187.14
5250[−4,+4][-4, +4]48.62
201,000[−5,+4][-5, +4]24.98
1005,000[−6,+5][-6, +5]17.83
50025,000[−7,+5][-7, +5]13.62

数据越多越好,但代价很大:要接近专家的水平,需要约 500 个回合、25000 个标注。原因是专家本来就很少去 ∣x∣≥5|x| \ge 5 的地方,绝大部分数据都是车道中心附近的重复示范,真正有用的”恢复”数据只占极小一部分。问题不在于数据的量,而在于数据的分布。


3. DAgger:在学习者自己的分布上收集标签

3.1 算法

既然问题是”训练分布 ≠ 测试分布”,最直接的解决办法是:在测试分布上收集训练数据。DAgger(Dataset Aggregation,Ross, Gordon & Bagnell, 2011):

算法:DAgger
D ← 专家示范数据
π_1 ← 在 D 上训练
对 i = 1, 2, ..., N:
    π_mix ← β_i π* + (1 - β_i) π_i           (常用:β_1 = 1,之后 β_i = 0)
    用 π_mix 运行,记录访问的状态 {s}
    请专家标注:{(s, π*(s))}                   ← 专家只需说"这里该怎么做",不需要亲自去开
    D ← D ∪ {(s, π*(s))}                       ← 聚合(不丢弃旧数据)
    π_{i+1} ← 在 D 上训练
返回表现最好的 π_i

关键在于:由学习者自己开车,于是它会到达自己会犯错的地方;专家在这些地方提供”正确答案”——正是行为克隆缺少的”恢复”数据。

3.2 理论保证

DAgger 可以看作一个在线学习问题:每一轮的”损失函数”是在当前策略的状态分布上的分类误差。用一个”无遗憾(no-regret)“的在线学习算法(比如”在所有聚合数据上重新训练”这种 follow-the-leader 式的方法),可以保证存在某一轮的策略满足:

J(π^)≤J(π∗)+u T εN+O(⋅)J(\hat\pi) \le J(\pi^*) + u\, T\, \varepsilon_N + O(\cdot)

其中 εN\varepsilon_N 是在学习者自己的状态分布上能达到的最小错误率,uu 衡量专家从一次失误中”恢复”的能力(每次偏离后专家要多付出多少代价)。T2T^2 变成了 TT:因为学习者在自己会去的地方都有数据,犯错后知道怎么恢复,错误不再复合。

3.3 实验

一个重要的建模细节:01 文件中的表格型学习者在见过的状态上从不犯错。真实的学习者(比如神经网络)做不到这一点。代码 02_dagger.py 用”执行时以概率 ε\varepsilon 随机换成另一个动作”来模拟这种分类误差——这个 ε\varepsilon 就是误差界中的 ε\varepsilon。

DAgger 的迭代过程(ε=0.05\varepsilon = 0.05,共 2500 个标注,分 5 次迭代;带同样 5% 失误率的”专家”代价为 23.88):

迭代累计标注覆盖范围T=400T = 400 的代价
1(= 行为克隆)500[−3,+3][-3, +3]141.26
21000[−7,+5][-7, +5]29.40
3–51500–2500[−7,+5][-7, +5]29.40

从第 2 次迭代开始由学习者开车,它(因失误和风)到达的偏远状态都得到了专家的标签,代价从 141 骤降到 29。

同样的标注预算,行为克隆 vs DAgger(8 次独立实验的平均):

学习者失误率 ε\varepsilon标注预算行为克隆DAgger下限(带同样失误率的专家)
050045.228.913.0
0100033.824.313.0
0250020.618.613.0
0.05500117.057.125.2
0.05100091.051.925.2
0.05250060.728.625.2
0.10500190.371.041.9
0.101000156.977.441.9
0.102500113.754.141.9

解读:

  • ε=0\varepsilon = 0(学习者完美记忆):DAgger 比行为克隆好一些,但差距不大——学习者只在罕见的”被风吹远”时才会偏离专家的分布。
  • ε>0\varepsilon > 0(学习者会犯错,这才是真实情况):行为克隆急剧变差——学习者自己的失误不断把车带到专家没示范过的地方。DAgger 的代价常常只有行为克隆的一半,并随预算增加逐渐接近下限。
  • 这正是理论的预言:行为克隆 O(εT2)O(\varepsilon T^2),DAgger O(εT)O(\varepsilon T)。ε\varepsilon 越大,差距越明显。

3.4 DAgger 的实践困难

DAgger 在理论上很漂亮,但实践中有两个麻烦:

  1. 需要交互式专家。专家要能随时给学习者访问到的任意状态打标签。对人类专家来说这很不自然:看着一段”车快要冲出路面”的录像,说出”此刻方向盘应该打多少度”——而不是自己去开——既困难又不准确。
  2. 安全性。让一个还没学好的学习者去开车(收集数据),本身就可能是危险的。

实践中的变体包括:HG-DAgger(人类专家只在觉得危险时接管,只标注接管的片段)、在仿真器中用”特权专家”(能看到完整状态的规划器)来标注,等等。

3.5 不需要交互式专家的替代:噪声注入

DART(Laskey et al., 2017)的思路:既然问题是专家的示范缺少”恢复”数据,那就在专家示范时故意加入噪声——让专家以一定概率执行一个随机动作(被动地”失误”),但记录的标签永远是专家本来想做的动作。专家会被自己的”失误”带到偏离中心更远的地方,并示范如何恢复。

(代码 02 演示 3,ε=0.05\varepsilon = 0.05,1000 个标注,8 次实验):

示范时的噪声学习者代价
0(= 行为克隆)98.5
0.148.1
0.325.3
0.524.9

适量的噪声让代价从 98.5 降到约 25,接近下限;在这个例子里甚至比 DAgger(同样预算约 52)更好——噪声恰好模拟了学习者会犯的那种错误,专家直接示范了”犯错之后怎么恢复”。它只需要离线收集专家示范,实践中常常更容易实现。代价是噪声太大时,示范者自己可能陷入危险(在这个例子里标签总是正确的,所以没有体现出来)。

另一个著名的例子:NVIDIA 2016 年的端到端自动驾驶,在车的左右两侧也装了摄像头。侧面摄像头的画面看起来就像”车偏离了车道”,再给这些画面配上”往回打方向”的标签——这是一种数据增强,本质上和噪声注入是同一个思想:人工制造”偏离后如何恢复”的数据。


4. 逆强化学习

4.1 为什么要学奖励?

行为克隆学的是”在每个状态做什么”。**逆强化学习(Inverse Reinforcement Learning, IRL)**换一个问题:专家为什么这样做——他在最大化什么奖励?

学奖励有三个好处:

  1. 奖励比策略更容易迁移。“水很危险、终点很好”这样的偏好,换一张地图、换一个起点依然成立;而”在第 3 行第 2 列往右走”这样的策略,环境一变就毫无意义(第 5.4 节的实验)。
  2. 奖励比策略更简洁。一个复杂的驾驶行为,背后可能只是几条简单的偏好。
  3. 理解行为本身。在认知科学、经济学中,“从行为推断偏好”本身就是研究目标。

4.2 根本困难:奖励的不可辨识性

IRL 是一个病态(ill-posed)问题:许多不同的奖励都能解释同样的行为。

  • 平凡解:R≡0R \equiv 0(所有状态奖励都是 0)。此时任何策略都是最优的,当然也包括专家的策略。
  • 缩放:RR 和 cRcR(c>0c > 0)的最优策略完全相同。
  • 平移:给所有状态的奖励加同一个常数,在固定视界下所有轨迹的总奖励都加同一个数,最优策略不变。
  • 势函数塑形(Ng, Harada & Russell, 1999):对任意函数 Φ(s)\Phi(s),把奖励改为 R′(s,a,s′)=R(s,a,s′)+γΦ(s′)−Φ(s)R'(s, a, s') = R(s, a, s') + \gamma\Phi(s') - \Phi(s),最优策略不变(这些额外项沿轨迹望远镜求和,只剩下与起点有关的常数)。

所以 IRL 不能指望恢复”唯一正确”的奖励。不同的 IRL 方法,本质上是用不同的原则从众多候选中挑一个。

4.3 线性奖励与特征期望

设奖励是特征的线性函数 R(s)=w⋅ϕ(s)R(s) = w \cdot \phi(s)。一个策略的价值可以写成

J(π)=Eπ[∑tγtw⋅ϕ(st)]=w⋅Eπ[∑tγtϕ(st)]⏟μ(π)J(\pi) = \mathbb{E}_\pi\left[ \sum_t \gamma^t w \cdot \phi(s_t) \right] = w \cdot \underbrace{\mathbb{E}_\pi\left[ \sum_t \gamma^t \phi(s_t) \right]}_{\mu(\pi)}

μ(π)\mu(\pi) 叫策略的特征期望(feature expectations):平均而言,这个策略”累积”了多少各种特征。

一个关键观察(Abbeel & Ng, 2004,学徒学习):如果学到的策略的特征期望与专家的足够接近,∥μ(π)−μ(π∗)∥≤ϵ\lVert \mu(\pi) - \mu(\pi^*) \rVert \le \epsilon,那么对任何 ∥w∥≤1\lVert w \rVert \le 1 的奖励:

∣J(π)−J(π∗)∣=∣w⋅(μ(π)−μ(π∗))∣≤∥w∥ ∥μ(π)−μ(π∗)∥≤ϵ|J(\pi) - J(\pi^*)| = |w \cdot (\mu(\pi) - \mu(\pi^*))| \le \lVert w \rVert\, \lVert \mu(\pi) - \mu(\pi^*) \rVert \le \epsilon

(柯西–施瓦茨不等式。)也就是说:不必知道真正的奖励是什么,只要匹配了特征期望,在所有可能的线性奖励下都和专家一样好。 这绕开了不可辨识性。

但仍然有一个问题:匹配同一组特征期望的策略可能有很多,该选哪一个?


5. 最大熵逆强化学习

5.1 最大熵原则

Ziebart et al.(2008)用信息论中的最大熵原则(Jaynes, 1957)来回答:在所有满足约束(特征期望匹配)的轨迹分布中,选择熵最大的那一个——它满足约束,但”不做任何多余的假设”。

可以证明,这样的分布具有如下形式(对确定性转移):

P(τ∣w)=exp⁡(w⋅μ(τ))Z(w),μ(τ)=∑tϕ(st),Z(w)=∑τexp⁡(w⋅μ(τ))P(\tau \mid w) = \frac{\exp\big( w \cdot \mu(\tau) \big)}{Z(w)}, \qquad \mu(\tau) = \sum_t \phi(s_t), \qquad Z(w) = \sum_\tau \exp\big(w \cdot \mu(\tau)\big)

直觉:总奖励越高的轨迹,出现的概率指数级越高;但奖励差不多的轨迹,出现的概率也差不多。这把专家建模为一个”玻尔兹曼理性”的决策者:大体上追求高奖励,但不是完美地、确定性地选最优,而是带有一定随机性。这比”专家总是完美最优”的假设现实得多——人类示范本来就有噪声。

它还自动排除了 4.2 节的平凡解 R≡0R \equiv 0:w=0w = 0 时所有轨迹等可能(均匀随机游走),显然不能解释一个有明确目标的专家。

5.2 极大似然与梯度

给定示范 {τ1,…,τN}\{\tau_1, \dots, \tau_N\},最大化对数似然:

L(w)=1N∑ilog⁡P(τi∣w)=w⋅1N∑iμ(τi)⏟μE−log⁡Z(w)L(w) = \frac1N \sum_i \log P(\tau_i \mid w) = w \cdot \underbrace{\frac1N \sum_i \mu(\tau_i)}_{\mu_E} - \log Z(w)

对 ww 求导(log⁡Z\log Z 的导数是指数族分布的标准结果:∇wlog⁡Z(w)=Eτ∼P(⋅∣w)[μ(τ)]\nabla_w \log Z(w) = \mathbb{E}_{\tau \sim P(\cdot \mid w)}[\mu(\tau)]):

  ∇wL(w)=μE−Eτ∼P(⋅∣w)[μ(τ)]  \boxed{\;\nabla_w L(w) = \mu_E - \mathbb{E}_{\tau \sim P(\cdot \mid w)}\left[ \mu(\tau) \right]\;}

专家的平均特征计数减去当前模型的期望特征计数。如果专家比模型更常待在终点,就提高”终点”的权重;如果模型比专家更常下水,就降低”水”的权重。梯度为 0 时,特征期望恰好匹配——最大熵 IRL 自动实现了 4.3 节的特征期望匹配。

而且 L(w)L(w) 是凹函数(−log⁡Z-\log Z 是凹的,w⋅μEw \cdot \mu_E 是线性的),梯度上升一定能找到全局最优。

5.3 怎么计算 log⁡Z\log Z 和期望特征计数?

对所有轨迹求和是指数级的,但可以用动态规划高效计算:

反向——软价值迭代(第 2 讲价值迭代的”软”版本):

Qt(s,a)=R(s)+Vt+1(s′),Vt(s)=log⁡∑aexp⁡Qt(s,a),πt(a∣s)=exp⁡(Qt(s,a)−Vt(s))Q_t(s, a) = R(s) + V_{t+1}(s'), \qquad V_t(s) = \log \sum_a \exp Q_t(s, a), \qquad \pi_t(a \mid s) = \exp\big(Q_t(s, a) - V_t(s)\big)

把价值迭代中的 max⁡\max 换成 log⁡∑exp⁡\log\sum\exp(“软最大值”)。V0(s0)V_0(s_0) 恰好就是 log⁡Z(w)\log Z(w),πt\pi_t 就是最大熵模型下的策略。

前向——状态访问量:

D0=es0,Dt+1(s′)=∑s,aDt(s) πt(a∣s) 1[s′(s,a)=s′]D_0 = e_{s_0}, \qquad D_{t+1}(s') = \sum_{s, a} D_t(s)\, \pi_t(a \mid s)\, \mathbb{1}[s'(s, a) = s']

期望特征计数 =∑t∑sDt(s)ϕ(s)= \sum_t \sum_s D_t(s) \phi(s)。

算法:最大熵 IRL
计算专家的平均特征计数 μ_E
w ← 0
重复:
    反向:用 R = w·φ 做软价值迭代,得到 π_t(a|s)
    前向:计算状态访问量 D_t(s),得到期望特征计数 μ_w
    w ← w + α (μ_E - μ_w)

5.4 实验

代码 03_maxent_irl.py:6×6 网格,特征 = [是否终点, 是否水, 是否沙地],真实奖励 w∗=[2,−3,−1]w^* = [2, -3, -1],回合长度 20。专家是真实奖励下的最大熵策略,从左下角出发示范 100 次。

    训练地图                           新地图(没有任何示范)
    . . . . . G                        G . . . . .
    . W W . . .                        . . . W W .
    . W W . s .                        . s . W W .
    . . . . s .                        . s . . . .
    s s . . . .                        . . . . s s
    A . . . . .                        . . . . . B

学习过程:

迭代ww(终点, 水, 沙地)对数似然梯度范数
0[0, 0, 0]−32.199.338
50[2.03, −1.42, −0.65]−19.630.101
150[2.03, −1.97, −0.66]−19.590.031
300[2.03, −2.26, −0.66]−19.590.012

恢复的 w^=[2.03,−2.26,−0.66]\hat w = [2.03, -2.26, -0.66],真实 w∗=[2,−3,−1]w^* = [2, -3, -1]。专家示范的平均特征计数 μE=[8.85,0.03,1.19]\mu_E = [8.85, 0.03, 1.19],w^\hat w 下模型的期望特征计数 [8.85,0.042,1.19][8.85, 0.042, 1.19]:终点和沙地已经匹配,水还差一点。

  • 终点的权重几乎完全准确。
  • 似然在”水”这个方向上非常平:从第 50 轮到第 300 轮,水的权重从 −1.42 走到 −2.26,对数似然只变了 0.04。300 轮时梯度上升还没有收敛。
  • 水和沙地的惩罚都比真实值小。原因不是 IRL 有系统性的偏差,而是下面几件事。

w^\hat w 为什么和 w∗w^* 不一样?(演示 5)

情形w^\hat w(终点, 水, 沙地)
本组 100 条示范,跑 300 轮(上表)[2.03, −2.26, −0.66]
本组 100 条示范,跑到收敛(2144 轮)[2.03, −2.53, −0.66]
无穷多条示范(直接用 Ew∗[μ]\mathbb{E}_{w^*}[\mu] 拟合)[2.00, −3.00, −1.00]
另外 30 组、每组 100 条示范,各自收敛后的均值 ± 标准差[2.02 ± 0.08, −2.93 ± 0.51, −1.02 ± 0.11]
  1. 优化没有收敛:只影响水,从 −2.26 继续走到 −2.53。
  2. 这批示范的运气:专家真正的期望特征计数是 [8.79,0.017,0.85][8.79, 0.017, 0.85],这 100 条示范却是 [8.85,0.03,1.19][8.85, 0.03, 1.19],恰好更常踩沙地、更常下水。极大似然忠实地匹配这批数据,于是认为沙地和水”没那么差”。数据无穷多时恢复了 w∗w^*:专家确实是”线性奖励下的玻尔兹曼理性”时,最大熵 IRL 的估计随数据增多而趋于真值。
  3. 专家很少做的事,对应权重的估计方差很大:换 30 组示范,终点和沙地的估计都集中在真值附近,水的标准差却有 0.51(最小 −3.48,最大 −1.97)。专家的一条轨迹下水的概率只有 1.6%,“水有多差”只能靠寥寥几次下水来推断。
  4. 专家从不做的事,极大似然解不存在:100 条示范全都不下水的概率是 0.208(40 组中实际有 10 组)。这时任何有限的 ww 都会让模型偶尔下水,梯度永远指向”更负”:跑 300 轮,水的权重是 −2.69;跑 3000 轮是 −4.61,对数似然仍在缓慢上升。只要”足够差”,任何值都同样能解释数据。这才是”专家从不做的事,我们无法知道它有多糟”的准确含义,也是 IRL 的普遍现象。

迁移到新地图(真实奖励下的期望总奖励):

策略训练地图(从 A)新地图(从 B)
最优(用真实奖励规划)20.0020.00
IRL(用恢复的奖励规划)20.0020.00
行为克隆(照搬”格子 → 动作”)20.00−1.00
均匀随机−7.09−7.09

在训练地图上,IRL 和行为克隆都达到了最优。换到新地图:

  • 行为克隆照搬”这个格子该往哪走”,从 B 出发一路向上、踩过沙地,最后停在右上角不动——那正是训练地图中终点的位置!它学会的是”去右上角”,而不是”去终点”。
  • IRL 恢复的是”终点好、水差、沙地差”,在新地图上重新规划,与最优完全一样。

奖励比策略更容易迁移——这是逆强化学习最重要的动机。

不可辨识性的演示(演示 4):给特征加一个常数 1,常数特征的权重一直停在初始值 0。每条轨迹恰好 20 步,常数特征的计数永远是 20,专家和模型完全相同,梯度恒为 0——从行为中原则上无法区分”所有奖励都加一个常数”的两种奖励。


6. 对抗式模仿学习(GAIL)

最大熵 IRL 的每一步梯度都要完整地求解一次(软)RL 问题(软价值迭代)。在大规模问题中这太贵了。

GAIL(Generative Adversarial Imitation Learning,Ho & Ermon, 2016)借鉴生成对抗网络(GAN)的思想,跳过显式地恢复奖励:

  • 判别器 D(s,a)D(s, a):一个分类器,试图区分”专家的 (s,a)(s, a)“和”学习者的 (s,a)(s, a)”;
  • 策略(生成器):用 RL(通常是 PPO / TRPO)训练,奖励是”骗过判别器的程度”,例如 r(s,a)=−log⁡(1−D(s,a))r(s, a) = -\log(1 - D(s, a));
  • 两者交替训练。当判别器再也分不出来时,学习者的状态–动作占用分布就和专家的一样了。

它可以看作最大熵 IRL 的一种高效近似:同样是在匹配专家的行为分布,但判别器提供了一个”随学随用”的奖励信号,不需要每一步都完整求解 RL。GAIL 需要与环境交互(它是在做 RL),但不需要交互式专家。


7. 模仿学习的位置

7.1 模仿学习 + 强化学习

模仿学习和强化学习经常组合使用:

  • 用模仿学习初始化,再用 RL 微调:AlphaGo 先用人类棋谱做行为克隆,再用自我对弈的 RL 提升;大语言模型先做监督微调(SFT,即行为克隆),再做 RLHF(第 9 讲)。模仿提供一个”合理的起点”,避免 RL 从随机策略开始漫无目的地探索;RL 让模型超越示范者。
  • 用示范加速 RL:把专家示范放进经验回放缓冲区(如 DQfD),或在 RL 损失中加入模仿项。

7.2 贯穿后面几讲的主题:分布偏移

本讲的核心困难是:学习者的行为改变了它会遇到的数据分布,而它只在另一个分布上受过训练。接下来的两讲会一再遇到它:

  • 第 9 讲(RLHF):奖励模型是在”初始模型的回答”上训练的;用 RL 优化之后,模型的回答分布变了,奖励模型在新分布上可能很不准——于是出现”奖励投机”。解决办法之一是用 KL 惩罚让模型不要离初始分布太远。
  • 第 10 讲(离线 RL):只有历史数据,学出的新策略会访问数据中很少出现的状态和动作,价值估计在那里可能严重偏高。解决办法是”悲观”——对数据覆盖不到的地方保持怀疑。

8. 本讲总结

8.1 核心概念清单

  1. 模仿学习:从专家示范中学习,不需要奖励函数;两条路线:学策略(BC、DAgger)、学奖励(IRL、GAIL)。
  2. 行为克隆:把模仿当作监督学习;简单有效,但受分布偏移影响。
  3. 复合误差:一次失误把学习者带到陌生状态,错误不断累积;误差界 O(εT2)O(\varepsilon T^2),而监督学习只有 O(ε)O(\varepsilon)。
  4. 多收集专家数据帮助有限:问题在于数据分布,不在于数据量。
  5. DAgger:由学习者运行、专家标注、聚合数据;误差界降到 O(εT)O(\varepsilon T);需要交互式专家。
  6. 噪声注入(DART)/ 数据增强:人为制造”偏离后如何恢复”的数据,不需要交互式专家。
  7. 逆强化学习:学奖励而非策略;奖励更容易迁移;但奖励不可辨识(平凡解、缩放、平移、势函数塑形)。
  8. 特征期望匹配:匹配 μ(π)\mu(\pi) 就能在所有线性奖励下与专家一样好。
  9. 最大熵 IRL:P(τ)∝exp⁡(w⋅μ(τ))P(\tau) \propto \exp(w \cdot \mu(\tau));梯度 =μE−Ew[μ]= \mu_E - \mathbb{E}_w[\mu];软价值迭代 + 前向访问量计算;专家很少做的事,对应权重的估计方差大;从不做的事,极大似然解不存在(无法知道有多糟)。
  10. GAIL:判别器区分专家与学习者,策略用 RL 去”骗过”判别器。
  11. 分布偏移是模仿学习、RLHF、离线 RL 的共同难题。

8.2 公式速查表

名称公式
行为克隆π^=arg⁡min⁡πEs∼dπ∗[ℓ(π(s),π∗(s))]\hat\pi = \arg\min_\pi \mathbb{E}_{s \sim d^{\pi^*}}[\ell(\pi(s), \pi^*(s))]
BC 误差界J(π^)≤J(π∗)+T2εJ(\hat\pi) \le J(\pi^*) + T^2 \varepsilon
DAgger 误差界J(π^)≤J(π∗)+uTεN+O(⋅)J(\hat\pi) \le J(\pi^*) + u T \varepsilon_N + O(\cdot)
线性奖励R(s)=w⋅ϕ(s)R(s) = w \cdot \phi(s)
特征期望μ(π)=Eπ[∑tγtϕ(st)]\mu(\pi) = \mathbb{E}_\pi[\sum_t \gamma^t \phi(s_t)],J(π)=w⋅μ(π)J(\pi) = w \cdot \mu(\pi)
特征匹配保证∣J(π)−J(π∗)∣≤∥w∥∥μ(π)−μ(π∗)∥\lvert J(\pi) - J(\pi^*) \rvert \le \lVert w \rVert \lVert \mu(\pi) - \mu(\pi^*) \rVert
势函数塑形R′(s,a,s′)=R(s,a,s′)+γΦ(s′)−Φ(s)R'(s,a,s') = R(s,a,s') + \gamma\Phi(s') - \Phi(s) 不改变最优策略
最大熵轨迹分布P(τ∣w)=exp⁡(w⋅μ(τ))/Z(w)P(\tau \mid w) = \exp(w \cdot \mu(\tau)) / Z(w)
对数似然L(w)=w⋅μE−log⁡Z(w)L(w) = w \cdot \mu_E - \log Z(w)
最大熵 IRL 梯度∇wL=μE−Eτ∼P(⋅∣w)[μ(τ)]\nabla_w L = \mu_E - \mathbb{E}_{\tau \sim P(\cdot \mid w)}[\mu(\tau)]
软价值迭代Vt(s)=log⁡∑aexp⁡(R(s)+Vt+1(s′(s,a)))V_t(s) = \log \sum_a \exp(R(s) + V_{t+1}(s'(s,a)))
最大熵策略πt(a∣s)=exp⁡(Qt(s,a)−Vt(s))\pi_t(a \mid s) = \exp(Q_t(s,a) - V_t(s))
GAIL 奖励r(s,a)=−log⁡(1−D(s,a))r(s,a) = -\log(1 - D(s,a))

8.3 中英术语对照表

中文英文中文英文
模仿学习Imitation learning专家示范Expert demonstrations
行为克隆Behavior cloning (BC)监督微调Supervised fine-tuning (SFT)
分布偏移Distribution shift协变量偏移Covariate shift
复合误差Compounding error数据集聚合Dataset Aggregation (DAgger)
无遗憾在线学习No-regret online learning噪声注入Noise injection (DART)
数据增强Data augmentation逆强化学习Inverse reinforcement learning (IRL)
不可辨识性Unidentifiability病态问题Ill-posed problem
势函数塑形Potential-based reward shaping特征期望Feature expectations
学徒学习Apprenticeship learning最大熵原则Principle of maximum entropy
玻尔兹曼理性Boltzmann rationality配分函数Partition function
软价值迭代Soft value iteration状态访问频率State visitation frequency
生成对抗模仿学习Generative Adversarial Imitation Learning (GAIL)判别器Discriminator
占用分布Occupancy measure奖励迁移Reward transfer

9. 练习题

练习 1(概念):为什么说”行为克隆在训练集上的准确率很高”不能说明它学得好?用车道保持的例子说明。

参考答案

训练集的状态来自专家的分布,而测试时学习者在自己的分布上运行。车道保持中,BC 在专家分布上的错误率只有 0.38%,但专家的数据几乎不包含 ∣x∣≥4|x| \ge 4 的状态;学习者一旦被吹到那里就不知道怎么办,代价随回合长度超线性增长(T=400T = 400 时是专家的 4.5 倍)。监督学习的”训练 / 测试同分布”假设在序贯决策中不成立。

练习 2(误差界):某个行为克隆策略在专家分布上的错误率为 ε=0.001\varepsilon = 0.001,回合长度 T=1000T = 1000,每步代价在 [0,1][0, 1] 之间。按 O(εT2)O(\varepsilon T^2) 的误差界,最坏情况下它比专家多付出多少代价?如果用 DAgger 达到同样的 ε\varepsilon,误差界大约是多少?

参考答案

BC:εT2=0.001×106=1000\varepsilon T^2 = 0.001 \times 10^6 = 1000——等于回合长度,意味着最坏情况下每一步都付代价,界失去意义。DAgger:约 uTε=u×1u T \varepsilon = u \times 1,即多付出约 uu 的代价(uu 为恢复代价)。长回合中两者的差距是天壤之别。

练习 3(DAgger):DAgger 为什么要”聚合”所有轮次的数据,而不是只用最新一轮收集的数据训练?

参考答案

如果只用最新一轮的数据,新策略只会在”上一个策略访问的状态”上表现好,而新策略访问的状态可能又不同,于是在不同的分布之间来回振荡,永远不收敛。聚合所有数据相当于在”所有历史策略的状态分布的混合”上训练,对应在线学习中的 follow-the-leader 策略,是无遗憾的,从而保证了理论界。

练习 4(不可辨识性):在一个 3 状态的确定性链上(s1→s2→s3s_1 \to s_2 \to s_3,s3s_3 为终点),专家总是向右走。写出三个不同的奖励函数,使专家的策略都是最优的。

参考答案

例如:(1) R=(0,0,1)R = (0, 0, 1);(2) R=(0,0,100)R = (0, 0, 100)(缩放);(3) R=(−1,−1,0)R = (-1, -1, 0)(每步都有代价,越快结束越好)。还有平凡解 R=(0,0,0)R = (0, 0, 0)(此时任何策略都最优)。这说明仅凭行为无法唯一确定奖励。

练习 5(特征期望):特征 ϕ(s)∈R2\phi(s) \in \mathbb{R}^2,专家的特征期望 μ∗=(3,1)\mu^* = (3, 1),学到的策略 μ=(2.9,1.2)\mu = (2.9, 1.2)。如果真实奖励满足 ∥w∥2≤1\lVert w \rVert_2 \le 1,两者的价值之差最多是多少?

参考答案

∥μ−μ∗∥2=0.01+0.04=0.05≈0.224\lVert \mu - \mu^* \rVert_2 = \sqrt{0.01 + 0.04} = \sqrt{0.05} \approx 0.224。由柯西–施瓦茨不等式,∣J(π)−J(π∗)∣≤0.224|J(\pi) - J(\pi^*)| \le 0.224。

练习 6(软价值迭代):某状态有两个动作,Q(s,a1)=3Q(s, a_1) = 3,Q(s,a2)=1Q(s, a_2) = 1。计算软价值 V(s)=log⁡(e3+e1)V(s) = \log(e^3 + e^1) 和最大熵策略。与普通的 max⁡\max 相比如何?如果 Q(s,a2)=3Q(s, a_2) = 3 呢?

参考答案

V=log⁡(e3+e)=3+log⁡(1+e−2)≈3.127V = \log(e^3 + e) = 3 + \log(1 + e^{-2}) \approx 3.127,略大于 max⁡=3\max = 3。π(a1)=e3/(e3+e)≈0.881\pi(a_1) = e^3 / (e^3 + e) \approx 0.881,π(a2)≈0.119\pi(a_2) \approx 0.119。 若 Q(s,a2)=3Q(s, a_2) = 3:V=3+log⁡2≈3.693V = 3 + \log 2 \approx 3.693,两个动作各 0.5。“软最大值”在两个动作一样好时比 max 大 log⁡2\log 2,体现了”有两条路可走”。

练习 7(动手)★:在 03_maxent_irl.py 中把示范数量从 100 改成 10。恢复的权重有什么变化?迁移到新地图的效果还好吗?

提示

数据少时,特征计数的估计噪声大,恢复的权重会偏离得更多——尤其是”水”这个专家很少接触的特征。10 条示范很可能一次都没下水(概率 0.984410≈0.850.9844^{10} \approx 0.85;默认种子下的前 10 条正是如此),这时水的极大似然解不存在(5.4 节第 4 点),300 轮时停下的值只反映”跑了多久”。只要权重的符号和相对大小大致正确,规划出的策略往往仍然不错。可以观察:权重偏离多少时,新地图上的策略开始出错?

练习 8(思考题):大语言模型的”监督微调(SFT)“本质上是行为克隆。根据本讲的分析,SFT 可能出现什么问题?RLHF(下一讲)的哪些设计可以看作是在缓解这些问题?

参考答案

SFT 只在人类写的回答(专家分布)上训练,模型生成时一旦偏离了”人类会写的样子”(比如开头就犯了错),后面可能越写越偏——这就是复合误差(在文本生成中也叫”曝光偏差 exposure bias”)。RLHF 让模型在自己生成的回答上获得反馈(人类或奖励模型对模型自己的输出打分),这和 DAgger”在学习者自己的分布上收集标签”的思想是一致的。


10. 延伸阅读

  • CS234 Spring 2024 Lecture 8 录像与课件。
  • Pomerleau (1989),ALVINN: An Autonomous Land Vehicle in a Neural Network:最早的行为克隆自动驾驶。
  • Ross & Bagnell (2010),Efficient Reductions for Imitation Learning:复合误差的分析。
  • Ross, Gordon & Bagnell (2011),A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning:DAgger。
  • Laskey et al. (2017),DART: Noise Injection for Robust Imitation Learning。
  • Ng & Russell (2000),Algorithms for Inverse Reinforcement Learning;Abbeel & Ng (2004),Apprenticeship Learning via Inverse Reinforcement Learning。
  • Ng, Harada & Russell (1999),Policy Invariance under Reward Transformations:势函数塑形。
  • Ziebart et al. (2008),Maximum Entropy Inverse Reinforcement Learning。
  • Ho & Ermon (2016),Generative Adversarial Imitation Learning。

11. 下一讲预告

模仿学习要求专家示范怎么做。但有些事情人类很难示范、却很容易评判:写一首好诗很难,但读两首诗说出”哪首更好”很容易;写出一段完美的回答很难,但比较两段回答的好坏很容易。

下一讲讨论从人类偏好中学习——这正是 ChatGPT 等大语言模型对齐的核心技术:

  • Bradley–Terry 模型:如何把”A 比 B 好”变成一个可以学习的奖励;
  • RLHF:监督微调 → 奖励模型 → 带 KL 惩罚的 PPO;
  • 奖励过度优化:为什么奖励模型的分数越来越高,真实质量反而下降;
  • DPO:一个优美的推导,跳过奖励模型和 RL,直接用偏好数据优化策略。

下一讲之前,建议你:跑通 code/lecture08/ 下的 3 个脚本,完成练习 2、4、6,并思考练习 8。

← 返回课程目录