8.4.1 早期融合、晚期融合与中间融合方式
在 VLA 中,“多模态融合”不仅仅是一个抽象概念,而是一个非常具体的工程设计问题:视觉、语言、机器人状态 / 动作这几路信息到底在什么阶段合在一起? 从时间位置来看,主流做法可以分为三类:早期融合(early fusion)、中间融合(intermediate / mid-level fusion)、晚期融合(late fusion)(arXiv)。三者各有优劣,并且已经在不同的 VLA 架构中得到应用。
【插图占位 8.4-1:一张流水线示意图,分别画出早期融合(原始模态直接拼接)、中间融合(各自编码后在特征层合并)、晚期融合(各自输出决策后再融合)的结构对比】
8.4.1.1 早期融合
定义: 早期融合是指在“输入阶段”就把各模态的数据合在一起,再交给统一的主干网络学习。例如:
- 将图像 patch token、语言 token、机器人状态 token 直接串联成一个长序列,送入同一个 Transformer;
- 或者在进入策略网络之前,先用一个 VLM(如 CLIP)对视觉与语言进行对齐,再将得到的联合视觉–语言特征 与动作 / 状态一起输入策略网络,这类专门强调“Early Fusion VLA”的工作已经出现(OpenReview)。
形式上可以理解为:
\[ \text{输入序列} = [\text{语言 token},\ \text{图像 patch token},\ \text{状态 / 历史 token}] \]
统一送入一个 Transformer,通过自注意力让所有模态在第一层 就开始交互。
优点:
- 细粒度对齐能力强。 例如“抓起碗左边的红色杯子”,语言 token 中的“红色杯子”“左边”,可以直接在自注意力中与对应图像 patch 建立紧密联系,有利于精准 grounding。
- 信息损失少。 由于在非常早的阶段就共同建模,模型可以自己决定保留什么细节、丢弃什么细节,而不是先分别压缩各模态后再合并。
- 对 VLM 预训练能力利用充分。 一些工作在 CLIP 之上做早期融合,将预训练好的图文对齐特征直接用于控制决策,而不是“晚点才考虑语言”(OpenReview)。
缺点与工程挑战:
- 维度高、计算重。 所有模态 token 放一起,自注意力复杂度是 \(O(n^2)\),视觉 patch 多时,对显存和算力要求很高。
- 对噪声敏感。 早期融合意味着低层表示就互相影响,视觉噪声、语言歧义都可能放大到整个网络。
- 训练更加“脆弱”。
如果机器人数据量不够大,很容易把预训练 VLM 学到的“通用知识”扰乱。实际工程中,常见做法是:
- 冻结大部分预训练视觉–语言编码器;
- 只训练少量适配层或策略头,或者采用参数高效微调(如 LoRA)。
在本书语境下,可以把早期融合看成**“极端端到端”** 的 VLA 设计:从最原始的多模态输入开始,就只交给一个统一的 Transformer 去学。
8.4.1.2 晚期融合
定义: 晚期融合(late fusion)是指先让每个模态(甚至每个模态自己的决策网络)各自算完,再在输出层或决策层做组合(arXiv)。在 VLA 中常见几种形式:
- 视觉–语言用一个现成的 VLM 做理解;
- 动作策略用另一个网络,仅接收“任务 embedding”或“检索结果”;
- 最终决策由一个小网络或手工规则,把“视觉–语言建议”和“低层控制建议”做加权或门控。
可以形式化为:
\[ \pi(a|o, x) = g\big(\pi_{\text{vision}}(o),\ \pi_{\text{language}}(x),\ \pi_{\text{state}}(s)\big) \]
其中 \(\displaystyle g\) 是一种融合函数,可以是简单加权平均,也可以是门控网络或 Mixture-of-Experts。
优点:
- 模块化强,易维护。 视觉–语言理解模块、策略模块可以相对独立演化。比如更新 VLM 到更大的版本,不一定要重训整套策略。
- 利用已有系统更方便。 工程中常见:保留已有的 SLAM、规划器或传统控制器,只用 VLA 模块提供“高层建议”,这本质上就是一种晚期融合。
- 训练稳定性好。 各模态先在自己的任务上得到较稳定的表示(例如 VLM 保持冻结),最终只微调一个小的融合 / 决策头,出错范围相对可控。
缺点:
- 跨模态细粒度交互能力弱。 如果视觉和语言各自“先压缩成一个向量”,再合并,模型很难在像素级精确理解“哪个杯子才是‘左边的红色杯子’”。
- 容易产生“决策割裂”。 视觉模块说 A 更重要,语言模块说 B 更重要,若融合函数设计不当,整体行为可能不稳定。
- 对 VLA 的统一性有限。 从理念上,晚期融合更接近“模块堆叠”,而不是一个真正统一的“视觉–语言–动作基础模型”。
晚期融合在机器人系统整合阶段非常常见,在第 10 章中讨论“VLA 与传统规划 / 控制模块”接口时,可以与这里形成呼应。
8.4.1.3 中间融合
定义: 中间融合(mid-level / intermediate fusion)介于二者之间:先为每种模态提取中层特征,再通过特征级别的交互模块(往往是 cross-attention 或特征拼接)进行融合(arXiv)。 典型做法是:
- 视觉 backbone(CNN/ViT)将图像映射为一组视觉 token;
- 语言编码器(LLM 或小型 Transformer)将指令映射为一组语言 token 或一个全局 embedding;
- 再用专门的多模态 Transformer / cross-attention 层,将二者、中加机器人状态 token 在中层 融合,最后输出动作。
许多代表性的 VLM/VLA(如 Flamingo、PaLI-X 及在其基础上扩展的 RoboFlamingo、RT-2、OpenVLA 等)都属于此类结构:视觉、语言分别有自己的 encoder,然后在若干层 cross-attention 模块中交互(CVF开放获取)。
中间融合的特点:
- 保留每个模态的“专业 backbone”。 可以直接复用 ImageNet / 自监督预训练视觉模型,和通用语言模型,不必从头端到端训练。
- 融合层承担“任务对齐”的角色。 中间的 cross-attention / 特征拼接层负责把视觉、语言、动作历史等映射到对决策友好的公共空间。
- 在表达能力与工程复杂度之间折中。 相比早期融合,序列长度与相互影响范围更可控;相比晚期融合,又能实现更细粒度的跨模态信息流动。
在实践中,多数 VLA 系统采用“中间融合 + 局部早期 / 晚期融合”的混合结构:例如在视觉内部多尺度早期融合不同传感器,在输出层再做一点晚期融合(如安全过滤),而核心策略部分仍然是中间融合。
【插图占位 8.4-2:典型 VLA 中间融合结构示意图。图像通过 ViT 得到 patch token,语言通过 Transformer 得到 token,状态 / 历史为若干额外 token,中间一个 Cross-Attention Transformer 将所有 token 交互,输出动作 token】
8.4.2 Cross-Attention 在 VLA 中的角色
在第 2 章我们已经介绍了自注意力(self-attention),Cross-Attention 可以看作“查询来自一方,键 / 值来自另一方”的注意力,是多模态模型最常用的“胶水”。当前大量 VLM / VLA 使用 cross-attention 将视觉、语言、动作串联起来(arXiv),例如 RT-2、VLA-Grasp 等都采用了基于 cross-attention 的多模态 Transformer(Embodied AI in Robotics)。
8.4.2.1 语言引导注意力
在 VLA 中,一个非常重要的模式是:“语言作为 Query,引导模型在视觉 / 状态空间中寻找与任务相关的部分。”
具体来说:
-
语言编码器输出一组语言 token \(({l_i})\);
-
视觉编码器输出一组图像 patch token \(({v_j})\);
-
在 cross-attention 中,以语言 token 为 Query,视觉 token 为 Key/Value:
\[ \text{Attn}(L,V) = \text{softmax}\big(\frac{Q_L K_V^\top}{\sqrt{d}}\big) V_V \]
这样每个语言 token 会“指向”与其语义相关的图像区域。
直观理解:
- “红色杯子”这个 token,会给那些呈现红色圆柱形物体的 patch 更高权重;
- “在碗左边的”会让注意力分布偏向图像左侧相关区域;
- 机器人状态 token(如末端位姿)也可以被语言 token 查询,用于回答“已经抓住了吗?”这类隐式问题。
RT-2 这类大规模 VLA 将视觉 token、语言 token 和离散动作 token 一起放在 Transformer 中,通过 cross-attention 让语言指令在视觉 patch 上选择与任务相关的区域,从而实现复杂的指令执行(Embodied AI in Robotics)。
【插图占位 8.4-3:Cross-Attention 可视化图。左边是图像上高亮的注意力热力图(红色杯子区域被高亮),右边是一句指令的词向量,箭头表示“红色杯子”“左边”等词 Query 到图像 patch 的注意力连接】
8.4.2.2 多模态交互
Cross-attention 不一定总是“语言查视觉”,在 VLA 中常见几种交互方向:
- 动作解码器 Query 视觉 + 语言。
- 把“历史动作 token + 语言 token + 状态 token”输入一个解码器;
- 解码器通过 cross-attention 查询视觉特征,得到用于下一步动作预测的上下文;
- 这种模式类似机器翻译中的 Encoder–Decoder 架构,只不过这里的“源语言”是视觉 / 状态。
- 视觉 Query 语言(反向引导)。
- 有时希望视觉特征根据语言“重构”或“筛选”自身,例如只保留与当前指令相关的物体特征;
- 这可以通过视觉 token Query 语言 token,实现“从指令中抽取与当前 patch 相关的语义”。
- 三模态交互:视觉–语言–动作。
- 部分 VLA(如 VLA-Grasp 等)显式为视觉、语言、候选动作建立多通道编码器,再用多层 cross-attention 互相查询,以捕获三者之间的内在联系(SpringerLink);
- 例如针对不同候选抓取姿态,分别计算“该动作与当前视觉–语言任务的匹配程度”,从而选出更合理的动作。
从信息流角度看,cross-attention 提供了一个可控的“信息输送通道”:
- 谁是 Query,谁就有“提问权”;
- 通过不同方向的 cross-attention,可以有选择地把信息从一个模态灌输到另一个模态。
8.4.2.3 实现细节
在工程上,Cross-Attention 在 VLA 中的落地细节主要体现在以下几个方面:
- 插入位置与层数设计。
- 常见做法是在 Transformer block 中,将自注意力扩展为两段: 1)对解码器内部 token 做 self-attention; 2)再对编码器输出(视觉 / 语言)做 cross-attention;
- 对于“统一 Transformer”架构,也可以在部分层中专门使用 cross-attention,在其他层继续使用 self-attention,从而控制不同层的模态交互强度(arXiv)。
- 模态类型编码(type embedding)。
- 为视觉 token、语言 token、状态 / 动作 token 添加不同的“模态 ID embedding”,帮助网络区分信息来源;
- 在 cross-attention 中往往保留这些模态 embedding,使网络学习到“对不同模态应该采用不同的查询策略”。
- 尺度与下采样。
- 如果直接用全部视觉 patch 做 Key/Value,成本过高,因此多数系统会在视觉侧做下采样或压缩,例如:
- 使用 [CLS] 或若干 pooled token;
- 使用稀疏注意力,只保留最有信息的 patch;
- 采用 FPN/多尺度金字塔,只在部分尺度上做 cross-attention。
- 如果直接用全部视觉 patch 做 Key/Value,成本过高,因此多数系统会在视觉侧做下采样或压缩,例如:
- 参数与训练策略。
- 实践中,往往会冻结视觉–语言 backbone,只训练 cross-attention 和策略头,以保护预训练知识,一些“知识隔离(knowledge insulating)”的工作更系统地研究了这一点(physicalintelligence.company);
- 对 cross-attention 层使用比 backbone 更小的学习率,或采用分层学习率,减少训练初期的“剧烈破坏”。
- 复杂度与实时性权衡。
- Cross-attention 的复杂度是 \(O(T_Q \cdot T_K)\)。在机器人应用中,往往控制 Query 长度(例如只用少数动作 token 作为 Query),并压缩 Key/Value,确保在目标控制频率下可以实时运行。
这些实现细节与第 10 章中“在线推理与部署”的实时性要求有关,设计 cross-attention 时需要兼顾表达能力与计算开销。
8.4.3 使用语言作为条件(instruction-conditioning)
前面第 4.4 节讨论了“语言作为任务描述、约束和解释”的角色,本节进一步聚焦在**“如何把语言指令形式化为 VLA 模型的条件”** 上——也就是所谓的 instruction-conditioned policy。 许多研究已经证明,将机器人策略显式地条件化在自然语言指令上,可以得到可泛化、可重用的控制策略(NeurIPS 会议论文集)。
8.4.3.1 条件编码
第一步是把自然语言指令 \(\displaystyle x\) 编码为模型可用的“条件表示”。典型做法包括:
- 全局指令向量(sentence embedding)。
- 使用语言编码器(如 BERT、轻量 Transformer 或大型 LLM 的编码部分)对整句指令编码,得到一个向量 \(c \in \mathbb{R}^d\);
- 这个向量可以看作“任务 ID 的连续版本”,比手工 one-hot 任务标签表达更丰富的语义(NeurIPS 会议论文集)。
- 指令 token 序列。
- 直接保留子词级 token 序列 \(({l_i})\),供 Transformer 进一步处理;
- 与视觉 token、动作 token 串联或通过 cross-attention 交互,可以实现更精细的对齐(如“最大杯子”“最右边的物体”)。
- 前缀 / 提示(prompt)形式。
- 在统一 Transformer 中,可以将语言 token 放在序列开头,作为“prompt”;
- 后续的视觉 / 动作 token 在自注意力中,可以随时读取这个 prompt 的信息。
- 特征调制(Feature-wise conditioning)。
-
使用类似 FiLM(Feature-wise Linear Modulation)的方式:
\[ h’ = \gamma(c) \odot h + \beta(c) \]
其中 \(h\) 是视觉或状态特征,\(\gamma(c),\beta(c)\) 由指令向量生成,用于对特征进行按通道缩放和偏移;
-
直观理解为“指令决定网络的工作模式”,例如“收拾桌面”模式、“分类整理”模式等(clip-rt.github.io)。
-
无论采用哪种方式,目标都是构造一个**“语义条件”**,能够在不同任务之间平滑插值:
- “把红杯子放进盒子”和“把蓝杯子放进盒子”对应的条件向量应该“相近”;
- “打开抽屉”和“关上抽屉”既有相似部分(对象是抽屉),又在动作方向上有明显差异。
8.4.3.2 控制方法
有了“条件编码”之后,下一步是让语言条件真正影响策略 。这里可以理解为“如何在网络内部给语言一个有效的控制通道”:
- 输入级控制:拼接 / 加和。
-
最简单的方式是把指令向量 \(\displaystyle c\) 与其他模态特征直接拼接,或在输入层相加:
\[ z_0 = [c,\ v,\ s,\ \text{history}] \]
-
或者对每个视觉 / 状态 token 都加上同一个条件向量(广播),使整个网络在“有条件”的空间中工作。
-
- 门控与加权(gating)。
-
使用语言条件输出门控系数,控制不同子策略或专家网络的权重:
\[ \pi(a|o,x) = \sum_k \alpha_k(x),\pi_k(a|o) \]
-
在多任务、多 robot 的 VLA 中,常见“语言 + robot ID”双门控的 Mixture-of-Experts 结构,用以在联邦场景下共享部分参数,同时根据指令和平台自动选择专家(CVF开放获取)。
-
- Cross-Attention 级控制。
- 如前节所述,让动作解码器在 cross-attention 中以“语言 + 历史动作 token”为 Query,对视觉特征进行选择性检索;
- 指令的不同部分会导致注意力模式变化,从而显式地改变策略关注的视觉区域。
- 层级控制(高层语言 + 低层动作)。
- 一些工作将语言用于高层策略:先由语言模型或语言条件策略输出一个子任务序列 或“skill ID”,再由每个 skill 对应的低层策略负责具体控制;
- 这种“语言 → 动作原语”层级结构,会在第 6.3 和第 11 章“动作原语与层级策略”部分进一步展开。
从控制角度看,instruction-conditioning 实际是在做一种“条件化策略 \(\pi(a|s,x)\)”,其中 \(x\) 不再是一个离散任务索引,而是一个包含丰富语义的自然语言向量。
8.4.3.3 多任务场景
在多任务、多环境的 VLA 系统中,语言条件发挥的作用尤为关键(hulc.cs.uni-freiburg.de):
- 用语言统一表示任务。
- 传统多任务 RL 或 IL 往往为每个任务分配一个整数 ID 或 one-hot 编码;
- 语言条件则将任务描述提升为自然语言空间,例如:
- “把桌面上的所有杯子收集到托盘中”;
- “只整理蓝色的物体”;
- 这样模型在训练时就学习到“不同任务之间的相似性”,而不是完全独立的标签。
- 长尾任务和零样本任务。
- 对于训练数据中只出现少数样本的长尾任务,通过共享语言空间,模型可以从其他相似指令中迁移知识;
- 在极端情况下,即使从未见过某个具体指令,只要其语义可以用已知词汇组合表达,模型也可能进行零样本推理和执行(zero-shot instruction following)。
- 多机器人、多环境共享策略。
- 在 Open X-Embodiment 这类跨机器人多任务数据集上,语言指令不仅描述任务,还往往隐含环境信息(“厨房中把盘子放到架子上” vs “实验台上整理试管”);
- 结合第 8.5.2 节的“多机器人共享策略”,语言条件可以与“embodiment encoding(机器人 ID / 描述)”组合,形成在不同机器人、不同场景下的统一策略表示。
- 与反馈 / 偏好学习结合。
- 在 RLHF 或人类偏好标注场景中,语言不仅作为任务输入,还可以作为反馈通道(例如人类用语言指出“不够小心”“动作太快”)(MDPI);
- VLA 模型可以同时条件化在“任务指令 + 风格 / 安全偏好”,实现更细致的人机协同。
【插图占位 8.4-4:二维 embedding 可视化图,展示不同语言指令在条件空间中的分布,同一类任务(如收拾桌面)聚成簇,不同任务簇之间有一定距离】
8.4.4 历史动作 / 状态作为上下文的编码方式
现实机器人任务往往是部分可观测的长时序过程:
- 单帧图像看不出“这个抽屉是被我刚刚打开过,还是原来就开着”;
- 单次力觉读数也难判断“这是刚接触到物体,还是已经推了很久”。
因此,VLA 模型通常需要将历史观察与历史动作 纳入上下文,学习策略 \(\pi(a_t | o_{\le t}, a_{< t}, x)\)。近年来大量基于 Transformer / SSM 的机器人策略都探索了如何编码历史序列(NeurIPS 会议论文)。
8.4.4.1 序列串联
最直接的方式,就是把过去若干步的观察–动作对直接作为更长的输入序列,交给 Transformer 处理:
\[ \underbrace{[x]}_{\text{指令}} ,;, \underbrace{[o_{t-K}, a_{t-K}, \dots, o_{t-1}, a_{t-1}, o_t]}_{\text{历史 + 当前}} \rightarrow \text{Transformer} \rightarrow a_t \]
实现上的常见选择:
- 每个时刻 \(t’\) 的观察 \(o_{t’}\)(图像 + 状态)编码为若干 token;
- 动作 \(a_{t’}\)(离散或离散化后的关节命令)编码为一个或多个 action token;
- 然后将这些 token 按时间顺序串联,送入 Transformer 解码器或统一 Transformer。
相关工作表明,这种“简单串联 + 位置编码”的方式,在多任务策略学习中相当有效,如 BAKU 等工作会把一段观察历史一起输入 Transformer,用以预测下一步动作(NeurIPS 会议论文)。
优点:
- 架构非常统一,与第 2 章中的序列建模完全一致;
- 不需要 hand-crafted 特征,只要定义好每个时刻的编码方式即可;
- 对于中等长度任务(几十步到上百步)已经足够。
缺点:
- 序列长度随历史窗口线性增长,很快达到上百甚至上千 token,计算和显存压力激增;
- 长期依赖依然难以完全捕获,模型可能只利用最近几步信息。
在工程实践中,序列串联通常与“滑动窗口”和“时间编码”结合使用(见本节后两小节)。
【插图占位 8.4-5:时间轴示意图,将过去 K 步的图像+动作拼成 token 序列输入 Transformer,箭头指向当前时刻动作输出】
8.4.4.2 时间编码
为了让模型区分“哪一步更早、哪一步更近”,必须显式或隐式地引入时间信息 。在第 2.4.3 节介绍位置编码时我们已经看到,位置编码本质上就是一种时间标记,这里在 VLA 语境下强调几个实践要点:
- 绝对时间步编码。
-
为每个 token 加上一个表示其时间步的 embedding(如 sinusoidal 或可学习位置编码):
\[ h_{t’}^{(0)} = \text{Embed}(o_{t’}) + p(t’) \]
-
这样模型可以“知道”哪些是最近的观察、哪些是更久之前的观察。
-
- 相对时间 / 时间间隔编码。
- 有些任务中,动作间的时间间隔并不一致,需要编码“delta time”;
- 可以为每个时刻增加一个额外的“时间间隔 token”或把时间差作为数值特征拼接。
- token 类型编码。
- 除了时间,还需要区分“语言 token / 视觉 token / 动作 token / 历史摘要 token”等,常用type embedding 来实现;
- 在一些 history-aware 的策略中,会为“历史 token”和“当前 token”使用不同的类型 embedding,帮助网络在注意力中重点关注最近几步(arXiv)。
- 压缩历史的时间编码。
- 对于非常长的轨迹,不可能保留全部细节,部分工作会先将历史通过对象跟踪、点轨迹(point tracking)等方式压缩成少量“历史 token”,再给这些 token 添加时间或顺序编码(arXiv);
- 这可以理解为“对时间维做一次降维”,详见第 12 章世界模型与记忆部分的讨论。
在设计时间编码时,应与动作离散化、控制频率相协调:例如控制频率较高时,更需要精细的时间表示;频率较低时,则可以把若干步合并视为一个“宏步长”。
8.4.4.3 滑动窗口与记忆
单纯增加历史步数会迅速推高复杂度,因此实践中常结合滑动窗口(sliding window) 和记忆(memory)机制,在“保留必要历史信息”和“控制计算成本”之间做折中(arXiv)。
- 滑动窗口:只看最近 \(\displaystyle K\) 步。
- 设定一个窗口长度 \(\displaystyle K\),模型每一步只接收最近 \(\displaystyle K\) 步的观察–动作历史,其余更久的历史被丢弃;
- 对于很多桌面操作、短程导航任务,几步到几十步的窗口就足够;
- 优点是实现简单,与序列串联方式直接兼容;缺点是无法捕获“极长时间跨度”的依赖(如几分钟之前做过的准备工作)。
- 显式记忆单元:压缩历史。
-
为模型引入一个“记忆向量”或“记忆 token”,在每个时间步根据当前观察 / 动作和之前记忆更新:
\[ m_t = f(m_{t-1}, o_t, a_{t-1}) \]
-
一些工作采用 RNN、LSTM、Transformer-XL 样式的记忆;更多近期方法使用状态空间模型(SSM)或 Mamba 这类结构,将整条历史轨迹编码为一个压缩隐状态,用于条件化当前动作预测(arXiv);
-
这样可以在计算复杂度可控的前提下利用更长的历史。
-
- 分层记忆:短期窗口 + 长期记忆。
- 短期内使用滑动窗口(例如最近 10 步)保留细节;
- 长期则通过记忆模块存储更加抽象的信息,如“抽屉已经打开”“那只杯子已经被放进盒子里”等;
- 在世界模型或长序列 VLA 中,这种“局部细节 + 全局摘要”的模式越来越普遍,也是未来统一具身基础模型的重要方向之一。
- 历史与指令的联合建模。
- 在指令导向的历史感知策略中,还会将语言指令和历史一起写入记忆,形成“instruction-oriented memory”,例如 History-aware multimodal instruction-oriented policies 这类工作(MDPI);
- 这使得模型可以理解“我之前执行的是哪个子指令、现在到了哪一步”,为长任务分解和进度跟踪提供基础。
【插图占位 8.4-6:一张时间轴+滑动窗口+记忆示意图。时间轴上标出一长串时刻,窗口覆盖最近 K 步,窗口前的历史被压缩为一个“Memory token”,在当前决策时既读窗口内 token,也读 Memory token】
本节从融合时机(早/中/晚) 、cross-attention 的具体角色 、语言条件化策略 和历史序列编码 四个维度,补足了 VLA 在“多模态融合与条件建模”层面的核心设计要素。后续 8.5 节会以完整架构为例,把这些组件组合起来,形成贯通视觉–语言–动作的统一 Transformer 视角,与第 9 章的训练范式共同构成一个从“架构设计”到“数据与优化”的完整闭环。