9.2.1 使用机器人示教轨迹进行行为克隆
这一小节把前面第 5 章中比较抽象的“行为克隆(BC)”真正落到 VLA 训练流水线上:有了多模态示教轨迹(视觉、语言、状态、动作),如何把它们组织好、喂给模型、再检查模型输出是否“像个靠谱的机器人”。
9.2.1.1 准备示范数据
1)示教轨迹的基本结构
在 VLA 场景下,一条完整的示教轨迹通常可以写成:
\[ \tau = \left{(o_t, x_t, a_t, c)\right}_{t=1}^T \]
- \((o_t)\):时刻 \(\displaystyle t\) 的视觉观测(RGB 图像、深度图,甚至多相机画面)
- \((x_t)\):机器人状态(关节角、末端位姿、夹爪开合、是否抓到物体等)
- \((a_t)\):专家给出的动作(关节指令、末端增量、动作 token 等)
- \(\displaystyle c\):与整条轨迹关联的条件信息,如自然语言任务指令、任务 ID、机器人 ID、环境参数等
第 7 章已经介绍了遥操作(Teleoperation)、人手带动(Kinesthetic teaching)和程序生成三种主流示教方式,这里可以认为我们已经通过这些手段获得了大量轨迹,现在的重点是标准化和对齐 。
2)时间同步与多模态对齐
实际采集时,各模态的时间频率并不统一:相机 10–30 Hz,关节控制 100–1000 Hz,语言指令可能只有一条。常见做法是:
- 为所有消息打时间戳
- 按目标训练频率(例如 10 Hz)建立一个统一时间轴
- 对每个时间点,找到最接近的图像帧和状态;动作通常记录为上一控制周期发出的指令
这样可以得到一条对齐好的时间序列,供行为克隆模型直接使用。大规模机器人数据集(如 RT-1、Open X-Embodiment 等)都会采用类似的标准化设计,使不同实验室、不同机器人采集的数据能放到同一个训练池里使用。(ResearchGate)
3)轨迹切片与窗口化
行为克隆往往不是“一条轨迹当成一个样本”,而是把轨迹切成许多长度为 \(\displaystyle K\) 的小片段:
\[ {(o_{t:t+K-1}, x_{t:t+K-1}, a_{t:t+K-1}, c)} \]
- 这样做可以让模型在一个窗口内看到短期历史,而不是只看当前帧
- 也方便使用 Transformer 这类序列模型统一处理“多帧视觉 + 历史动作”
窗口长度 \(\displaystyle K\) 的选择与任务时间尺度相关:抓取类任务可能十几步即可,开门、抽屉这类长时任务可能需要更长窗口,或者再引入记忆机制。
4)元数据与质量标注
为了后续采样策略(见 9.2.2)和长尾处理(见 9.2.3),示范数据在存储时最好附带以下元信息:
- 机器人 ID、机械结构信息(自由度数、是否带移动底盘等)
- 任务 ID、任务类别(抓取、插入、开合容器等)
- 环境配置(物体类别、摆放布局、光照条件等)
- 成功 / 失败标记,必要时添加“部分成功”标签(仅抓取成功、放置失败等)
近年来的示教学习综述工作都强调:数据的结构化和标注质量,比单纯堆量更关键 。否则大量“脏数据”只会拖慢训练,让模型学到错误的偏好。(科学直通车)
【图 9-1 占位:示教轨迹数据结构示意图。时间轴横向展开,上方是图像帧,下方是机器人状态与动作,轨迹整体关联一条自然语言指令和任务 ID。】
9.2.1.2 行为克隆训练
1)从模仿学习到有条件的 VLA 行为克隆
有了清洗好的示教数据,VLA 的行为克隆本质上是一个有条件的监督学习问题:
\[ \min_\theta \mathbb{E}_{\tau \sim \mathcal{D}} \left[ \sum_{t} \ell\big(f_\theta(o_{1:t}, x_{1:t}, c), a_t\big) \right] \]
- \(f_\theta\) 是 VLA 模型,输入为历史观测、机器人状态和任务条件(语言指令等),输出当前动作
- \(\ell\) 是损失函数,动作是离散 token 时多用交叉熵;是连续向量时多用 L2/MSE
像 RT-1、RT-X 等大规模机器人 Transformer,本质上就是在几十万条示教轨迹上做这样的大规模行为克隆,只不过它们把动作离散化为 token 序列,与语言 token 一并用 Transformer 处理。(ResearchGate)
2)Teacher Forcing 与动作 token
实际训练时,最常用的是 teacher forcing:
- 解码器在预测 \((a_t)\) 时,条件中用的是专家的历史动作 \((a_{1:t-1})\),而不是模型自己先前预测的动作
- 好处:梯度路径清晰稳定,训练过程完全在“专家分布”下进行,便于优化
- 代价:上线执行时,模型只能看到自己以前的动作,会产生分布偏移(这一点在第 5 章 DAgger 中已经讨论过)
如果动作被量化为序列 token(例如“关节 1 的档位”“末端 x 方向增量档位”等),可以直接借用语言模型工具链:
- 把“视觉 token + 语言 token + 历史动作 token”拼成一个长序列
- 用自回归方式预测下一个动作 token
- 损失函数就是标准的 token-level 交叉熵
3)冻结与解冻:利用预训练骨干
在第 9.1 节中我们已经通过图文数据对视觉和语言 backbone 做了预训练。行为克隆阶段常见的实践是:
- 阶段一:冻 backbone,只训决策头
- 视觉和语言编码器参数冻结,仅训练动作解码头和少量多模态融合层
- 好处是训练稳定,防止少量机器人数据把大规模预训练知识“洗掉”
- 阶段二:逐层解冻
- 在行为克隆 loss 稳定下降后,逐层解冻靠后的视觉 / 语言层,允许模型为机器人任务做适度“特化”
- 解冻时要减小学习率,避免对 backbone 做过猛更新
多任务机器人策略的研究(如基于多任务 Transformer 的 BAKU、LBM 系列)都表明,合理利用预训练骨干并控制解冻节奏,可以在相同示教数据量下显著提升性能和泛化。(NeurIPS 会议论文)
4)数据加载与 batch 构造要点
- 同一 batch 中的样本可以来自不同机器人、不同任务(多任务学习模式),也可以暂时限制为相同任务做 curriculum 学习
- 序列模型训练时,通常会对每段轨迹随机选择起始时间 \(\displaystyle t\),避免模型只在固定时间段看到类似情形
- 对于长轨迹,可使用“子序列重叠采样”:相邻窗口部分重叠,提高数据利用率并保持时序连续性
【图 9-2 占位:行为克隆训练流程示意图。从轨迹池抽取一批窗口,经过视觉 / 语言编码器和 Transformer 决策头,计算动作 token 交叉熵 loss、反向传播更新。】
9.2.1.3 模型输出验证
行为克隆完成后,不能只看 loss 数值“好不好看”,更关键的是:模型在闭环控制下是否真的能完成任务 。
1)离线指标:一步预测 vs 轨迹层面
离线评估时,常用指标包括:
- 一步动作预测准确率 / Top-k 准确率: 模型在验证集上对专家动作的预测是否正确或落在前 k 个候选中
- 连续动作误差: 若动作是连续的,可统计平均 L2 误差、角度误差等
- 负对数似然(NLL): 尤其在动作是概率分布(例如高斯)时,用来评估动作分布拟合程度
这些指标只衡量“模仿得像不像”,并不能保证闭环执行时不会“越走越偏”。
2)回放评估与闭环模拟
更实际的办法是进行两种回放实验:
- 离线回放(open-loop replay)
- 使用记录好的观测 \((o_t)\)、状态 \((x_t)\),让模型在每一步输出动作 \(\hat a_t\)
- 把 \(\hat a_t\) 与专家动作 \((a_t)\) 比较,看轨迹整体偏差
- 适合快速检查“模型有没有学错行为风格”(例如方向完全相反)
- 仿真闭环执行(closed-loop rollout)
- 把模型部署到仿真环境中,从与示教轨迹相同的初始状态出发
- 每一步用模型输出作用于环境,观测新状态,再继续决策
- 统计任务成功率、完成时间等指标,这才真正反映策略可执行性
从大规模机器人 BC 系统(如 RT-1、Open X-Embodiment 上的 RT-X)经验看,离线行为克隆指标与实际成功率只有部分相关:有时 NLL 改善不多,但成功率提升显著,反之亦然。因此必须保留一套“闭环验证 protocol”。(robotics-transformer-x.github.io)
3)错误分析与可视化
建议在验证阶段刻意构建一些“典型失败案例”进行可视化分析:
- 关键帧对比:同一时间点下,人类示教 vs 模型执行的末端位姿、物体位置
- 轨迹叠加:在 2D/3D 中画出示教轨迹和模型轨迹,观察偏差模式(是否总是靠近桌边、抓高了等)
- 任务分解层面:看是出错在“找物体”、“对准”还是“放置”阶段
【图 9-3 占位:闭环评估可视化示意图。左列是示教轨迹关键帧,右列是模型执行关键帧;下方叠加两条末端轨迹曲线,标记偏差最大的时刻。】
9.2.2 混合多机器人、多任务数据训练的采样策略
随着 Open X-Embodiment 等数据集的公开,研究者开始尝试在二十多个机器人、上百甚至上千个任务 的数据上训练单一通用策略。(robotics-transformer-x.github.io) 这带来的好处显而易见:模型能共享知识、提升泛化;但随之而来的是一个现实问题——怎么抽数据?
9.2.2.1 数据混杂问题
如果我们粗暴地把所有轨迹混在一起,每个时间步都“从全集中等概率采样”,会遇到至少三个问题:
- 机器人分布极不均匀 某些实验室贡献了大量某一款机械臂的数据,另一些机器人只有少量轨迹。如果不加区分,模型会几乎完全“变成”那台主流机械臂的专家,对其他机器人性能堪忧。
- 任务分布严重倾斜 像“抓取桌面物体”这样的基础任务数据常常巨多,而复杂任务(抽屉、插销、开盖)数据很少。模型自然而然会学会在任何情境下“抓个东西再说”,而忽略长尾任务的细节。
- 动作空间与标度差异 不同机器人使用的动作定义可能不同:有的输出关节增量,有的输出末端速度,有的还带移动底盘。即便经过统一 token 化,原始分布差异仍然存在,会导致梯度更新被某些高方差任务主导。
多任务机器人策略研究已经反复观察到,这类分布不均匀 + 异质性 会让“多任务训练”从理论上的利好,变成实践中的“互相拖后腿”。(OpenReview)
9.2.2.2 分布均衡采样
为缓解上述问题,可以在 DataLoader 层面设计更聪明的采样策略。
1)任务 / 机器人均衡采样
最直接的做法是分层采样:
- 先均匀采样任务 ID 或(机器人,任务)二元组
- 再在所选任务的轨迹池中随机采样一个时间窗口
这样,每个 batch 中不同任务、不同机器人出现的概率大致相近,避免“头部任务独占梯度”。
具体实现上,可以为每个任务维护一个索引列表,并在每个 epoch 重新随机打乱,实现类似“per-task round-robin”的采样方式。
2)温度重标采样(temperature-based sampling)
严格均衡并不总是理想:样本极少的任务如果被采得过多,容易过拟合;样本极多的任务被采得过少,又浪费了宝贵数据。因此可以使用“温度采样”:
\[ p_i \propto n_i^\alpha,\quad 0 < \alpha < 1 \]
- \((n_i)\):任务 \(\displaystyle i\) 的样本数
- \(\alpha\) 越接近 0,越接近完全均衡;越接近 1,越接近原始按样本数比例采样
在自动驾驶和机器人长尾学习中,这类“次线性重标”的采样策略已经被证明在“利用大量头部数据”和“照顾长尾任务”之间做出了比较合理的折中。(arXiv)
3)重采样 vs 重加权
除了改变“抽样概率”,也可以保持抽样不变,只在 loss 中给不同任务加权(这一点在 9.2.3 中会详细展开)。实践中常见的组合是:
- 适度均衡采样(例如温度采样)
- 再叠加一个较温和的 loss 权重(例如对真正极少样本的任务略微放大 loss)
这样避免单一手段过度极端,导致 training dynamics 不稳定。
9.2.2.3 元学习思路
前面讨论的采样策略,本质上是在“让各任务在训练中被看到得更公平”。进一步的思路是:让模型学会“见到一个任务就知道该怎么快速适应”,即引入元学习(meta-learning)视角。
1)任务级 episode 训练
可以把“一个任务的数据子集”看成一个 episode:
- 在该任务数据上做若干步“内循环”更新(inner loop),模拟在新任务上微调
- 再在多个任务 episode 上做“外循环”(outer loop)梯度更新,让模型参数偏向于“对任何任务都易于适应”的状态
这类似于第 12 章会提到的 MAML 风格元学习,只不过这里的任务条件通常以语言指令 + 任务 ID + 机器人 ID embedding 的形式输入模型,而不是单纯的标签。
2)检索增强与“学会选数据”
近年来一些工作尝试从大规模示教库中为特定目标任务智能检索 最相关的示范,再用这些数据做 BC 微调,本质上是一种“数据级元学习”。例如 COLLAGE 会根据少量目标任务 demo,从大库中检索语义相似的轨迹,构成增强训练集。(OpenReview)
这种方法在 VLA 场景中非常自然:语言指令本身就是任务描述,可以直接用作检索 query,让模型在训练和测试时都“带着记忆中的类似经验”做决策。
【图 9-4 占位:多任务 / 多机器人采样与元学习示意图。一侧是按任务均衡的 DataLoader,另一侧是以任务为单位的内外循环元学习流程。】
9.2.3 数据不平衡与长尾任务的处理
现实世界的数据几乎都会呈现 长尾分布(long-tail):大量普通场景 + 少量复杂罕见场景。这在视觉领域早已是经典问题,在机器人领域则显得更敏感,因为尾部任务往往正是“难但关键”的场景(例如障碍物突然出现、物体滑落、夹爪打滑)。(LG AI Research)
9.2.3.1 数据长尾现象
在具身数据中,长尾可以出现在多个层面:
- 任务层面: “抓起桌面方块”之类简单任务数据巨大,而“开门”、“插销”、“从抽屉里取物”数据稀缺
- 环境层面: 标准光照、整齐摆放的数据极多,杂乱桌面、暗光、遮挡严重的数据极少
- 动作 / 状态层面: 正常操作姿态是高频状态,而“接近碰撞边缘”“夹爪半滑落”等微妙状态十分罕见
如果直接在原始长尾数据上做行为克隆,模型的策略等价于“尽量在头部场景表现好”,在尾部场景则容易完全失常,甚至表现得比简单的手工策略还差。近期针对不平衡数据的行为克隆研究也证明,** 不做 rebalancing 的 BC 会显著偏向频繁行为模式**。(arXiv)
9.2.3.2 重采样或重加权
1)重采样(resampling)
- 过采样尾部任务: 在 DataLoader 中人为提高尾部任务被采到的概率,甚至允许同一条轨迹多次出现在不同 epoch
- 欠采样头部任务: 对样本过多的任务有意识地丢弃一部分,防止它们压倒一切
这一做法的优势是简单直观,缺点是容易导致尾部任务过拟合(总是同几条轨迹),而头部任务信息浪费严重。
2)损失重加权(loss re-weighting)
另一条路径是保持抽样大致按原始分布,只对 loss 加权:
\[ \mathcal{L} = \sum_{k} w_{c(k)} \cdot \mathcal{L}_k \]
- \(\mathcal{L}_k\):第 \(\displaystyle k\) 个样本的 BC 损失
- \(c(k)\):该样本所属任务 / 类别
- \((w_{c})\):对应类别的权重
常见的权重选择包括:
- 反频率权重:\(w_c \propto 1 / n_c\)
- 平滑反频率权重:\(w_c \propto 1 / \sqrt{n_c}\) 或使用类似温度调节的形式
- 动态 reweighting:根据训练过程中各类任务的当前性能动态调整权重,使模型更关注“当前表现差”的任务 (CVF开放获取)
在大规模机器人 BC 中,经验表明“适度 的重加权最稳妥”——把尾部权重调大一两级通常有益,但过度放大会导致梯度噪声急剧变大,引发训练不稳定。
9.2.3.3 数据增强
因为尾部数据常常数量极少,仅靠重采样与重加权仍然容易过拟合,这时数据增强(augmentation) 是必要补充。
1)视觉层增强
- 经典图像增强:随机裁剪、平移、旋转、色彩抖动、噪声等
- 机器人特有增强:在仿真中做域随机化——改变光照、材质、背景等,从有限尾部场景生成多样视觉变体(与第 5 章 Sim2Real 内容呼应)
注意:增强必须保证语义和任务标签不变 。例如,把“开抽屉”的视频旋转 180° 就完全改变了语义,不再是原任务。
2)动作 / 轨迹层增强
- 对动作轻度加噪:在不破坏任务成功的前提下,给专家动作加小扰动,让模型见到更丰富的“近似 optimal”的行为
- 轨迹时间裁剪 / 拼接:截取长轨迹的中间部分作为独立训练样本;或将一些标准“接近 + 抓取”子序列库重用到其他类似任务
- 在仿真中针对尾部任务设计大量程序化演示,再与少量真实示教混合使用
最新的大规模驾驶与机器人策略工作表明,在数据量巨大时,简单的视觉增强很难触及真正的“规则尾部行为”,这时需要有针对性的行为层增强和仿真合成,才可能让 BC 策略在尾部任务上有像样表现。(SpringerLink)
【图 9-5 占位:长尾任务处理示意图。左侧是头–尾分布直方图,中间展示重采样 / 重加权示意,右侧展示模拟增强生成的大量尾部任务变体。】
9.2.4 训练稳定性:梯度尺度、loss 爆炸、收敛诊断
VLA 模型通常是大参数量 + 长序列 + 多模态 的组合,对优化器来说压力不小。略微调错学习率、初始化或归一化,就可能看到 loss 曲线“离谱起飞”或者“纹丝不动”。
本节不再重复第 2 章的优化基础,而是聚焦于:在大规模行为克隆中,如何监控梯度、避免 loss 爆炸,并判断模型是否真的在收敛。
9.2.4.1 梯度规范
1)梯度范数监控
在每次反向传播后,我们可以计算整体梯度的 L2 范数:
\[ |\nabla_\theta|_2 = \sqrt{\sum_i g_i^2} \]
其中 \((g_i)\) 为每个参数的梯度。实际工程中,常见做法是:
- 在日志中记录每个训练 step 或每 N 个 step 的梯度范数
- 建立一个“合理区间”(例如在初期根据试验经验设定)
- 一旦出现持续的异常尖峰或长期过小,就需要检查是否有 bug 或超参数不合理
最近关于大模型训练稳定性的经验也指出,长期不稳定的梯度峰值往往与损失突然爆炸高度相关,及早发现能避免浪费训练预算。(arXiv)
2)梯度裁剪(gradient clipping)
应对梯度爆炸的经典办法是梯度裁剪,常用的是按全局范数裁剪:
\[ \tilde g = \begin{cases} g & \text{if } |g|_2 \le c \dfrac{c}{|g|_2} g & \text{if } |g|_2 > c \end{cases} \]
- \(\displaystyle c\) 是设定的阈值(如 1.0 或 5.0),可根据实验调整
- 裁剪只改变梯度的“长度”,不改变方向
大量深度学习实践表明,梯度裁剪可以在不明显影响最终性能 的前提下,显著降低 loss 爆炸、参数发散的概率,尤其是 RNN / Transformer 和大 batch 训练中几乎是标配。(neptune.ai)
3)与混合精度和归一化的配合
在 VLA 训练中经常使用混合精度(FP16/BF16),此时要注意:
- 宜搭配 loss scaling,防止小梯度在 FP16 下下溢为 0
- 与 LayerNorm、BatchNorm 配合时,可在归一化之后监控激活值 range,避免中间激活过大导致梯度过大
简单的经验法则是:先看激活再看梯度 。如果中间某层激活已明显发散,那么裁剪梯度只是“止血”,仍需要从网络结构和输入归一化上找原因。
9.2.4.2 Loss 爆炸
1)什么是 loss 爆炸
loss 爆炸通常表现为:
- 训练 loss 在若干 step 内突然大幅上升
- 出现
Inf或NaN,训练中断 - 同时伴随梯度范数的异常尖峰
这在深层网络和长序列模型中非常常见,尤其是学习率过大或初始化不当时。(ultralytics.com)
2)常见成因与排查顺序
工程上可以按以下顺序排查:
- 学习率过大
- 尝试降低一个数量级(例如从 1e-4 降到 1e-5),观察 loss 是否恢复正常下降
- 确认是否正确使用了 warmup,避免刚开始就大步更新
- 输入 / 标签异常
- 检查是否存在输入为
Inf/NaN的样本(例如传感器异常、数据预处理错误) - 检查 loss 计算是否有
log(0)、除 0 或指数溢出(例如exp()过大)
- 检查是否存在输入为
- 梯度未裁剪
- 添加全局梯度裁剪,监控裁剪比例,如果经常被裁剪说明学习率或模型设计需要进一步调整
- 不合适的初始化或归一化
- 检查是否使用了针对 Transformer 的推荐初始化
- 在模型中适度增加 LayerNorm 或残差连接位置调整,避免某些路径累积过多放大
3)回滚与恢复训练
一旦出现 loss 爆炸,最稳妥的做法是:
- 回滚到最近一个健康的 checkpoint
- 根据排查结果调整超参数(学习率、clip 阈值等)
- 从该 checkpoint 继续训练,而不是从头再来
从大规模 BC 系统经验看,从“坏掉的 checkpoint”硬撑着继续训 往往得不偿失,模型参数已经跑到不靠谱区域,继续训练只会越修越乱。
9.2.4.3 收敛诊断
行为克隆的“收敛”有两层含义: 一是优化意义上的 loss 收敛;二是任务意义上的成功率收敛 。二者不必严格一致。
1)典型曲线形态
训练过程中至少应该同时监控以下曲线:
- 训练集 loss vs step
- 验证集 loss vs step(按任务分解更好)
- 部分代表性任务的离线成功率 / 动作预测准确率
常见情形:
- 正常收敛:训练 loss 平稳下降,验证 loss 在某个点后进入平台期;对应的任务成功率逐步上升后趋于稳定
- 过拟合:训练 loss 持续下降,而验证 loss 与成功率在某个时间点后恶化
- 不收敛或欠拟合:训练 loss 长期高位波动或缓慢下降,验证指标几乎无明显改善
针对过拟合,可以使用第 2 章介绍的早停、正则化、数据增强等手段;针对欠拟合,则需考虑加大模型容量、改进结构或收集更多高质量数据。
2)行为克隆的“低 loss 并不等于好策略”
与传统分类略有不同,BC 的损失是局部一步一步的模仿误差,而我们真正关心的是** 长轨迹上的累计效果**。因此有几个易踩的坑:
- 在数据分布上,模型可以在每一步都“略微偏离”专家动作,但长时间滚动后偏差累积成“完全做错事”
- 这类偏差在一步预测 loss 中表现不明显,但在闭环 rollout 成功率上极为明显
因此在收敛诊断时,建议:
- 每隔固定步数,从验证集随机选取若干起始场景,在仿真中执行固定长度的 rollout
- 对比相同 checkpoint 下的成功率曲线,而不仅仅看 loss 曲线
3)多任务情境下的收敛
在多任务、多机器人场景中,还需要关注任务间干扰:
- 某些任务的性能突然下降,可能是训练后期在别的任务上“学坏了”
- 可以在日志中记录每个任务的 loss / 成功率,观察是否有任务长期处于“被遗忘”状态
如果出现这种现象,可以考虑:
- 调整 9.2.2 和 9.2.3 中的采样 / 重加权策略,加强对这些任务的关注
- 或者在训练后期采用“task-wise fine-tuning”,在保持多任务能力的前提下,对重要任务单独做几轮小学习率微调
【图 9-6 占位:训练稳定性与收敛诊断图。上半部分展示训练 / 验证 loss 曲线,下半部分展示若干任务的成功率随 checkpoint 变化的折线图,用不同颜色表示不同任务。】
到这里,本节从示教轨迹 → 行为克隆训练 → 多机器人多任务采样 → 长尾处理 → 训练稳定性 打通了一条完整路径。接下来的 9.3 节会在此基础之上,引入强化学习、自监督和人类反馈等进阶范式,把一个“会模仿”的 VLA 模型逐步打磨成“会试错、会总结”的更强智能体。