原始问题
在具身智能的训练 pipeline 里,Behavior Cloning (BC)、DAgger (Dataset Aggregation) 和 Offline RL (Offline Reinforcement Learning,离线强化学习) 经常出现在相邻的位置:都有离线轨迹、 都在做 policy learning,最后都是从 observation 输出 action。它们的 loss 甚至可以写得几乎一样。
于是很容易得到一个错误印象:这三者只是同一件事的三种实现。
但它们解决的不是同一个问题。差别不在 loss 的形状,而在两个更前置的问题上:
- 训练时看到的 state 分布从哪里来?
- 什么信号告诉 policy 某个 action 是好的?
把这两个问题填进去,三种方法的定位立刻分开:
Behavior Cloning
↓ state 来自专家,监督来自专家动作
学习「专家做了什么」
DAgger
↓ state 来自 learner 自己,监督仍来自专家动作
学习「我跑偏之后,专家会怎么办」
Offline RL
↓ state 来自固定数据集,监督来自 reward 推出的长期价值
学习「数据里哪些行为长期更好」Behavior Cloning:把策略学习压成监督学习
设策略为 ,专家示教数据为:
BC 直接把 policy learning 当成 supervised learning:
它的 mental model 只有一行:
专家在状态 s 做了动作 a
↓
那么我在状态 s 也应该做 a因此 BC 真正使用的监督关系是 。它不需要 reward,也不需要显式建模环境 dynamics —— 这既是它最容易上手的原因,也是它局限的来源。
BC 的真正问题不是拟合误差,而是 state distribution shift
训练时,BC 看到的状态来自专家轨迹:
但部署时,状态是 learner 自己走出来的:
只要 policy 有一点误差,这两个分布就会分叉:
专家轨迹: A → B → C → D
BC rollout: A → B' → ?可能从来没有出现在示教数据里。于是误差不是停留在原地,而是自我放大:
小的 action error
↓
进入训练集未覆盖的状态
↓
policy 在陌生状态下犯更大的错
↓
进一步偏离专家轨迹
↓
compounding error写成一行,BC 的核心局限就是:
这就是 covariate shift / distribution shift。
BC 的核心问题不是「学不像专家」,而是部署时 policy 会改变自己未来要面对的数据分布。分类模型 预测错一张图片,不会改变下一张图片是什么;机器人动作错一步,会直接改变下一时刻看到的世界。
这也解释了为什么在 sequential decision making 里,单步精度指标经常和实际成功率脱节:单步误差 被时间放大,而放大的倍率由分布偏移决定,不由 loss 数值决定。
DAgger:把训练分布拉回 learner 真正会访问的状态
DAgger 针对的就是这个分布问题。它的关键不是换一个更强的 supervised loss,而是改变 数据采集方式:
用 expert data 训练 π₁
↓
让 π₁ 自己 rollout
↓
收集 π₁ 实际访问到的状态
↓
让 expert 在这些状态上重新标注正确动作
↓
并入 dataset,训练 π₂
↓
继续 rollout(循环)形式上,state 换成了 learner 自己的分布:
而 action label 仍然来自专家:
所以 DAgger 训练的是 ,BC 训练的是 。两者的损失函数可以完全相同,真正不同的是采样分布。
为什么 DAgger 可以理解成「纠错数据」
以抓杯子为例。专家示教里通常只有一条干净的主线:
接近杯子 → 对准 → 抓住 → 抬起但 learner rollout 时会出现另一类状态:
接近杯子 → 手腕偏了 → 夹爪碰歪杯子 → 杯子开始滑BC 没见过这种状态,于是只能外推。DAgger 会在这里向专家提问:
已经滑成这样了,现在应该怎么办?
于是数据集里第一次出现了 recovery behavior。模型学到的不再只是「怎么正确执行任务」,还包括 「如果我已经犯错,怎么把局面拉回来」。
DAgger 的核心不是「采更多专家数据」,而是让专家专门覆盖 learner 自己暴露出来的盲区。因此 human intervention、corrective demonstration、failure recovery、online correction 这些 具身系统里的常见做法,本质上都带有 DAgger 的结构。
这一点和数据采集那篇文章的结论是同一件事的两面: 扩大状态覆盖之所以比重复采集 nominal success 更值钱,是因为它在缩小 和 之间的缺口;而 DAgger 只是把「该覆盖哪些状态」这个问题交给 learner 自己回答。
从 DAgger 到 Offline RL:问题本身换了
到这里,BC 和 DAgger 还共享一个假设:
expert action 本身就是标准答案。
也就是说 天然被认为是正确的,学习的任务只是把它拟合出来。
Offline RL 换掉了这个假设。它不再问「数据里的专家当时做了什么」,而是问:
数据里的这些行为中,哪些最终带来了更高的长期回报?
对应地,数据集里多了两项:
reward 和后继状态 一出现,监督就不再需要「谁是专家」这个前提了。
Reward、Return 与 Value
reward 是单步反馈,return 是从当前时刻起的折扣累计:
具身任务里的 reward 往往极度稀疏:
接近杯子 r = 0
对准杯子 r = 0
抓住杯子 r = 0
放入目标盒 r = 1前几步 reward 都是 0,但它们的 return 并不为 0:。这就是 RL 和单步监督 最根本的差别 —— 它优化的是长期结果,不是即时反馈。
把 return 对 policy 取期望,就得到 value:
两者的分工很清楚:
V(s) 这个状态整体值多少
Q(s,a) 在这个状态下采取这个具体动作值多少Advantage:这个动作比当前平均水平好多少
举例:,三个动作 、、,于是
含义是: 比当前 policy 的平均水平更好, 差不多, 更差。
这里有一个常见误读需要挑明:advantage 不是时间方向上的差分 ,而是同一状态内部 action value 相对 state baseline 的差值 。前者比较的是两个时刻,后者比较的是同一时刻的不同选择 —— 只有后者才能回答 「这个动作该不该被强化」。
同一份数据,BC 和 Offline RL 会学出完全不同的东西
这是理解两者差别最关键的一步。假设数据完全相同:。
BC 可以直接丢掉 reward,只用 优化 。它的逻辑是:
数据里做过这个 action,所以我也学。
Offline RL 会用上 和 去估计 、、,然后追问:
数据里虽然做过这个 action,但它究竟是好行为还是坏行为?
于是在同一个状态下,如果 最后失败、 最后成功:
BC 看到的: a₁ 出现过,a₂ 也出现过 → 都拟合
Offline RL 看到的: Q(s,a₂) > Q(s,a₁)
→ 提高 π(a₂|s),降低 π(a₁|s)从「频率监督」到「价值监督」
这两种逻辑可以压成一对 mental model:
在 BC 里,一个动作在数据中出现得越多,policy 就越倾向复制它;在 Offline RL 里,即使某个动作 出现次数更少,只要它对应更高的长期 return,它也应该获得更高权重。
BC 拟合的是行为频率,Offline RL 拟合的是行为价值。因此 Offline RL 不只是 imitation,它做的是 policy improvement —— 允许学出的策略比数据里的行为策略更好。
为什么有些 Offline RL 看起来又很像 BC
这里有一个容易困惑的地方:不少 offline RL 方法最终的 policy loss 长这样:
这几乎就是 weighted behavior cloning。区别只在权重 不是人为指定的,而可能来自 advantage,例如 advantage-weighted regression 一类做法:
整条链是:
offline trajectory
↓
reward
↓
学习 Q / V
↓
计算 advantage
↓
判断 dataset action 的相对优劣
↓
高 advantage 多模仿,低 advantage 少模仿所以最后一步虽然是 supervised regression,RL 的信息已经被编码进 sample weight 里了。判断一个 方法是不是在做 imitation,不能只看 loss 的形状,要看权重是谁给的。
Offline RL 最难的问题:OOD action
既然已经有了 ,一个自然的想法是直接取
但在 offline setting 下这很危险。假设数据里的动作只覆盖 ,而函数逼近器在从未 见过的位置给出 。这不是因为 真的好,而是因为:
数据集根本没有告诉模型那里会发生什么。
于是 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 算法都在这条张力上做取舍:
三者的对照
| Behavior Cloning | DAgger | Offline RL | |
|---|---|---|---|
| 数据 | |||
| 回答的问题 | 专家在这个状态会做什么? | learner 跑到这些状态时,专家会怎么纠正? | 数据里哪些行为带来更高长期回报? |
| 训练目标 | 同上,但训练分布改变 | ,且约束在 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。 先问三个问题:
- state 从哪里来? expert rollout、learner rollout,还是固定的 offline dataset?
- action 为什么被认为是好的? 因为专家做了它、因为专家在 learner state 上重标了它,还是 因为它有更高的 return / Q / advantage?
- 训练是否在做 policy improvement? 如果目标只是 ,那 更接近 imitation;如果试图依据 value 偏向比数据更优的动作,就进入了 reinforcement learning 的范畴。
三句话的版本:
它们对应着三个逐步暴露出来的问题:
我怎么先学会做这个任务? → BC
我执行后会跑到训练集没覆盖的位置? → DAgger
数据里有成功也有失败,学哪些? → Offline RL这条链串起来之后可以看到:从 BC 到 DAgger 再到 Offline RL,本质上是在不断回答同一组问题 ——数据从哪里来、监督从哪里来,以及 policy 是否被允许超越数据本身的行为分布。
下一个前置概念
这个回答暴露出的下一个关键前置概念是 Bellman Backup。
如果理解了 Bellman backup 如何在没有环境交互的情况下、只靠 自举出 ,就能看清 Offline RL 里的 extrapolation error 到底从哪一步进来: 中的 一旦落在 dataset support 之外,误差就会沿着 backup 一轮轮放大回 —— 这正是各种 conservative 约束真正 要挡住的东西。