跳转至

VLA 前置知识:从模仿学习到 ACT

学 VLA 前最容易晕的地方不是某个公式,而是很多词来自不同分类轴:模仿学习、行为克隆在说训练方法;ACT、Diffusion Policy、VLA 在说策略或模型结构;动作 token、action chunk、flow 在说动作表示和动作头。


1. 先把分类轴分开

不要把所有名词硬塞进一棵树里。更清楚的方式是分成三条轴:

问的问题 例子
学习范式 模型怎么从数据中学? 模仿学习、强化学习、监督学习
训练目标 训练时具体拟合什么? 行为克隆、DAgger、GAIL、IRL
模型/策略结构 模型长什么样,怎么输出动作? ACT、Diffusion Policy、VLA、OpenVLA、pi0

所以一句话里可以同时出现多个标签:

用行为克隆训练一个 ACT 策略
用行为克隆微调一个 VLA 模型
用 flow matching 训练一个连续动作 VLA

它们不是互相排斥的类别,而是从不同角度描述同一个系统。

最重要的记法

模仿学习/行为克隆回答“怎么学”;ACT/VLA 回答“模型是什么结构”;动作表示回答“动作怎么被模型输出”。


2. Policy:机器人策略到底是什么?

机器人学习里经常说 policy,中文可以理解为“策略”。它就是一个从当前信息到动作的函数:

\[ \pi_\theta(o_t) \rightarrow a_t \]

其中:

  • \(o_t\) 是当前观测,例如图像、关节角、夹爪状态。
  • \(a_t\) 是机器人要执行的动作。
  • \(\theta\) 是模型参数。

如果加入语言指令:

\[ \pi_\theta(o_t, l) \rightarrow a_t \]

如果加入 action chunk:

\[ \pi_\theta(o_t, l) \rightarrow a_{t:t+H} \]

这就是很多 VLA 的基本形式:看当前场景和语言指令,输出未来一小段动作。

2.1 开环与闭环

机器人控制一定要区分开环和闭环:

类型 含义 风险
开环 一次生成一长串动作,然后照着执行 中途物体动了也不会及时修正
闭环 执行几步后重新观察,再预测动作 更稳,但对推理延迟更敏感

VLA 通常是闭环使用:

观察 -> 预测 action chunk -> 执行前几步 -> 再观察 -> 再预测

这也是为什么只看离线 loss 不够。模型执行出的动作会改变下一帧观测,错误可能一步步放大。


3. 模仿学习:从专家示范中学行为

模仿学习(Imitation Learning)的核心是:让模型从专家示范里学会做任务。

专家可以是:

  • 人类遥操作机器人。
  • 更强的控制器或规划器。
  • 另一个已经训练好的策略。
  • 仿真中的自动专家。

一条示范轨迹通常长这样:

o_1, a_1
o_2, a_2
...
o_T, a_T

如果带语言任务:

instruction: "把红色方块放进盒子"
o_1, a_1
o_2, a_2
...
o_T, a_T

模仿学习并不只是一种算法,而是一类方法。它们共同点是利用专家行为,区别在于“怎么利用”。

方法 核心思想 适合理解
行为克隆 BC 直接拟合专家动作 当前 VLA 最常用的基础训练方式
DAgger 模型先执行,专家再纠正模型遇到的状态 缓解分布偏移
逆强化学习 IRL 从专家行为反推奖励函数 专家为什么这么做
GAIL 让模型轨迹分布骗过判别器,像专家轨迹 从轨迹分布角度模仿

对 VLA 入门来说,先重点理解行为克隆和分布偏移就够了。


4. 行为克隆:最直接的模仿学习

行为克隆(Behavior Cloning, BC)把机器人学习变成监督学习:

输入:专家当时看到的东西
目标:专家当时做的动作

数学上:

\[ \min_\theta \mathbb{E}_{(o,a)\sim D} \left[ \mathcal{L}(\pi_\theta(o), a) \right] \]

有语言时:

\[ \min_\theta \mathbb{E}_{(o,l,a)\sim D} \left[ \mathcal{L}(\pi_\theta(o,l), a) \right] \]

这就是很多 VLA 训练的底层形式:

图像 + 语言指令 + 机器人状态 -> 专家动作

4.1 行为克隆为什么简单?

因为它不需要设计奖励函数,也不需要机器人自己探索。只要有专家数据,就能做监督训练:

动作形式 常用 loss
连续动作 MSE / L1
离散动作 token Cross Entropy
高斯策略 Negative Log Likelihood
Diffusion Policy 去噪 loss
Flow policy flow matching loss

行为克隆的“克隆”不是复制专家程序,而是拟合专家在数据里的输入输出关系。

4.2 行为克隆为什么会失败?

行为克隆最大的坑是分布偏移(distribution shift)。

训练时模型看到的是专家轨迹上的状态:

专家状态 -> 专家动作

推理时模型看到的是自己动作造成的新状态:

模型动作 -> 新状态 -> 模型继续动作

如果模型第一步偏了一点,第二步看到的画面可能已经不是专家数据里的画面。接下来错误会继续放大,这叫复合误差(compounding error)。

离线准确不等于执行成功

验证集动作误差低,只说明模型在专家状态附近像专家。机器人真正执行时,会进入自己造成的状态分布,所以必须做 rollout 评估。


5. DAgger:为什么要让专家纠正模型?

DAgger(Dataset Aggregation)的动机是解决行为克隆的分布偏移。

行为克隆只收集专家自己走过的状态。DAgger 会让当前模型也上场执行,然后请专家给这些状态标注正确动作:

1. 用专家数据训练一个初始策略
2. 让策略自己执行,收集它会到达的状态
3. 专家给这些状态标注动作
4. 把新数据并入数据集
5. 重新训练策略

直觉上,DAgger 在教模型:

你犯错后到了奇怪位置,也要知道怎么救回来。

VLA 实践里不一定真的跑标准 DAgger,因为请专家在线纠正成本很高。但这个思想很重要:如果模型常在某些状态失败,就要补这些状态附近的数据,而不是只堆更多完美成功轨迹。


6. ACT:Action Chunking with Transformers

ACT 是学习 VLA 前很值得掌握的机器人策略。它的核心不是语言,而是:

用 Transformer 根据当前观测预测未来一段动作

典型形式:

\[ \pi_\theta(o_t, s_t) \rightarrow a_{t:t+H} \]

其中:

  • \(o_t\) 是图像观测。
  • \(s_t\) 是机器人本体状态,例如关节角。
  • \(a_{t:t+H}\) 是未来 \(H\) 步动作。

ACT 常用行为克隆训练:

当前观测 -> 专家未来 H 步动作

6.1 ACT 解决什么问题?

如果模型每次只预测一步动作,就容易遇到:

  • 高频调用模型,推理延迟大。
  • 单步动作抖动。
  • 对长一点的接近、抓取、放置过程缺少整体感。

ACT 用 action chunking 一次预测未来多步:

观测 -> [动作1, 动作2, 动作3, ..., 动作H]

执行时可以只执行前几步,然后重新观察并预测下一段。这样既能保持闭环,又比每一步都调用大模型更平滑。

6.2 ACT 的整体结构

ACT 不只是“用了 Transformer”这么简单。原始 ACT 更接近一个 DETR 风格的 Transformer policy + Conditional VAE

先看整体数据流:

多相机图像 + 当前关节状态
视觉编码器 CNN/ResNet
视觉特征 token + 关节状态 token + latent z
Transformer policy
action queries
线性动作头
未来 H 步连续动作 chunk

更具体地说,ACT 的输入通常包括:

输入 作用
多个相机图像 看物体、手爪、接触位置和环境状态
当前机器人关节状态 \(q_t\) 告诉模型机器人自己在哪里
训练时的未来专家动作 chunk 只在训练 CVAE latent 时使用

输出通常是未来 \(H\) 步目标关节位置:

\[ \hat{a}_{t:t+H} = [\hat{a}_t,\hat{a}_{t+1},...,\hat{a}_{t+H}] \]

在 ALOHA/ACT 里,动作不是自然语言 token,也不是直接电机力矩,而是目标关节位置。真正驱动电机的仍然是底层 PID 控制器:

ACT 输出目标关节位置 -> PID 控制器跟踪目标 -> 电机运动

所以 ACT 是端到端从图像到动作,但不是直接把神经网络输出打到电机力矩上。

6.3 ACT 有没有用 ViT?

原始 ACT 通常不是 ViT 路线。它更常见的视觉前端是 CNN/ResNet:

图像 -> CNN/ResNet -> 视觉特征图 -> 视觉 token

ViT 的典型路线是:

图像 -> patch embedding -> ViT Transformer -> patch token

所以要分清:

问题 回答
ACT 里有没有 Transformer? 有,主要用在动作策略部分
原始 ACT 的视觉编码器一定是 ViT 吗? 不是,常见是 CNN/ResNet
能不能把 ACT 的视觉前端换成 ViT? 可以,后续变体或自己的实现可以这么做
ACT 的本质是不是 ViT? 不是,ACT 的本质是 action chunking + Transformer policy + CVAE

也就是说,ACT 不是:

ViT 直接输出动作

而更像:

CNN/ResNet 提视觉特征
Transformer policy 融合视觉和状态
action head 输出连续动作 chunk

6.4 DETR 的 object query 是什么?

理解 ACT 的 action query 前,先理解 DETR 的 object query。

传统目标检测通常先生成很多候选框,再筛选。DETR 换了一种做法:它放入一组可学习的 query,让每个 query 去图像特征里“询问”一个可能的物体。

直觉上:

object query 1: 图像里有没有第 1 个物体?在哪里?
object query 2: 图像里有没有第 2 个物体?在哪里?
object query 3: 图像里有没有第 3 个物体?在哪里?
...

这些 query 一开始没有具体语义,只是可学习向量。经过 Transformer decoder 的 cross-attention 后,它们会从图像特征里取信息。最后每个 query 输出:

类别 + 边界框

所以 object query 不是“文本问题”,而是神经网络里一组可学习的槽位:

每个槽位负责从图像特征里取出一个预测结果

6.5 ACT 的 action query 是什么?

ACT 借用了类似 DETR 的思想,只是 query 不再负责检测物体,而是负责预测未来动作。

可以把 action query 想成:

action query 1: 预测未来第 1 步动作
action query 2: 预测未来第 2 步动作
action query 3: 预测未来第 3 步动作
...
action query H: 预测未来第 H 步动作

Transformer 让这些 action queries 去 attend 当前视觉特征、当前关节状态和 latent z。每个 query 最后得到一个 hidden state:

hidden_1, hidden_2, ..., hidden_H

再经过线性层或 MLP 动作头:

hidden_1 -> action head -> a_t
hidden_2 -> action head -> a_{t+1}
...
hidden_H -> action head -> a_{t+H}

所以你可以说“动作由 Transformer 输出”,但更严格的说法是:

Transformer 输出每个未来时间步的 hidden state
action head 把 hidden state 映射成连续动作数值

也就是:

Transformer -> action hidden states -> Linear/MLP -> 连续动作 chunk

这和 LLM 输出文字 token 不一样。ACT 输出的是连续控制值,不是词表上的离散 token。

6.6 Conditional VAE 是什么?

ACT 还用了 Conditional VAE,简称 CVAE。这个部分一开始容易陌生,但它的动机很朴素:同一个观测下,人类专家可能有多种合理动作风格。

比如同样是插电池:

有人动作快一点
有人先停顿再插
有人从左侧微调
有人从右侧微调

如果只用普通 MSE 拟合,模型可能把这些风格平均掉。CVAE 引入一个 latent variable \(z\),用来表示动作序列里的隐含风格。

VAE 的基本结构是:

encoder: 数据 -> latent z
decoder: latent z -> 重建数据

Conditional VAE 多了一个条件:

encoder: 条件 + 目标数据 -> latent z
decoder: 条件 + latent z -> 预测目标数据

放到 ACT 里:

条件:当前图像和关节状态
目标数据:未来专家动作 chunk
latent z:这段动作的隐含风格

训练时,CVAE encoder 会看到未来专家动作 chunk:

当前关节状态 + 未来专家动作 chunk -> encoder -> z

然后 policy decoder 根据图像、当前状态和 \(z\) 预测动作 chunk:

图像 + 当前关节状态 + z -> Transformer policy -> 预测动作 chunk

推理时没有未来专家动作,所以 encoder 不能用。ACT 通常直接把 \(z\) 设成 prior 的均值,也就是 0:

推理时:z = 0

这意味着:训练时用 \(z\) 帮模型理解专家动作的变化;推理时用一个默认风格生成动作。

6.7 ACT 的训练和推理

训练样本可以写成:

\[ (I_t, q_t) \rightarrow a_{t:t+H} \]

其中:

  • \(I_t\) 是当前多相机图像。
  • \(q_t\) 是当前关节状态。
  • \(a_{t:t+H}\) 是未来专家动作 chunk。

训练流程:

1. 多相机图像进入 CNN/ResNet,得到视觉特征
2. 当前关节状态 q_t 进入 MLP,得到状态 embedding
3. q_t 和专家动作 chunk 进入 CVAE encoder,得到 latent z
4. 视觉特征、状态 embedding、z、action queries 进入 Transformer policy
5. 每个 action query 输出一个未来时间步的 hidden state
6. action head 把 hidden state 转成连续动作
7. 用动作重建 loss + KL loss 训练

损失可以粗略理解成:

\[ \mathcal{L} = \left\| \hat{a}_{t:t+H} - a_{t:t+H} \right\| + \beta D_{KL}(q(z|a,q) \| p(z)) \]

第一项让预测动作接近专家动作;第二项让 latent \(z\) 不要乱跑,保持接近标准高斯先验。

推理流程:

1. 读取当前图像和关节状态
2. 图像进入 CNN/ResNet,关节状态进入 MLP
3. 设置 z = 0
4. Transformer policy 一次预测未来 H 步动作
5. 执行动作 chunk 的前几步
6. 重新观察,再预测下一段

6.8 Temporal Ensembling 是什么?

ACT 还常配合 temporal ensembling,让动作更平滑。

如果每一帧都重新预测一个 chunk,那么同一个未来时刻会被多个 chunk 覆盖:

t 时刻预测:     a_t,   a_{t+1}, a_{t+2}
t+1 时刻预测:          a_{t+1}, a_{t+2}, a_{t+3}
t+2 时刻预测:                   a_{t+2}, a_{t+3}, a_{t+4}

例如 \(a_{t+2}\) 可能被 3 次预测到。Temporal ensembling 会把这些预测做加权平均,通常更相信最近的预测:

最终动作 = 多个 chunk 对同一时刻动作的加权平均

这样能减少动作跳变,让机器人执行更顺。

6.9 ACT 和 VLA 的关系

ACT 原始形式通常不是典型 VLA,因为它可以没有语言输入:

ACT: 图像 + 机器人状态 -> 动作 chunk
VLA: 图像 + 语言 + 机器人状态 -> 动作

但 ACT 很适合作为 VLA 前置知识,因为它教你理解:

  • 什么是 policy。
  • 图像怎么接到动作。
  • 为什么要预测 action chunk。
  • 为什么机器人策略要考虑执行频率和动作平滑。
  • Transformer 不只能生成文字,也能生成动作序列。

如果给 ACT 加上语言条件:

图像 + 语言 + 状态 -> action chunk

它就非常接近一个小型 VLA policy。

怎么定位 ACT

ACT 不是 VLA 的下位概念,也不是模仿学习的同义词。它是一个常用行为克隆训练的机器人策略架构,特别适合理解 action chunking。


7. Diffusion Policy:从回归动作到生成动作

Diffusion Policy 也是重要前置。它让你理解:机器人动作不一定要直接回归一个平均值,也可以把动作块当作要生成的数据。

普通行为克隆可能学成:

输入观测 -> 一个平均动作

Diffusion Policy 更像:

输入观测 -> 从动作分布里生成一条合理轨迹

为什么这有意义?因为同一个状态下可能有多种合理动作:

从左边绕过去抓
从右边绕过去抓
先抬高再下探
贴近桌面慢慢接近

如果用 MSE 直接回归,这些轨迹可能被平均成一条“不左不右”的坏轨迹。Diffusion Policy 能更自然地表示多峰动作分布。

更完整的 diffusion/flow 动作头可以看 动作表示与策略头


8. VLA:在机器人策略上加语言和大模型知识

VLA(Vision-Language-Action)可以看成把三块接起来:

视觉理解 + 语言理解 + 动作策略

典型形式:

\[ \pi_\theta(a_{t:t+H} \mid o_t, l, s_t) \]

其中:

  • \(o_t\) 是图像或视频。
  • \(l\) 是语言指令。
  • \(s_t\) 是机器人状态。
  • \(a_{t:t+H}\) 是要执行的动作或动作块。

VLA 和普通机器人策略的区别在于:它不只是根据图像做固定任务,而是让语言改变任务目标。

例如同一张桌面图像:

"拿红色方块" -> 抓红色方块
"拿蓝色方块" -> 抓蓝色方块
"把红色方块放进盒子" -> 抓取后移动到盒子

语言不是装饰,它应该真的改变动作。

8.1 VLA 一定用行为克隆吗?

不一定。VLA 是模型范式,不是训练方法。

但现实中,很多 VLA 的基础训练确实大量使用行为克隆,因为机器人数据通常是专家示范轨迹:

图像 + 指令 + 状态 -> 专家动作

之后还可以叠加:

  • 大规模视觉语言预训练。
  • 多机器人数据混合训练。
  • 离线强化学习。
  • 在线强化学习微调。
  • 人类偏好或成功率反馈。
  • 规划器生成的数据。

所以更准确的说法是:

VLA 常用行为克隆训练,但 VLA 不等于行为克隆。

9. 这些概念怎么排队学习?

如果目标是读懂 OpenVLA、RT-2、pi0、SmolVLA,可以按下面顺序:

顺序 学什么 学到什么程度
1 Policy / rollout / 闭环控制 能解释“观测到动作”和“执行后再观察”
2 模仿学习与行为克隆 能写出 \((o,l)\rightarrow a\) 的监督学习目标
3 分布偏移与 DAgger 能理解为什么离线 loss 低也会实机失败
4 机器人动作表示 能区分末端位姿、关节动作、夹爪、坐标系
5 ACT 能理解 action chunking 和 Transformer policy
6 Diffusion Policy 能理解为什么要生成动作分布
7 VLM 能理解图像和语言如何进入大模型
8 VLA 能理解 VLM 输出如何接动作头

对应到已有笔记:

主题 笔记
VLA 总览 VLA:视觉-语言-行动模型
VLM VLM 基础
动作表示、action chunk、diffusion/flow/FAST 动作表示与策略头
数据、行为克隆、训练与评估 数据、训练与评估
RT-1/RT-2/OpenVLA/pi0/SmolVLA 典型模型与论文路线
动手路线 实践路线

10. 最小概念清单

读 VLA 论文前,至少要能回答这些问题:

  • 什么是 policy?输入和输出分别是什么?
  • 什么是 rollout?为什么执行时的状态分布会变?
  • 模仿学习和行为克隆是什么关系?
  • 行为克隆为什么像监督学习?
  • 为什么行为克隆会有复合误差?
  • ACT 为什么要一次预测未来多步动作?
  • 原始 ACT 的视觉前端和 Transformer policy 分别做什么?
  • DETR 的 object query 和 ACT 的 action query 类比在哪里?
  • Conditional VAE 里的 latent \(z\) 表示什么,为什么推理时可以设成 0?
  • action chunk 长了和短了各有什么问题?
  • Diffusion Policy 为什么比普通 MSE 回归更适合多峰动作?
  • VLA 比普通视觉机器人策略多了什么?
  • 为什么 VLA 仍然需要底层控制器和安全层?

如果这些问题能说清楚,再读 OpenVLA、RT-2、pi0、SmolVLA 时就不会被名词带跑。


11. 一句话对照表

名词 一句话理解
Policy 从观测到动作的函数
Rollout 让策略真的执行,形成一条轨迹
模仿学习 从专家示范中学行为的一类方法
行为克隆 把模仿学习做成监督学习,直接拟合专家动作
DAgger 让专家纠正模型自己会遇到的状态
ACT 用 Transformer 预测未来动作块的机器人策略
DETR object query 用可学习 query 从图像特征里取出一个物体预测
ACT action query 用可学习 query 从观测特征里取出一个未来动作预测
Conditional VAE 在条件输入下,用 latent \(z\) 表示目标数据的隐含变化
Diffusion Policy 从噪声生成连续动作轨迹的策略
VLM 看图和读文字的模型
VLA 看图、读指令,并输出机器人动作的模型
动作头 把模型隐藏状态变成可执行动作的模块

12. 参考资料