

Lecture 3 — Imitation Learning Notes
模仿学习:从行为克隆到隐变量规划,处理分布偏移与多模态行为
Part 1: 行为克隆(Behavior Cloning)#
1.1 基本设定#
模仿学习的出发点:假设我们有一组专家示范轨迹——人类驾驶或遥操作机械臂成功完成目标的状态-动作序列。这些示范被认为是最优的或展示了达成某目标的最优行为。
目标:学习策略 ,使得机器人看到状态 时产生的动作尽可能接近专家在该状态下所做的动作。
1.2 行为克隆算法#
最直接的模仿学习实现方式,本质上是一个监督学习回归问题:
- 输入:专家提供的最优状态-动作轨迹数据集
- 损失函数:均方误差(MSE),最小化专家动作与策略预测动作之间的差异
- 训练流程:采样 batch → 前向传播得到预测动作 → 计算损失 → 反向传播 → SGD 迭代优化
1.3 与监督学习的关键区别:IID 假设不成立#
在标准监督学习中,输入 之间是独立的——对一张猫图的预测不改变下一张图片的内容。行为克隆中这一假设不成立:
| 标准监督学习 | 行为克隆 |
|---|---|
| 输入独立同分布(IID) | 策略的输出改变下一个输入 |
| 误差线性累积 | 误差复合累积 |
| 测试分布 ≈ 训练分布 | 存在分布偏移 |
具体过程:策略在第一步产生微小误差 → 到达一个接近但不等于专家轨迹中 的状态 → 这是策略未训练过的新状态 → 下一步预测很可能又出错 → 误差不断复合,策略逐渐偏离原始最优轨迹。
即使是很小的变化(光照、白天/夜间、天气条件)也会影响策略性能。
1.4 三摄像头技巧:应对分布偏移的实践方案#
NVIDIA 2016 年的自动驾驶案例验证了行为克隆在真实世界的可行性:训练深度神经网络将单个前视摄像头的原始像素直接映射到转向指令。
核心问题:训练数据几乎都是直行,但偏离车道的恢复行为数据极难采集(你不会真的让司机撞路边来收集数据)。
三摄像头方案:
| 摄像头 | 虚拟标签 |
|---|---|
| 中心摄像头 | 直行 |
| 左侧摄像头 | 向右转(恢复回车道) |
| 右侧摄像头 | 向左转(恢复回车道) |
本质上是用虚假标签模拟恢复行为,无需人类驾驶员真的将车开偏。同样的思路也被应用于苏黎世的四旋翼无人机穿越密林项目:让人戴着三台 GoPro(额头位置)走过森林,中心→直行,左侧→向右飞,右侧→向左飞。
1.5 误差上界:二次方增长#
设时间步长 ,学习策略在每步犯错的概率为 :
- 标准监督学习:误差为 线性
- 行为克隆:误差为 二次方
走钢丝类比推导:
- 代价函数:动作匹配专家时代价为 0,不匹配时代价为 1
- 在训练分布内的状态上,犯错概率由 界定
- 一旦犯错,进入未见过的状态,犯错概率无界(没有恢复的示范数据)
- 在第 1 步犯错 → 剩余 步都产生代价;在第 2 步犯错 → 剩余 步产生代价
- 聚合所有概率后,期望总误差以 增长
Part 2: DAgger — 缩小分布偏移#
2.1 核心思想#
既然问题根源是专家访问的状态与策略访问的状态不一致,解法就是让它们趋于一致。
DAgger(Dataset Aggregation)算法:
- 用当前策略在真实世界中执行 rollout
- 观察策略实际访问了哪些状态
- 请专家标注这些状态下应该采取的动作
- 将新的纠正性状态-动作对加入现有数据集
- 在扩充后的数据集上更新策略
- 迭代重复
数学保证:DAgger 使策略访问的状态分布收敛到专家分布,将误差界从二次方降为线性。
2.2 DAgger 的局限#
| 问题 | 说明 |
|---|---|
| 标注成本 | 事后请专家标注数千条轨迹耗时且昂贵 |
| 离散化误差 | 事后标注时动作空间可能与机器人实际控制接口不同 |
2.3 矛盾但重要的结论#
行为克隆在数据包含更多错误和恢复行为时反而效果更好——因为策略在训练时就见过了”偏离后再回来”的状态。
2.4 Human-Gated DAgger / 在线干预(Online Intervention)#
标准 DAgger 的改进:不做事后标注,而是让机器人在人类监督下在线运行。
- 当机器人开始犯错时,人类接管并提供任务剩余部分的部分示范
- 比事后标注更自然、更高效——人类只在必要时介入
- 类比:驾校教练只在你快要撞上路沿时才抓方向盘,而不是事后看录像告诉你该怎么开
新挑战:如何判断何时需要干预?不希望人类持续监控机器人等待介入时机。
2.5 自动化干预检测:语言歧义案例#
场景:人类对机器人说”从桌子上拿一个黄色的东西”,但桌上有多个黄色物体。机器人应检测到指令有歧义,主动向人类询问消歧。
方法:
- 使用 max margin ranking loss 训练理解模型
- 训练时:正确配对的句子-物体得分应比错误配对低至少 margin
- 测试时:若多个物体在阈值范围内,视为潜在目标
- 对每个潜在目标生成指代表达式(referential expressions),用生成式模型描述各候选物体,询问人类确认
Part 3: 非马尔可夫行为(Non-Markovian Behavior)#
3.1 问题#
上一讲要求动作仅基于当前状态(或观测)。但人类的行为并非如此:
| 原因 | 说明 |
|---|---|
| 依赖历史 | 驾驶员看到骑车人时,基于过去 5 秒的追踪来预判运动,而非单帧画面 |
| 情绪状态 | 影响行为表现 |
| 特权信息 | 遥操作时人类可四处移动视角,而策略只能看到摄像头观测(存在遮挡) |
当示范者的行为依赖历史,而策略只看当前帧时:机器人看到相同的视觉状态两次,但专家做了两个不同的动作——策略缺乏历史上下文来理解为什么。
3.2 解法一:给策略添加历史#
- 不只用当前帧,而是用最近 帧作为输入
- 使用序列模型(LSTM、RNN、Transformer)处理
- 用同样的行为克隆方式训练
3.3 因果混淆(Causal Confusion)#
添加历史并不总是让结果变好,有时反而更差。
核心问题:高容量模型在获得完整历史后,倾向于推断虚假相关性而非真正的因果路径——因为它在寻找最容易最小化损失的方式。
经典例子:
- 每次机器人打开抽屉时,夹爪力传感器记录到恰好 10N 的尖峰
- 模型学到”看到 10N 就触发拉的动作”
- 真实部署时夹爪打滑,传感器只读到 2N → 拉动作永远不会被触发
- 模型错误地认为传感器值导致了开启动作,而实际上抓住把手的视觉状态才是原因
教训:使用历史时需要大量正则化,确保模型仍关注正确的视觉状态和因果关系。
Part 4: 多模态行为(Multimodal Behavior)#
这是本讲的核心主题。即使有完美数据,模仿学习仍面临多模态问题。
4.1 为什么存在多模态性#
以关抽屉为例,存在两个层面的多模态性:
| 层面 | 说明 | 例子 |
|---|---|---|
| 关节冗余 | 同一位姿有多种关节构型 | 末端执行器在同一位置时肘部可在不同角度 |
| 任务多解 | 任务本身有无穷多种完成方式 | 侧抓、正面抓、顶部下压、肘推,以及各种角度之间的任意方式 |
人类自然录制的数据会展示所有这些不同行为。
4.2 MSE 的失败#
标准 MSE 损失迫使模型预测所有示范的平均值。
类比:两个滑雪者分别从树的左右两侧绕过,平均值是直直撞上树。
4.3 解法一:高斯混合模型(GMM)#
用一组均值、协方差和权重表示多个高斯分布,能建模多峰分布。
局限:需要预先指定模态数量 (如 10 个)。对于高维控制(如人形机器人可能需要上千个模态),指定正确的模态数量变得棘手。
4.4 解法二:离散化(Discretization)#
将连续动作空间转化为 bin 网格,将回归变为分类问题。能表示多模态分布(如无人机飞行、汽车驾驶场景)。
局限:bin 数量随维度指数增长。
改进:逐维度自回归离散化
- 复杂度从指数降为维度的线性关系
- 使用自回归序列模型(如自回归 Transformer)分解
- 利用链式法则:逐步预测每个动作维度
- 这本质上就是早期 VLA(Vision-Language-Action)模型的做法
- 局限:需要使用大型自回归模型(LLM/VLM)作为骨干,计算开销较大
4.5 解法三:扩散模型(Diffusion Models)#
来自生成式建模领域(第 6 周将详细讨论),核心思想是通过迭代去噪从噪声中恢复干净数据。
| 过程 | 说明 |
|---|---|
| 前向过程(加噪) | 给干净样本逐步添加高斯噪声,直到信息全部丢失,变成纯噪声 |
| 反向过程(去噪) | 训练神经网络逐步去噪,学习从噪声中恢复干净数据 |
关键细节:网络实际预测的是噪声本身 ,然后从当前样本中减去预测噪声,迭代恢复干净信号。
与自回归离散化的对比:两者都使用迭代过程——自回归在动作维度上迭代,扩散在去噪步骤上迭代。
4.6 解法四:隐变量模型(Latent Variable Models)#
原则上可以表示任意分布(只要网络足够大)。
结构:
- 网络输出仍是高斯分布
- 额外接收一个从先验分布 采样的输入——相当于一个”种子”
- 不同的种子导致不同的模态/行为
训练:不能直接输入随机数得到目标行为,需要训练模型将输入隐变量与期望模式关联起来。可以理解为:存在两种模式(如从树左边绕 vs 右边绕),用隐变量作为条件告诉解码器选择哪种。
4.7 隐变量 vs 任务条件化的区别#
| 类型 | 作用 | 信号来源 |
|---|---|---|
| 任务条件化 | 告诉机器人执行哪个具体行为(如”开抽屉”),定义目标 | 有监督信号(任务 ID、语言指令) |
| 隐变量 | 在给定目标下,告诉机器人用哪种风格/模式完成 | 无监督,从数据中学习 |
即使任务 ID 固定,机器人仍面临无穷多种完成方式——隐变量正是为了建模这种”怎么做”的多样性。
Part 5: 目标到达(Goal Reaching)#
5.1 动机#
现实中很难定义任务成功:滑动门推到一半算成功吗?不同人有不同判断。行为通常是连续的,难以在任务的起点和终点画出明确边界。我们希望机器人学习环境中所有可用技能的完整谱系,而非一组离散的任务。
5.2 定义#
定义一个策略,能从场景中任意初始状态到达任意期望目标状态。
| 条件化方式 | 输入 | 特点 |
|---|---|---|
| 单任务条件化 | one-hot 编码或自然语言 | 离散任务集 |
| 目标到达 | 初始状态 + 目标状态 | 任务连续,状态连续 |
Part 6: 综合案例 — 从自由玩耍数据学习任务无关控制#
6.1 数据收集#
用户遥操作机器人,不执行任何特定任务——类似儿童探索环境的方式,操作者根据自己的好奇心自由行动。
| 特性 | 说明 |
|---|---|
| 无需重置 | reset-free,连续操作 |
| 高度可扩展 | 不需要指定任务目标 |
| 高度多模态 | 同一状态-目标对有无数种连接方式 |
6.2 学习流程#
- 从玩耍数据中采样一个随机窗口
- 将采样窗口的最后一帧通过目标编码器编码(目标重标注:用数据中已有的帧作为目标)
- 采样随机帧窗口,让模型预测该序列中采取的动作序列,学习如何到达目标
6.3 隐变量规划空间:用 CVAE 处理多模态性#
核心架构:序列到序列的条件变分自编码器(CVAE),将上下文示范自编码到隐计划空间。
| 组件 | 输入 | 输出 | 作用 |
|---|---|---|---|
| 后验编码器 | 采样的完整序列 | 隐变量 | 识别并编码实际执行的行为 |
| 先验编码器(计划采样器) | 初始状态 + 目标状态 | 的分布 | 输出连接两状态的所有可能行为分布 |
| 动作解码器 | 状态 + 隐变量 | 动作 | 根据选定的计划执行单模态行为 |
训练目标:最小化两个编码器之间的 KL 散度,使先验对玩耍期间实际执行的行为赋予高似然。
测试时:丢弃后验,使用计划采样器预测多模态计划。
关键洞察:将策略(解码器)条件化在隐计划上,释放了解码器的容量,使其只需学习单模态行为——多模态性被压缩到了隐变量空间中。
6.4 扩展到语言目标#
视觉目标与自然语言目标的嵌入可以互换。主要从无标注的视觉玩耍数据中自监督学习控制,减少语言标注的负担。
6.5 数学推导:变分下界#
- 目标:最大化专家数据的边际似然
- 问题:隐变量 是连续的,边际化(对无穷多可能计划积分)不可处理
- 解法:标准变分推断——优化替代目标即变分下界(ELBO)
引入目标条件化后(上下文变量包含 和 ),与架构中后验、先验、动作解码器三个组件自然对齐。
关键概念总结#
行为克隆 (BC):
专家数据 → MSE 回归 → 策略 π_θ
问题:分布偏移 → 误差 O(εT²)
DAgger:
策略 rollout → 专家标注新状态 → 扩充数据集 → 迭代
效果:误差界从 O(εT²) 降至 O(εT)
非马尔可夫行为:
原因:人类依赖历史 / 特权信息
解法:添加历史输入(但需警惕因果混淆)
多模态行为工具箱:
GMM → 离散化 → 扩散模型 → 隐变量模型
核心:将"怎么做"的多样性压缩到隐空间
目标到达 + 隐变量规划:
自由玩耍数据 → CVAE 编码隐计划 → 条件化策略解码
目标:自监督学习任务无关控制plaintext