Blog · 2026-09-28

从 Behavior Cloning 到 DAgger,再到 Offline RL:监督、分布与价值

BC、DAgger 和 Offline RL 都是用离线轨迹学一个从 observation 到 action 的映射,它们解决的到底是不是同一个问题?

原始问题

在具身智能的训练 pipeline 里,Behavior Cloning (BC)、DAgger (Dataset Aggregation) 和 Offline RL (Offline Reinforcement Learning,离线强化学习) 经常出现在相邻的位置:都有离线轨迹、 都在做 policy learning,最后都是从 observation 输出 action。它们的 loss 甚至可以写得几乎一样。

于是很容易得到一个错误印象:这三者只是同一件事的三种实现。

但它们解决的不是同一个问题。差别不在 loss 的形状,而在两个更前置的问题上:

  1. 训练时看到的 state 分布从哪里来?
  2. 什么信号告诉 policy 某个 action 是好的?

把这两个问题填进去,三种方法的定位立刻分开:

Behavior Cloning
    ↓  state 来自专家,监督来自专家动作
学习「专家做了什么」
 
DAgger
    ↓  state 来自 learner 自己,监督仍来自专家动作
学习「我跑偏之后,专家会怎么办」
 
Offline RL
    ↓  state 来自固定数据集,监督来自 reward 推出的长期价值
学习「数据里哪些行为长期更好」

Behavior Cloning:把策略学习压成监督学习

设策略为 πθ(a∣s)\pi_\theta(a\mid s),专家示教数据为:

D={(si,aiE)}D=\{(s_i,a_i^E)\}

BC 直接把 policy learning 当成 supervised learning:

LBC=−E(s,a)∼Dlog⁡πθ(a∣s)\mathcal L_{\text{BC}} =-\mathbb E_{(s,a)\sim D}\log\pi_\theta(a\mid s)

它的 mental model 只有一行:

专家在状态 s 做了动作 a
        ↓
那么我在状态 s 也应该做 a

因此 BC 真正使用的监督关系是 s→aEs\rightarrow a^E。它不需要 reward,也不需要显式建模环境 dynamics —— 这既是它最容易上手的原因,也是它局限的来源。

BC 的真正问题不是拟合误差,而是 state distribution shift

训练时,BC 看到的状态来自专家轨迹:

s∼dπEs\sim d_{\pi_E}

但部署时,状态是 learner 自己走出来的:

s∼dπθs\sim d_{\pi_\theta}

只要 policy 有一点误差,这两个分布就会分叉:

专家轨迹:  A → B → C → D
 
BC rollout: A → B' → ?

B′B' 可能从来没有出现在示教数据里。于是误差不是停留在原地,而是自我放大:

小的 action error
    ↓
进入训练集未覆盖的状态
    ↓
policy 在陌生状态下犯更大的错
    ↓
进一步偏离专家轨迹
    ↓
compounding error

写成一行,BC 的核心局限就是:

dπE(s)≠dπθ(s)d_{\pi_E}(s)\neq d_{\pi_\theta}(s)

这就是 covariate shift / distribution shift。

关键洞察

BC 的核心问题不是「学不像专家」,而是部署时 policy 会改变自己未来要面对的数据分布。分类模型 预测错一张图片,不会改变下一张图片是什么;机器人动作错一步,会直接改变下一时刻看到的世界。

这也解释了为什么在 sequential decision making 里,单步精度指标经常和实际成功率脱节:单步误差 被时间放大,而放大的倍率由分布偏移决定,不由 loss 数值决定。

DAgger:把训练分布拉回 learner 真正会访问的状态

DAgger 针对的就是这个分布问题。它的关键不是换一个更强的 supervised loss,而是改变 数据采集方式:

用 expert data 训练 π₁
    ↓
让 π₁ 自己 rollout
    ↓
收集 π₁ 实际访问到的状态
    ↓
让 expert 在这些状态上重新标注正确动作
    ↓
并入 dataset,训练 π₂
    ↓
继续 rollout(循环)

形式上,state 换成了 learner 自己的分布:

s∼dπθs\sim d_{\pi_\theta}

而 action label 仍然来自专家:

aE=πE(s)a^E=\pi_E(s)

所以 DAgger 训练的是 (s∼dπθ, aE)(s\sim d_{\pi_\theta},\ a^E),BC 训练的是 (s∼dπE, aE)(s\sim d_{\pi_E},\ a^E)。两者的损失函数可以完全相同,真正不同的是采样分布。

为什么 DAgger 可以理解成「纠错数据」

以抓杯子为例。专家示教里通常只有一条干净的主线:

接近杯子 → 对准 → 抓住 → 抬起

但 learner rollout 时会出现另一类状态:

接近杯子 → 手腕偏了 → 夹爪碰歪杯子 → 杯子开始滑

BC 没见过这种状态,于是只能外推。DAgger 会在这里向专家提问:

已经滑成这样了,现在应该怎么办?

于是数据集里第一次出现了 recovery behavior。模型学到的不再只是「怎么正确执行任务」,还包括 「如果我已经犯错,怎么把局面拉回来」。

关键洞察

DAgger 的核心不是「采更多专家数据」,而是让专家专门覆盖 learner 自己暴露出来的盲区。因此 human intervention、corrective demonstration、failure recovery、online correction 这些 具身系统里的常见做法,本质上都带有 DAgger 的结构。

这一点和数据采集那篇文章的结论是同一件事的两面: 扩大状态覆盖之所以比重复采集 nominal success 更值钱,是因为它在缩小 dπEd_{\pi_E} 和 dπθd_{\pi_\theta} 之间的缺口;而 DAgger 只是把「该覆盖哪些状态」这个问题交给 learner 自己回答。

从 DAgger 到 Offline RL:问题本身换了

到这里,BC 和 DAgger 还共享一个假设:

expert action 本身就是标准答案。

也就是说 aEa^E 天然被认为是正确的,学习的任务只是把它拟合出来。

Offline RL 换掉了这个假设。它不再问「数据里的专家当时做了什么」,而是问:

数据里的这些行为中,哪些最终带来了更高的长期回报?

对应地,数据集里多了两项:

D={(st,at,rt,st+1)}D=\{(s_t,a_t,r_t,s_{t+1})\}

reward rtr_t 和后继状态 st+1s_{t+1} 一出现,监督就不再需要「谁是专家」这个前提了。

Reward、Return 与 Value

reward rtr_t 是单步反馈,return 是从当前时刻起的折扣累计:

Gt=rt+γrt+1+γ2rt+2+⋯G_t=r_t+\gamma r_{t+1}+\gamma^2r_{t+2}+\cdots

具身任务里的 reward 往往极度稀疏:

接近杯子     r = 0
对准杯子     r = 0
抓住杯子     r = 0
放入目标盒   r = 1

前几步 reward 都是 0,但它们的 return 并不为 0:G0≈γ3G_0\approx\gamma^3。这就是 RL 和单步监督 最根本的差别 —— 它优化的是长期结果,不是即时反馈。

把 return 对 policy 取期望,就得到 value:

Vπ(s)=Eπ[Gt∣st=s]V^\pi(s)=\mathbb E_\pi[G_t\mid s_t=s] Qπ(s,a)=Eπ[Gt∣st=s,at=a]Q^\pi(s,a)=\mathbb E_\pi[G_t\mid s_t=s,a_t=a]

两者的分工很清楚:

V(s)     这个状态整体值多少
Q(s,a)   在这个状态下采取这个具体动作值多少

Advantage:这个动作比当前平均水平好多少

Aπ(s,a)=Qπ(s,a)−Vπ(s)A^\pi(s,a)=Q^\pi(s,a)-V^\pi(s)

举例:V(s)=5V(s)=5,三个动作 Q(s,a1)=8Q(s,a_1)=8、Q(s,a2)=5Q(s,a_2)=5、Q(s,a3)=2Q(s,a_3)=2,于是

A(s,a1)=3,A(s,a2)=0,A(s,a3)=−3A(s,a_1)=3,\qquad A(s,a_2)=0,\qquad A(s,a_3)=-3

含义是:a1a_1 比当前 policy 的平均水平更好,a2a_2 差不多,a3a_3 更差。

这里有一个常见误读需要挑明:advantage 不是时间方向上的差分 V(st+1)−V(st)V(s_{t+1})-V(s_t),而是同一状态内部 action value 相对 state baseline 的差值 Q(s,a)−V(s)Q(s,a)-V(s)。前者比较的是两个时刻,后者比较的是同一时刻的不同选择 —— 只有后者才能回答 「这个动作该不该被强化」。

同一份数据,BC 和 Offline RL 会学出完全不同的东西

这是理解两者差别最关键的一步。假设数据完全相同:D={(s,a,r,s′)}D=\{(s,a,r,s')\}。

BC 可以直接丢掉 reward,只用 {(s,a)}\{(s,a)\} 优化 −log⁡π(a∣s)-\log\pi(a\mid s)。它的逻辑是:

数据里做过这个 action,所以我也学。

Offline RL 会用上 rr 和 s′s' 去估计 Q(s,a)Q(s,a)、V(s)V(s)、A(s,a)A(s,a),然后追问:

数据里虽然做过这个 action,但它究竟是好行为还是坏行为?

于是在同一个状态下,如果 a1a_1 最后失败、a2a_2 最后成功:

BC 看到的:         a₁ 出现过,a₂ 也出现过 → 都拟合
 
Offline RL 看到的: Q(s,a₂) > Q(s,a₁)
                    → 提高 π(a₂|s),降低 π(a₁|s)

从「频率监督」到「价值监督」

这两种逻辑可以压成一对 mental model:

BC: frequency is supervision\boxed{\text{BC}:\ \text{frequency is supervision}} Offline RL: value is supervision\boxed{\text{Offline RL}:\ \text{value is supervision}}

在 BC 里,一个动作在数据中出现得越多,policy 就越倾向复制它;在 Offline RL 里,即使某个动作 出现次数更少,只要它对应更高的长期 return,它也应该获得更高权重。

关键洞察

BC 拟合的是行为频率,Offline RL 拟合的是行为价值。因此 Offline RL 不只是 imitation,它做的是 policy improvement —— 允许学出的策略比数据里的行为策略更好。

为什么有些 Offline RL 看起来又很像 BC

这里有一个容易困惑的地方:不少 offline RL 方法最终的 policy loss 长这样:

Lπ=−E(s,a)∼D[w(s,a)log⁡π(a∣s)]\mathcal L_\pi=-\mathbb E_{(s,a)\sim D}\left[w(s,a)\log\pi(a\mid s)\right]

这几乎就是 weighted behavior cloning。区别只在权重 w(s,a)w(s,a) 不是人为指定的,而可能来自 advantage,例如 advantage-weighted regression 一类做法:

w(s,a)=exp⁡(A(s,a)β)w(s,a)=\exp\left(\frac{A(s,a)}{\beta}\right)

整条链是:

offline trajectory
    ↓
reward
    ↓
学习 Q / V
    ↓
计算 advantage
    ↓
判断 dataset action 的相对优劣
    ↓
高 advantage 多模仿,低 advantage 少模仿

所以最后一步虽然是 supervised regression,RL 的信息已经被编码进 sample weight 里了。判断一个 方法是不是在做 imitation,不能只看 loss 的形状,要看权重是谁给的。

Offline RL 最难的问题:OOD action

既然已经有了 Q(s,a)Q(s,a),一个自然的想法是直接取

π(s)=arg⁡max⁡aQ(s,a)\pi(s)=\arg\max_a Q(s,a)

但在 offline setting 下这很危险。假设数据里的动作只覆盖 a∈[0.1,0.3]a\in[0.1,0.3],而函数逼近器在从未 见过的位置给出 Q(s,1.5)=100Q(s,1.5)=100。这不是因为 1.51.5 真的好,而是因为:

数据集根本没有告诉模型那里会发生什么。

于是 policy 开始 exploit Q function 的 extrapolation error —— 这类动作叫 OOD (Out-Of-Distribution) action。它和 online RL 的区别在于:online 时环境会立刻用真实 reward 否定这个幻想,offline 时没有任何东西能否定它。

因此 Offline RL 的核心矛盾是:

我希望 policy improvement
    ↓
所以必须偏离 behavior policy
 
但
 
dataset 之外没有真实环境反馈
    ↓
偏离太远,Q estimation 就不可信

几乎所有 offline RL 算法都在这条张力上做取舍:

maximize value + stay close to dataset support\boxed{\text{maximize value}\ +\ \text{stay close to dataset support}}

三者的对照

BC、DAgger 与 Offline RL 在 state 分布、监督信号和 policy improvement 上的对比同一条 pipeline 上的三种方法,差别在哪三行loss 可以写得几乎一样;真正分开它们的是 state 分布、监督来源和是否允许超越数据Behavior CloningSTATE 分布专家轨迹 d_πE(s)监督来自专家动作 a^EPOLICY IMPROVEMENT无,只拟合 π_E→DAggerSTATE 分布learner rollout d_πθ(s)监督来自专家重新标注 a^EPOLICY IMPROVEMENT无,仍是 imitation→Offline RLSTATE 分布固定数据集 d_β(s)监督来自reward → Q / V / APOLICY IMPROVEMENT有,但受 support 约束DAgger 换掉了 state 分布,Offline RL 换掉了监督信号 —— 这是两次不同性质的改动
Behavior CloningDAggerOffline RL
数据(s,aE)(s,a^E)s∼dπθ, a=πE(s)s\sim d_{\pi_\theta},\ a=\pi_E(s)(s,a,r,s′)(s,a,r,s')
回答的问题专家在这个状态会做什么?learner 跑到这些状态时,专家会怎么纠正?数据里哪些行为带来更高长期回报?
训练目标π(a∣s)≈πE(a∣s)\pi(a\mid s)\approx\pi_E(a\mid s)同上,但训练分布改变max⁡πJ(π)\max_\pi J(\pi),且约束在 dataset support 内
需要 reward否否是
需要在线 rollout否是(还需要可查询的专家)否
主要失效模式compounding error专家标注成本 / 干预成本OOD action 上的 extrapolation error

值得注意的是最后两行:DAgger 的代价是必须能在训练循环里反复请求专家,Offline RL 的代价是必须 处理一个没有环境反馈的价值估计问题。三种方法在工程上的门槛完全不同,这往往比算法优劣更决定 选择。

监督信号一直在变强

换一个角度,这三者的演化不是三个独立算法类别,而是 supervision 逐步变强的过程:

BC        监督 = a^E
          「专家告诉你答案是什么」
            ↓
          问题:部署后我会进入专家没去过的状态
            ↓
DAgger    监督仍然 = a^E,但主动改变 p(s)
          「让专家在你真正会犯错的位置告诉你答案」
            ↓
          问题:数据里的行为并不同样好,为什么要照单全收?
            ↓
Offline   监督 = r → G → Q / V / A
RL        「没人直接给标准答案,用长期结果判断哪些行为值得强化」

从 imitation 到 reinforcement 的转变就在最后一步:监督不再是一个被给定的目标动作,而是一个 需要自己估计出来的量。

在具身系统中,三者是组合关系

真实机器人系统很少只用其中一种。一条自然的 pipeline 是:

Expert Demonstration
    ↓
Behavior Cloning  → 得到一个基本可用的 policy
    ↓
Autonomous Rollout
    ↓
Human Intervention / Correction
    ↓
DAgger-style data aggregation
    ↓
积累 success / failure / correction trajectory
    ↓
Offline RL  → 用 reward 做进一步 policy improvement

每个阶段解决的是不同问题:

BC          解决 cold start
DAgger      解决 learner-induced distribution shift
Offline RL  利用混合质量数据做 value-based improvement

注意第三阶段的前提由第二阶段提供:只有当数据里同时存在成功、失败和纠错轨迹时,reward 才有区分 度,value 才学得出来。纯专家数据上做 Offline RL,advantage 会接近处处为零 —— 它会退化成 BC。 这也是为什么这三者不是替代关系。

回到原始问题

以后读一篇具身学习论文,不必先纠结作者把它叫 IL (Imitation Learning)、RL 还是 Offline RL。 先问三个问题:

  1. state 从哪里来? expert rollout、learner rollout,还是固定的 offline dataset?
  2. action 为什么被认为是好的? 因为专家做了它、因为专家在 learner state 上重标了它,还是 因为它有更高的 return / Q / advantage?
  3. 训练是否在做 policy improvement? 如果目标只是 π≈πbehavior\pi\approx\pi_{\text{behavior}},那 更接近 imitation;如果试图依据 value 偏向比数据更优的动作,就进入了 reinforcement learning 的范畴。

三句话的版本:

BC: 复制 expert behavior\boxed{\text{BC}:\ \text{复制 expert behavior}} DAgger: 在 learner distribution 上复制 expert behavior\boxed{\text{DAgger}:\ \text{在 learner distribution 上复制 expert behavior}} Offline RL: 从固定数据中用 value 做 policy improvement\boxed{\text{Offline RL}:\ \text{从固定数据中用 value 做 policy improvement}}

它们对应着三个逐步暴露出来的问题:

我怎么先学会做这个任务?            → BC
我执行后会跑到训练集没覆盖的位置?  → DAgger
数据里有成功也有失败,学哪些?      → Offline RL

这条链串起来之后可以看到:从 BC 到 DAgger 再到 Offline RL,本质上是在不断回答同一组问题 ——数据从哪里来、监督从哪里来,以及 policy 是否被允许超越数据本身的行为分布。

下一个前置概念

这个回答暴露出的下一个关键前置概念是 Bellman Backup。

如果理解了 Bellman backup 如何在没有环境交互的情况下、只靠 (s,a,r,s′)(s,a,r,s') 自举出 QQ,就能看清 Offline RL 里的 extrapolation error 到底从哪一步进来:Q(s′,a′)Q(s',a') 中的 a′a' 一旦落在 dataset support 之外,误差就会沿着 backup 一轮轮放大回 Q(s,a)Q(s,a) —— 这正是各种 conservative 约束真正 要挡住的东西。