VLA模型

目录

  • 引言
  • 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. 机器人大模型面临的挑战

  1. 数据缺乏与收集困难
    获取真实世界中的机器人操作数据成本高昂(如远程操控及复杂标注),对每一类任务往往需要大量多样化的数据,收集难度大。

  2. 模拟与真实的差距(Sim2Real Gap)
    虽然仿真环境可用于数据采集与模型训练,但模拟世界与现实世界在物理特性、视觉呈现和交互反馈上仍存在较大偏差,使得直接将仿真学到的策略迁移到真实环境中并非易事。

  3. 多种具身形态的适配问题
    机器人形态各异,不同的机械臂末端执行器、传感器类型、动作空间等差异导致同样的策略不一定适用于不同设备。

  4. 策略多样性和整体影响
    不同的策略与决策方式会对整体任务完成度和泛化能力产生重要影响,如何在多策略、多任务场景中实现通用性是一大挑战。


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

论文链接

  1. 任务:通过视觉解决语言条件任务来完成对机器人策略的学习。在大量RT-1的数据集上去训练,并展现了较好的泛化能力
  2. 关键技术:

(1). 模型的架构:Token压缩、条件提取
(2). 数据集
(3). 动作的token化:将每个动作离散化到256个区间,动作维度包括七个变量:(𝑥,𝑦,𝑧,滚动、俯仰、偏航,以及夹爪的开合)

  1. 简要介绍:RT-1是一个基于 Transformer 架构的 35 亿参数的网络,专为机器人控制设计。它接收由6张图像和语言指令组成的历史序列。每张图像通过 EfficientNet 处理,自然语言指令则被转换为 USE 嵌入。视觉和语言表示通过 FiLM 层交织在一起,生成48个视觉-语言标记。这些标记输入到一个仅解码的 Transformer 中,输出标记化的动作。

3.2.1 总体架构

在这里插入图片描述
模型处理的基本流程:

  1. 输入6张时间序列图像(300 * 300*3)的图像进来
  2. 以一张图像进行分析,经过FiLM,同时在进行模型处理的同时,引入language token作为condation,引导模型提取出与任务更加相关的视觉特征(这种操作与DIT的方法类似,即scale and shift的操作)
  3. 将提取到的视觉特征放入Token Learner (源码)中,进一步压缩视觉特征,最终得到每张image,8个token,那么6张图像就有48个token,维度为512
  4. 加入位置编码,最后放入Transformer中的Decoder中,最后输出结果。

3.2.2 效果

  1. 推理速度:能够以3HZ的速度进行推理;
  2. 推理精度:将该模型在原有数据集的基础上加入模拟的数据进行训练,模型展现出了很好的transfer能力,能够在保证原有能力的前提下,大幅度提升在模拟任务中的性能
  3. 数据的多样性在训练过程中对模型的性能以及通用性的影响要高于数据数量的大小

3.3 RT-2

论文链接

  1. 使用了预训练的这种VLM(PaLI-X和PaLI-M),并且同时在机器人轨迹数据和互联网规模的视觉语言任务上联合微调,既保持了原有的视觉语言的知识,也同时为模型添加了机器人控制的相关知识。

  2. 离散化方法:terminate Δposₓ Δposᵧ Δpos𝓏 Δrotₓ Δrotᵧ Δrot𝓏 gripper_extension 组成:终止,机器人末端执行器的六自由度位置和旋转位移,以及机械夹爪的扩展水平。除终止命令外,其他的都被均匀离散到256个区间,并对应到其本身的词汇表中。

  3. 使用思维链(CoT)的方式能够解决较为复杂的task

  4. 简要介绍: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 效果

  1. 推理速度:在云端的TPU服务器上,RT-2-PaLI-X-55B 模型其运行频率为 1-3 Hz,该模型的较小版本包含 50 亿参数,运行频率约为 5 Hz;
  2. 推理精度
    在这里插入图片描述
  • 在泛化性上:相比于其他几种模型更好
    在这里插入图片描述
  • Measure emergent capabilities的能力更强

局限性:1.虽然语义和视觉理解能力提升,但是机器的物理性能,仍然受限于数据集中机器数据集中的节能分布;2. 模型的计算成本较高,需要部署在云端。

3.4 RT-X

论文链接
该工作主要将RT-1和RT-2的模型在OEX的数据集上去训练,主要的工作重点在数据集上模型结构请参考RT-1和RT-2。

  1. 问题点:
  1. 为什么RT-1-X在Autolab UR5上没有取得更好的效果?
  2. 不同的数据集标记长度不一样,那么应该如何处理?如何将统一化标准?
    在不同数据集之间,为了应对观测和动作空间存在的显著差异,采用了粗略对齐的方式。模型接收近期的图像历史和语言指令作为观测输入,并预测一个七维动作向量,用于控制末端执行器的运动,包括位置((x, y, z))、旋转(滚动、俯仰、偏航)以及夹爪的开合或这些变量的速率。在数据预处理阶段,从每个数据集中选取一个标准视角,将输入图像调整为统一的分辨率,并将原始动作集转换为七自由度的末端执行器动作。在动作离散化之前,会对每个数据集的动作进行归一化。这样,模型输出的动作可以在每个机器人上重新解释(即反归一化),从而适配不同的机器人。尽管进行了这种粗略对齐,由于不同数据集在摄像头配置、机械臂特性等方面存在差异,图像观测之间仍可能有较大不同。此外,对于动作空间,没有强制跨数据集对齐坐标系,因为末端执行器的位置和速度(无论是绝对值还是相对值)的映射,需根据具体的控制方案来决定。因此,即便是相同的动作指令,在不同的机器人上也可能会引发不同的运动表现。

3.4.1 模型效果

1). RT-1-X

在这里插入图片描述

  1. 在小数据集上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层,实现了在多任务数据集上的共享,同时能够在机器人执行的时候更好的引入人类的这种纠错能力,改进这种泛化性能。

  1. 核心方法

    • 提出了一种名为 RT-H 的方法,构建了动作层次结构(action hierarchy),通过预测语言运动(如“移动机械臂向前”),来连接高层任务和具体动作。
  2. 挑战与解决方案

    • 随着任务的语义多样性增加,共享数据变得困难,使用语言来描述低层动作,有助于弥合高层任务和具体动作之间的差距。
  3. 优势

    • 灵活性:策略能从语言干预中学习并适应新任务;鲁棒性:更好地利用多任务数据集,提升泛化性能;纠错能力:通过人类指定的语言运动,轻松纠正执行过程中的错误。
  4. 劣势

    • 中间层抽象级别尚未确定,在某些任务中修正可能导致策略退化,依赖大规模数据,需要人类干预。

    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 的查询:

  1. 语言运动查询 π h \pi_h πh

    • 将任务描述 g g g 和图像观测 o o o 映射为语言运动 z z z(例如,“向前移动机械臂”)。
    • 编码器处理 g g g o o o,解码器预测 z z z
    • 这一阶段使 RT-H 在比低层机器人动作更粗的动作空间中预测正确行为,有助于更好地建模任务结构并在不同任务之间共享子轨迹。
  2. 动作查询 π l \pi_l πl

    • 将图像 o o o、任务 g g g 和语言运动 z z z 映射为动作标记 a a a
    • 将动作标记解码为机器人动作 a a a
    • 这一阶段使 RT-H 能够在解码语言运动时结合场景和任务的上下文。

通过两个查询而非单个查询进行训练,带来了两个优势:

  1. 专门化的提示:为每个查询提供特定的提示。
  2. 高效的上下文使用:语言运动 z z z 作为额外的上下文信息传递给 Transformer 编码器,而非解码器。

RT-H 随后使用 PaLI-X [53] 训练混合数据进行联合训练,ViT 编码器在训练过程中保持冻结。

C. 提取语言运动 (Extracting Language Motions)
原则上,人类可以标注全范围的细粒度语言运动,但我们发现这种离线标注会导致数据集中的语言不一致性,甚至导致技能标注不准确。例如,人类可能错误标注技能之间的过渡,或者由于摄像头角度的影响误判机器人运动的方向。
为了解决这一问题,我们开发了一种自动标注方案,依赖于机器人自身的本体感觉信息来提取可靠的语言运动 (z)。具体步骤包括:

  1. 将机器人末端执行器的位姿变化的每个维度与空间维度相连(例如,位置变化的 z 轴映射到“上下”)。
  2. 对所有 9 个动作维度(包括 3 个位置变化、3 个旋转变化、2 个基础移动和 1 个夹爪动作),确定机器人最常见的运动模式(例如,“向上向右移动机械臂”、“闭合夹爪”或“逆时针旋转”)。
  3. 过滤出低于阈值的维度,然后将剩余的动作组合成与动作幅度匹配的语言运动。

例如,如果机器人需要执行向左转动机械臂的操作,自动标注方案会生成与之相匹配的语言运动。

3.5.2 效果

在这里插入图片描述

  • RT-H-Human Intervention展示出强大的能力。
  • RT-H 在中间加入语言层,有助于扩大数据集实例的桥接,从人类视频中学习,压缩动作空间,提高策略学习的样本效率。

3.6 OpenVLA

论文链接

  1. 核心方法
    OpenVLA 是一个开源的视觉-语言-动作 (VLA) 模型,拥有 70 亿参数,预训练在 97 万条真实机器人演示数据上,结合了 Llama 2 语言模型和融合了 DINOv2 与 SigLIP 特征的视觉编码器,支持在消费级 GPU 上通过低秩适应进行微调,并通过量化高效部署。

  2. 挑战与解决方案
    挑战:现有VLA封闭难以获取,限制了广泛应用,其次缺乏高效的微调方法,无法适应新任务;解决方案:训练一个开源的VLA大模型,开发高效的微调方法。

  3. 优势
    性能优势:OpenVLA在通用的操作任务上表现出色,泛化能力强。

3.6.1 总体架构

在这里插入图片描述
该模型的设计充分利用了DinoV2SigLIP两种图像编码器的特性,通过将两者提取的特征拼接后再与文本特征结合,形成了多模态信息的深度融合。投影层的设计采用了多层全连接网络,进一步优化了图像和文本特征的匹配效果。最终,融合后的特征被输入到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的方案。效果是掌握非常长程的任务。

  • 模型特点
    1. 多模态输入:包括视觉输入(图像序列)、语言输入(文本Token序列)、以及机器人状态(例如关节角度)。
    2. 动作预测输出:模型需要输出连续的机器人动作(如关节命令,关节速度或者位姿增量)。
    3. 利用流匹配(flow matching)技术:这是类似扩散模型(diffusion model)的方法,对动作加噪,然后模型学习从有噪动作还原到无噪动作的映射。

3.7.1 总体架构

在这里插入图片描述

  1. 输入 (Inputs)
  1. 视觉输入: 一组图像 ( I_t = [I^1_t, I^2_t, …, I^\ell_t] ) ,通常(\ell)代表在给定时间步能获得的多张视角图像(例如来自多摄像头)。这些图像通过已预训练的视觉编码器(ViT)编码成图像特征序列,然后再投影到Transformer的嵌入空间中,作为一系列“图像Token”输入。
  2. 语言输入: 一组语言tokens ( \ell_t ),可能是自然语言描述任务场景、步骤或机器人的状态描述。语言tokens是通过与图像一起输入到Transformer中,与图像token共享一个公共嵌入空间。
  3. 机器人状态输入: 包括关节状态 ( 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之前都被映射成固定大小的向量表示。
  1. 输出 (Outputs)
  1. 模型的最终目的是输出下一段时间内的动作序列 ( 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 (AtAtτ)/τ,从而实现对真实动作的还原。

  1. 推理时:

推断时不直接预测动作,而是从纯噪声开始反复迭代“去噪”过程:

  1. 初始化动作 A t 0 = N ( 0 , I ) A^0_t = \mathcal{N}(0, I) At0=N(0,I)(随机噪声初始动作)。
  2. 使用模型进行迭代,
    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
  1. 噪声如何加入 (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损失,鼓励模型从有噪动作中预测出正确的“去噪信号”。

  1. 最终输出动作 (Final action inference)

在推断时(执行时):

  1. 起点:随机初始化一个噪声动作序列 A t 0 = ϵ ∼ N ( 0 , I ) A^0_t = \epsilon \sim \mathcal{N}(0, I) At0=ϵN(0,I)
  2. 在每个迭代步骤中,将 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,得到干净的动作序列近似。
  3. 最终的 A t A_t At即为机器人将要执行的行动序列。
  1. 大致代码框架 (伪代码 / 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)的能力。

  1. 核心方法:
    模型设计:提出了机器人扩散变换器 (RDT),这是一个基于扩散模型的机器人操作基础模型,结合了可扩展的 Transformer 架构;统一动作空间:引入了物理可解释的统一动作空间,统一了不同机器人的动作表示,同时保留原始动作的物理含义;数据处理:在一个大规模的多机器人数据集上进行预训练,并通过6000 多集的双手操作数据进行微调。
  2. 挑战与解决方案:
    挑战:双手操作的复杂性:协调两个机械臂的多模态动作分布难度大;数据稀缺:缺乏大规模、多样化的训练数据集;输入异质性:需要处理多模态输入的非线性和高频特性。
    解决方案:扩散模型:通过扩散模型来表示多模态动作分布;Transformer 架构:采用可扩展的 Transformer 处理多模态输入的异质性;统一动作空间:通过引入物理可解释的统一动作空间,提高动作表示的一致性和可迁移性;大规模数据预训练:在包含 12 亿参数的模型上预训练,并在 6000 多集的双手操作数据上进行微调

3.7.1 总体架构

在这里插入图片描述

  1. 输入 (Inputs)
  • 低维输入
    低维输入是表示机器人物理量的向量,包括自感知状态、动作块和控制频率。为了编码这些低维输入,使用具有傅里叶特征的多层感知机(MLPs),这些方法可以有效捕捉低维空间的高频变化。
  • 图像输入
    图像是高维的,包含丰富的空间和语义信息。为了提取紧凑的表示,使用与图像-文本对齐的预训练视觉编码器 SigLIP。
  • 语言输入
    语言输入的长度和抽象程度各异,解析时面临复杂性和模糊性。为了编码语言输入,使用预训练的 Transformer 基础语言模型 T5-XXL。
  1. Unified Action Space
    使用统一的空间来容纳其自感知状态 z t z_t zt和动作 a t a_t at,如右图设计,该空间中涵盖了大多数具有夹具的现代机器人的主要物理量,将这些机器人的动作空间嵌入到这个统一的空间中,通过将原始的动作向量的每个元素填充到统一的动作空间中的相应位置来实现,并根据其物理含义来填充剩余位置。

  2. 随机Mask
    为了保证模型在训练过程中不对某种输入过度依赖,在训练过程中采用随机Mask的方法,能够让模型获得较好的结果

3.7.2 效果

  • RDT能够零样本泛化到未见过的物体、场景和模态。
  • RDT仅需少量样本就能学习新技能。
  • RDT能够处理灵巧操作任务。
  • 较大的模型规模、大量数据和扩散(Diffusion)方法都是RDT性能卓越的重要因素。

总结与展望

总结

  1. 从确定性策略到泛化智能
    传统机器人多以确定性规划和控制为主,效果好但适应性差。而近年来VLA大模型借助大规模数据和通用Transformer结构,已能在多任务、多场景下展现初步的泛化能力。

  2. 多模态融合与语言指导
    通过同时处理视觉、语言和机器人状态信息,这类模型将任务描述从抽象语言映射到具体行动,使机器人能够理解自然指令、视觉情境,并自主决策。这种多模态嵌合为构建通用智能奠定基础。

  3. 大规模数据与预训练扩展
    预训练在海量互联网数据(图像+文本)并结合真实机器人轨迹微调,使得模型既具备语言与视觉理解能力,又能执行物理任务。数据多样性与规模的提升显著增强了模型的泛化性与鲁棒性。

  4. 扩散模型与层次策略
    新兴的架构(如 π 0 \pi_0 π0和RD-T)使用扩散模型,将动作生成视为去噪过程,显著提升了对复杂多峰动作分布的建模能力;RT-H则在策略层次引入中间语言层,提供灵活的人类干预与策略层次划分。

  5. 通用性、可适应性和高效微调
    从RT-1、RT-2到OpenVLA、RT-H、 π 0 \pi_0 π0和RD-T的演进显示,研究重点正从单一机器人、单一任务走向大一统、多任务的通用模型。同时,高效微调技术(如LoRA)和量化部署为实际应用铺路。

展望
未来,VLA大模型将进一步:

  • 强化模拟到真实的迁移能力,缩小Sim2Real Gap。
  • 针对多种机器人形态统一表征,使模型能自然适应不同设备与传感器配置。
  • 在多任务、多步骤长程操作中更灵活地规划与执行,并具备更高的可解释性和安全性。
  • 将人类交互与纠错无缝嵌入模型中,使模型在执行过程中能够动态学习与适应新的任务与环境变化。

最终目标是构建真正“通用”的机器人大模型,让机器人像人类一样,听懂自然语言指令,在复杂物理环境中灵活完成多样化任务,从而大幅拓展机器人的应用边界和社会价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933515.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3

aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容: 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合&#xff0c…

如何使用Java编写Jmeter函数

Jmeter 自带有各种功能丰富的函数,可以帮助我们进行测试,但有时候提供的这些函数并不能满足我们的要求,这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时,有时候需要填入当前的时间,虽然我们可以使用p…

实战指南:如何通过WBS提高项目估算准确性?

通过WBS将复杂任务细分为更易管理的任务,这有助于明确每项工作范围、所需资源及时间,从而减少估算误差,制定更现实的预算和时间表,提升团队协作效率。如果没有通过WBS将任务细化,项目范围可能变得模糊不清,…

ECharts实战教程:如何生成动态水波纹效果

导语:在数据可视化领域,ECharts是一款非常强大的图表库。今天,我们将带领大家学习如何使用ECharts生成动态水波纹效果,让我们的图表更加生动有趣。 一、准备工作 首先,我们需要准备一些基础数据,如下所示&…

详解:HTTP/HTTPS协议

HTTP协议 一.HTTP是什么 HTTP,全称超文本传输协议,是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP往往是基于传输层TCP协议实现的,采用的一问一答的模式,即发一个请求,返回一个响应。 Q:什…

(0基础保姆教程)-JavaEE开课啦!--13课程(Interception拦截器)-完结

一、Interception(拦截器)是什么? 拦截器(Interceptor)是一种用于在请求到达目标方法之前或之后执行特定逻辑的机制。它是基于Java反射机制,属于面向切面编程(AOP)的一种应用。拦截器可以用于多种应用场景&…

vue 封装全局过滤器

1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…

Flask返回中文Unicode编码(乱码)解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

VMware:安装centos网络信息不可用

我们今天要处理的就是在vmware中安装centos出现网络不可用,导致无法安装系统的问题直接上图,我们在主机直接 cmdipconfig 发现IPV4地址都不一样,导致我们无法ping通虚拟机 那我们如何解决呢~~~~ 打开自己VM【编辑】【虚拟网络编辑器】【更…

MperReduce学习笔记下

自定义InputFormat合并小文件 案例需求 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案。 案例分析 小文件的优化无非以下几种方式: …

【MySQL 探索者日志 】第二弹 —— 数据库基础

MySQL系列学习笔记: MySQL探索者日志__Zwy的博客-CSDN博客 各位于晏,亦菲们,请点赞关注! 我的个人主页: _Zwy-CSDN博客 目录 1、MySQL服务器,数据库,表关系 2、MySQL登录连接服务器 3、MyS…

flink终止提交给yarn的任务

接上文:一文说清flink从编码到部署上线 1.查看正在执行的flink 访问地址(参考):http://10.86.97.191:8099/cluster/apps 2.终止任务 yarn application -kill appID 本文为: yarn application -kill application_17…

CentOS虚拟机开机出现问题

CentOS虚拟机断电或强制关机,再开机出现问题 错误原因: failed to mount /sysroot.(无法挂载/ sysroot。) Dependency failed for Initrd root File System.(Initrd根文件系统的依赖关系失败。) Dependency…

可靠的人形探测,未完待续(I)

HI,there!从紧张的项目中出来冒个泡! 刚好想要验证一下mmWave在有人检测方面的应用,就看到了这个活动 - 瞌睡了有枕头属于是,活动策划好评! 朋友曾关注汽车相关的技术领域,跟我吐槽过&#xff0…

web斗地主游戏实现指北

前后端通信 作为一个即时多人游戏,不论是即时聊天还是更新玩家状态,都需要服务端有主动推送功能,或者客户端轮询。轮询的时间间隔可能导致游玩体验差,因为不即时更新,而且请求数量太多可能会打崩服务器。 建议在cs间…

基于Qt的文字处理软件(二)

这期文章我们进行主窗口的一些函数的定义,同时导入一些文字处理软件的状态栏会用到的图标。下面图片是图标导入到项目后的一个示例,图标可以到阿里矢量图标库里面找到。 一、导入图标资源: 1.首先在项目目录的位置创建一个images的文件,然后将收集好的图…

Halcon_数据类型_ROI_仿射变换_投影变换

文章目录 算子快捷键一、Halcon数据类型Iconic (图标)Control (控制)Tuple (数组) 二、ROI(区域)1.代码创建ROI2.手动创建ROI 三、图形预处理1.图像的变换与矫正平移 -hom_mat2d_translate旋转缩放-HomMat2D:输入的仿射…

C语言(指针基础练习)

删除数组中的元素 数组的元素在内存地址中是连续的&#xff0c;不能单独删除数组中的某个元素&#xff0c;只能覆盖。 #include <stdio.h> #include <stdbool.h>// 函数声明 int deleteElement(int arr[], int size, int element);int main() {int arr[] {1, 2, 3…

甘肃美食之选:食家巷方形饼

甘肃食家巷方形饼&#xff0c;顾名思义&#xff0c;其形状呈规整的方形。这种独特的外形并非偶然&#xff0c;而是源于当地传统的制作工艺。制作方形饼的师傅们&#xff0c;精心挑选优质的面粉&#xff0c;加入适量的水和其他配料&#xff0c;揉成光滑的面团。经过一段时间的发…

共享GitLab中CICD自动生成的软件包

0 Preface/Foreword 1 分享软件包地址 为了方便给接收对象方便下载固件&#xff0c;在下载固件时候&#xff0c;而无需打开网页&#xff0c;直接输入地址&#xff0c;弹出的对话框是将固件另存为。 或者进入CICD页面&#xff0c;找到job&#xff0c;在Download的标签上单击右键…