Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions blog/active-learning/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ <h2 id="section-5">3. KL 散度</h2>
&amp;=H[p,q]-H[p].
\end{aligned}</div>
<p>KL 散度非负,两个分布一致时为零。它一般不对称,因此不是通常意义上的距离。如果某个结果在 <span class="math">p</span> 下概率非零、在 <span class="math">q</span> 下概率为零,KL 散度会趋于无穷大。</p>
<p>这个工具会在 BALD 中再次出现:我们不仅关心预测是否模糊,也关心不同模型给出的预测有多不同。</p>
<p>这个工具会在 BALD 中再次出现:我们不仅关心预测是否模糊,也关心不同模型给出的预测有多不同。后续模仿学习笔记还会用 KL 比较专家与学习策略的动作分布,见 <a href="/blog/behavior-cloning-plid/">Behavior Cloning 与 PLID</a>。</p>
<h2 id="section-6">4. Query-by-Committee</h2>
<p>单个模型的预测可能不够可靠。Query-by-Committee(QBC)使用一个包含 <span class="math">C</span> 个模型的委员会,让它们分别预测同一个候选样本:</p>
<div class="math math-block">p(y\mid x,\theta_{1,t}),\ldots,p(y\mid x,\theta_{C,t}).</div>
Expand Down Expand Up @@ -150,7 +150,7 @@ <h2 id="section-12">6. 两类不确定性</h2>
<p>实际使用还需要留意三点。首先,BALD 的质量取决于后验或其近似是否可信;少数偏差相似的模型,并不一定能代表完整的参数不确定性。其次,信息增益不等于测试误差下降,三种方法都不保证选中带来最大性能提升的样本。最后,如果一次选择多个样本,直接取单点分数最高的若干个,可能获得大量重复信息;批量选样还需要考虑样本之间的关系。</p>
<p>这三种方法关注的对象不同:Uncertainty Sampling 看当前预测有多模糊,QBC 看委员会成员有多不一致,BALD 看标签预计能为参数带来多少信息。理解这个差别,比单独记住某个采集公式更有助于判断方法适合什么场景。</p>
<h2 id="section-13">参考资料</h2>
<ul><li><a href="https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf">课程讲义</a></li><li><a href="https://arxiv.org/abs/1112.5745">BALD 论文</a></li></ul></div></article><aside class="desktop-toc"><div class="toc-title">目录</div><nav class="toc-links" aria-label="文章目录"><a class="toc-level-2" href="#section-1">1. 主动学习循环</a><a class="toc-level-2" href="#section-2">2. 熵</a><a class="toc-level-3" href="#section-3">2.1 信息量与熵</a><a class="toc-level-3" href="#section-4">2.2 不确定性采样</a><a class="toc-level-2" href="#section-5">3. KL 散度</a><a class="toc-level-2" href="#section-6">4. Query-by-Committee</a><a class="toc-level-2" href="#section-7">5. BALD</a><a class="toc-level-3" href="#section-8">5.1 先验与后验</a><a class="toc-level-3" href="#section-9">5.2 条件互信息</a><a class="toc-level-3" href="#section-10">5.3 熵差形式</a><a class="toc-level-3" href="#section-11">5.4 数值示例</a><a class="toc-level-2" href="#section-12">6. 两类不确定性</a><a class="toc-level-2" href="#section-13">参考资料</a></nav></aside></div></main>
<ul><li><a href="https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf">课程讲义</a></li><li><a href="https://arxiv.org/abs/1112.5745">BALD 论文</a></li><li>系列后续:<a href="/blog/behavior-cloning-plid/">Behavior Cloning 与 PLID</a>、<a href="/blog/distribution-matching-gail/">Distribution Matching 与 GAIL</a></li></ul></div></article><aside class="desktop-toc"><div class="toc-title">目录</div><nav class="toc-links" aria-label="文章目录"><a class="toc-level-2" href="#section-1">1. 主动学习循环</a><a class="toc-level-2" href="#section-2">2. 熵</a><a class="toc-level-3" href="#section-3">2.1 信息量与熵</a><a class="toc-level-3" href="#section-4">2.2 不确定性采样</a><a class="toc-level-2" href="#section-5">3. KL 散度</a><a class="toc-level-2" href="#section-6">4. Query-by-Committee</a><a class="toc-level-2" href="#section-7">5. BALD</a><a class="toc-level-3" href="#section-8">5.1 先验与后验</a><a class="toc-level-3" href="#section-9">5.2 条件互信息</a><a class="toc-level-3" href="#section-10">5.3 熵差形式</a><a class="toc-level-3" href="#section-11">5.4 数值示例</a><a class="toc-level-2" href="#section-12">6. 两类不确定性</a><a class="toc-level-2" href="#section-13">参考资料</a></nav></aside></div></main>
<footer class="footer"><span>© 2026 Musicaldg</span><a href="/feed.xml">RSS</a></footer>
</div>
</body>
Expand Down
210 changes: 210 additions & 0 deletions blog/behavior-cloning-plid/index.html

Large diffs are not rendered by default.

215 changes: 215 additions & 0 deletions blog/distribution-matching-gail/index.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion blog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<a class="brand" href="/">Musicaldg</a>
<nav aria-label="主导航"><a href="/blog/" aria-current="page">文章</a><a class="nav-external" href="https://github.com/Musicaldg" aria-label="GitHub 个人主页">GitHub ↗</a></nav>
</header>
<main id="main"><div class="page-intro"><h1>文章</h1></div><section class="post-list"><a class="post-card" href="/blog/active-learning/"><div class="card-meta"><time datetime="2026-09-29">2026-09-29</time><span>约 12 分钟</span></div><h3>Active Learning</h3><p>介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。</p><span class="card-open">阅读全文 <span aria-hidden="true">↗</span></span></a></section></main>
<main id="main"><div class="page-intro"><h1>文章</h1></div><section class="post-list"><a class="post-card" href="/blog/distribution-matching-gail/"><div class="card-meta"><time datetime="2026-11-02">2026-11-02</time><span>约 10 分钟</span></div><h3>Distribution Matching 与 GAIL</h3><p>从轨迹与状态—动作分布匹配出发,说明 Forward KL 为何可能退化为 BC,以及 GAIL 如何用判别器完成分布匹配。</p><span class="card-open">阅读全文 <span aria-hidden="true">↗</span></span></a><a class="post-card" href="/blog/behavior-cloning-plid/"><div class="card-meta"><time datetime="2026-10-20">2026-10-20</time><span>约 10 分钟</span></div><h3>Behavior Cloning 与 PLID</h3><p>说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。</p><span class="card-open">阅读全文 <span aria-hidden="true">↗</span></span></a><a class="post-card" href="/blog/active-learning/"><div class="card-meta"><time datetime="2026-09-29">2026-09-29</time><span>约 12 分钟</span></div><h3>Active Learning</h3><p>介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。</p><span class="card-open">阅读全文 <span aria-hidden="true">↗</span></span></a></section></main>
<footer class="footer"><span>© 2026 Musicaldg</span><a href="/feed.xml">RSS</a></footer>
</div>
</body>
Expand Down
3 changes: 2 additions & 1 deletion content/posts/active-learning.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ $$

KL 散度非负,两个分布一致时为零。它一般不对称,因此不是通常意义上的距离。如果某个结果在 $p$ 下概率非零、在 $q$ 下概率为零,KL 散度会趋于无穷大。

这个工具会在 BALD 中再次出现:我们不仅关心预测是否模糊,也关心不同模型给出的预测有多不同。
这个工具会在 BALD 中再次出现:我们不仅关心预测是否模糊,也关心不同模型给出的预测有多不同。后续模仿学习笔记还会用 KL 比较专家与学习策略的动作分布,见 [Behavior Cloning 与 PLID](/blog/behavior-cloning-plid/)。

## 4. Query-by-Committee

Expand Down Expand Up @@ -278,3 +278,4 @@ $$

- [课程讲义](https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf)
- [BALD 论文](https://arxiv.org/abs/1112.5745)
- 系列后续:[Behavior Cloning 与 PLID](/blog/behavior-cloning-plid/)、[Distribution Matching 与 GAIL](/blog/distribution-matching-gail/)
350 changes: 350 additions & 0 deletions content/posts/behavior-cloning-plid.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,350 @@
---
title: Behavior Cloning 与 PLID
date: 2026-10-20
summary: 说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。
draft: false
---

Behavior Cloning 把专家示范当作监督学习数据,但模型部署后会访问训练时没有覆盖的状态。本文从模仿学习的基本形式化出发,说明 covariate shift 与 compounding errors,并推导 PLID / DAgger 如何通过当前策略 rollout、再由专家补充标签,逐步修正状态分布偏移。

前置知识:概率、条件概率、监督学习损失,以及基本的 Markov Decision Process(MDP)概念。KL 散度的定义见 [Active Learning](/blog/active-learning/#section-5)。

> 模仿学习为什么需要交互式纠错

## 1. 问题设定

假设我们要训练一个机器人完成导航任务。专家已经执行了许多次任务,我们记录下它在每个状态下采取的动作。最直接的做法是把这些记录当作监督学习数据:输入状态,预测专家动作。

这种方法叫做 **Behavior Cloning(行为克隆,BC)**。它的直觉很简单:模型不需要自己发现策略,只需要学习专家已经展示过的行为。

问题在于,模型真正执行任务时,并不会永远停留在专家访问过的状态上。只要模型在某一步出现一个小误差,它就可能进入训练数据中很少出现、甚至从未出现过的状态。

> 模仿学习的困难不只是预测正确动作,而是策略会通过自己的动作改变未来访问的状态分布。

## 2. 形式化

我们用一个 MDP(Markov Decision Process,马尔可夫决策过程)描述环境。设:

- $\mathcal S$:状态空间;
- $\mathcal A$:动作空间;
- $s_t\in\mathcal S$:时间 $t$ 的状态;
- $a_t\in\mathcal A$:时间 $t$ 的动作;
- $P(s_{t+1}\mid s_t,a_t)$:环境转移概率。

专家策略记为:

$$
\pi_E(a\mid s)
$$

它表示专家在状态 $s$ 下选择动作 $a$ 的条件概率。待学习策略记为:

$$
\pi_\theta(a\mid s)
$$

其中 $\theta$ 是模型参数。

所有示范组成数据集:

$$
\mathcal D_E
=
\left\{
(s_n,a_n)
\right\}_{n=1}^{N}
$$

这里还要区分策略和状态访问分布。策略 $\pi(a\mid s)$ 描述给定状态下如何选择动作;$d_\pi^t(s)$ 表示执行策略 $\pi$ 后,在第 $t$ 步处于状态 $s$ 的概率。策略决定动作,动作又影响环境转移,因此策略也会间接决定未来访问哪些状态。

## 3. Behavior Cloning

### 3.1 训练目标

如果动作是离散的,可以使用最大似然或交叉熵损失:

$$
\mathcal L_{\mathrm{BC}}(\theta)
=
-\frac{1}{N}
\sum_{n=1}^{N}
\log \pi_\theta(a_n\mid s_n)
$$

如果动作是连续值,也可以使用均方误差:

$$
\mathcal L_{\mathrm{BC}}(\theta)
=
\frac{1}{N}
\sum_{n=1}^{N}
\left\|
\hat a_\theta(s_n)-a_n
\right\|_2^2
$$

两种损失表达的是同一个基本思想:在示范数据中的状态下,模型应该采取与专家相同或相近的动作。

### 3.2 状态分布

专家示范主要来自专家策略访问过的状态,因此 BC 实际优化的是:

$$
\mathbb E_{s\sim d_{\pi_E}}
\left[
\ell\bigl(\pi_\theta(s),\pi_E(s)\bigr)
\right]
$$

BC 并不是在所有可能状态上学习专家策略,而是在专家访问过的状态分布上拟合专家动作。

## 4. 误差累积

### 4.1 状态偏移

专家执行任务时,状态来自 $s_t\sim d_{\pi_E}^t$;模型执行任务时,状态来自 $s_t\sim d_{\pi_\theta}^t$。一般来说:

$$
d_{\pi_E}^t\neq d_{\pi_\theta}^t
$$

训练时模型看到的是专家状态,部署时模型却会根据自己的动作进入新的状态。这就是 **covariate shift(协变量偏移)** 在序列决策中的表现。

### 4.2 状态递推

状态分布的递推关系为:

$$
d_\pi^{t+1}(s')
=
\sum_{s\in\mathcal S}
d_\pi^t(s)
\sum_{a\in\mathcal A}
\pi(a\mid s)P(s'\mid s,a)
$$

右侧三项分别表示当前状态概率、动作概率和环境转移概率。改变策略不仅会改变当前动作,还会改变之后所有时间步的状态分布。

### 4.3 误差连锁

一次小动作误差可能使模型进入示范数据很少覆盖的状态;在新状态下,模型的预测更不可靠;新的错误又使它进一步偏离专家轨迹。这就是 **compounding errors(误差累积)**。

因此,较低的单步验证误差并不必然意味着较高的任务成功率。

## 5. PLID

### 5.1 核心直觉

PLID 的全称是 **Policy Learning via an Interactive Demonstrator**。它与经典 DAgger 的核心思想一致:不只学习专家走过的正确轨迹,还要让当前策略自己运行;当它进入偏离状态时,请专家告诉它在这些状态下应该采取什么动作。

训练过程如下:

1. 使用专家示范训练初始策略 $\pi_0$;
2. 让 $\pi_0$ 自己与环境交互;
3. 收集模型实际访问的状态;
4. 对这些状态询问专家动作;
5. 将新数据加入原始示范数据;
6. 重新训练策略并重复上述过程。

### 5.2 交互标注

第 $m$ 轮中,模型负责产生状态:

$$
s\sim d_{\pi_m}
$$

专家负责提供动作标签:

$$
a\sim \pi_E(\cdot\mid s)
$$

于是得到新数据集:

$$
\mathcal D_m
=
\left\{
(s_{m,n},a_{m,n})
\right\}_{n=1}^{N}
$$

这里的关键不是让模型模仿自己的动作,而是让模型探索自己会访问的状态,再让专家在这些状态上提供正确标签。

### 5.3 数据聚合

PLID / DAgger 通常保留旧数据:

$$
\mathcal D_{0:m}
=
\bigcup_{i=0}^{m}\mathcal D_i
$$

然后在聚合数据上重新训练:

$$
\theta_{m+1}
=
\arg\min_\theta
\sum_{(s,a)\in\mathcal D_{0:m}}
-
\log\pi_\theta(a\mid s)
$$

保留旧数据的作用是让模型同时学习专家正常执行时访问的状态,以及模型偏离后需要恢复的状态。

## 6. 数学目标

在第 $m$ 轮,理想目标是在模型实际访问的状态上,让学习策略接近专家策略:

$$
\hat\theta_{m+1}
=
\arg\min_\theta
\mathbb E_{s\sim d_{\pi_m}}
\left[
D_{\mathrm{KL}}
\left(
\pi_E(\cdot\mid s)
\|\pi_\theta(\cdot\mid s)
\right)
\right]
$$

根据 [KL 散度](/blog/active-learning/#section-5) 的定义:

$$
D_{\mathrm{KL}}(p\|q)
=
\mathbb E_{x\sim p}
\left[
\log\frac{p(x)}{q(x)}
\right]
$$

代入两个策略:

$$
\begin{aligned}
&D_{\mathrm{KL}}
\left(
\pi_E(\cdot\mid s)
\|\pi_\theta(\cdot\mid s)
\right)\\
&=
\mathbb E_{a\sim\pi_E(\cdot\mid s)}
\left[
\log\pi_E(a\mid s)
-
\log\pi_\theta(a\mid s)
\right]
\end{aligned}
$$

第一项只依赖固定的专家策略,与 $\theta$ 无关。因此,最小化 KL 等价于最大化:

$$
\mathbb E_{\substack{s\sim d_{\pi_m}\\a\sim\pi_E(\cdot\mid s)}}
\left[
\log\pi_\theta(a\mid s)
\right]
$$

换成最小化形式,就是:

$$
-\mathbb E_{\substack{s\sim d_{\pi_m}\\a\sim\pi_E(\cdot\mid s)}}
\left[
\log\pi_\theta(a\mid s)
\right]
$$

这仍然是 BC 的负对数似然损失。真正发生变化的是期望所在的状态分布:

- BC:主要在 $s\sim d_{\pi_E}$ 上学习;
- PLID:不断加入 $s\sim d_{\pi_m}$ 的模型访问状态。

因此可以把 PLID 概括为:

> 不改变“如何拟合专家动作”的基本损失,而是改变“在哪些状态上获得专家标签”。

## 7. 训练流程

一个更接近工程实践的训练闭环是:

```
专家示范
↓
数据清洗与时间对齐
↓
初始化 Behavior Cloning
↓
当前策略 rollout
↓
记录失败状态与恢复状态
↓
专家接管或提供 correction
↓
数据聚合与重新训练
↓
离线评估 + 在线 rollout
```

理论中的“询问专家”在真实系统中可能对应:

- 人类实时接管;
- 对失败片段进行离线标注;
- 规则系统提供动作 correction;
- 更强模型生成辅助标签;
- 从日志中筛选高风险状态。

## 8. 适用条件

### 8.1 专家反馈成本

PLID 需要专家为模型新访问的状态提供标签。如果模型经常进入危险或复杂状态,标注成本可能很高。

### 8.2 偏离状态

专家不仅要能展示正常轨迹,还要能回答:模型已经犯错后,现在应该如何恢复。如果专家只提供理想轨迹,PLID 的优势会受到限制。

### 8.3 状态信息

如果当前观测无法判断正确动作,问题可能不是数据覆盖不足,而是部分可观测性、历史信息缺失或状态表示不充分。

### 8.4 评估指标

动作预测准确率只衡量单步模仿误差。实际部署还需要评估:

- 任务成功率;
- 长时间 rollout 稳定性;
- 偏离后的恢复能力;
- 高风险状态下的安全性;
- 专家接管率与数据回流效率。

## 9. 总结

Behavior Cloning 把专家示范转化为监督学习问题,但它默认训练数据覆盖了模型执行时会遇到的状态。这个假设在序列决策中通常不成立。

模型的一次小动作误差可能改变未来状态分布,并造成连续的误差累积。PLID / DAgger 的解决方案是让当前策略自己探索,再由专家在模型实际访问的状态上补充动作标签,最后通过数据聚合重新训练策略。

从数学上看,PLID 仍然使用类似 BC 的动作损失,但把训练状态分布从专家访问分布扩展到了模型访问分布:

$$
\text{BC:}\quad s\sim d_{\pi_E}
$$

$$
\text{PLID:}\quad s\sim d_{\pi_m}
$$

这也是从 Behavior Cloning 走向 Distribution Matching 的起点:当专家持续标注成本过高时,下一步是不再逐个纠正动作,而是直接让模型产生与专家相似的行为分布。下一篇笔记讨论 [Distribution Matching 与 GAIL](/blog/distribution-matching-gail/)。

## 参考资料

- [课程讲义](https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf)
- 系列上一篇:[Active Learning](/blog/active-learning/)
- 系列下一篇:[Distribution Matching 与 GAIL](/blog/distribution-matching-gail/)

Loading
Loading