目录
- 引言
- 1. 机器人大模型面临的挑战
- 2. 目前的数据集
- 2.1 RT-1
- 2.2 Open X-Embedding
- 2.3 DROID
- 3. 目前的VLA模型
- 3.1 Goat
- 3.2 RT-1
- 3.2.1 总体架构
- 3.2.2 效果
- 3.3 RT-2
- 3.3.1 总体架构
- 3.3.2 效果
- 3.4 RT-X
- 3.4.1 模型效果
- 1). RT-1-X
- 2). RT-2-X
- 3.5 RT-H
- 3.5.1 总体架构
- 3.5.2 效果
- 3.6 OpenVLA
- 3.6.1 总体架构
- 3.6.2 效果
- 3.7 π 0 \pi_0 π0
- 3.7.1 总体架构
- 3.7.2 实现效果
- 3.8 RD-T
- 3.7.1 总体架构
- 3.7.2 效果
- 总结与展望
引言
在确定性且单一任务的机器人应用场景中,预先规划的策略与路径常能取得较好的效果。然而,当面对开放式、多样化的操作环境(如叠衣服、取物、整理等日常人类操作任务),传统的机器人控制方法便显得捉襟见肘。如何让机器人具备在不确定与复杂环境中自主学习与决策的能力,成为当前机器人研究的前沿课题。
随着以ChatGPT为代表的大语言模型(LLM)在生成式内容上的爆发式发展,人们开始思考如何将类似LLM的知识与决策能力拓展到物理世界中。这便引出了“具身智能”(Embodied Intelligence)的概念:将强大的大模型视为“大脑”,并为其配备感知、运动等实际交互能力(如机械臂、传感器和运动系统的集成),以实现智能体在真实世界中的自主行为和任务执行。
若能赋予ChatGPT这类模型以“肢体”,让其直接与物理世界互动,则有望将其强大的泛化与理解能力落实到真实操作任务中,实现真正的智能机器人系统。
1. 机器人大模型面临的挑战
-
数据缺乏与收集困难:
获取真实世界中的机器人操作数据成本高昂(如远程操控及复杂标注),对每一类任务往往需要大量多样化的数据,收集难度大。 -
模拟与真实的差距(Sim2Real Gap):
虽然仿真环境可用于数据采集与模型训练,但模拟世界与现实世界在物理特性、视觉呈现和交互反馈上仍存在较大偏差,使得直接将仿真学到的策略迁移到真实环境中并非易事。 -
多种具身形态的适配问题:
机器人形态各异,不同的机械臂末端执行器、传感器类型、动作空间等差异导致同样的策略不一定适用于不同设备。 -
策略多样性和整体影响:
不同的策略与决策方式会对整体任务完成度和泛化能力产生重要影响,如何在多策略、多任务场景中实现通用性是一大挑战。
2. 目前的数据集
2.1 RT-1
论文链接
该数据集使用一支由 13 个机器人组成的团队,历时 17 个月,收集了一个包含约 13 万次执行记录(episodes)和超过 700 个任务的数据集。
2.2 Open X-Embedding
论文链接
该数据集中主要包含了来自 21 个机构的合作收集的 22 个不同机器人的数据,展示了 527 项技能(160,266 个任务)。
2.3 DROID
论文链接
引入了 DROID(Distributed Robot Interaction Dataset,分布式机器人交互数据集**(一个具身形态)**),这是一个多样化的机器人操作数据集,包含 76,000 条演示轨迹或 350 小时的交互数据,涵盖了 564 个场景和 86 个任务,由 50 名数据采集者在 北美、亚洲和欧洲的 12 个月内收集完成。
3. 目前的VLA模型
可以直接使用目前的这种VLM大模型,或者使用经过这种机器人任务数据微调后的模型。期望通过这种技术实现更加通用的这种VLA大模型,达到能够适应多种不同场景,适应多种不同的具身形态的机器人通用大模型。
3.1 Goat
论文链接
具体可见我之前写的一篇博客Goat
3.2 RT-1
论文链接
- 任务:通过视觉解决语言条件任务来完成对机器人策略的学习。在大量RT-1的数据集上去训练,并展现了较好的泛化能力
- 关键技术:
(1). 模型的架构:Token压缩、条件提取
(2). 数据集
(3). 动作的token化:将每个动作离散化到256个区间,动作维度包括七个变量:(𝑥,𝑦,𝑧,滚动、俯仰、偏航,以及夹爪的开合)
- 简要介绍:RT-1是一个基于 Transformer 架构的 35 亿参数的网络,专为机器人控制设计。它接收由6张图像和语言指令组成的历史序列。每张图像通过 EfficientNet 处理,自然语言指令则被转换为 USE 嵌入。视觉和语言表示通过 FiLM 层交织在一起,生成48个视觉-语言标记。这些标记输入到一个仅解码的 Transformer 中,输出标记化的动作。
3.2.1 总体架构
模型处理的基本流程:
- 输入6张时间序列图像(300 * 300*3)的图像进来
- 以一张图像进行分析,经过FiLM,同时在进行模型处理的同时,引入language token作为condation,引导模型提取出与任务更加相关的视觉特征(这种操作与DIT的方法类似,即scale and shift的操作)
- 将提取到的视觉特征放入Token Learner (源码)中,进一步压缩视觉特征,最终得到每张image,8个token,那么6张图像就有48个token,维度为512
- 加入位置编码,最后放入Transformer中的Decoder中,最后输出结果。
3.2.2 效果
- 推理速度:能够以3HZ的速度进行推理;
- 推理精度:将该模型在原有数据集的基础上加入模拟的数据进行训练,模型展现出了很好的transfer能力,能够在保证原有能力的前提下,大幅度提升在模拟任务中的性能
- 数据的多样性在训练过程中对模型的性能以及通用性的影响要高于数据数量的大小
3.3 RT-2
论文链接
-
使用了预训练的这种VLM(PaLI-X和PaLI-M),并且同时在机器人轨迹数据和互联网规模的视觉语言任务上联合微调,既保持了原有的视觉语言的知识,也同时为模型添加了机器人控制的相关知识。
-
离散化方法:
terminate Δposₓ Δposᵧ Δpos𝓏 Δrotₓ Δrotᵧ Δrot𝓏 gripper_extension
组成:终止,机器人末端执行器的六自由度位置和旋转位移,以及机械夹爪的扩展水平。除终止命令外,其他的都被均匀离散到256个区间,并对应到其本身的词汇表中。 -
使用思维链(CoT)的方式能够解决较为复杂的task
-
简要介绍:RT-2 是一组 视觉-语言-动作模型(VLAs),在互联网规模的视觉和语言数据以及机器人控制数据上训练。RT-2 将标记化动作转为文本标记,例如:“1 128 91 241 5 101 127”。因此,任何预训练的视觉-语言模型(VLM) 都可以通过微调来适应机器人控制,从而利用 VLM 主干的泛化特性。
3.3.1 总体架构
模型的总体介绍:
(1) 输入:视觉和语言(task),并将其进行token化
(2)将视觉token和文本token拼接在一起,并考虑是否需要添加padding mask
(3)将不同的模态信息输入到预训练的多模态大模型中去,在模型内部做了模态对齐,并最终输出模型的结果
(4)结果输出时,我们只需要动作的结果,所以就把有关文本的部分做了Mask操作。
3.3.2 效果
- 推理速度:在云端的TPU服务器上,RT-2-PaLI-X-55B 模型其运行频率为 1-3 Hz,该模型的较小版本包含 50 亿参数,运行频率约为 5 Hz;
- 推理精度
- 在泛化性上:相比于其他几种模型更好
- Measure emergent capabilities的能力更强
局限性:1.虽然语义和视觉理解能力提升,但是机器的物理性能,仍然受限于数据集中机器数据集中的节能分布;2. 模型的计算成本较高,需要部署在云端。
3.4 RT-X
论文链接
该工作主要将RT-1和RT-2的模型在OEX的数据集上去训练,主要的工作重点在数据集上模型结构请参考RT-1和RT-2。
- 问题点:
- 为什么RT-1-X在Autolab UR5上没有取得更好的效果?
- 不同的数据集标记长度不一样,那么应该如何处理?如何将统一化标准?
在不同数据集之间,为了应对观测和动作空间存在的显著差异,采用了粗略对齐的方式。模型接收近期的图像历史和语言指令作为观测输入,并预测一个七维动作向量,用于控制末端执行器的运动,包括位置((x, y, z))、旋转(滚动、俯仰、偏航)以及夹爪的开合或这些变量的速率。在数据预处理阶段,从每个数据集中选取一个标准视角,将输入图像调整为统一的分辨率,并将原始动作集转换为七自由度的末端执行器动作。在动作离散化之前,会对每个数据集的动作进行归一化。这样,模型输出的动作可以在每个机器人上重新解释(即反归一化),从而适配不同的机器人。尽管进行了这种粗略对齐,由于不同数据集在摄像头配置、机械臂特性等方面存在差异,图像观测之间仍可能有较大不同。此外,对于动作空间,没有强制跨数据集对齐坐标系,因为末端执行器的位置和速度(无论是绝对值还是相对值)的映射,需根据具体的控制方案来决定。因此,即便是相同的动作指令,在不同的机器人上也可能会引发不同的运动表现。
3.4.1 模型效果
1). RT-1-X
- 在小数据集上RT-1-X可以超过在这些数据集上原有的提出的这些方法,并大幅度的领先,不过也有一个例外的情况:就是在Autolab UR5的数据集上。
2). RT-2-X
2. 在大数据集上RT-1-X并不能超越原始的RT-1,但是RT-2-X能够大幅领先原有的模型,这也说明,在丰富度更高的数据下,需要更大的模型(scaling low)
3.5 RT-H
论文链接
在RT-2的基础上引入Action hierarchies主要是由于中间有一层language motion层,实现了在多任务数据集上的共享,同时能够在机器人执行的时候更好的引入人类的这种纠错能力,改进这种泛化性能。
-
核心方法
- 提出了一种名为 RT-H 的方法,构建了动作层次结构(action hierarchy),通过预测语言运动(如“移动机械臂向前”),来连接高层任务和具体动作。
-
挑战与解决方案
- 随着任务的语义多样性增加,共享数据变得困难,使用语言来描述低层动作,有助于弥合高层任务和具体动作之间的差距。
-
优势
- 灵活性:策略能从语言干预中学习并适应新任务;鲁棒性:更好地利用多任务数据集,提升泛化性能;纠错能力:通过人类指定的语言运动,轻松纠正执行过程中的错误。
-
劣势
- 中间层抽象级别尚未确定,在某些任务中修正可能导致策略退化,依赖大规模数据,需要人类干预。
3.5.1 总体架构
A. RT-H 模型概述 (RT-H Model Overview)
RT-H(如图 所示)分为两个关键阶段:首先,它根据任务描述和视觉观测预测语言运动(见图 左上的 language motion query),然后基于预测的语言运动、任务和观测,推断出具体的动作(见图 左下的 action query)。 使用 RT-2 的训练流程和 VLM(视觉-语言模型)主干来实现 RT-H。与 RT-2 类似,我过协同训练充分利用互联网规模数据中丰富的自然语言和图像处理先验知识。为了将这种先验知识融入动作层次结构的各个层级,模型会同时学习语言运动查询和动作查询。
B. RT-H:模型和训练细节 (RT-H: Model and Training Details)
为了建模动作层次结构并获得语言运动的好处,我们的方法 RT-H(如图 所示)学习两个策略
π
h
\pi_h
πh 和
π
l
\pi_l
πl,使用与互联网规模数据联合训练的单一 VLM(视觉-语言模型)。我们使用 PaLI-X 55B 主干网络来实现 VLM,与 RT-2 的架构相同。
RT-H 使用ViT 编码器来将图像处理为标记,并通过编码器-解码器 Transformer将图像和自然语言标记转换为动作标记。这些动作标记的生成方式与 RT-2 相同,通过将每个动作维度离散化为 256 个区间,并将这些区间编码为整数值。
RT-H 构建了两个对 VLM 的查询:
-
语言运动查询 π h \pi_h πh:
- 将任务描述 g g g 和图像观测 o o o 映射为语言运动 z z z(例如,“向前移动机械臂”)。
- 编码器处理 g g g 和 o o o,解码器预测 z z z。
- 这一阶段使 RT-H 在比低层机器人动作更粗的动作空间中预测正确行为,有助于更好地建模任务结构并在不同任务之间共享子轨迹。
-
动作查询 π l \pi_l πl:
- 将图像 o o o、任务 g g g 和语言运动 z z z 映射为动作标记 a a a。
- 将动作标记解码为机器人动作 a a a。
- 这一阶段使 RT-H 能够在解码语言运动时结合场景和任务的上下文。
通过两个查询而非单个查询进行训练,带来了两个优势:
- 专门化的提示:为每个查询提供特定的提示。
- 高效的上下文使用:语言运动 z z z 作为额外的上下文信息传递给 Transformer 编码器,而非解码器。
RT-H 随后使用 PaLI-X [53] 训练混合数据进行联合训练,ViT 编码器在训练过程中保持冻结。
C. 提取语言运动 (Extracting Language Motions)
原则上,人类可以标注全范围的细粒度语言运动,但我们发现这种离线标注会导致数据集中的语言不一致性,甚至导致技能标注不准确。例如,人类可能错误标注技能之间的过渡,或者由于摄像头角度的影响误判机器人运动的方向。
为了解决这一问题,我们开发了一种自动标注方案,依赖于机器人自身的本体感觉信息来提取可靠的语言运动 (z)。具体步骤包括:
- 将机器人末端执行器的位姿变化的每个维度与空间维度相连(例如,位置变化的 z 轴映射到“上下”)。
- 对所有 9 个动作维度(包括 3 个位置变化、3 个旋转变化、2 个基础移动和 1 个夹爪动作),确定机器人最常见的运动模式(例如,“向上向右移动机械臂”、“闭合夹爪”或“逆时针旋转”)。
- 过滤出低于阈值的维度,然后将剩余的动作组合成与动作幅度匹配的语言运动。
例如,如果机器人需要执行向左转动机械臂的操作,自动标注方案会生成与之相匹配的语言运动。
3.5.2 效果
- RT-H-Human Intervention展示出强大的能力。
- RT-H 在中间加入语言层,有助于扩大数据集实例的桥接,从人类视频中学习,压缩动作空间,提高策略学习的样本效率。
3.6 OpenVLA
论文链接
-
核心方法
OpenVLA 是一个开源的视觉-语言-动作 (VLA) 模型,拥有 70 亿参数,预训练在 97 万条真实机器人演示数据上,结合了 Llama 2 语言模型和融合了 DINOv2 与 SigLIP 特征的视觉编码器,支持在消费级 GPU 上通过低秩适应进行微调,并通过量化高效部署。 -
挑战与解决方案
挑战:现有VLA封闭难以获取,限制了广泛应用,其次缺乏高效的微调方法,无法适应新任务;解决方案:训练一个开源的VLA大模型,开发高效的微调方法。 -
优势
性能优势:OpenVLA在通用的操作任务上表现出色,泛化能力强。
3.6.1 总体架构
该模型的设计充分利用了DinoV2和SigLIP两种图像编码器的特性,通过将两者提取的特征拼接后再与文本特征结合,形成了多模态信息的深度融合。投影层的设计采用了多层全连接网络,进一步优化了图像和文本特征的匹配效果。最终,融合后的特征被输入到Llama 2大语言模型中进行处理,从而实现了强大的多模态理解与生成能力。模型的创新点不仅体现在使用两个图像编码器提取特征,还在于其特征融合的方式。通过这种架构设计,模型能够更好地捕捉图像与文本之间的关联性,为复杂任务提供更精准的解决方案。这种方法在多模态领域具有较高的参考价值,同时也为未来的研究提供了新的方向。
3.6.2 效果
- 在视觉、运动、物理的通用性上比之前的模型都会更好一些,但是在语义的通用性上,相比之下要比RT-2-X稍微逊色一些(主要原因在于RT-2使用了更大的语言模型,因此自然语义理解能力更强),分析取得性能的原因:(1)使用了更大的training set;(2)更好的数据清洗工作;(3)使用了混合的着视觉编码器,让其有更好的视觉编码能力。
- OpenVLA 可以通过在目标数据集上进行微调,快速适应新的机器人设置。 它在需要场景中有多个物体并依赖语言条件的多样化微调任务中表现更好,这可能归功于 OpenX 预训练。
- 探究了高效微调,Lora在使用较低的计算资源情况下,帮助VLA模型快速适应新任务。
- 使用4bit的精度数据,能够保证其推理的结果与bf16大致相同,同时8bit会增大量化的操作的开销导致模型的推理速度反而下降。
3.7 π 0 \pi_0 π0
论文链接
基于PaliGemma VLM以及Transfusion的结构,并提出了一套pre_training和post_training的方案。效果是掌握非常长程的任务。
- 模型特点:
- 多模态输入:包括视觉输入(图像序列)、语言输入(文本Token序列)、以及机器人状态(例如关节角度)。
- 动作预测输出:模型需要输出连续的机器人动作(如关节命令,关节速度或者位姿增量)。
- 利用流匹配(flow matching)技术:这是类似扩散模型(diffusion model)的方法,对动作加噪,然后模型学习从有噪动作还原到无噪动作的映射。
3.7.1 总体架构
- 输入 (Inputs)
- 视觉输入: 一组图像 ( I_t = [I^1_t, I^2_t, …, I^\ell_t] ) ,通常(\ell)代表在给定时间步能获得的多张视角图像(例如来自多摄像头)。这些图像通过已预训练的视觉编码器(ViT)编码成图像特征序列,然后再投影到Transformer的嵌入空间中,作为一系列“图像Token”输入。
- 语言输入: 一组语言tokens ( \ell_t ),可能是自然语言描述任务场景、步骤或机器人的状态描述。语言tokens是通过与图像一起输入到Transformer中,与图像token共享一个公共嵌入空间。
- 机器人状态输入: 包括关节状态 ( q_t ) (例如关节位置、速度或力反馈),通过一个小型MLP映射到Transformer的嵌入维度中,将其作为输入tokens之一。
组合后,在时间步t的输入为一组Token序列:
o t = [ I t 1 , I t 2 , . . . , I t ℓ , ℓ t , q t ] o_t = [I^1_t, I^2_t, ..., I^\ell_t, \ell_t, q_t] ot=[It1,It2,...,Itℓ,ℓt,qt]
这里的每一项(包括图像、语言、状态)在进入Transformer之前都被映射成固定大小的向量表示。
- 输出 (Outputs)
- 模型的最终目的是输出下一段时间内的动作序列 ( A_t = [a_t, a_{t+1}, …, a_{t+H-1}] )。但在训练过程中,模型并不是直接回归动作,而是使用类似扩散模型的过程进行训练:
3 训练中:
模型从真实的动作序列(ground truth)中采样出一个“噪声版本” A t τ A^{\tau}_t Atτ,这里 τ \tau τ 是一个噪声级别参数(如从某个分布采样出来)。该噪声加在动作上,即: A t τ = A t + τ ⋅ ϵ A^\tau_t = A_t + \sqrt{\tau} \cdot \epsilon Atτ=At+τ⋅ϵ
其中 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, I) ϵ∼N(0,I),一个高斯分布噪声。 模型的目标是给定 ( o t , A t τ ) (o_t, A^\tau_t) (ot,Atτ),预测出“去噪”向量 ν θ ( A t τ , o t ) \nu_\theta(A^\tau_t, o_t) νθ(Atτ,ot) ,并通过训练让 ν θ \nu_\theta νθ接近 ( A t − A t τ ) / τ (A_t - A^\tau_t) / \tau (At−Atτ)/τ,从而实现对真实动作的还原。
- 推理时:
推断时不直接预测动作,而是从纯噪声开始反复迭代“去噪”过程:
- 初始化动作 A t 0 = N ( 0 , I ) A^0_t = \mathcal{N}(0, I) At0=N(0,I)(随机噪声初始动作)。
- 使用模型进行迭代,
A t τ + δ = A t τ + δ ⋅ ν θ ( A t τ , o t ) A^{\tau+\delta}_t = A^\tau_t + \delta \cdot \nu_\theta(A^\tau_t, o_t) Atτ+δ=Atτ+δ⋅νθ(Atτ,ot)
不断将噪声减少,最终在若干步迭代后得到一个接近无噪的最终动作序列 A t A_t At。
- 噪声如何加入 (Noise Injection)
- 在训练中,对于给定的真实动作序列 A t A_t At,从 τ \tau τ 分布中采样一个噪声强度(例如 τ ∼ B e t a ( α , β ) \tau \sim Beta(\alpha, \beta) τ∼Beta(α,β)分布以强调较大的噪声)。
- 根据该 τ \tau τ,对真实动作加上高斯噪声:
A t τ = A t + τ ϵ , ϵ ∼ N ( 0 , I ) A^\tau_t = A_t + \sqrt{\tau}\epsilon, \quad \epsilon \sim \mathcal{N}(0, I) Atτ=At+τϵ,ϵ∼N(0,I)- 模型训练的损失函数是所谓的flow matching损失,鼓励模型从有噪动作中预测出正确的“去噪信号”。
- 最终输出动作 (Final action inference)
在推断时(执行时):
- 起点:随机初始化一个噪声动作序列 A t 0 = ϵ ∼ N ( 0 , I ) A^0_t = \epsilon \sim \mathcal{N}(0, I) At0=ϵ∼N(0,I)。
- 在每个迭代步骤中,将 A t τ A^\tau_t Atτ 输入模型,模型输出 ν θ ( A t τ , o t ) \nu_\theta(A^\tau_t, o_t) νθ(Atτ,ot),对 A t τ A^\tau_t Atτ 进行更新:
A t τ + δ = A t τ + δ ⋅ ν θ ( A t τ , o t ) A^{\tau+\delta}_t = A^\tau_t + \delta \cdot \nu_\theta(A^\tau_t, o_t) Atτ+δ=Atτ+δ⋅νθ(Atτ,ot)
其中 δ \delta δ是步长,重复多次后, τ \tau τ会逐渐减少至0,得到干净的动作序列近似。- 最终的 A t A_t At即为机器人将要执行的行动序列。
- 大致代码框架 (伪代码 / Python伪代码)
import torch
import torch.nn as nn
class VisionEncoder(nn.Module):
def __init__(self):
super().__init__()
# 假设预训练的ViT模型
self.vit = PretrainedViT()
# linear projection to Transformer dim
self.proj = nn.Linear(self.vit.output_dim, transformer_dim)
def forward(self, images):
# images: [batch, num_images, C, H, W]
img_feats = [self.vit(img) for img in images] # list of [batch, output_dim]
img_feats = torch.stack(img_feats, dim=1) # [batch, num_images, output_dim]
return self.proj(img_feats)
class TextEncoder(nn.Module):
def __init__(self):
super().__init__()
# 假设有预训练的文本嵌入层
self.token_embed = nn.Embedding(vocab_size, transformer_dim)
def forward(self, text_tokens):
# text_tokens: [batch, seq_len]
return self.token_embed(text_tokens) # [batch, seq_len, transformer_dim]
class StateEncoder(nn.Module):
def __init__(self, state_dim, transformer_dim):
super().__init__()
self.mlp = nn.Linear(state_dim, transformer_dim)
def forward(self, q):
# q: [batch, state_dim]
return self.mlp(q).unsqueeze(1) # [batch, 1, transformer_dim]
class ActionExpert(nn.Module):
def __init__(self, action_dim):
super().__init__()
self.mlp = nn.Linear(action_dim, transformer_dim)
def forward(self, actions):
# actions: [batch, horizon, action_dim]
# Map actions to token space
return self.mlp(actions) # [batch, horizon, transformer_dim]
class TransformerModel(nn.Module):
def __init__(self, transformer_dim, num_layers, num_heads):
super().__init__()
self.layers = nn.ModuleList([
nn.TransformerEncoderLayer(
d_model=transformer_dim,
nhead=num_heads,
dim_feedforward=4*transformer_dim,
batch_first=True
)
for _ in range(num_layers)
])
def forward(self, tokens):
# tokens: [batch, seq_len, transformer_dim]
x = tokens
for layer in self.layers:
x = layer(x)
return x
class VLAModel(nn.Module):
def __init__(self, transformer_dim, action_dim, horizon):
super().__init__()
self.vision_encoder = VisionEncoder()
self.text_encoder = TextEncoder()
self.state_encoder = StateEncoder(state_dim=robot_state_dim, transformer_dim=transformer_dim)
self.action_expert = ActionExpert(action_dim)
self.transformer = TransformerModel(transformer_dim, num_layers=... , num_heads=...)
# final linear projection to action space (for denoising vector)
self.output_linear = nn.Linear(transformer_dim, action_dim)
def forward(self, images, text_tokens, q, noisy_actions):
# Encode inputs
img_tokens = self.vision_encoder(images) # [B, num_images, dim]
txt_tokens = self.text_encoder(text_tokens) # [B, txt_len, dim]
q_token = self.state_encoder(q) # [B, 1, dim]
act_tokens = self.action_expert(noisy_actions) # [B, H, dim]
# Concatenate all tokens: [img_tokens, txt_tokens, q_token, act_tokens]
# For simplicity, assume we just cat them along seq dimension
# Actual implementation may involve special tokens or segment embeddings
tokens = torch.cat([img_tokens, txt_tokens, q_token, act_tokens], dim=1)
# Pass through Transformer
out = self.transformer(tokens) # [B, seq_len, dim]
# The action tokens are at the end, suppose we know their positions
# Extract the last H positions corresponding to actions
action_out = out[:, -horizon:, :] # [B, H, dim]
# Map to action denoising vector
denoise_vectors = self.output_linear(action_out) # [B, H, action_dim]
return denoise_vectors
def denoise_step(self, images, text_tokens, q, noisy_actions, step_size):
denoise_vec = self.forward(images, text_tokens, q, noisy_actions)
# Update actions
new_actions = noisy_actions + step_size * denoise_vec
return new_actions
# 训练过程(伪代码)
model = VLAModel(...)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
for batch in dataloader:
images, text_tokens, q, gt_actions = batch
# sample noise level tau, add noise
tau = sample_noise_level()
eps = torch.randn_like(gt_actions)
noisy_actions = gt_actions + (tau**0.5)*eps
# forward pass
denoise_vec = model(images, text_tokens, q, noisy_actions)
# loss: L2 between denoise_vec and (gt_actions - noisy_actions)/tau
target = (gt_actions - noisy_actions)/(tau**0.5)
loss = ((denoise_vec - target)**2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 推断过程(伪代码)
with torch.no_grad():
images, text_tokens, q = inference_input()
A = torch.randn(batch_size, horizon, action_dim) # start from noise
for i in range(num_integration_steps):
A = model.denoise_step(images, text_tokens, q, A, step_size=delta)
# Now A should be the final action sequence.
execute_actions(A)
3.7.2 实现效果
- 这一对比说明了将大型、表达能力强的架构与流匹配或扩散来建模复杂分布的能力相结合的重要性。
- 展示了
π
0
\pi_0
π0模型强大的微调能力
- 微调后在处理更困难的任务时非常有效。
3.8 RD-T
论文链接
基于 DiT 的大型 VLA 模型,在跨物体形态的数据集上预训练,并在目标机器人数据集上进行微调,用于学习双手操作,展现了小样本学习(few-shot learning)和零样本泛化(zero-shot generalization)的能力。
- 核心方法:
模型设计:提出了机器人扩散变换器 (RDT),这是一个基于扩散模型的机器人操作基础模型,结合了可扩展的 Transformer 架构;统一动作空间:引入了物理可解释的统一动作空间,统一了不同机器人的动作表示,同时保留原始动作的物理含义;数据处理:在一个大规模的多机器人数据集上进行预训练,并通过6000 多集的双手操作数据进行微调。 - 挑战与解决方案:
挑战:双手操作的复杂性:协调两个机械臂的多模态动作分布难度大;数据稀缺:缺乏大规模、多样化的训练数据集;输入异质性:需要处理多模态输入的非线性和高频特性。
解决方案:扩散模型:通过扩散模型来表示多模态动作分布;Transformer 架构:采用可扩展的 Transformer 处理多模态输入的异质性;统一动作空间:通过引入物理可解释的统一动作空间,提高动作表示的一致性和可迁移性;大规模数据预训练:在包含 12 亿参数的模型上预训练,并在 6000 多集的双手操作数据上进行微调
3.7.1 总体架构
- 输入 (Inputs)
- 低维输入
低维输入是表示机器人物理量的向量,包括自感知状态、动作块和控制频率。为了编码这些低维输入,使用具有傅里叶特征的多层感知机(MLPs),这些方法可以有效捕捉低维空间的高频变化。- 图像输入
图像是高维的,包含丰富的空间和语义信息。为了提取紧凑的表示,使用与图像-文本对齐的预训练视觉编码器 SigLIP。- 语言输入
语言输入的长度和抽象程度各异,解析时面临复杂性和模糊性。为了编码语言输入,使用预训练的 Transformer 基础语言模型 T5-XXL。
-
Unified Action Space
使用统一的空间来容纳其自感知状态 z t z_t zt和动作 a t a_t at,如右图设计,该空间中涵盖了大多数具有夹具的现代机器人的主要物理量,将这些机器人的动作空间嵌入到这个统一的空间中,通过将原始的动作向量的每个元素填充到统一的动作空间中的相应位置来实现,并根据其物理含义来填充剩余位置。 -
随机Mask
为了保证模型在训练过程中不对某种输入过度依赖,在训练过程中采用随机Mask的方法,能够让模型获得较好的结果
3.7.2 效果
- RDT能够零样本泛化到未见过的物体、场景和模态。
- RDT仅需少量样本就能学习新技能。
- RDT能够处理灵巧操作任务。
- 较大的模型规模、大量数据和扩散(Diffusion)方法都是RDT性能卓越的重要因素。
总结与展望
总结:
-
从确定性策略到泛化智能:
传统机器人多以确定性规划和控制为主,效果好但适应性差。而近年来VLA大模型借助大规模数据和通用Transformer结构,已能在多任务、多场景下展现初步的泛化能力。 -
多模态融合与语言指导:
通过同时处理视觉、语言和机器人状态信息,这类模型将任务描述从抽象语言映射到具体行动,使机器人能够理解自然指令、视觉情境,并自主决策。这种多模态嵌合为构建通用智能奠定基础。 -
大规模数据与预训练扩展:
预训练在海量互联网数据(图像+文本)并结合真实机器人轨迹微调,使得模型既具备语言与视觉理解能力,又能执行物理任务。数据多样性与规模的提升显著增强了模型的泛化性与鲁棒性。 -
扩散模型与层次策略:
新兴的架构(如 π 0 \pi_0 π0和RD-T)使用扩散模型,将动作生成视为去噪过程,显著提升了对复杂多峰动作分布的建模能力;RT-H则在策略层次引入中间语言层,提供灵活的人类干预与策略层次划分。 -
通用性、可适应性和高效微调:
从RT-1、RT-2到OpenVLA、RT-H、 π 0 \pi_0 π0和RD-T的演进显示,研究重点正从单一机器人、单一任务走向大一统、多任务的通用模型。同时,高效微调技术(如LoRA)和量化部署为实际应用铺路。
展望:
未来,VLA大模型将进一步:
- 强化模拟到真实的迁移能力,缩小Sim2Real Gap。
- 针对多种机器人形态统一表征,使模型能自然适应不同设备与传感器配置。
- 在多任务、多步骤长程操作中更灵活地规划与执行,并具备更高的可解释性和安全性。
- 将人类交互与纠错无缝嵌入模型中,使模型在执行过程中能够动态学习与适应新的任务与环境变化。
最终目标是构建真正“通用”的机器人大模型,让机器人像人类一样,听懂自然语言指令,在复杂物理环境中灵活完成多样化任务,从而大幅拓展机器人的应用边界和社会价值。