枢纽
机器人OpenX 本体
数据集Open X-Embodiment + 自采
上真机
实时
输入模态vision,language,proprioception

CogACT:把「认知」和「动作」分开——给 VLM 配一个 DiT「运动皮层」

Qixiu Li, Yaobo Liang, Zeyu Wang 等(清华 + MSR Asia + USTC + 中科院微电子所)。arXiv:2411.19650(2024-11)。 项目页 · 代码/模型开源 · foundation_modelsVLAdiffusion action headcomponentized

🧠 一句话心智模型:以前的 VLA 是「一个模型干所有事」——把动作粗暴量化成 token,逼 VLM 像说话一样吐动作。CogACT 借鉴人脑:视觉皮层 + 语言皮层 + 运动皮层是分开的。它把 VLM 当「认知皮层」负责看懂+理解指令,再外挂一个专门的 diffusion transformer 当「运动皮层」,由认知特征做条件去生成多步连续动作。一拆分,VLM 的语义泛化 + 扩散模型的多模态精度全都要

🎯 为什么重要:「直接复用 VLM 做动作」是有原罪的

大 VLA 的卖点:用互联网预训练的 VLM 当骨干,自带视觉语义泛化。但实际把 VLM 接到机器人上时,主流做法很粗暴:

旧做法具体操作问题
动作量化(RT-2, OpenVLA)把 7D 连续动作离散成 bin,当成下一个 token 让 VLM 自回归预测不像图像/音频有专门 tokenizer,动作的「简单量化」丢精度、损失信息;自回归单步预测
回归头(RoboFlamingo + LSTM)VLM 输出过 LSTM/MSE 回归出动作忽略动作的多模态性——同一观察下可能有多种合理动作,回归会平均成四不像
小 diffusion 头(Octo)transformer 骨干 + 3M 参数的微型 diffusion headhead 太小,学不到精确动作分布;且没用上 VLM 的互联网预训练
核心矛盾:动作跟语言是本质不同的模态——连续、多模态、时间相关、要求高精度。把动作硬塞进「下一个 token 预测」的语言范式里,等于用错了工具。要么丢精度(量化)、丢多模态(回归)、丢容量(小 head)。

CogACT 的破法:把认知和动作彻底解耦。VLM 专注认知(看图、懂指令、推理),把它的输出当条件,送给一个专门的 diffusion transformer 去生成动作。这个动作模块可以是「大」的——最大 308M 参数(虽然跟 VLM 的 7B 比小,但对 7D 动作空间已经很大了)。

💡 核心思想:组件化三件套——视觉、语言、动作各司其职

视觉模块 DINOv2 + SigLIP → 视觉感知 token V 256 个 token 语言指令 "move spoon to... 语言模块(认知) LLaMA-2(VLM 骨干) 视觉 token + 语言 token + 可学习 [cognition] token → cognition feature f_c Diffusion Action Module(运动) DiT-Base(89M)/ Large(308M) f_c 做条件 + 噪声动作 chunk → 多步去噪 → (a_t, ..., a_{t+N}) N=15 future steps 动作序列 7D × N+1 步 Adaptive Action Ensemble 当前 + 历史预测,按相似度加权融合 三件套解耦:认知(VLM)专注语义,DiT 专注连续多模动作,AAE 专注时序融合
图 1:CogACT 的组件化架构。VLM(视觉+语言)抽出 cognition feature,作为 DiT 动作模块的条件;DiT 输出多步动作,AAE 在推理时融合历史预测。

三个互相支撑的设计:
① Cognition token 当桥梁——LLaMA-2 处理「视觉 token + 语言 token + 一个可学习的 [cognition] token」,最后这个 token 对应的输出特征 $f_c$ 编码了「当前该做什么动作」的语义,作为 DiT 的条件。
② DiT 多步动作扩散——输入 $f_c$ + 噪声动作 chunk $(a_t^i, ..., a_{t+N}^i)$,预测噪声;多步(N=15)一起预测保证时序一致。不是单步回归,而是真正建模动作分布。
③ Adaptive Action Ensemble——推理时,当前观察和过去 K 个观察都为「当前时刻 t」生成过预测。AAE 按余弦相似度自适应加权:$\hat a_t = \sum_k w_k \cdot a_t|o_{t-k}$,$w_k = \exp(\alpha\langle a_t|o_t, a_t|o_{t-k}\rangle)$。避免「把不同模态的动作硬平均成四不像」。

🛠️ 怎么做:组件 + 训练 + 推理三件套

组件设计关键决定
视觉编码DINOv2 + SigLIP 双流;特征图通道维拼接 → 线性投影 → 256 个视觉 token两条路径互补:DINOv2 强自监督特征 + SigLIP 强语义对齐
语言模块Prismatic VLM(LLaMA-2 + DINOv2/SigLIP,7B);端接 cognition token从 OpenVLA 同源预训练权重初始化
动作 DiTDiT-Small(13M)/ Base(89M)/ Large(308M);context 长度 N+2=17$f_c$ 与噪声动作共同作为输入 token 拼接送入 transformer(自注意力实现条件化);扩散步 i 加正弦位置编码到 $f_c$
训练目标标准 diffusion MSE:$L=\mathbb{E}\|\hat\epsilon_i - \epsilon\|^2$;视觉+语言+动作端到端训练不是冻结 VLM,而是三件套一起 fine-tune
训练数据OXE 数据集 25 个子集(22.5M 帧);不用 Language Table / DROID(分布差异大)跟 Octo / OpenVLA 用几乎相同的子集,确保公平对比
训练规模batch 256,8 diffusion steps,LR 2e-5,135k iter,16×A100,5 天,PyTorch FSDP8 步扩散(训练时)+ DDIM 10 步(推理)
推理DDIM 10 步采样 + classifier-free guidance(CFG=1.5)+ AAE 时序融合CFG 1.5 在 1.0 和 3.0 之间取得最好折中
AAE 窗口 K自适应:$K \times \text{std}(a)$ 跨数据集保持恒定(C=0.2)不同机器人/控制频率下「窗口跨度」一致,需要时变 K
🔮 直觉:为什么「DiT 动作头」+「多步预测」效果这么显著?
三个原因叠加:(1) 多模态动作——同一观察下可以有多种合理轨迹,扩散天然能建模分布,回归会平均;(2) 多步时序——预测未来 15 步而不是 1 步,模型被迫学「这一步对未来的影响」,时序一致;(3) 专门容量——308M 给到 7D 动作空间,相当于「每个自由度 4千万参数」,足够精细。论文消融:DiT-Large 比 MLP(3 层)多 14 个百分点(64.8% vs 50.6%)。

📊 结果:超越 OpenVLA +35%(仿真)/ +55%(真机);超 RT-2-X 55B +18%

仿真(SIMPLER,Google Robot / WidowX)

方法GR Visual MatchGR Variant Agg.WidowX VM说明
RT-1(仅 GR 训练)52.443.7基线
RT-1-X42.430.21.1OXE 训练
RT-2-X(55B)46.354.4大模型但量化动作
Octo-Base11.01.217.53M 小 diffusion head
OpenVLA(7B)34.339.34.2同 size 主竞品
CogACT(7.6B)74.861.351.3全面碾压

真机(Realman Robot,3 任务 / 多物体)

方法Pick(avg 3 obj)Stack(avg 2 obj)Place(avg 2 步)总平均
Octo-Base8.30.06.34.9
OpenVLA8.315.612.512.1
CogACT70.882.360.471.2

真机泛化(Realman,未见场景)

泛化维度OpenVLACogACT
未见桌子 + 未见干扰物9.758.4
未见颜色 / 形状 / 类别6.364.6
Franka 机器人(Close/Open Oven, Pick Bowl/Brush)6.861.4

消融研究

维度对比结论
动作模块架构MLP-3L(50.6%)→ MLP-7L(52.5%)→ DiT-Small(58.5%)→ DiT-Base(62.5%)→ DiT-Large(64.8%)同等参数下 Transformer 显著优于 MLP;log(参数) 与成功率近似线性
多步预测 NN=0(42.8%)/ N=3(55.5%)/ N=15(62.5%) / N=31(51.2%)N=15 最优;太短欠规划,太长过拟合
推理融合策略Action Chunking(50.7%)/ Temporal Ensemble(58.9%)/ Adaptive Ensemble(62.5%)相似度加权避免跨模态平均
CFG scale1.0(55.7%)/ 1.5(62.5%) / 3.0(62.7%)CFG 1.5 已基本饱和,3.0 增益甚微
核心数字提升
vs OpenVLA(7B,size 相当)仿真 +35%、真机 +55%
vs RT-2-X(55B)仿真 +18% 绝对
真机未见场景vs OpenVLA:未见桌+干扰物 +48.7、未见颜色/形状 +58.3
跨本体(Franka)4 任务平均 61.4%(OpenVLA 6.8%)
关键洞察:CogACT 的胜利是「组件化」+「专门动作模块」的胜利。同 size(7B vs 7B)、同数据(OXE)、同预训练(Prismatic)下,仅靠「把动作头从『量化 token』换成『大型 DiT』」,仿真 +35%、真机 +55%。这说明:动作怎么表示,比 VLM 多大、数据多少更关键(在一定规模之后)。

🌐 在领域中的位置

RT-2 / OpenVLA(量化动作 token) Octo(小 diffusion head) CogACT(大型 DiT 动作头 + 组件化)⭐ π0 / π0.5(flow matching 动作专家)

CogACT 是VLA 「组件化」路线的代表作。它把「VLM 当认知骨干 + 扩散当动作头」这个范式做扎实、做完整,并给出明确的规模曲线(log-size 线性)。这之后,π0、LAPCosmos 3 都继承了「专门动作头」这一思路——只是动作头换成了 flow matching。关联线索:与 Diffusion Policy(扩散做动作的鼻祖)、Octo(小型 diffusion head)形成对照。

❓ 常见误区

把 VLM 接上 diffusion head 听起来不复杂,为什么以前没人这样做?

其实有——Octo 就接了 diffusion head,但只有 3M 参数,太小。CogACT 的关键洞察是「动作头也要够大」。论文规模实验:DiT-Large(308M)比 MLP-3L(3M,类似 Octo)多 14 个百分点。原因是「连续、多模、时间相关、高精度」这四件事要同时建模,需要真正的容量。Octo 的 head 只能学到粗糙分布。

308M 相比 7B VLM 还是太小啊,怎么够?

论文 §1 脚注直接讨论了这点:7D 动作空间相比语言(词表 32000+)、图像(H×W×3)维度极低。给 7D 配 308M 参数,相当于「每维 4千万参数」,密度其实非常高。所以这个「小」是相对的——相对 VLM 小,相对动作任务的内在维度已经很大。这也是论文 favorable scaling 的来源。

Adaptive Action Ensemble 看起来很简单,真的有用吗?

实测有用。对比 ACT 原文的 Temporal Ensemble,AAE 在 GR-VM 上从 75.0% 变为 74.8%(基本持平),但 GR-VA 上从 59.9% 提升到 61.3%,WR-VM 从 41.9% 提升到 51.3%(多 9.4 个点)。直觉:动作可以属于不同模态,硬平均会落入「模态之间」的无效动作;按相似度加权,只融合相似预测,避免跨模态污染。公式只多了个 $\exp(\alpha\langle\cdot,\cdot\rangle)$,极简但有效。

N=15 步是不是太多了?真机控制频率跟得上吗?

15 步是训练时的预测步数(学一个动作 chunk),不是「执行 15 步才重新规划」。推理时每帧都会重新预测,AAE 把当前预测和历史预测融合。这个设计与 ACT、Diffusion Policy 的 receding horizon 一致。消融显示 N=15 是甜点:N=3 太短(55.5%),N=31 反而过拟合(51.2%)。

「组件化」跟端到端有矛盾吗?还是端到端训练的?

是端到端训练的——视觉、语言、动作三个模块的参数一起更新。组件化是指架构分工(每个模块有专门职责),不是「冻结分别训练」。论文明确说三个模块端到端 finetune。这种「架构上解耦、训练上联合」是现在的常见模式,参考 π0.5 的「knowledge insulation」、LAP 的「VLM + action expert 联合训练」。

CogACT 跟 π0 / LAP 比,谁的动作头设计更好?

CogACT 用 diffusion(DDPM 范式),π0/LAP 用 flow matching(更线性、推理快)。后者是更新一代。但 CogACT 的核心贡献不在「diffusion vs flow」,而在「把动作头做大、做专门」这一架构选择——这个选择被后续所有工作继承。可以把它看作「扩散动作头路线」的奠基之作。